def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Lab 3 1") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 48000 ################################################## # Blocks ################################################## self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.Add(self.wxgui_waterfallsink2_0.win) self.audio_source_0 = audio.source(samp_rate, '', True) ################################################## # Connections ################################################## self.connect((self.audio_source_0, 0), (self.wxgui_waterfallsink2_0, 0))
def __init__(self, frame, panel, vbox, argv): stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv) self.frame = frame self.panel = panel parser = OptionParser(option_class=eng_option) 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( "-I", "--audio-input", type="string", default="", help="pcm input device name. E.g., hw:0,0 or /dev/dsp") parser.add_option("-r", "--sample-rate", type="eng_float", default=48000, help="set sample rate to RATE (48000)") (options, args) = parser.parse_args() sample_rate = int(options.sample_rate) if len(args) != 0: parser.print_help() sys.exit(1) self.show_debug_info = True # build the graph if options.waterfall: self.scope = \ waterfallsink2.waterfall_sink_f (panel, fft_size=1024, sample_rate=sample_rate) elif options.oscilloscope: self.scope = scopesink2.scope_sink_f(panel, sample_rate=sample_rate) else: self.scope = fftsink2.fft_sink_f(panel, fft_size=1024, sample_rate=sample_rate, fft_rate=30, ref_scale=1.0, ref_level=0, y_divs=12) self.src = audio.source(sample_rate, options.audio_input) self.connect(self.src, self.scope) self._build_gui(vbox)
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") ################################################## # Variables ################################################## self.samp_rate = samp_rate = 100 ################################################## # Blocks ################################################## self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=140, ref_level=-50, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.Add(self.wxgui_waterfallsink2_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_f( self.GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-50, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="FFT Plot", peak_hold=True, ) self.Add(self.wxgui_fftsink2_0.win) self.mseed_seedlink_f_0 = mseed.seedlink_f("10.0.0.15", 18000, "FR_ILLK:HHZ") self.blocks_tag_debug_0 = blocks.tag_debug(gr.sizeof_float*1, "", ""); self.blocks_tag_debug_0.set_display(True) ################################################## # Connections ################################################## self.connect((self.mseed_seedlink_f_0, 0), (self.blocks_tag_debug_0, 0)) self.connect((self.mseed_seedlink_f_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.mseed_seedlink_f_0, 0), (self.wxgui_waterfallsink2_0, 0))
def __init__(self, frame, panel, vbox, argv): stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv) self.frame = frame self.panel = panel parser = OptionParser(option_class=eng_option) 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("-I", "--audio-input", type="string", default="", help="pcm input device name. E.g., hw:0,0 or /dev/dsp") parser.add_option("-r", "--sample-rate", type="eng_float", default=48000, help="set sample rate to RATE (48000)") (options, args) = parser.parse_args() sample_rate = int(options.sample_rate) if len(args) != 0: parser.print_help() sys.exit(1) self.show_debug_info = True # build the graph if options.waterfall: self.scope = \ waterfallsink2.waterfall_sink_f (panel, fft_size=1024, sample_rate=sample_rate) elif options.oscilloscope: self.scope = scopesink2.scope_sink_f(panel, sample_rate=sample_rate) else: self.scope = fftsink2.fft_sink_f (panel, fft_size=1024, sample_rate=sample_rate, fft_rate=30, ref_scale=1.0, ref_level=0, y_divs=12) self.src = audio.source (sample_rate, options.audio_input) self.connect(self.src, self.scope) self._build_gui(vbox)
def __init__(self, parent): # ------------------------------------------------------------------------ """ Initialize, create and place wrapped Gnuradio object onto the underlying wx.Panel. """ super(WaterfallControl, self).__init__(parent) self.sink = waterfallsink2.waterfall_sink_f( self, baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.sink.win, proportion=1, flag=wx.EXPAND) self.SetSizer(sizer)
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 44100 ################################################## # Blocks ################################################## self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate/4, fft_size=2048, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.Add(self.wxgui_waterfallsink2_0.win) self.blocks_wavfile_source_0 = blocks.wavfile_source('/home/sdr/Dropbox/Work/Documents/2020/FYS-2006/book/code/signal_processing/010_audio_compression/compressed_signal.wav', True) self.blocks_integrate_xx_0 = blocks.integrate_ff(4, 1) self.audio_sink_0 = audio.sink(samp_rate, '', True) ################################################## # Connections ################################################## self.connect((self.blocks_integrate_xx_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_wavfile_source_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_integrate_xx_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.symbol_rate = symbol_rate = 200 self.samp_rate = samp_rate = 8000 self.samp_per_sym = samp_per_sym = samp_rate / symbol_rate self.fsk_deviation_hz = fsk_deviation_hz = symbol_rate * 0.5 ################################################## # Blocks ################################################## self.wxgui_waterfallsink2_0_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.Add(self.wxgui_waterfallsink2_0_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_f( self.GetWin(), title="Scope Plot", sample_rate=samp_rate, v_scale=0, v_offset=0, t_scale=0.02, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.Add(self.wxgui_scopesink2_1.win) self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff( samp_per_sym * (1 + 0.0), 0.25 * 0.175 * 0.175, 0.5, 0.175, 0.005) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_pack_k_bits_bb_0 = blocks.pack_k_bits_bb(8) self.blocks_file_sink_0_0 = blocks.file_sink(gr.sizeof_char * 1, "/tmp/msk-bin", False) self.blocks_file_sink_0_0.set_unbuffered(True) self.blocks_complex_to_float_0 = blocks.complex_to_float(1) self.blocks_add_const_vxx_0 = blocks.add_const_vff((-79, )) self.band_pass_filter_0 = filter.fir_filter_fcc( 1, firdes.complex_band_pass(1, samp_rate, 750, 1250, 10, firdes.WIN_HAMMING, 6.76)) self.audio_source_0 = audio.source(samp_rate, "dsp0", True) self.analog_quadrature_demod_cf_0 = analog.quadrature_demod_cf( samp_rate / (2 * math.pi * fsk_deviation_hz / 8.0)) ################################################## # Connections ################################################## self.connect((self.audio_source_0, 0), (self.band_pass_filter_0, 0)) self.connect((self.band_pass_filter_0, 0), (self.analog_quadrature_demod_cf_0, 0)) self.connect((self.analog_quadrature_demod_cf_0, 0), (self.digital_clock_recovery_mm_xx_0, 0)) self.connect((self.analog_quadrature_demod_cf_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.blocks_add_const_vxx_0, 0)) self.connect((self.blocks_add_const_vxx_0, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.blocks_pack_k_bits_bb_0, 0)) self.connect((self.blocks_pack_k_bits_bb_0, 0), (self.blocks_file_sink_0_0, 0)) self.connect((self.band_pass_filter_0, 0), (self.blocks_complex_to_float_0, 0)) self.connect((self.blocks_complex_to_float_0, 0), (self.wxgui_waterfallsink2_0_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="SSB step1") ################################################## # Variables ################################################## self.samp_rate = samp_rate = 32000 ################################################## # Blocks ################################################## self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_f( self.GetWin(), title='Scope Plot', sample_rate=samp_rate, v_scale=0, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.Add(self.wxgui_scopesink2_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_f( self.GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='FFT Plot', peak_hold=False, ) self.Add(self.wxgui_fftsink2_0.win) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float * 1, samp_rate, True) self.analog_sig_source_x_0 = analog.sig_source_f( samp_rate, analog.GR_COS_WAVE, 1000, 1, 0) ################################################## # Connections ################################################## self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.wxgui_waterfallsink2_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 1000000 self.freq_slider_0 = freq_slider_0 = 93.6 self.radio_freq = radio_freq = freq_slider_0 * 1e6 self.offset_freq = offset_freq = -100000 self.filter_taps2 = filter_taps2 = [1] self.filter_taps1 = filter_taps1 = firdes.low_pass( 1, samp_rate, 100000, 1000, firdes.WIN_HAMMING) ################################################## # Blocks ################################################## self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.Add(self.wxgui_waterfallsink2_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_f( self.GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="FFT Plot", peak_hold=True, ) self.Add(self.wxgui_fftsink2_0.win) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=6, decimation=25, taps=None, fractional_bw=None, ) self.low_pass_filter_0 = filter.fir_filter_fff( 1, firdes.low_pass(1, 200000, 16000, 2000, firdes.WIN_HAMMING, 6.76)) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc( 5, (filter_taps1), offset_freq, samp_rate) _freq_slider_0_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_slider_0_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_slider_0_sizer, value=self.freq_slider_0, callback=self.set_freq_slider_0, label='freq_slider_0', converter=forms.float_converter(), proportion=0, ) self._freq_slider_0_slider = forms.slider( parent=self.GetWin(), sizer=_freq_slider_0_sizer, value=self.freq_slider_0, callback=self.set_freq_slider_0, minimum=88, maximum=108, num_steps=200, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Add(_freq_slider_0_sizer) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex * 1, samp_rate) self.blocks_file_source_0 = blocks.file_source( gr.sizeof_gr_complex * 1, "Documents/gnuradio/cap.cpx", True) self.blks2_valve_0 = grc_blks2.valve(item_size=gr.sizeof_float * 1, open=bool(0)) self.audio_sink_0 = audio.sink(48000, "", True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=200000, audio_decimation=1, ) ################################################## # Connections ################################################## self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) self.connect((self.blocks_file_source_0, 0), (self.blocks_throttle_0, 0)) self.connect((self.blks2_valve_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blks2_valve_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.blks2_valve_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="fmReceiver2") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rep = samp_rep = 44.1e3 self.samp_rate = samp_rate = 2e6 self.freq = freq = 99.3e6 ################################################## # Blocks ################################################## _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label="freq", converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=87e6, maximum=108e6, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Add(_freq_sizer) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.Add(self.wxgui_waterfallsink2_0.win) self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" ) self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(freq, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) self.rtlsdr_source_0.set_dc_offset_mode(0, 0) self.rtlsdr_source_0.set_iq_balance_mode(0, 0) self.rtlsdr_source_0.set_gain_mode(0, 0) self.rtlsdr_source_0.set_gain(10, 0) self.rtlsdr_source_0.set_if_gain(20, 0) self.rtlsdr_source_0.set_bb_gain(20, 0) self.rtlsdr_source_0.set_antenna("", 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass( 1, samp_rate, 75e3, 150e3, firdes.WIN_HAMMING, 6.76)) self.fractional_interpolator_xx_1 = filter.fractional_interpolator_ff(0, 4) self.fractional_interpolator_xx_0 = filter.fractional_interpolator_cc(0, 3.968) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((4, )) self.audio_sink_0 = audio.sink(44100, "", True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=5e5, audio_decimation=4, ) self.analog_fm_deemph_0 = analog.fm_deemph(fs=samp_rep, tau=50e-6) ################################################## # Connections ################################################## self.connect((self.rtlsdr_source_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.fractional_interpolator_xx_0, 0)) self.connect((self.fractional_interpolator_xx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.fractional_interpolator_xx_1, 0)) self.connect((self.fractional_interpolator_xx_1, 0), (self.analog_fm_deemph_0, 0)) self.connect((self.analog_fm_deemph_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_waterfallsink2_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Psk31 Rx") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.center_freq = center_freq = 441000000 self.samp_rate = samp_rate = 960000 self.psk_offset = psk_offset = 1000 self.psk_center = psk_center = center_freq + 141000 self.int_rate = int_rate = 48000 self.gain = gain = 30 self.corr = corr = 0 self.audio_rate = audio_rate = 8000 ################################################## # Message Queues ################################################## blocks_message_sink_0_msgq_out = wxgui_termsink_0_msgq_in = gr.msg_queue(2) ################################################## # Blocks ################################################## _psk_offset_sizer = wx.BoxSizer(wx.VERTICAL) self._psk_offset_text_box = forms.text_box( parent=self.GetWin(), sizer=_psk_offset_sizer, value=self.psk_offset, callback=self.set_psk_offset, label="PSK offset", converter=forms.float_converter(), proportion=0, ) self._psk_offset_slider = forms.slider( parent=self.GetWin(), sizer=_psk_offset_sizer, value=self.psk_offset, callback=self.set_psk_offset, minimum=0, maximum=3000, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_psk_offset_sizer, 1, 0, 1, 2) _psk_center_sizer = wx.BoxSizer(wx.VERTICAL) self._psk_center_text_box = forms.text_box( parent=self.GetWin(), sizer=_psk_center_sizer, value=self.psk_center, callback=self.set_psk_center, label="Tuning", converter=forms.float_converter(), proportion=0, ) self._psk_center_slider = forms.slider( parent=self.GetWin(), sizer=_psk_center_sizer, value=self.psk_center, callback=self.set_psk_center, minimum=center_freq + 110000, maximum=center_freq + 150000, num_steps=40, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_psk_center_sizer, 0, 0, 1, 2) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "960 kHz") self.nb.AddPage(grc_wxgui.Panel(self.nb), "48 kHz") self.nb.AddPage(grc_wxgui.Panel(self.nb), "4 kHz") self.nb.AddPage(grc_wxgui.Panel(self.nb), "I/Q scope") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Constellation") self.GridAdd(self.nb, 3, 0, 1, 2) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label='gain', converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 2, 0, 1, 1) _corr_sizer = wx.BoxSizer(wx.VERTICAL) self._corr_text_box = forms.text_box( parent=self.GetWin(), sizer=_corr_sizer, value=self.corr, callback=self.set_corr, label='corr', converter=forms.float_converter(), proportion=0, ) self._corr_slider = forms.slider( parent=self.GetWin(), sizer=_corr_sizer, value=self.corr, callback=self.set_corr, minimum=-150, maximum=150, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_corr_sizer, 2, 1, 1, 1) self.wxgui_waterfallsink2_2 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, dynamic_range=30, ref_level=-40, ref_scale=2.0, sample_rate=audio_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", win=window.blackmanharris, size=((800,400)), ) self.nb.GetPage(2).Add(self.wxgui_waterfallsink2_2.win) def wxgui_waterfallsink2_2_callback(x, y): self.set_psk_offset(x) self.wxgui_waterfallsink2_2.set_callback(wxgui_waterfallsink2_2_callback) self.wxgui_waterfallsink2_1 = waterfallsink2.waterfall_sink_c( self.nb.GetPage(1).GetWin(), baseband_freq=psk_center, dynamic_range=30, ref_level=-30, ref_scale=2.0, sample_rate=int_rate, fft_size=2048, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", size=((800,400)), ) self.nb.GetPage(1).Add(self.wxgui_waterfallsink2_1.win) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=center_freq, dynamic_range=30, ref_level=-20, ref_scale=2.0, sample_rate=samp_rate, fft_size=2048, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", size=((800,400)), ) self.nb.GetPage(0).Add(self.wxgui_waterfallsink2_0.win) def wxgui_waterfallsink2_0_callback(x, y): self.set_psk_center(x) self.wxgui_waterfallsink2_0.set_callback(wxgui_waterfallsink2_0_callback) self.wxgui_termsink_0 = termsink.termsink( parent=self.GetWin(), size=(500,100), msgq=wxgui_termsink_0_msgq_in, ) self.Add(self.wxgui_termsink_0) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(4).GetWin(), title="Scope Plot", sample_rate=31.25, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.nb.GetPage(4).Add(self.wxgui_scopesink2_1.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( self.nb.GetPage(3).GetWin(), title="Scope Plot", sample_rate=500, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.nb.GetPage(3).Add(self.wxgui_scopesink2_0.win) self.wxgui_numbersink2_0 = numbersink2.number_sink_f( self.GetWin(), unit="Hz", minval=-500 / math.pi, maxval=500 / math.pi, factor=500 / math.pi, decimal_places=1, ref_level=0, sample_rate=500, number_rate=15, average=False, avg_alpha=None, label="Carrier tracking offset", peak_hold=False, show_gauge=True, ) self.Add(self.wxgui_numbersink2_0.win) self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" ) self.osmosdr_source_0.set_sample_rate(samp_rate) self.osmosdr_source_0.set_center_freq(center_freq, 0) self.osmosdr_source_0.set_freq_corr(corr, 0) self.osmosdr_source_0.set_dc_offset_mode(0, 0) self.osmosdr_source_0.set_iq_balance_mode(0, 0) self.osmosdr_source_0.set_gain_mode(0, 0) self.osmosdr_source_0.set_gain(gain, 0) self.osmosdr_source_0.set_if_gain(20, 0) self.osmosdr_source_0.set_bb_gain(20, 0) self.osmosdr_source_0.set_antenna("", 0) self.osmosdr_source_0.set_bandwidth(0, 0) self.ham_varicode_rx_0 = ham.varicode_rx() self.freq_xlating_fir_filter_xxx_1 = filter.freq_xlating_fir_filter_ccc(16, (firdes.low_pass(10, audio_rate, 120, 40, firdes.WIN_HAMMING, 6.76)), psk_offset, audio_rate) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(samp_rate / int_rate, (firdes.low_pass(1, samp_rate, 12000, 12000, firdes.WIN_HAMMING, 6.76)), round(psk_center - center_freq,-3), samp_rate) self.digital_diff_phasor_cc_0 = digital.diff_phasor_cc() self.digital_costas_loop_cc_0 = digital.costas_loop_cc(5 * math.pi /100.0, 2) self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_cc(16, 0.25*0.175*0.175, 0.5, 0.175, 0.005) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_message_sink_0 = blocks.message_sink(gr.sizeof_char*1, blocks_message_sink_0_msgq_out, True) self.blocks_complex_to_real_1 = blocks.complex_to_real(1) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.band_pass_filter_0 = filter.fir_filter_ccc(int_rate / audio_rate, firdes.complex_band_pass( 1, int_rate, 200, 2800, 200, firdes.WIN_HAMMING, 6.76)) self.audio_sink_0 = audio.sink(audio_rate, "plughw:0,0", True) self.analog_agc_xx_0 = analog.agc_cc(1e-3, 0.1, 1.0) self.analog_agc_xx_0.set_max_gain(65536) ################################################## # Connections ################################################## self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_waterfallsink2_1, 0)) self.connect((self.osmosdr_source_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.band_pass_filter_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.wxgui_waterfallsink2_2, 0)) self.connect((self.digital_costas_loop_cc_0, 1), (self.wxgui_numbersink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.digital_costas_loop_cc_0, 0)) self.connect((self.digital_costas_loop_cc_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.digital_diff_phasor_cc_0, 0)) self.connect((self.digital_costas_loop_cc_0, 0), (self.digital_clock_recovery_mm_xx_0, 0)) self.connect((self.ham_varicode_rx_0, 0), (self.blocks_message_sink_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.ham_varicode_rx_0, 0)) self.connect((self.blocks_complex_to_real_1, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.digital_diff_phasor_cc_0, 0), (self.blocks_complex_to_real_1, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.audio_sink_0, 0)) self.connect((self.band_pass_filter_0, 0), (self.analog_agc_xx_0, 0)) self.connect((self.analog_agc_xx_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.analog_agc_xx_0, 0), (self.freq_xlating_fir_filter_xxx_1, 0)) self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.wxgui_scopesink2_1, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") _icon_path = "C:\Program Files\GNURadio-3.7\share\icons\hicolor\scalable/apps\gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.volume = volume = 1 self.shift = shift = 200000 self.samp_rate = samp_rate = 2e6 self.gain = gain = 48 self.freq = freq = 98.5e6 self.cutoff = cutoff = 75000 ################################################## # Blocks ################################################## self.Notebook = self.Notebook = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.Notebook.AddPage(grc_wxgui.Panel(self.Notebook), "Tuner") self.Notebook.AddPage(grc_wxgui.Panel(self.Notebook), "Audio") self.Add(self.Notebook) _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.Notebook.GetPage(1).GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label='volume', converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.Notebook.GetPage(1).GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=0, maximum=2, num_steps=10, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Notebook.GetPage(1).Add(_volume_sizer) _shift_sizer = wx.BoxSizer(wx.VERTICAL) self._shift_text_box = forms.text_box( parent=self.Notebook.GetPage(0).GetWin(), sizer=_shift_sizer, value=self.shift, callback=self.set_shift, label='shift', converter=forms.float_converter(), proportion=0, ) self._shift_slider = forms.slider( parent=self.Notebook.GetPage(0).GetWin(), sizer=_shift_sizer, value=self.shift, callback=self.set_shift, minimum=0, maximum=400000, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Notebook.GetPage(0).Add(_shift_sizer) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.Notebook.GetPage(0).GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label='gain', converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.Notebook.GetPage(0).GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=50, num_steps=50, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Notebook.GetPage(0).Add(_gain_sizer) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.Notebook.GetPage(0).GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label='freq', converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.Notebook.GetPage(0).GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=87e6, maximum=108e6, num_steps=210, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Notebook.GetPage(0).Add(_freq_sizer) _cutoff_sizer = wx.BoxSizer(wx.VERTICAL) self._cutoff_text_box = forms.text_box( parent=self.Notebook.GetPage(0).GetWin(), sizer=_cutoff_sizer, value=self.cutoff, callback=self.set_cutoff, label='cutoff', converter=forms.float_converter(), proportion=0, ) self._cutoff_slider = forms.slider( parent=self.Notebook.GetPage(0).GetWin(), sizer=_cutoff_sizer, value=self.cutoff, callback=self.set_cutoff, minimum=0, maximum=2e5, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Notebook.GetPage(0).Add(_cutoff_sizer) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.Notebook.GetPage(1).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.Notebook.GetPage(1).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_fftsink2_1 = fftsink2.fft_sink_c( self.Notebook.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=150, average=False, avg_alpha=None, title='FFT Plot', peak_hold=False, ) self.Notebook.GetPage(0).Add(self.wxgui_fftsink2_1.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_f( self.Notebook.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=20, average=False, avg_alpha=None, title='FFT Plot', peak_hold=False, ) self.Notebook.GetPage(1).Add(self.wxgui_fftsink2_0.win) self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + '' ) self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(freq+shift, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) self.rtlsdr_source_0.set_dc_offset_mode(0, 0) self.rtlsdr_source_0.set_iq_balance_mode(0, 0) self.rtlsdr_source_0.set_gain_mode(True, 0) self.rtlsdr_source_0.set_gain(gain, 0) self.rtlsdr_source_0.set_if_gain(20, 0) self.rtlsdr_source_0.set_bb_gain(20, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.rational_resampler_xxx_1 = filter.rational_resampler_ccc( interpolation=1, decimation=int(samp_rate/500e3), taps=None, fractional_bw=None, ) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=48, decimation=50, taps=None, fractional_bw=None, ) self.low_pass_filter_0_0 = filter.fir_filter_ccf(1, firdes.low_pass( 1, samp_rate, cutoff, cutoff*2, firdes.WIN_HAMMING, 6.76)) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(1, (1, ), -shift, samp_rate) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((volume, )) self.audio_sink_0 = audio.sink(48000, '', True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=500000, audio_decimation=10, ) ################################################## # Connections ################################################## self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.low_pass_filter_0_0, 0)) self.connect((self.low_pass_filter_0_0, 0), (self.rational_resampler_xxx_1, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.rational_resampler_xxx_1, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.rational_resampler_xxx_1, 0), (self.wxgui_fftsink2_1, 0)) self.connect((self.rtlsdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__( self, title="Stereo FM receiver and RDS Decoder") _icon_path = "/usr/share/icons/hicolor/24x24/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 1000000 self.bb_decim = bb_decim = 4 self.freq_offset = freq_offset = 250000 self.freq = freq = 97e6 self.baseband_rate = baseband_rate = samp_rate / bb_decim self.audio_decim = audio_decim = 5 self.xlate_bandwidth = xlate_bandwidth = 100000 self.volume = volume = 0 self.gain = gain = 20 self.freq_tune = freq_tune = freq - freq_offset self.audio_rate = audio_rate = 48000 self.audio_decim_rate = audio_decim_rate = baseband_rate / audio_decim ################################################## # Blocks ################################################## _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label='Volume', converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=-20, maximum=10, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_volume_sizer, 0, 1, 1, 1) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "BB") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Demod") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L+R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Pilot") self.nb.AddPage(grc_wxgui.Panel(self.nb), "DSBSC") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L-R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS constellation") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Waterfall") self.GridAdd(self.nb, 2, 0, 1, 2) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label='RF Gain', converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 0, 0, 1, 1) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label='Freq', converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=88.1e6, maximum=107.9e6, num_steps=99, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_freq_sizer, 1, 0, 1, 2) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(8).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.nb.GetPage(8).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(7).GetWin(), title='Scope Plot', sample_rate=2375, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.nb.GetPage(7).Add(self.wxgui_scopesink2_1.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_f( self.nb.GetPage(3).GetWin(), title='Pilot', sample_rate=baseband_rate, v_scale=0, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.nb.GetPage(3).Add(self.wxgui_scopesink2_0.win) self.wxgui_fftsink2_0_0_0_1_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(5).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=audio_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='RDS', peak_hold=False, ) self.nb.GetPage(5).Add(self.wxgui_fftsink2_0_0_0_1_0_1.win) self.wxgui_fftsink2_0_0_0_1_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(6).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-50, ref_scale=2.0, sample_rate=baseband_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L-R', peak_hold=False, ) self.nb.GetPage(6).Add(self.wxgui_fftsink2_0_0_0_1_0_0.win) self.wxgui_fftsink2_0_0_0_1 = fftsink2.fft_sink_f( self.nb.GetPage(4).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='DSBSC Sub-carrier', peak_hold=False, ) self.nb.GetPage(4).Add(self.wxgui_fftsink2_0_0_0_1.win) self.wxgui_fftsink2_0_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=audio_decim_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L+R', peak_hold=False, ) self.nb.GetPage(2).Add(self.wxgui_fftsink2_0_0_0.win) self.wxgui_fftsink2_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='FM Demod', peak_hold=False, ) self.nb.GetPage(1).Add(self.wxgui_fftsink2_0_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-30, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='Baseband', peak_hold=False, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0.win) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf( 1, firdes.root_raised_cosine(1, samp_rate / bb_decim / audio_decim, 2375, 1, 100)) self.rational_resampler_xxx_0_0 = filter.rational_resampler_fff( interpolation=audio_rate, decimation=audio_decim_rate, taps=None, fractional_bw=None, ) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=audio_rate, decimation=audio_decim_rate, taps=None, fractional_bw=None, ) self.osmosdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + '') self.osmosdr_source_0.set_sample_rate(samp_rate) self.osmosdr_source_0.set_center_freq(freq_tune, 0) self.osmosdr_source_0.set_freq_corr(0, 0) self.osmosdr_source_0.set_dc_offset_mode(0, 0) self.osmosdr_source_0.set_iq_balance_mode(0, 0) self.osmosdr_source_0.set_gain_mode(False, 0) self.osmosdr_source_0.set_gain(gain, 0) self.osmosdr_source_0.set_if_gain(20, 0) self.osmosdr_source_0.set_bb_gain(20, 0) self.osmosdr_source_0.set_antenna('', 0) self.osmosdr_source_0.set_bandwidth(0, 0) self.gr_rds_parser_0 = rds.parser(True, False, 0) self.gr_rds_panel_0 = rds.rdsPanel(freq, self.GetWin()) self.Add(self.gr_rds_panel_0.panel) self.gr_rds_decoder_0 = rds.decoder(False, False) self.freq_xlating_fir_filter_xxx_1 = filter.freq_xlating_fir_filter_fcc( audio_decim, (firdes.low_pass(2500.0, baseband_rate, 2.4e3, 2e3, firdes.WIN_HAMMING)), 57e3, baseband_rate) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc( 1, (firdes.low_pass(1, samp_rate, xlate_bandwidth, 100000)), freq_offset, samp_rate) self.fir_filter_xxx_5 = filter.fir_filter_fff( audio_decim, (firdes.low_pass(1.0, baseband_rate, 20e3, 40e3, firdes.WIN_HAMMING))) self.fir_filter_xxx_5.declare_sample_delay(0) self.fir_filter_xxx_3 = filter.fir_filter_fff( 1, (firdes.band_pass(1.0, baseband_rate, 38e3 - 13e3, 38e3 + 13e3, 3e3, firdes.WIN_HAMMING))) self.fir_filter_xxx_3.declare_sample_delay(0) self.fir_filter_xxx_2 = filter.fir_filter_fcc( 1, (firdes.complex_band_pass(1.0, baseband_rate, 19e3 - 500, 19e3 + 500, 1e3, firdes.WIN_HAMMING))) self.fir_filter_xxx_2.declare_sample_delay(0) self.fir_filter_xxx_1 = filter.fir_filter_fff( audio_decim, (firdes.low_pass(1.0, baseband_rate, 13e3, 3e3, firdes.WIN_HAMMING))) self.fir_filter_xxx_1.declare_sample_delay(0) self.digital_mpsk_receiver_cc_0 = digital.mpsk_receiver_cc( 2, 0, 1 * cmath.pi / 100.0, -0.06, 0.06, 0.5, 0.05, samp_rate / bb_decim / audio_decim / 2375.0, 0.001, 0.005) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(2) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_multiply_xx_1 = blocks.multiply_vcc(1) self.blocks_multiply_xx_0 = blocks.multiply_vff(1) self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff( (10**(1. * (volume + 15) / 10), )) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff( (10**(1. * (volume + 15) / 10), )) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n( gr.sizeof_char * 1, 2) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_complex_to_imag_0 = blocks.complex_to_imag(1) self.blocks_add_xx_0 = blocks.add_vff(1) self.audio_sink_0 = audio.sink(audio_rate, '', True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=samp_rate, audio_decimation=bb_decim, ) self.analog_pll_refout_cc_0 = analog.pll_refout_cc( 0.001, 2 * math.pi * (19000 + 200) / baseband_rate, 2 * math.pi * (19000 - 200) / baseband_rate) self.analog_fm_deemph_0_0_0 = analog.fm_deemph(fs=audio_decim_rate, tau=75e-6) self.analog_fm_deemph_0_0 = analog.fm_deemph(fs=audio_decim_rate, tau=75e-6) ################################################## # Connections ################################################## self.msg_connect((self.gr_rds_decoder_0, 'out'), (self.gr_rds_parser_0, 'in')) self.msg_connect((self.gr_rds_parser_0, 'out'), (self.gr_rds_panel_0, 'in')) self.connect((self.analog_fm_deemph_0_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) self.connect((self.analog_fm_deemph_0_0_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.analog_pll_refout_cc_0, 0), (self.blocks_multiply_xx_1, 0)) self.connect((self.analog_pll_refout_cc_0, 0), (self.blocks_multiply_xx_1, 1)) self.connect((self.analog_wfm_rcv_0, 0), (self.fir_filter_xxx_1, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.fir_filter_xxx_2, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.fir_filter_xxx_3, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.freq_xlating_fir_filter_xxx_1, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_fftsink2_0_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.analog_fm_deemph_0_0_0, 0)) self.connect((self.blocks_complex_to_imag_0, 0), (self.blocks_multiply_xx_0, 1)) self.connect((self.blocks_complex_to_imag_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.digital_diff_decoder_bb_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.rational_resampler_xxx_0_0, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.fir_filter_xxx_5, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.wxgui_fftsink2_0_0_0_1_0_0, 0)) self.connect((self.blocks_multiply_xx_1, 0), (self.blocks_complex_to_imag_0, 0)) self.connect((self.blocks_sub_xx_0, 0), (self.analog_fm_deemph_0_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.digital_diff_decoder_bb_0, 0), (self.gr_rds_decoder_0, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_add_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0, 0)) self.connect((self.fir_filter_xxx_2, 0), (self.analog_pll_refout_cc_0, 0)) self.connect((self.fir_filter_xxx_3, 0), (self.blocks_multiply_xx_0, 0)) self.connect((self.fir_filter_xxx_3, 0), (self.wxgui_fftsink2_0_0_0_1, 0)) self.connect((self.fir_filter_xxx_5, 0), (self.blocks_add_xx_0, 1)) self.connect((self.fir_filter_xxx_5, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0_1_0_1, 0)) self.connect((self.osmosdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.rational_resampler_xxx_0_0, 0), (self.audio_sink_0, 1)) self.connect((self.root_raised_cosine_filter_0, 0), (self.digital_mpsk_receiver_cc_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Audio Fmcw 2") _icon_path = "C:\Program Files\GNURadio-3.7\share\icons\hicolor\scalable/apps\gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 48e3 self.mul_constant = mul_constant = 50 self.f = f = 50 self.delay_ms = delay_ms = 350 ################################################## # Blocks ################################################## self._mul_constant_text_box = forms.text_box( parent=self.GetWin(), value=self.mul_constant, callback=self.set_mul_constant, label='mul_constant', converter=forms.float_converter(), ) self.Add(self._mul_constant_text_box) self._f_text_box = forms.text_box( parent=self.GetWin(), value=self.f, callback=self.set_f, label='f', converter=forms.float_converter(), ) self.Add(self._f_text_box) _delay_ms_sizer = wx.BoxSizer(wx.VERTICAL) self._delay_ms_text_box = forms.text_box( parent=self.GetWin(), sizer=_delay_ms_sizer, value=self.delay_ms, callback=self.set_delay_ms, label='delay_ms', converter=forms.int_converter(), proportion=0, ) self._delay_ms_slider = forms.slider( parent=self.GetWin(), sizer=_delay_ms_sizer, value=self.delay_ms, callback=self.set_delay_ms, minimum=0, maximum=1000, num_steps=100, style=wx.SL_HORIZONTAL, cast=int, proportion=1, ) self.Add(_delay_ms_sizer) self.wxgui_waterfallsink2_1 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=21, ref_level=10, ref_scale=2.0, sample_rate=samp_rate, fft_size=2014, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.Add(self.wxgui_waterfallsink2_1.win) self.hilbert_fc_0 = filter.hilbert_fc(65, firdes.WIN_HAMMING, 6.76) self.fft_vxx_0 = fft.fft_vcc(1024, True, (window.blackmanharris(1024)), True, 2) self.chirp_gen_0 = chirp_gen( bf_hz=0, chirp_rate_hz=f, chirp_width_hz=48e3, samp_rate=48e3, ) self.blocks_vector_to_stream_2 = blocks.vector_to_stream(gr.sizeof_gr_complex*1, 1024) self.blocks_vector_to_stream_1 = blocks.vector_to_stream(gr.sizeof_float*1, 512) self.blocks_vector_to_stream_0 = blocks.vector_to_stream(gr.sizeof_float*1, 512) self.blocks_vector_source_x_1 = blocks.vector_source_c((0, 0, 0), True, 1, []) self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, 512) self.blocks_stream_to_vector_0 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, 1024) self.blocks_stream_mux_0 = blocks.stream_mux(gr.sizeof_gr_complex*1, (1024, 1)) self.blocks_nlog10_ff_0 = blocks.nlog10_ff(1, 512, 0) self.blocks_multiply_xx_1 = blocks.multiply_vcc(1) self.blocks_multiply_const_xx_0 = blocks.multiply_const_ff(mul_constant) self.blocks_multiply_conjugate_cc_0 = blocks.multiply_conjugate_cc(1) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n(gr.sizeof_float*512, 1) self.blocks_keep_m_in_n_0 = blocks.keep_m_in_n(gr.sizeof_gr_complex, 512, 1024, 512) self.blocks_delay_0 = blocks.delay(gr.sizeof_gr_complex*1, delay_ms) self.blocks_complex_to_mag_0 = blocks.complex_to_mag(512) self.audio_source_0 = audio.source(48000, '', True) self.audio_sink_0 = audio.sink(48000, '', True) self.analog_const_source_x_1 = analog.sig_source_c(0, analog.GR_CONST_WAVE, 0, 0, 0) ################################################## # Connections ################################################## self.connect((self.analog_const_source_x_1, 0), (self.blocks_stream_mux_0, 1)) self.connect((self.audio_source_0, 0), (self.hilbert_fc_0, 0)) self.connect((self.blocks_complex_to_mag_0, 0), (self.blocks_nlog10_ff_0, 0)) self.connect((self.blocks_delay_0, 0), (self.blocks_multiply_conjugate_cc_0, 1)) self.connect((self.blocks_keep_m_in_n_0, 0), (self.blocks_stream_to_vector_1, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.blocks_vector_to_stream_1, 0)) self.connect((self.blocks_multiply_conjugate_cc_0, 0), (self.blocks_multiply_xx_1, 0)) self.connect((self.blocks_multiply_const_xx_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_multiply_xx_1, 0), (self.blocks_stream_mux_0, 0)) self.connect((self.blocks_nlog10_ff_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.blocks_nlog10_ff_0, 0), (self.blocks_vector_to_stream_0, 0)) self.connect((self.blocks_stream_mux_0, 0), (self.blocks_stream_to_vector_0, 0)) self.connect((self.blocks_stream_to_vector_0, 0), (self.fft_vxx_0, 0)) self.connect((self.blocks_stream_to_vector_1, 0), (self.blocks_complex_to_mag_0, 0)) self.connect((self.blocks_vector_source_x_1, 0), (self.blocks_multiply_xx_1, 1)) self.connect((self.blocks_vector_to_stream_0, 0), (self.blocks_multiply_const_xx_0, 0)) self.connect((self.blocks_vector_to_stream_1, 0), (self.wxgui_waterfallsink2_1, 0)) self.connect((self.blocks_vector_to_stream_2, 0), (self.blocks_keep_m_in_n_0, 0)) self.connect((self.chirp_gen_0, 1), (self.blocks_delay_0, 0)) self.connect((self.fft_vxx_0, 0), (self.blocks_vector_to_stream_2, 0)) self.connect((self.hilbert_fc_0, 0), (self.blocks_multiply_conjugate_cc_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.symbol_rate = symbol_rate = 200 self.samp_rate = samp_rate = 8000 self.samp_per_sym = samp_per_sym = samp_rate/symbol_rate self.fsk_deviation_hz = fsk_deviation_hz = symbol_rate * 0.5 ################################################## # Blocks ################################################## self.wxgui_waterfallsink2_0_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.Add(self.wxgui_waterfallsink2_0_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_f( self.GetWin(), title="Scope Plot", sample_rate=samp_rate, v_scale=0, v_offset=0, t_scale=0.02, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.Add(self.wxgui_scopesink2_1.win) self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff(samp_per_sym*(1+0.0), 0.25*0.175*0.175, 0.5, 0.175, 0.005) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_pack_k_bits_bb_0 = blocks.pack_k_bits_bb(8) self.blocks_file_sink_0_0 = blocks.file_sink(gr.sizeof_char*1, "/tmp/msk-bin", False) self.blocks_file_sink_0_0.set_unbuffered(True) self.blocks_complex_to_float_0 = blocks.complex_to_float(1) self.blocks_add_const_vxx_0 = blocks.add_const_vff((-79, )) self.band_pass_filter_0 = filter.fir_filter_fcc(1, firdes.complex_band_pass( 1, samp_rate, 750, 1250, 10, firdes.WIN_HAMMING, 6.76)) self.audio_source_0 = audio.source(samp_rate, "dsp0", True) self.analog_quadrature_demod_cf_0 = analog.quadrature_demod_cf(samp_rate/(2*math.pi*fsk_deviation_hz/8.0)) ################################################## # Connections ################################################## self.connect((self.audio_source_0, 0), (self.band_pass_filter_0, 0)) self.connect((self.band_pass_filter_0, 0), (self.analog_quadrature_demod_cf_0, 0)) self.connect((self.analog_quadrature_demod_cf_0, 0), (self.digital_clock_recovery_mm_xx_0, 0)) self.connect((self.analog_quadrature_demod_cf_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.blocks_add_const_vxx_0, 0)) self.connect((self.blocks_add_const_vxx_0, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.blocks_pack_k_bits_bb_0, 0)) self.connect((self.blocks_pack_k_bits_bb_0, 0), (self.blocks_file_sink_0_0, 0)) self.connect((self.band_pass_filter_0, 0), (self.blocks_complex_to_float_0, 0)) self.connect((self.blocks_complex_to_float_0, 0), (self.wxgui_waterfallsink2_0_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="JMPXRDS Receiver (based on gr_rds)") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) self._lock = threading.RLock() ################################################## # Variables ################################################## self.volume = volume = -3 self.mpx_samp_rate_0 = mpx_samp_rate_0 = 192000 self.mpx_samp_rate = mpx_samp_rate = 192000 self.audio_samp_rate = audio_samp_rate = 96000 ################################################## # Blocks ################################################## _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label='Volume', converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=-20, maximum=10, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_volume_sizer, 0, 0, 1, 1) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "MPX Plot") self.nb.AddPage(grc_wxgui.Panel(self.nb), "MPX Waterfall") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L+R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L-R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS Plot") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS Constelation") self.GridAdd(self.nb, 1, 0, 1, 1) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(1).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=mpx_samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='MPX Waterfall Plot', ) self.nb.GetPage(1).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(5).GetWin(), title='Scope Plot', sample_rate=mpx_samp_rate / 4, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.nb.GetPage(5).Add(self.wxgui_scopesink2_1.win) self.wxgui_fftsink2_0_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=mpx_samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='MPX FFT', peak_hold=False, win=window.flattop, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0_0_1.win) self.wxgui_fftsink2_0_0_0_1_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(4).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=mpx_samp_rate/4, fft_size=1024, fft_rate=12, average=False, avg_alpha=None, title='RDS', peak_hold=False, win=window.blackmanharris, ) self.nb.GetPage(4).Add(self.wxgui_fftsink2_0_0_0_1_0_1.win) self.wxgui_fftsink2_0_0_0_1 = fftsink2.fft_sink_f( self.nb.GetPage(3).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=mpx_samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L-R', peak_hold=False, win=window.flattop, ) self.nb.GetPage(3).Add(self.wxgui_fftsink2_0_0_0_1.win) self.wxgui_fftsink2_0_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=mpx_samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L+R', peak_hold=False, win=window.flattop, ) self.nb.GetPage(2).Add(self.wxgui_fftsink2_0_0_0.win) self.wxgui_fftsink2_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=mpx_samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='MPX FFT', peak_hold=False, win=window.flattop, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0_0.win) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf(1, firdes.root_raised_cosine( 1, mpx_samp_rate/4, 2375, 1, 100)) self.rational_resampler_xxx_0_0 = filter.rational_resampler_fff( interpolation=audio_samp_rate, decimation=mpx_samp_rate, taps=None, fractional_bw=0.4, ) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=audio_samp_rate, decimation=mpx_samp_rate, taps=None, fractional_bw=0.4, ) self.gr_rds_parser_0 = rds.parser(False, False, 0) self.gr_rds_panel_0 = rds.rdsPanel(96700000, self.GetWin()) self.Add(self.gr_rds_panel_0.panel) self.gr_rds_decoder_0 = rds.decoder(False, False) self.freq_xlating_fir_filter_xxx_2 = filter.freq_xlating_fir_filter_fcf(1, (firdes.low_pass(1.0,mpx_samp_rate,17e3,3e3,firdes.WIN_HAMMING)), 38000, mpx_samp_rate) self.freq_xlating_fir_filter_xxx_1 = filter.freq_xlating_fir_filter_fcc(4, (firdes.low_pass(1.0,mpx_samp_rate,2.4e3,2e3,firdes.WIN_HAMMING)), 57e3, mpx_samp_rate) self.fir_filter_xxx_1 = filter.fir_filter_fff(1, (firdes.low_pass(1.0,mpx_samp_rate,17e3,3e3,firdes.WIN_HAMMING))) self.fir_filter_xxx_1.declare_sample_delay(0) self.digital_mpsk_receiver_cc_0 = digital.mpsk_receiver_cc(2, 0, 1*cmath.pi/100.0, -0.06, 0.06, 0.5, 0.05, mpx_samp_rate/4/2375.0, 0.001, 0.005) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(2) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff((10**(1.*(volume)/10), )) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((10**(1.*(volume)/10), )) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n(gr.sizeof_char*1, 2) self.blocks_file_source_0 = blocks.file_source(gr.sizeof_float*1, '/tmp/jmpxrds_rtp_client.sock', False) self.blocks_file_source_0.set_begin_tag(pmt.PMT_NIL) self.blocks_complex_to_real_0_0 = blocks.complex_to_real(1) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_add_xx_0 = blocks.add_vff(1) self.audio_sink_0 = audio.sink(audio_samp_rate, '', True) self.analog_frequency_modulator_fc_0 = analog.frequency_modulator_fc(1) self.analog_fm_deemph_0_0_0 = analog.fm_deemph(fs=mpx_samp_rate, tau=50e-6) self.analog_fm_deemph_0_0 = analog.fm_deemph(fs=mpx_samp_rate, tau=50e-6) ################################################## # Connections ################################################## self.msg_connect((self.gr_rds_decoder_0, 'out'), (self.gr_rds_parser_0, 'in')) self.msg_connect((self.gr_rds_parser_0, 'out'), (self.gr_rds_panel_0, 'in')) self.connect((self.analog_fm_deemph_0_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) self.connect((self.analog_fm_deemph_0_0_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.analog_frequency_modulator_fc_0, 0), (self.wxgui_fftsink2_0_0_1, 0)) self.connect((self.blocks_add_xx_0, 0), (self.analog_fm_deemph_0_0_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_add_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.wxgui_fftsink2_0_0_0_1, 0)) self.connect((self.blocks_complex_to_real_0_0, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.blocks_file_source_0, 0), (self.analog_frequency_modulator_fc_0, 0)) self.connect((self.blocks_file_source_0, 0), (self.fir_filter_xxx_1, 0)) self.connect((self.blocks_file_source_0, 0), (self.freq_xlating_fir_filter_xxx_1, 0)) self.connect((self.blocks_file_source_0, 0), (self.freq_xlating_fir_filter_xxx_2, 0)) self.connect((self.blocks_file_source_0, 0), (self.wxgui_fftsink2_0_0, 0)) self.connect((self.blocks_file_source_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.digital_diff_decoder_bb_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.rational_resampler_xxx_0_0, 0)) self.connect((self.blocks_sub_xx_0, 0), (self.analog_fm_deemph_0_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.digital_diff_decoder_bb_0, 0), (self.gr_rds_decoder_0, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.blocks_complex_to_real_0_0, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_add_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0_1_0_1, 0)) self.connect((self.freq_xlating_fir_filter_xxx_2, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.rational_resampler_xxx_0_0, 0), (self.audio_sink_0, 1)) self.connect((self.root_raised_cosine_filter_0, 0), (self.digital_mpsk_receiver_cc_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Psk31 Rx") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.center_freq = center_freq = 441000000 self.samp_rate = samp_rate = 960000 self.psk_offset = psk_offset = 1000 self.psk_center = psk_center = center_freq + 141000 self.int_rate = int_rate = 48000 self.gain = gain = 30 self.corr = corr = 0 self.audio_rate = audio_rate = 8000 ################################################## # Message Queues ################################################## blocks_message_sink_0_msgq_out = wxgui_termsink_0_msgq_in = gr.msg_queue( 2) ################################################## # Blocks ################################################## _psk_offset_sizer = wx.BoxSizer(wx.VERTICAL) self._psk_offset_text_box = forms.text_box( parent=self.GetWin(), sizer=_psk_offset_sizer, value=self.psk_offset, callback=self.set_psk_offset, label="PSK offset", converter=forms.float_converter(), proportion=0, ) self._psk_offset_slider = forms.slider( parent=self.GetWin(), sizer=_psk_offset_sizer, value=self.psk_offset, callback=self.set_psk_offset, minimum=0, maximum=3000, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_psk_offset_sizer, 1, 0, 1, 2) _psk_center_sizer = wx.BoxSizer(wx.VERTICAL) self._psk_center_text_box = forms.text_box( parent=self.GetWin(), sizer=_psk_center_sizer, value=self.psk_center, callback=self.set_psk_center, label="Tuning", converter=forms.float_converter(), proportion=0, ) self._psk_center_slider = forms.slider( parent=self.GetWin(), sizer=_psk_center_sizer, value=self.psk_center, callback=self.set_psk_center, minimum=center_freq + 110000, maximum=center_freq + 150000, num_steps=40, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_psk_center_sizer, 0, 0, 1, 2) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "960 kHz") self.nb.AddPage(grc_wxgui.Panel(self.nb), "48 kHz") self.nb.AddPage(grc_wxgui.Panel(self.nb), "4 kHz") self.nb.AddPage(grc_wxgui.Panel(self.nb), "I/Q scope") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Constellation") self.GridAdd(self.nb, 3, 0, 1, 2) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label='gain', converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 2, 0, 1, 1) _corr_sizer = wx.BoxSizer(wx.VERTICAL) self._corr_text_box = forms.text_box( parent=self.GetWin(), sizer=_corr_sizer, value=self.corr, callback=self.set_corr, label='corr', converter=forms.float_converter(), proportion=0, ) self._corr_slider = forms.slider( parent=self.GetWin(), sizer=_corr_sizer, value=self.corr, callback=self.set_corr, minimum=-150, maximum=150, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_corr_sizer, 2, 1, 1, 1) self.wxgui_waterfallsink2_2 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, dynamic_range=30, ref_level=-40, ref_scale=2.0, sample_rate=audio_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", win=window.blackmanharris, size=((800, 400)), ) self.nb.GetPage(2).Add(self.wxgui_waterfallsink2_2.win) def wxgui_waterfallsink2_2_callback(x, y): self.set_psk_offset(x) self.wxgui_waterfallsink2_2.set_callback( wxgui_waterfallsink2_2_callback) self.wxgui_waterfallsink2_1 = waterfallsink2.waterfall_sink_c( self.nb.GetPage(1).GetWin(), baseband_freq=psk_center, dynamic_range=30, ref_level=-30, ref_scale=2.0, sample_rate=int_rate, fft_size=2048, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", size=((800, 400)), ) self.nb.GetPage(1).Add(self.wxgui_waterfallsink2_1.win) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=center_freq, dynamic_range=30, ref_level=-20, ref_scale=2.0, sample_rate=samp_rate, fft_size=2048, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", size=((800, 400)), ) self.nb.GetPage(0).Add(self.wxgui_waterfallsink2_0.win) def wxgui_waterfallsink2_0_callback(x, y): self.set_psk_center(x) self.wxgui_waterfallsink2_0.set_callback( wxgui_waterfallsink2_0_callback) self.wxgui_termsink_0 = termsink.termsink( parent=self.GetWin(), size=(500, 100), msgq=wxgui_termsink_0_msgq_in, ) self.Add(self.wxgui_termsink_0) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(4).GetWin(), title="Scope Plot", sample_rate=31.25, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.nb.GetPage(4).Add(self.wxgui_scopesink2_1.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( self.nb.GetPage(3).GetWin(), title="Scope Plot", sample_rate=500, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.nb.GetPage(3).Add(self.wxgui_scopesink2_0.win) self.wxgui_numbersink2_0 = numbersink2.number_sink_f( self.GetWin(), unit="Hz", minval=-500 / math.pi, maxval=500 / math.pi, factor=500 / math.pi, decimal_places=1, ref_level=0, sample_rate=500, number_rate=15, average=False, avg_alpha=None, label="Carrier tracking offset", peak_hold=False, show_gauge=True, ) self.Add(self.wxgui_numbersink2_0.win) self.osmosdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + "") self.osmosdr_source_0.set_sample_rate(samp_rate) self.osmosdr_source_0.set_center_freq(center_freq, 0) self.osmosdr_source_0.set_freq_corr(corr, 0) self.osmosdr_source_0.set_dc_offset_mode(0, 0) self.osmosdr_source_0.set_iq_balance_mode(0, 0) self.osmosdr_source_0.set_gain_mode(0, 0) self.osmosdr_source_0.set_gain(gain, 0) self.osmosdr_source_0.set_if_gain(20, 0) self.osmosdr_source_0.set_bb_gain(20, 0) self.osmosdr_source_0.set_antenna("", 0) self.osmosdr_source_0.set_bandwidth(0, 0) self.ham_varicode_rx_0 = ham.varicode_rx() self.freq_xlating_fir_filter_xxx_1 = filter.freq_xlating_fir_filter_ccc( 16, (firdes.low_pass(10, audio_rate, 120, 40, firdes.WIN_HAMMING, 6.76)), psk_offset, audio_rate) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc( samp_rate / int_rate, (firdes.low_pass(1, samp_rate, 12000, 12000, firdes.WIN_HAMMING, 6.76)), round(psk_center - center_freq, -3), samp_rate) self.digital_diff_phasor_cc_0 = digital.diff_phasor_cc() self.digital_costas_loop_cc_0 = digital.costas_loop_cc( 5 * math.pi / 100.0, 2) self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_cc( 16, 0.25 * 0.175 * 0.175, 0.5, 0.175, 0.005) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_message_sink_0 = blocks.message_sink( gr.sizeof_char * 1, blocks_message_sink_0_msgq_out, True) self.blocks_complex_to_real_1 = blocks.complex_to_real(1) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.band_pass_filter_0 = filter.fir_filter_ccc( int_rate / audio_rate, firdes.complex_band_pass(1, int_rate, 200, 2800, 200, firdes.WIN_HAMMING, 6.76)) self.audio_sink_0 = audio.sink(audio_rate, "plughw:0,0", True) self.analog_agc_xx_0 = analog.agc_cc(1e-3, 0.1, 1.0) self.analog_agc_xx_0.set_max_gain(65536) ################################################## # Connections ################################################## self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_waterfallsink2_1, 0)) self.connect((self.osmosdr_source_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.band_pass_filter_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.wxgui_waterfallsink2_2, 0)) self.connect((self.digital_costas_loop_cc_0, 1), (self.wxgui_numbersink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.digital_costas_loop_cc_0, 0)) self.connect((self.digital_costas_loop_cc_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.digital_diff_phasor_cc_0, 0)) self.connect((self.digital_costas_loop_cc_0, 0), (self.digital_clock_recovery_mm_xx_0, 0)) self.connect((self.ham_varicode_rx_0, 0), (self.blocks_message_sink_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.ham_varicode_rx_0, 0)) self.connect((self.blocks_complex_to_real_1, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.digital_diff_phasor_cc_0, 0), (self.blocks_complex_to_real_1, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.audio_sink_0, 0)) self.connect((self.band_pass_filter_0, 0), (self.analog_agc_xx_0, 0)) self.connect((self.analog_agc_xx_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.analog_agc_xx_0, 0), (self.freq_xlating_fir_filter_xxx_1, 0)) self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.wxgui_scopesink2_1, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 32000 ################################################## # Blocks ################################################## self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "tab1") self.nb.AddPage(grc_wxgui.Panel(self.nb), "tab2") self.nb.AddPage(grc_wxgui.Panel(self.nb), "tab3") self.Add(self.nb) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(1).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.nb.GetPage(1).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="FFT Plot", peak_hold=False, ) self.nb.GetPage(2).Add(self.wxgui_fftsink2_0.win) self.wxgui_constellationsink2_0 = constsink_gl.const_sink_c( self.nb.GetPage(0).GetWin(), title="Constellation Plot", sample_rate=samp_rate, frame_rate=5, const_size=2048, M=4, theta=0, loop_bw=6.28 / 100.0, fmax=0.06, mu=0.5, gain_mu=0.005, symbol_rate=samp_rate / 4., omega_limit=0.005, ) self.nb.GetPage(0).Add(self.wxgui_constellationsink2_0.win) self.blocks_wavfile_source_0 = blocks.wavfile_source( "/home/gareth/tmp/SDRSharp_20160305_114954Z_27619080Hz_IQ.wav", True) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float * 1, samp_rate, True) self.blocks_float_to_complex_0 = blocks.float_to_complex(1) ################################################## # Connections ################################################## self.connect((self.blocks_float_to_complex_0, 0), (self.wxgui_constellationsink2_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.blocks_float_to_complex_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_throttle_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="[FG]MRS Receiver") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 1e6 self.channel_width = channel_width = 25e3 self.rf_freq_mhz = rf_freq_mhz = 462.5625 self.decimation = decimation = int(samp_rate/channel_width) self.squelch = squelch = -20 self.spec_size = spec_size = 480,256 self.rf_freq = rf_freq = rf_freq_mhz*1.0e6 self.decimated_rate = decimated_rate = samp_rate/decimation self.center_freq = center_freq = (int(rf_freq_mhz)+0.5)*1e6 self.cctss_freq = cctss_freq = 0 self.audio_rate = audio_rate = int(11025) ################################################## # Blocks ################################################## _squelch_sizer = wx.BoxSizer(wx.VERTICAL) self._squelch_text_box = forms.text_box( parent=self.GetWin(), sizer=_squelch_sizer, value=self.squelch, callback=self.set_squelch, label="Squelch (dBm)", converter=forms.float_converter(), proportion=0, ) self._squelch_slider = forms.slider( parent=self.GetWin(), sizer=_squelch_sizer, value=self.squelch, callback=self.set_squelch, minimum=-50, maximum=0, num_steps=50, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_squelch_sizer, 3, 3, 1, 2) self._cctss_freq_chooser = forms.drop_down( parent=self.GetWin(), value=self.cctss_freq, callback=self.set_cctss_freq, label="Privacy Code", choices=[0,67.0,71.9,74.4,77.0,79.7,82.5,85.4,88.5,91.5,94.8,97.4,100.0,103.5,107.2,110.9,114.8,118.8,123.0,127.3,131.8,136.5,141.3,146.2,151.4,156.7,162.2,167.9,173.8,179.9,186.2,192.8,203.5,210.7,218.1,225.7,233.7,241.8,250.3], labels=['0 (Monitor)',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38], ) self.GridAdd(self._cctss_freq_chooser, 3, 2, 1, 1) self.wxgui_waterfallsink2_1_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=40, ref_level=-25, ref_scale=2.0, sample_rate=audio_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Raw Audio Spectrum", size=(spec_size), ) self.GridAdd(self.wxgui_waterfallsink2_1_0.win, 2, 4, 1, 3) self.wxgui_waterfallsink2_1 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=40, ref_level=-25, ref_scale=2.0, sample_rate=audio_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Squelched Audio Spectrum", size=(spec_size), ) self.GridAdd(self.wxgui_waterfallsink2_1.win, 2, 1, 1, 3) self.wxgui_waterfallsink2_0_0 = waterfallsink2.waterfall_sink_c( self.GetWin(), baseband_freq=center_freq, dynamic_range=40, ref_level=-25, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="RF Spectrum", size=(spec_size), ) self.GridAdd(self.wxgui_waterfallsink2_0_0.win, 1, 1, 1, 3) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_c( self.GetWin(), baseband_freq=0, dynamic_range=40, ref_level=-25, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Baseband Spectrum", size=(spec_size), ) self.GridAdd(self.wxgui_waterfallsink2_0.win, 1, 4, 1, 3) self._rf_freq_mhz_chooser = forms.drop_down( parent=self.GetWin(), value=self.rf_freq_mhz, callback=self.set_rf_freq_mhz, label="Channel", choices=[462.5625, 462.5875, 462.6125, 462.6375, 462.6625, 462.6875, 462.7125, 467.5625, 467.5875, 467.6125, 467.6375, 467.6625, 467.6875, 467.7125, 462.550, 462.575, 462.600, 462.625,462.650,462.675,462.700, 462.725], labels=['FRS1 / GMRS 9',2,3,4,5,6,'FRS7 / GMRS15 ','FRS8',9,10,11,12,13,'FRS14','GMRS1',2,3,4,5,6,7,'GMRS8'], ) self.GridAdd(self._rf_freq_mhz_chooser, 3, 1, 1, 1) self.rational_resampler_xxx_0 = filter.rational_resampler_ccc( interpolation=int(audio_rate), decimation=int(decimated_rate), taps=None, fractional_bw=None, ) self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" ) self.osmosdr_source_0.set_sample_rate(samp_rate) self.osmosdr_source_0.set_center_freq(center_freq, 0) self.osmosdr_source_0.set_freq_corr(0, 0) self.osmosdr_source_0.set_dc_offset_mode(0, 0) self.osmosdr_source_0.set_iq_balance_mode(0, 0) self.osmosdr_source_0.set_gain_mode(True, 0) self.osmosdr_source_0.set_gain(10, 0) self.osmosdr_source_0.set_if_gain(20, 0) self.osmosdr_source_0.set_bb_gain(20, 0) self.osmosdr_source_0.set_antenna("", 0) self.osmosdr_source_0.set_bandwidth(0, 0) self.low_pass_filter_0 = filter.fir_filter_ccf(decimation, firdes.low_pass( 1, samp_rate, decimated_rate*0.8, decimated_rate*0.2, firdes.WIN_HAMMING, 6.76)) self.dc_blocker_xx_0 = filter.dc_blocker_cc(32, True) self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) self.audio_sink_0 = audio.sink(audio_rate, "", True) self.analog_sig_source_x_0 = analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, rf_freq, 1, 0) self.analog_pwr_squelch_xx_0 = analog.pwr_squelch_ff(squelch, 0.0001, 1, False) self.analog_nbfm_rx_0 = analog.nbfm_rx( audio_rate=audio_rate, quad_rate=audio_rate, tau=75e-6, max_dev=5e3, ) self.analog_ctcss_squelch_ff_0 = analog.ctcss_squelch_ff(audio_rate, cctss_freq, 0.01, 0, 1, False) ################################################## # Connections ################################################## self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.analog_nbfm_rx_0, 0)) self.connect((self.analog_nbfm_rx_0, 0), (self.wxgui_waterfallsink2_1_0, 0)) self.connect((self.analog_nbfm_rx_0, 0), (self.analog_ctcss_squelch_ff_0, 0)) self.connect((self.analog_ctcss_squelch_ff_0, 0), (self.analog_pwr_squelch_xx_0, 0)) self.connect((self.analog_pwr_squelch_xx_0, 0), (self.audio_sink_0, 0)) self.connect((self.analog_pwr_squelch_xx_0, 0), (self.wxgui_waterfallsink2_1, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.dc_blocker_xx_0, 0)) self.connect((self.dc_blocker_xx_0, 0), (self.wxgui_waterfallsink2_0_0, 0)) self.connect((self.dc_blocker_xx_0, 0), (self.blocks_multiply_xx_0, 1))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Stereo FM receiver and RDS Decoder") ################################################## # Variables ################################################## self.samp_rate = samp_rate = 1000000 self.bb_decim = bb_decim = 4 self.freq_offset = freq_offset = 250000 self.freq = freq = 106.1e6 self.baseband_rate = baseband_rate = samp_rate/bb_decim self.audio_decim = audio_decim = 5 self.xlate_bandwidth = xlate_bandwidth = 100000 self.volume = volume = 0 self.gain = gain = 37.6 self.freq_tune = freq_tune = freq - freq_offset self.audio_rate = audio_rate = 48000 self.audio_decim_rate = audio_decim_rate = baseband_rate/audio_decim ################################################## # Blocks ################################################## _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label="Volume", converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=-20, maximum=10, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_volume_sizer, 0, 1, 1, 1) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "BB") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Demod") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L+R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Pilot") self.nb.AddPage(grc_wxgui.Panel(self.nb), "DSBSC") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L-R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS constellation") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Waterfall") self.GridAdd(self.nb, 2, 0, 1, 2) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label="RF Gain", converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 0, 0, 1, 1) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label="Freq", converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=88.1e6, maximum=107.9e6, num_steps=99, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_freq_sizer, 1, 0, 1, 2) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(8).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.nb.GetPage(8).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(7).GetWin(), title="Scope Plot", sample_rate=2375, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.nb.GetPage(7).Add(self.wxgui_scopesink2_1.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_f( self.nb.GetPage(3).GetWin(), title="Pilot", sample_rate=baseband_rate, v_scale=0, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.nb.GetPage(3).Add(self.wxgui_scopesink2_0.win) self.wxgui_fftsink2_0_0_0_1_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(5).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=audio_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="RDS", peak_hold=False, ) self.nb.GetPage(5).Add(self.wxgui_fftsink2_0_0_0_1_0_1.win) self.wxgui_fftsink2_0_0_0_1_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(6).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-50, ref_scale=2.0, sample_rate=baseband_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="L-R", peak_hold=False, ) self.nb.GetPage(6).Add(self.wxgui_fftsink2_0_0_0_1_0_0.win) self.wxgui_fftsink2_0_0_0_1 = fftsink2.fft_sink_f( self.nb.GetPage(4).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="DSBSC Sub-carrier", peak_hold=False, ) self.nb.GetPage(4).Add(self.wxgui_fftsink2_0_0_0_1.win) self.wxgui_fftsink2_0_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=audio_decim_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="L+R", peak_hold=False, ) self.nb.GetPage(2).Add(self.wxgui_fftsink2_0_0_0.win) self.wxgui_fftsink2_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title="FM Demod", peak_hold=False, ) self.nb.GetPage(1).Add(self.wxgui_fftsink2_0_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-30, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title="Baseband", peak_hold=False, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0.win) self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" ) self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(freq_tune, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) self.rtlsdr_source_0.set_dc_offset_mode(0, 0) self.rtlsdr_source_0.set_iq_balance_mode(0, 0) self.rtlsdr_source_0.set_gain_mode(False, 0) self.rtlsdr_source_0.set_gain(gain, 0) self.rtlsdr_source_0.set_if_gain(20, 0) self.rtlsdr_source_0.set_bb_gain(20, 0) self.rtlsdr_source_0.set_antenna("", 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf(1, firdes.root_raised_cosine( 1, samp_rate/bb_decim/audio_decim, 2375, 1, 100)) self.rational_resampler_xxx_0_0 = filter.rational_resampler_fff( interpolation=audio_rate, decimation=audio_decim_rate, taps=None, fractional_bw=None, ) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=audio_rate, decimation=audio_decim_rate, taps=None, fractional_bw=None, ) self.gr_rds_parser_0 = rds.parser(False, True) self.gr_rds_panel_0 = rds.rdsPanel(freq, self.GetWin()) self.Add(self.gr_rds_panel_0.panel) self.gr_rds_decoder_0 = rds.decoder(False, False) self.freq_xlating_fir_filter_xxx_1 = filter.freq_xlating_fir_filter_fcc(audio_decim, (firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING)), 57e3, baseband_rate) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(1, (firdes.low_pass(1, samp_rate, xlate_bandwidth, 100000)), freq_offset, samp_rate) self.fir_filter_xxx_5 = filter.fir_filter_fff(audio_decim, (firdes.low_pass(1.0,baseband_rate,20e3,40e3,firdes.WIN_HAMMING))) self.fir_filter_xxx_5.declare_sample_delay(0) self.fir_filter_xxx_3 = filter.fir_filter_fff(1, (firdes.band_pass(1.0,baseband_rate,38e3-13e3,38e3+13e3,3e3,firdes.WIN_HAMMING))) self.fir_filter_xxx_3.declare_sample_delay(0) self.fir_filter_xxx_2 = filter.fir_filter_fcc(1, (firdes.complex_band_pass(1.0,baseband_rate,19e3-500,19e3+500,1e3,firdes.WIN_HAMMING))) self.fir_filter_xxx_2.declare_sample_delay(0) self.fir_filter_xxx_1 = filter.fir_filter_fff(audio_decim, (firdes.low_pass(1.0,baseband_rate,13e3,3e3,firdes.WIN_HAMMING))) self.fir_filter_xxx_1.declare_sample_delay(0) self.digital_mpsk_receiver_cc_0 = digital.mpsk_receiver_cc(2, 0, 1*cmath.pi/100.0, -0.06, 0.06, 0.5, 0.05, samp_rate/bb_decim/audio_decim/ 2375.0, 0.001, 0.005) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(2) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_float*1) self.blocks_multiply_xx_1 = blocks.multiply_vcc(1) self.blocks_multiply_xx_0 = blocks.multiply_vff(1) self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff((10**(1.*(volume+15)/10), )) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((10**(1.*(volume+15)/10), )) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n(gr.sizeof_char*1, 2) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_complex_to_imag_0 = blocks.complex_to_imag(1) self.blocks_add_xx_0 = blocks.add_vff(1) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=samp_rate, audio_decimation=bb_decim, ) self.analog_pll_refout_cc_0 = analog.pll_refout_cc(0.001, 2 * math.pi * (19000+200) / baseband_rate, 2 * math.pi * (19000-200) / baseband_rate) self.analog_fm_deemph_0_0_0 = analog.fm_deemph(fs=audio_decim_rate, tau=75e-6) self.analog_fm_deemph_0_0 = analog.fm_deemph(fs=audio_decim_rate, tau=75e-6) ################################################## # Connections ################################################## self.connect((self.fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_add_xx_0, 0)) self.connect((self.fir_filter_xxx_3, 0), (self.wxgui_fftsink2_0_0_0_1, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.fir_filter_xxx_5, 0)) self.connect((self.analog_fm_deemph_0_0_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.analog_fm_deemph_0_0_0, 0)) self.connect((self.blocks_sub_xx_0, 0), (self.analog_fm_deemph_0_0, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.wxgui_fftsink2_0_0_0_1_0_0, 0)) self.connect((self.fir_filter_xxx_5, 0), (self.blocks_add_xx_0, 1)) self.connect((self.fir_filter_xxx_5, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.fir_filter_xxx_3, 0), (self.blocks_multiply_xx_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.analog_fm_deemph_0_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.rational_resampler_xxx_0_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.fir_filter_xxx_1, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_fftsink2_0_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.fir_filter_xxx_3, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.fir_filter_xxx_2, 0)) self.connect((self.fir_filter_xxx_2, 0), (self.analog_pll_refout_cc_0, 0)) self.connect((self.analog_pll_refout_cc_0, 0), (self.blocks_multiply_xx_1, 1)) self.connect((self.analog_pll_refout_cc_0, 0), (self.blocks_multiply_xx_1, 0)) self.connect((self.blocks_multiply_xx_1, 0), (self.blocks_complex_to_imag_0, 0)) self.connect((self.blocks_complex_to_imag_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.blocks_complex_to_imag_0, 0), (self.blocks_multiply_xx_0, 1)) self.connect((self.analog_wfm_rcv_0, 0), (self.freq_xlating_fir_filter_xxx_1, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0_1_0_1, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.digital_mpsk_receiver_cc_0, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.digital_diff_decoder_bb_0, 0)) self.connect((self.rtlsdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) self.connect((self.digital_diff_decoder_bb_0, 0), (self.gr_rds_decoder_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_null_sink_0, 0)) self.connect((self.rational_resampler_xxx_0_0, 0), (self.blocks_null_sink_0, 1)) ################################################## # Asynch Message Connections ################################################## self.msg_connect(self.gr_rds_decoder_0, "out", self.gr_rds_parser_0, "in") self.msg_connect(self.gr_rds_parser_0, "out", self.gr_rds_panel_0, "in")
def __init__(self, frame, panel, vbox, argv): stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv) self.frame = frame self.panel = panel parser = OptionParser(option_class=eng_option) parser.add_option("-w", "--which", type="int", default=0, help="select which USRP (0, 1, ...) default is %default", metavar="NUM") parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=None, help="select USRP Rx side A or B (default=first one with a daughterboard)") parser.add_option("-A", "--antenna", default=None, help="select Rx Antenna (only on RFX-series boards)") 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("-W", "--waterfall", action="store_true", default=False, help="Enable waterfall display") parser.add_option("-8", "--width-8", action="store_true", default=False, help="Enable 8-bit samples across USB") parser.add_option( "--no-hb", action="store_true", default=False, help="don't use halfband filter in usrp") parser.add_option("-S", "--oscilloscope", action="store_true", default=False, help="Enable oscilloscope display") parser.add_option("", "--avg-alpha", type="eng_float", default=1e-1, help="Set fftsink averaging factor, [default=%default]") parser.add_option("", "--ref-scale", type="eng_float", default=13490.0, help="Set dBFS=0dB input value, [default=%default]") parser.add_option("", "--fft-size", type="int", default=1024, help="Set FFT frame size, [default=%default]"); (options, args) = parser.parse_args() if len(args) != 0: parser.print_help() sys.exit(1) self.options = options self.show_debug_info = True # build the graph if options.no_hb or (options.decim<8): #Min decimation of this firmware is 4. #contains 4 Rx paths without halfbands and 0 tx paths. self.fpga_filename="std_4rx_0tx.rbf" self.u = usrp.source_c(which=options.which, decim_rate=options.decim, fpga_filename=self.fpga_filename) else: #Min decimation of standard firmware is 8. #standard fpga firmware "std_2rxhb_2tx.rbf" #contains 2 Rx paths with halfband filters and 2 tx paths (the default) self.u = usrp.source_c(which=options.which, decim_rate=options.decim) 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)) if options.width_8: width = 8 shift = 8 format = self.u.make_format(width, shift) print "format =", hex(format) r = self.u.set_format(format) print "set_format =", r # determine the daughterboard subdevice we're using self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec) input_rate = self.u.adc_freq() / self.u.decim_rate() if options.waterfall: self.scope = \ waterfallsink2.waterfall_sink_f (panel, fft_size=options.fft_size, sample_rate=input_rate) elif options.oscilloscope: self.scope = scopesink2.scope_sink_f(panel, sample_rate=input_rate) #v_scale, t_scale, v_offset, frame_rate else: self.scope = fftsink2.fft_sink_f (panel, fft_size=options.fft_size, sample_rate=input_rate, ref_scale=options.ref_scale, ref_level=0.0, y_divs = 10, avg_alpha=options.avg_alpha) self.MAG = gr.complex_to_mag() # AM self.connect(self.u, self.MAG, self.scope) self._build_gui(vbox) self._setup_events() # 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 options.antenna is not None: #print "Selecting antenna %s" % (options.antenna,) #self.subdev.select_rx_antenna(options.antenna) self.set_antenna(options.antenna) if self.show_debug_info: self.myform['decim'].set_value(self.u.decim_rate()) self.myform['fs@usb'].set_value(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 __init__(self): grc_wxgui.top_block_gui.__init__( self, title="Stereo FM receiver and RDS Decoder") ################################################## # Variables ################################################## self.freq_offset = freq_offset = 250000 self.freq = freq = 97e6 self.volume = volume = -3 self.samp_rate = samp_rate = 2000000 self.gain = gain = 20 self.freq_tune = freq_tune = freq - freq_offset ################################################## # Blocks ################################################## _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label='Volume', converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=-20, maximum=10, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_volume_sizer, 0, 1, 1, 1) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "BB") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Demod") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Waterfall") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L+R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L-R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Const") self.GridAdd(self.nb, 2, 0, 1, 2) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label='RF Gain', converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 0, 0, 1, 1) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label='Freq', converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=88e6, maximum=107.9e6, num_steps=200, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_freq_sizer, 1, 0, 1, 2) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=250000, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.nb.GetPage(2).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(6).GetWin(), title='Scope Plot', sample_rate=2375 * 4, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.nb.GetPage(6).Add(self.wxgui_scopesink2_1.win) self.wxgui_fftsink2_0_0_0_1_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(5).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=19000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='RDS', peak_hold=False, ) self.nb.GetPage(5).Add(self.wxgui_fftsink2_0_0_0_1_0_1.win) self.wxgui_fftsink2_0_0_0_1 = fftsink2.fft_sink_f( self.nb.GetPage(4).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L-R', peak_hold=False, ) self.nb.GetPage(4).Add(self.wxgui_fftsink2_0_0_0_1.win) self.wxgui_fftsink2_0_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(3).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L+R', peak_hold=False, ) self.nb.GetPage(3).Add(self.wxgui_fftsink2_0_0_0.win) self.wxgui_fftsink2_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=250000, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='FM Demod', peak_hold=False, ) self.nb.GetPage(1).Add(self.wxgui_fftsink2_0_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-30, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='Baseband', peak_hold=False, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0.win) self.rtlsdr_source_0_0 = osmosdr.source(args="numchan=" + str(1) + " " + '') self.rtlsdr_source_0_0.set_sample_rate(samp_rate) self.rtlsdr_source_0_0.set_center_freq(freq_tune, 0) self.rtlsdr_source_0_0.set_freq_corr(0, 0) self.rtlsdr_source_0_0.set_dc_offset_mode(0, 0) self.rtlsdr_source_0_0.set_iq_balance_mode(0, 0) self.rtlsdr_source_0_0.set_gain_mode(False, 0) self.rtlsdr_source_0_0.set_gain(14, 0) self.rtlsdr_source_0_0.set_if_gain(24, 0) self.rtlsdr_source_0_0.set_bb_gain(gain, 0) self.rtlsdr_source_0_0.set_antenna('', 0) self.rtlsdr_source_0_0.set_bandwidth(0, 0) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf( 2, firdes.root_raised_cosine(1, 19000, 2375, 1, 100)) self.rftap_rftap_encap_0 = rftap.rftap_encap(3, -1, 'rds') self.pfb_arb_resampler_xxx_1 = pfb.arb_resampler_fff(240000.0 / 250000, taps=None, flt_size=32) self.pfb_arb_resampler_xxx_1.declare_sample_delay(0) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(19000 / 250e3, taps=None, flt_size=32) self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) self.gr_rds_parser_0 = rds.parser(True, False, 0) self.gr_rds_panel_0 = rds.rdsPanel(freq, self.GetWin()) self.Add(self.gr_rds_panel_0.panel) self.gr_rds_decoder_0 = rds.decoder(False, False) self.freq_xlating_fir_filter_xxx_2 = filter.freq_xlating_fir_filter_fcf( 5, (firdes.low_pass(1.0, 240000, 13e3, 3e3, firdes.WIN_HAMMING)), 38000, 240000) self.freq_xlating_fir_filter_xxx_1_0 = filter.freq_xlating_fir_filter_fcc( 1, (firdes.low_pass(2500.0, 250000, 2.6e3, 2e3, firdes.WIN_HAMMING)), 57e3, 250000) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc( 1, (firdes.low_pass(1, samp_rate, 80000, 20000)), freq_offset, samp_rate) self.fir_filter_xxx_1 = filter.fir_filter_fff( 5, (firdes.low_pass(1.0, 240000, 13e3, 3e3, firdes.WIN_HAMMING))) self.fir_filter_xxx_1.declare_sample_delay(0) self.digital_psk_demod_0 = digital.psk.psk_demod( constellation_points=2, differential=False, samples_per_symbol=4, excess_bw=0.35, phase_bw=6.28 / 100.0, timing_bw=6.28 / 100.0, mod_code="gray", verbose=False, log=False, ) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(2) self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", '127.0.0.1', '52001', 10000, False) self.blocks_pdu_set_0 = blocks.pdu_set(pmt.to_pmt("nomfreq"), pmt.to_pmt(freq)) self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff( (10**(1. * (volume) / 10), )) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff( (10**(1. * (volume) / 10), )) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n( gr.sizeof_char * 1, 2) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_add_xx_0 = blocks.add_vff(1) self.audio_sink_0 = audio.sink(48000, '', True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=samp_rate, audio_decimation=8, ) self.analog_fm_deemph_0_0_0 = analog.fm_deemph(fs=48000, tau=75e-6) self.analog_fm_deemph_0_0 = analog.fm_deemph(fs=48000, tau=75e-6) ################################################## # Connections ################################################## self.msg_connect((self.blocks_pdu_set_0, 'pdus'), (self.rftap_rftap_encap_0, 'in')) self.msg_connect((self.gr_rds_decoder_0, 'out'), (self.blocks_pdu_set_0, 'pdus')) self.msg_connect((self.gr_rds_decoder_0, 'out'), (self.gr_rds_parser_0, 'in')) self.msg_connect((self.gr_rds_parser_0, 'out'), (self.gr_rds_panel_0, 'in')) self.msg_connect((self.rftap_rftap_encap_0, 'out'), (self.blocks_socket_pdu_0, 'pdus')) self.connect((self.analog_fm_deemph_0_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) self.connect((self.analog_fm_deemph_0_0_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.freq_xlating_fir_filter_xxx_1_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.pfb_arb_resampler_xxx_1, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_fftsink2_0_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.analog_fm_deemph_0_0_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_add_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.wxgui_fftsink2_0_0_0_1, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.digital_diff_decoder_bb_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.audio_sink_0, 1)) self.connect((self.blocks_sub_xx_0, 0), (self.analog_fm_deemph_0_0, 0)) self.connect((self.digital_diff_decoder_bb_0, 0), (self.gr_rds_decoder_0, 0)) self.connect((self.digital_psk_demod_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_add_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1_0, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_2, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.wxgui_fftsink2_0_0_0_1_0_1, 0)) self.connect((self.pfb_arb_resampler_xxx_1, 0), (self.fir_filter_xxx_1, 0)) self.connect((self.pfb_arb_resampler_xxx_1, 0), (self.freq_xlating_fir_filter_xxx_2, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.digital_psk_demod_0, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.rtlsdr_source_0_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="TX Test") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.sampno = sampno = 32 self.samp_rate_1 = samp_rate_1 = sampno * 1e3 self.sigsource = sigsource = 100 self.samp_rate = samp_rate = int(samp_rate_1) self.carfreqno = carfreqno = 1 self.carfreq_1 = carfreq_1 = 1 self.bbfreqno = bbfreqno = 1 self.bbfreq_1 = bbfreq_1 = 1 self.bb_amp = bb_amp = 0 ################################################## # Blocks ################################################## self._bbfreqno_text_box = forms.text_box( parent=self.GetWin(), value=self.bbfreqno, callback=self.set_bbfreqno, label='Baseband Frequency', converter=forms.float_converter(), ) self.GridAdd(self._bbfreqno_text_box, 0, 0, 1, 1) self._sigsource_chooser = forms.drop_down( parent=self.GetWin(), value=self.sigsource, callback=self.set_sigsource, label='Signal Source', choices=[100, 101, 102, 103, 104, 105], labels=[ 'Constant', 'Sine Wave', 'Cosine Wave', 'Square', 'Triange', 'Saw Tooth' ], ) self.GridAdd(self._sigsource_chooser, 7, 0, 1, 1) self._sampno_text_box = forms.text_box( parent=self.GetWin(), value=self.sampno, callback=self.set_sampno, label='Sample Rate', converter=forms.float_converter(), ) self.GridAdd(self._sampno_text_box, 4, 0, 1, 1) self.notebook = self.notebook = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.notebook.AddPage(grc_wxgui.Panel(self.notebook), "Scope Sink") self.notebook.AddPage(grc_wxgui.Panel(self.notebook), "FFT Sink") self.notebook.AddPage(grc_wxgui.Panel(self.notebook), "Histo Sink") self.notebook.AddPage(grc_wxgui.Panel(self.notebook), "Waterfall Sink") self.notebook.AddPage(grc_wxgui.Panel(self.notebook), "Constellation Sink") self.GridAdd(self.notebook, 8, 0, 1, 1) self._carfreqno_text_box = forms.text_box( parent=self.GetWin(), value=self.carfreqno, callback=self.set_carfreqno, label='Carrier Frequency', converter=forms.float_converter(), ) self.GridAdd(self._carfreqno_text_box, 2, 0, 1, 1) self._bbfreq_1_chooser = forms.radio_buttons( parent=self.GetWin(), value=self.bbfreq_1, callback=self.set_bbfreq_1, label=' ', choices=[bbfreqno, bbfreqno * 1e3, bbfreqno * 1e6, bbfreqno * 1e9], labels=['Hz', 'kHz', 'MHz', 'GHz'], style=wx.RA_HORIZONTAL, ) self.GridAdd(self._bbfreq_1_chooser, 1, 0, 1, 1) _bb_amp_sizer = wx.BoxSizer(wx.VERTICAL) self._bb_amp_text_box = forms.text_box( parent=self.GetWin(), sizer=_bb_amp_sizer, value=self.bb_amp, callback=self.set_bb_amp, label='Baseband Amplitude', converter=forms.float_converter(), proportion=0, ) self._bb_amp_slider = forms.slider( parent=self.GetWin(), sizer=_bb_amp_sizer, value=self.bb_amp, callback=self.set_bb_amp, minimum=-1, maximum=1, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_bb_amp_sizer, 6, 0, 1, 1) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.notebook.GetPage(3).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', win=window.hanning, ) self.notebook.GetPage(3).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_f( self.notebook.GetPage(0).GetWin(), title='Scope Plot', sample_rate=samp_rate, v_scale=0, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.notebook.GetPage(0).Add(self.wxgui_scopesink2_0.win) self.wxgui_histosink2_0 = histosink_gl.histo_sink_f( self.notebook.GetPage(2).GetWin(), title='Histogram Plot', num_bins=27, frame_size=1000, ) self.notebook.GetPage(2).Add(self.wxgui_histosink2_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_f( self.notebook.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='FFT Plot', peak_hold=False, win=window.flattop, ) self.notebook.GetPage(1).Add(self.wxgui_fftsink2_0.win) self.wxgui_constellationsink2_0 = constsink_gl.const_sink_c( self.notebook.GetPage(4).GetWin(), title='Constellation Plot', sample_rate=samp_rate, frame_rate=5, const_size=2048, M=4, theta=0, loop_bw=6.28 / 100.0, fmax=0.06, mu=0.5, gain_mu=0.005, symbol_rate=samp_rate / 4., omega_limit=0.005, ) self.notebook.GetPage(4).Add(self.wxgui_constellationsink2_0.win) self._samp_rate_1_chooser = forms.radio_buttons( parent=self.GetWin(), value=self.samp_rate_1, callback=self.set_samp_rate_1, label=' ', choices=[sampno, sampno * 1e3, sampno * 1e6, sampno * 1e9], labels=['sp/s', 'ksp/s', 'msp/s', 'gsp/s'], style=wx.RA_HORIZONTAL, ) self.GridAdd(self._samp_rate_1_chooser, 5, 0, 1, 1) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=int(samp_rate / 32000), decimation=1, taps=None, fractional_bw=None, ) self._carfreq_1_chooser = forms.radio_buttons( parent=self.GetWin(), value=self.carfreq_1, callback=self.set_carfreq_1, label=' ', choices=[ carfreqno, carfreqno * 1e3, carfreqno * 1e6, carfreqno * 1e9 ], labels=['Hz', 'kHz', 'MHz', 'GHz'], style=wx.RA_HORIZONTAL, ) self.GridAdd(self._carfreq_1_chooser, 3, 0, 1, 1) self.blocks_float_to_complex_0 = blocks.float_to_complex(1) self.analog_sig_source_x_0 = analog.sig_source_f( 32e3, sigsource, bbfreq_1, bb_amp, 0) ################################################## # Connections ################################################## self.connect((self.analog_sig_source_x_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.blocks_float_to_complex_0, 0), (self.wxgui_constellationsink2_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_float_to_complex_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_histosink2_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_waterfallsink2_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="RPi4 FM S RDS") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 2e6 self.sampleOut = sampleOut = 30000 self.quadrature = quadrature = samp_rate / 10 self.frekvenca = frekvenca = 106900000 ################################################## # Blocks ################################################## self.nbook = self.nbook = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nbook.AddPage(grc_wxgui.Panel(self.nbook), "Vhodni Spekter") self.nbook.AddPage(grc_wxgui.Panel(self.nbook), "MPX spekter") self.nbook.AddPage(grc_wxgui.Panel(self.nbook), "MPX slap") self.nbook.AddPage(grc_wxgui.Panel(self.nbook), "L+R") self.nbook.AddPage(grc_wxgui.Panel(self.nbook), "L-R") self.nbook.AddPage(grc_wxgui.Panel(self.nbook), "RDS spekter") self.nbook.AddPage(grc_wxgui.Panel(self.nbook), "RDS scope") self.Add(self.nbook) _frekvenca_sizer = wx.BoxSizer(wx.VERTICAL) self._frekvenca_text_box = forms.text_box( parent=self.GetWin(), sizer=_frekvenca_sizer, value=self.frekvenca, callback=self.set_frekvenca, label='Frekvenca', converter=forms.float_converter(), proportion=0, ) self._frekvenca_slider = forms.slider( parent=self.GetWin(), sizer=_frekvenca_sizer, value=self.frekvenca, callback=self.set_frekvenca, minimum=80000000, maximum=110000000, num_steps=1000, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Add(_frekvenca_sizer) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nbook.GetPage(2).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=1.0, sample_rate=140000, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.nbook.GetPage(2).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nbook.GetPage(6).GetWin(), title='Scope Plot', sample_rate=2375 * 4, v_scale=0.0004, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.nbook.GetPage(6).Add(self.wxgui_scopesink2_1.win) self.wxgui_fftsink2_3 = fftsink2.fft_sink_c( self.nbook.GetPage(5).GetWin(), baseband_freq=57000, y_per_div=10, y_divs=10, ref_level=-70, ref_scale=2.0, sample_rate=19000, fft_size=1024, fft_rate=15, average=False, avg_alpha=0.1333, title='FFT Plot', peak_hold=False, ) self.nbook.GetPage(5).Add(self.wxgui_fftsink2_3.win) self.wxgui_fftsink2_2 = fftsink2.fft_sink_c( self.nbook.GetPage(0).GetWin(), baseband_freq=frekvenca, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.1333, title='SDR sprejem', peak_hold=False, ) self.nbook.GetPage(0).Add(self.wxgui_fftsink2_2.win) self.wxgui_fftsink2_1 = fftsink2.fft_sink_f( self.nbook.GetPage(3).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=sampleOut, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.1333, title='L+R', peak_hold=False, ) self.nbook.GetPage(3).Add(self.wxgui_fftsink2_1.win) self.wxgui_fftsink2_0_0_0_1 = fftsink2.fft_sink_f( self.nbook.GetPage(4).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=30000, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.1333, title='L-R', peak_hold=False, ) self.nbook.GetPage(4).Add(self.wxgui_fftsink2_0_0_0_1.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_f( self.nbook.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=140000, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.1333, title='MPX spectrum', peak_hold=False, win=window.hamming, ) self.nbook.GetPage(1).Add(self.wxgui_fftsink2_0.win) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf( 2, firdes.root_raised_cosine(1, 19000, 2375, .35, 100)) self.rational_resampler_xxx_1 = filter.rational_resampler_fff( interpolation=140, decimation=280, taps=None, fractional_bw=None, ) self.rational_resampler_xxx_0_0 = filter.rational_resampler_fff( interpolation=sampleOut / 1000, decimation=40, taps=None, fractional_bw=None, ) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=sampleOut / 1000, decimation=int(quadrature / 1000), taps=None, fractional_bw=None, ) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(19000 / quadrature, taps=None, flt_size=32) self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) self.osmosdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + '') self.osmosdr_source_0.set_sample_rate(samp_rate) self.osmosdr_source_0.set_center_freq(frekvenca, 0) self.osmosdr_source_0.set_freq_corr(0, 0) self.osmosdr_source_0.set_dc_offset_mode(2, 0) self.osmosdr_source_0.set_iq_balance_mode(0, 0) self.osmosdr_source_0.set_gain_mode(False, 0) self.osmosdr_source_0.set_gain(10, 0) self.osmosdr_source_0.set_if_gain(20, 0) self.osmosdr_source_0.set_bb_gain(20, 0) self.osmosdr_source_0.set_antenna('', 0) self.osmosdr_source_0.set_bandwidth(0, 0) self.low_pass_filter_0 = filter.fir_filter_ccf( 10, firdes.low_pass(1, samp_rate, 75000, 25000, firdes.WIN_HAMMING, 6.76)) self.gr_rds_parser_0 = rds.parser(True, False, 0) self.gr_rds_panel_0 = rds.rdsPanel(frekvenca, self.GetWin()) self.Add(self.gr_rds_panel_0.panel) self.gr_rds_decoder_0 = rds.decoder(False, False) self.freq_xlating_fir_filter_xxx_2 = filter.freq_xlating_fir_filter_fcf( 5, (firdes.low_pass(1.0, 200000, 13e3, 3e3, firdes.WIN_HAMMING)), 38000, 200000) self.digital_psk_demod_0 = digital.psk.psk_demod( constellation_points=2, differential=False, samples_per_symbol=4, excess_bw=0.35, phase_bw=6.28 / 100.0, timing_bw=6.28 / 100.0, mod_code="gray", verbose=False, log=False, ) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(2) self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n( gr.sizeof_char * 1, 2) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_add_xx_0 = blocks.add_vff(1) self.audio_sink_0 = audio.sink(sampleOut, 'hw:0,0', True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=quadrature, audio_decimation=1, ) self.analog_fm_deemph_0_0_0 = analog.fm_deemph(fs=sampleOut, tau=75e-6) self.analog_fm_deemph_0_0 = analog.fm_deemph(fs=sampleOut, tau=75e-6) self.aa = filter.freq_xlating_fir_filter_fcc( 1, (filter.firdes.low_pass_2(1, samp_rate / 10, 2000, 500, 60)), 57000, quadrature) ################################################## # Connections ################################################## self.msg_connect((self.gr_rds_decoder_0, 'out'), (self.gr_rds_parser_0, 'in')) self.msg_connect((self.gr_rds_parser_0, 'out'), (self.gr_rds_panel_0, 'in')) self.connect((self.aa, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.analog_fm_deemph_0_0, 0), (self.audio_sink_0, 0)) self.connect((self.analog_fm_deemph_0_0_0, 0), (self.audio_sink_0, 1)) self.connect((self.analog_wfm_rcv_0, 0), (self.aa, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.freq_xlating_fir_filter_xxx_2, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_1, 0)) self.connect((self.blocks_add_xx_0, 0), (self.analog_fm_deemph_0_0_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.rational_resampler_xxx_0_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.digital_diff_decoder_bb_0, 0)) self.connect((self.blocks_sub_xx_0, 0), (self.analog_fm_deemph_0_0, 0)) self.connect((self.digital_diff_decoder_bb_0, 0), (self.gr_rds_decoder_0, 0)) self.connect((self.digital_psk_demod_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_2, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.wxgui_fftsink2_2, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.wxgui_fftsink2_3, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_add_xx_0, 1)) self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_fftsink2_1, 0)) self.connect((self.rational_resampler_xxx_0_0, 0), (self.blocks_add_xx_0, 0)) self.connect((self.rational_resampler_xxx_0_0, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.rational_resampler_xxx_0_0, 0), (self.wxgui_fftsink2_0_0_0_1, 0)) self.connect((self.rational_resampler_xxx_1, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.rational_resampler_xxx_1, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.digital_psk_demod_0, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.wxgui_scopesink2_1, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__( self, title="Stereo FM receiver and RDS Decoder") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.freq_offset = freq_offset = 250000 self.freq = freq = 105.3e6 self.volume = volume = -3 self.samp_rate = samp_rate = 2000000 self.gain = gain = 20 self.freq_tune = freq_tune = freq - freq_offset ################################################## # Blocks ################################################## _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label='Volume', converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=-20, maximum=10, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_volume_sizer, 0, 1, 1, 1) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "BB") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Demod") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Waterfall") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L+R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L-R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Const") self.GridAdd(self.nb, 2, 0, 1, 2) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label='RF Gain', converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 0, 0, 1, 1) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=250000, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.nb.GetPage(2).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(6).GetWin(), title='Scope Plot', sample_rate=2375 * 4, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.nb.GetPage(6).Add(self.wxgui_scopesink2_1.win) self.wxgui_fftsink2_0_0_0_1_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(5).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=19000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='RDS', peak_hold=False, ) self.nb.GetPage(5).Add(self.wxgui_fftsink2_0_0_0_1_0_1.win) self.wxgui_fftsink2_0_0_0_1 = fftsink2.fft_sink_f( self.nb.GetPage(4).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L-R', peak_hold=False, ) self.nb.GetPage(4).Add(self.wxgui_fftsink2_0_0_0_1.win) self.wxgui_fftsink2_0_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(3).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L+R', peak_hold=False, ) self.nb.GetPage(3).Add(self.wxgui_fftsink2_0_0_0.win) self.wxgui_fftsink2_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=250000, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='FM Demod', peak_hold=False, ) self.nb.GetPage(1).Add(self.wxgui_fftsink2_0_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-30, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='Baseband', peak_hold=False, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0.win) self.rtlsdr_source_0_0 = osmosdr.source(args="numchan=" + str(1) + " " + '') self.rtlsdr_source_0_0.set_sample_rate(samp_rate) self.rtlsdr_source_0_0.set_center_freq(freq_tune, 0) self.rtlsdr_source_0_0.set_freq_corr(0, 0) self.rtlsdr_source_0_0.set_dc_offset_mode(0, 0) self.rtlsdr_source_0_0.set_iq_balance_mode(0, 0) self.rtlsdr_source_0_0.set_gain_mode(False, 0) self.rtlsdr_source_0_0.set_gain(14, 0) self.rtlsdr_source_0_0.set_if_gain(24, 0) self.rtlsdr_source_0_0.set_bb_gain(gain, 0) self.rtlsdr_source_0_0.set_antenna('', 0) self.rtlsdr_source_0_0.set_bandwidth(0, 0) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf( 2, firdes.root_raised_cosine(1, 19000, 2375, .35, 100)) self.pfb_arb_resampler_xxx_1 = pfb.arb_resampler_fff(240000.0 / 250000, taps=None, flt_size=32) self.pfb_arb_resampler_xxx_1.declare_sample_delay(0) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(19000 / 250e3, taps=None, flt_size=32) self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) self.freq_xlating_fir_filter_xxx_2 = filter.freq_xlating_fir_filter_fcf( 5, (firdes.low_pass(1.0, 240000, 13e3, 3e3, firdes.WIN_HAMMING)), 38000, 240000) self.freq_xlating_fir_filter_xxx_1_0 = filter.freq_xlating_fir_filter_fcc( 1, (firdes.low_pass(2500.0, 250000, 2.6e3, 2e3, firdes.WIN_HAMMING)), 57e3, 250000) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc( 1, (firdes.low_pass(1, samp_rate, 80000, 20000)), freq_offset, samp_rate) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label='Freq', converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=88e6, maximum=108e6, num_steps=200, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_freq_sizer, 1, 0, 1, 2) self.fir_filter_xxx_1 = filter.fir_filter_fff( 5, (firdes.low_pass(1.0, 240000, 13e3, 3e3, firdes.WIN_HAMMING))) self.fir_filter_xxx_1.declare_sample_delay(0) self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff( (10**(1. * (volume) / 10), )) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff( (10**(1. * (volume) / 10), )) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_add_xx_0 = blocks.add_vff(1) self.audio_sink_0 = audio.sink(48000, '', True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=samp_rate, audio_decimation=8, ) self.analog_fm_deemph_0_0_0 = analog.fm_deemph(fs=48000, tau=75e-6) self.analog_fm_deemph_0_0 = analog.fm_deemph(fs=48000, tau=75e-6) ################################################## # Connections ################################################## self.connect((self.analog_fm_deemph_0_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) self.connect((self.analog_fm_deemph_0_0_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.freq_xlating_fir_filter_xxx_1_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.pfb_arb_resampler_xxx_1, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_fftsink2_0_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.analog_fm_deemph_0_0_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_add_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.wxgui_fftsink2_0_0_0_1, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.audio_sink_0, 1)) self.connect((self.blocks_sub_xx_0, 0), (self.analog_fm_deemph_0_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_add_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1_0, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_2, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.wxgui_fftsink2_0_0_0_1_0_1, 0)) self.connect((self.pfb_arb_resampler_xxx_1, 0), (self.fir_filter_xxx_1, 0)) self.connect((self.pfb_arb_resampler_xxx_1, 0), (self.freq_xlating_fir_filter_xxx_2, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.rtlsdr_source_0_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__( self, title="Stereo FM receiver and RDS Decoder") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.freq_offset = freq_offset = 250000 self.freq = freq = 95.8e6 self.volume = volume = -3 self.samp_rate = samp_rate = 1e6 self.gain = gain = 20 self.freq_tune = freq_tune = freq - freq_offset self.capture_base_freq = capture_base_freq = 88e6 ################################################## # Blocks ################################################## _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label='Volume', converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=-20, maximum=10, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_volume_sizer, 0, 1, 1, 1) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "BB") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Demod") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Waterfall") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L+R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "L-R") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Const") self.nb.AddPage(grc_wxgui.Panel(self.nb), "x") self.nb.AddPage(grc_wxgui.Panel(self.nb), "y") self.GridAdd(self.nb, 2, 0, 1, 2) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label='Freq', converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=88e6, maximum=108e6, num_steps=800, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_freq_sizer, 1, 0, 1, 2) self.wxgui_waterfallsink2_1 = waterfallsink2.waterfall_sink_c( self.nb.GetPage(8).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.nb.GetPage(8).Add(self.wxgui_waterfallsink2_1.win) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(2).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=250000, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.nb.GetPage(2).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(6).GetWin(), title='Scope Plot', sample_rate=2375 * 4, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.nb.GetPage(6).Add(self.wxgui_scopesink2_1.win) self.wxgui_fftsink2_1 = fftsink2.fft_sink_c( self.nb.GetPage(7).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='FFT Plot', peak_hold=False, ) self.nb.GetPage(7).Add(self.wxgui_fftsink2_1.win) self.wxgui_fftsink2_0_0_0_1_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(5).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=19000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='RDS', peak_hold=False, ) self.nb.GetPage(5).Add(self.wxgui_fftsink2_0_0_0_1_0_1.win) self.wxgui_fftsink2_0_0_0_1 = fftsink2.fft_sink_f( self.nb.GetPage(4).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L-R', peak_hold=False, ) self.nb.GetPage(4).Add(self.wxgui_fftsink2_0_0_0_1.win) self.wxgui_fftsink2_0_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(3).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=48000, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='L+R', peak_hold=False, ) self.nb.GetPage(3).Add(self.wxgui_fftsink2_0_0_0.win) self.wxgui_fftsink2_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=250000, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='FM Demod', peak_hold=False, ) self.nb.GetPage(1).Add(self.wxgui_fftsink2_0_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-30, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title='Baseband', peak_hold=False, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0.win) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf( 2, firdes.root_raised_cosine(1, 19000, 2375, .35, 100)) self.pfb_arb_resampler_xxx_1 = pfb.arb_resampler_fff(240000.0 / 250000, taps=None, flt_size=32) self.pfb_arb_resampler_xxx_1.declare_sample_delay(0) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(19000 / 250e3, taps=None, flt_size=32) self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) self.gr_rds_parser_0 = rds.parser(True, False, 0) self.gr_rds_panel_0 = rds.rdsPanel(freq, self.GetWin()) self.Add(self.gr_rds_panel_0.panel) self.gr_rds_decoder_0 = rds.decoder(False, False) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label='RF Gain', converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 0, 0, 1, 1) self.freq_xlating_fir_filter_xxx_2 = filter.freq_xlating_fir_filter_fcf( 5, (firdes.low_pass(1.0, 240000, 13e3, 3e3, firdes.WIN_HAMMING)), 38000, 240000) self.freq_xlating_fir_filter_xxx_1_0 = filter.freq_xlating_fir_filter_fcc( 1, (firdes.low_pass(2500.0, 250000, 2.6e3, 2e3, firdes.WIN_HAMMING)), 57e3, 250000) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc( 1, (firdes.low_pass(1, samp_rate, 80000, 20000)), freq_offset, samp_rate) self.fir_filter_xxx_1 = filter.fir_filter_fff( 5, (firdes.low_pass(1.0, 240000, 13e3, 3e3, firdes.WIN_HAMMING))) self.fir_filter_xxx_1.declare_sample_delay(0) self.digital_psk_demod_0 = digital.psk.psk_demod( constellation_points=2, differential=False, samples_per_symbol=4, excess_bw=0.35, phase_bw=6.28 / 100.0, timing_bw=6.28 / 100.0, mod_code="gray", verbose=False, log=False, ) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(2) self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff( (10**(1. * (volume) / 10), )) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff( (10**(1. * (volume) / 10), )) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n( gr.sizeof_char * 1, 2) self.blocks_file_source_0 = blocks.file_source( gr.sizeof_gr_complex * 1, '/home/deepstar/Projects/OverTheWire/advent2019/advent2019/steven/northpole-airwaves/northpole-airwaves.wav', True) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_add_xx_0 = blocks.add_vff(1) self.audio_sink_0 = audio.sink(48000, '', True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=samp_rate, audio_decimation=int(samp_rate / (250e3)), ) self.analog_sig_source_x_0 = analog.sig_source_c( samp_rate, analog.GR_COS_WAVE, freq - capture_base_freq, 1, 0) self.analog_fm_deemph_0_0_0 = analog.fm_deemph(fs=48000, tau=75e-6) self.analog_fm_deemph_0_0 = analog.fm_deemph(fs=48000, tau=75e-6) ################################################## # Connections ################################################## self.msg_connect((self.gr_rds_decoder_0, 'out'), (self.gr_rds_parser_0, 'in')) self.msg_connect((self.gr_rds_parser_0, 'out'), (self.gr_rds_panel_0, 'in')) self.connect((self.analog_fm_deemph_0_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) self.connect((self.analog_fm_deemph_0_0_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 1)) self.connect((self.analog_wfm_rcv_0, 0), (self.freq_xlating_fir_filter_xxx_1_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.pfb_arb_resampler_xxx_1, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_fftsink2_0_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.analog_fm_deemph_0_0_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_add_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.blocks_complex_to_real_0, 0), (self.wxgui_fftsink2_0_0_0_1, 0)) self.connect((self.blocks_file_source_0, 0), (self.blocks_multiply_xx_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.digital_diff_decoder_bb_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.audio_sink_0, 1)) self.connect((self.blocks_multiply_xx_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.wxgui_fftsink2_1, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.wxgui_waterfallsink2_1, 0)) self.connect((self.blocks_sub_xx_0, 0), (self.analog_fm_deemph_0_0, 0)) self.connect((self.digital_diff_decoder_bb_0, 0), (self.gr_rds_decoder_0, 0)) self.connect((self.digital_psk_demod_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_add_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1_0, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_2, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.wxgui_fftsink2_0_0_0_1_0_1, 0)) self.connect((self.pfb_arb_resampler_xxx_1, 0), (self.fir_filter_xxx_1, 0)) self.connect((self.pfb_arb_resampler_xxx_1, 0), (self.freq_xlating_fir_filter_xxx_2, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.digital_psk_demod_0, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.wxgui_scopesink2_1, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="FM Rx") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.ch_freq = ch_freq = 97.3e6 self.samp_rate = samp_rate = 5e6 / 1 self.rx_gain = rx_gain = 15 self.lpf_decim = lpf_decim = 20 self.freq = freq = ch_freq self.audio_samp_rate = audio_samp_rate = 100e3 ################################################## # Blocks ################################################## self.notebook_0 = self.notebook_0 = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "RF") self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "Audio") self.Add(self.notebook_0) self._freq_text_box = forms.text_box( parent=self.GetWin(), value=self.freq, callback=self.set_freq, label='freq', converter=forms.float_converter(), ) self.Add(self._freq_text_box) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.Add(self.wxgui_waterfallsink2_0.win) self.wxgui_fftsink2_1 = fftsink2.fft_sink_f( self.notebook_0.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate / lpf_decim, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='FFT Plot', peak_hold=False, ) self.notebook_0.GetPage(1).Add(self.wxgui_fftsink2_1.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( self.notebook_0.GetPage(0).GetWin(), baseband_freq=freq, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title='FFT Plot', peak_hold=False, ) self.notebook_0.GetPage(0).Add(self.wxgui_fftsink2_0.win) _rx_gain_sizer = wx.BoxSizer(wx.VERTICAL) self._rx_gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_rx_gain_sizer, value=self.rx_gain, callback=self.set_rx_gain, label='rx_gain', converter=forms.float_converter(), proportion=0, ) self._rx_gain_slider = forms.slider( parent=self.GetWin(), sizer=_rx_gain_sizer, value=self.rx_gain, callback=self.set_rx_gain, minimum=0, maximum=30, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Add(_rx_gain_sizer) self.rational_resampler_xxx_0 = filter.rational_resampler_fff( interpolation=96, decimation=250, taps=None, fractional_bw=None, ) self.osmosdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + '') self.osmosdr_source_0.set_sample_rate(samp_rate) self.osmosdr_source_0.set_center_freq(ch_freq, 0) self.osmosdr_source_0.set_freq_corr(0, 0) self.osmosdr_source_0.set_dc_offset_mode(0, 0) self.osmosdr_source_0.set_iq_balance_mode(0, 0) self.osmosdr_source_0.set_gain_mode(False, 0) self.osmosdr_source_0.set_gain(10, 0) self.osmosdr_source_0.set_if_gain(20, 0) self.osmosdr_source_0.set_bb_gain(20, 0) self.osmosdr_source_0.set_antenna('', 0) self.osmosdr_source_0.set_bandwidth(0, 0) self.low_pass_filter_0 = filter.fir_filter_ccf( lpf_decim, firdes.low_pass(1, samp_rate, 100e3, 10e3, firdes.WIN_HAMMING, 6.76)) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_int * 1, samp_rate / 1, True) self.audio_sink_0 = audio.sink(int(audio_samp_rate), '', True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=250e3, audio_decimation=1, ) ################################################## # Connections ################################################## self.connect((self.analog_wfm_rcv_0, 0), (self.blocks_throttle_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.audio_sink_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_fftsink2_1, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.wxgui_waterfallsink2_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="FMReceiverSignal") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.samp_rate = samp_rate = 2e6 self.bb_decim = bb_decim = 4 self.freq_offset = freq_offset = 200000 self.freq = freq = 99.5e6 self.baseband_rate = baseband_rate = samp_rate/bb_decim self.audio_decim = audio_decim = 5 self.xlate_bandwidth = xlate_bandwidth = 100000 self.volume = volume = 1 self.gain = gain = 40 self.freq_tune = freq_tune = freq- freq_offset self.audio_rate = audio_rate = 48000 self.audio_decim_rate = audio_decim_rate = baseband_rate/audio_decim ################################################## # Blocks ################################################## _volume_sizer = wx.BoxSizer(wx.VERTICAL) self._volume_text_box = forms.text_box( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, label="Volume", converter=forms.float_converter(), proportion=0, ) self._volume_slider = forms.slider( parent=self.GetWin(), sizer=_volume_sizer, value=self.volume, callback=self.set_volume, minimum=0, maximum=10, num_steps=300, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_volume_sizer, 0, 1, 1, 1) self.nb = self.nb = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.nb.AddPage(grc_wxgui.Panel(self.nb), "Demod") self.nb.AddPage(grc_wxgui.Panel(self.nb), "BB") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS") self.nb.AddPage(grc_wxgui.Panel(self.nb), "Waterfall") self.nb.AddPage(grc_wxgui.Panel(self.nb), "RDS constellation") self.GridAdd(self.nb, 2, 0, 1, 2) _gain_sizer = wx.BoxSizer(wx.VERTICAL) self._gain_text_box = forms.text_box( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, label="RF Gain", converter=forms.float_converter(), proportion=0, ) self._gain_slider = forms.slider( parent=self.GetWin(), sizer=_gain_sizer, value=self.gain, callback=self.set_gain, minimum=0, maximum=49.6, num_steps=124, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_gain_sizer, 0, 0, 1, 1) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label="Freq", converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=88.1e6, maximum=107.9e6, num_steps=99, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_freq_sizer, 1, 0, 1, 2) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.nb.GetPage(3).GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title="Waterfall Plot", ) self.nb.GetPage(3).Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( self.nb.GetPage(4).GetWin(), title="Scope Plot", sample_rate=2375, v_scale=0.4, v_offset=0, t_scale=0, ac_couple=False, xy_mode=True, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.nb.GetPage(4).Add(self.wxgui_scopesink2_1.win) self.wxgui_fftsink2_0_0_0_1_0_1 = fftsink2.fft_sink_c( self.nb.GetPage(2).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=audio_rate, fft_size=1024, fft_rate=15, average=False, avg_alpha=None, title="RDS", peak_hold=False, ) self.nb.GetPage(2).Add(self.wxgui_fftsink2_0_0_0_1_0_1.win) self.wxgui_fftsink2_0_0 = fftsink2.fft_sink_f( self.nb.GetPage(0).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=0, ref_scale=2.0, sample_rate=baseband_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title="FM Demod", peak_hold=False, ) self.nb.GetPage(0).Add(self.wxgui_fftsink2_0_0.win) self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( self.nb.GetPage(1).GetWin(), baseband_freq=0, y_per_div=10, y_divs=10, ref_level=-30, ref_scale=2.0, sample_rate=samp_rate, fft_size=1024, fft_rate=15, average=True, avg_alpha=0.8, title="Baseband", peak_hold=False, ) self.nb.GetPage(1).Add(self.wxgui_fftsink2_0.win) self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" ) self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(freq_tune, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) self.rtlsdr_source_0.set_dc_offset_mode(0, 0) self.rtlsdr_source_0.set_iq_balance_mode(0, 0) self.rtlsdr_source_0.set_gain_mode(False, 0) self.rtlsdr_source_0.set_gain(gain, 0) self.rtlsdr_source_0.set_if_gain(20, 0) self.rtlsdr_source_0.set_bb_gain(20, 0) self.rtlsdr_source_0.set_antenna("", 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf(1, firdes.root_raised_cosine( 1, samp_rate/bb_decim/audio_decim, 2375, 1, 100)) self.rational_resampler_xxx_1 = filter.rational_resampler_fff( interpolation=48, decimation=500, taps=None, fractional_bw=None, ) self.gr_rds_parser_0 = rds.parser(True, False, 1) self.gr_rds_panel_0 = rds.rdsPanel(freq, self.GetWin()) self.Add(self.gr_rds_panel_0.panel) self.gr_rds_decoder_0 = rds.decoder(False, False) self.freq_xlating_fir_filter_xxx_1 = filter.freq_xlating_fir_filter_fcc(audio_decim, (firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING)), 57e3, baseband_rate) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(1, (firdes.low_pass(1, samp_rate, xlate_bandwidth, 100000)), freq_offset, samp_rate) self.digital_mpsk_receiver_cc_0 = digital.mpsk_receiver_cc(2, 0, 1*cmath.pi/100.0, -0.06, 0.06, 0.5, 0.05, samp_rate/bb_decim/audio_decim/ 2375.0, 0.001, 0.005) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(2) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff((volume, )) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n(gr.sizeof_char*1, 2) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.audio_sink_0 = audio.sink(48000, "", True) self.analog_wfm_rcv_0 = analog.wfm_rcv( quad_rate=samp_rate, audio_decimation=bb_decim, ) ################################################## # Connections ################################################## self.msg_connect((self.gr_rds_decoder_0, 'out'), (self.gr_rds_parser_0, 'in')) self.msg_connect((self.gr_rds_parser_0, 'out'), (self.gr_rds_panel_0, 'in')) self.connect((self.analog_wfm_rcv_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.freq_xlating_fir_filter_xxx_1, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_fftsink2_0_0, 0)) self.connect((self.analog_wfm_rcv_0, 0), (self.wxgui_waterfallsink2_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.digital_diff_decoder_bb_0, 0)) self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.rational_resampler_xxx_1, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.digital_diff_decoder_bb_0, 0), (self.gr_rds_decoder_0, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_1, 0), (self.wxgui_fftsink2_0_0_0_1_0_1, 0)) self.connect((self.rational_resampler_xxx_1, 0), (self.audio_sink_0, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.digital_mpsk_receiver_cc_0, 0)) self.connect((self.rtlsdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") ################################################## # Variables ################################################## self.var = var = 11 self.samp_rate = samp_rate = 48e3 self.noise_amp = noise_amp = -130 self.freq = freq = 1e3 self.amp = amp = .5 ################################################## # Blocks ################################################## _noise_amp_sizer = wx.BoxSizer(wx.VERTICAL) self._noise_amp_text_box = forms.text_box( parent=self.GetWin(), sizer=_noise_amp_sizer, value=self.noise_amp, callback=self.set_noise_amp, label='Noise', converter=forms.float_converter(), proportion=0, ) self._noise_amp_slider = forms.slider( parent=self.GetWin(), sizer=_noise_amp_sizer, value=self.noise_amp, callback=self.set_noise_amp, minimum=-150, maximum=0, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Add(_noise_amp_sizer) _freq_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, label='Frequency', converter=forms.float_converter(), proportion=0, ) self._freq_slider = forms.slider( parent=self.GetWin(), sizer=_freq_sizer, value=self.freq, callback=self.set_freq, minimum=0, maximum=16e3, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Add(_freq_sizer) _amp_sizer = wx.BoxSizer(wx.VERTICAL) self._amp_text_box = forms.text_box( parent=self.GetWin(), sizer=_amp_sizer, value=self.amp, callback=self.set_amp, label='Amp', converter=forms.float_converter(), proportion=0, ) self._amp_slider = forms.slider( parent=self.GetWin(), sizer=_amp_sizer, value=self.amp, callback=self.set_amp, minimum=0, maximum=1, num_steps=100, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.Add(_amp_sizer) self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_f( self.GetWin(), baseband_freq=0, dynamic_range=100, ref_level=0, ref_scale=2.0, sample_rate=samp_rate, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='Waterfall Plot', ) self.Add(self.wxgui_waterfallsink2_0.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_f( self.GetWin(), title='Scope Plot', sample_rate=samp_rate, v_scale=0, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label='Counts', ) self.Add(self.wxgui_scopesink2_0.win) self.blocks_add_xx_0 = blocks.add_vff(1) self.audio_sink_0 = audio.sink(48000, '', True) self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, freq, amp, 0) self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, 10**(1. * noise_amp / 20), 0) ################################################## # Connections ################################################## self.connect((self.analog_noise_source_x_0, 0), (self.blocks_add_xx_0, 1)) self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.wxgui_waterfallsink2_0, 0))