📄 usrp_nbfm_ptt.py
字号:
# 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 + -