diff options
author | trondeau | 2009-08-05 01:36:09 +0000 |
---|---|---|
committer | trondeau | 2009-08-05 01:36:09 +0000 |
commit | e0003f3fc2b49d52a647281af3695b386ec7d8bf (patch) | |
tree | 952a4e241b9f7b487ea9ad7a3e12655a81b6430f | |
parent | f6a400a8192ebee931ee45d712ffa889ba321234 (diff) | |
download | gnuradio-e0003f3fc2b49d52a647281af3695b386ec7d8bf.tar.gz gnuradio-e0003f3fc2b49d52a647281af3695b386ec7d8bf.tar.bz2 gnuradio-e0003f3fc2b49d52a647281af3695b386ec7d8bf.zip |
Fixed optfir for producing equiripple FIR filters. Does LPF, fixes the HPF, and adds BPF (real).
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11537 221aa14e-8319-0410-a670-987f0aec2ac5
-rw-r--r-- | gnuradio-core/src/lib/general/gr_remez.cc | 4 | ||||
-rw-r--r-- | gnuradio-core/src/python/gnuradio/optfir.py | 55 |
2 files changed, 52 insertions, 7 deletions
diff --git a/gnuradio-core/src/lib/general/gr_remez.cc b/gnuradio-core/src/lib/general/gr_remez.cc index ca6df541b..86c2901b5 100644 --- a/gnuradio-core/src/lib/general/gr_remez.cc +++ b/gnuradio-core/src/lib/general/gr_remez.cc @@ -814,8 +814,10 @@ gr_remez (int order, if (arg_bands[0] < 0 || arg_bands[arg_bands.size () - 1] > 1) punt ("gr_remez: band edges must be in the range [0,1]"); + // Divide by 2 to fit with the implementation that uses a + // sample rate of [0, 0.5] instead of [0, 1.0] for (int i = 0; i < 2 * numbands; i++) - bands[i] = arg_bands[i] / 2; // FIXME why / 2? + bands[i] = arg_bands[i] / 2; LOCAL_BUFFER (double, response, numbands * 2); if (arg_response.size () != arg_bands.size ()) diff --git a/gnuradio-core/src/python/gnuradio/optfir.py b/gnuradio-core/src/python/gnuradio/optfir.py index bd43fcc97..06a0eea61 100644 --- a/gnuradio-core/src/python/gnuradio/optfir.py +++ b/gnuradio-core/src/python/gnuradio/optfir.py @@ -1,5 +1,5 @@ # -# Copyright 2004,2005 Free Software Foundation, Inc. +# Copyright 2004,2005,2009 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -34,25 +34,68 @@ remez = gr.remez # ---------------------------------------------------------------- +## Builds a low pass filter. +# @param gain Filter gain in the passband (linear) +# @param Fs Sampling rate (sps) +# @param freq1 End of pass band (in Hz) +# @param freq2 Start of stop band (in Hz) +# @param passband_ripple_db Pass band ripple in dB (should be small, < 1) +# @param stopband_atten_db Stop band attenuation in dB (should be large, >= 60) +# @param nextra_taps Extra taps to use in the filter (default=2) def low_pass (gain, Fs, freq1, freq2, passband_ripple_db, stopband_atten_db, - nextra_taps=0): + nextra_taps=2): passband_dev = passband_ripple_to_dev (passband_ripple_db) stopband_dev = stopband_atten_to_dev (stopband_atten_db) desired_ampls = (gain, 0) (n, fo, ao, w) = remezord ([freq1, freq2], desired_ampls, [passband_dev, stopband_dev], Fs) + # The remezord typically under-estimates the filter order, so add 2 taps by default taps = gr.remez (n + nextra_taps, fo, ao, w, "bandpass") return taps -# FIXME high_passs is broken... -def high_pass (Fs, freq1, freq2, stopband_atten_db, passband_ripple_db, - nextra_taps=0): - """FIXME: broken""" +## Builds a band pass filter. +# @param gain Filter gain in the passband (linear) +# @param Fs Sampling rate (sps) +# @param freq1 End of stop band (in Hz) +# @param freq2 Start of pass band (in Hz) +# @param passband_ripple_db Pass band ripple in dB (should be small, < 1) +# @param stopband_atten_db Stop band attenuation in dB (should be large, >= 60) +# @param nextra_taps Extra taps to use in the filter (default=2) +def band_pass (gain, Fs, freq_sb1, freq_pb1, freq_pb2, freq_sb2, + passband_ripple_db, stopband_atten_db, + nextra_taps=2): + passband_dev = passband_ripple_to_dev (passband_ripple_db) + stopband_dev = stopband_atten_to_dev (stopband_atten_db) + desired_ampls = (0, gain, 0) + desired_freqs = [freq_sb1, freq_pb1, freq_pb2, freq_sb2] + desired_ripple = [stopband_dev, passband_dev, stopband_dev] + (n, fo, ao, w) = remezord (desired_freqs, desired_ampls, + desired_ripple, Fs) + # The remezord typically under-estimates the filter order, so add 2 taps by default + taps = gr.remez (n + nextra_taps, fo, ao, w, "bandpass") + return taps + +## Builds a high pass filter. +# @param gain Filter gain in the passband (linear) +# @param Fs Sampling rate (sps) +# @param freq1 End of stop band (in Hz) +# @param freq2 Start of pass band (in Hz) +# @param passband_ripple_db Pass band ripple in dB (should be small, < 1) +# @param stopband_atten_db Stop band attenuation in dB (should be large, >= 60) +# @param nextra_taps Extra taps to use in the filter (default=2) +def high_pass (gain, Fs, freq1, freq2, passband_ripple_db, stopband_atten_db, + nextra_taps=2): passband_dev = passband_ripple_to_dev (passband_ripple_db) stopband_dev = stopband_atten_to_dev (stopband_atten_db) desired_ampls = (0, 1) (n, fo, ao, w) = remezord ([freq1, freq2], desired_ampls, [stopband_dev, passband_dev], Fs) + # For a HPF, we need to use an odd number of taps + # In gr.remez, ntaps = n+1, so n must be even + if((n+nextra_taps)%2 == 1): + n += 1 + + # The remezord typically under-estimates the filter order, so add 2 taps by default taps = gr.remez (n + nextra_taps, fo, ao, w, "bandpass") return taps |