From ae03fd9ae853055548be3e2c0ff5754828142c2a Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 28 Dec 2010 12:47:32 -0500
Subject: Updating the arb. resampler to use the optfir filter that provides
 better specificatiion of stopband atten.

---
 .../python/gnuradio/blks2impl/pfb_arb_resampler.py   | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

(limited to 'gnuradio-core/src/python/gnuradio/blks2impl')

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 cd9289fa5f..c4e496c45a 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,19 @@ 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))
 
         self.pfb = gr.pfb_arb_resampler_ccf(self._rate, self._taps, self._size)
 
-- 
cgit v1.2.3


From 3751671d1b596113e441ca326280bdcc94fdcc6f Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 28 Dec 2010 12:48:18 -0500
Subject: 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.

---
 .../python/gnuradio/blks2impl/pfb_channelizer.py   | 22 +++++++++++++++++++---
 gnuradio-examples/python/pfb/channelize.py         |  2 +-
 2 files changed, 20 insertions(+), 4 deletions(-)

(limited to 'gnuradio-core/src/python/gnuradio/blks2impl')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
index a479ed48ea..ecbdd20476 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,31 @@ 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))
+
         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-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))
-- 
cgit v1.2.3


From 47c11429a1f2afa2d46419d3fedff60403e4ea12 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 28 Dec 2010 12:55:43 -0500
Subject: Allowing PFB decimator to be called without specifying the taps;
 autogen taps inside hierblock.

---
 .../src/python/gnuradio/blks2impl/pfb_decimator.py | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

(limited to 'gnuradio-core/src/python/gnuradio/blks2impl')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
index 176d0473e8..103980da02 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,31 @@ 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))
+
         self.s2ss = gr.stream_to_streams(gr.sizeof_gr_complex, self._decim)
         self.pfb = gr.pfb_decimator_ccf(self._decim, self._taps, self._channel)
 
-- 
cgit v1.2.3


From 3f32342fc5c82d53e7c94afbccb01d38280db733 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 28 Dec 2010 13:00:56 -0500
Subject: Allowing PFB interpolator to be called without specifying the taps;
 autogen taps inside hierblock.

---
 .../python/gnuradio/blks2impl/pfb_interpolator.py   | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

(limited to 'gnuradio-core/src/python/gnuradio/blks2impl')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
index db29440424..a210e3de82 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,23 @@ 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.1
+            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))
+
         self.pfb = gr.pfb_interpolator_ccf(self._interp, self._taps)
 
         self.connect(self, self.pfb)
-- 
cgit v1.2.3


From 2fa7c997559e173c59227ee14a154e4b462d46bd Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 28 Dec 2010 13:08:55 -0500
Subject: 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.

---
 gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py | 4 ++++
 gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py   | 4 ++++
 gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py     | 4 ++++
 gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py  | 6 +++++-
 4 files changed, 17 insertions(+), 1 deletion(-)

(limited to 'gnuradio-core/src/python/gnuradio/blks2impl')

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 c4e496c45a..5e4e068714 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
@@ -57,6 +57,10 @@ class pfb_arb_resampler_ccf(gr.hier_block2):
                     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)
 
         self.connect(self, self.pfb)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
index ecbdd20476..3ddc1749a7 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
@@ -54,6 +54,10 @@ class pfb_channelizer_ccf(gr.hier_block2):
                     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 103980da02..2e36e7bc1d 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
@@ -54,6 +54,10 @@ class pfb_decimator_ccf(gr.hier_block2):
                     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 a210e3de82..a6094f7f45 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
@@ -45,7 +45,7 @@ class pfb_interpolator_ccf(gr.hier_block2):
             # Create a filter that covers the full bandwidth of the input signal
             bw = 0.4
             tb = 0.2
-            ripple = 0.1
+            ripple = 0.99
             made = False
             while not made:
                 try:
@@ -56,6 +56,10 @@ class pfb_interpolator_ccf(gr.hier_block2):
                     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)
-- 
cgit v1.2.3