From 5a0887f9138dc4dd0e8e09bb859a513bd7c971e2 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Sun, 11 Oct 2009 14:27:00 -0700 Subject: [PATCH] Work in progress, added GRC-based single channel receiver --- gr-pager/apps/Makefile.am | 8 +- gr-pager/apps/usrp_rx_flex.grc | 1063 ++++++++++++++++++++++++++++++++ gr-pager/apps/usrp_rx_flex.py | 357 +++++++++++ 3 files changed, 1426 insertions(+), 2 deletions(-) create mode 100644 gr-pager/apps/usrp_rx_flex.grc create mode 100755 gr-pager/apps/usrp_rx_flex.py diff --git a/gr-pager/apps/Makefile.am b/gr-pager/apps/Makefile.am index 64a79f59..0e9f1215 100644 --- a/gr-pager/apps/Makefile.am +++ b/gr-pager/apps/Makefile.am @@ -26,6 +26,10 @@ if PYTHON dist_bin_SCRIPTS = \ usrp_flex.py \ usrp_flex_all.py \ - usrp_flex_band.py - + usrp_flex_band.py \ + usrp_rx_flex.py endif + +EXTRA_DIST = \ + usrp_rx_flex.grc + diff --git a/gr-pager/apps/usrp_rx_flex.grc b/gr-pager/apps/usrp_rx_flex.grc new file mode 100644 index 00000000..c324eaa3 --- /dev/null +++ b/gr-pager/apps/usrp_rx_flex.grc @@ -0,0 +1,1063 @@ + + + Sun Oct 11 14:19:38 2009 + + options + + id + usrp_rx_flex + + + _enabled + True + + + title + USRP FLEX Pager Receiver (Single Channel) + + + author + + + + description + + + + window_size + 1280, 1024 + + + generate_options + wx_gui + + + category + Custom + + + run_options + prompt + + + run + True + + + realtime_scheduling + + + + _coordinate + (10, 10) + + + _rotation + 0 + + + + variable + + id + adc_rate + + + _enabled + True + + + value + 64e6 + + + _coordinate + (225, 12) + + + _rotation + 0 + + + + variable + + id + decim + + + _enabled + True + + + value + 16 + + + _coordinate + (310, 11) + + + _rotation + 0 + + + + variable + + id + sample_rate + + + _enabled + True + + + value + adc_rate/decim + + + _coordinate + (382, 12) + + + _rotation + 0 + + + + variable + + id + channel_rate + + + _enabled + True + + + value + 25e3 + + + _coordinate + (751, 13) + + + _rotation + 0 + + + + variable + + id + freq + + + _enabled + True + + + value + band_freq+(channel-61)*25e3 + + + _coordinate + (480, 11) + + + _rotation + 0 + + + + variable + + id + channel_decim + + + _enabled + True + + + value + int(sample_rate/channel_rate) + + + _coordinate + (854, 11) + + + _rotation + 0 + + + + variable + + id + channel_taps + + + _enabled + True + + + value + firdes.low_pass(10**1, sample_rate, 10e3, 2.5e3) + + + _coordinate + (588, 12) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_0 + + + _enabled + True + + + type + complex + + + title + FLEX Spectrum + + + samp_rate + sample_rate + + + baseband_freq + band_freq + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 65536 + + + fft_size + 1024 + + + fft_rate + 30 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + grid_pos + 0,0,1,1 + + + notebook + displays,0 + + + _coordinate + (34, 508) + + + _rotation + 180 + + + + usrp_simple_source_x + + id + usrp_source + + + _enabled + True + + + type + complex + + + format + + + + which + 0 + + + decimation + decim + + + frequency + band_freq + + + lo_offset + float('inf') + + + gain + rx_gain + + + side + A + + + rx_ant + RXA + + + hb_filters + + + + _coordinate + (32, 734) + + + _rotation + 0 + + + + import + + id + import_0 + + + _enabled + True + + + import + import os + + + _coordinate + (10, 76) + + + _rotation + 0 + + + + variable + + id + config_filename + + + _enabled + True + + + value + os.environ["HOME"]+"/.gnuradio/config.conf" + + + _coordinate + (9, 133) + + + _rotation + 0 + + + + variable_config + + id + saved_band_freq + + + _enabled + True + + + value + 930.5125e6 + + + type + real + + + config_file + config_filename + + + section + gr-pager + + + option + band_center + + + writeback + band_freq + + + _coordinate + (228, 311) + + + _rotation + 0 + + + + variable_config + + id + saved_offset + + + _enabled + True + + + value + 0 + + + type + real + + + config_file + config_filename + + + section + gr-pager + + + option + freq_offset + + + writeback + offset + + + _coordinate + (547, 312) + + + _rotation + 0 + + + + variable_config + + id + saved_rx_gain + + + _enabled + True + + + value + 40 + + + type + int + + + config_file + config_filename + + + section + gr-pager + + + option + rx_gain + + + writeback + rx_gain + + + _coordinate + (706, 312) + + + _rotation + 0 + + + + gr_freq_xlating_fir_filter_xxx + + id + gr_freq_xlating_fir_filter_xxx_0 + + + _enabled + True + + + type + ccc + + + decim + channel_decim + + + taps + channel_taps + + + center_freq + band_freq-freq+offset + + + samp_rate + sample_rate + + + _coordinate + (321, 750) + + + _rotation + 0 + + + + notebook + + id + displays + + + _enabled + True + + + style + wx.NB_TOP + + + labels + ['RX Spectrum','Baseband'] + + + grid_pos + 1, 0, 1, 5 + + + notebook + + + + _coordinate + (9, 209) + + + _rotation + 0 + + + + variable_slider + + id + rx_gain + + + _enabled + True + + + label + Analog Gain + + + value + saved_rx_gain + + + min + 0 + + + max + 100 + + + num_steps + 100 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 4, 1, 1 + + + notebook + + + + _coordinate + (658, 122) + + + _rotation + 0 + + + + variable_slider + + id + offset + + + _enabled + True + + + label + Freq. Offset + + + value + saved_offset + + + min + -10e3 + + + max + 10e3 + + + num_steps + 100 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 3, 1, 1 + + + notebook + + + + _coordinate + (518, 118) + + + _rotation + 0 + + + + variable_static_text + + id + freq_text + + + _enabled + True + + + label + Ch. Freq + + + value + freq + + + converver + float_converter + + + formatter + None + + + grid_pos + 0, 2, 1, 1 + + + notebook + + + + _coordinate + (801, 124) + + + _rotation + 0 + + + + variable_slider + + id + channel + + + _enabled + True + + + label + Channel + + + value + saved_channel + + + min + 1 + + + max + 120 + + + num_steps + 119 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 1, 1, 1 + + + notebook + + + + _coordinate + (376, 120) + + + _rotation + 0 + + + + variable_text_box + + id + band_freq + + + _enabled + True + + + label + Band Freq. + + + value + saved_band_freq + + + converver + float_converter + + + formatter + None + + + grid_pos + 0, 0, 1, 1 + + + notebook + + + + _coordinate + (225, 121) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0 + + + _enabled + True + + + type + complex + + + title + Baseband Waveform + + + samp_rate + channel_rate + + + v_scale + 1e3 + + + t_scale + 20.0/channel_rate + + + ac_couple + False + + + xy_mode + False + + + num_inputs + 1 + + + grid_pos + 0, 0, 1, 1 + + + notebook + displays, 1 + + + _coordinate + (593, 551) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_1 + + + _enabled + True + + + type + complex + + + title + Channel Spectrum + + + samp_rate + channel_rate + + + baseband_freq + freq + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 65536 + + + fft_size + 1024 + + + fft_rate + 30 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 0 + + + _coordinate + (344, 511) + + + _rotation + 180 + + + + variable_config + + id + saved_channel + + + _enabled + True + + + value + 25 + + + type + int + + + config_file + config_filename + + + section + gr-pager + + + option + channel + + + writeback + channel + + + _coordinate + (387, 312) + + + _rotation + 0 + + + + gr_freq_xlating_fir_filter_xxx_0 + wxgui_fftsink2_1 + 0 + 0 + + + usrp_source + gr_freq_xlating_fir_filter_xxx_0 + 0 + 0 + + + usrp_source + wxgui_fftsink2_0 + 0 + 0 + + + gr_freq_xlating_fir_filter_xxx_0 + wxgui_scopesink2_0 + 0 + 0 + + diff --git a/gr-pager/apps/usrp_rx_flex.py b/gr-pager/apps/usrp_rx_flex.py new file mode 100755 index 00000000..7d634527 --- /dev/null +++ b/gr-pager/apps/usrp_rx_flex.py @@ -0,0 +1,357 @@ +#!/usr/bin/env python +################################################## +# Gnuradio Python Flow Graph +# Title: USRP FLEX Pager Receiver (Single Channel) +# Generated: Sun Oct 11 14:15:06 2009 +################################################## + +from gnuradio import eng_notation +from gnuradio import gr +from gnuradio.eng_option import eng_option +from gnuradio.gr import firdes +from gnuradio.wxgui import fftsink2 +from gnuradio.wxgui import forms +from gnuradio.wxgui import scopesink2 +from grc_gnuradio import usrp as grc_usrp +from grc_gnuradio import wxgui as grc_wxgui +from optparse import OptionParser +import ConfigParser +import os +import wx + +class usrp_rx_flex(grc_wxgui.top_block_gui): + + def __init__(self): + grc_wxgui.top_block_gui.__init__(self, title="USRP FLEX Pager Receiver (Single Channel)") + + ################################################## + # Variables + ################################################## + self.config_filename = config_filename = os.environ["HOME"]+"/.gnuradio/config.conf" + self._saved_channel_config = ConfigParser.ConfigParser() + self._saved_channel_config.read(config_filename) + try: saved_channel = self._saved_channel_config.getint("gr-pager", "channel") + except: saved_channel = 25 + self.saved_channel = saved_channel + self._saved_band_freq_config = ConfigParser.ConfigParser() + self._saved_band_freq_config.read(config_filename) + try: saved_band_freq = self._saved_band_freq_config.getfloat("gr-pager", "band_center") + except: saved_band_freq = 930.5125e6 + self.saved_band_freq = saved_band_freq + self.decim = decim = 16 + self.channel = channel = saved_channel + self.band_freq = band_freq = saved_band_freq + self.adc_rate = adc_rate = 64e6 + self._saved_rx_gain_config = ConfigParser.ConfigParser() + self._saved_rx_gain_config.read(config_filename) + try: saved_rx_gain = self._saved_rx_gain_config.getint("gr-pager", "rx_gain") + except: saved_rx_gain = 40 + self.saved_rx_gain = saved_rx_gain + self._saved_offset_config = ConfigParser.ConfigParser() + self._saved_offset_config.read(config_filename) + try: saved_offset = self._saved_offset_config.getfloat("gr-pager", "freq_offset") + except: saved_offset = 0 + self.saved_offset = saved_offset + self.sample_rate = sample_rate = adc_rate/decim + self.freq = freq = band_freq+(channel-61)*25e3 + self.channel_rate = channel_rate = 25e3 + self.rx_gain = rx_gain = saved_rx_gain + self.offset = offset = saved_offset + self.freq_text = freq_text = freq + self.channel_taps = channel_taps = firdes.low_pass(10**1, sample_rate, 10e3, 2.5e3) + self.channel_decim = channel_decim = int(sample_rate/channel_rate) + + ################################################## + # Notebooks + ################################################## + self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP) + self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX Spectrum") + self.displays.AddPage(grc_wxgui.Panel(self.displays), "Baseband") + self.GridAdd(self.displays, 1, 0, 1, 5) + + ################################################## + # Controls + ################################################## + _channel_sizer = wx.BoxSizer(wx.VERTICAL) + self._channel_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_channel_sizer, + value=self.channel, + callback=self.set_channel, + label="Channel", + converter=forms.float_converter(), + proportion=0, + ) + self._channel_slider = forms.slider( + parent=self.GetWin(), + sizer=_channel_sizer, + value=self.channel, + callback=self.set_channel, + minimum=1, + maximum=120, + num_steps=119, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_channel_sizer, 0, 1, 1, 1) + self._band_freq_text_box = forms.text_box( + parent=self.GetWin(), + value=self.band_freq, + callback=self.set_band_freq, + label="Band Freq.", + converter=forms.float_converter(), + ) + self.GridAdd(self._band_freq_text_box, 0, 0, 1, 1) + _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="Analog 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=100, + num_steps=100, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_rx_gain_sizer, 0, 4, 1, 1) + _offset_sizer = wx.BoxSizer(wx.VERTICAL) + self._offset_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_offset_sizer, + value=self.offset, + callback=self.set_offset, + label="Freq. Offset", + converter=forms.float_converter(), + proportion=0, + ) + self._offset_slider = forms.slider( + parent=self.GetWin(), + sizer=_offset_sizer, + value=self.offset, + callback=self.set_offset, + minimum=-10e3, + maximum=10e3, + num_steps=100, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_offset_sizer, 0, 3, 1, 1) + self._freq_text_static_text = forms.static_text( + parent=self.GetWin(), + value=self.freq_text, + callback=self.set_freq_text, + label="Ch. Freq", + converter=forms.float_converter(), + ) + self.GridAdd(self._freq_text_static_text, 0, 2, 1, 1) + + ################################################## + # Blocks + ################################################## + self.gr_freq_xlating_fir_filter_xxx_0 = gr.freq_xlating_fir_filter_ccc(channel_decim, (channel_taps), band_freq-freq+offset, sample_rate) + self.usrp_source = grc_usrp.simple_source_c(which=0, side="A", rx_ant="RXA") + self.usrp_source.set_decim_rate(decim) + self.usrp_source.set_frequency(band_freq, verbose=True) + self.usrp_source.set_gain(rx_gain) + self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( + self.displays.GetPage(0).GetWin(), + baseband_freq=band_freq, + y_per_div=10, + y_divs=10, + ref_level=0, + ref_scale=65536, + sample_rate=sample_rate, + fft_size=1024, + fft_rate=30, + average=False, + avg_alpha=None, + title="FLEX Spectrum", + peak_hold=False, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1) + self.wxgui_fftsink2_1 = fftsink2.fft_sink_c( + self.displays.GetPage(0).GetWin(), + baseband_freq=freq, + y_per_div=10, + y_divs=10, + ref_level=0, + ref_scale=65536, + sample_rate=channel_rate, + fft_size=1024, + fft_rate=30, + average=False, + avg_alpha=None, + title="Channel Spectrum", + peak_hold=False, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_1.win, 1, 0, 1, 1) + self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( + self.displays.GetPage(1).GetWin(), + title="Baseband Waveform", + sample_rate=channel_rate, + v_scale=1e3, + t_scale=20.0/channel_rate, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0.win, 0, 0, 1, 1) + + ################################################## + # Connections + ################################################## + self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_1, 0)) + self.connect((self.usrp_source, 0), (self.gr_freq_xlating_fir_filter_xxx_0, 0)) + self.connect((self.usrp_source, 0), (self.wxgui_fftsink2_0, 0)) + self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_scopesink2_0, 0)) + + def set_config_filename(self, config_filename): + self.config_filename = config_filename + self._saved_band_freq_config = ConfigParser.ConfigParser() + self._saved_band_freq_config.read(self.config_filename) + if not self._saved_band_freq_config.has_section("gr-pager"): + self._saved_band_freq_config.add_section("gr-pager") + self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq)) + self._saved_band_freq_config.write(open(self.config_filename, 'w')) + self._saved_channel_config = ConfigParser.ConfigParser() + self._saved_channel_config.read(self.config_filename) + if not self._saved_channel_config.has_section("gr-pager"): + self._saved_channel_config.add_section("gr-pager") + self._saved_channel_config.set("gr-pager", "channel", str(self.channel)) + self._saved_channel_config.write(open(self.config_filename, 'w')) + self._saved_offset_config = ConfigParser.ConfigParser() + self._saved_offset_config.read(self.config_filename) + if not self._saved_offset_config.has_section("gr-pager"): + self._saved_offset_config.add_section("gr-pager") + self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset)) + self._saved_offset_config.write(open(self.config_filename, 'w')) + self._saved_rx_gain_config = ConfigParser.ConfigParser() + self._saved_rx_gain_config.read(self.config_filename) + if not self._saved_rx_gain_config.has_section("gr-pager"): + self._saved_rx_gain_config.add_section("gr-pager") + self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain)) + self._saved_rx_gain_config.write(open(self.config_filename, 'w')) + + def set_saved_channel(self, saved_channel): + self.saved_channel = saved_channel + self.set_channel(self.saved_channel) + + def set_saved_band_freq(self, saved_band_freq): + self.saved_band_freq = saved_band_freq + self.set_band_freq(self.saved_band_freq) + + def set_decim(self, decim): + self.decim = decim + self.set_sample_rate(self.adc_rate/self.decim) + self.usrp_source.set_decim_rate(self.decim) + + def set_channel(self, channel): + self.channel = channel + self.set_freq(self.band_freq+(self.channel-61)*25e3) + self._saved_channel_config = ConfigParser.ConfigParser() + self._saved_channel_config.read(self.config_filename) + if not self._saved_channel_config.has_section("gr-pager"): + self._saved_channel_config.add_section("gr-pager") + self._saved_channel_config.set("gr-pager", "channel", str(self.channel)) + self._saved_channel_config.write(open(self.config_filename, 'w')) + self._channel_slider.set_value(self.channel) + self._channel_text_box.set_value(self.channel) + + def set_band_freq(self, band_freq): + self.band_freq = band_freq + self.set_freq(self.band_freq+(self.channel-61)*25e3) + self.wxgui_fftsink2_0.set_baseband_freq(self.band_freq) + self.usrp_source.set_frequency(self.band_freq) + self._saved_band_freq_config = ConfigParser.ConfigParser() + self._saved_band_freq_config.read(self.config_filename) + if not self._saved_band_freq_config.has_section("gr-pager"): + self._saved_band_freq_config.add_section("gr-pager") + self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq)) + self._saved_band_freq_config.write(open(self.config_filename, 'w')) + self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset) + self._band_freq_text_box.set_value(self.band_freq) + + def set_adc_rate(self, adc_rate): + self.adc_rate = adc_rate + self.set_sample_rate(self.adc_rate/self.decim) + + def set_saved_rx_gain(self, saved_rx_gain): + self.saved_rx_gain = saved_rx_gain + self.set_rx_gain(self.saved_rx_gain) + + def set_saved_offset(self, saved_offset): + self.saved_offset = saved_offset + self.set_offset(self.saved_offset) + + def set_sample_rate(self, sample_rate): + self.sample_rate = sample_rate + self.set_channel_decim(int(self.sample_rate/self.channel_rate)) + self.set_channel_taps(firdes.low_pass(10**1, self.sample_rate, 10e3, 2.5e3)) + self.wxgui_fftsink2_0.set_sample_rate(self.sample_rate) + + def set_freq(self, freq): + self.freq = freq + self.wxgui_fftsink2_1.set_baseband_freq(self.freq) + self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset) + self.set_freq_text(self.freq) + + def set_channel_rate(self, channel_rate): + self.channel_rate = channel_rate + self.set_channel_decim(int(self.sample_rate/self.channel_rate)) + self.wxgui_fftsink2_1.set_sample_rate(self.channel_rate) + self.wxgui_scopesink2_0.set_sample_rate(self.channel_rate) + + def set_rx_gain(self, rx_gain): + self.rx_gain = rx_gain + self.usrp_source.set_gain(self.rx_gain) + self._saved_rx_gain_config = ConfigParser.ConfigParser() + self._saved_rx_gain_config.read(self.config_filename) + if not self._saved_rx_gain_config.has_section("gr-pager"): + self._saved_rx_gain_config.add_section("gr-pager") + self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain)) + self._saved_rx_gain_config.write(open(self.config_filename, 'w')) + self._rx_gain_slider.set_value(self.rx_gain) + self._rx_gain_text_box.set_value(self.rx_gain) + + def set_offset(self, offset): + self.offset = offset + self._saved_offset_config = ConfigParser.ConfigParser() + self._saved_offset_config.read(self.config_filename) + if not self._saved_offset_config.has_section("gr-pager"): + self._saved_offset_config.add_section("gr-pager") + self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset)) + self._saved_offset_config.write(open(self.config_filename, 'w')) + self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset) + self._offset_slider.set_value(self.offset) + self._offset_text_box.set_value(self.offset) + + def set_freq_text(self, freq_text): + self.freq_text = freq_text + self._freq_text_static_text.set_value(self.freq_text) + + def set_channel_taps(self, channel_taps): + self.channel_taps = channel_taps + self.gr_freq_xlating_fir_filter_xxx_0.set_taps((self.channel_taps)) + + def set_channel_decim(self, channel_decim): + self.channel_decim = channel_decim + +if __name__ == '__main__': + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + (options, args) = parser.parse_args() + tb = usrp_rx_flex() + tb.Run(True) + -- 2.30.2