summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib
diff options
context:
space:
mode:
authorn4hy2006-12-21 19:41:29 +0000
committern4hy2006-12-21 19:41:29 +0000
commit71647e094f85e520363e579eab4b86e430be4e90 (patch)
tree9c896238fc68573e4721b96641d75f3298463b21 /gnuradio-core/src/lib
parent566df7b80d836b42b75b63d9a0704a04b387115a (diff)
downloadgnuradio-71647e094f85e520363e579eab4b86e430be4e90.tar.gz
gnuradio-71647e094f85e520363e579eab4b86e430be4e90.tar.bz2
gnuradio-71647e094f85e520363e579eab4b86e430be4e90.zip
Merged changeset r4153:4167 on n4hy/iir into trunk.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@4182 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gnuradio-core/src/lib')
-rw-r--r--gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc6
-rw-r--r--gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h5
-rw-r--r--gnuradio-core/src/lib/filter/gri_iir.h58
3 files changed, 37 insertions, 32 deletions
diff --git a/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc b/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc
index be1cfbc47..1a1a28f03 100644
--- a/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc
+++ b/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.cc
@@ -57,11 +57,6 @@ void
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 @@ gr_iir_filter_ffd::work (int noutput_items,
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);
diff --git a/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h b/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
index 4e8c8ebcd..8e98758ec 100644
--- a/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
+++ b/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
@@ -40,12 +40,11 @@ gr_make_iir_filter_ffd (const std::vector<double> &fftaps,
* 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
diff --git a/gnuradio-core/src/lib/filter/gri_iir.h b/gnuradio-core/src/lib/filter/gri_iir.h
index d52c95f02..587bd102f 100644
--- a/gnuradio-core/src/lib/filter/gri_iir.h
+++ b/gnuradio-core/src/lib/filter/gri_iir.h
@@ -43,13 +43,13 @@ public:
* 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 @@ public:
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 @@ public:
/*!
* \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 @@ public:
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 @@ public:
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 @@ gri_iir<i_type, o_type, tap_type>::filter (const i_type input)
{
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;
-
- latest--;
- if (latest < 0)
- latest += n;
-
- d_latest = latest;
+ 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_n--;
+ latest_m--;
+ if (latest_n < 0)
+ latest_n += n;
+ if (latest_m < 0)
+ latest_m += m;
+
+ d_latest_m = latest_m;
+ d_latest_n = latest_n;
return (o_type) acc;
}