diff options
author | jcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5> | 2007-09-18 18:59:00 +0000 |
---|---|---|
committer | jcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5> | 2007-09-18 18:59:00 +0000 |
commit | e692e71305ecd71d3681fe37f3d76f350d67e276 (patch) | |
tree | dc320c9261303aa9a92f4d12bdba85f82720d1bf /gnuradio-examples/python/dect | |
parent | 6ad04a094ced626e46c210b9847eae46a1ae8e67 (diff) |
Merge r6461:6464 from jcorgan/t162-staging into trunk.
* Final gr.top_block and gr.hier_block2 implementation inside
gnuradio-core/src/lib/runtime
* Implementation of gr.hier_block2 versions of all the old-style blocks
in blks. These live in blks2.
* Addition of gr.hier_block2 based versions of gr-wxgui blocks
* Conversion of all the example code in gnuradio-examples to use this
new code
* Conversion of all the gr-utils scripts to use the new code
The OFDM examples and related hierarchical blocks have not yet been
converted. Code in the rest of the tree that is outside the core
and example components has also not yet been converted.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@6466 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gnuradio-examples/python/dect')
-rw-r--r-- | gnuradio-examples/python/dect/Makefile.am | 33 | ||||
-rw-r--r-- | gnuradio-examples/python/dect/README | 46 | ||||
-rw-r--r-- | gnuradio-examples/python/dect/dect_receiver.py | 80 | ||||
-rwxr-xr-x | gnuradio-examples/python/dect/usrp_dect.py | 62 | ||||
-rw-r--r-- | gnuradio-examples/python/dect/usrp_source.py | 124 |
5 files changed, 345 insertions, 0 deletions
diff --git a/gnuradio-examples/python/dect/Makefile.am b/gnuradio-examples/python/dect/Makefile.am new file mode 100644 index 0000000000..c65bd4c42d --- /dev/null +++ b/gnuradio-examples/python/dect/Makefile.am @@ -0,0 +1,33 @@ +# +# Copyright 2007 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 + +EXTRA_DIST = \ + README \ + dect_receiver.py \ + usrp_source.py \ + usrp_dect.py + +ourdatadir = $(exampledir)/dect +ourdata_DATA = $(EXTRA_DIST) + +MOSTLYCLEANFILES = *.pyc *~ diff --git a/gnuradio-examples/python/dect/README b/gnuradio-examples/python/dect/README new file mode 100644 index 0000000000..c8853f185b --- /dev/null +++ b/gnuradio-examples/python/dect/README @@ -0,0 +1,46 @@ +This directory contains a work in progress service monitor for DECT +digital cordless phone base stations and handsets. + + +Status +------ + +2007 Apr 27 - Converted to new hier_block2 format +2007 Apr 03 - Development on hold. +2007 Feb 11 - Added GMSK demodulation and option to log to file +2007 Feb 10 - Able to tune and log filtered baseband to file + + +Files +----- + +usrp_dect.py - DECT receiver application + +dect_receiver.py - Top-level hierarchical block (new type) implementing + receiver + +usrp_source.py - Hierarchical block (new type) implementing a USRP + complex source, with convenience functions for tuning, + gain, decimation, etc. + +gmsk2.py - Hierarchical block (new type) implementing GMSK + modulation and demodulation. This will eventually go + into the core blksimpl directory + +DECT Modulation Details +----------------------- + +In the US, the FCC has allocated four carrier frequencies for DECT usage: + +Channel Frequency +------- --------- + 1 1921.536 MHz + 2 1923.264 MHz + 3 1924.992 MHz + 4 1926.720 MHz + +These are spaced at 1.728 MHz intervals. + +The DECT PHY uses GMSK with a 0.5 bandwidth-time product at 1.152 Msym/sec, +for an occupied bandwidth (99% power) of 1.186 MHz (1.03 x symbol rate.) + diff --git a/gnuradio-examples/python/dect/dect_receiver.py b/gnuradio-examples/python/dect/dect_receiver.py new file mode 100644 index 0000000000..89e60c949e --- /dev/null +++ b/gnuradio-examples/python/dect/dect_receiver.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# +# Copyright 2007 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, optfir, blks2 +from usrp_source import usrp_source_c + +_dect_symbol_rate = 1.152e6 +_dect_occupied_bandwidth = _dect_symbol_rate * 1.03 # BT=0.5 +_dect_channel_bandwidth = 1.728e6 + +# Top-level hierarchical block that implements DECT demodulation and +# decoding. +class dect_receiver(gr.top_block): + def __init__(self, options): + gr.top_block.__init__(self, "dect_receiver") + self._options = options + + # Need greater than 2 samples per symbol. This makes a decimation + # rate of 26 and a samples per symbol of 2.136752 + if_rate = 2.461538e6 + self._usrp = usrp_source_c(which=0, + subdev_spec=options.rx_subdev_spec, + if_rate=if_rate, + gain=options.gain, + freq=options.freq, + calibration=options.calibration, + verbose=options.verbose) + + # Filter baseband to 1.186 MHz passband, 1.728 MHz stopband + chan_taps = optfir.low_pass(1.0, # Gain + if_rate, # Sample rate + _dect_occupied_bandwidth/2, # One sided modulation bandwidth + _dect_channel_bandwidth/2, # One sided channel bandwidth + 1.0, # Passband ripple (db) + 60) # Stopband attenuation (db) + if self._options.verbose: + print "Channel filter has", len(chan_taps), "taps" + self._channel_filter = gr.freq_xlating_fir_filter_ccf(1, # Decimation rate + chan_taps, # Filter taps + 0.0, # Offset frequency + if_rate) # Sample rate + + self._demod = blks2.gmsk_demod(samples_per_symbol=if_rate/_dect_symbol_rate, + verbose=options.verbose) + + self._sink = gr.null_sink(gr.sizeof_char) + self.connect(self._usrp, self._channel_filter, self._demod, self._sink) + + # Log baseband to file if requested + if options.log_baseband is not None: + if options.verbose: + print "Logging baseband to file", options.log_baseband + self.baseband_log = gr.file_sink(gr.sizeof_gr_complex, options.log_baseband) + self.connect(self._channel_filter, self.baseband_log) + + # Log demodulator output to file if requested + if options.log_demod is not None: + if options.verbose: + print "Logging demodulator to file", options.log_demod + self.demod_log = gr.file_sink(gr.sizeof_char, options.log_demod) + self.connect(self._demod, self.demod_log) diff --git a/gnuradio-examples/python/dect/usrp_dect.py b/gnuradio-examples/python/dect/usrp_dect.py new file mode 100755 index 0000000000..27259d8127 --- /dev/null +++ b/gnuradio-examples/python/dect/usrp_dect.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# +# Copyright 2007 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, eng_notation +from gnuradio.eng_option import eng_option +from optparse import OptionParser +from dect_receiver import dect_receiver +import sys + +def main(): + parser = OptionParser(option_class=eng_option) + 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("-f", "--freq", type="eng_float", default=None, + help="set frequency to FREQ", metavar="FREQ") + parser.add_option("", "--calibration", type="eng_float", default=0.0, + help="set frequency calibration offset to FREQ") + parser.add_option("-g", "--gain", type="eng_float", default=None, + help="set gain in dB (default is midpoint)") + parser.add_option("-v", "--verbose", action="store_true", default=False, + help="print extra debugging info") + parser.add_option("", "--log-baseband", default=None, + help="log filtered baseband to file") + parser.add_option("", "--log-demod", default=None, + help="log demodulator output to file") + (options, args) = parser.parse_args() + + if len(sys.argv) == 1 or len(args) != 0: + parser.print_help() + sys.exit(1) + + # Create an instance of a hierarchical block + top_block = dect_receiver(options) + + try: + # Run forever + top_block.run() + except KeyboardInterrupt: + # Ctrl-C exits + pass + +if __name__ == '__main__': + main () diff --git a/gnuradio-examples/python/dect/usrp_source.py b/gnuradio-examples/python/dect/usrp_source.py new file mode 100644 index 0000000000..6a779840f2 --- /dev/null +++ b/gnuradio-examples/python/dect/usrp_source.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python +# +# Copyright 2007 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, usrp, eng_notation +n2s = eng_notation.num_to_str + +# Hierarchical block implementing a USRP source for complex floats, +# with convenience functions for gain, tune, decimation, etc. +# +class usrp_source_c(gr.hier_block2): + """ + Create a USRP source object supplying complex floats. + """ + def __init__(self, which=0, subdev_spec=None, gain=None, if_rate=None, + freq=0.0, calibration=0.0, verbose=False): + # Call hierarchical block constructor + gr.hier_block2.__init__(self, + "usrp_source_c", # Block typename + gr.io_signature(0,0,0), # Input signature + gr.io_signature(1,1,gr.sizeof_gr_complex)) # Output signature + + self._verbose = verbose + self._u = usrp.source_c(which) + if self._verbose: + print 'ADC sample rate is', n2s(self._u.adc_rate()), "sps" + self.set_subdev(subdev_spec) + self.set_if_rate(if_rate) + self.set_gain(gain) + self.set_calibration(calibration) + self.tune(freq) + self.connect(self._u, self) + + def set_subdev(self, subdev_spec): + if subdev_spec is None: + subdev_spec = self.pick_subdevice() + self._subdev = usrp.selected_subdev(self._u, subdev_spec) + self._u.set_mux(usrp.determine_rx_mux_value(self._u, subdev_spec)) + if self._verbose: + print 'RX using', self._subdev.name(), 'daughterboard' + + def pick_subdevice(self): + """ + The user didn't specify a subdevice. + If there's a daughterboard on A, select A. + If there's a daughterboard on B, select B. + Otherwise, select A. + """ + if self._u.db[0][0].dbid() >= 0: # dbid is < 0 if there's no d'board or a problem + return (0, 0) + if self._u.db[1][0].dbid() >= 0: + return (1, 0) + return (0, 0) + + def set_if_rate(self, if_rate): + # If no IF rate specified, set to maximum decimation + if if_rate is None: + self._decim = 256 + else: + self._decim = int(self._u.adc_rate()/if_rate) + + self._u.set_decim_rate(self._decim) + self._if_rate = self._u.adc_rate()/self._decim + + if self._verbose: + print "USRP decimation rate is", self._decim + print "USRP IF rate is", n2s(self._if_rate), "sps" + + def set_gain(self, gain): + # If no gain specified, set to midrange + if gain is None: + g = self._subdev.gain_range() + gain = (g[0]+g[1])/2.0 + self._gain = gain + self._subdev.set_gain(self._gain) + + def set_calibration(self, calibration): + self._cal = calibration + if self._verbose: + print "Using frequency calibration offset of", n2s(calibration), "Hz" + + def tune(self, freq): + """ + Set the center frequency we're interested in. + + @param target_freq: frequency in Hz + @type: bool + + Tuning is a two step process. First we ask the front-end to + tune as close to the desired frequency as it can. Then we use + the result of that operation and our target_frequency to + determine the value for the digital down converter. + """ + self._tune_result = usrp.tune(self._u, 0, self._subdev, freq+self._cal) + if self._tune_result: + if self._verbose: + print "Baseband frequency is", n2s(self._tune_result.baseband_freq), "Hz" + print "DXC frequency is", n2s(self._tune_result.dxc_freq), "Hz" + print "Center frequency is", n2s(freq), "Hz" + print "Residual frequency is", n2s(self._tune_result.residual_freq), "Hz" + return True + + return False + +if __name__ == '__main__': + src = usrp_source_c(verbose=True) |