diff options
author | Josh Blum <josh@joshknows.com> | 2011-09-28 22:59:51 -0700 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2011-09-28 22:59:51 -0700 |
commit | b06328b4adee941fe62f12a848cc903097711bdd (patch) | |
tree | fa8b6d5aaadd6bb70786e57891b52a7a17b0b3f6 /gr-digital/examples | |
parent | 3f7db0afa99caeecb18428d7514dadd380d88d56 (diff) | |
parent | 3e8c3125da6234c4d1f8c0eaf869bc86923cb292 (diff) |
Merge branch 'digital' of https://github.com/trondeau/gnuradio into digital
Conflicts:
gr-digital/lib/Makefile.am
gr-digital/python/__init__.py
Diffstat (limited to 'gr-digital/examples')
-rw-r--r-- | gr-digital/examples/Makefile.am | 1 | ||||
-rwxr-xr-x | gr-digital/examples/benchmark_rx.py | 24 | ||||
-rwxr-xr-x | gr-digital/examples/benchmark_tx.py | 26 | ||||
-rw-r--r-- | gr-digital/examples/receive_path.py | 15 | ||||
-rw-r--r-- | gr-digital/examples/transmit_path.py | 15 | ||||
-rw-r--r-- | gr-digital/examples/uhd_interface.py | 215 |
6 files changed, 261 insertions, 35 deletions
diff --git a/gr-digital/examples/Makefile.am b/gr-digital/examples/Makefile.am index 849e826a15..4f745f3a98 100644 --- a/gr-digital/examples/Makefile.am +++ b/gr-digital/examples/Makefile.am @@ -31,6 +31,7 @@ noinst_PYTHON = \ dist_ourdata_SCRIPTS = \ transmit_path.py \ receive_path.py \ + uhd_interface.py \ benchmark_tx.py \ benchmark_rx.py \ tx_voice.py \ diff --git a/gr-digital/examples/benchmark_rx.py b/gr-digital/examples/benchmark_rx.py index 9390540dd4..7eb4fb9b4f 100755 --- a/gr-digital/examples/benchmark_rx.py +++ b/gr-digital/examples/benchmark_rx.py @@ -21,7 +21,6 @@ # from gnuradio import gr, gru -from gnuradio import usrp from gnuradio import eng_notation from gnuradio.eng_option import eng_option from optparse import OptionParser @@ -31,6 +30,7 @@ from gnuradio import digital # from current dir from receive_path import receive_path +from uhd_interface import uhd_receiver import random import struct @@ -44,17 +44,24 @@ class my_top_block(gr.top_block): def __init__(self, demodulator, rx_callback, options): gr.top_block.__init__(self) - # Set up receive path - self.rxpath = receive_path(demodulator, rx_callback, options) + if(options.tx_freq is not None): + self.source = uhd_receiver(options.address, options.bitrate, + options.samples_per_symbol, + options.rx_freq, options.rx_gain, + options.antenna, options.verbose) + options.samples_per_symbol = self.source._sps - if(options.from_file is not None): - self.thr = gr.throttle(gr.sizeof_gr_complex, 1e6) + elif(options.from_file is not None): self.source = gr.file_source(gr.sizeof_gr_complex, options.from_file) - self.connect(self.source, self.thr, self.rxpath) else: - self.thr = gr.throttle(gr.sizeof_gr_complex, 1e6) self.source = gr.null_source(gr.sizeof_gr_complex) - self.connect(self.source, self.thr, self.rxpath) + + # Set up receive path + # do this after for any adjustments to the options that may + # occur in the sinks (specifically the UHD sink) + self.rxpath = receive_path(demodulator, rx_callback, options) + + self.connect(self.source, self.rxpath) # ///////////////////////////////////////////////////////////////////////////// @@ -93,6 +100,7 @@ def main(): help="input file of samples to demod") receive_path.add_options(parser, expert_grp) + uhd_receiver.add_options(parser) for mod in demods.values(): mod.add_options(expert_grp) diff --git a/gr-digital/examples/benchmark_tx.py b/gr-digital/examples/benchmark_tx.py index 92013a532d..a4396dd98b 100755 --- a/gr-digital/examples/benchmark_tx.py +++ b/gr-digital/examples/benchmark_tx.py @@ -21,7 +21,6 @@ # from gnuradio import gr -from gnuradio import uhd from gnuradio import eng_notation from gnuradio.eng_option import eng_option from optparse import OptionParser @@ -31,6 +30,7 @@ from gnuradio import digital # from current dir from transmit_path import transmit_path +from uhd_interface import uhd_transmitter import random, time, struct, sys @@ -42,13 +42,22 @@ class my_top_block(gr.top_block): def __init__(self, modulator, options): gr.top_block.__init__(self) - self.txpath = transmit_path(modulator, options) - - if(options.to_file is not None): + if(options.tx_freq is not None): + self.sink = uhd_transmitter(options.address, options.bitrate, + options.samples_per_symbol, + options.tx_freq, options.tx_gain, + options.antenna, options.verbose) + options.samples_per_symbol = self.sink._sps + + elif(options.to_file is not None): self.sink = gr.file_sink(gr.sizeof_gr_complex, options.to_file) else: self.sink = gr.null_sink(gr.sizeof_gr_complex) + # do this after for any adjustments to the options that may + # occur in the sinks (specifically the UHD sink) + self.txpath = transmit_path(modulator, options) + self.connect(self.txpath, self.sink) # ///////////////////////////////////////////////////////////////////////////// @@ -85,6 +94,7 @@ def main(): help="Output file for modulated samples") transmit_path.add_options(parser, expert_grp) + uhd_transmitter.add_options(parser) for mod in mods.values(): mod.add_options(expert_grp) @@ -94,13 +104,7 @@ def main(): if len(args) != 0: parser.print_help() sys.exit(1) - - if options.to_file is None: - if options.tx_freq is None: - sys.stderr.write("You must specify -f FREQ or --freq FREQ\n") - parser.print_help(sys.stderr) - sys.exit(1) - + if options.from_file is not None: source_file = open(options.from_file, 'r') diff --git a/gr-digital/examples/receive_path.py b/gr-digital/examples/receive_path.py index dd8eb1a0dd..1c5e58963c 100644 --- a/gr-digital/examples/receive_path.py +++ b/gr-digital/examples/receive_path.py @@ -34,17 +34,16 @@ import sys class receive_path(gr.hier_block2): def __init__(self, demod_class, rx_callback, options): gr.hier_block2.__init__(self, "receive_path", - gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature - gr.io_signature(0, 0, 0)) # Output signature - + gr.io_signature(1, 1, gr.sizeof_gr_complex), + gr.io_signature(0, 0, 0)) options = copy.copy(options) # make a copy so we can destructively modify - self._verbose = options.verbose - self._bitrate = options.bitrate # desired bit rate + self._verbose = options.verbose + self._bitrate = options.bitrate # desired bit rate - self._rx_callback = rx_callback # this callback is fired when there's a packet available - self._demod_class = demod_class # the demodulator_class we're using + self._rx_callback = rx_callback # this callback is fired when a packet arrives + self._demod_class = demod_class # the demodulator_class we're using # Get demod_kwargs demod_kwargs = self._demod_class.extract_kwargs_from_options(options) @@ -126,7 +125,7 @@ class receive_path(gr.hier_block2): normal.add_option("-r", "--bitrate", type="eng_float", default=100e3, help="specify bitrate [default=%default].") normal.add_option("-v", "--verbose", action="store_true", default=False) - expert.add_option("-S", "--samples-per-symbol", type="float", default=None, + expert.add_option("-S", "--samples-per-symbol", type="float", default=2, help="set samples/symbol [default=%default]") expert.add_option("", "--log", action="store_true", default=False, help="Log all parts of flow graph to files (CAUTION: lots of data)") diff --git a/gr-digital/examples/transmit_path.py b/gr-digital/examples/transmit_path.py index f22ffb3278..3af37f3308 100644 --- a/gr-digital/examples/transmit_path.py +++ b/gr-digital/examples/transmit_path.py @@ -36,16 +36,15 @@ class transmit_path(gr.hier_block2): See below for what options should hold ''' gr.hier_block2.__init__(self, "transmit_path", - gr.io_signature(0, 0, 0), # Input signature - gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature + gr.io_signature(0,0,0), + gr.io_signature(1,1,gr.sizeof_gr_complex)) options = copy.copy(options) # make a copy so we can destructively modify - self._verbose = options.verbose - self._tx_amplitude = options.tx_amplitude # digital amplitude sent to USRP - self._bitrate = options.bitrate # desired bit rate - - self._modulator_class = modulator_class # the modulator_class we are using + self._verbose = options.verbose + self._tx_amplitude = options.tx_amplitude # digital amplitude sent to USRP + self._bitrate = options.bitrate # desired bit rate + self._modulator_class = modulator_class # the modulator_class we are using # Get mod_kwargs mod_kwargs = self._modulator_class.extract_kwargs_from_options(options) @@ -103,7 +102,7 @@ class transmit_path(gr.hier_block2): help="set transmitter digital amplitude: 0 <= AMPL < 1 [default=%default]") normal.add_option("-v", "--verbose", action="store_true", default=False) - expert.add_option("-S", "--samples-per-symbol", type="float", default=None, + expert.add_option("-S", "--samples-per-symbol", type="float", default=2, help="set samples/symbol [default=%default]") expert.add_option("", "--log", action="store_true", default=False, help="Log all parts of flow graph to file (CAUTION: lots of data)") diff --git a/gr-digital/examples/uhd_interface.py b/gr-digital/examples/uhd_interface.py new file mode 100644 index 0000000000..3e2162ba30 --- /dev/null +++ b/gr-digital/examples/uhd_interface.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python +# +# Copyright 2010,2011 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, uhd +from gnuradio import eng_notation +from gnuradio.eng_option import eng_option +from optparse import OptionParser + +import sys + +def add_freq_option(parser): + """ + Hackery that has the -f / --freq option set both tx_freq and rx_freq + """ + def freq_callback(option, opt_str, value, parser): + parser.values.rx_freq = value + parser.values.tx_freq = value + + if not parser.has_option('--freq'): + parser.add_option('-f', '--freq', type="eng_float", + action="callback", callback=freq_callback, + help="set Tx and/or Rx frequency to FREQ [default=%default]", + metavar="FREQ") + +class uhd_interface: + def __init__(self, istx, address, bitrate, sps, freq=None, + gain=None, antenna=None): + + if(istx): + self.u = uhd.usrp_sink(device_addr=address, + io_type=uhd.io_type.COMPLEX_FLOAT32, + num_channels=1) + else: + self.u = uhd.usrp_source(device_addr=address, + io_type=uhd.io_type.COMPLEX_FLOAT32, + num_channels=1) + + self._addr = address + self._ant = antenna + self._gain = self.set_gain(gain) + self._freq = self.set_freq(freq) + + self._rate, self._sps = self.set_sample_rate(bitrate, sps) + + if(antenna): + self.u.set_antenna(antenna, 0) + + def set_sample_rate(self, bitrate, req_sps): + start_sps = req_sps + while(True): + asked_samp_rate = bitrate * req_sps + self.u.set_samp_rate(asked_samp_rate) + actual_samp_rate = self.u.get_samp_rate() + + sps = actual_samp_rate/bitrate + if(sps < 2): + req_sps +=1 + else: + actual_sps = sps + break + + if(sps != req_sps): + print "\nBit Rate: %f" % (bitrate) + print "Requested sps: %f" % (start_sps) + print "Given sample rate: %f" % (actual_samp_rate) + print "Actual sps for rate: %f" % (actual_sps) + + if(actual_samp_rate != asked_samp_rate): + print "\nRequested sample rate: %f" % (asked_samp_rate) + print "Actual sample rate: %f" % (actual_samp_rate) + + return (actual_samp_rate, actual_sps) + + def set_gain(self, gain=None): + if gain is None: + # if no gain was specified, use the mid-point in dB + g = self.u.get_gain_range() + gain = float(g.start()+g.stop())/2 + print "\nNo gain specified." + print "Setting gain to %f (from [%f, %f])" % \ + (gain, g.start(), g.stop()) + + self.u.set_gain(gain, 0) + return gain + + def set_freq(self, freq=None): + if(freq is None): + sys.stderr.write("You must specify -f FREQ or --freq FREQ\n") + sys.exit(1) + + r = self.u.set_center_freq(freq, 0) + if r: + return freq + else: + frange = self.u.get_freq_range() + sys.stderr.write(("\nRequested frequency (%f) out or range [%f, %f]\n") % \ + (freq, frange.start(), frange.stop())) + sys.exit(1) + +#-------------------------------------------------------------------# +# TRANSMITTER +#-------------------------------------------------------------------# + +class uhd_transmitter(uhd_interface, gr.hier_block2): + def __init__(self, address, bitrate, sps, freq=None, gain=None, + antenna=None, verbose=False): + gr.hier_block2.__init__(self, "uhd_transmitter", + gr.io_signature(1,1,gr.sizeof_gr_complex), + gr.io_signature(0,0,0)) + + # Set up the UHD interface as a transmitter + uhd_interface.__init__(self, True, address, bitrate, sps, + freq, gain, antenna) + + self.connect(self, self.u) + + if(verbose): + self._print_verbage() + + def add_options(parser): + add_freq_option(parser) + parser.add_option("-a", "--address", type="string", default="addr=192.168.10.2", + help="Address of UHD device, [default=%default]") + parser.add_option("-A", "--antenna", type="string", default=None, + help="select Rx Antenna where appropriate") + parser.add_option("", "--tx-freq", type="eng_float", default=None, + help="set transmit frequency to FREQ [default=%default]", + metavar="FREQ") + parser.add_option("", "--tx-gain", type="eng_float", default=None, + help="set transmit gain in dB (default is midpoint)") + parser.add_option("-v", "--verbose", action="store_true", default=False) + + # Make a static method to call before instantiation + add_options = staticmethod(add_options) + + def _print_verbage(self): + """ + Prints information about the UHD transmitter + """ + print "\nUHD Transmitter:" + print "Address: %s" % (self._addr) + print "Freq: %sHz" % (eng_notation.num_to_str(self._freq)) + print "Gain: %f dB" % (self._gain) + print "Sample Rate: %ssps" % (eng_notation.num_to_str(self._rate)) + print "Antenna: %s" % (self._ant) + + + +#-------------------------------------------------------------------# +# RECEIVER +#-------------------------------------------------------------------# + + +class uhd_receiver(uhd_interface, gr.hier_block2): + def __init__(self, address, bitrate, sps, freq=None, gain=None, + antenna=None, verbose=False): + gr.hier_block2.__init__(self, "uhd_receiver", + gr.io_signature(0,0,0), + gr.io_signature(1,1,gr.sizeof_gr_complex)) + + # Set up the UHD interface as a receiver + uhd_interface.__init__(self, False, address, bitrate, sps, + freq, gain, antenna) + + self.connect(self.u, self) + + if(verbose): + self._print_verbage() + + def add_options(parser): + add_freq_option(parser) + parser.add_option("-a", "--address", type="string", default="addr=192.168.10.2", + help="Address of UHD device, [default=%default]") + parser.add_option("-A", "--antenna", type="string", default=None, + help="select Rx Antenna where appropriate") + parser.add_option("", "--rx-freq", type="eng_float", default=None, + help="set receive frequency to FREQ [default=%default]", + metavar="FREQ") + parser.add_option("", "--rx-gain", type="eng_float", default=None, + help="set receive gain in dB (default is midpoint)") + parser.add_option("-v", "--verbose", action="store_true", default=False) + + # Make a static method to call before instantiation + add_options = staticmethod(add_options) + + def _print_verbage(self): + """ + Prints information about the UHD transmitter + """ + print "\nUHD Receiver:" + print "Address: %s" % (self._addr) + print "Freq: %sHz" % (eng_notation.num_to_str(self._freq)) + print "Gain: %f dB" % (self._gain) + print "Sample Rate: %ssps" % (eng_notation.num_to_str(self._rate)) + print "Antenna: %s" % (self._ant) + |