Imported Upstream version 3.2.2
[debian/gnuradio] / gnuradio-examples / python / usrp / usrp_wfm_rcv_pll.py
index 34989ce490ddb33f5a4870163b2e34373f4a04f2..84992955a20f79eddfa209b805222afe89775c83 100755 (executable)
@@ -1,14 +1,34 @@
 #!/usr/bin/env python
+#
+# Copyright 2005,2006,2007 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, gru, eng_notation, optfir
 from gnuradio import audio
 from gnuradio import usrp
-from gnuradio import blks
+from gnuradio import blks2
 from gnuradio.eng_option import eng_option
 from gnuradio.wxgui import slider, powermate
-from gnuradio.wxgui import stdgui, fftsink, form, scopesink
+from gnuradio.wxgui import stdgui2, fftsink2, form, scopesink2
 from optparse import OptionParser
-import usrp_dbid
+from usrpm import usrp_dbid
 import sys
 import math
 import wx
@@ -22,11 +42,12 @@ def pick_subdevice(u):
     """
     return usrp.pick_subdev(u, (usrp_dbid.TV_RX,
                                 usrp_dbid.TV_RX_REV_2,
+                               usrp_dbid.TV_RX_REV_3,
                                 usrp_dbid.BASIC_RX))
 
-class wfm_rx_graph (stdgui.gui_flow_graph):
+class wfm_rx_block (stdgui2.std_top_block):
     def __init__(self,frame,panel,vbox,argv):
-        stdgui.gui_flow_graph.__init__ (self,frame,panel,vbox,argv)
+        stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv)
 
         parser=OptionParser(option_class=eng_option)
         parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=None,
@@ -62,11 +83,11 @@ class wfm_rx_graph (stdgui.gui_flow_graph):
         adc_rate = self.u.adc_rate()                # 64 MS/s
         usrp_decim = 200
         self.u.set_decim_rate(usrp_decim)
-        usrp_rate = adc_rate / usrp_decim           # 320 kS/s
+        usrp_rate = adc_rate / usrp_decim           #  320 kS/s
         chanfilt_decim = 1
         demod_rate = usrp_rate / chanfilt_decim
         audio_decimation = 10
-        audio_rate = demod_rate / audio_decimation  # 32 kHz
+        audio_rate = 3*demod_rate / audio_decimation/2  # 48 kHz
 
         if options.rx_subdev_spec is None:
             options.rx_subdev_spec = pick_subdevice(self.u)
@@ -75,18 +96,21 @@ class wfm_rx_graph (stdgui.gui_flow_graph):
         self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec)
 
 
-        chan_filt_coeffs = optfir.low_pass (1,           # gain
+        chan_filt_coeffs = gr.firdes.low_pass_2     (1,         # gain
                                             usrp_rate,   # sampling rate
-                                            80e3,        # passband cutoff
-                                            115e3,       # stopband cutoff
-                                            0.1,         # passband ripple
-                                            60)          # stopband attenuation
-        #print len(chan_filt_coeffs)
+                                            90e3,        # passband cutoff
+                                            30e3,        # transition bandwidth
+                                            70,          # stopband attenuation
+                                            gr.firdes.WIN_BLACKMAN)
+        print len(chan_filt_coeffs)
         chan_filt = gr.fir_filter_ccf (chanfilt_decim, chan_filt_coeffs)
 
+        self.rchan_sample = blks2.rational_resampler_fff(3,2)
+        self.lchan_sample = blks2.rational_resampler_fff(3,2)
 
-        #self.guts = blks.wfm_rcv (self, demod_rate, audio_decimation)
-        self.guts = blks.wfm_rcv_pll (self, demod_rate, audio_decimation)
+
+        #self.guts = blks2.wfm_rcv (demod_rate, audio_decimation)
+        self.guts = blks2.wfm_rcv_pll (demod_rate, audio_decimation)
 
         # FIXME rework {add,multiply}_const_* to handle multiple streams
         self.volume_control_l = gr.multiply_const_ff(self.vol)
@@ -99,8 +123,9 @@ class wfm_rx_graph (stdgui.gui_flow_graph):
         
         # now wire it all together
         self.connect (self.u, chan_filt, self.guts)
-        self.connect ((self.guts, 0), self.volume_control_l, (audio_sink, 0))
-        self.connect ((self.guts, 1), self.volume_control_r, (audio_sink, 1))
+        self.connect((self.guts, 0), self.lchan_sample,self.volume_control_l,(audio_sink,0))
+        self.connect((self.guts, 1), self.rchan_sample,self.volume_control_r,(audio_sink,1))
+
         try:
           self.guts.stereo_carrier_pll_recovery.squelch_enable(True)
         except:
@@ -145,34 +170,35 @@ class wfm_rx_graph (stdgui.gui_flow_graph):
 
 
         if 1:
-            self.src_fft = fftsink.fft_sink_c (self, self.panel, title="Data from USRP",
-                                               fft_size=512, sample_rate=usrp_rate)
+            self.src_fft = fftsink2.fft_sink_c(self.panel, title="Data from USRP",
+                                               fft_size=512, sample_rate=usrp_rate,
+                                              ref_scale=32768.0, ref_level=0, y_divs=12)
             self.connect (self.u, self.src_fft)
             vbox.Add (self.src_fft.win, 4, wx.EXPAND)
 
         if 1:
-            post_fm_demod_fft = fftsink.fft_sink_f (self, self.panel, title="Post FM Demod",
-                                                  fft_size=512, sample_rate=demod_rate,
-                                                  y_per_div=10, ref_level=0)
+            post_fm_demod_fft = fftsink2.fft_sink_f(self.panel, title="Post FM Demod",
+                                                    fft_size=512, sample_rate=demod_rate,
+                                                    y_per_div=10, ref_level=0)
             self.connect (self.guts.fm_demod, post_fm_demod_fft)
             vbox.Add (post_fm_demod_fft.win, 4, wx.EXPAND)
 
         if 0:
-            post_stereo_carrier_generator_fft = fftsink.fft_sink_c (self, self.panel, title="Post Stereo_carrier_generator",
+            post_stereo_carrier_generator_fft = fftsink2.fft_sink_c (self.panel, title="Post Stereo_carrier_generator",
                                                   fft_size=512, sample_rate=audio_rate,
                                                   y_per_div=10, ref_level=0)
             self.connect (self.guts.stereo_carrier_generator, post_stereo_carrier_generator_fft)
             vbox.Add (post_stereo_carrier_generator_fft.win, 4, wx.EXPAND)
 
         if 0:
-            post_deemphasis_left = fftsink.fft_sink_f (self, self.panel, title="Post_Deemphasis_Left",
+            post_deemphasis_left = fftsink2.fft_sink_f (self.panel, title="Post_Deemphasis_Left",
                                                   fft_size=512, sample_rate=audio_rate,
                                                   y_per_div=10, ref_level=0)
             self.connect (self.guts.deemph_Left, post_deemphasis_left)
             vbox.Add (post_deemphasis_left.win, 4, wx.EXPAND)
 
         if 0:
-            post_deemphasis_right = fftsink.fft_sink_f (self, self.panel, title="Post_Deemphasis_Right",
+            post_deemphasis_right = fftsink2.fft_sink_f(self.panel, title="Post_Deemphasis_Right",
                                                   fft_size=512, sample_rate=audio_rate,
                                                   y_per_div=10, ref_level=-20)
             self.connect (self.guts.deemph_Left, post_deemphasis_right)
@@ -180,15 +206,15 @@ class wfm_rx_graph (stdgui.gui_flow_graph):
 
 
         if 0:
-            LmR_fft = fftsink.fft_sink_f (self, self.panel, title="LmR", 
-                                                fft_size=512, sample_rate=audio_rate,
-                                                y_per_div=10, ref_level=-20)
+            LmR_fft = fftsink2.fft_sink_f(self.panel, title="LmR", 
+                                          fft_size=512, sample_rate=audio_rate,
+                                          y_per_div=10, ref_level=-20)
             self.connect (self.guts.LmR_real,LmR_fft)
             vbox.Add (LmR_fft.win, 4, wx.EXPAND)
 
         if 0:
-            self.scope = scopesink.scope_sink_f(self, self.panel, sample_rate=demod_rate)
-            self.connect (self.guts.fm_demod_a,self.scope)
+            self.scope = scopesink2.scope_sink_f(self.panel, sample_rate=demod_rate)
+            self.connect (self.guts.fm_demod,self.scope)
             vbox.Add (self.scope.win,4,wx.EXPAND)
         
         # control area form at bottom
@@ -321,5 +347,5 @@ class wfm_rx_graph (stdgui.gui_flow_graph):
         
 
 if __name__ == '__main__':
-    app = stdgui.stdapp (wfm_rx_graph, "USRP WFM RX")
+    app = stdgui2.stdapp (wfm_rx_block, "USRP WFM RX")
     app.MainLoop ()