Work on examples for the synthesize filterbank block. The cleans up the simple exampl...
authorTom Rondeau <trondeau@vt.edu>
Sat, 16 Oct 2010 21:00:11 +0000 (17:00 -0400)
committerTom Rondeau <trondeau@vt.edu>
Sat, 16 Oct 2010 21:00:11 +0000 (17:00 -0400)
gnuradio-examples/python/pfb/synth_filter.py
gnuradio-examples/python/pfb/synth_to_chan.py [new file with mode: 0755]

index 015ebd66845119575b94facc6680249fac8e391a..a1562f9eacb05103f5aad1ba706e78c9e591aa6f 100755 (executable)
@@ -1,4 +1,24 @@
 #!/usr/bin/env python
+#
+# Copyright 2010 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
 
 from gnuradio import gr, blks2
 import scipy, pylab
@@ -11,17 +31,13 @@ def main():
     nchans = 7
 
     sigs = list()
-    fmtx = list()
     for fi in freqs:
         s = gr.sig_source_c(fs, gr.GR_SIN_WAVE, fi, 1)
-        fm = blks2.nbfm_tx (fs, 4*fs, max_dev=10000, tau=75e-6)
         sigs.append(s)
-        fmtx.append(fm)
 
     taps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
     print "Num. Taps = %d (taps per filter = %d)" % (len(taps), 
                                                      len(taps)/nchans)
-    #filtbank = blks2.synthesis_filterbank(nchans, taps)
     filtbank = gr.pfb_synthesis_filterbank_ccf(nchans, taps)
 
     head = gr.head(gr.sizeof_gr_complex, N)
@@ -31,12 +47,11 @@ def main():
     tb.connect(filtbank, head, snk)
 
     for i,si in enumerate(sigs):
-        #tb.connect(si, fmtx[i], (filtbank, i))
         tb.connect(si, (filtbank, i))
     
     tb.run()
 
-    if 0:
+    if 1:
         f1 = pylab.figure(1)
         s1 = f1.add_subplot(1,1,1)
         s1.plot(snk.data()[1000:])
@@ -45,7 +60,6 @@ def main():
         f2 = pylab.figure(2)
         s2 = f2.add_subplot(1,1,1)
         winfunc = scipy.blackman
-        #winfunc = scipy.hamming
         s2.psd(snk.data()[10000:], NFFT=fftlen,
                Fs = nchans*fs,
                noverlap=fftlen/4,
diff --git a/gnuradio-examples/python/pfb/synth_to_chan.py b/gnuradio-examples/python/pfb/synth_to_chan.py
new file mode 100755 (executable)
index 0000000..1beda1a
--- /dev/null
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+from gnuradio import gr, blks2
+import scipy, pylab
+
+def main():
+    N = 1000000
+    fs = 8000
+
+    freqs = [100, 200, 300, 400, 500]
+    nchans = 7
+
+    sigs = list()
+    fmtx = list()
+    for fi in freqs:
+        s = gr.sig_source_f(fs, gr.GR_SIN_WAVE, fi, 1)
+        fm = blks2.nbfm_tx (fs, 4*fs, max_dev=10000, tau=75e-6)
+        sigs.append(s)
+        fmtx.append(fm)
+
+    syntaps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+    print "Synthesis Num. Taps = %d (taps per filter = %d)" % (len(syntaps), 
+                                                               len(syntaps)/nchans)
+    chtaps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+    print "Channelizer Num. Taps = %d (taps per filter = %d)" % (len(chtaps), 
+                                                                 len(chtaps)/nchans)
+    filtbank = gr.pfb_synthesis_filterbank_ccf(nchans, syntaps)
+    channelizer = blks2.pfb_channelizer_ccf(nchans, chtaps)
+
+    noise_level = 0.01
+    head = gr.head(gr.sizeof_gr_complex, N)
+    noise = gr.noise_source_c(gr.GR_GAUSSIAN, noise_level)
+    addnoise = gr.add_cc()
+    snk_synth = gr.vector_sink_c()
+
+    tb = gr.top_block()
+
+    tb.connect(noise, (addnoise,0))
+    tb.connect(filtbank, head, (addnoise, 1))
+    tb.connect(addnoise, channelizer)
+    tb.connect(addnoise, snk_synth)
+
+    snk = list()
+    for i,si in enumerate(sigs):
+        tb.connect(si, fmtx[i], (filtbank, i))
+
+    for i in xrange(nchans):
+        snk.append(gr.vector_sink_c())
+        tb.connect((channelizer, i), snk[i])
+    
+    tb.run()
+
+    if 1:
+        channel = 1
+        data = snk[channel].data()[1000:]
+
+        f1 = pylab.figure(1)
+        s1 = f1.add_subplot(1,1,1)
+        s1.plot(data[10000:10200] )
+        s1.set_title(("Output Signal from Channel %d" % channel))
+        
+        fftlen = 2048
+        winfunc = scipy.blackman
+        #winfunc = scipy.hamming
+
+        f2 = pylab.figure(2)
+        s2 = f2.add_subplot(1,1,1)
+        s2.psd(data, NFFT=fftlen,
+               Fs = nchans*fs,
+               noverlap=fftlen/4,
+               window = lambda d: d*winfunc(fftlen))
+        s2.set_title(("Output PSD from Channel %d" % channel))
+
+        f3 = pylab.figure(3)
+        s3 = f3.add_subplot(1,1,1)
+        s3.psd(snk_synth.data()[1000:], NFFT=fftlen,
+               Fs = nchans*fs,
+               noverlap=fftlen/4,
+               window = lambda d: d*winfunc(fftlen))
+        s3.set_title("Output of Synthesis Filter")
+
+        pylab.show()
+
+if __name__ == "__main__":
+    main()