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

📄 usrp_nbfm_ptt.py

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 PY
📖 第 1 页 / 共 2 页
字号:
        # print "key_down:", evt.m_keyCode        if evt.m_keyCode == wx.WXK_SPACE and not(self.space_bar_pressed):            self.space_bar_pressed = True            self.set_transmit(True)    def _on_key_up(self, evt):        # print "key_up", evt.m_keyCode        if evt.m_keyCode == wx.WXK_SPACE:            self.space_bar_pressed = False            self.set_transmit(False)    def _on_kill_focus(self, evt):        # if we lose the keyboard focus, turn off the transmitter        self.space_bar_pressed = False        self.set_transmit(False)        # ////////////////////////////////////////////////////////////////////////#                           Transmit Path# ////////////////////////////////////////////////////////////////////////class transmit_path(gr.hier_block2):    def __init__(self, subdev_spec, audio_input):	gr.hier_block2.__init__(self, "transmit_path",				gr.io_signature(0, 0, 0), # Input signature				gr.io_signature(0, 0, 0)) # Output signature				        self.u = usrp.sink_c ()        dac_rate = self.u.dac_rate();        self.if_rate = 320e3                               # 320 kS/s        self.usrp_interp = int(dac_rate // self.if_rate)        self.u.set_interp_rate(self.usrp_interp)        self.sw_interp = 10        self.audio_rate = self.if_rate // self.sw_interp   #  32 kS/s        self.audio_gain = 10        self.normal_gain = 32000        self.audio = audio.source(int(self.audio_rate), audio_input)        self.audio_amp = gr.multiply_const_ff(self.audio_gain)        lpf = gr.firdes.low_pass (1,                # gain                                  self.audio_rate,            # sampling rate                                  3800,               # low pass cutoff freq                                  300,                # width of trans. band                                  gr.firdes.WIN_HANN) # filter type         hpf = gr.firdes.high_pass (1,                # gain                                  self.audio_rate,            # sampling rate                                  325,               # low pass cutoff freq                                  50,                # width of trans. band                                  gr.firdes.WIN_HANN) # filter type         audio_taps = convolve(array(lpf),array(hpf))        self.audio_filt = gr.fir_filter_fff(1,audio_taps)        self.pl = blks2.ctcss_gen_f(self.audio_rate,123.0)        self.add_pl = gr.add_ff()        self.connect(self.pl,(self.add_pl,1))        self.fmtx = blks2.nbfm_tx(self.audio_rate, self.if_rate)        self.amp = gr.multiply_const_cc (self.normal_gain)        # determine the daughterboard subdevice we're using        if subdev_spec is None:            subdev_spec = usrp.pick_tx_subdevice(self.u)        self.u.set_mux(usrp.determine_tx_mux_value(self.u, subdev_spec))        self.subdev = usrp.selected_subdev(self.u, subdev_spec)        print "TX using", self.subdev.name()        self.connect(self.audio, self.audio_amp, self.audio_filt,                     (self.add_pl,0), self.fmtx, self.amp, self.u)        self.set_gain(self.subdev.gain_range()[1])  # set max Tx gain    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 up converter.  Finally, we feed        any residual_freq to the s/w freq translater.        """        r = self.u.tune(self.subdev._which, self.subdev, target_freq)        if r:            # Use residual_freq in s/w freq translator            return True        return False    def set_gain(self, gain):        self.gain = gain        self.subdev.set_gain(gain)    def set_enable(self, enable):        self.subdev.set_enable(enable)            # set H/W Tx enable        if enable:            self.amp.set_k (self.normal_gain)        else:            self.amp.set_k (0)# ////////////////////////////////////////////////////////////////////////#                           Receive Path# ////////////////////////////////////////////////////////////////////////class receive_path(gr.hier_block2):    def __init__(self, subdev_spec, gain, audio_output):	gr.hier_block2.__init__(self, "receive_path",				gr.io_signature(0, 0, 0), # Input signature				gr.io_signature(0, 0, 0)) # Output signature        self.u = usrp.source_c ()        adc_rate = self.u.adc_rate()        self.if_rate = 256e3                         # 256 kS/s        usrp_decim = int(adc_rate // self.if_rate)        if_decim = 4        self.u.set_decim_rate(usrp_decim)        self.quad_rate = self.if_rate // if_decim    #  64 kS/s        audio_decim = 2        audio_rate = self.quad_rate // audio_decim   #  32 kS/s        if subdev_spec is None:            subdev_spec = usrp.pick_rx_subdevice(self.u)        self.subdev = usrp.selected_subdev(self.u, subdev_spec)        print "RX using", self.subdev.name()        self.u.set_mux(usrp.determine_rx_mux_value(self.u, subdev_spec))        # Create filter to get actual channel we want        chan_coeffs = gr.firdes.low_pass (1.0,                # gain                                          self.if_rate,       # sampling rate                                          13e3,               # low pass cutoff freq                                          4e3,                # width of trans. band                                          gr.firdes.WIN_HANN) # filter type         print "len(rx_chan_coeffs) =", len(chan_coeffs)        # Decimating Channel filter with frequency translation        # complex in and out, float taps        self.ddc = gr.freq_xlating_fir_filter_ccf(if_decim,       # decimation rate                                                  chan_coeffs,    # taps                                                  0,              # frequency translation amount                                                  self.if_rate)   # input sample rate        # instantiate the guts of the single channel receiver        self.fmrx = blks2.nbfm_rx(audio_rate, self.quad_rate)        # standard squelch block        self.squelch = blks2.standard_squelch(audio_rate)        # audio gain / mute block        self._audio_gain = gr.multiply_const_ff(1.0)        # sound card as final sink        audio_sink = audio.sink (int(audio_rate), audio_output)                # now wire it all together        self.connect (self.u, self.ddc, self.fmrx, self.squelch, self._audio_gain, audio_sink)        if gain is None:            # if no gain was specified, use the mid-point in dB            g = self.subdev.gain_range()            gain = float(g[0]+g[1])/2        self.enabled = True        self.set_gain(gain)        v = self.volume_range()        self.set_volume((v[0]+v[1])/2)        s = self.squelch_range()        self.set_squelch((s[0]+s[1])/2)                    def volume_range(self):        return (-20.0, 0.0, 0.5)    def set_volume (self, vol):        g = self.volume_range()        self.volume = max(g[0], min(g[1], vol))        self._update_audio_gain()    def set_enable(self, enable):        self.enabled = enable        self._update_audio_gain()    def _update_audio_gain(self):        if self.enabled:            self._audio_gain.set_k(10**(self.volume/10))        else:            self._audio_gain.set_k(0)    def squelch_range(self):        return self.squelch.squelch_range()        def set_squelch(self, threshold):        print "SQL =", threshold        self.squelch.set_threshold(threshold)    def threshold(self):        return self.squelch.threshold()        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 in the        FPGA.  Finally, we feed any residual_freq to the s/w freq        translator.        """        r = self.u.tune(0, self.subdev, target_freq)        if r:            # Use residual_freq in s/w freq translater            # print "residual_freq =", r.residual_freq            self.ddc.set_center_freq(-r.residual_freq)            return True        return False    def set_gain(self, gain):        self.gain = gain        self.subdev.set_gain(gain)# ////////////////////////////////////////////////////////////////////////#                                Main# ////////////////////////////////////////////////////////////////////////def main():    app = stdgui2.stdapp(ptt_block, "NBFM Push to Talk")    app.MainLoop()if __name__ == '__main__':    main()

⌨️ 快捷键说明

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