⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usrp_nbfm_ptt.py

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 PY
📖 第 1 页 / 共 2 页
字号:
#!/usr/bin/env python## Copyright 2005,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.# import mathimport sysimport wxfrom optparse import OptionParserfrom gnuradio import gr, gru, eng_notationfrom gnuradio import usrpfrom gnuradio import audiofrom gnuradio import blks2from gnuradio.eng_option import eng_optionfrom gnuradio.wxgui import stdgui2, fftsink2, scopesink2, slider, formfrom usrpm import usrp_dbidfrom numpy import convolve, array#import os#print "pid =", os.getpid()#raw_input('Press Enter to continue: ')# ////////////////////////////////////////////////////////////////////////#                           Control Stuff# ////////////////////////////////////////////////////////////////////////class ptt_block(stdgui2.std_top_block):    def __init__(self, frame, panel, vbox, argv):        stdgui2.std_top_block.__init__ (self, frame, panel, vbox, argv)        self.frame = frame        self.space_bar_pressed = False                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")        parser.add_option("-T", "--tx-subdev-spec", type="subdev", default=None,                          help="select USRP Tx side A or B")        parser.add_option ("-f", "--freq", type="eng_float", default=442.1e6,                           help="set Tx and Rx frequency to FREQ", metavar="FREQ")        parser.add_option ("-g", "--rx-gain", type="eng_float", default=None,                           help="set rx gain [default=midpoint in dB]")        parser.add_option("-I", "--audio-input", type="string", default="",                          help="pcm input device name.  E.g., hw:0,0 or /dev/dsp")        parser.add_option("-O", "--audio-output", type="string", default="",                          help="pcm output device name.  E.g., hw:0,0 or /dev/dsp")        parser.add_option ("-N", "--no-gui", action="store_true", default=False)        (options, args) = parser.parse_args ()        if len(args) != 0:            parser.print_help()            sys.exit(1)        if options.freq < 1e6:            options.freq *= 1e6                    self.txpath = transmit_path(options.tx_subdev_spec, options.audio_input)        self.rxpath = receive_path(options.rx_subdev_spec, options.rx_gain, options.audio_output)	self.connect(self.txpath)	self.connect(self.rxpath)        self._build_gui(frame, panel, vbox, argv, options.no_gui)        self.set_transmit(False)        self.set_freq(options.freq)        self.set_rx_gain(self.rxpath.gain)               # update gui        self.set_volume(self.rxpath.volume)              # update gui        self.set_squelch(self.rxpath.threshold())        # update gui    def set_transmit(self, enabled):        self.txpath.set_enable(enabled)        self.rxpath.set_enable(not(enabled))        if enabled:            self.frame.SetStatusText ("Transmitter ON", 1)        else:            self.frame.SetStatusText ("Receiver ON", 1)    def set_rx_gain(self, gain):        self.myform['rx_gain'].set_value(gain)            # update displayed value        self.rxpath.set_gain(gain)            def set_tx_gain(self, gain):        self.txpath.set_gain(gain)    def set_squelch(self, threshold):        self.rxpath.set_squelch(threshold)        self.myform['squelch'].set_value(self.rxpath.threshold())    def set_volume (self, vol):        self.rxpath.set_volume(vol)        self.myform['volume'].set_value(self.rxpath.volume)        #self.update_status_bar ()    def set_freq(self, freq):        r1 = self.txpath.set_freq(freq)        r2 = self.rxpath.set_freq(freq)        #print "txpath.set_freq =", r1        #print "rxpath.set_freq =", r2        if r1 and r2:            self.myform['freq'].set_value(freq)     # update displayed value        return r1 and r2    def _build_gui(self, frame, panel, vbox, argv, no_gui):        def _form_set_freq(kv):            return self.set_freq(kv['freq'])                    self.panel = panel                # FIXME This REALLY needs to be replaced with a hand-crafted button        # that sends both button down and button up events        hbox = wx.BoxSizer(wx.HORIZONTAL)        hbox.Add((10,0), 1)        self.status_msg = wx.StaticText(panel, -1, "Press Space Bar to Transmit")        of = self.status_msg.GetFont()        self.status_msg.SetFont(wx.Font(15, of.GetFamily(), of.GetStyle(), of.GetWeight()))        hbox.Add(self.status_msg, 0, wx.ALIGN_CENTER)        hbox.Add((10,0), 1)        vbox.Add(hbox, 0, wx.EXPAND | wx.ALIGN_CENTER)        panel.Bind(wx.EVT_KEY_DOWN, self._on_key_down)        panel.Bind(wx.EVT_KEY_UP, self._on_key_up)        panel.Bind(wx.EVT_KILL_FOCUS, self._on_kill_focus)        panel.SetFocus()        if 1 and not(no_gui):            rx_fft = fftsink2.fft_sink_c(panel, title="Rx Input", fft_size=512,                                         sample_rate=self.rxpath.if_rate,                                         ref_level=80, y_per_div=20)            self.connect (self.rxpath.u, rx_fft)            vbox.Add (rx_fft.win, 1, wx.EXPAND)        if 1 and not(no_gui):            rx_fft = fftsink2.fft_sink_c(panel, title="Post s/w DDC",                                         fft_size=512, sample_rate=self.rxpath.quad_rate,                                         ref_level=80, y_per_div=20)            self.connect (self.rxpath.ddc, rx_fft)            vbox.Add (rx_fft.win, 1, wx.EXPAND)        if 0 and not(no_gui):            foo = scopesink2.scope_sink_f(panel, title="Squelch",                                    	  sample_rate=32000)            self.connect (self.rxpath.fmrx.div, (foo,0))            self.connect (self.rxpath.fmrx.gate, (foo,1))            self.connect (self.rxpath.fmrx.squelch_lpf, (foo,2))            vbox.Add (foo.win, 1, wx.EXPAND)        if 0 and not(no_gui):            tx_fft = fftsink2.fft_sink_c(panel, title="Tx Output",                                         fft_size=512, sample_rate=self.txpath.usrp_rate)            self.connect (self.txpath.amp, tx_fft)            vbox.Add (tx_fft.win, 1, wx.EXPAND)        # add control area at the bottom        self.myform = myform = form.form()        # first row        hbox = wx.BoxSizer(wx.HORIZONTAL)        hbox.Add((5,0), 0, 0)        myform['freq'] = form.float_field(            parent=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, 0)        vbox.Add(hbox, 0, wx.EXPAND)        # second row        hbox = wx.BoxSizer(wx.HORIZONTAL)        myform['volume'] = \            form.quantized_slider_field(parent=self.panel, sizer=hbox, label="Volume",                                        weight=3, range=self.rxpath.volume_range(),                                        callback=self.set_volume)        hbox.Add((5,0), 0)        myform['squelch'] = \            form.quantized_slider_field(parent=self.panel, sizer=hbox, label="Squelch",                                        weight=3, range=self.rxpath.squelch_range(),                                        callback=self.set_squelch)        hbox.Add((5,0), 0)        myform['rx_gain'] = \            form.quantized_slider_field(parent=self.panel, sizer=hbox, label="Rx Gain",                                        weight=3, range=self.rxpath.subdev.gain_range(),                                        callback=self.set_rx_gain)        hbox.Add((5,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)                #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.static_float_field(        #    parent=panel, sizer=hbox, label="Decim")        #hbox.Add((5,0), 1)        #myform['fs@usb'] = form.static_float_field(        #    parent=panel, sizer=hbox, label="Fs@USB")        #hbox.Add((5,0), 1)        #myform['dbname'] = form.static_text_field(        #    parent=panel, sizer=hbox)        hbox.Add((5,0), 0)        vbox.Add(hbox, 0, wx.EXPAND)    def _set_status_msg(self, msg, which=0):        self.frame.GetStatusBar().SetStatusText(msg, which)    def _on_key_down(self, evt):

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -