summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/python/gnuradio/optfir.py
diff options
context:
space:
mode:
authortrondeau <trondeau@221aa14e-8319-0410-a670-987f0aec2ac5>2009-08-05 01:36:09 +0000
committertrondeau <trondeau@221aa14e-8319-0410-a670-987f0aec2ac5>2009-08-05 01:36:09 +0000
commite0003f3fc2b49d52a647281af3695b386ec7d8bf (patch)
tree952a4e241b9f7b487ea9ad7a3e12655a81b6430f /gnuradio-core/src/python/gnuradio/optfir.py
parentf6a400a8192ebee931ee45d712ffa889ba321234 (diff)
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
Diffstat (limited to 'gnuradio-core/src/python/gnuradio/optfir.py')
-rw-r--r--gnuradio-core/src/python/gnuradio/optfir.py55
1 files changed, 49 insertions, 6 deletions
diff --git a/gnuradio-core/src/python/gnuradio/optfir.py b/gnuradio-core/src/python/gnuradio/optfir.py
index bd43fcc974..06a0eea614 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