commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r4960 - in gnuradio/branches/developers/nldudok1/gener


From: nldudok1
Subject: [Commit-gnuradio] r4960 - in gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python: . cxadc usrp
Date: Wed, 11 Apr 2007 18:48:22 -0600 (MDT)

Author: nldudok1
Date: 2007-04-11 18:48:22 -0600 (Wed, 11 Apr 2007)
New Revision: 4960

Added:
   
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/
   
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cx2388x_oscope.py
   
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_fft.py
   
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_rx_cfile.py
   
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv.py
   
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv_nogui.py
Modified:
   
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/usrp/usrp_fmtv_rcv.py
Log:
added cxadc examples

Added: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cx2388x_oscope.py
===================================================================
--- 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cx2388x_oscope.py
                          (rev 0)
+++ 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cx2388x_oscope.py
  2007-04-12 00:48:22 UTC (rev 4960)
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+#
+# Copyright 2004,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 2, 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
+from gnuradio import eng_notation
+from gnuradio.eng_option import eng_option
+from gnuradio.wxgui import stdgui, fftsink, waterfallsink, scopesink, form, 
slider
+from optparse import OptionParser
+import wx
+import sys
+
+from gnuradio import cxadc
+
+
+class app_flow_graph(stdgui.gui_flow_graph):
+    def __init__(self, frame, panel, vbox, argv):
+        stdgui.gui_flow_graph.__init__(self)
+
+        self.frame = frame
+        self.panel = panel
+        
+        usage="%prog: [options]"        
+        parser = OptionParser(option_class=eng_option, usage=usage) 
+        parser.add_option("-n", "--frame-decim", type="int", default=1,
+                          help="set oscope frame decimation factor to n 
[default=1]")
+        parser.add_option("-v", "--v-scale", type="eng_float", default=10000,
+                          help="set oscope initial V/div to SCALE 
[default=%default]")
+        parser.add_option("-t", "--t-scale", type="eng_float", default=49e-6,
+                          help="set oscope initial s/div to SCALE 
[default=50us]")
+        #parser.add_option( "-s","--input-shorts", action="store_true", 
default=False,
+        #                  help="input interleaved shorts in stead of complex 
floats")
+        (options, args) = parser.parse_args()
+        if len(args) != 0:
+            parser.print_help()
+            raise SystemExit, 1
+
+        self.show_debug_info = True
+        
+        # build the graph
+        sampling_freq=27e6
+        #// public shared_ptr constructor
+        #cxadc_source_sptr
+        #cxadc_make_source (double sampling_freq = 27e6,//sampling_freq is 
ignored at the moment. TODO: implement sampling_freq 
+       #           int do_avg_frame=1,
+        #            double frame_avg_alpha=0.01,
+       #           const std::string dev = "/dev/cxadc") throw 
(std::runtime_error);
+        if True: #options.input_shorts:
+           self.cxadc=cxadc.source (sampling_freq,1,0.1,"/dev/cxadc")
+           self.fsrc=gr.short_to_float()
+           #self.csrc= gr.interleaved_short_to_complex()
+           self.connect(self.cxadc,self.fsrc)  
+        else:
+           self.fsrc= cxadc.source_f (sampling_freq = 
sampling_freq,do_avg_frame=True,frame_avg_alpha=0.01,dev = "/dev/cxadc")
+
+        input_rate = sampling_freq #100.0e6 #self.u.adc_freq() / 
self.u.decim_rate()
+
+        self.scope = scopesink.scope_sink_f(self, panel, 
sample_rate=input_rate,
+                                            frame_decim=options.frame_decim,
+                                            v_scale=options.v_scale,
+                                            t_scale=options.t_scale)
+        self.connect(self.fsrc, self.scope)
+
+        self._build_gui(vbox)
+                        
+
+
+    def _set_status_msg(self, msg):
+        self.frame.GetStatusBar().SetStatusText(msg, 0)
+
+    def _build_gui(self, vbox):            
+        vbox.Add(self.scope.win, 10, wx.EXPAND)
+        
+        # add control area at the bottom
+        #self.myform = myform = form.form()
+        #hbox = wx.BoxSizer(wx.HORIZONTAL)
+        #hbox.Add((5,0), 0, 0)
+        #
+        #vbox.Add(hbox, 0, wx.EXPAND)
+
+
+def main ():
+    app = stdgui.stdapp(app_flow_graph, "cxadc TV card O'scope", nstatus=1)
+    app.MainLoop()
+
+if __name__ == '__main__':
+    main ()


Property changes on: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cx2388x_oscope.py
___________________________________________________________________
Name: svn:executable
   + *

Added: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_fft.py
===================================================================
--- 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_fft.py
                               (rev 0)
+++ 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_fft.py
       2007-04-12 00:48:22 UTC (rev 4960)
@@ -0,0 +1,243 @@
+#!/usr/bin/env python
+#
+# Copyright 2004,2005 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 2, 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
+from gnuradio import usrp
+from gnuradio import eng_notation
+from gnuradio.eng_option import eng_option
+from gnuradio.wxgui import stdgui, fftsink, waterfallsink, scopesink, form, 
slider
+
+from gnuradio.blksimpl.dqpsk import dqpsk_mod
+
+from optparse import OptionParser
+import wx
+import sys
+
+from gnuradio import cxadc    
+
+class app_flow_graph(stdgui.gui_flow_graph):
+    def __init__(self, frame, panel, vbox, argv):
+        stdgui.gui_flow_graph.__init__(self)
+
+        self.frame = frame
+        self.panel = panel
+        usage="%prog: [options] input_filename"        
+        parser = OptionParser(option_class=eng_option, usage=usage)
+
+        parser.add_option("-f", "--freq", type="eng_float", default=None,
+                          help="set frequency to FREQ", metavar="FREQ")     
+        parser.add_option("-W", "--waterfall", action="store_true", 
default=False,
+                          help="Enable waterfall display")
+        parser.add_option("-S", "--oscilloscope", action="store_true", 
default=False,
+                          help="Enable oscilloscope display")
+        parser.add_option("-n", "--frame-decim", type="int", default=1,
+                          help="set oscope frame decimation factor to n 
[default=1]")
+        parser.add_option("-v", "--v-scale", type="eng_float", default=1000,
+                          help="set oscope initial V/div to SCALE 
[default=%default]")
+        parser.add_option("-t", "--t-scale", type="eng_float", default=49e-6,
+                          help="set oscope initial s/div to SCALE 
[default=50us]")
+        (options, args) = parser.parse_args()
+        if len(args) != 0:
+            parser.print_help()
+            raise SystemExit, 1
+        
+        self.show_debug_info = True
+        
+        #self.noise_float= gr.noise_source_f(gr.GR_UNIFORM ,127.5,0)
+        #self.noise_char=gr.float_to_char()
+        
+        #self.src = gr.file_source(gr.sizeof_gr_complex, filename, True)
+        input_rate = 32.0e6 #27e6
+        
+        #// public shared_ptr constructor
+        #cxadc_source_sptr
+        #cxadc_make_source (double sampling_freq = 27e6,//sampling_freq is 
ignored at the moment. TODO: implement sampling_freq 
+       #           int do_avg_frame=1,
+        #            double frame_avg_alpha=0.01,
+       #           const std::string dev = "/dev/cxadc") throw 
(std::runtime_error);
+        if True: #options.input_shorts:
+           self.cxadc=cxadc.source (input_rate,0,0.1,"/dev/cxadc")
+           self.fsrc=gr.short_to_float()
+           #self.csrc= gr.interleaved_short_to_complex()
+           self.connect(self.cxadc,self.fsrc)  
+        else:
+           self.fsrc= cxadc.source_f (sampling_freq = 
input_rate,do_avg_frame=True,frame_avg_alpha=0.01,dev = "/dev/cxadc")
+        if options.waterfall:
+            self.scope = \
+              waterfallsink.waterfall_sink_f (self, panel, fft_size=1024, 
sample_rate=input_rate)
+        elif options.oscilloscope:
+            #self.scope = scopesink.scope_sink_c(self, panel, 
sample_rate=input_rate)
+            self.scope = scopesink.scope_sink_f(self, panel, 
sample_rate=input_rate,
+                                            frame_decim=options.frame_decim,
+                                            v_scale=options.v_scale,
+                                            t_scale=options.t_scale)
+        else:
+            self.scope = fftsink.fft_sink_f (self, panel, fft_size=1024, 
sample_rate=input_rate,avg_alpha=0.1*2.0 / 15.0)
+
+        self.connect(self.fsrc, self.scope)
+
+        self._build_gui(vbox)
+
+        # set initial values
+
+        #if options.gain is None:
+        #    # if no gain was specified, use the mid-point in dB
+        #    g = self.subdev.gain_range()
+        #    options.gain = float(g[0]+g[1])/2
+
+        #if options.freq is None:
+        #    # if no freq was specified, use the mid-point
+        #    r = self.subdev.freq_range()
+        #    options.freq = float(r[0]+r[1])/2
+
+        #self.set_gain(options.gain)
+
+        if self.show_debug_info:
+            self.myform['decim'].set_value(1)#self.u.decim_rate())
+            self.myform['address@hidden'].set_value(1)#self.u.adc_freq() / 
self.u.decim_rate())
+            self.myform['dbname'].set_value("")#self.subdev.name())
+            self.myform['baseband'].set_value(0)
+            self.myform['ddc'].set_value(0)
+
+        if not(self.set_freq(options.freq)):
+            self._set_status_msg("Failed to set initial frequency")
+
+    def _set_status_msg(self, msg):
+        self.frame.GetStatusBar().SetStatusText(msg, 0)
+
+    def _build_gui(self, vbox):
+
+        def _form_set_freq(kv):
+            return self.set_freq(kv['freq'])
+            
+        vbox.Add(self.scope.win, 10, wx.EXPAND)
+        
+        # add control area at the bottom
+        self.myform = myform = form.form()
+        hbox = wx.BoxSizer(wx.HORIZONTAL)
+        hbox.Add((5,0), 0, 0)
+        myform['freq'] = form.float_field(
+            parent=self.panel, sizer=hbox, label="Center freq", weight=1,
+            callback=myform.check_input_and_call(_form_set_freq, 
self._set_status_msg))
+
+        hbox.Add((5,0), 0, 0)
+        g = (0,0)#self.subdev.gain_range()
+        myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, 
label="Gain",
+                                           weight=3,
+                                           min=int(g[0]), max=int(g[1]),
+                                           callback=self.set_gain)
+
+        hbox.Add((5,0), 0, 0)
+        vbox.Add(hbox, 0, wx.EXPAND)
+
+        self._build_subpanel(vbox)
+
+    def _build_subpanel(self, vbox_arg):
+        # build a secondary information panel (sometimes hidden)
+
+        # FIXME figure out how to have this be a subpanel that is always
+        # created, but has its visibility controlled by foo.Show(True/False)
+        
+        def _form_set_decim(kv):
+            return self.set_decim(kv['decim'])
+
+        if not(self.show_debug_info):
+            return
+
+        panel = self.panel
+        vbox = vbox_arg
+        myform = self.myform
+
+        #panel = wx.Panel(self.panel, -1)
+        #vbox = wx.BoxSizer(wx.VERTICAL)
+
+        hbox = wx.BoxSizer(wx.HORIZONTAL)
+        hbox.Add((5,0), 0)
+
+        myform['decim'] = form.int_field(
+            parent=panel, sizer=hbox, label="Decim",
+            callback=myform.check_input_and_call(_form_set_decim, 
self._set_status_msg))
+
+        hbox.Add((5,0), 1)
+        myform['address@hidden'] = form.static_float_field(
+            parent=panel, sizer=hbox, label="address@hidden")
+
+        hbox.Add((5,0), 1)
+        myform['dbname'] = form.static_text_field(
+            parent=panel, sizer=hbox)
+
+        hbox.Add((5,0), 1)
+        myform['baseband'] = form.static_float_field(
+            parent=panel, sizer=hbox, label="Analog BB")
+
+        hbox.Add((5,0), 1)
+        myform['ddc'] = form.static_float_field(
+            parent=panel, sizer=hbox, label="DDC")
+
+        hbox.Add((5,0), 0)
+        vbox.Add(hbox, 0, wx.EXPAND)
+
+        
+    def set_freq(self, target_freq):
+        """
+        Set the center frequency we're interested in.
+
+        @param target_freq: frequency in Hz
+        @rypte: bool
+
+        Tuning is a two step process.  First we ask the front-end to
+        tune as close to the desired frequency as it can.  Then we use
+        the result of that operation and our target_frequency to
+        determine the value for the digital down converter.
+        """
+        #r = self.u.tune(0, self.subdev, target_freq)
+        r=False
+        if r:
+            self.myform['freq'].set_value(target_freq)     # update displayed 
value
+            if self.show_debug_info:
+                self.myform['baseband'].set_value(r.baseband_freq)
+                self.myform['ddc'].set_value(r.dxc_freq)
+            return True
+
+        return False
+
+    def set_gain(self, gain):
+        self.myform['gain'].set_value(gain)     # update displayed value
+        #self.subdev.set_gain(gain)
+
+    def set_decim(self, decim):
+        ok = False #self.u.set_decim_rate(decim)
+        if not ok:
+            print "set_decim failed"
+        #input_rate = self.u.adc_freq() / self.u.decim_rate()
+        #self.scope.set_sample_rate(input_rate)
+        if self.show_debug_info:  # update displayed values
+            self.myform['decim'].set_value(self.u.decim_rate())
+            self.myform['address@hidden'].set_value(self.u.adc_freq() / 
self.u.decim_rate())
+        return ok
+
+def main ():
+    app = stdgui.stdapp(app_flow_graph, "USRP FFT", nstatus=1)
+    app.MainLoop()
+
+if __name__ == '__main__':
+    main ()


Property changes on: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_fft.py
___________________________________________________________________
Name: svn:executable
   + *

Added: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_rx_cfile.py
===================================================================
--- 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_rx_cfile.py
                          (rev 0)
+++ 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_rx_cfile.py
  2007-04-12 00:48:22 UTC (rev 4960)
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+"""
+Read samples from the USRP and write to file formatted as binary
+outputs single precision complex float values or complex short values 
(interleaved 16 bit signed short integers).
+
+"""
+
+from gnuradio import gr, eng_notation
+from gnuradio import audio
+from gnuradio import usrp
+from gnuradio import cxadc
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+
+class my_graph(gr.flow_graph):
+
+    def __init__(self):
+        gr.flow_graph.__init__(self)
+
+        usage="%prog: [options] output_filename"
+        parser = OptionParser(option_class=eng_option, usage=usage)
+        parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=(0, 
0),
+                          help="select USRP Rx side A or B (default=A)")
+        parser.add_option("-d", "--decim", type="int", default=16,
+                          help="set fgpa decimation rate to DECIM 
[default=%default]")
+        parser.add_option("-f", "--freq", type="eng_float", default=None,
+                          help="set frequency to FREQ", metavar="FREQ")   
+        parser.add_option("-g", "--gain", type="eng_float", default=None,
+                          help="set gain in dB (default is midpoint)")
+        parser.add_option( "-s","--output-shorts", action="store_true", 
default=True,
+                          help="output shorts (this is the default)")
+        parser.add_option( "-F","--output-floats", action="store_true", 
default=False,
+                          help="output floats")
+        parser.add_option("-N", "--nsamples", type="eng_float", default=None,
+                          help="number of samples to collect [default=+inf]")
+        (options, args) = parser.parse_args ()
+        if len(args) != 1:
+            parser.print_help()
+            raise SystemExit, 1
+        filename = args[0]
+
+        if options.freq is None:
+            parser.print_help()
+            sys.stderr.write('You must specify the frequency with -f FREQ\n');
+            raise SystemExit, 1
+
+        # build the graph
+        #standard fpga firmware "std_2rxhb_2tx.rbf" contains 2 Rx paths with 
halfband filters and 2 tx paths (the default) min decimation 8
+
+        self.u = usrp.source_c(decim_rate=options.decim)
+
+        adc_rate = (27.0/28.8)*32.0e6 #16.0e6 #27e6 #self.u.adc_rate()         
       # 64 MS/s
+        
+        #// public shared_ptr constructor
+        #cxadc_source_sptr
+        #cxadc_make_source (double sampling_freq = 27e6,//sampling_freq is 
ignored at the moment. TODO: implement sampling_freq 
+       #           int do_avg_frame=1,
+        #            double frame_avg_alpha=0.01,
+       #           const std::string dev = "/dev/cxadc") throw 
(std::runtime_error);
+        if True: #options.input_shorts:
+           do_remove_dc=0
+           self.cxadc=cxadc.source (adc_rate,do_remove_dc,0.1,"/dev/cxadc")
+        else:
+           self.fsrc= cxadc.source_f (sampling_freq = 
adc_rate,do_avg_frame=True,frame_avg_alpha=0.01,dev = "/dev/cxadc")
+
+
+        if options.output_floats:
+          self.fsrc=gr.short_to_float()
+          self.connect(self.cxadc,self.fsrc)   
+          self.dst = gr.file_sink(gr.sizeof_float, filename)
+          self.src=self.fsrc
+        elif options.output_shorts:
+          self.dst = gr.file_sink(gr.sizeof_short, filename)
+          self.src=self.cxadc
+        
+        if options.nsamples is None:
+            self.connect(self.src, self.dst)
+        else:
+            if options.output_shorts:
+              self.head = gr.head(gr.sizeof_short, int(options.nsamples))
+            else:
+              self.head = gr.head(gr.sizeof_float, int(options.nsamples))
+            self.connect(self.src, self.head, self.dst)
+
+        if options.rx_subdev_spec is None:
+            options.rx_subdev_spec = usrp.pick_rx_subdevice(self.u)
+        self.u.set_mux(usrp.determine_rx_mux_value(self.u, 
options.rx_subdev_spec))
+
+        # determine the daughterboard subdevice we're using
+        self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec)
+        print "Using RX d'board %s" % (self.subdev.side_and_name(),)
+        input_rate = self.u.adc_freq() / self.u.decim_rate()
+        print "USB sample rate %s" % (eng_notation.num_to_str(input_rate))
+
+        if options.gain is None:
+            # if no gain was specified, use the mid-point in dB
+            g = self.subdev.gain_range()
+            options.gain = float(g[0]+g[1])/2
+
+        self.subdev.set_gain(options.gain)
+
+        r = self.u.tune(0, self.subdev, options.freq)
+        if not r:
+            sys.stderr.write('Failed to set frequency\n')
+            raise SystemExit, 1
+
+        
+if __name__ == '__main__':
+    try:
+        my_graph().run()
+    except KeyboardInterrupt:
+        pass


Property changes on: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_rx_cfile.py
___________________________________________________________________
Name: svn:executable
   + *

Added: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv.py
===================================================================
--- 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv.py
                           (rev 0)
+++ 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv.py
   2007-04-12 00:48:22 UTC (rev 4960)
@@ -0,0 +1,322 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, gru, eng_notation, optfir
+from gnuradio import audio
+from gnuradio import cxadc
+from gnuradio import usrp
+from gnuradio import blks
+from gnuradio.eng_option import eng_option
+from gnuradio.wxgui import slider, powermate
+from gnuradio.wxgui import stdgui, fftsink, form
+from optparse import OptionParser
+import usrp_dbid
+import sys
+import math
+import wx
+
+def pick_subdevice(u):
+    """
+    The user didn't specify a subdevice on the command line.
+    Try for one of these, in order: TV_RX, BASIC_RX, whatever is on side A.
+
+    @return a subdev_spec
+    """
+    return usrp.pick_subdev(u, (usrp_dbid.TV_RX,
+                                usrp_dbid.TV_RX_REV_2,
+                                usrp_dbid.BASIC_RX))
+
+
+class wfm_rx_graph (stdgui.gui_flow_graph):
+    def __init__(self,frame,panel,vbox,argv):
+        stdgui.gui_flow_graph.__init__ (self,frame,panel,vbox,argv)
+
+        parser=OptionParser(option_class=eng_option)
+        parser.add_option("-R", "--rx-subdev-spec", type="subdev", 
default=None,
+                          help="select USRP Rx side A or B (default=A)")
+        parser.add_option("-f", "--freq", type="eng_float", default=100.1e6,
+                          help="set frequency to FREQ", metavar="FREQ")
+        parser.add_option("-i", "--if-freq", type="eng_float", default=5.75e6,
+                          help="give IF frequency of rf-frontend 
[default=5.75e6] set to zero, if you have no frontend.", metavar="FREQ")
+        parser.add_option("-g", "--gain", type="eng_float", default=40,
+                          help="set gain in dB (default is midpoint)")
+        parser.add_option("-V", "--volume", type="eng_float", default=None,
+                          help="set volume (default is midpoint)")
+        parser.add_option("-O", "--audio-output", type="string", default="",
+                          help="pcm device name.  E.g., hw:0,0 or surround51 
or /dev/dsp")
+        parser.add_option( "-u","--use-usrp-for-tuning", action="store_true", 
default=False,
+                          help="use an usrp to tune a TVRX tuner frontend 
(connect the IF-output to the video-in of the cx2388x capture card)")
+        (options, args) = parser.parse_args()
+        if len(args) != 0:
+            parser.print_help()
+            sys.exit(1)
+        
+        self.frame = frame
+        self.panel = panel
+        
+        self.vol = 0
+        self.state = "FREQ"
+        self.freq = 0
+
+        self.use_usrp_for_tuning=options.use_usrp_for_tuning
+        # build graph
+        if self.use_usrp_for_tuning:
+          self.u = usrp.source_c()                    # usrp is only used for 
tuning TVRX of which you can connect the IF-output to the cx2388xx TV capture 
card video-in
+        expected_crystal_freq=28.63636e6
+        actual_crystal_freq=32.0e6 #I modified my board with a 32 MHz crystal, 
default this is a 28.63636e6 crystal or oscillator
+        default_resample_rate=27.0e6
+        resample_rate=default_resample_rate
+        adc_rate=   resample_rate *  actual_crystal_freq/expected_crystal_freq
+        #// public shared_ptr constructor
+        #cxadc_source_sptr
+        #cxadc_make_source (double sampling_freq = 27e6,//sampling_freq is 
ignored at the moment. TODO: implement sampling_freq 
+       #           int do_avg_frame=1,
+        #            double frame_avg_alpha=0.01,
+       #           const std::string dev = "/dev/cxadc") throw 
(std::runtime_error);
+        if True: #options.input_shorts:
+           do_remove_dc=1
+           self.cxadc=cxadc.source (adc_rate,do_remove_dc,0.1,"/dev/cxadc")
+           self.fsrc=gr.short_to_float()
+           #self.csrc= gr.interleaved_short_to_complex()
+           self.connect(self.cxadc,self.fsrc)  
+        else:
+           self.fsrc= cxadc.source_f (sampling_freq = 
adc_rate,do_avg_frame=True,frame_avg_alpha=0.01,dev = "/dev/cxadc")
+
+        #adc_rate = self.u.adc_rate()                # 64 MS/s
+        cxadc_rate = adc_rate #/ usrp_decim           # 320 kS/s
+        factor=1
+        chanfilt_decim = 100#100*factor
+        demod_rate = cxadc_rate / chanfilt_decim
+        audio_decimation = 10#10/factor
+        audio_rate = demod_rate / (1*audio_decimation)  # 32 kHz
+        
+        if self.use_usrp_for_tuning:
+          if options.rx_subdev_spec is None:
+            options.rx_subdev_spec = pick_subdevice(self.u)
+          self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec)
+          print "Using RX d'board %s" % (self.subdev.side_and_name(),)
+
+
+        #chan_filt_coeffs = optfir.low_pass (1,           # gain
+        #                                    cxadc_rate,   # sampling rate
+        #                                    80e3,        # passband cutoff
+        #                                    115e3,       # stopband cutoff
+        #                                    0.1,         # passband ripple
+        #                                    60)          # stopband 
attenuation
+        use_firdes=False
+        if use_firdes:
+          chan_filt_coeffs = gr.firdes.low_pass        (       1,
+                cxadc_rate,
+               125.0e3, #100.0e3
+               50.0e3   #20.0e3
+         )     
+        else:
+          chan_filt_coeffs = optfir.low_pass (1,           # gain
+                                              cxadc_rate,   # sampling rate
+                                              80e3,        # passband cutoff
+                                              1.5*115e3,       # stopband 
cutoff
+                                              10*0.1,         # passband ripple
+                                              60)          # stopband 
attenuation
+        #print len(chan_filt_coeffs)
+        #chan_filt = gr.fir_filter_ccf (chanfilt_decim, chan_filt_coeffs)
+        chan_filt = gr.freq_xlating_fir_filter_fcf (chanfilt_decim, 
chan_filt_coeffs, options.if_freq, adc_rate) #cxadc_rate)
+
+
+        self.guts = blks.wfm_rcv (self, demod_rate, audio_decimation)
+
+        self.volume_control = gr.multiply_const_ff(self.vol)
+
+        # sound card as final sink
+        audio_sink = audio.sink (int (audio_rate),
+                                 options.audio_output,
+                                 False)  # ok_to_block
+        
+        # now wire it all together
+        self.connect (self.fsrc, chan_filt, self.guts, self.volume_control, 
audio_sink)
+
+        self._build_gui(vbox, cxadc_rate, demod_rate, audio_rate)
+
+        if options.gain is None:
+            # if no gain was specified, use the mid-point in dB
+            if self.use_usrp_for_tuning:
+              g = self.subdev.gain_range()
+              options.gain = float(g[0]+g[1])/2
+            else:
+              options.gain =0
+
+        if options.volume is None:
+            g = self.volume_range()
+            options.volume = float(g[0]+g[1])/2
+            
+        if abs(options.freq) < 1e6:
+            options.freq *= 1e6
+
+        # set initial values
+
+        self.set_gain(options.gain)
+        self.set_vol(options.volume)
+        if not(self.set_freq(options.freq)):
+            self._set_status_msg("Failed to set initial frequency")
+
+
+    def _set_status_msg(self, msg, which=0):
+        self.frame.GetStatusBar().SetStatusText(msg, which)
+
+
+    def _build_gui(self, vbox, cxadc_rate, demod_rate, audio_rate):
+
+        def _form_set_freq(kv):
+            return self.set_freq(kv['freq'])
+
+
+        if 1:
+            self.src_fft = fftsink.fft_sink_f (self, self.panel, title="Data 
from CXADC",
+                                               fft_size=512, 
sample_rate=cxadc_rate)
+            self.connect (self.fsrc, self.src_fft)
+            vbox.Add (self.src_fft.win, 4, wx.EXPAND)
+
+        if 1:
+            post_filt_fft = fftsink.fft_sink_f (self, self.panel, title="Post 
Demod", 
+                                                fft_size=1024, 
sample_rate=demod_rate,
+                                                y_per_div=10, ref_level=0)
+            self.connect (self.guts.fm_demod, post_filt_fft)
+            vbox.Add (post_filt_fft.win, 4, wx.EXPAND)
+
+        if 0:
+            post_deemph_fft = fftsink.fft_sink_f (self, self.panel, 
title="Post Deemph",
+                                                  fft_size=512, 
sample_rate=audio_rate,
+                                                  y_per_div=10, ref_level=-20)
+            self.connect (self.guts.deemph, post_deemph_fft)
+            vbox.Add (post_deemph_fft.win, 4, wx.EXPAND)
+
+        
+        # control area form at bottom
+        self.myform = myform = form.form()
+
+        hbox = wx.BoxSizer(wx.HORIZONTAL)
+        hbox.Add((5,0), 0)
+        myform['freq'] = form.float_field(
+            parent=self.panel, sizer=hbox, label="Freq", weight=1,
+            callback=myform.check_input_and_call(_form_set_freq, 
self._set_status_msg))
+
+        hbox.Add((5,0), 0)
+        myform['freq_slider'] = \
+            form.quantized_slider_field(parent=self.panel, sizer=hbox, 
weight=3,
+                                        range=(87.9e6, 108.1e6, 0.1e6),
+                                        callback=self.set_freq)
+        hbox.Add((5,0), 0)
+        vbox.Add(hbox, 0, wx.EXPAND)
+
+        hbox = wx.BoxSizer(wx.HORIZONTAL)
+        hbox.Add((5,0), 0)
+
+        myform['volume'] = \
+            form.quantized_slider_field(parent=self.panel, sizer=hbox, 
label="Volume",
+                                        weight=3, range=self.volume_range(),
+                                        callback=self.set_vol)
+        hbox.Add((5,0), 1)
+
+        if self.use_usrp_for_tuning:
+           self.gain_range=self.subdev.gain_range()
+        else:
+           self.gain_range=(0,0,1)
+        myform['gain'] = \
+            form.quantized_slider_field(parent=self.panel, sizer=hbox, 
label="Gain",
+                                        weight=3, range=self.gain_range,
+                                        callback=self.set_gain)
+        hbox.Add((5,0), 0)
+        vbox.Add(hbox, 0, wx.EXPAND)
+
+        try:
+            self.knob = powermate.powermate(self.frame)
+            self.rot = 0
+            powermate.EVT_POWERMATE_ROTATE (self.frame, self.on_rotate)
+            powermate.EVT_POWERMATE_BUTTON (self.frame, self.on_button)
+        except:
+            print "FYI: No Powermate or Contour Knob found"
+
+
+    def on_rotate (self, event):
+        self.rot += event.delta
+        if (self.state == "FREQ"):
+            if self.rot >= 3:
+                self.set_freq(self.freq + .1e6)
+                self.rot -= 3
+            elif self.rot <=-3:
+                self.set_freq(self.freq - .1e6)
+                self.rot += 3
+        else:
+            step = self.volume_range()[2]
+            if self.rot >= 3:
+                self.set_vol(self.vol + step)
+                self.rot -= 3
+            elif self.rot <=-3:
+                self.set_vol(self.vol - step)
+                self.rot += 3
+            
+    def on_button (self, event):
+        if event.value == 0:        # button up
+            return
+        self.rot = 0
+        if self.state == "FREQ":
+            self.state = "VOL"
+        else:
+            self.state = "FREQ"
+        self.update_status_bar ()
+        
+
+    def set_vol (self, vol):
+        g = self.volume_range()
+        self.vol = max(g[0], min(g[1], vol))
+        self.volume_control.set_k(10**(self.vol/10))
+        self.myform['volume'].set_value(self.vol)
+        self.update_status_bar ()
+                                        
+    def set_freq(self, target_freq):
+        """
+        Set the center frequency we're interested in.
+
+        @param target_freq: frequency in Hz
+        @rypte: bool
+
+        Tuning is a two step process.  First we ask the front-end to
+        tune as close to the desired frequency as it can.  Then we use
+        the result of that operation and our target_frequency to
+        determine the value for the digital down converter.
+        """
+        if self.use_usrp_for_tuning:
+          r = usrp.tune(self.u, 0, self.subdev, target_freq)
+          
+          if r:
+            self.freq = target_freq
+            self.myform['freq'].set_value(target_freq)         # update 
displayed value
+            self.myform['freq_slider'].set_value(target_freq)  # update 
displayed value
+            self.update_status_bar()
+            self._set_status_msg("OK", 0)
+            return True
+
+          self._set_status_msg("Failed", 0)
+          return False
+        else:
+          print "Not implemented yet"
+          self._set_status_msg("Failed", 0)
+          return False
+
+    def set_gain(self, gain):
+        self.myform['gain'].set_value(gain)     # update displayed value
+        if self.use_usrp_for_tuning:
+          self.subdev.set_gain(gain)
+        else:
+          print "Not implemented yet"
+
+    def update_status_bar (self):
+        msg = "Volume:%r  Setting:%s" % (self.vol, self.state)
+        self._set_status_msg(msg, 1)
+        self.src_fft.set_baseband_freq(self.freq)
+
+    def volume_range(self):
+        return (-20.0, 0.0, 0.5)
+        
+
+if __name__ == '__main__':
+    app = stdgui.stdapp (wfm_rx_graph, "CXADC WFM RX")
+    app.MainLoop ()


Property changes on: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv.py
___________________________________________________________________
Name: svn:executable
   + *

Added: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv_nogui.py
===================================================================
--- 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv_nogui.py
                             (rev 0)
+++ 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv_nogui.py
     2007-04-12 00:48:22 UTC (rev 4960)
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, gru, eng_notation, optfir
+from gnuradio import audio
+from gnuradio import usrp
+from gnuradio import cxadc
+from gnuradio import blks
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+import usrp_dbid
+import sys
+import math
+
+def pick_subdevice(u):
+    """
+    The user didn't specify a subdevice on the command line.
+    Try for one of these, in order: TV_RX, BASIC_RX, whatever is on side A.
+
+    @return a subdev_spec
+    """
+    return usrp.pick_subdev(u, (usrp_dbid.TV_RX,
+                                usrp_dbid.TV_RX_REV_2,
+                                usrp_dbid.BASIC_RX))
+
+
+class wfm_rx_graph (gr.flow_graph):
+
+    def __init__(self):
+        gr.flow_graph.__init__(self)
+
+        parser=OptionParser(option_class=eng_option)
+        parser.add_option("-R", "--rx-subdev-spec", type="subdev", 
default=None,
+                          help="select USRP Rx side A or B (default=A)")
+        parser.add_option("-f", "--freq", type="eng_float", default=100.1e6,
+                          help="set frequency to FREQ", metavar="FREQ")
+        parser.add_option("-g", "--gain", type="eng_float", default=None,
+                          help="set gain in dB (default is midpoint)")
+        parser.add_option("-O", "--audio-output", type="string", default="",
+                          help="pcm device name.  E.g., hw:0,0 or surround51 
or /dev/dsp")
+
+        (options, args) = parser.parse_args()
+        if len(args) != 0:
+            parser.print_help()
+            sys.exit(1)
+        
+        self.vol = .1
+        self.state = "FREQ"
+        self.freq = 0
+
+        # build graph
+        
+        self.u = usrp.source_c()                    # usrp is data source
+        expected_crystal_freq=28.63636e6
+        actual_crystal_freq=32.0e6 #I modified my board with a 32 MHz crystal, 
default this is a 28.63636e6 crystal or oscillator
+        default_resample_rate=27.0e6
+        resample_rate=default_resample_rate
+        adc_rate=   resample_rate *  actual_crystal_freq/expected_crystal_freq
+        #// public shared_ptr constructor
+        #cxadc_source_sptr
+        #cxadc_make_source (double sampling_freq = 27e6,//sampling_freq is 
ignored at the moment. TODO: implement sampling_freq 
+       #           int do_avg_frame=1,
+        #            double frame_avg_alpha=0.01,
+       #           const std::string dev = "/dev/cxadc") throw 
(std::runtime_error);
+        if True: #options.input_shorts:
+           do_remove_dc=1
+           self.cxadc=cxadc.source (adc_rate,do_remove_dc,0.1,"/dev/cxadc")
+           self.fsrc=gr.short_to_float()
+           #self.csrc= gr.interleaved_short_to_complex()
+           self.connect(self.cxadc,self.fsrc)  
+        else:
+           self.fsrc= cxadc.source_f (sampling_freq = 
adc_rate,do_avg_frame=True,frame_avg_alpha=0.01,dev = "/dev/cxadc")
+
+
+        #usrp_decim = 200
+        #self.u.set_decim_rate(usrp_decim)
+        usrp_rate = adc_rate #/ usrp_decim           # 320 kS/s
+        factor=1
+        chanfilt_decim = 100#100*factor
+        demod_rate = usrp_rate / chanfilt_decim
+        audio_decimation = 10#10/factor
+        audio_rate = demod_rate / (1*audio_decimation)  # 32 kHz
+        print "adc_rate",adc_rate
+        print "demod_rate",demod_rate
+        print "audio_rate",audio_rate
+
+
+        if options.rx_subdev_spec is None:
+            options.rx_subdev_spec = pick_subdevice(self.u)
+
+        self.u.set_mux(usrp.determine_rx_mux_value(self.u, 
options.rx_subdev_spec))
+        self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec)
+        print "Using RX d'board %s" % (self.subdev.side_and_name(),)
+
+
+        #chan_filt_coeffs = optfir.low_pass (1,           # gain
+        #                                    usrp_rate,   # sampling rate
+        #                                    80e3,        # passband cutoff
+        #                                    115e3,       # stopband cutoff
+        #                                    0.1,         # passband ripple
+        #                                    60)          # stopband 
attenuation
+        use_firdes=False
+        if use_firdes:
+          chan_filt_coeffs = gr.firdes.low_pass        (       1,
+                usrp_rate,
+               125.0e3, #100.0e3
+               50.0e3   #20.0e3
+         )     
+        else:
+          chan_filt_coeffs = optfir.low_pass (1,           # gain
+                                              usrp_rate,   # sampling rate
+                                              80e3,        # passband cutoff
+                                              1.5*115e3,       # stopband 
cutoff
+                                              10*0.1,         # passband ripple
+                                              60)          # stopband 
attenuation
+        #print len(chan_filt_coeffs)
+        #chan_filt = gr.fir_filter_ccf (chanfilt_decim, chan_filt_coeffs)
+        chan_filt = gr.freq_xlating_fir_filter_fcf (chanfilt_decim, 
chan_filt_coeffs, 5.75e6, adc_rate) #usrp_rate)
+
+        self.guts = blks.wfm_rcv (self, demod_rate, audio_decimation)
+
+        self.volume_control = gr.multiply_const_ff(self.vol)
+
+        # sound card as final sink
+        audio_sink = audio.sink(int(audio_rate),
+                                options.audio_output,
+                                False)  # ok_to_block
+        
+        # now wire it all together
+        self.connect (self.fsrc, chan_filt, self.guts, self.volume_control, 
audio_sink)
+
+
+        if options.gain is None:
+            # if no gain was specified, use the mid-point in dB
+            g = self.subdev.gain_range()
+            options.gain = float(g[0]+g[1])/2
+
+        if abs(options.freq) < 1e6:
+            options.freq *= 1e6
+
+        # set initial values
+
+        self.set_gain(options.gain)
+
+        if not(self.set_freq(options.freq)):
+            self._set_status_msg("Failed to set initial frequency")
+
+    def set_vol (self, vol):
+        self.vol = vol
+        self.volume_control.set_k(self.vol)
+        self.update_status_bar ()
+
+    def set_freq(self, target_freq):
+        """
+        Set the center frequency we're interested in.
+
+        @param target_freq: frequency in Hz
+        @rypte: bool
+
+        Tuning is a two step process.  First we ask the front-end to
+        tune as close to the desired frequency as it can.  Then we use
+        the result of that operation and our target_frequency to
+        determine the value for the digital down converter.
+        """
+        r = self.u.tune(0, self.subdev, target_freq)
+        
+        if r:
+            self.freq = target_freq
+            self.update_status_bar()
+            self._set_status_msg("OK", 0)
+            return True
+
+        self._set_status_msg("Failed", 0)
+        return False
+
+    def set_gain(self, gain):
+        self.subdev.set_gain(gain)
+
+    def update_status_bar (self):
+        msg = "Freq: %s  Volume:%f  Setting:%s" % (
+            eng_notation.num_to_str(self.freq), self.vol, self.state)
+        self._set_status_msg(msg, 1)
+        
+    def _set_status_msg(self, msg, which=0):
+        print msg
+
+    
+if __name__ == '__main__':
+    fg = wfm_rx_graph()
+    try:
+        fg.run()
+    except KeyboardInterrupt:
+        pass


Property changes on: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/cxadc/cxadc_wfm_rcv_nogui.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/usrp/usrp_fmtv_rcv.py
===================================================================
--- 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/usrp/usrp_fmtv_rcv.py
    2007-04-12 00:39:02 UTC (rev 4959)
+++ 
gnuradio/branches/developers/nldudok1/general-wip/gnuradio-examples/python/usrp/usrp_fmtv_rcv.py
    2007-04-12 00:48:22 UTC (rev 4960)
@@ -15,6 +15,11 @@
 except:
   print "FYI: gr-video-sdl is not installed"
   print "realtime SDL video output window will not be available"
+try:
+  from gnuradio import video_analog
+except:
+  print "FYI: gr-video-analog is not installed"
+  print "simple ntsc-sync will not be available"  
 from gnuradio import usrp
 from gnuradio import blks
 from gnuradio.eng_option import eng_option
@@ -217,6 +222,12 @@
           fm_demod_gain = 1.0 * 255.0 * usrp_rate/(2*math.pi*max_dev) #have to 
invert because is inverted again later on in the contrat block
           self.fm_demod = gr.quadrature_demod_cf (fm_demod_gain)
           self.connect (self.src, self.fm_demod, self.invert_and_scale, 
self.set_blacklevel,f2uc,self.dst) #self.invert_and_scale
+        elif process_type=='do_fm_ntscsync':
+          self.ntsc_detector = video_analog.field_detector_fub (usrp_rate)
+          max_dev = 4.0e6
+          fm_demod_gain = 1.0 * 255.0 * usrp_rate/(2*math.pi*max_dev) #have to 
invert because is inverted again later on in the contrat block
+          self.fm_demod = gr.quadrature_demod_cf (fm_demod_gain)
+          self.connect (self.src, self.fm_demod, self.ntsc_detector,self.dst)  
      
         elif process_type=='do_fm_sync_corr':
           frame_size=width*height #int(usrp_rate/25.0)
           tv_corr=gr.tv_correlator_ff(frame_size,nframes, search_window, 
video_alpha, corr_alpha,debug) #Note: this block is not yet in cvs
@@ -299,7 +310,7 @@
           hbox.Add((5,0), 0)
           myform['freq_slider'] = \
               form.quantized_slider_field(parent=self.panel, sizer=hbox, 
weight=3,
-                                        range=(800.0e6, 2600.0e6, 1.0e6),
+                                        range=(400.0e6, 2600.0e6, 1.0e6),
                                         callback=self.set_freq)
           hbox.Add((5,0), 0)
           vbox.Add(hbox, 0, wx.EXPAND)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]