summaryrefslogtreecommitdiff
path: root/gnuradio-core
diff options
context:
space:
mode:
authorJosh Blum2009-08-25 16:51:45 -0700
committerJosh Blum2009-08-25 16:51:45 -0700
commit6d327a3ad5205a0cacb82578f32ae7ef00eeb111 (patch)
treebf53f2cc38a60dfb0b6e237ba05e6c485d0e030c /gnuradio-core
parentaf5701409859af4b20a03bfd6b2cebf3559b1b3d (diff)
parent23fb5e602d48f6924e70b363bf9480fd41b928b0 (diff)
downloadgnuradio-6d327a3ad5205a0cacb82578f32ae7ef00eeb111.tar.gz
gnuradio-6d327a3ad5205a0cacb82578f32ae7ef00eeb111.tar.bz2
gnuradio-6d327a3ad5205a0cacb82578f32ae7ef00eeb111.zip
Merge branch 'master' of http://gnuradio.org/git/gnuradio into grc
Diffstat (limited to 'gnuradio-core')
-rw-r--r--gnuradio-core/src/python/gnuradio/optfir.py62
1 files changed, 59 insertions, 3 deletions
diff --git a/gnuradio-core/src/python/gnuradio/optfir.py b/gnuradio-core/src/python/gnuradio/optfir.py
index 06a0eea61..aee1d2a0c 100644
--- a/gnuradio-core/src/python/gnuradio/optfir.py
+++ b/gnuradio-core/src/python/gnuradio/optfir.py
@@ -27,7 +27,7 @@ For a great intro to how all this stuff works, see section 6.6 of
and Barrie W. Jervis, Adison-Wesley, 1993. ISBN 0-201-54413-X.
'''
-import math
+import math, cmath
from gnuradio import gr
remez = gr.remez
@@ -56,8 +56,10 @@ def low_pass (gain, Fs, freq1, freq2, passband_ripple_db, stopband_atten_db,
## 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 freq_sb1 End of stop band (in Hz)
+# @param freq_pb1 Start of pass band (in Hz)
+# @param freq_pb2 End of pass band (in Hz)
+# @param freq_sb2 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)
@@ -75,6 +77,60 @@ def band_pass (gain, Fs, freq_sb1, freq_pb1, freq_pb2, freq_sb2,
taps = gr.remez (n + nextra_taps, fo, ao, w, "bandpass")
return taps
+
+## Builds a band pass filter with complex taps by making an LPF and
+# spinning it up to the right center frequency
+# @param gain Filter gain in the passband (linear)
+# @param Fs Sampling rate (sps)
+# @param freq_sb1 End of stop band (in Hz)
+# @param freq_pb1 Start of pass band (in Hz)
+# @param freq_pb2 End of pass band (in Hz)
+# @param freq_sb2 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 complex_band_pass (gain, Fs, freq_sb1, freq_pb1, freq_pb2, freq_sb2,
+ passband_ripple_db, stopband_atten_db,
+ nextra_taps=2):
+ center_freq = (freq_pb2 + freq_pb1) / 2.0
+ lp_pb = (freq_pb2 - center_freq)/1.0
+ lp_sb = freq_sb2 - center_freq
+ lptaps = low_pass(gain, Fs, lp_pb, lp_sb, passband_ripple_db,
+ stopband_atten_db, nextra_taps)
+ spinner = [cmath.exp(2j*cmath.pi*center_freq/Fs*i) for i in xrange(len(lptaps))]
+ taps = [s*t for s,t in zip(spinner, lptaps)]
+ return taps
+
+
+## Builds a band reject filter
+# spinning it up to the right center frequency
+# @param gain Filter gain in the passband (linear)
+# @param Fs Sampling rate (sps)
+# @param freq_pb1 End of pass band (in Hz)
+# @param freq_sb1 Start of stop band (in Hz)
+# @param freq_sb2 End of stop band (in Hz)
+# @param freq_pb2 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_reject (gain, Fs, freq_pb1, freq_sb1, freq_sb2, freq_pb2,
+ 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 = (gain, 0, gain)
+ desired_freqs = [freq_pb1, freq_sb1, freq_sb2, freq_pb2]
+ desired_ripple = [passband_dev, stopband_dev, passband_dev]
+ (n, fo, ao, w) = remezord (desired_freqs, desired_ampls,
+ desired_ripple, Fs)
+ # Make sure we use an odd number of taps
+ 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
+
+
## Builds a high pass filter.
# @param gain Filter gain in the passband (linear)
# @param Fs Sampling rate (sps)