Adding ability for FIR filter with internal buffer to decimate.
[debian/gnuradio] / gnuradio-core / src / lib / filter / qa_gri_fir_filter_with_buffer_fsf.cc
index f09a1d7ac6eb02be7df0806ac99de9df1a3a6edb..091505380cf2de00142c964519498882922204b5 100644 (file)
@@ -67,14 +67,31 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   return (o_type)sum;
 }
 
+void
+qa_gri_fir_filter_with_buffer_fsf::t1 ()
+{
+  test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t2 ()
+{
+  test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t3 ()
+{
+  test_decimate(5);
+}
+
 //
 // Test for ntaps in [0,9], and input lengths in [0,17].
 // This ensures that we are building the shifted taps correctly,
 // and exercises all corner cases on input alignment and length.
 //
-
 void
-qa_gri_fir_filter_with_buffer_fsf::t1 ()  
+qa_gri_fir_filter_with_buffer_fsf::test_decimate (unsigned int decimate)  
 {
   const int    MAX_TAPS        = 9;
   const int    OUTPUT_LEN      = 17;
@@ -101,11 +118,13 @@ qa_gri_fir_filter_with_buffer_fsf::t1 ()
 
       // compute expected output values
       memset(dline, 0, INPUT_LEN*sizeof(i_type));
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
        // use an actual delay line for this test
-       for(int oo = INPUT_LEN-1; oo > 0; oo--)
-         dline[oo] = dline[oo-1];
-       dline[0] = input[o];
+       for(int dd = 0; dd < (int)decimate; dd++) {
+         for(int oo = INPUT_LEN-1; oo > 0; oo--)
+           dline[oo] = dline[oo-1];
+         dline[0] = input[decimate*o+dd];
+       }
        expected_output[o] = ref_dotprod (dline, taps, n);
       }
 
@@ -115,10 +134,10 @@ qa_gri_fir_filter_with_buffer_fsf::t1 ()
 
       // zero the output, then do the filtering
       memset (actual_output, 0, sizeof (actual_output));
-      f1->filterN (actual_output, input, ol);
+      f1->filterNdec (actual_output, input, ol/decimate, decimate);
 
       // check results
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
        CPPUNIT_ASSERT_EQUAL(expected_output[o], actual_output[o]);
       }
       delete f1;