diff options
Diffstat (limited to 'gnuradio-examples/python/hier')
41 files changed, 0 insertions, 4139 deletions
diff --git a/gnuradio-examples/python/hier/Makefile.am b/gnuradio-examples/python/hier/Makefile.am deleted file mode 100644 index 10bda3b474..0000000000 --- a/gnuradio-examples/python/hier/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright 2006 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. -# - -SUBDIRS = \ - audio \ - dect \ - digital \ - ofdm \ - networking \ - sounder \ - usrp diff --git a/gnuradio-examples/python/hier/audio/Makefile.am b/gnuradio-examples/python/hier/audio/Makefile.am deleted file mode 100644 index 34538d180f..0000000000 --- a/gnuradio-examples/python/hier/audio/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright 2006 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. -# - -EXTRA_DIST = \ - dial_tone2.py diff --git a/gnuradio-examples/python/hier/audio/dial_tone2.py b/gnuradio-examples/python/hier/audio/dial_tone2.py deleted file mode 100755 index 70d1e53d20..0000000000 --- a/gnuradio-examples/python/hier/audio/dial_tone2.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2004,2005,2006 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 -from gnuradio import audio -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -# Top-level block creating a dial tone -# Derives from new class gr.hier_block2 -class dial_tone(gr.top_block): - def __init__(self, - sample_rate, # Audio output sample rate (int) - audio_output, # Audio output device - amplitude): # Output volume (0.0-1.0) - - gr.top_block.__init__(self, "dial_tone") - - src0 = gr.sig_source_f(sample_rate, gr.GR_SIN_WAVE, 350, amplitude) - src1 = gr.sig_source_f(sample_rate, gr.GR_SIN_WAVE, 440, amplitude) - dst = audio.sink(sample_rate, audio_output) - - self.connect(src0, (dst, 0)) - self.connect(src1, (dst, 1)) - -if __name__ == '__main__': - parser = OptionParser(option_class=eng_option) - parser.add_option("-O", "--audio-output", type="string", default="", - help="pcm output device name. E.g., hw:0,0 or /dev/dsp") - parser.add_option("-r", "--sample-rate", type="eng_float", default=48000, - help="set sample rate to RATE (48000)") - parser.add_option("-a", "--amplitude", type="eng_float", default=0.1, - help="set output volume to AMPLITUDE (0.1)") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - - # Create an instance of a hierarchical block - top = dial_tone(int(options.sample_rate), - options.audio_output, - options.amplitude) - - try: - # Run forever - top.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass diff --git a/gnuradio-examples/python/hier/dect/Makefile.am b/gnuradio-examples/python/hier/dect/Makefile.am deleted file mode 100644 index 5ab1589aea..0000000000 --- a/gnuradio-examples/python/hier/dect/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -# -# 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. -# - -EXTRA_DIST = \ - README \ - dect_receiver.py \ - usrp_source.py \ - usrp_dect.py - -MOSTLYCLEANFILES = *.pyc *~ diff --git a/gnuradio-examples/python/hier/dect/README b/gnuradio-examples/python/hier/dect/README deleted file mode 100644 index c8853f185b..0000000000 --- a/gnuradio-examples/python/hier/dect/README +++ /dev/null @@ -1,46 +0,0 @@ -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/hier/dect/dect_receiver.py b/gnuradio-examples/python/hier/dect/dect_receiver.py deleted file mode 100644 index 80ea93794a..0000000000 --- a/gnuradio-examples/python/hier/dect/dect_receiver.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/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 -from usrp_source import usrp_source_c -from gmsk2 import gmsk2_demod - -_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 = gmsk2_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/hier/dect/gmsk2.py b/gnuradio-examples/python/hier/dect/gmsk2.py deleted file mode 100644 index f26c566552..0000000000 --- a/gnuradio-examples/python/hier/dect/gmsk2.py +++ /dev/null @@ -1,278 +0,0 @@ -# -# GMSK modulation and demodulation. -# -# -# Copyright 2005,2006,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. -# - -# See gnuradio-examples/python/digital for examples - -from gnuradio import gr -from gnuradio import modulation_utils -from math import pi -import numpy -from pprint import pprint -import inspect - -# default values (used in __init__ and add_options) -_def_samples_per_symbol = 2 -_def_bt = 0.35 -_def_verbose = False -_def_log = False - -_def_gain_mu = 0.05 -_def_mu = 0.5 -_def_freq_error = 0.0 -_def_omega_relative_limit = 0.005 - - -# ///////////////////////////////////////////////////////////////////////////// -# GMSK modulator -# ///////////////////////////////////////////////////////////////////////////// - -class gmsk2_mod(gr.hier_block2): - - def __init__(self, - samples_per_symbol=_def_samples_per_symbol, - bt=_def_bt, - verbose=_def_verbose, - log=_def_log): - """ - Hierarchical block for Gaussian Minimum Shift Key (GMSK) - modulation. - - The input is a byte stream (unsigned char) and the - output is the complex modulated signal at baseband. - - @param samples_per_symbol: samples per baud >= 2 - @type samples_per_symbol: integer - @param bt: Gaussian filter bandwidth * symbol time - @type bt: float - @param verbose: Print information about modulator? - @type verbose: bool - @param debug: Print modualtion data to files? - @type debug: bool - """ - gr.hier_block2.__init__(self, - "gmsk2_mod", # Block typename - gr.io_signature(1,1,gr.sizeof_char), # Input signature - gr.io_signature(1,1,gr.sizeof_gr_complex)) # Output signature - - self._samples_per_symbol = samples_per_symbol - self._bt = bt - - if not isinstance(samples_per_symbol, int) or samples_per_symbol < 2: - raise TypeError, ("samples_per_symbol must be an integer >= 2, is %r" % (samples_per_symbol,)) - - ntaps = 4 * samples_per_symbol # up to 3 bits in filter at once - sensitivity = (pi / 2) / samples_per_symbol # phase change per bit = pi / 2 - - # Turn it into NRZ data. - self.nrz = gr.bytes_to_syms() - - # Form Gaussian filter - # Generate Gaussian response (Needs to be convolved with window below). - self.gaussian_taps = gr.firdes.gaussian( - 1, # gain - samples_per_symbol, # symbol_rate - bt, # bandwidth * symbol time - ntaps # number of taps - ) - - self.sqwave = (1,) * samples_per_symbol # rectangular window - self.taps = numpy.convolve(numpy.array(self.gaussian_taps),numpy.array(self.sqwave)) - self.gaussian_filter = gr.interp_fir_filter_fff(samples_per_symbol, self.taps) - - # FM modulation - self.fmmod = gr.frequency_modulator_fc(sensitivity) - - if verbose: - self._print_verbage() - - self.connect(self, self.nrz, self.gaussian_filter, self.fmmod, self) - - if log: - self._setup_logging() - - def samples_per_symbol(self): - return self._samples_per_symbol - - def bits_per_symbol(self=None): # staticmethod that's also callable on an instance - return 1 - bits_per_symbol = staticmethod(bits_per_symbol) # make it a static method. - - def _print_verbage(self): - print "bits per symbol = %d" % self.bits_per_symbol() - print "Gaussian filter bt = %.2f" % self._bt - - - def _setup_logging(self): - print "Modulation logging turned on." - self.connect(self.nrz, gr.file_sink(gr.sizeof_float, "nrz.dat")) - self.connect(self.gaussian_filter, gr.file_sink(gr.sizeof_float, "gaussian_filter.dat")) - self.connect(self.fmmod, gr.file_sink(gr.sizeof_gr_complex, "fmmod.dat")) - - def add_options(parser): - """ - Adds GMSK modulation-specific options to the standard parser - """ - parser.add_option("", "--bt", type="float", default=_def_bt, - help="set bandwidth-time product [default=%default] (GMSK)") - add_options=staticmethod(add_options) - - # FIXME: figure out what has to change for gr.hier_block2 version - #def extract_kwargs_from_options(options): - # """ - # Given command line options, create dictionary suitable for passing to __init__ - # """ - # return modulation_utils.extract_kwargs_from_options(gmsk_mod.__init__, - # ('self', 'fg'), options) - #extract_kwargs_from_options=staticmethod(extract_kwargs_from_options) - - -# ///////////////////////////////////////////////////////////////////////////// -# GMSK demodulator -# ///////////////////////////////////////////////////////////////////////////// - -class gmsk2_demod(gr.hier_block2): - - def __init__(self, - samples_per_symbol=_def_samples_per_symbol, - gain_mu=_def_gain_mu, - mu=_def_mu, - omega_relative_limit=_def_omega_relative_limit, - freq_error=_def_freq_error, - verbose=_def_verbose, - log=_def_log): - """ - Hierarchical block for Gaussian Minimum Shift Key (GMSK) - demodulation. - - The input is the complex modulated signal at baseband. - The output is a stream of bits packed 1 bit per byte (the LSB) - - @param samples_per_symbol: samples per baud - @type samples_per_symbol: integer - @param verbose: Print information about modulator? - @type verbose: bool - @param log: Print modualtion data to files? - @type log: bool - - Clock recovery parameters. These all have reasonble defaults. - - @param gain_mu: controls rate of mu adjustment - @type gain_mu: float - @param mu: fractional delay [0.0, 1.0] - @type mu: float - @param omega_relative_limit: sets max variation in omega - @type omega_relative_limit: float, typically 0.000200 (200 ppm) - @param freq_error: bit rate error as a fraction - @param float - """ - - gr.hier_block2.__init__(self, - "gmsk2_demod", # Block typename - gr.io_signature(1,1,gr.sizeof_gr_complex), # Input signature - gr.io_signature(1,1,gr.sizeof_char)) # Output signature - - self._samples_per_symbol = samples_per_symbol - self._gain_mu = gain_mu - self._mu = mu - self._omega_relative_limit = omega_relative_limit - self._freq_error = freq_error - - if samples_per_symbol < 2: - raise TypeError, "samples_per_symbol >= 2, is %f" % samples_per_symbol - - self._omega = samples_per_symbol*(1+self._freq_error) - - self._gain_omega = .25 * self._gain_mu * self._gain_mu # critically damped - - # Demodulate FM - sensitivity = (pi / 2) / samples_per_symbol - self.fmdemod = gr.quadrature_demod_cf(1.0 / sensitivity) - - # the clock recovery block tracks the symbol clock and resamples as needed. - # the output of the block is a stream of soft symbols (float) - self.clock_recovery = gr.clock_recovery_mm_ff(self._omega, self._gain_omega, - self._mu, self._gain_mu, - self._omega_relative_limit) - - # slice the floats at 0, outputting 1 bit (the LSB of the output byte) per sample - self.slicer = gr.binary_slicer_fb() - - if verbose: - self._print_verbage() - - self.connect(self, self.fmdemod, self.clock_recovery, self.slicer, self) - - if log: - self._setup_logging() - - def samples_per_symbol(self): - return self._samples_per_symbol - - def bits_per_symbol(self=None): # staticmethod that's also callable on an instance - return 1 - bits_per_symbol = staticmethod(bits_per_symbol) # make it a static method. - - def _print_verbage(self): - print "bits per symbol = %d" % self.bits_per_symbol() - print "M&M clock recovery omega = %f" % self._omega - print "M&M clock recovery gain mu = %f" % self._gain_mu - print "M&M clock recovery mu = %f" % self._mu - print "M&M clock recovery omega rel. limit = %f" % self._omega_relative_limit - print "frequency error = %f" % self._freq_error - - - def _setup_logging(self): - print "Demodulation logging turned on." - self.connect(fmdemod, gr.file_sink(gr.sizeof_float, "fmdemod.dat")) - self.connect(clock_recovery, gr.file_sink(gr.sizeof_float, "clock_recovery.dat")) - self.connect(slicer, gr.file_sink(gr.sizeof_char, "slicer.dat")) - - def add_options(parser): - """ - Adds GMSK demodulation-specific options to the standard parser - """ - parser.add_option("", "--gain-mu", type="float", default=_def_gain_mu, - help="M&M clock recovery gain mu [default=%default] (GMSK/PSK)") - parser.add_option("", "--mu", type="float", default=_def_mu, - help="M&M clock recovery mu [default=%default] (GMSK/PSK)") - parser.add_option("", "--omega-relative-limit", type="float", default=_def_omega_relative_limit, - help="M&M clock recovery omega relative limit [default=%default] (GMSK/PSK)") - parser.add_option("", "--freq-error", type="float", default=_def_freq_error, - help="M&M clock recovery frequency error [default=%default] (GMSK)") - add_options=staticmethod(add_options) - - # FIXME: figure out what this is for gr.hier_block2 version - #def extract_kwargs_from_options(options): - # """ - # Given command line options, create dictionary suitable for passing to __init__ - # """ - # return modulation_utils.extract_kwargs_from_options(gmsk_demod.__init__, - # ('self', 'fg'), options) - #extract_kwargs_from_options=staticmethod(extract_kwargs_from_options) - -# -# Add these to the mod/demod registry -# -modulation_utils.add_type_1_mod('gmsk2', gmsk2_mod) -modulation_utils.add_type_1_demod('gmsk2', gmsk2_demod) diff --git a/gnuradio-examples/python/hier/dect/usrp_dect.py b/gnuradio-examples/python/hier/dect/usrp_dect.py deleted file mode 100755 index 27259d8127..0000000000 --- a/gnuradio-examples/python/hier/dect/usrp_dect.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/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/hier/dect/usrp_source.py b/gnuradio-examples/python/hier/dect/usrp_source.py deleted file mode 100644 index 6a779840f2..0000000000 --- a/gnuradio-examples/python/hier/dect/usrp_source.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/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) diff --git a/gnuradio-examples/python/hier/digital/Makefile.am b/gnuradio-examples/python/hier/digital/Makefile.am deleted file mode 100644 index 35824b1361..0000000000 --- a/gnuradio-examples/python/hier/digital/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -# -# Copyright 2004 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. -# - -EXTRA_DIST = \ - README \ - benchmark_loopback.py \ - benchmark_rx.py \ - benchmark_tx.py \ - fusb_options.py \ - pick_bitrate.py \ - receive_path.py \ - receive_path_lb.py \ - rx_voice.py \ - transmit_path.py \ - transmit_path_lb.py \ - tunnel.py \ - tx_voice.py - -MOSTLYCLEANFILES = *~ *.pyc *.dat diff --git a/gnuradio-examples/python/hier/digital/README b/gnuradio-examples/python/hier/digital/README deleted file mode 100644 index 9d8a404976..0000000000 --- a/gnuradio-examples/python/hier/digital/README +++ /dev/null @@ -1,77 +0,0 @@ -Quick overview of what's here: - -* benchmark_tx.py: generates packets of the size you -specify and sends them across the air using the USRP. Known to work -well using the USRP with the RFX transceiver daughterboards. -You can specify the bitrate to use with the -r <bitrate> command line -parameter. The default is 500k. Some machines will do 1M or more. -You can select the modulation to use with the -m <modulation> command -line argument. The legal values for <modulation> are gmsk, dbpsk and dqpsk. - -* benchmark_rx.py: the receiver half of benchmark_tx.py. -Command line arguments are pretty much the same as rx. Works well -with a USRP and RFX transceiver daughterboards. Will also work -with TVRX daugherboard, but you'll need to fiddle with the gain. See -below. Prints a summary of each packet received and keeps a running -total of packets received, and how many of them were error free. -There are two levels of error reporting going on. If the access code -(PN code) and header of a packet were properly detected, then you'll -get an output line. If the CRC32 of the payload was correct you get -"ok = True", else "ok = False". The "pktno" is extracted from the -received packet. If there are skipped numbers, you're missing some -packets. Be sure you've got a suitable antenna connected to the TX/RX -port on each board. For the RFX-400, "70 cm" / 420 MHz antennas for ham -handi-talkies work great. These are available at ham radio supplies, -etc. The boards need to be at least 3m apart. You can also try -experimenting with the rx gain (-g <gain> command line option). - -Generally speaking, I start the rx first on one machine, and then fire -up the tx on the other machine. The tx also supports a discontinous -transmission mode where it sends bursts of 5 packets and then waits 1 -second. This is useful for ensuring that all the receiver control -loops lock up fast enough. - -* tunnel.py: This program provides a framework for building your own -MACs. It creates a "TAP" interface in the kernel, typically gr0, -and sends and receives ethernet frames through it. See -/usr/src/linux/Documentation/networking/tuntap.txt and/or Google for -"universal tun tap". The Linux 2.6 kernel includes the tun module, you -don't have to build it. You may have to "modprobe tun" if it's not -loaded by default. If /dev/net/tun doesn't exist, try "modprobe tun". - -To run this program you'll need to be root or running with the -appropriate capability to open the tun interface. You'll need to fire -up two copies on different machines. Once each is running you'll need -to ifconfig the gr0 interface to set the IP address. - -This will allow two machines to talk, but anything beyond the two -machines depends on your networking setup. Left as an exercise... - -On machine A: - - $ su - # ./tunnel.py --freq 423.0M --bitrate 500k - # # in another window on A, also as root... - # ifconfig gr0 192.168.200.1 - - -On machine B: - - $ su - # ./tunnel.py --freq 423.0M --bitrate 500k - # # in another window on B, also as root... - # ifconfig gr0 192.168.200.2 - -Now, on machine A you shold be able to ping machine B: - - $ ping 192.168.200.2 - -and you should see some output for each packet in the -tunnel.py window if you used the -v option. - -Likewise, on machine B: - - $ ping 192.168.200.1 - -This now uses a carrier sense MAC, so you should be able to ssh -between the machines, web browse, etc. diff --git a/gnuradio-examples/python/hier/digital/benchmark_loopback.py b/gnuradio-examples/python/hier/digital/benchmark_loopback.py deleted file mode 100755 index 31dfb991ba..0000000000 --- a/gnuradio-examples/python/hier/digital/benchmark_loopback.py +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/env python -#!/usr/bin/env python -# -# Copyright 2005, 2006,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, gru, modulation_utils -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -import random, time, struct, sys, math - -# from current dir -from transmit_path_lb import transmit_path -from receive_path_lb import receive_path -import fusb_options - -class awgn_channel(gr.hier_block2): - def __init__(self, sample_rate, noise_voltage, frequency_offset, seed=False): - gr.hier_block2.__init__(self, "awgn_channel", - gr.io_signature(1,1,gr.sizeof_gr_complex), # Input signature - gr.io_signature(1,1,gr.sizeof_gr_complex)) # Output signature - - # Create the Gaussian noise source - if not seed: - self.noise = gr.noise_source_c(gr.GR_GAUSSIAN, noise_voltage) - else: - rseed = int(time.time()) - self.noise = gr.noise_source_c(gr.GR_GAUSSIAN, noise_voltage, rseed) - self.adder = gr.add_cc() - - # Create the frequency offset - self.offset = gr.sig_source_c((sample_rate*1.0), gr.GR_SIN_WAVE, frequency_offset, 1.0, 0.0) - self.mixer = gr.multiply_cc() - - # Connect the components - self.connect(self, (self.mixer, 0)) - self.connect(self.offset, (self.mixer, 1)) - self.connect(self.mixer, (self.adder, 0)) - self.connect(self.noise, (self.adder, 1)) - self.connect(self.adder, self) - - -class my_graph(gr.top_block): - def __init__(self, mod_class, demod_class, rx_callback, options): - gr.top_block.__init__(self, "my_graph") - - channelon = True; - - SNR = 10.0**(options.snr/10.0) - frequency_offset = options.frequency_offset - - power_in_signal = abs(options.tx_amplitude)**2 - noise_power = power_in_signal/SNR - noise_voltage = math.sqrt(noise_power) - - self.txpath = transmit_path(mod_class, options) - self.throttle = gr.throttle(gr.sizeof_gr_complex, options.sample_rate) - self.rxpath = receive_path(demod_class, rx_callback, options) - - if channelon: - self.channel = awgn_channel(options.sample_rate, noise_voltage, frequency_offset, options.seed) - self.connect(self.txpath, self.throttle, self.channel, self.rxpath) - else: - self.connect(self.txpath, self.throttle, self.rxpath) - -# ///////////////////////////////////////////////////////////////////////////// -# main -# ///////////////////////////////////////////////////////////////////////////// - -def main(): - - global n_rcvd, n_right - - n_rcvd = 0 - n_right = 0 - - def rx_callback(ok, payload): - global n_rcvd, n_right - (pktno,) = struct.unpack('!H', payload[0:2]) - n_rcvd += 1 - if ok: - n_right += 1 - - print "ok = %5s pktno = %4d n_rcvd = %4d n_right = %4d" % ( - ok, pktno, n_rcvd, n_right) - - def send_pkt(payload='', eof=False): - return top_block.txpath.send_pkt(payload, eof) - - - mods = modulation_utils.type_1_mods() - demods = modulation_utils.type_1_demods() - - parser = OptionParser(option_class=eng_option, conflict_handler="resolve") - expert_grp = parser.add_option_group("Expert") - channel_grp = parser.add_option_group("Channel") - - parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(), - default='dbpsk', - help="Select modulation from: %s [default=%%default]" - % (', '.join(mods.keys()),)) - - parser.add_option("-s", "--size", type="eng_float", default=1500, - help="set packet size [default=%default]") - parser.add_option("-M", "--megabytes", type="eng_float", default=1.0, - help="set megabytes to transmit [default=%default]") - parser.add_option("","--discontinuous", action="store_true", default=False, - help="enable discontinous transmission (bursts of 5 packets)") - - channel_grp.add_option("", "--sample-rate", type="eng_float", default=1e5, - help="set speed of channel/simulation rate to RATE [default=%default]") - channel_grp.add_option("", "--snr", type="eng_float", default=30, - help="set the SNR of the channel in dB [default=%default]") - channel_grp.add_option("", "--frequency-offset", type="eng_float", default=0, - help="set frequency offset introduced by channel [default=%default]") - channel_grp.add_option("", "--seed", action="store_true", default=False, - help="use a random seed for AWGN noise [default=%default]") - - transmit_path.add_options(parser, expert_grp) - receive_path.add_options(parser, expert_grp) - - for mod in mods.values(): - mod.add_options(expert_grp) - for demod in demods.values(): - demod.add_options(expert_grp) - - (options, args) = parser.parse_args () - - if len(args) != 0: - parser.print_help() - sys.exit(1) - - r = gr.enable_realtime_scheduling() - if r != gr.RT_OK: - print "Warning: failed to enable realtime scheduling" - - # Create an instance of a hierarchical block - top_block = my_graph(mods[options.modulation], demods[options.modulation], rx_callback, options) - top_block.start() - - # generate and send packets - nbytes = int(1e6 * options.megabytes) - n = 0 - pktno = 0 - pkt_size = int(options.size) - - while n < nbytes: - send_pkt(struct.pack('!H', pktno) + (pkt_size - 2) * chr(pktno & 0xff)) - n += pkt_size - if options.discontinuous and pktno % 5 == 4: - time.sleep(1) - pktno += 1 - - send_pkt(eof=True) - - top_block.wait() - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/gnuradio-examples/python/hier/digital/benchmark_rx.py b/gnuradio-examples/python/hier/digital/benchmark_rx.py deleted file mode 100755 index c92d487bdc..0000000000 --- a/gnuradio-examples/python/hier/digital/benchmark_rx.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2005,2006,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, gru, modulation_utils -from gnuradio import usrp -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -import random -import struct -import sys - -# from current dir -from receive_path import receive_path -import fusb_options - -#import os -#print os.getpid() -#raw_input('Attach and press enter: ') - -# ///////////////////////////////////////////////////////////////////////////// -# main -# ///////////////////////////////////////////////////////////////////////////// - -global n_rcvd, n_right - -def main(): - global n_rcvd, n_right - - n_rcvd = 0 - n_right = 0 - - def rx_callback(ok, payload): - global n_rcvd, n_right - (pktno,) = struct.unpack('!H', payload[0:2]) - n_rcvd += 1 - if ok: - n_right += 1 - - print "ok = %5s pktno = %4d n_rcvd = %4d n_right = %4d" % ( - ok, pktno, n_rcvd, n_right) - - - demods = modulation_utils.type_1_demods() - - # Create Options Parser: - parser = OptionParser (option_class=eng_option, conflict_handler="resolve") - expert_grp = parser.add_option_group("Expert") - - parser.add_option("-m", "--modulation", type="choice", choices=demods.keys(), - default='gmsk', - help="Select modulation from: %s [default=%%default]" - % (', '.join(demods.keys()),)) - - receive_path.add_options(parser, expert_grp) - - for mod in demods.values(): - mod.add_options(expert_grp) - - fusb_options.add_options(expert_grp) - (options, args) = parser.parse_args () - - if len(args) != 0: - parser.print_help(sys.stderr) - sys.exit(1) - - if options.rx_freq is None: - sys.stderr.write("You must specify -f FREQ or --freq FREQ\n") - parser.print_help(sys.stderr) - sys.exit(1) - - r = gr.enable_realtime_scheduling() - if r != gr.RT_OK: - print "Warning: Failed to enable realtime scheduling." - - # Create an instance of a hierarchical block - top_block = receive_path(demods[options.modulation], rx_callback, options) - top_block.run() - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/gnuradio-examples/python/hier/digital/benchmark_tx.py b/gnuradio-examples/python/hier/digital/benchmark_tx.py deleted file mode 100755 index 752cdff553..0000000000 --- a/gnuradio-examples/python/hier/digital/benchmark_tx.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2005, 2006,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, gru, modulation_utils -from gnuradio import usrp -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -import random, time, struct, sys - -# from current dir -from transmit_path import transmit_path -import fusb_options - -#import os -#print os.getpid() -#raw_input('Attach and press enter') - -# ///////////////////////////////////////////////////////////////////////////// -# main -# ///////////////////////////////////////////////////////////////////////////// - -def main(): - - def send_pkt(payload='', eof=False): - return top_block.send_pkt(payload, eof) - - def rx_callback(ok, payload): - print "ok = %r, payload = '%s'" % (ok, payload) - - mods = modulation_utils.type_1_mods() - - parser = OptionParser(option_class=eng_option, conflict_handler="resolve") - expert_grp = parser.add_option_group("Expert") - - parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(), - default='gmsk', - help="Select modulation from: %s [default=%%default]" - % (', '.join(mods.keys()),)) - - parser.add_option("-s", "--size", type="eng_float", default=1500, - help="set packet size [default=%default]") - parser.add_option("-M", "--megabytes", type="eng_float", default=1.0, - help="set megabytes to transmit [default=%default]") - parser.add_option("","--discontinuous", action="store_true", default=False, - help="enable discontinous transmission (bursts of 5 packets)") - - transmit_path.add_options(parser, expert_grp) - - for mod in mods.values(): - mod.add_options(expert_grp) - - fusb_options.add_options(expert_grp) - (options, args) = parser.parse_args () - - if len(args) != 0: - parser.print_help() - sys.exit(1) - - 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) - - r = gr.enable_realtime_scheduling() - if r != gr.RT_OK: - print "Warning: failed to enable realtime scheduling" - - # Create an instance of a hierarchical block - top_block = transmit_path(mods[options.modulation], options) - top_block.start() - - # generate and send packets - nbytes = int(1e6 * options.megabytes) - n = 0 - pktno = 0 - pkt_size = int(options.size) - - while n < nbytes: - send_pkt(struct.pack('!H', pktno) + (pkt_size - 2) * chr(pktno & 0xff)) - n += pkt_size - sys.stderr.write('.') - if options.discontinuous and pktno % 5 == 4: - time.sleep(1) - pktno += 1 - - send_pkt(eof=True) - top_block.wait() - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/gnuradio-examples/python/hier/digital/fusb_options.py b/gnuradio-examples/python/hier/digital/fusb_options.py deleted file mode 100644 index 153e06bea7..0000000000 --- a/gnuradio-examples/python/hier/digital/fusb_options.py +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright 2006 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. -# - -def add_options(parser): - """ - Add Fast USB specifc options to command line parser. - - @param parser: instance of OptionParser - """ - parser.add_option("-B", "--fusb-block-size", type="int", default=0, - help="specify fast usb block size [default=%default]") - parser.add_option("-N", "--fusb-nblocks", type="int", default=0, - help="specify number of fast usb blocks [default=%default]") diff --git a/gnuradio-examples/python/hier/digital/pick_bitrate.py b/gnuradio-examples/python/hier/digital/pick_bitrate.py deleted file mode 100644 index 82a4768888..0000000000 --- a/gnuradio-examples/python/hier/digital/pick_bitrate.py +++ /dev/null @@ -1,143 +0,0 @@ -# -# Copyright 2005,2006 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. -# - -_default_bitrate = 500e3 - -_valid_samples_per_symbol = (2,3,4,5,6,7) - -def _gen_tx_info(converter_rate): - results = [] - for samples_per_symbol in _valid_samples_per_symbol: - for interp in range(16, 512 + 1, 4): - bitrate = converter_rate / interp / samples_per_symbol - results.append((bitrate, samples_per_symbol, interp)) - results.sort() - return results - -def _gen_rx_info(converter_rate): - results = [] - for samples_per_symbol in _valid_samples_per_symbol: - for decim in range(8, 256 + 1, 2): - bitrate = converter_rate / decim / samples_per_symbol - results.append((bitrate, samples_per_symbol, decim)) - results.sort() - return results - -def _filter_info(info, samples_per_symbol, xrate): - if samples_per_symbol is not None: - info = [x for x in info if x[1] == samples_per_symbol] - if xrate is not None: - info = [x for x in info if x[2] == xrate] - return info - -def _pick_best(target_bitrate, bits_per_symbol, info): - """ - @returns tuple (bitrate, samples_per_symbol, interp_rate_or_decim_rate) - """ - if len(info) == 0: - raise RuntimeError, "info is zero length!" - - if target_bitrate is None: # return the fastest one - return info[-1] - - # convert bit rate to symbol rate - target_symbolrate = target_bitrate / bits_per_symbol - - # Find the closest matching symbol rate. - # In the event of a tie, the one with the lowest samples_per_symbol wins. - # (We already sorted them, so the first one is the one we take) - - best = info[0] - best_delta = abs(target_symbolrate - best[0]) - for x in info[1:]: - delta = abs(target_symbolrate - x[0]) - if delta < best_delta: - best_delta = delta - best = x - - # convert symbol rate back to bit rate - return ((best[0] * bits_per_symbol),) + best[1:] - -def _pick_bitrate(bitrate, bits_per_symbol, samples_per_symbol, - xrate, converter_rate, gen_info): - """ - @returns tuple (bitrate, samples_per_symbol, interp_rate_or_decim_rate) - """ - if not isinstance(bits_per_symbol, int) or bits_per_symbol < 1: - raise ValueError, "bits_per_symbol must be an int >= 1" - - if samples_per_symbol is not None and xrate is not None: # completely determined - return (float(converter_rate) / xrate / samples_per_symbol, - samples_per_symbol, xrate) - - if bitrate is None and samples_per_symbol is None and xrate is None: - bitrate = _default_bitrate - - # now we have a target bitrate and possibly an xrate or - # samples_per_symbol constraint, but not both of them. - - return _pick_best(bitrate, bits_per_symbol, - _filter_info(gen_info(converter_rate), samples_per_symbol, xrate)) - -# --------------------------------------------------------------------------------------- - -def pick_tx_bitrate(bitrate, bits_per_symbol, samples_per_symbol, - interp_rate, converter_rate=128e6): - """ - Given the 4 input parameters, return at configuration that matches - - @param bitrate: desired bitrate or None - @type bitrate: number or None - @param bits_per_symbol: E.g., BPSK -> 1, QPSK -> 2, 8-PSK -> 3 - @type bits_per_symbol: integer >= 1 - @param samples_per_symbol: samples/baud (aka samples/symbol) - @type samples_per_symbol: number or None - @param interp_rate: USRP interpolation factor - @type interp_rate: integer or None - @param converter_rate: converter sample rate in Hz - @type converter_rate: number - - @returns tuple (bitrate, samples_per_symbol, interp_rate) - """ - return _pick_bitrate(bitrate, bits_per_symbol, samples_per_symbol, - interp_rate, converter_rate, _gen_tx_info) - - -def pick_rx_bitrate(bitrate, bits_per_symbol, samples_per_symbol, - decim_rate, converter_rate=64e6): - """ - Given the 4 input parameters, return at configuration that matches - - @param bitrate: desired bitrate or None - @type bitrate: number or None - @param bits_per_symbol: E.g., BPSK -> 1, QPSK -> 2, 8-PSK -> 3 - @type bits_per_symbol: integer >= 1 - @param samples_per_symbol: samples/baud (aka samples/symbol) - @type samples_per_symbol: number or None - @param decim_rate: USRP decimation factor - @type decim_rate: integer or None - @param converter_rate: converter sample rate in Hz - @type converter_rate: number - - @returns tuple (bitrate, samples_per_symbol, decim_rate) - """ - return _pick_bitrate(bitrate, bits_per_symbol, samples_per_symbol, - decim_rate, converter_rate, _gen_rx_info) diff --git a/gnuradio-examples/python/hier/digital/receive_path.py b/gnuradio-examples/python/hier/digital/receive_path.py deleted file mode 100644 index 917ed1aa33..0000000000 --- a/gnuradio-examples/python/hier/digital/receive_path.py +++ /dev/null @@ -1,256 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2005,2006,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, gru, blks2 -from gnuradio import usrp -from gnuradio import eng_notation -import copy -import sys - -# from current dir -from pick_bitrate import pick_rx_bitrate - -# ///////////////////////////////////////////////////////////////////////////// -# receive path -# ///////////////////////////////////////////////////////////////////////////// - -class receive_path(gr.top_block): - def __init__(self, demod_class, rx_callback, options): - gr.top_block.__init__(self, "receive_path") - options = copy.copy(options) # make a copy so we can destructively modify - - self._verbose = options.verbose - self._rx_freq = options.rx_freq # receiver's center frequency - self._rx_gain = options.rx_gain # receiver's gain - self._rx_subdev_spec = options.rx_subdev_spec # daughterboard to use - self._bitrate = options.bitrate # desired bit rate - self._decim = options.decim # Decimating rate for the USRP (prelim) - self._samples_per_symbol = options.samples_per_symbol # desired samples/symbol - self._fusb_block_size = options.fusb_block_size # usb info for USRP - self._fusb_nblocks = options.fusb_nblocks # usb info for USRP - - 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 - - if self._rx_freq is None: - sys.stderr.write("-f FREQ or --freq FREQ or --rx-freq FREQ must be specified\n") - raise SystemExit - - # Set up USRP source; also adjusts decim, samples_per_symbol, and bitrate - self._setup_usrp_source() - - g = self.subdev.gain_range() - if options.show_rx_gain_range: - print "Rx Gain Range: minimum = %g, maximum = %g, step size = %g" \ - % (g[0], g[1], g[2]) - - self.set_gain(options.rx_gain) - - self.set_auto_tr(True) # enable Auto Transmit/Receive switching - - # Set RF frequency - ok = self.set_freq(self._rx_freq) - if not ok: - print "Failed to set Rx frequency to %s" % (eng_notation.num_to_str(self._rx_freq)) - raise ValueError, eng_notation.num_to_str(self._rx_freq) - - # copy the final answers back into options for use by demodulator - options.samples_per_symbol = self._samples_per_symbol - options.bitrate = self._bitrate - options.decim = self._decim - - # Get demod_kwargs - demod_kwargs = self._demod_class.extract_kwargs_from_options(options) - - # Design filter to get actual channel we want - sw_decim = 1 - chan_coeffs = gr.firdes.low_pass (1.0, # gain - sw_decim * self._samples_per_symbol, # sampling rate - 1.0, # midpoint of trans. band - 0.5, # width of trans. band - gr.firdes.WIN_HANN) # filter type - - # Decimating channel filter - # complex in and out, float taps - self.chan_filt = gr.fft_filter_ccc(sw_decim, chan_coeffs) - #self.chan_filt = gr.fir_filter_ccf(sw_decim, chan_coeffs) - # receiver - self.packet_receiver = \ - blks2.demod_pkts(self._demod_class(**demod_kwargs), - access_code=None, - callback=self._rx_callback, - threshold=-1) - - # Carrier Sensing Blocks - alpha = 0.001 - thresh = 30 # in dB, will have to adjust - self.probe = gr.probe_avg_mag_sqrd_c(thresh,alpha) - - # Display some information about the setup - if self._verbose: - self._print_verbage() - - self.channel_filter = gr.fft_filter_ccc(sw_decim, chan_coeffs) - - # connect the channel input filter to the carrier power detector - self.connect(self.u, self.channel_filter, self.probe) - - # connect channel filter to the packet receiver - self.connect(self.channel_filter, self.packet_receiver) - - - def _setup_usrp_source(self): - self.u = usrp.source_c (fusb_block_size=self._fusb_block_size, - fusb_nblocks=self._fusb_nblocks) - adc_rate = self.u.adc_rate() - - # derive values of bitrate, samples_per_symbol, and decim from desired info - (self._bitrate, self._samples_per_symbol, self._decim) = \ - pick_rx_bitrate(self._bitrate, self._demod_class.bits_per_symbol(), \ - self._samples_per_symbol, self._decim, adc_rate) - - self.u.set_decim_rate(self._decim) - - # determine the daughterboard subdevice we're using - if self._rx_subdev_spec is None: - self._rx_subdev_spec = usrp.pick_rx_subdevice(self.u) - self.subdev = usrp.selected_subdev(self.u, self._rx_subdev_spec) - - self.u.set_mux(usrp.determine_rx_mux_value(self.u, self._rx_subdev_spec)) - - def set_freq(self, target_freq): - """ - Set the center frequency we're interested in. - - @param target_freq: frequency in Hz - @rypte: 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 up converter. - """ - r = self.u.tune(0, self.subdev, target_freq) - if r: - return True - - return False - - def set_gain(self, gain): - """ - Sets the analog gain in the USRP - """ - if gain is None: - r = self.subdev.gain_range() - gain = (r[0] + r[1])/2 # set gain to midpoint - self.gain = gain - return self.subdev.set_gain(gain) - - def set_auto_tr(self, enable): - return self.subdev.set_auto_tr(enable) - - def bitrate(self): - return self._bitrate - - def samples_per_symbol(self): - return self._samples_per_symbol - - def decim(self): - return self._decim - - def carrier_sensed(self): - """ - Return True if we think carrier is present. - """ - #return self.probe.level() > X - return self.probe.unmuted() - - def carrier_threshold(self): - """ - Return current setting in dB. - """ - return self.probe.threshold() - - def set_carrier_threshold(self, threshold_in_db): - """ - Set carrier threshold. - - @param threshold_in_db: set detection threshold - @type threshold_in_db: float (dB) - """ - self.probe.set_threshold(threshold_in_db) - - - def add_options(normal, expert): - """ - Adds receiver-specific options to the Options Parser - """ - add_freq_option(normal) - if not normal.has_option("--bitrate"): - normal.add_option("-r", "--bitrate", type="eng_float", default=None, - help="specify bitrate. samples-per-symbol and interp/decim will be derived.") - normal.add_option("-R", "--rx-subdev-spec", type="subdev", default=None, - help="select USRP Rx side A or B") - normal.add_option("", "--rx-gain", type="eng_float", default=None, metavar="GAIN", - help="set receiver gain in dB [default=midpoint]. See also --show-rx-gain-range") - normal.add_option("", "--show-rx-gain-range", action="store_true", default=False, - help="print min and max Rx gain available on selected daughterboard") - normal.add_option("-v", "--verbose", action="store_true", default=False) - expert.add_option("-S", "--samples-per-symbol", type="int", default=None, - help="set samples/symbol [default=%default]") - expert.add_option("", "--rx-freq", type="eng_float", default=None, - help="set Rx frequency to FREQ [default=%default]", metavar="FREQ") - expert.add_option("-d", "--decim", type="intx", default=None, - help="set fpga decimation rate to DECIM [default=%default]") - expert.add_option("", "--log", action="store_true", default=False, - help="Log all parts of flow graph to files (CAUTION: lots of data)") - - # Make a static method to call before instantiation - add_options = staticmethod(add_options) - - - def _print_verbage(self): - """ - Prints information about the receive path - """ - print "\nReceive Path:" - print "Using RX d'board %s" % (self.subdev.side_and_name(),) - print "Rx gain: %g" % (self.gain,) - print "modulation: %s" % (self._demod_class.__name__) - print "bitrate: %sb/s" % (eng_notation.num_to_str(self._bitrate)) - print "samples/symbol: %3d" % (self._samples_per_symbol) - print "decim: %3d" % (self._decim) - print "Rx Frequency: %s" % (eng_notation.num_to_str(self._rx_freq)) - -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") diff --git a/gnuradio-examples/python/hier/digital/receive_path_lb.py b/gnuradio-examples/python/hier/digital/receive_path_lb.py deleted file mode 100644 index 1138f4c8e6..0000000000 --- a/gnuradio-examples/python/hier/digital/receive_path_lb.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2005,2006 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, blks2 -from gnuradio import eng_notation -import copy -import sys - -# ///////////////////////////////////////////////////////////////////////////// -# receive path -# ///////////////////////////////////////////////////////////////////////////// - -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 - - options = copy.copy(options) # make a copy so we can destructively modify - - self._verbose = options.verbose - self._bitrate = options.bitrate # desired bit rate - self._samples_per_symbol = options.samples_per_symbol # desired samples/symbol - - 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 - - # Get demod_kwargs - demod_kwargs = self._demod_class.extract_kwargs_from_options(options) - - # Design filter to get actual channel we want - sw_decim = 1 - chan_coeffs = gr.firdes.low_pass (1.0, # gain - sw_decim * self._samples_per_symbol, # sampling rate - 1.0, # midpoint of trans. band - 0.5, # width of trans. band - gr.firdes.WIN_HANN) # filter type - - # receiver - self.packet_receiver = \ - blks2.demod_pkts(self._demod_class(**demod_kwargs), - access_code=None, - callback=self._rx_callback, - threshold=-1) - - # Carrier Sensing Blocks - alpha = 0.001 - thresh = 30 # in dB, will have to adjust - self.probe = gr.probe_avg_mag_sqrd_c(thresh,alpha) - - # Display some information about the setup - if self._verbose: - self._print_verbage() - - self.channel_filter = gr.fft_filter_ccc(sw_decim, chan_coeffs) - - # connect the channel input filter to the carrier power detector - self.connect(self, self.channel_filter, self.probe) - - # connect channel filter to the packet receiver - self.connect(self.channel_filter, self.packet_receiver) - - def bitrate(self): - return self._bitrate - - def samples_per_symbol(self): - return self._samples_per_symbol - - def carrier_sensed(self): - """ - Return True if we think carrier is present. - """ - #return self.probe.level() > X - return self.probe.unmuted() - - def carrier_threshold(self): - """ - Return current setting in dB. - """ - return self.probe.threshold() - - def set_carrier_threshold(self, threshold_in_db): - """ - Set carrier threshold. - - @param threshold_in_db: set detection threshold - @type threshold_in_db: float (dB) - """ - self.probe.set_threshold(threshold_in_db) - - - def add_options(normal, expert): - """ - Adds receiver-specific options to the Options Parser - """ - if not normal.has_option("--bitrate"): - normal.add_option("-r", "--bitrate", type="eng_float", default=100e3, - help="specify bitrate [default=%default].") - normal.add_option("", "--show-rx-gain-range", action="store_true", default=False, - help="print min and max Rx gain available on selected daughterboard") - normal.add_option("-v", "--verbose", action="store_true", default=False) - expert.add_option("-S", "--samples-per-symbol", type="int", 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)") - - # Make a static method to call before instantiation - add_options = staticmethod(add_options) - - - def _print_verbage(self): - """ - Prints information about the receive path - """ - print "modulation: %s" % (self._demod_class.__name__) - print "bitrate: %sb/s" % (eng_notation.num_to_str(self._bitrate)) - print "samples/symbol: %3d" % (self._samples_per_symbol) diff --git a/gnuradio-examples/python/hier/digital/rx_voice.py b/gnuradio-examples/python/hier/digital/rx_voice.py deleted file mode 100755 index c9c33c3d56..0000000000 --- a/gnuradio-examples/python/hier/digital/rx_voice.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2005,2006 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, modulation_utils -from gnuradio import usrp -from gnuradio import audio -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -from gnuradio.vocoder import gsm_full_rate - -import random -import struct - -# from current dir -from receive_path import receive_path -import fusb_options - -#import os -#print os.getpid() -#raw_input('Attach and press enter') - - -class audio_tx(gr.hier_block): - def __init__(self, fg, audio_output_dev): - self.packet_src = gr.message_source(33) - voice_decoder = gsm_full_rate.decode_ps() - s2f = gr.short_to_float () - sink_scale = gr.multiply_const_ff(1.0/32767.) - audio_sink = audio.sink(8000, audio_output_dev) - fg.connect(self.packet_src, voice_decoder, s2f, sink_scale, audio_sink) - gr.hier_block.__init__(self, fg, self.packet_src, audio_sink) - - def msgq(self): - return self.packet_src.msgq() - - -class my_graph(gr.flow_graph): - - def __init__(self, demod_class, rx_callback, options): - gr.flow_graph.__init__(self) - self.rxpath = receive_path(self, demod_class, rx_callback, options) - self.audio_tx = audio_tx(self, options.audio_output) - - -# ///////////////////////////////////////////////////////////////////////////// -# main -# ///////////////////////////////////////////////////////////////////////////// - -global n_rcvd, n_right - -def main(): - global n_rcvd, n_right - - n_rcvd = 0 - n_right = 0 - - def rx_callback(ok, payload): - global n_rcvd, n_right - n_rcvd += 1 - if ok: - n_right += 1 - - fg.audio_tx.msgq().insert_tail(gr.message_from_string(payload)) - - print "ok = %r n_rcvd = %4d n_right = %4d" % ( - ok, n_rcvd, n_right) - - demods = modulation_utils.type_1_demods() - - # Create Options Parser: - parser = OptionParser (option_class=eng_option, conflict_handler="resolve") - expert_grp = parser.add_option_group("Expert") - - parser.add_option("-m", "--modulation", type="choice", choices=demods.keys(), - default='gmsk', - help="Select modulation from: %s [default=%%default]" - % (', '.join(demods.keys()),)) - parser.add_option("-O", "--audio-output", type="string", default="", - help="pcm output device name. E.g., hw:0,0 or /dev/dsp") - - receive_path.add_options(parser, expert_grp) - - for mod in demods.values(): - mod.add_options(expert_grp) - - fusb_options.add_options(expert_grp) - - parser.set_defaults(bitrate=50e3) # override default bitrate default - (options, args) = parser.parse_args () - - if len(args) != 0: - parser.print_help(sys.stderr) - sys.exit(1) - - if options.rx_freq is None: - sys.stderr.write("You must specify -f FREQ or --freq FREQ\n") - parser.print_help(sys.stderr) - sys.exit(1) - - - # build the graph - fg = my_graph(demods[options.modulation], rx_callback, options) - - r = gr.enable_realtime_scheduling() - if r != gr.RT_OK: - print "Warning: Failed to enable realtime scheduling." - - fg.start() # start flow graph - fg.wait() # wait for it to finish - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/gnuradio-examples/python/hier/digital/transmit_path.py b/gnuradio-examples/python/hier/digital/transmit_path.py deleted file mode 100644 index 18fecd3d5b..0000000000 --- a/gnuradio-examples/python/hier/digital/transmit_path.py +++ /dev/null @@ -1,229 +0,0 @@ -# -# Copyright 2005,2006,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, gru, blks2 -from gnuradio import usrp -from gnuradio import eng_notation - -import copy -import sys - -# from current dir -from pick_bitrate import pick_tx_bitrate - -# ///////////////////////////////////////////////////////////////////////////// -# transmit path -# ///////////////////////////////////////////////////////////////////////////// - -class transmit_path(gr.top_block): - def __init__(self, modulator_class, options): - ''' - See below for what options should hold - ''' - - gr.top_block.__init__(self, "transmit_path") - options = copy.copy(options) # make a copy so we can destructively modify - - self._verbose = options.verbose - self._tx_freq = options.tx_freq # tranmitter's center frequency - self._tx_amplitude = options.tx_amplitude # digital amplitude sent to USRP - self._tx_subdev_spec = options.tx_subdev_spec # daughterboard to use - self._bitrate = options.bitrate # desired bit rate - self._interp = options.interp # interpolating rate for the USRP (prelim) - self._samples_per_symbol = options.samples_per_symbol # desired samples/baud - self._fusb_block_size = options.fusb_block_size # usb info for USRP - self._fusb_nblocks = options.fusb_nblocks # usb info for USRP - - self._modulator_class = modulator_class # the modulator_class we are using - - if self._tx_freq is None: - sys.stderr.write("-f FREQ or --freq FREQ or --tx-freq FREQ must be specified\n") - raise SystemExit - - # Set up USRP sink; also adjusts interp, samples_per_symbol, and bitrate - self._setup_usrp_sink() - - # copy the final answers back into options for use by modulator - options.samples_per_symbol = self._samples_per_symbol - options.bitrate = self._bitrate - options.interp = self._interp - - # Get mod_kwargs - mod_kwargs = self._modulator_class.extract_kwargs_from_options(options) - - # Set center frequency of USRP - ok = self.set_freq(self._tx_freq) - if not ok: - print "Failed to set Tx frequency to %s" % (eng_notation.num_to_str(self._tx_freq),) - raise ValueError - - # transmitter - self.packet_transmitter = \ - blks2.mod_pkts(self._modulator_class(**mod_kwargs), - access_code=None, - msgq_limit=4, - pad_for_usrp=True) - - # Set the USRP for maximum transmit gain - # (Note that on the RFX cards this is a nop.) - self.set_gain(self.subdev.gain_range()[0]) - - self.amp = gr.multiply_const_cc(1) - self.set_tx_amplitude(self._tx_amplitude) - - # enable Auto Transmit/Receive switching - self.set_auto_tr(True) - - # Display some information about the setup - if self._verbose: - self._print_verbage() - - self.connect(self.packet_transmitter, self.amp, self.u) - - def _setup_usrp_sink(self): - """ - Creates a USRP sink, determines the settings for best bitrate, - and attaches to the transmitter's subdevice. - """ - self.u = usrp.sink_c(fusb_block_size=self._fusb_block_size, - fusb_nblocks=self._fusb_nblocks) - dac_rate = self.u.dac_rate(); - - # derive values of bitrate, samples_per_symbol, and interp from desired info - (self._bitrate, self._samples_per_symbol, self._interp) = \ - pick_tx_bitrate(self._bitrate, self._modulator_class.bits_per_symbol(), - self._samples_per_symbol, self._interp, dac_rate) - - self.u.set_interp_rate(self._interp) - - # determine the daughterboard subdevice we're using - if self._tx_subdev_spec is None: - self._tx_subdev_spec = usrp.pick_tx_subdevice(self.u) - self.u.set_mux(usrp.determine_tx_mux_value(self.u, self._tx_subdev_spec)) - self.subdev = usrp.selected_subdev(self.u, self._tx_subdev_spec) - - - def set_freq(self, target_freq): - """ - Set the center frequency we're interested in. - - @param target_freq: frequency in Hz - @rypte: 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 up converter. - """ - r = self.u.tune(self.subdev._which, self.subdev, target_freq) - if r: - return True - - return False - - def set_gain(self, gain): - """ - Sets the analog gain in the USRP - """ - self.gain = gain - self.subdev.set_gain(gain) - - def set_tx_amplitude(self, ampl): - """ - Sets the transmit amplitude sent to the USRP - @param: ampl 0 <= ampl < 32768. Try 8000 - """ - self._tx_amplitude = max(0.0, min(ampl, 32767.0)) - self.amp.set_k(self._tx_amplitude) - - def set_auto_tr(self, enable): - """ - Turns on auto transmit/receive of USRP daughterboard (if exits; else ignored) - """ - return self.subdev.set_auto_tr(enable) - - def send_pkt(self, payload='', eof=False): - """ - Calls the transmitter method to send a packet - """ - return self.packet_transmitter.send_pkt(payload, eof) - - def bitrate(self): - return self._bitrate - - def samples_per_symbol(self): - return self._samples_per_symbol - - def interp(self): - return self._interp - - def add_options(normal, expert): - """ - Adds transmitter-specific options to the Options Parser - """ - add_freq_option(normal) - if not normal.has_option('--bitrate'): - normal.add_option("-r", "--bitrate", type="eng_float", default=None, - help="specify bitrate. samples-per-symbol and interp/decim will be derived.") - normal.add_option("-T", "--tx-subdev-spec", type="subdev", default=None, - help="select USRP Tx side A or B") - normal.add_option("", "--tx-amplitude", type="eng_float", default=12000, metavar="AMPL", - help="set transmitter digital amplitude: 0 <= AMPL < 32768 [default=%default]") - normal.add_option("-v", "--verbose", action="store_true", default=False) - - expert.add_option("-S", "--samples-per-symbol", type="int", default=None, - help="set samples/symbol [default=%default]") - expert.add_option("", "--tx-freq", type="eng_float", default=None, - help="set transmit frequency to FREQ [default=%default]", metavar="FREQ") - expert.add_option("-i", "--interp", type="intx", default=None, - help="set fpga interpolation rate to INTERP [default=%default]") - expert.add_option("", "--log", action="store_true", default=False, - help="Log all parts of flow graph to file (CAUTION: lots of data)") - - # Make a static method to call before instantiation - add_options = staticmethod(add_options) - - def _print_verbage(self): - """ - Prints information about the transmit path - """ - print "Using TX d'board %s" % (self.subdev.side_and_name(),) - print "Tx amplitude %s" % (self._tx_amplitude) - print "modulation: %s" % (self._modulator_class.__name__) - print "bitrate: %sb/s" % (eng_notation.num_to_str(self._bitrate)) - print "samples/symbol: %3d" % (self._samples_per_symbol) - print "interp: %3d" % (self._interp) - print "Tx Frequency: %s" % (eng_notation.num_to_str(self._tx_freq)) - - -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") diff --git a/gnuradio-examples/python/hier/digital/transmit_path_lb.py b/gnuradio-examples/python/hier/digital/transmit_path_lb.py deleted file mode 100644 index 5a05b880c7..0000000000 --- a/gnuradio-examples/python/hier/digital/transmit_path_lb.py +++ /dev/null @@ -1,118 +0,0 @@ -# -# Copyright 2005,2006,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, gru, blks2 -from gnuradio import eng_notation - -import copy -import sys - -# ///////////////////////////////////////////////////////////////////////////// -# transmit path -# ///////////////////////////////////////////////////////////////////////////// - -class transmit_path(gr.hier_block2): - def __init__(self, modulator_class, options): - ''' - 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 - - 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._samples_per_symbol = options.samples_per_symbol # desired samples/baud - - self._modulator_class = modulator_class # the modulator_class we are using - - # Get mod_kwargs - mod_kwargs = self._modulator_class.extract_kwargs_from_options(options) - - # transmitter - self.packet_transmitter = \ - blks2.mod_pkts(self._modulator_class(**mod_kwargs), - access_code=None, - msgq_limit=4, - pad_for_usrp=True) - - self.amp = gr.multiply_const_cc(1) - self.set_tx_amplitude(self._tx_amplitude) - - # Display some information about the setup - if self._verbose: - self._print_verbage() - - # Connect blocks in the flowgraph; set amp component to the output of this block - self.connect(self.packet_transmitter, self.amp, self) - - def set_tx_amplitude(self, ampl): - """ - Sets the transmit amplitude sent to the USRP - @param: ampl 0 <= ampl < 32768. Try 8000 - """ - self._tx_amplitude = max(0.0, min(ampl, 32767.0)) - self.amp.set_k(self._tx_amplitude) - - def send_pkt(self, payload='', eof=False): - """ - Calls the transmitter method to send a packet - """ - return self.packet_transmitter.send_pkt(payload, eof) - - def bitrate(self): - return self._bitrate - - def samples_per_symbol(self): - return self._samples_per_symbol - - def add_options(normal, expert): - """ - Adds transmitter-specific options to the Options Parser - """ - if not normal.has_option('--bitrate'): - normal.add_option("-r", "--bitrate", type="eng_float", default=100e3, - help="specify bitrate [default=%default].") - normal.add_option("", "--tx-amplitude", type="eng_float", default=12000, metavar="AMPL", - help="set transmitter digital amplitude: 0 <= AMPL < 32768 [default=%default]") - normal.add_option("-v", "--verbose", action="store_true", default=False) - - expert.add_option("-S", "--samples-per-symbol", type="int", 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)") - - # Make a static method to call before instantiation - add_options = staticmethod(add_options) - - def _print_verbage(self): - """ - Prints information about the transmit path - """ - print "Tx amplitude %s" % (self._tx_amplitude) - print "modulation: %s" % (self._modulator_class.__name__) - print "bitrate: %sb/s" % (eng_notation.num_to_str(self._bitrate)) - print "samples/symbol: %3d" % (self._samples_per_symbol) - diff --git a/gnuradio-examples/python/hier/digital/tunnel.py b/gnuradio-examples/python/hier/digital/tunnel.py deleted file mode 100755 index 7d17ff958a..0000000000 --- a/gnuradio-examples/python/hier/digital/tunnel.py +++ /dev/null @@ -1,290 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2005,2006 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. -# - - -# ///////////////////////////////////////////////////////////////////////////// -# -# This code sets up up a virtual ethernet interface (typically gr0), -# and relays packets between the interface and the GNU Radio PHY+MAC -# -# What this means in plain language, is that if you've got a couple -# of USRPs on different machines, and if you run this code on those -# machines, you can talk between them using normal TCP/IP networking. -# -# ///////////////////////////////////////////////////////////////////////////// - - -from gnuradio import gr, gru, modulation_utils -from gnuradio import usrp -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -import random -import time -import struct -import sys -import os - -# from current dir -from transmit_path import transmit_path -from receive_path import receive_path -import fusb_options - -#print os.getpid() -#raw_input('Attach and press enter') - - -# ///////////////////////////////////////////////////////////////////////////// -# -# Use the Universal TUN/TAP device driver to move packets to/from kernel -# -# See /usr/src/linux/Documentation/networking/tuntap.txt -# -# ///////////////////////////////////////////////////////////////////////////// - -# Linux specific... -# TUNSETIFF ifr flags from <linux/tun_if.h> - -IFF_TUN = 0x0001 # tunnel IP packets -IFF_TAP = 0x0002 # tunnel ethernet frames -IFF_NO_PI = 0x1000 # don't pass extra packet info -IFF_ONE_QUEUE = 0x2000 # beats me ;) - -def open_tun_interface(tun_device_filename): - from fcntl import ioctl - - mode = IFF_TAP | IFF_NO_PI - TUNSETIFF = 0x400454ca - - tun = os.open(tun_device_filename, os.O_RDWR) - ifs = ioctl(tun, TUNSETIFF, struct.pack("16sH", "gr%d", mode)) - ifname = ifs[:16].strip("\x00") - return (tun, ifname) - - -# ///////////////////////////////////////////////////////////////////////////// -# the flow graph -# ///////////////////////////////////////////////////////////////////////////// - -class my_graph(gr.flow_graph): - - def __init__(self, mod_class, demod_class, - rx_callback, options): - - gr.flow_graph.__init__(self) - self.txpath = transmit_path(self, mod_class, options) - self.rxpath = receive_path(self, demod_class, rx_callback, options) - - def send_pkt(self, payload='', eof=False): - return self.txpath.send_pkt(payload, eof) - - def carrier_sensed(self): - """ - Return True if the receive path thinks there's carrier - """ - return self.rxpath.carrier_sensed() - - -# ///////////////////////////////////////////////////////////////////////////// -# Carrier Sense MAC -# ///////////////////////////////////////////////////////////////////////////// - -class cs_mac(object): - """ - Prototype carrier sense MAC - - Reads packets from the TUN/TAP interface, and sends them to the PHY. - Receives packets from the PHY via phy_rx_callback, and sends them - into the TUN/TAP interface. - - Of course, we're not restricted to getting packets via TUN/TAP, this - is just an example. - """ - def __init__(self, tun_fd, verbose=False): - self.tun_fd = tun_fd # file descriptor for TUN/TAP interface - self.verbose = verbose - self.fg = None # flow graph (access to PHY) - - def set_flow_graph(self, fg): - self.fg = fg - - def phy_rx_callback(self, ok, payload): - """ - Invoked by thread associated with PHY to pass received packet up. - - @param ok: bool indicating whether payload CRC was OK - @param payload: contents of the packet (string) - """ - if self.verbose: - print "Rx: ok = %r len(payload) = %4d" % (ok, len(payload)) - if ok: - os.write(self.tun_fd, payload) - - def main_loop(self): - """ - Main loop for MAC. - Only returns if we get an error reading from TUN. - - FIXME: may want to check for EINTR and EAGAIN and reissue read - """ - min_delay = 0.001 # seconds - - while 1: - payload = os.read(self.tun_fd, 10*1024) - if not payload: - self.fg.send_pkt(eof=True) - break - - if self.verbose: - print "Tx: len(payload) = %4d" % (len(payload),) - - delay = min_delay - while self.fg.carrier_sensed(): - sys.stderr.write('B') - time.sleep(delay) - if delay < 0.050: - delay = delay * 2 # exponential back-off - - self.fg.send_pkt(payload) - - -# ///////////////////////////////////////////////////////////////////////////// -# main -# ///////////////////////////////////////////////////////////////////////////// - -def main(): - - mods = modulation_utils.type_1_mods() - demods = modulation_utils.type_1_demods() - - parser = OptionParser (option_class=eng_option, conflict_handler="resolve") - expert_grp = parser.add_option_group("Expert") - - parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(), - default='gmsk', - help="Select modulation from: %s [default=%%default]" - % (', '.join(mods.keys()),)) - - parser.add_option("-v","--verbose", action="store_true", default=False) - expert_grp.add_option("-c", "--carrier-threshold", type="eng_float", default=30, - help="set carrier detect threshold (dB) [default=%default]") - expert_grp.add_option("","--tun-device-filename", default="/dev/net/tun", - help="path to tun device file [default=%default]") - - transmit_path.add_options(parser, expert_grp) - receive_path.add_options(parser, expert_grp) - - for mod in mods.values(): - mod.add_options(expert_grp) - - for demod in demods.values(): - demod.add_options(expert_grp) - - fusb_options.add_options(expert_grp) - - (options, args) = parser.parse_args () - if len(args) != 0: - parser.print_help(sys.stderr) - sys.exit(1) - - if options.rx_freq is None or 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) - - # open the TUN/TAP interface - (tun_fd, tun_ifname) = open_tun_interface(options.tun_device_filename) - - # Attempt to enable realtime scheduling - r = gr.enable_realtime_scheduling() - if r == gr.RT_OK: - realtime = True - else: - realtime = False - print "Note: failed to enable realtime scheduling" - - - # If the user hasn't set the fusb_* parameters on the command line, - # pick some values that will reduce latency. - - if options.fusb_block_size == 0 and options.fusb_nblocks == 0: - if realtime: # be more aggressive - options.fusb_block_size = gr.prefs().get_long('fusb', 'rt_block_size', 1024) - options.fusb_nblocks = gr.prefs().get_long('fusb', 'rt_nblocks', 16) - else: - options.fusb_block_size = gr.prefs().get_long('fusb', 'block_size', 4096) - options.fusb_nblocks = gr.prefs().get_long('fusb', 'nblocks', 16) - - #print "fusb_block_size =", options.fusb_block_size - #print "fusb_nblocks =", options.fusb_nblocks - - # instantiate the MAC - mac = cs_mac(tun_fd, verbose=True) - - - # build the graph (PHY) - fg = my_graph(mods[options.modulation], - demods[options.modulation], - mac.phy_rx_callback, - options) - - mac.set_flow_graph(fg) # give the MAC a handle for the PHY - - if fg.txpath.bitrate() != fg.rxpath.bitrate(): - print "WARNING: Transmit bitrate = %sb/sec, Receive bitrate = %sb/sec" % ( - eng_notation.num_to_str(fg.txpath.bitrate()), - eng_notation.num_to_str(fg.rxpath.bitrate())) - - print "modulation: %s" % (options.modulation,) - print "freq: %s" % (eng_notation.num_to_str(options.tx_freq)) - print "bitrate: %sb/sec" % (eng_notation.num_to_str(fg.txpath.bitrate()),) - print "samples/symbol: %3d" % (fg.txpath.samples_per_symbol(),) - #print "interp: %3d" % (fg.txpath.interp(),) - #print "decim: %3d" % (fg.rxpath.decim(),) - - fg.rxpath.set_carrier_threshold(options.carrier_threshold) - print "Carrier sense threshold:", options.carrier_threshold, "dB" - - print - print "Allocated virtual ethernet interface: %s" % (tun_ifname,) - print "You must now use ifconfig to set its IP address. E.g.," - print - print " $ sudo ifconfig %s 192.168.200.1" % (tun_ifname,) - print - print "Be sure to use a different address in the same subnet for each machine." - print - - - fg.start() # Start executing the flow graph (runs in separate threads) - - mac.main_loop() # don't expect this to return... - - fg.stop() # but if it does, tell flow graph to stop. - fg.wait() # wait for it to finish - - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/gnuradio-examples/python/hier/digital/tx_voice.py b/gnuradio-examples/python/hier/digital/tx_voice.py deleted file mode 100755 index 09b1c58470..0000000000 --- a/gnuradio-examples/python/hier/digital/tx_voice.py +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2005,2006 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, modulation_utils -from gnuradio import usrp -from gnuradio import audio -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -from gnuradio.vocoder import gsm_full_rate - -import random -import time -import struct -import sys - -# from current dir -from transmit_path import transmit_path -import fusb_options - -#import os -#print os.getpid() -#raw_input('Attach and press enter') - - -class audio_rx(gr.hier_block): - def __init__(self, fg, audio_input_dev): - sample_rate = 8000 - src = audio.source(sample_rate, audio_input_dev) - src_scale = gr.multiply_const_ff(32767) - f2s = gr.float_to_short() - voice_coder = gsm_full_rate.encode_sp() - self.packets_from_encoder = gr.msg_queue() - packet_sink = gr.message_sink(33, self.packets_from_encoder, False) - fg.connect(src, src_scale, f2s, voice_coder, packet_sink) - gr.hier_block.__init__(self, fg, src, packet_sink) - - def get_encoded_voice_packet(self): - return self.packets_from_encoder.delete_head() - - -class my_graph(gr.flow_graph): - - def __init__(self, modulator_class, options): - gr.flow_graph.__init__(self) - self.txpath = transmit_path(self, modulator_class, options) - self.audio_rx = audio_rx(self, options.audio_input) - - - -# ///////////////////////////////////////////////////////////////////////////// -# main -# ///////////////////////////////////////////////////////////////////////////// - -def main(): - - def send_pkt(payload='', eof=False): - return fg.txpath.send_pkt(payload, eof) - - def rx_callback(ok, payload): - print "ok = %r, payload = '%s'" % (ok, payload) - - mods = modulation_utils.type_1_mods() - - parser = OptionParser(option_class=eng_option, conflict_handler="resolve") - expert_grp = parser.add_option_group("Expert") - - parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(), - default='gmsk', - help="Select modulation from: %s [default=%%default]" - % (', '.join(mods.keys()),)) - parser.add_option("-M", "--megabytes", type="eng_float", default=0, - help="set megabytes to transmit [default=inf]") - parser.add_option("-I", "--audio-input", type="string", default="", - help="pcm input device name. E.g., hw:0,0 or /dev/dsp") - - transmit_path.add_options(parser, expert_grp) - - for mod in mods.values(): - mod.add_options(expert_grp) - - fusb_options.add_options(expert_grp) - - parser.set_defaults(bitrate=50e3) # override default bitrate default - (options, args) = parser.parse_args () - - if len(args) != 0: - parser.print_help() - sys.exit(1) - - 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) - - - # build the graph - fg = my_graph(mods[options.modulation], options) - - r = gr.enable_realtime_scheduling() - if r != gr.RT_OK: - print "Warning: failed to enable realtime scheduling" - - - fg.start() # start flow graph - - # generate and send packets - nbytes = int(1e6 * options.megabytes) - n = 0 - pktno = 0 - - while nbytes == 0 or n < nbytes: - packet = fg.audio_rx.get_encoded_voice_packet() - s = packet.to_string() - send_pkt(s) - n += len(s) - sys.stderr.write('.') - pktno += 1 - - send_pkt(eof=True) - fg.wait() # wait for it to finish - fg.txpath.set_auto_tr(False) - - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/gnuradio-examples/python/hier/networking/Makefile.am b/gnuradio-examples/python/hier/networking/Makefile.am deleted file mode 100644 index 95ced72885..0000000000 --- a/gnuradio-examples/python/hier/networking/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -# -# 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. -# - -EXTRA_DIST = \ - audio_sink.py \ - audio_source.py \ - dial_tone_sink.py \ - dial_tone_source.py \ - vector_sink.py \ - vector_source.py - -MOSTLYCLEANFILES = *.pyc *~ diff --git a/gnuradio-examples/python/hier/networking/audio_sink.py b/gnuradio-examples/python/hier/networking/audio_sink.py deleted file mode 100755 index e59d50834a..0000000000 --- a/gnuradio-examples/python/hier/networking/audio_sink.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006,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, audio -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -class audio_sink(gr.top_block): - def __init__(self, src, port, pkt_size, sample_rate): - gr.top_block.__init__(self, "audio_sink") - src = gr.udp_source(gr.sizeof_float, src, port, pkt_size) - dst = audio.sink(sample_rate) - self.connect(src, dst) - -if __name__ == '__main__': - parser = OptionParser(option_class=eng_option) - parser.add_option("", "--src-name", type="string", default="localhost", - help="local host name (domain name or IP address)") - parser.add_option("", "--src-port", type="int", default=65500, - help="port value to listen to for connection") - parser.add_option("", "--packet-size", type="int", default=1472, - help="packet size.") - parser.add_option("-r", "--sample-rate", type="int", default=32000, - help="audio signal sample rate [default=%default]") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - - # Create an instance of a hierarchical block - top_block = audio_sink(options.src_name, options.src_port, - options.packet_size, options.sample_rate) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - diff --git a/gnuradio-examples/python/hier/networking/audio_source.py b/gnuradio-examples/python/hier/networking/audio_source.py deleted file mode 100755 index d7f4f6d936..0000000000 --- a/gnuradio-examples/python/hier/networking/audio_source.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006,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, audio -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -class audio_source(gr.top_block): - def __init__(self, src, dst, port, pkt_size, sample_rate): - gr.top_block.__init__(self, "audio_source") - self.audio = audio.source(sample_rate) - self.sink = gr.udp_sink(gr.sizeof_float, src, 0, dst, port, pkt_size) - self.connect(self.audio, self.sink) - -if __name__ == '__main__': - parser = OptionParser(option_class=eng_option) - parser.add_option("", "--src-name", type="string", default="localhost", - help="local host name (domain name or IP address)") - parser.add_option("", "--dst-name", type="string", default="localhost", - help="Remote host name (domain name or IP address") - parser.add_option("", "--dst-port", type="int", default=65500, - help="port value to connect to") - parser.add_option("", "--packet-size", type="int", default=1472, - help="packet size.") - parser.add_option("-r", "--sample-rate", type="int", default=32000 , - help="audio signal sample rate [default=%default]") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - - # Create an instance of a hierarchical block - top_block = audio_source(options.src_name, options.dst_name, options.dst_port, - options.packet_size, options.sample_rate) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - diff --git a/gnuradio-examples/python/hier/networking/dial_tone_sink.py b/gnuradio-examples/python/hier/networking/dial_tone_sink.py deleted file mode 100755 index 47d24b9bcf..0000000000 --- a/gnuradio-examples/python/hier/networking/dial_tone_sink.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006,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, audio -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -class dial_tone_sink(gr.top_block): - def __init__(self, src, port, pkt_size, sample_rate): - gr.top_block.__init__(self, "dial_tone_sink") - udp = gr.udp_source(gr.sizeof_float, src, port, pkt_size) - sink = audio.sink(sample_rate) - self.connect(udp, sink) - -if __name__ == '__main__': - parser = OptionParser(option_class=eng_option) - parser.add_option("", "--src-name", type="string", default="localhost", - help="local host name (domain name or IP address)") - parser.add_option("", "--src-port", type="int", default=65500, - help="port value to listen to for connection") - parser.add_option("", "--packet-size", type="int", default=1472, - help="packet size.") - parser.add_option("-r", "--sample-rate", type="int", default=8000, - help="audio signal sample rate [default=%default]") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - - # Create an instance of a hierarchical block - top_block = dial_tone_sink(options.src_name, options.src_port, - options.packet_size, options.sample_rate) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - diff --git a/gnuradio-examples/python/hier/networking/dial_tone_source.py b/gnuradio-examples/python/hier/networking/dial_tone_source.py deleted file mode 100755 index 835f9aafcb..0000000000 --- a/gnuradio-examples/python/hier/networking/dial_tone_source.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006,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 -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -class dial_tone_source(gr.top_block): - def __init__(self, src, dst, port, pkt_size, sample_rate): - gr.top_block.__init__(self, "dial_tone_source") - - amplitude = 0.3 - src0 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 350, amplitude) - src1 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 440, amplitude) - add = gr.add_ff() - - # Throttle needed here to account for the other side's audio card sampling rate - thr = gr.throttle(gr.sizeof_float, sample_rate) - sink = gr.udp_sink(gr.sizeof_float, src, 0, dst, port, pkt_size) - self.connect(src0, (add, 0)) - self.connect(src1, (add, 1)) - self.connect(add, thr, sink) - -if __name__ == '__main__': - parser = OptionParser(option_class=eng_option) - parser.add_option("", "--src-name", type="string", default="localhost", - help="local host name (domain name or IP address)") - parser.add_option("", "--dst-name", type="string", default="localhost", - help="Remote host name (domain name or IP address") - parser.add_option("", "--dst-port", type="int", default=65500, - help="port value to connect to") - parser.add_option("", "--packet-size", type="int", default=1472, - help="packet size.") - parser.add_option("-r", "--sample-rate", type="int", default=8000, - help="audio signal sample rate [default=%default]") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - - # Create an instance of a hierarchical block - top_block = dial_tone_source(options.src_name, options.dst_name, options.dst_port, - options.packet_size, options.sample_rate) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - diff --git a/gnuradio-examples/python/hier/networking/vector_sink.py b/gnuradio-examples/python/hier/networking/vector_sink.py deleted file mode 100755 index 981cc598b9..0000000000 --- a/gnuradio-examples/python/hier/networking/vector_sink.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006 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 -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -class vector_sink(gr.top_block): - def __init__(self, src, port, pkt_size): - gr.top_block.__init__(self, "vector_sink") - - udp = gr.udp_source(gr.sizeof_float, src, port, pkt_size) - sink = gr.file_sink(gr.sizeof_float, "received.dat") - self.connect(udp, sink) - -if __name__ == "__main__": - parser = OptionParser(option_class=eng_option) - parser.add_option("", "--src-name", type="string", default="localhost", - help="local host name (domain name or IP address)") - parser.add_option("", "--src-port", type="int", default=65500, - help="port value to listen to for connection") - parser.add_option("", "--packet-size", type="int", default=1471, - help="packet size.") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - - # Create an instance of a hierarchical block - top_block = vector_sink(options.src_name, options.src_port, options.packet_size) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - diff --git a/gnuradio-examples/python/hier/networking/vector_source.py b/gnuradio-examples/python/hier/networking/vector_source.py deleted file mode 100755 index e7ec2a461d..0000000000 --- a/gnuradio-examples/python/hier/networking/vector_source.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006 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 -from gnuradio.eng_option import eng_option -from optparse import OptionParser - -class vector_source(gr.top_block): - def __init__(self, src, dst, port, pkt_size): - gr.top_block.__init__(self, "vector_source") - data = [i*0.01 for i in range(1000)] - vec = gr.vector_source_f(data, True) - udp = gr.udp_sink(gr.sizeof_float, src, 0, dst, port, pkt_size) - self.connect(vec, udp) - -if __name__ == '__main__': - parser = OptionParser(option_class=eng_option) - parser.add_option("", "--src-name", type="string", default="localhost", - help="local host name (domain name or IP address)") - parser.add_option("", "--dst-name", type="string", default="localhost", - help="Remote host name (domain name or IP address") - parser.add_option("", "--dst-port", type="int", default=65500, - help="port value to connect to") - parser.add_option("", "--packet-size", type="int", default=1471, - help="packet size.") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - -# Create an instance of a hierarchical block - top_block = vector_source(options.src_name, options.dst_name, - options.dst_port, options.packet_size) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - diff --git a/gnuradio-examples/python/hier/ofdm/Makefile.am b/gnuradio-examples/python/hier/ofdm/Makefile.am deleted file mode 100644 index b3ebfe6a80..0000000000 --- a/gnuradio-examples/python/hier/ofdm/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright 2006 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. -# - -EXTRA_DIST =
\ No newline at end of file diff --git a/gnuradio-examples/python/hier/sounder/Makefile.am b/gnuradio-examples/python/hier/sounder/Makefile.am deleted file mode 100644 index 9814d80ef8..0000000000 --- a/gnuradio-examples/python/hier/sounder/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -# -# 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. -# - -EXTRA_DIST = \ - usrp_sounder_rx.py \ - usrp_sounder_tx.py \ - usrp_source.py \ - usrp_sink.py \ - sounder_rx.py \ - sounder_tx.py - -MOSTLYCLEANFILES = *.pyc *~ *.dat diff --git a/gnuradio-examples/python/hier/sounder/sounder_rx.py b/gnuradio-examples/python/hier/sounder/sounder_rx.py deleted file mode 100644 index d24eb8efa9..0000000000 --- a/gnuradio-examples/python/hier/sounder/sounder_rx.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/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 -from usrp_source import usrp_source_c -import math - -n2s = eng_notation.num_to_str - -class sounder_rx(gr.hier_block2): - """ - Creates a channel sounder receiver block with the given parameters. - """ - - def __init__(self, chip_rate, degree, verbose): - - # Call hierarchical block constructor - # Top-level blocks have no inputs or outputs - gr.hier_block2.__init__(self, - "sounder_rx", # Block typename - gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature - gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature - - self._degree = degree - self._chip_rate = chip_rate - self._verbose = verbose - self._length = 2**self._degree-1 - self._rep_rate = self._chip_rate/float(self._length) - - if self._verbose: - print "Using PN sequence of degree", self._degree, "length", self._length - print "Sequence repetition rate is", n2s(self._rep_rate), "per sec" - - self.connect(self, gr.pn_correlator_cc(self._degree), self) diff --git a/gnuradio-examples/python/hier/sounder/sounder_tx.py b/gnuradio-examples/python/hier/sounder/sounder_tx.py deleted file mode 100644 index dcdd9fc5ce..0000000000 --- a/gnuradio-examples/python/hier/sounder/sounder_tx.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/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 -import math - -n2s = eng_notation.num_to_str - -class sounder_tx(gr.hier_block2): - """ - Creates a channel sounder generator with the given parameters. - """ - - def __init__(self, degree, chip_rate, verbose): - gr.hier_block2.__init__(self, - "sounder_tx", # Block typename - gr.io_signature(0,0,0), # Input signature - gr.io_signature(1, 1, gr.sizeof_float)) # Output signature - - self._degree = degree - self._chip_rate = chip_rate - self._verbose = verbose - self._length = 2**degree-1 - - # Connect PN source to block output - self.connect(gr.glfsr_source_f(degree), self) diff --git a/gnuradio-examples/python/hier/sounder/usrp_sink.py b/gnuradio-examples/python/hier/sounder/usrp_sink.py deleted file mode 100644 index 34b6107048..0000000000 --- a/gnuradio-examples/python/hier/sounder/usrp_sink.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/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 sink for complex floats, -# with convenience functions for tuning, interpolation, etc. -# -class usrp_sink_c(gr.hier_block2): - """ - Create a USRP sink object accepting complex floats. - """ - def __init__(self, which=0, subdev_spec=None, if_rate=None, - freq=0.0, calibration=0.0, verbose=False): - # Call hierarchical block constructor - gr.hier_block2.__init__(self, - "usrp_sink_c", # Block typename - gr.io_signature(1,1,gr.sizeof_gr_complex), # Input signature - gr.io_signature(0,0,0)) # Output signature - - self._verbose = verbose - self._u = usrp.sink_c(which) - if self._verbose: - print 'DAC sample rate is', n2s(self._u.dac_rate()), "sps" - self.set_subdev(subdev_spec) - self.set_if_rate(if_rate) - self.set_calibration(calibration) - self.tune(freq) - self.connect(self, self._u) - - 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_tx_mux_value(self._u, subdev_spec)) - if self._verbose: - print 'TX 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 interpolation - if if_rate is None: - self._interp = 512 - else: - self._interp = 4*int(self._u.dac_rate()/(4.0*if_rate)+0.5) - - - self._if_rate = self._u.dac_rate()/self._interp - self._u.set_interp_rate(self._interp) - - if self._verbose: - print "USRP interpolation rate is", self._interp - print "USRP IF rate is", n2s(self._if_rate), "sps" - - 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 = self._u.tune(self._subdev._which, 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__': - sink = usrp_sink_c(verbose=True) - diff --git a/gnuradio-examples/python/hier/sounder/usrp_sounder_rx.py b/gnuradio-examples/python/hier/sounder/usrp_sounder_rx.py deleted file mode 100755 index 6b85281ad7..0000000000 --- a/gnuradio-examples/python/hier/sounder/usrp_sounder_rx.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/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 usrp_source import usrp_source_c -from sounder_rx import sounder_rx - -n2s = eng_notation.num_to_str - -class usrp_sounder_rx(gr.top_block): - def __init__(self, options): - gr.top_block.__init__(self, "usrp_sounder_rx") - self._options = options - self._u = usrp_source_c(0, - self._options.rx_subdev_spec, - self._options.gain, - self._options.chip_rate, - self._options.freq, - self._options.cal, - self._options.verbose) - self._options.chip_rate = self._u._if_rate - self._length = 2**self._options.degree-1 - self._receiver = sounder_rx(self._options.chip_rate, - self._options.degree, - self._options.verbose) - - samples = 100 * self._length**2 - - head = gr.head(gr.sizeof_gr_complex, samples) - c2m = gr.complex_to_mag() - s2v = gr.stream_to_vector(gr.sizeof_float, self._length) - lpf = gr.single_pole_iir_filter_ff(self._options.alpha, self._length) - v2s = gr.vector_to_stream(gr.sizeof_float, self._length) - sink = gr.file_sink(gr.sizeof_float, "impulse.dat") - - self.connect(self._u, head, self._receiver, c2m, s2v, lpf, v2s, sink) - - if self._options.verbose: - print "Chip rate is", n2s(self._options.chip_rate), "chips/sec" - print "Resolution is", n2s(1.0/self._options.chip_rate), "sec" - print "Using PN code of degree", self._options.degree - -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 found)") - parser.add_option("-f", "--freq", type="eng_float", default=0.0, - help="set center frequency (default=%default)") - parser.add_option("-c", "--cal", type="eng_float", default=0.0, - help="set frequency calibration offset (default=%default)") - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="print extra debugging info") - parser.add_option("-d", "--degree", type="int", default=10, - help="set PN code degree (length=2**degree-1, default=%default)") - parser.add_option("-r", "--chip-rate", type="eng_float", default=8e6, - help="set sounder chip rate (default=%default)") - parser.add_option("-g", "--gain", type="eng_float", default=None, - help="set receiver gain (default=%default)") - parser.add_option("", "--alpha", type="eng_float", default=1.0, - help="set smoothing constant (default=%default)") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - sys.exit(1) - - top_block = usrp_sounder_rx(options) - - try: - top_block.run() - except KeyboardInterrupt: - pass - -if __name__ == '__main__': - main () diff --git a/gnuradio-examples/python/hier/sounder/usrp_sounder_tx.py b/gnuradio-examples/python/hier/sounder/usrp_sounder_tx.py deleted file mode 100755 index ae531d5100..0000000000 --- a/gnuradio-examples/python/hier/sounder/usrp_sounder_tx.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/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 usrp_sink import usrp_sink_c -from sounder_tx import sounder_tx - -n2s = eng_notation.num_to_str - -class usrp_sounder_tx(gr.top_block): - def __init__(self, subdev_spec, freq, cal, verbose, degree, chip_rate, amplitude): - - # Call hierarchical block constructor - # Top-level blocks have no inputs or outputs - gr.top_block.__init__(self, "usrp_sounder_tx") - self._freq = freq - self._cal = cal - self._verbose = verbose - self._degree = degree - self._length = 2**degree-1 - self._amplitude = amplitude - - self._u = usrp_sink_c(0, subdev_spec, chip_rate, self._freq, self._cal, self._verbose) - self._chip_rate = self._u._if_rate - self._max_time = float(self._length)/self._chip_rate - self._pn = sounder_tx(self._degree, self._chip_rate, self._verbose) - self._gain = gr.multiply_const_ff(amplitude) - self._f2c = gr.float_to_complex() - self.connect(self._pn, self._gain, self._f2c, self._u) - - if self._verbose: - print "Chip rate is", n2s(self._chip_rate), "chips/sec" - print "Resolution is", n2s(1.0/self._chip_rate), "sec" - print "Using PN code of degree", self._degree, "length", 2**self._degree-1 - print "Maximum measurable impulse response is", n2s(self._max_time), "sec" - print "Output amplitude is", amplitude - - -def main(): - parser = OptionParser(option_class=eng_option) - - # Transmit path options - parser.add_option("-T", "--tx-subdev-spec", type="subdev", default=None, - help="select USRP Rx side A or B (default=first found)") - parser.add_option("-f", "--freq", type="eng_float", default=0.0, - help="set center frequency (default=%default)") - parser.add_option("-c", "--cal", type="eng_float", default=0.0, - help="set frequency calibration offset (default=%default)") - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="print extra debugging info") - parser.add_option("-d", "--degree", type="int", default=10, - help="set PN code degree (length=2**degree-1, default=%default)") - parser.add_option("-r", "--chip-rate", type="eng_float", default=8e6, - help="set sounder chip rate (default=%default)") - parser.add_option("-g", "--amplitude", type="eng_float", default=8000.0, - help="set output amplitude (default=%default)") - parser.add_option("", "--real-time", action="store_true", default=False, - help="Attempt to enable real-time scheduling") - (options, args) = parser.parse_args() - - if len(args) != 0: - parser.print_help() - sys.exit(1) - - if not options.real_time: - realtime = False - else: - # Attempt to enable realtime scheduling - r = gr.enable_realtime_scheduling() - if r == gr.RT_OK: - realtime = True - else: - realtime = False - print "Note: failed to enable realtime scheduling" - - # Create an instance of a hierarchical block - top_block = usrp_sounder_tx(options.tx_subdev_spec, options.freq, options.cal, - options.verbose, options.degree, options.chip_rate, - options.amplitude) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - -if __name__ == '__main__': - main () diff --git a/gnuradio-examples/python/hier/sounder/usrp_source.py b/gnuradio-examples/python/hier/sounder/usrp_source.py deleted file mode 100644 index 63eb3ce2bf..0000000000 --- a/gnuradio-examples/python/hier/sounder/usrp_source.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/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) - if self._verbose: - print "USRP gain set to", 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) diff --git a/gnuradio-examples/python/hier/usrp/Makefile.am b/gnuradio-examples/python/hier/usrp/Makefile.am deleted file mode 100644 index 3d4ea30dbc..0000000000 --- a/gnuradio-examples/python/hier/usrp/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -# -# 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. -# - -EXTRA_DIST = \ - usrp_fft.py \ - usrp_siggen.py - -MOSTLYCLEANFILES = *.pyc *~ diff --git a/gnuradio-examples/python/hier/usrp/usrp_fft.py b/gnuradio-examples/python/hier/usrp/usrp_fft.py deleted file mode 100755 index 2dc059e533..0000000000 --- a/gnuradio-examples/python/hier/usrp/usrp_fft.py +++ /dev/null @@ -1,249 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2004,2005,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, gru -from gnuradio import usrp -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from gnuradio.wxgui import stdgui2, fftsink2, waterfallsink2, scopesink2, form, slider -from optparse import OptionParser -import wx -import sys - - -def pick_subdevice(u): - """ - The user didn't specify a subdevice on the command line. - If there's a daughterboard on A, select A. - If there's a daughterboard on B, select B. - Otherwise, select A. - """ - if u.db[0][0].dbid() >= 0: # dbid is < 0 if there's no d'board or a problem - return (0, 0) - if u.db[1][0].dbid() >= 0: - return (1, 0) - return (0, 0) - - -class app_top_block(stdgui2.std_top_block): - def __init__(self, frame, panel, vbox, argv): - stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv) - - self.frame = frame - self.panel = panel - - 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("-d", "--decim", type="int", default=16, - help="set fgpa decimation rate to DECIM [default=%default]") - parser.add_option("-f", "--freq", type="eng_float", default=None, - help="set frequency to FREQ", metavar="FREQ") - parser.add_option("-g", "--gain", type="eng_float", default=None, - help="set gain in dB (default is midpoint)") - parser.add_option("-W", "--waterfall", action="store_true", default=False, - help="Enable waterfall display") - parser.add_option("-8", "--width-8", action="store_true", default=False, - help="Enable 8-bit samples across USB") - parser.add_option("-S", "--oscilloscope", action="store_true", default=False, - help="Enable oscilloscope display") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - sys.exit(1) - - self.show_debug_info = True - - self.u = usrp.source_c(decim_rate=options.decim) - if options.rx_subdev_spec is None: - options.rx_subdev_spec = pick_subdevice(self.u) - self.u.set_mux(usrp.determine_rx_mux_value(self.u, options.rx_subdev_spec)) - - if options.width_8: - width = 8 - shift = 8 - format = self.u.make_format(width, shift) - print "format =", hex(format) - r = self.u.set_format(format) - print "set_format =", r - - # determine the daughterboard subdevice we're using - self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec) - - input_rate = self.u.adc_freq() / self.u.decim_rate() - - - if options.waterfall: - self.scope = waterfallsink2.waterfall_sink_c (panel, fft_size=1024, sample_rate=input_rate) - elif options.oscilloscope: - self.scope = scopesink2.scope_sink_c(panel, sample_rate=input_rate) - else: - self.scope = fftsink2.fft_sink_c (panel, fft_size=1024, sample_rate=input_rate) - - self.connect(self.u, self.scope) - - self._build_gui(vbox) - - # set initial values - - if options.gain is None: - # if no gain was specified, use the mid-point in dB - g = self.subdev.gain_range() - options.gain = float(g[0]+g[1])/2 - - if options.freq is None: - # if no freq was specified, use the mid-point - r = self.subdev.freq_range() - options.freq = float(r[0]+r[1])/2 - - self.set_gain(options.gain) - - if self.show_debug_info: - self.myform['decim'].set_value(self.u.decim_rate()) - self.myform['fs@usb'].set_value(self.u.adc_freq() / self.u.decim_rate()) - self.myform['dbname'].set_value(self.subdev.name()) - self.myform['baseband'].set_value(0) - self.myform['ddc'].set_value(0) - - if not(self.set_freq(options.freq)): - self._set_status_msg("Failed to set initial frequency") - - def _set_status_msg(self, msg): - self.frame.GetStatusBar().SetStatusText(msg, 0) - - def _build_gui(self, vbox): - - def _form_set_freq(kv): - return self.set_freq(kv['freq']) - - vbox.Add(self.scope.win, 10, wx.EXPAND) - - # add control area at the bottom - self.myform = myform = form.form() - hbox = wx.BoxSizer(wx.HORIZONTAL) - hbox.Add((5,0), 0, 0) - myform['freq'] = form.float_field( - parent=self.panel, sizer=hbox, label="Center freq", weight=1, - callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg)) - - hbox.Add((5,0), 0, 0) - g = self.subdev.gain_range() - myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain", - weight=3, - min=int(g[0]), max=int(g[1]), - callback=self.set_gain) - - hbox.Add((5,0), 0, 0) - vbox.Add(hbox, 0, wx.EXPAND) - - self._build_subpanel(vbox) - - def _build_subpanel(self, vbox_arg): - # build a secondary information panel (sometimes hidden) - - # FIXME figure out how to have this be a subpanel that is always - # created, but has its visibility controlled by foo.Show(True/False) - - def _form_set_decim(kv): - return self.set_decim(kv['decim']) - - if not(self.show_debug_info): - return - - panel = self.panel - vbox = vbox_arg - myform = self.myform - - #panel = wx.Panel(self.panel, -1) - #vbox = wx.BoxSizer(wx.VERTICAL) - - hbox = wx.BoxSizer(wx.HORIZONTAL) - hbox.Add((5,0), 0) - - myform['decim'] = form.int_field( - parent=panel, sizer=hbox, label="Decim", - callback=myform.check_input_and_call(_form_set_decim, self._set_status_msg)) - - hbox.Add((5,0), 1) - myform['fs@usb'] = form.static_float_field( - parent=panel, sizer=hbox, label="Fs@USB") - - hbox.Add((5,0), 1) - myform['dbname'] = form.static_text_field( - parent=panel, sizer=hbox) - - hbox.Add((5,0), 1) - myform['baseband'] = form.static_float_field( - parent=panel, sizer=hbox, label="Analog BB") - - hbox.Add((5,0), 1) - myform['ddc'] = form.static_float_field( - parent=panel, sizer=hbox, label="DDC") - - hbox.Add((5,0), 0) - vbox.Add(hbox, 0, wx.EXPAND) - - - def set_freq(self, target_freq): - """ - Set the center frequency we're interested in. - - @param target_freq: frequency in Hz - @rypte: 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. - """ - r = self.u.tune(0, self.subdev, target_freq) - - if r: - self.myform['freq'].set_value(target_freq) # update displayed value - if self.show_debug_info: - self.myform['baseband'].set_value(r.baseband_freq) - self.myform['ddc'].set_value(r.dxc_freq) - return True - - return False - - def set_gain(self, gain): - self.myform['gain'].set_value(gain) # update displayed value - self.subdev.set_gain(gain) - - def set_decim(self, decim): - ok = self.u.set_decim_rate(decim) - if not ok: - print "set_decim failed" - input_rate = self.u.adc_freq() / self.u.decim_rate() - self.scope.set_sample_rate(input_rate) - if self.show_debug_info: # update displayed values - self.myform['decim'].set_value(self.u.decim_rate()) - self.myform['fs@usb'].set_value(self.u.adc_freq() / self.u.decim_rate()) - return ok - -def main (): - app = stdgui2.stdapp(app_top_block, "USRP FFT", nstatus=1) - app.MainLoop() - -if __name__ == '__main__': - main () diff --git a/gnuradio-examples/python/hier/usrp/usrp_siggen.py b/gnuradio-examples/python/hier/usrp/usrp_siggen.py deleted file mode 100755 index 91a7a7affd..0000000000 --- a/gnuradio-examples/python/hier/usrp/usrp_siggen.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python - -from gnuradio import gr, gru -from gnuradio import usrp -from gnuradio.eng_option import eng_option -from gnuradio import eng_notation -from optparse import OptionParser -import sys - -class my_graph(gr.top_block): - def __init__ (self, type, ampl, wfreq, offset, subdev_spec, interp, rf_freq): - gr.top_block.__init__(self, "usrp_siggen") - - # controllable values - self.interp = interp - self.waveform_type = type - self.waveform_ampl = ampl - self.waveform_freq = wfreq - self.waveform_offset = offset - - self.u = usrp.sink_c (0, self.interp) - - # determine the daughterboard subdevice we're using - if subdev_spec is None: - ubdev_spec = usrp.pick_tx_subdevice(self.u) - m = usrp.determine_tx_mux_value(self.u, subdev_spec) - self.u.set_mux(m) - self.subdev = usrp.selected_subdev(self.u, subdev_spec) - self.subdev.set_gain(self.subdev.gain_range()[1]) # set max Tx gain - self.subdev.set_enable(True) # enable transmitter - print "Using TX d'board %s" % (self.subdev.side_and_name(),) - - if not self.set_freq(rf_freq): - sys.stderr.write('Failed to set RF frequency\n') - raise SystemExit - - if type == gr.GR_SIN_WAVE or type == gr.GR_CONST_WAVE: - self.src = gr.sig_source_c (self.usb_freq (), - gr.GR_SIN_WAVE, - self.waveform_freq, - self.waveform_ampl, - self.waveform_offset) - - elif type == gr.GR_UNIFORM or type == gr.GR_GAUSSIAN: - self.src = gr.noise_source_c (gr.GR_UNIFORM, - self.waveform_ampl) - - else: - raise ValueError, type - - self.connect (self.src, self.u) - - - def usb_freq (self): - return self.u.dac_freq() / self.interp - - def usb_throughput (self): - return self.usb_freq () * 4 - - def set_freq(self, target_freq): - """ - Set the center frequency we're interested in. - - @param target_freq: frequency in Hz - @rypte: 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 up converter. - """ - r = self.u.tune(self.subdev._which, self.subdev, target_freq) - if r: - #print "r.baseband_freq =", eng_notation.num_to_str(r.baseband_freq) - #print "r.dxc_freq =", eng_notation.num_to_str(r.dxc_freq) - #print "r.residual_freq =", eng_notation.num_to_str(r.residual_freq) - #print "r.inverted =", r.inverted - return True - - return False - - - -def main (): - parser = OptionParser (option_class=eng_option) - parser.add_option ("-T", "--tx-subdev-spec", type="subdev", default=(0, 0), - help="select USRP Tx side A or B") - parser.add_option ("-f", "--rf-freq", type="eng_float", default=None, - help="set RF center frequency to FREQ") - parser.add_option ("-i", "--interp", type="int", default=64, - help="set fgpa interpolation rate to INTERP [default=%default]") - - parser.add_option ("--sine", dest="type", action="store_const", const=gr.GR_SIN_WAVE, - help="generate a complex sinusoid [default]", default=gr.GR_SIN_WAVE) - parser.add_option ("--const", dest="type", action="store_const", const=gr.GR_CONST_WAVE, - help="generate a constant output") - parser.add_option ("--gaussian", dest="type", action="store_const", const=gr.GR_GAUSSIAN, - help="generate Gaussian random output") - parser.add_option ("--uniform", dest="type", action="store_const", const=gr.GR_UNIFORM, - help="generate Uniform random output") - - parser.add_option ("-w", "--waveform-freq", type="eng_float", default=100e3, - help="set waveform frequency to FREQ [default=%default]") - parser.add_option ("-a", "--amplitude", type="eng_float", default=16e3, - help="set waveform amplitude to AMPLITUDE [default=%default]", metavar="AMPL") - parser.add_option ("-o", "--offset", type="eng_float", default=0, - help="set waveform offset to OFFSET [default=%default]") - (options, args) = parser.parse_args () - - if len(args) != 0: - parser.print_help() - raise SystemExit - - if options.rf_freq is None: - sys.stderr.write("usrp_siggen: must specify RF center frequency with -f RF_FREQ\n") - parser.print_help() - raise SystemExit - - top_block = my_graph(options.type, options.amplitude, options.waveform_freq, options.offset, - options.tx_subdev_spec, options.interp, options.rf_freq) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - -if __name__ == '__main__': - main () |