diff options
Diffstat (limited to 'gr-pager/apps')
-rw-r--r-- | gr-pager/apps/.gitignore | 2 | ||||
-rw-r--r-- | gr-pager/apps/Makefile.am | 36 | ||||
-rwxr-xr-x | gr-pager/apps/usrp_flex.py | 172 | ||||
-rwxr-xr-x | gr-pager/apps/usrp_flex_all.py | 109 | ||||
-rwxr-xr-x | gr-pager/apps/usrp_flex_band.py | 110 | ||||
-rw-r--r-- | gr-pager/apps/usrp_rx_flex.grc | 1804 | ||||
-rwxr-xr-x | gr-pager/apps/usrp_rx_flex.py | 434 |
7 files changed, 2667 insertions, 0 deletions
diff --git a/gr-pager/apps/.gitignore b/gr-pager/apps/.gitignore new file mode 100644 index 000000000..282522db0 --- /dev/null +++ b/gr-pager/apps/.gitignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/gr-pager/apps/Makefile.am b/gr-pager/apps/Makefile.am new file mode 100644 index 000000000..7b495fd2b --- /dev/null +++ b/gr-pager/apps/Makefile.am @@ -0,0 +1,36 @@ +# +# Copyright 2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +include $(top_srcdir)/Makefile.common + +if PYTHON + +dist_bin_SCRIPTS = \ + usrp_flex.py \ + usrp_flex_all.py \ + usrp_flex_band.py + +noinst_PYTHON = \ + usrp_rx_flex.py +endif + +EXTRA_DIST = \ + usrp_rx_flex.grc diff --git a/gr-pager/apps/usrp_flex.py b/gr-pager/apps/usrp_flex.py new file mode 100755 index 000000000..f8d9d25b1 --- /dev/null +++ b/gr-pager/apps/usrp_flex.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python +# +# Copyright 2006,2007,2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr, gru, usrp, optfir, eng_notation, pager +from gnuradio.eng_option import eng_option +from optparse import OptionParser +import time, os, sys + +""" +This example application demonstrates receiving and demodulating the +FLEX pager protocol. + +The following are required command line parameters: + +-f FREQ USRP receive frequency + +The following are optional command line parameters: + +-R SUBDEV Daughter board specification, defaults to first found +-F FILE Read samples from a file instead of USRP. +-c FREQ Calibration offset. Gets added to receive frequency. + Defaults to 0.0 Hz. +-g GAIN Daughterboard gain setting. Defaults to mid-range. +-l Log flow graph to files (LOTS of data) +-v Verbose output + +Once the program is running, ctrl-break (Ctrl-C) stops operation. +""" + +class app_top_block(gr.top_block): + def __init__(self, options, queue): + gr.top_block.__init__(self, "usrp_flex") + self.options = options + self.offset = 0.0 + self.adj_time = time.time() + self.verbose = options.verbose + + if options.from_file is None: + # Set up USRP source with specified RX daughterboard + self.src = usrp.source_c() + if options.rx_subdev_spec == None: + options.rx_subdev_spec = usrp.pick_rx_subdevice(self.src) + self.subdev = usrp.selected_subdev(self.src, options.rx_subdev_spec) + self.src.set_mux(usrp.determine_rx_mux_value(self.src, options.rx_subdev_spec)) + + # Grab 250 KHz of spectrum (sample rate becomes 250 ksps complex) + self.src.set_decim_rate(256) + + # If no gain specified, set to midrange + if options.gain is None: + g = self.subdev.gain_range() + options.gain = (g[0]+g[1])/2.0 + self.subdev.set_gain(options.gain) + + # Tune daughterboard + actual_frequency = options.frequency+options.calibration + tune_result = usrp.tune(self.src, 0, self.subdev, actual_frequency) + if not tune_result: + sys.stderr.write("Failed to set center frequency to "+`actual_frequency`+"\n") + sys.exit(1) + + if options.verbose: + print "Using RX daughterboard", self.subdev.side_and_name() + print "USRP gain is", options.gain + print "USRP tuned to", actual_frequency + + else: + # Use supplied file as source of samples + self.src = gr.file_source(gr.sizeof_gr_complex, options.from_file) + if options.verbose: + print "Reading samples from", options.from_file + + if options.log and not options.from_file: + usrp_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat') + self.connect(self.src, usrp_sink) + + # Set up 22KHz-wide bandpass about center frequency. Decimate by 10 + # to get channel rate of 25Ksps + taps = optfir.low_pass(1.0, # Filter gain + 250e3, # Sample rate + 11000, # One-sided modulation bandwidth + 12500, # One-sided channel bandwidth + 0.1, # Passband ripple + 60) # Stopband attenuation + + if options.verbose: + print "Channel filter has", len(taps), "taps." + + self.chan = gr.freq_xlating_fir_filter_ccf(10, # Decimation rate + taps, # Filter taps + 0.0, # Offset frequency + 250e3) # Sample rate + + if options.log: + chan_sink = gr.file_sink(gr.sizeof_gr_complex, 'chan.dat') + self.connect(self.chan, chan_sink) + + # FLEX protocol demodulator + self.flex = pager.flex_demod(queue, options.frequency, options.verbose, options.log) + + self.connect(self.src, self.chan, self.flex) + + def freq_offset(self): + return self.flex.dc_offset()*1600 + + def adjust_freq(self): + if time.time() - self.adj_time > 1.6: # Only do it once per FLEX frame + self.adj_time = time.time() + self.offset -= self.freq_offset() + self.chan.set_center_freq(self.offset) + if self.verbose: + print "Channel frequency offset (Hz):", int(self.offset) + +def main(): + parser = OptionParser(option_class=eng_option) + parser.add_option("-f", "--frequency", type="eng_float", default=None, + help="set receive frequency to Hz", metavar="Hz") + parser.add_option("-R", "--rx-subdev-spec", type="subdev", + help="select USRP Rx side A or B", metavar="SUBDEV") + parser.add_option("-c", "--calibration", type="eng_float", default=0.0, + help="set frequency offset to Hz", metavar="Hz") + parser.add_option("-g", "--gain", type="int", default=None, + help="set RF gain", metavar="dB") + parser.add_option("-l", "--log", action="store_true", default=False, + help="log flowgraph to files (LOTS of data)") + parser.add_option("-v", "--verbose", action="store_true", default=False, + help="display debug output") + parser.add_option("-F", "--from-file", default=None, + help="read samples from file instead of USRP") + (options, args) = parser.parse_args() + + if len(args) > 0 or (options.frequency == None and options.from_file == None): + print "Run 'usrp_flex.py -h' for options." + sys.exit(1) + + if options.frequency == None: + options.frequency = 0.0 + + # Flow graph emits pages into message queue + queue = gr.msg_queue() + tb = app_top_block(options, queue) + runner = pager.queue_runner(queue) + + try: + tb.run() + except KeyboardInterrupt: + pass + + runner.end() + + +if __name__ == "__main__": + main() diff --git a/gr-pager/apps/usrp_flex_all.py b/gr-pager/apps/usrp_flex_all.py new file mode 100755 index 000000000..14f9151de --- /dev/null +++ b/gr-pager/apps/usrp_flex_all.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# +# Copyright 2006,2007,2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr, gru, usrp, optfir, eng_notation, blks2, pager +from gnuradio.eng_option import eng_option +from optparse import OptionParser +from string import split, join, printable +import time + +class app_top_block(gr.top_block): + def __init__(self, options, queue): + gr.top_block.__init__(self, "usrp_flex_all") + + if options.from_file is not None: + src = gr.file_source(gr.sizeof_gr_complex, options.from_file) + if options.verbose: + print "Reading samples from file", options.from_file + else: + src = usrp.source_c() + if options.rx_subdev_spec is None: + options.rx_subdev_spec = usrp.pick_rx_subdevice(src) + subdev = usrp.selected_subdev(src, options.rx_subdev_spec) + src.set_mux(usrp.determine_rx_mux_value(src, options.rx_subdev_spec)) + src.set_decim_rate(20) + result = usrp.tune(src, 0, subdev, 930.5125e6+options.calibration) + if options.verbose: + print "Using", subdev.name(), " for receiving." + print "Tuned USRP to", 930.5125e6+options.calibration + + taps = gr.firdes.low_pass(1.0, + 1.0, + 1.0/128.0*0.4, + 1.0/128.0*0.1, + gr.firdes.WIN_HANN) + + if options.verbose: + print "Channel filter has", len(taps), "taps" + + bank = blks2.analysis_filterbank(128, taps) + self.connect(src, bank) + + if options.log and options.from_file == None: + src_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat') + self.connect(src, src_sink) + + for i in range(128): + if i < 64: + freq = 930.5e6+i*25e3 + else: + freq = 928.9e6+(i-64)*25e3 + + if (freq < 929.0e6 or freq > 932.0e6): + self.connect((bank, i), gr.null_sink(gr.sizeof_gr_complex)) + else: + self.connect((bank, i), pager.flex_demod(queue, freq, options.verbose, options.log)) + if options.log: + self.connect((bank, i), gr.file_sink(gr.sizeof_gr_complex, 'chan_'+'%3.3f'%(freq/1e6)+'.dat')) + +def main(): + parser = OptionParser(option_class=eng_option) + parser.add_option("-R", "--rx-subdev-spec", type="subdev", + help="select USRP Rx side A or B (default=first daughterboard found)") + parser.add_option("-c", "--calibration", type="eng_float", default=0.0, + help="set frequency offset to Hz", metavar="Hz") + parser.add_option("-g", "--gain", type="int", + help="set RF gain", metavar="dB") + parser.add_option("-F", "--from-file", default=None, + help="Read from file instead of USRP") + parser.add_option("-l", "--log", action="store_true", default=False, + help="log flowgraph to files (LOTS of data)") + parser.add_option("-v", "--verbose", action="store_true", default=False, + help="display debug output") + (options, args) = parser.parse_args() + + if options.verbose: + print options + + queue = gr.msg_queue() + tb = app_top_block(options, queue) + runner = pager.queue_runner(queue) + + try: + tb.run() + except KeyboardInterrupt: + pass + + runner.end() + +if __name__ == "__main__": + main() diff --git a/gr-pager/apps/usrp_flex_band.py b/gr-pager/apps/usrp_flex_band.py new file mode 100755 index 000000000..06c2488c0 --- /dev/null +++ b/gr-pager/apps/usrp_flex_band.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# +# Copyright 2006,2007,2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr, gru, usrp, optfir, eng_notation, blks2, pager +from gnuradio.eng_option import eng_option +from optparse import OptionParser + +class app_top_block(gr.top_block): + def __init__(self, options, queue): + gr.top_block.__init__(self, "usrp_flex_all") + self.subdev = None + + if options.from_file is not None: + self.src = gr.file_source(gr.sizeof_gr_complex, options.from_file) + if options.verbose: + print "Reading samples from file", options.from_file + else: + self.src = usrp.source_c() + if options.rx_subdev_spec is None: + options.rx_subdev_spec = usrp.pick_rx_subdevice(self.src) + self.subdev = usrp.selected_subdev(self.src, options.rx_subdev_spec) + self.src.set_mux(usrp.determine_rx_mux_value(self.src, options.rx_subdev_spec)) + self.src.set_decim_rate(64) + frequency = options.frequency+options.calibration + result = usrp.tune(self.src, 0, self.subdev, frequency) + if options.verbose: + print "Using", self.subdev.name(), " for receiving." + print "Tuned USRP to", frequency + + taps = gr.firdes.low_pass(1.0, + 1.0, + 1.0/40.0*0.4, + 1.0/40.0*0.1, + gr.firdes.WIN_HANN) + + if options.verbose: + print "Channel filter has", len(taps), "taps" + + bank = blks2.analysis_filterbank(40, taps) + self.connect(self.src, bank) + + if options.log and options.from_file == None: + src_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat') + self.connect(self.src, src_sink) + + for i in range(40): + if i < 20: + freq = options.frequency+i*25e3 + else: + freq = options.frequency-0.5e6+(i-20)*25e3 + + self.connect((bank, i), pager.flex_demod(queue, freq, options.verbose, options.log)) + if options.log: + self.connect((bank, i), gr.file_sink(gr.sizeof_gr_complex, 'chan_'+'%3.3f'%(freq/1e6)+'.dat')) + + +def main(): + parser = OptionParser(option_class=eng_option) + parser.add_option("-f", "--frequency", type="eng_float", default=929.5e6, + help="set receive center frequency to Hz", metavar="Hz") + parser.add_option("-R", "--rx-subdev-spec", type="subdev", + help="select USRP Rx side A or B (default=first daughterboard found)") + parser.add_option("-c", "--calibration", type="eng_float", default=0.0, + help="set frequency offset to Hz", metavar="Hz") + parser.add_option("-g", "--gain", type="int", + help="set RF gain", metavar="dB") + parser.add_option("-F", "--from-file", default=None, + help="Read from file instead of USRP") + parser.add_option("-l", "--log", action="store_true", default=False, + help="log flowgraph to files (LOTS of data)") + parser.add_option("-v", "--verbose", action="store_true", default=False, + help="display debug output") + (options, args) = parser.parse_args() + + if options.verbose: + print options + + queue = gr.msg_queue() + tb = app_top_block(options, queue) + runner = pager.queue_runner(queue) + + try: + tb.run() + except KeyboardInterrupt: + pass + + runner.end() + + +if __name__ == "__main__": + main() diff --git a/gr-pager/apps/usrp_rx_flex.grc b/gr-pager/apps/usrp_rx_flex.grc new file mode 100644 index 000000000..b9461a57f --- /dev/null +++ b/gr-pager/apps/usrp_rx_flex.grc @@ -0,0 +1,1804 @@ +<?xml version='1.0' encoding='ASCII'?> +<flow_graph> + <timestamp>Thu Oct 29 11:01:22 2009</timestamp> + <block> + <key>options</key> + <param> + <key>id</key> + <value>usrp_rx_flex</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>title</key> + <value>USRP FLEX Pager Receiver (Single Channel)</value> + </param> + <param> + <key>author</key> + <value></value> + </param> + <param> + <key>description</key> + <value></value> + </param> + <param> + <key>window_size</key> + <value>4095,4095</value> + </param> + <param> + <key>generate_options</key> + <value>wx_gui</value> + </param> + <param> + <key>category</key> + <value>Custom</value> + </param> + <param> + <key>run_options</key> + <value>prompt</value> + </param> + <param> + <key>run</key> + <value>True</value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(10, 10)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>adc_rate</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>64e6</value> + </param> + <param> + <key>_coordinate</key> + <value>(225, 12)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>sample_rate</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>adc_rate/decim</value> + </param> + <param> + <key>_coordinate</key> + <value>(382, 12)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>freq</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>band_freq+(channel-61)*25e3</value> + </param> + <param> + <key>_coordinate</key> + <value>(480, 11)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>wxgui_fftsink2</key> + <param> + <key>id</key> + <value>wxgui_fftsink2_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>complex</value> + </param> + <param> + <key>title</key> + <value>FLEX Spectrum</value> + </param> + <param> + <key>samp_rate</key> + <value>sample_rate</value> + </param> + <param> + <key>baseband_freq</key> + <value>band_freq</value> + </param> + <param> + <key>y_per_div</key> + <value>10</value> + </param> + <param> + <key>y_divs</key> + <value>10</value> + </param> + <param> + <key>ref_level</key> + <value>0</value> + </param> + <param> + <key>ref_scale</key> + <value>65536</value> + </param> + <param> + <key>fft_size</key> + <value>1024</value> + </param> + <param> + <key>fft_rate</key> + <value>30</value> + </param> + <param> + <key>peak_hold</key> + <value>False</value> + </param> + <param> + <key>average</key> + <value>False</value> + </param> + <param> + <key>avg_alpha</key> + <value>0</value> + </param> + <param> + <key>win</key> + <value>None</value> + </param> + <param> + <key>win_size</key> + <value></value> + </param> + <param> + <key>grid_pos</key> + <value>0,0,1,1</value> + </param> + <param> + <key>notebook</key> + <value>displays,0</value> + </param> + <param> + <key>_coordinate</key> + <value>(34, 508)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + </block> + <block> + <key>notebook</key> + <param> + <key>id</key> + <value>displays</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>style</key> + <value>wx.NB_TOP</value> + </param> + <param> + <key>labels</key> + <value>['RX Spectrum','Baseband']</value> + </param> + <param> + <key>grid_pos</key> + <value>1, 0, 1, 5</value> + </param> + <param> + <key>notebook</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(9, 209)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>import</key> + <param> + <key>id</key> + <value>import_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>import</key> + <value>import os, math</value> + </param> + <param> + <key>_coordinate</key> + <value>(10, 76)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>usrp_simple_source_x</key> + <param> + <key>id</key> + <value>usrp_source</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>complex</value> + </param> + <param> + <key>format</key> + <value></value> + </param> + <param> + <key>which</key> + <value>0</value> + </param> + <param> + <key>decimation</key> + <value>decim</value> + </param> + <param> + <key>frequency</key> + <value>band_freq</value> + </param> + <param> + <key>lo_offset</key> + <value>float('inf')</value> + </param> + <param> + <key>gain</key> + <value>rx_gain</value> + </param> + <param> + <key>side</key> + <value>A</value> + </param> + <param> + <key>rx_ant</key> + <value>RXA</value> + </param> + <param> + <key>hb_filters</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(32, 734)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>gr_freq_xlating_fir_filter_xxx</key> + <param> + <key>id</key> + <value>gr_freq_xlating_fir_filter_xxx_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>ccc</value> + </param> + <param> + <key>decim</key> + <value>channel_decim</value> + </param> + <param> + <key>taps</key> + <value>channel_taps</value> + </param> + <param> + <key>center_freq</key> + <value>band_freq-freq+offset</value> + </param> + <param> + <key>samp_rate</key> + <value>sample_rate</value> + </param> + <param> + <key>_coordinate</key> + <value>(321, 750)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>wxgui_fftsink2</key> + <param> + <key>id</key> + <value>wxgui_fftsink2_1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>complex</value> + </param> + <param> + <key>title</key> + <value>Channel Spectrum</value> + </param> + <param> + <key>samp_rate</key> + <value>channel_rate</value> + </param> + <param> + <key>baseband_freq</key> + <value>freq</value> + </param> + <param> + <key>y_per_div</key> + <value>10</value> + </param> + <param> + <key>y_divs</key> + <value>10</value> + </param> + <param> + <key>ref_level</key> + <value>0</value> + </param> + <param> + <key>ref_scale</key> + <value>65536</value> + </param> + <param> + <key>fft_size</key> + <value>1024</value> + </param> + <param> + <key>fft_rate</key> + <value>30</value> + </param> + <param> + <key>peak_hold</key> + <value>False</value> + </param> + <param> + <key>average</key> + <value>False</value> + </param> + <param> + <key>avg_alpha</key> + <value>0</value> + </param> + <param> + <key>win</key> + <value>None</value> + </param> + <param> + <key>win_size</key> + <value></value> + </param> + <param> + <key>grid_pos</key> + <value>1, 0, 1, 1</value> + </param> + <param> + <key>notebook</key> + <value>displays, 0</value> + </param> + <param> + <key>_coordinate</key> + <value>(344, 511)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>decim</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>20</value> + </param> + <param> + <key>_coordinate</key> + <value>(310, 11)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>symbol_rate</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>3200</value> + </param> + <param> + <key>_coordinate</key> + <value>(590, 12)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>channel_decim</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>int(sample_rate/channel_rate)</value> + </param> + <param> + <key>_coordinate</key> + <value>(906, 12)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>deviation</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>4800</value> + </param> + <param> + <key>_coordinate</key> + <value>(688, 14)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>demod_k</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>3*channel_rate/(2*math.pi*deviation)</value> + </param> + <param> + <key>_coordinate</key> + <value>(598, 857)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>channel_taps</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>firdes.low_pass(10, sample_rate, passband/2.0, (channel_rate-passband)/2.0)</value> + </param> + <param> + <key>_coordinate</key> + <value>(325, 857)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>config_filename</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>os.environ["HOME"]+"/.gnuradio/config.conf"</value> + </param> + <param> + <key>_coordinate</key> + <value>(9, 133)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_config</key> + <param> + <key>id</key> + <value>saved_band_freq</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>930.5125e6</value> + </param> + <param> + <key>type</key> + <value>real</value> + </param> + <param> + <key>config_file</key> + <value>config_filename</value> + </param> + <param> + <key>section</key> + <value>gr-pager</value> + </param> + <param> + <key>option</key> + <value>band_center</value> + </param> + <param> + <key>writeback</key> + <value>band_freq</value> + </param> + <param> + <key>_coordinate</key> + <value>(228, 311)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_config</key> + <param> + <key>id</key> + <value>saved_channel</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>25</value> + </param> + <param> + <key>type</key> + <value>int</value> + </param> + <param> + <key>config_file</key> + <value>config_filename</value> + </param> + <param> + <key>section</key> + <value>gr-pager</value> + </param> + <param> + <key>option</key> + <value>channel</value> + </param> + <param> + <key>writeback</key> + <value>channel</value> + </param> + <param> + <key>_coordinate</key> + <value>(387, 312)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_config</key> + <param> + <key>id</key> + <value>saved_offset</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>0</value> + </param> + <param> + <key>type</key> + <value>real</value> + </param> + <param> + <key>config_file</key> + <value>config_filename</value> + </param> + <param> + <key>section</key> + <value>gr-pager</value> + </param> + <param> + <key>option</key> + <value>freq_offset</value> + </param> + <param> + <key>writeback</key> + <value>offset</value> + </param> + <param> + <key>_coordinate</key> + <value>(547, 312)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_config</key> + <param> + <key>id</key> + <value>saved_rx_gain</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>40</value> + </param> + <param> + <key>type</key> + <value>int</value> + </param> + <param> + <key>config_file</key> + <value>config_filename</value> + </param> + <param> + <key>section</key> + <value>gr-pager</value> + </param> + <param> + <key>option</key> + <value>rx_gain</value> + </param> + <param> + <key>writeback</key> + <value>rx_gain</value> + </param> + <param> + <key>_coordinate</key> + <value>(706, 312)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_text_box</key> + <param> + <key>id</key> + <value>band_freq</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>label</key> + <value>Band Freq.</value> + </param> + <param> + <key>value</key> + <value>saved_band_freq</value> + </param> + <param> + <key>converver</key> + <value>float_converter</value> + </param> + <param> + <key>formatter</key> + <value>None</value> + </param> + <param> + <key>grid_pos</key> + <value>0, 0, 1, 1</value> + </param> + <param> + <key>notebook</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(225, 121)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_static_text</key> + <param> + <key>id</key> + <value>freq_text</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>label</key> + <value>Ch. Freq</value> + </param> + <param> + <key>value</key> + <value>freq</value> + </param> + <param> + <key>converver</key> + <value>float_converter</value> + </param> + <param> + <key>formatter</key> + <value>None</value> + </param> + <param> + <key>grid_pos</key> + <value>0, 2, 1, 1</value> + </param> + <param> + <key>notebook</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(801, 124)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>passband</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>2*(deviation+symbol_rate)</value> + </param> + <param> + <key>_coordinate</key> + <value>(327, 930)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>channel_rate</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>8*3200</value> + </param> + <param> + <key>_coordinate</key> + <value>(792, 13)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_slider</key> + <param> + <key>id</key> + <value>channel</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>label</key> + <value>Channel</value> + </param> + <param> + <key>value</key> + <value>saved_channel</value> + </param> + <param> + <key>min</key> + <value>1</value> + </param> + <param> + <key>max</key> + <value>120</value> + </param> + <param> + <key>num_steps</key> + <value>119</value> + </param> + <param> + <key>style</key> + <value>wx.SL_HORIZONTAL</value> + </param> + <param> + <key>converver</key> + <value>int_converter</value> + </param> + <param> + <key>grid_pos</key> + <value>0, 1, 1, 1</value> + </param> + <param> + <key>notebook</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(376, 120)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_slider</key> + <param> + <key>id</key> + <value>rx_gain</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>label</key> + <value>Analog Gain</value> + </param> + <param> + <key>value</key> + <value>saved_rx_gain</value> + </param> + <param> + <key>min</key> + <value>0</value> + </param> + <param> + <key>max</key> + <value>100</value> + </param> + <param> + <key>num_steps</key> + <value>100</value> + </param> + <param> + <key>style</key> + <value>wx.SL_HORIZONTAL</value> + </param> + <param> + <key>converver</key> + <value>int_converter</value> + </param> + <param> + <key>grid_pos</key> + <value>0, 4, 1, 1</value> + </param> + <param> + <key>notebook</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(658, 122)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_slider</key> + <param> + <key>id</key> + <value>offset</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>label</key> + <value>Freq. Offset</value> + </param> + <param> + <key>value</key> + <value>saved_offset</value> + </param> + <param> + <key>min</key> + <value>-12.5e3</value> + </param> + <param> + <key>max</key> + <value>12.5e3</value> + </param> + <param> + <key>num_steps</key> + <value>100</value> + </param> + <param> + <key>style</key> + <value>wx.SL_HORIZONTAL</value> + </param> + <param> + <key>converver</key> + <value>float_converter</value> + </param> + <param> + <key>grid_pos</key> + <value>0, 3, 1, 1</value> + </param> + <param> + <key>notebook</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(518, 118)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>gr_quadrature_demod_cf</key> + <param> + <key>id</key> + <value>fm_demod</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>gain</key> + <value>demod_k</value> + </param> + <param> + <key>_coordinate</key> + <value>(599, 774)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>baseband_rate</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>16000</value> + </param> + <param> + <key>_coordinate</key> + <value>(1019, 17)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>nchan_taps</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>len(channel_taps)</value> + </param> + <param> + <key>_coordinate</key> + <value>(412, 931)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>ma_ntaps</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>int(channel_rate/symbol_rate)</value> + </param> + <param> + <key>_coordinate</key> + <value>(850, 863)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>bb_interp</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>5</value> + </param> + <param> + <key>_coordinate</key> + <value>(938, 862)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>virtual_sink</key> + <param> + <key>id</key> + <value>virtual_sink_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>baseband</value> + </param> + <param> + <key>_coordinate</key> + <value>(1100, 774)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blks2_rational_resampler_xxx</key> + <param> + <key>id</key> + <value>resampler</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>fff</value> + </param> + <param> + <key>decim</key> + <value>bb_decim</value> + </param> + <param> + <key>interp</key> + <value>bb_interp</value> + </param> + <param> + <key>taps</key> + <value>[1.0/ma_ntaps,]*ma_ntaps*bb_interp</value> + </param> + <param> + <key>fractional_bw</key> + <value>0</value> + </param> + <param> + <key>_coordinate</key> + <value>(851, 750)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>bb_decim</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>8</value> + </param> + <param> + <key>_coordinate</key> + <value>(1027, 864)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>wxgui_scopesink2</key> + <param> + <key>id</key> + <value>wxgui_scopesink2_0_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>float</value> + </param> + <param> + <key>title</key> + <value>Baseband</value> + </param> + <param> + <key>samp_rate</key> + <value>16e3</value> + </param> + <param> + <key>v_scale</key> + <value>1</value> + </param> + <param> + <key>v_offset</key> + <value>0</value> + </param> + <param> + <key>t_scale</key> + <value>40.0/16e3</value> + </param> + <param> + <key>ac_couple</key> + <value>False</value> + </param> + <param> + <key>xy_mode</key> + <value>False</value> + </param> + <param> + <key>num_inputs</key> + <value>1</value> + </param> + <param> + <key>win_size</key> + <value></value> + </param> + <param> + <key>grid_pos</key> + <value>0, 0, 1, 1</value> + </param> + <param> + <key>notebook</key> + <value>displays, 1</value> + </param> + <param> + <key>_coordinate</key> + <value>(851, 586)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + </block> + <block> + <key>virtual_source</key> + <param> + <key>id</key> + <value>virtual_source_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>baseband</value> + </param> + <param> + <key>_coordinate</key> + <value>(79, 1186)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>pager_slicer_fb</key> + <param> + <key>id</key> + <value>pager_slicer_fb_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>alpha</key> + <value>1e-6</value> + </param> + <param> + <key>_coordinate</key> + <value>(304, 1186)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>wxgui_scopesink2</key> + <param> + <key>id</key> + <value>wxgui_scopesink2_0</value> + </param> + <param> + <key>_enabled</key> + <value>False</value> + </param> + <param> + <key>type</key> + <value>float</value> + </param> + <param> + <key>title</key> + <value>Slicer Output</value> + </param> + <param> + <key>samp_rate</key> + <value>baseband_rate</value> + </param> + <param> + <key>v_scale</key> + <value>1</value> + </param> + <param> + <key>v_offset</key> + <value>0</value> + </param> + <param> + <key>t_scale</key> + <value>40.0/baseband_rate</value> + </param> + <param> + <key>ac_couple</key> + <value>False</value> + </param> + <param> + <key>xy_mode</key> + <value>False</value> + </param> + <param> + <key>num_inputs</key> + <value>1</value> + </param> + <param> + <key>win_size</key> + <value></value> + </param> + <param> + <key>grid_pos</key> + <value>1,0,1,1</value> + </param> + <param> + <key>notebook</key> + <value>displays, 1</value> + </param> + <param> + <key>_coordinate</key> + <value>(75, 1044)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + </block> + <block> + <key>gr_char_to_float</key> + <param> + <key>id</key> + <value>gr_char_to_float_0</value> + </param> + <param> + <key>_enabled</key> + <value>False</value> + </param> + <param> + <key>_coordinate</key> + <value>(325, 1088)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + </block> + <block> + <key>pager_flex_sync</key> + <param> + <key>id</key> + <value>pager_flex_sync_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(529, 1139)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>pager_flex_deinterleave</key> + <param> + <key>id</key> + <value>pager_flex_deinterleave_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(777, 1116)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>gr_null_sink</key> + <param> + <key>id</key> + <value>gr_null_sink_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>int</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + <param> + <key>_coordinate</key> + <value>(1042, 1116)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>pager_flex_deinterleave</key> + <param> + <key>id</key> + <value>pager_flex_deinterleave_0_1_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(778, 1168)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>pager_flex_deinterleave</key> + <param> + <key>id</key> + <value>pager_flex_deinterleave_0_1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(776, 1225)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>pager_flex_deinterleave</key> + <param> + <key>id</key> + <value>pager_flex_deinterleave_0_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(776, 1273)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>gr_null_sink</key> + <param> + <key>id</key> + <value>gr_null_sink_0_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>int</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + <param> + <key>_coordinate</key> + <value>(1042, 1168)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>gr_null_sink</key> + <param> + <key>id</key> + <value>gr_null_sink_0_1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>int</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + <param> + <key>_coordinate</key> + <value>(1041, 1225)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>gr_null_sink</key> + <param> + <key>id</key> + <value>gr_null_sink_0_2</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>int</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + <param> + <key>_coordinate</key> + <value>(1040, 1273)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <connection> + <source_block_id>gr_freq_xlating_fir_filter_xxx_0</source_block_id> + <sink_block_id>wxgui_fftsink2_1</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>usrp_source</source_block_id> + <sink_block_id>gr_freq_xlating_fir_filter_xxx_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>usrp_source</source_block_id> + <sink_block_id>wxgui_fftsink2_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>gr_freq_xlating_fir_filter_xxx_0</source_block_id> + <sink_block_id>fm_demod</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>resampler</source_block_id> + <sink_block_id>wxgui_scopesink2_0_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>fm_demod</source_block_id> + <sink_block_id>resampler</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>resampler</source_block_id> + <sink_block_id>virtual_sink_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_slicer_fb_0</source_block_id> + <sink_block_id>pager_flex_sync_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>virtual_source_0</source_block_id> + <sink_block_id>pager_slicer_fb_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_slicer_fb_0</source_block_id> + <sink_block_id>gr_char_to_float_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>gr_char_to_float_0</source_block_id> + <sink_block_id>wxgui_scopesink2_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_sync_0</source_block_id> + <sink_block_id>pager_flex_deinterleave_0_1_0</sink_block_id> + <source_key>1</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_sync_0</source_block_id> + <sink_block_id>pager_flex_deinterleave_0_1</sink_block_id> + <source_key>2</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_sync_0</source_block_id> + <sink_block_id>pager_flex_deinterleave_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_sync_0</source_block_id> + <sink_block_id>pager_flex_deinterleave_0_0</sink_block_id> + <source_key>3</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_deinterleave_0</source_block_id> + <sink_block_id>gr_null_sink_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_deinterleave_0_1_0</source_block_id> + <sink_block_id>gr_null_sink_0_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_deinterleave_0_1</source_block_id> + <sink_block_id>gr_null_sink_0_1</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>pager_flex_deinterleave_0_0</source_block_id> + <sink_block_id>gr_null_sink_0_2</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> +</flow_graph> diff --git a/gr-pager/apps/usrp_rx_flex.py b/gr-pager/apps/usrp_rx_flex.py new file mode 100755 index 000000000..47bf5a3df --- /dev/null +++ b/gr-pager/apps/usrp_rx_flex.py @@ -0,0 +1,434 @@ +#!/usr/bin/env python +################################################## +# Gnuradio Python Flow Graph +# Title: USRP FLEX Pager Receiver (Single Channel) +# Generated: Thu Oct 29 11:03:16 2009 +################################################## + +from gnuradio import blks2 +from gnuradio import eng_notation +from gnuradio import gr +from gnuradio import pager +from gnuradio import window +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, math +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.symbol_rate = symbol_rate = 3200 + 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.deviation = deviation = 4800 + self.decim = decim = 20 + self.adc_rate = adc_rate = 64e6 + self.sample_rate = sample_rate = adc_rate/decim + self.passband = passband = 2*(deviation+symbol_rate) + self.channel_rate = channel_rate = 8*3200 + self.channel = channel = saved_channel + self.band_freq = band_freq = saved_band_freq + 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.freq = freq = band_freq+(channel-61)*25e3 + self.channel_taps = channel_taps = firdes.low_pass(10, sample_rate, passband/2.0, (channel_rate-passband)/2.0) + self.rx_gain = rx_gain = saved_rx_gain + self.offset = offset = saved_offset + self.nchan_taps = nchan_taps = len(channel_taps) + self.ma_ntaps = ma_ntaps = int(channel_rate/symbol_rate) + self.freq_text = freq_text = freq + self.demod_k = demod_k = 3*channel_rate/(2*math.pi*deviation) + self.channel_decim = channel_decim = int(sample_rate/channel_rate) + self.bb_interp = bb_interp = 5 + self.bb_decim = bb_decim = 8 + self.baseband_rate = baseband_rate = 16000 + + ################################################## + # 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.int_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=int, + 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.int_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=int, + 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=-12.5e3, + maximum=12.5e3, + 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.fm_demod = gr.quadrature_demod_cf(demod_k) + 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.gr_null_sink_0 = gr.null_sink(gr.sizeof_int*1) + self.gr_null_sink_0_0 = gr.null_sink(gr.sizeof_int*1) + self.gr_null_sink_0_1 = gr.null_sink(gr.sizeof_int*1) + self.gr_null_sink_0_2 = gr.null_sink(gr.sizeof_int*1) + self.pager_flex_deinterleave_0 = pager.flex_deinterleave() + self.pager_flex_deinterleave_0_0 = pager.flex_deinterleave() + self.pager_flex_deinterleave_0_1 = pager.flex_deinterleave() + self.pager_flex_deinterleave_0_1_0 = pager.flex_deinterleave() + self.pager_flex_sync_0 = pager.flex_sync() + self.pager_slicer_fb_0 = pager.slicer_fb(1e-6) + self.resampler = blks2.rational_resampler_fff( + interpolation=bb_interp, + decimation=bb_decim, + taps=([1.0/ma_ntaps,]*ma_ntaps*bb_interp), + fractional_bw=None, + ) + 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_0 = scopesink2.scope_sink_f( + self.displays.GetPage(1).GetWin(), + title="Baseband", + sample_rate=16e3, + v_scale=1, + v_offset=0, + t_scale=40.0/16e3, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_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.fm_demod, 0)) + self.connect((self.resampler, 0), (self.wxgui_scopesink2_0_0, 0)) + self.connect((self.fm_demod, 0), (self.resampler, 0)) + self.connect((self.pager_slicer_fb_0, 0), (self.pager_flex_sync_0, 0)) + self.connect((self.resampler, 0), (self.pager_slicer_fb_0, 0)) + self.connect((self.pager_flex_sync_0, 1), (self.pager_flex_deinterleave_0_1_0, 0)) + self.connect((self.pager_flex_sync_0, 2), (self.pager_flex_deinterleave_0_1, 0)) + self.connect((self.pager_flex_sync_0, 0), (self.pager_flex_deinterleave_0, 0)) + self.connect((self.pager_flex_sync_0, 3), (self.pager_flex_deinterleave_0_0, 0)) + self.connect((self.pager_flex_deinterleave_0, 0), (self.gr_null_sink_0, 0)) + self.connect((self.pager_flex_deinterleave_0_1_0, 0), (self.gr_null_sink_0_0, 0)) + self.connect((self.pager_flex_deinterleave_0_1, 0), (self.gr_null_sink_0_1, 0)) + self.connect((self.pager_flex_deinterleave_0_0, 0), (self.gr_null_sink_0_2, 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_symbol_rate(self, symbol_rate): + self.symbol_rate = symbol_rate + self.set_passband(2*(self.deviation+self.symbol_rate)) + self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate)) + + 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_deviation(self, deviation): + self.deviation = deviation + self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation)) + self.set_passband(2*(self.deviation+self.symbol_rate)) + + 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_adc_rate(self, adc_rate): + self.adc_rate = adc_rate + self.set_sample_rate(self.adc_rate/self.decim) + + def set_sample_rate(self, sample_rate): + self.sample_rate = sample_rate + self.wxgui_fftsink2_0.set_sample_rate(self.sample_rate) + self.set_channel_decim(int(self.sample_rate/self.channel_rate)) + self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0)) + + def set_passband(self, passband): + self.passband = passband + self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0)) + + def set_channel_rate(self, channel_rate): + self.channel_rate = channel_rate + self.wxgui_fftsink2_1.set_sample_rate(self.channel_rate) + self.set_channel_decim(int(self.sample_rate/self.channel_rate)) + self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation)) + self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0)) + self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate)) + + 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.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset) + 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._band_freq_text_box.set_value(self.band_freq) + + 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_freq(self, freq): + self.freq = freq + self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset) + self.wxgui_fftsink2_1.set_baseband_freq(self.freq) + self.set_freq_text(self.freq) + + 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)) + self.set_nchan_taps(len(self.channel_taps)) + + 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.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.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._offset_slider.set_value(self.offset) + self._offset_text_box.set_value(self.offset) + + def set_nchan_taps(self, nchan_taps): + self.nchan_taps = nchan_taps + + def set_ma_ntaps(self, ma_ntaps): + self.ma_ntaps = ma_ntaps + + def set_freq_text(self, freq_text): + self.freq_text = freq_text + self._freq_text_static_text.set_value(self.freq_text) + + def set_demod_k(self, demod_k): + self.demod_k = demod_k + + def set_channel_decim(self, channel_decim): + self.channel_decim = channel_decim + + def set_bb_interp(self, bb_interp): + self.bb_interp = bb_interp + + def set_bb_decim(self, bb_decim): + self.bb_decim = bb_decim + + def set_baseband_rate(self, baseband_rate): + self.baseband_rate = baseband_rate + +if __name__ == '__main__': + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + (options, args) = parser.parse_args() + tb = usrp_rx_flex() + tb.Run(True) + |