summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2010-12-28 13:31:29 -0500
committerTom Rondeau <trondeau@vt.edu>2010-12-28 13:31:29 -0500
commitcaa6f821a601a37f2be0cc42c8f7fd42f9670b84 (patch)
treecac74fcc9ed2d8d47d7f4cfe9efcd5bea497eb74
parentfd8f86713d8f9de79850b9e7aabde7c453b7e890 (diff)
parent2fa7c997559e173c59227ee14a154e4b462d46bd (diff)
Merge branch 'master' into next
* master: Under extreme circumstances, optfir might never produce an answer (atten>300), so this puts in a check on the ripple; if it gets too large, stop trying. Allowing PFB interpolator to be called without specifying the taps; autogen taps inside hierblock. Allowing PFB decimator to be called without specifying the taps; autogen taps inside hierblock. PFB channelizer can be specified without external taps. Uses optfir to generate an internal filter to cover the channel bandwidth; user can specify the attenuation of this filter if desired. Updating the arb. resampler to use the optfir filter that provides better specificatiion of stopband atten.
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py24
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py26
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py26
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py25
-rwxr-xr-xgnuradio-examples/python/pfb/channelize.py2
5 files changed, 89 insertions, 14 deletions
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
index 74eae58dc1..62f40582e6 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
@@ -20,7 +20,7 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr
+from gnuradio import gr, optfir
class pfb_arb_resampler_ccf(gr.hier_block2):
'''
@@ -31,7 +31,7 @@ class pfb_arb_resampler_ccf(gr.hier_block2):
streams. This block is provided to be consistent with the interface to the
other PFB block.
'''
- def __init__(self, rate, taps=None, flt_size=32, atten=80):
+ def __init__(self, rate, taps=None, flt_size=32, atten=100):
gr.hier_block2.__init__(self, "pfb_arb_resampler_ccf",
gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
@@ -43,9 +43,23 @@ class pfb_arb_resampler_ccf(gr.hier_block2):
self._taps = taps
else:
# Create a filter that covers the full bandwidth of the input signal
- bw = 0.5
- tb = 0.1
- self._taps = gr.firdes.low_pass_2(self._size, self._size, bw, tb, atten)
+ bw = 0.4
+ tb = 0.2
+ ripple = 0.1
+ #self._taps = gr.firdes.low_pass_2(self._size, self._size, bw, tb, atten)
+ made = False
+ while not made:
+ try:
+ self._taps = optfir.low_pass(self._size, self._size, bw, bw+tb, ripple, atten)
+ made = True
+ except RuntimeError:
+ ripple += 0.01
+ made = False
+ print("Warning: set ripple to %.4f dB. If this is a problem, adjust the attenuation or create your own filter taps." % (ripple))
+
+ # Build in an exit strategy; if we've come this far, it ain't working.
+ if(ripple >= 1.0):
+ raise RuntimeError("optfir could not generate an appropriate filter.")
self.pfb = gr.pfb_arb_resampler_ccf(self._rate, self._taps, self._size)
#print "PFB has %d taps\n" % (len(self._taps),)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
index a479ed48ea..3ddc1749a7 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
@@ -20,7 +20,7 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr
+from gnuradio import gr, optfir
class pfb_channelizer_ccf(gr.hier_block2):
'''
@@ -29,15 +29,35 @@ class pfb_channelizer_ccf(gr.hier_block2):
This simplifies the interface by allowing a single input stream to connect to this block.
It will then output a stream for each channel.
'''
- def __init__(self, numchans, taps, oversample_rate=1):
+ def __init__(self, numchans, taps=None, oversample_rate=1, atten=100):
gr.hier_block2.__init__(self, "pfb_channelizer_ccf",
gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
gr.io_signature(numchans, numchans, gr.sizeof_gr_complex)) # Output signature
self._numchans = numchans
- self._taps = taps
self._oversample_rate = oversample_rate
+ if taps is not None:
+ self._taps = taps
+ else:
+ # Create a filter that covers the full bandwidth of the input signal
+ bw = 0.4
+ tb = 0.2
+ ripple = 0.1
+ made = False
+ while not made:
+ try:
+ self._taps = optfir.low_pass(1, self._numchans, bw, bw+tb, ripple, atten)
+ made = True
+ except RuntimeError:
+ ripple += 0.01
+ made = False
+ print("Warning: set ripple to %.4f dB. If this is a problem, adjust the attenuation or create your own filter taps." % (ripple))
+
+ # Build in an exit strategy; if we've come this far, it ain't working.
+ if(ripple >= 1.0):
+ raise RuntimeError("optfir could not generate an appropriate filter.")
+
self.s2ss = gr.stream_to_streams(gr.sizeof_gr_complex, self._numchans)
self.pfb = gr.pfb_channelizer_ccf(self._numchans, self._taps,
self._oversample_rate)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
index 176d0473e8..2e36e7bc1d 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
@@ -20,7 +20,7 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr
+from gnuradio import gr, optfir
class pfb_decimator_ccf(gr.hier_block2):
'''
@@ -29,15 +29,35 @@ class pfb_decimator_ccf(gr.hier_block2):
This simplifies the interface by allowing a single input stream to connect to this block.
It will then output a stream that is the decimated output stream.
'''
- def __init__(self, decim, taps, channel=0):
+ def __init__(self, decim, taps=None, channel=0, atten=100):
gr.hier_block2.__init__(self, "pfb_decimator_ccf",
gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
self._decim = decim
- self._taps = taps
self._channel = channel
+ if taps is not None:
+ self._taps = taps
+ else:
+ # Create a filter that covers the full bandwidth of the input signal
+ bw = 0.4
+ tb = 0.2
+ ripple = 0.1
+ made = False
+ while not made:
+ try:
+ self._taps = optfir.low_pass(1, self._decim, bw, bw+tb, ripple, atten)
+ made = True
+ except RuntimeError:
+ ripple += 0.01
+ made = False
+ print("Warning: set ripple to %.4f dB. If this is a problem, adjust the attenuation or create your own filter taps." % (ripple))
+
+ # Build in an exit strategy; if we've come this far, it ain't working.
+ if(ripple >= 1.0):
+ raise RuntimeError("optfir could not generate an appropriate filter.")
+
self.s2ss = gr.stream_to_streams(gr.sizeof_gr_complex, self._decim)
self.pfb = gr.pfb_decimator_ccf(self._decim, self._taps, self._channel)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
index db29440424..a6094f7f45 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
@@ -20,7 +20,7 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr
+from gnuradio import gr, optfir
class pfb_interpolator_ccf(gr.hier_block2):
'''
@@ -31,7 +31,7 @@ class pfb_interpolator_ccf(gr.hier_block2):
streams. This block is provided to be consistent with the interface to the
other PFB block.
'''
- def __init__(self, interp, taps):
+ def __init__(self, interp, taps=None, atten=100):
gr.hier_block2.__init__(self, "pfb_interpolator_ccf",
gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
@@ -39,6 +39,27 @@ class pfb_interpolator_ccf(gr.hier_block2):
self._interp = interp
self._taps = taps
+ if taps is not None:
+ self._taps = taps
+ else:
+ # Create a filter that covers the full bandwidth of the input signal
+ bw = 0.4
+ tb = 0.2
+ ripple = 0.99
+ made = False
+ while not made:
+ try:
+ self._taps = optfir.low_pass(self._interp, self._interp, bw, bw+tb, ripple, atten)
+ made = True
+ except RuntimeError:
+ ripple += 0.01
+ made = False
+ print("Warning: set ripple to %.4f dB. If this is a problem, adjust the attenuation or create your own filter taps." % (ripple))
+
+ # Build in an exit strategy; if we've come this far, it ain't working.
+ if(ripple >= 1.0):
+ raise RuntimeError("optfir could not generate an appropriate filter.")
+
self.pfb = gr.pfb_interpolator_ccf(self._interp, self._taps)
self.connect(self, self.pfb)
diff --git a/gnuradio-examples/python/pfb/channelize.py b/gnuradio-examples/python/pfb/channelize.py
index 27d87e558b..f845c05c6f 100755
--- a/gnuradio-examples/python/pfb/channelize.py
+++ b/gnuradio-examples/python/pfb/channelize.py
@@ -36,7 +36,7 @@ class pfb_top_block(gr.top_block):
# Create a set of taps for the PFB channelizer
self._taps = gr.firdes.low_pass_2(1, self._fs, 475.50, 50,
- attenuation_dB=10, window=gr.firdes.WIN_BLACKMAN_hARRIS)
+ attenuation_dB=100, window=gr.firdes.WIN_BLACKMAN_hARRIS)
# Calculate the number of taps per channel for our own information
tpc = scipy.ceil(float(len(self._taps)) / float(self._M))