Cleaning up the new FIR filter implementation. Protects against some corner cases...
authorTom Rondeau <trondeau@vt.edu>
Sat, 16 Oct 2010 18:35:03 +0000 (14:35 -0400)
committerTom Rondeau <trondeau@vt.edu>
Sat, 16 Oct 2010 18:35:03 +0000 (14:35 -0400)
gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h

index e9545549f9dcaee8e0a63dcfc0320f2d65a74090..55e316d027d6b6e83b801135e2e5aa863e6c61d2 100644 (file)
@@ -23,8 +23,8 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+
 #include <gri_fir_filter_with_buffer_ccf.h>
-#include <cstdio>
 
 gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector<float> &taps)
 {
@@ -34,42 +34,30 @@ gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector
 
 gri_fir_filter_with_buffer_ccf::~gri_fir_filter_with_buffer_ccf()
 {
-  free(d_buffer);
+  if(d_buffer != NULL)
+    free(d_buffer);
 }
 
 gr_complex 
 gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
 {
-#if 0
-  unsigned int i;
-  
-  for(i = ntaps()-1; i > 0; i--) {
-    d_buffer[i] = d_buffer[i-1];
-  }
-  d_buffer[0] = input;
-
-  gr_complex out = d_buffer[0]*d_taps[0];
-  for(i = 1; i < ntaps(); i++) {
-    out += d_buffer[i]*d_taps[i];
-  }
-  return out;
-
-#else
   unsigned int i;
 
   d_buffer[d_idx] = input;
   d_buffer[d_idx+ntaps()] = input;
+
+  // using the later for the case when ntaps=0;
+  // profiling shows this doesn't make a difference
   //d_idx = (d_idx + 1) % ntaps();
   d_idx++;
-  if(d_idx == ntaps())
+  if(d_idx >= ntaps())
     d_idx = 0;
 
-  gr_complex out = d_buffer[d_idx]*d_taps[0];
-  for(i = 1; i < ntaps(); i++) {
+  gr_complex out = gr_complex(0,0);
+  for(i = 0; i < ntaps(); i++) {
     out += d_buffer[d_idx + i]*d_taps[i];
   }
   return out;
-#endif
 }
 
 void
@@ -77,5 +65,7 @@ gri_fir_filter_with_buffer_ccf::filterN (gr_complex output[],
                                         const gr_complex input[],
                                         unsigned long n)
 {
-
+  for(unsigned long i = 0; i < n; i++) {
+    output[i] = filter(input[i]);
+  }
 }
index 5adc3e231f1f528b079ce3a81294409415d4e408..c91d70534e26fdd4847d91c681bd3f01e7f3e5ee 100644 (file)
@@ -33,6 +33,7 @@
 #include <gr_types.h>
 #include <gr_reverse.h>
 #include <string.h>
+#include <cstdio>
 
 /*!
  * \brief FIR with internal buffer for gr_complex input, 
@@ -100,14 +101,16 @@ public:
   void set_taps (const std::vector<float> &taps)
   {
     d_taps = gr_reverse(taps);
-    //d_taps = (taps);
 
-    if(d_buffer != NULL)
+    if(d_buffer != NULL) {
       free(d_buffer);
+      d_buffer = NULL;
+    }
     
     // FIXME: memalign this to 16-byte boundaries for SIMD later
-    d_buffer = (gr_complex*)malloc(sizeof(gr_complex) * 2 * d_taps.size());
-    memset(d_buffer, 0x00, sizeof(gr_complex) * 2 * d_taps.size());
+    size_t t = sizeof(gr_complex) * 2 * d_taps.size();
+    d_buffer = (gr_complex*)malloc(t);
+    memset(d_buffer, 0x00, t);
     d_idx = 0;
   }