commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r4182 - in gnuradio/trunk/gnuradio-core/src: lib/filte


From: n4hy
Subject: [Commit-gnuradio] r4182 - in gnuradio/trunk/gnuradio-core/src: lib/filter python/gnuradio/gr
Date: Thu, 21 Dec 2006 12:41:29 -0700 (MST)

Author: n4hy
Date: 2006-12-21 12:41:29 -0700 (Thu, 21 Dec 2006)
New Revision: 4182

Modified:
   gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc
   gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
   gnuradio/trunk/gnuradio-core/src/lib/filter/gri_iir.h
   gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/qa_iir.py
Log:
Merged changeset r4153:4167 on n4hy/iir into trunk.

Modified: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc    
2006-12-21 18:49:26 UTC (rev 4181)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc    
2006-12-21 19:41:29 UTC (rev 4182)
@@ -57,11 +57,6 @@
 gr_iir_filter_ffd::set_taps (const std::vector<double> &fftaps,
                             const std::vector<double> &fbtaps) throw 
(std::invalid_argument)
 {
-  if (fftaps.size () != fbtaps.size ()){
-    fprintf (stderr,
-     "gr_iir_filter_ffd::set_taps: fftaps and fbtaps must have the same number 
of elements.\n");
-    throw std::invalid_argument ("gr_iir_filter_ffd::set_taps");
-  }
   
   d_new_fftaps = fftaps;
   d_new_fbtaps = fbtaps;
@@ -76,7 +71,6 @@
   const float *in = (const float *) input_items[0];
   float *out = (float *) output_items[0];
 
-  // fprintf (stderr, "gr_iir_filter_ffd::work noutput_items = %d\n", 
noutput_items);
 
   if (d_updated){
     d_iir.set_taps (d_new_fftaps, d_new_fbtaps);

Modified: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h     
2006-12-21 18:49:26 UTC (rev 4181)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h     
2006-12-21 19:41:29 UTC (rev 4182)
@@ -40,12 +40,11 @@
  * This filter uses the Direct Form I implementation, where
  * \p fftaps contains the feed-forward taps, and \p fbtaps the feedback ones.
  *
- * \p fftaps and \p fbtaps must have equal numbers of taps
- *
+ * 
  * The input and output satisfy a difference equation of the form
 
  \f[
- y[n] - \sum_{k=1}^{N} a_k y[n-k] = \sum_{k=0}^{M} b_k x[n-k]
+ y[n] - \sum_{k=1}^{M} a_k y[n-k] = \sum_{k=0}^{N} b_k x[n-k]
  \f]
 
  * with the corresponding rational system function

Modified: gnuradio/trunk/gnuradio-core/src/lib/filter/gri_iir.h
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gri_iir.h       2006-12-21 
18:49:26 UTC (rev 4181)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gri_iir.h       2006-12-21 
19:41:29 UTC (rev 4182)
@@ -43,13 +43,13 @@
    * The input and output satisfy a difference equation of the form
 
    \f[
-   y[n] - \sum_{k=1}^{N} a_k y[n-k] = \sum_{k=0}^{M} b_k x[n-k]
+   y[n] - \sum_{k=1}^{M} a_k y[n-k] = \sum_{k=0}^{N} b_k x[n-k]
    \f]
 
    * with the corresponding rational system function
 
    \f[
-   H(z) = \frac{\sum_{k=0}^{M} b_k z^{-k}}{1 - \sum_{k=1}^{N} a_k z^{-k}}
+   H(z) = \frac{\sum_{k=0}^{N} b_k z^{-k}}{1 - \sum_{k=1}^{M} a_k z^{-k}}
    \f]
 
    * Note that some texts define the system function with a + in the 
denominator.
@@ -61,7 +61,7 @@
     set_taps (fftaps, fbtaps);
   }
 
-  gri_iir () : d_latest(0) { }
+  gri_iir () : d_latest_n(0),d_latest_m(0) { }
 
   ~gri_iir () {}
 
@@ -80,7 +80,8 @@
   /*!
    * \return number of taps in filter.
    */
-  unsigned ntaps () const { return d_fftaps.size (); }
+  unsigned ntaps_ff () const { return d_fftaps.size (); }
+  unsigned ntaps_fb () const { return d_fbtaps.size (); }
 
   /*!
    * \brief install new taps.
@@ -88,19 +89,22 @@
   void set_taps (const std::vector<tap_type> &fftaps, 
                 const std::vector<tap_type> &fbtaps) throw 
(std::invalid_argument)
   { 
-    if (fftaps.size () != fbtaps.size ())
-      throw std::invalid_argument ("gri_iir::set_taps");
 
-    d_latest = 0;
+
+    d_latest_n = 0;
+    d_latest_m = 0;
     d_fftaps = fftaps; 
     d_fbtaps = fbtaps; 
 
     int n = fftaps.size ();
+    int m = fbtaps.size ();
     d_prev_input.resize (2 * n);
-    d_prev_output.resize (2 * n);
+    d_prev_output.resize (2 * m);
 
     for (int i = 0; i < 2 * n; i++){
       d_prev_input[i] = 0;
+     }
+    for (int i = 0; i < 2 * m; i++){
       d_prev_output[i] = 0;
     }
   }
@@ -108,7 +112,8 @@
 protected:
   std::vector<tap_type>        d_fftaps;
   std::vector<tap_type>        d_fbtaps;
-  int                  d_latest;
+  int                  d_latest_n;
+  int                  d_latest_m;
   std::vector<tap_type>        d_prev_output;
   std::vector<i_type>  d_prev_input;
 };
@@ -123,29 +128,36 @@
 {
   tap_type     acc;
   unsigned     i = 0;
-  unsigned     n = ntaps ();
+  unsigned     n = ntaps_ff ();
+  unsigned      m = ntaps_fb ();
 
   if (n == 0)
     return (o_type) 0;
 
-  int latest = d_latest;
+  int latest_n = d_latest_n;
+  int latest_m = d_latest_m;
   
   acc = d_fftaps[0] * input;
   for (i = 1; i < n; i ++)
-    acc += (d_fftaps[i] * d_prev_input[latest + i]
-           + d_fbtaps[i] * d_prev_output[latest + i]);
+    acc += (d_fftaps[i] * d_prev_input[latest_n + i]);
+  for (i = 1; i < m; i ++)
+    acc += (d_fbtaps[i] * d_prev_output[latest_m + i]);
 
   // store the values twice to avoid having to handle wrap-around in the loop
-  d_prev_output[latest] = acc;
-  d_prev_output[latest+n] = acc;
-  d_prev_input[latest] = input;
-  d_prev_input[latest+n] = input;
+  d_prev_output[latest_m] = acc;
+  d_prev_output[latest_m+m] = acc;
+  d_prev_input[latest_n] = input;
+  d_prev_input[latest_n+n] = input;
 
-  latest--;
-  if (latest < 0)
-    latest += n;
+  latest_n--;
+  latest_m--;
+  if (latest_n < 0)
+    latest_n += n;
+  if (latest_m < 0)
+    latest_m += m;
 
-  d_latest = latest;
+  d_latest_m = latest_m;
+  d_latest_n = latest_n;
   return (o_type) acc;
 }
 

Modified: gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/qa_iir.py
===================================================================
--- gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/qa_iir.py       
2006-12-21 18:49:26 UTC (rev 4181)
+++ gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/qa_iir.py       
2006-12-21 19:41:29 UTC (rev 4182)
@@ -101,11 +101,6 @@
         self.assertFloatTuplesAlmostEqual (expected_result, result_data)
 
     def test_iir_direct_006 (self):
-        fftaps = (2, 11,  0)
-        fbtaps = (0,  -1)
-        self.assertRaises ((RuntimeError, ValueError), gr.iir_filter_ffd, 
fftaps, fbtaps)
-
-    def test_iir_direct_007 (self):
         src_data = (1, 2, 3, 4, 5, 6, 7, 8)
         expected_result = (2, 13, 21, 59, 58, 186, 68, 583)
         fftaps = (2, 1)
@@ -122,14 +117,43 @@
         result_data = dst.data ()
         self.assertFloatTuplesAlmostEqual (expected_result, result_data)
 
-    def test_iir_direct_008 (self):
+    def test_iir_direct_007 (self):
+        src_data = (1, 2, 3, 4, 5, 6, 7, 8)
+        expected_result = (2,2,5,5,8,8,11,11)
         fftaps = (2, 1)
         fbtaps = (0, -1)
+        src = gr.vector_source_f (src_data)
         op = gr.iir_filter_ffd (fftaps, fbtaps)
-        fftaps = (2, 11)
-        fbtaps = (0,  -1, 3)
-        self.assertRaises ((RuntimeError, ValueError), op.set_taps, fftaps, 
fbtaps)
+        fftaps = (2,0,1)
+        fbtaps = (0, -1)
+        op.set_taps (fftaps, fbtaps)
+        dst = gr.vector_sink_f ()
+        self.fg.connect (src, op)
+        self.fg.connect (op, dst)
+        self.fg.run ()
+        result_data = dst.data ()
+        self.assertFloatTuplesAlmostEqual (expected_result, result_data)
+        
+    def test_iir_direct_008 (self):
+        src_data = (1, 2, 3, 4, 5, 6, 7, 8)
+        expected_result = (2,4,4,10,18,14,26,56)
+        fftaps = (2,)
+        fbtaps = (0, 1)
+        src = gr.vector_source_f (src_data)
+        op = gr.iir_filter_ffd (fftaps, fbtaps)
+        fftaps_data = (1)
+        fbtaps = (0,0, -1,3)
+        op.set_taps (fftaps, fbtaps)
+        dst = gr.vector_sink_f ()
+        self.fg.connect (src, op)
+        self.fg.connect (op, dst)
+        self.fg.run ()
+        result_data = dst.data ()
+        self.assertFloatTuplesAlmostEqual (expected_result, result_data)
+        
+        
 
+
 if __name__ == '__main__':
     gr_unittest.main ()
         





reply via email to

[Prev in Thread] Current Thread [Next in Thread]