diff options
author | Tom Rondeau | 2011-09-27 12:55:26 -0400 |
---|---|---|
committer | Tom Rondeau | 2011-09-27 12:57:31 -0400 |
commit | 12b5f9c37eebe694d34e0d3976393dad1e0f99d5 (patch) | |
tree | cead226639582fe436287d4873eb0f2ae3b0ee49 | |
parent | 4fec8eba2eb3d362319c8e09bf370edaa10cd1b9 (diff) | |
download | gnuradio-12b5f9c37eebe694d34e0d3976393dad1e0f99d5.tar.gz gnuradio-12b5f9c37eebe694d34e0d3976393dad1e0f99d5.tar.bz2 gnuradio-12b5f9c37eebe694d34e0d3976393dad1e0f99d5.zip |
digital: bug fixes for digital mods. Adding fist pass at a UHD benchmark transit chain. Automatically selects the right samples/symbol and sample rate to achieve requested bitrate.
-rw-r--r-- | gr-digital/examples/Makefile.am | 1 | ||||
-rwxr-xr-x | gr-digital/examples/benchmark_tx.py | 25 | ||||
-rw-r--r-- | gr-digital/examples/transmit_path.py | 15 | ||||
-rw-r--r-- | gr-digital/examples/uhd_interface.py | 149 | ||||
-rw-r--r-- | gr-digital/python/__init__.py | 7 | ||||
-rw-r--r-- | gr-digital/python/generic_mod_demod.py | 2 |
6 files changed, 174 insertions, 25 deletions
diff --git a/gr-digital/examples/Makefile.am b/gr-digital/examples/Makefile.am index 849e826a1..4f745f3a9 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_tx.py b/gr-digital/examples/benchmark_tx.py index 92013a532..dd8b4ea9a 100755 --- a/gr-digital/examples/benchmark_tx.py +++ b/gr-digital/examples/benchmark_tx.py @@ -31,6 +31,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 +43,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 +95,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 +105,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/transmit_path.py b/gr-digital/examples/transmit_path.py index f22ffb327..3af37f330 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 000000000..9ab9bb196 --- /dev/null +++ b/gr-digital/examples/uhd_interface.py @@ -0,0 +1,149 @@ +#!/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_transmitter(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)) + + self.u = uhd.usrp_sink(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) + + self.connect(self, self.u) + + if(verbose): + self._print_verbage() + + 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) + + 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 "RATE: ", self._rate + 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 "Samp;e Rate: %ssps" % (eng_notation.num_to_str(self._rate)) + print "Antenna: %s" % (self._ant) diff --git a/gr-digital/python/__init__.py b/gr-digital/python/__init__.py index b8060140e..0fc48cc79 100644 --- a/gr-digital/python/__init__.py +++ b/gr-digital/python/__init__.py @@ -26,13 +26,8 @@ from psk2 import * from bpsk import * from qpsk import * from qam import * -<<<<<<< HEAD from gmsk import * from pkt import * -from packet_utils import * from crc import * -======= -from ofdm import * -from pkt import * +from packet_utils import * from modulation_utils2 import * ->>>>>>> next diff --git a/gr-digital/python/generic_mod_demod.py b/gr-digital/python/generic_mod_demod.py index b1986512f..7d98c87da 100644 --- a/gr-digital/python/generic_mod_demod.py +++ b/gr-digital/python/generic_mod_demod.py @@ -112,7 +112,7 @@ class generic_mod(gr.hier_block2): self._differential = differential if self._samples_per_symbol < 2: - raise TypeError, ("sbp must be >= 2, is %d" % self._samples_per_symbol) + raise TypeError, ("sbp must be >= 2, is %f" % self._samples_per_symbol) arity = pow(2,self.bits_per_symbol()) |