summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau2011-09-27 12:55:26 -0400
committerTom Rondeau2011-09-27 12:57:31 -0400
commit12b5f9c37eebe694d34e0d3976393dad1e0f99d5 (patch)
treecead226639582fe436287d4873eb0f2ae3b0ee49
parent4fec8eba2eb3d362319c8e09bf370edaa10cd1b9 (diff)
downloadgnuradio-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.am1
-rwxr-xr-xgr-digital/examples/benchmark_tx.py25
-rw-r--r--gr-digital/examples/transmit_path.py15
-rw-r--r--gr-digital/examples/uhd_interface.py149
-rw-r--r--gr-digital/python/__init__.py7
-rw-r--r--gr-digital/python/generic_mod_demod.py2
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())