diff options
8 files changed, 0 insertions, 837 deletions
diff --git a/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.cc b/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.cc deleted file mode 100644 index a63c1d38a..000000000 --- a/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006, 2011 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gr_constellation_decoder2_cb.h> -#include <gr_constellation.h> -#include <gr_io_signature.h> -#include <iostream> - -gr_constellation_decoder2_cb_sptr -gr_make_constellation_decoder2_cb (gr_constellation_sptr constellation) -{ - return gr_constellation_decoder2_cb_sptr - (new gr_constellation_decoder2_cb(constellation)); -} - -gr_constellation_decoder2_cb:: -gr_constellation_decoder2_cb (gr_constellation_sptr constellation) - : gr_block ("constellation_decoder2_cb", - gr_make_io_signature (1, 1, sizeof (gr_complex)), - gr_make_io_signature (1, 1, sizeof (unsigned char))), - d_constellation(constellation), - d_dim(constellation->dimensionality()) -{ - set_relative_rate (1.0 / ((double) d_dim)); -} - -void -gr_constellation_decoder2_cb::forecast (int noutput_items, - gr_vector_int &ninput_items_required) -{ - unsigned int input_required = noutput_items * d_dim; - - unsigned ninputs = ninput_items_required.size(); - for (unsigned int i = 0; i < ninputs; i++) - ninput_items_required[i] = input_required; -} - - -int -gr_constellation_decoder2_cb:: -general_work (int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) -{ - gr_complex const *in = (const gr_complex *) input_items[0]; - unsigned char *out = (unsigned char *) output_items[0]; - - for(int i = 0; i < noutput_items; i++){ - out[i] = d_constellation->decision_maker(&(in[i*d_dim])); - } - - consume_each (noutput_items * d_dim); - return noutput_items; -} diff --git a/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.h b/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.h deleted file mode 100644 index 51891b636..000000000 --- a/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006, 2011 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_GR_CONSTELLATION_DECODER2_CB_H -#define INCLUDED_GR_CONSTELLATION_DECODER2_CB_H - -#include <gr_block.h> -#include <gr_constellation.h> -#include <vector> - -class gr_constellation_decoder2_cb; -typedef boost::shared_ptr<gr_constellation_decoder2_cb> gr_constellation_decoder2_cb_sptr; - -gr_constellation_decoder2_cb_sptr -gr_make_constellation_decoder2_cb (gr_constellation_sptr constellation); - -/*! - * \brief Constellation Decoder - * \ingroup coding_blk - * - */ -class gr_constellation_decoder2_cb : public gr_block -{ - - private: - gr_constellation_sptr d_constellation; - unsigned int d_dim; - - friend gr_constellation_decoder2_cb_sptr - gr_make_constellation_decoder2_cb (gr_constellation_sptr constellation); - - gr_constellation_decoder2_cb (gr_constellation_sptr constellation); - - public: - - void forecast (int noutput_items, - gr_vector_int &ninput_items_required); - - int general_work (int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); -}; - -#endif diff --git a/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.i b/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.i deleted file mode 100644 index 2865363d8..000000000 --- a/gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.i +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006, 2011 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -GR_SWIG_BLOCK_MAGIC(gr,constellation_decoder2_cb) - -gr_constellation_decoder2_cb_sptr -gr_make_constellation_decoder2_cb (gr_constellation_sptr constellation); - -class gr_constellation_decoder2_cb : public gr_sync_block -{ - private: - gr_constellation_decoder2_cb (gr_constellation_sptr constellation); - - friend gr_constellation_decoder2_cb_sptr - gr_make_constellation_decoder2_cb (gr_constellation_sptr constellation); - - public: - ~gr_constellation_decoder2_cb(); -}; diff --git a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc deleted file mode 100644 index be6d3bfe4..000000000 --- a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc +++ /dev/null @@ -1,130 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2005,2006,2007,2010,2011 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gr_io_signature.h> -#include <gr_prefs.h> -#include <gr_constellation_receiver_cb.h> -#include <stdexcept> -#include <gr_math.h> -#include <gr_expj.h> - - -#define M_TWOPI (2*M_PI) -#define VERBOSE_MM 0 // Used for debugging symbol timing loop -#define VERBOSE_COSTAS 0 // Used for debugging phase and frequency tracking - -// Public constructor - -gr_constellation_receiver_cb_sptr -gr_make_constellation_receiver_cb(gr_constellation_sptr constell, - float alpha, float beta, - float fmin, float fmax) -{ - return gnuradio::get_initial_sptr(new gr_constellation_receiver_cb (constell, - alpha, beta, - fmin, fmax)); -} - -static int ios[] = {sizeof(char), sizeof(float), sizeof(float), sizeof(float)}; -static std::vector<int> iosig(ios, ios+sizeof(ios)/sizeof(int)); -gr_constellation_receiver_cb::gr_constellation_receiver_cb (gr_constellation_sptr constellation, - float alpha, float beta, - float fmin, float fmax) - : gr_block ("constellation_receiver_cb", - gr_make_io_signature (1, 1, sizeof (gr_complex)), - gr_make_io_signaturev (1, 4, iosig)), - d_constellation(constellation), - d_alpha(alpha), d_beta(beta), d_freq(0), d_max_freq(fmax), d_min_freq(fmin), d_phase(0), - d_current_const_point(0) -{ - if (d_constellation->dimensionality() != 1) - throw std::runtime_error ("This receiver only works with constellations of dimension 1."); -} - -void -gr_constellation_receiver_cb::phase_error_tracking(float phase_error) -{ - d_freq += d_beta*phase_error; // adjust frequency based on error - d_phase += d_freq + d_alpha*phase_error; // adjust phase based on error - - // Make sure we stay within +-2pi - while(d_phase > M_TWOPI) - d_phase -= M_TWOPI; - while(d_phase < -M_TWOPI) - d_phase += M_TWOPI; - - // Limit the frequency range - d_freq = gr_branchless_clip(d_freq, d_max_freq); - -#if VERBOSE_COSTAS - printf("cl: phase_error: %f phase: %f freq: %f sample: %f+j%f constellation: %f+j%f\n", - phase_error, d_phase, d_freq, sample.real(), sample.imag(), - d_constellation->points()[d_current_const_point].real(), d_constellation->points()[d_current_const_point].imag()); -#endif -} - -int -gr_constellation_receiver_cb::general_work (int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) -{ - const gr_complex *in = (const gr_complex *) input_items[0]; - unsigned char *out = (unsigned char *) output_items[0]; - - int i=0; - - float phase_error; - unsigned int sym_value; - gr_complex sample, nco; - - float *out_err = 0, *out_phase = 0, *out_freq = 0; - if(output_items.size() == 4) { - out_err = (float *) output_items[1]; - out_phase = (float *) output_items[2]; - out_freq = (float *) output_items[3]; - } - - while((i < noutput_items) && (i < ninput_items[0])) { - sample = in[i]; - nco = gr_expj(d_phase); // get the NCO value for derotating the current sample - sample = nco*sample; // get the downconverted symbol - sym_value = d_constellation->decision_maker_pe(&sample, &phase_error); - // phase_error = -arg(sample*conj(d_constellation->points()[sym_value])); - phase_error_tracking(phase_error); // corrects phase and frequency offsets - out[i] = sym_value; - if(output_items.size() == 4) { - out_err[i] = phase_error; - out_phase[i] = d_phase; - out_freq[i] = d_freq; - } - i++; - } - - consume_each(i); - return i; -} - diff --git a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h deleted file mode 100644 index c5670e839..000000000 --- a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h +++ /dev/null @@ -1,149 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2004,2007,2010,2011 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_GR_CONSTELLATION_RECEIVER_CB_H -#define INCLUDED_GR_CONSTELLATION_RECEIVER_CB_H - -#include <gr_block.h> -#include <digital_constellation.h> -#include <gr_complex.h> -#include <math.h> -#include <fstream> - -class gr_constellation_receiver_cb; -typedef boost::shared_ptr<gr_constellation_receiver_cb> gr_constellation_receiver_cb_sptr; - -// public constructor -gr_constellation_receiver_cb_sptr -gr_make_constellation_receiver_cb (gr_constellation_sptr constellation, - float alpha, float beta, - float fmin, float fmax); - -/*! - * \brief This block takes care of receiving generic modulated signals through phase, frequency, and symbol - * synchronization. - * \ingroup sync_blk - * \ingroup demod_blk - * - * This block takes care of receiving generic modulated signals through phase, frequency, and symbol - * synchronization. It performs carrier frequency and phase locking as well as symbol timing recovery. - * - * The phase and frequency synchronization are based on a Costas loop that finds the error of the incoming - * signal point compared to its nearest constellation point. The frequency and phase of the NCO are - * updated according to this error. - * - * The symbol synchronization is done using a modified Mueller and Muller circuit from the paper: - * - * G. R. Danesfahani, T.G. Jeans, "Optimisation of modified Mueller and Muller - * algorithm," Electronics Letters, Vol. 31, no. 13, 22 June 1995, pp. 1032 - 1033. - * - * This circuit interpolates the downconverted sample (using the NCO developed by the Costas loop) - * every mu samples, then it finds the sampling error based on this and the past symbols and the decision - * made on the samples. Like the phase error detector, there are optimized decision algorithms for BPSK - * and QPKS, but 8PSK uses another brute force computation against all possible symbols. The modifications - * to the M&M used here reduce self-noise. - * - */ - -class gr_constellation_receiver_cb : public gr_block -{ - public: - int general_work (int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); - - - // Member function related to the phase/frequency tracking portion of the receiver - //! (CL) Returns the value for alpha (the phase gain term) - float alpha() const { return d_alpha; } - - //! (CL) Returns the value of beta (the frequency gain term) - float beta() const { return d_beta; } - - //! (CL) Returns the current value of the frequency of the NCO in the Costas loop - float freq() const { return d_freq; } - - //! (CL) Returns the current value of the phase of the NCO in the Costal loop - float phase() const { return d_phase; } - - //! (CL) Sets the value for alpha (the phase gain term) - void set_alpha(float alpha) { d_alpha = alpha; } - - //! (CL) Setss the value of beta (the frequency gain term) - void set_beta(float beta) { d_beta = beta; } - - //! (CL) Sets the current value of the frequency of the NCO in the Costas loop - void set_freq(float freq) { d_freq = freq; } - - //! (CL) Setss the current value of the phase of the NCO in the Costal loop - void set_phase(float phase) { d_phase = phase; } - - -protected: - - /*! - * \brief Constructor to synchronize incoming M-PSK symbols - * - * \param constellation constellation of points for generic modulation - * \param alpha gain parameter to adjust the phase in the Costas loop (~0.01) - * \param beta gain parameter to adjust the frequency in the Costas loop (~alpha^2/4) - * \param fmin minimum normalized frequency value the loop can achieve - * \param fmax maximum normalized frequency value the loop can achieve - * - * The constructor also chooses which phase detector and decision maker to use in the work loop based on the - * value of M. - */ - gr_constellation_receiver_cb (gr_constellation_sptr constellation, - float alpha, float beta, - float fmin, float fmax); - - void phase_error_tracking(float phase_error); - - private: - unsigned int d_M; - - // Members related to carrier and phase tracking - float d_alpha; - float d_beta; - float d_freq, d_max_freq, d_min_freq; - float d_phase; - - gr_constellation_sptr d_constellation; - unsigned int d_current_const_point; - - //! delay line length. - static const unsigned int DLLEN = 8; - - //! delay line plus some length for overflow protection - gr_complex d_dl[2*DLLEN] __attribute__ ((aligned(8))); - - //! index to delay line - unsigned int d_dl_idx; - - friend gr_constellation_receiver_cb_sptr - gr_make_constellation_receiver_cb (gr_constellation_sptr constell, - float alpha, float beta, - float fmin, float fmax); -}; - -#endif diff --git a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i deleted file mode 100644 index f4df49701..000000000 --- a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2004,2011 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -GR_SWIG_BLOCK_MAGIC(gr,constellation_receiver_cb); - -gr_constellation_receiver_cb_sptr gr_make_constellation_receiver_cb (gr_constellation_sptr constellation, - float alpha, float beta, - float fmin, float fmax); -class gr_constellation_receiver_cb : public gr_block -{ - private: - gr_constellation_receiver_cb (gr_contellation_sptr constellation, - float alpha, float beta, - float fmin, float fmax); -public: - float alpha() const { return d_alpha; } - float beta() const { return d_beta; } - float freq() const { return d_freq; } - float phase() const { return d_phase; } - void set_alpha(float alpha) { d_alpha = alpha; } - void set_beta(float beta) { d_beta = beta; } - void set_freq(float freq) { d_freq = freq; } - void set_phase(float phase) { d_phase = phase; } -}; diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_constellation.py b/gnuradio-core/src/python/gnuradio/gr/qa_constellation.py deleted file mode 100644 index 5c3c04160..000000000 --- a/gnuradio-core/src/python/gnuradio/gr/qa_constellation.py +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -import random -from cmath import exp, pi, log - -from gnuradio import gr, gr_unittest, blks2 -from gnuradio.utils import mod_codes - -tested_mod_codes = (mod_codes.NO_CODE, mod_codes.GRAY_CODE) - -# A list of the constellations to test. -# Each constellation is given by a 3-tuple. -# First item is a function to generate the constellation -# Second item is a dictionary of arguments for function with lists of -# possible values. -# Third item is whether differential encoding should be tested. -# Fourth item is the name of the argument to constructor that specifices -# whether differential encoding is used. - -def twod_constell(): - """ - - """ - points = ((1+0j), (0+1j), - (-1+0j), (0-1j)) - rot_sym = 2 - dim = 2 - return gr.constellation_calcdist(points, [], rot_sym, dim) - -def threed_constell(): - oned_points = ((1+0j), (0+1j), (-1+0j), (0-1j)) - points = [] - r4 = range(0, 4) - for ia in r4: - for ib in r4: - for ic in r4: - points += [oned_points[ia], oned_points[ib], oned_points[ic]] - rot_sym = 4 - dim = 3 - return gr.constellation_calcdist(points, [], rot_sym, dim) - -tested_constellation_info = ( - (blks2.psk_constellation, - {'m': (2, 4, 8, 16, 32, 64), - 'mod_code': tested_mod_codes, }, - True, None), - (blks2.qam_constellation, - {'constellation_points': (4, 16, 64), - 'mod_code': tested_mod_codes, }, - True, 'differential'), - (blks2.bpsk_constellation, {}, True, None), - # No differential testing for qpsk because it is gray-coded. - # This is because soft decision making is simpler if we can assume - # gray coding. - (blks2.qpsk_constellation, {}, False, None), - (twod_constell, {}, True, None), - (threed_constell, {}, True, None), - ) - -def tested_constellations(): - """ - Generator to produce (constellation, differential) tuples for testing purposes. - """ - for constructor, poss_args, differential, diff_argname in tested_constellation_info: - if differential: - diff_poss = (True, False) - else: - diff_poss = (False,) - poss_args = [[argname, argvalues, 0] for argname, argvalues in poss_args.items()] - for current_diff in diff_poss: - # Add an index into args to keep track of current position in argvalues - while True: - current_args = dict([(argname, argvalues[argindex]) - for argname, argvalues, argindex in poss_args]) - if diff_argname is not None: - current_args[diff_argname] = current_diff - constellation = constructor(**current_args) - yield (constellation, current_diff) - for this_poss_arg in poss_args: - argname, argvalues, argindex = this_poss_arg - if argindex < len(argvalues) - 1: - this_poss_arg[2] += 1 - break - else: - this_poss_arg[2] = 0 - if sum([argindex for argname, argvalues, argindex in poss_args]) == 0: - break - - -class test_constellation (gr_unittest.TestCase): - - src_length = 256 - - def setUp(self): - # Generate a list of random bits. - self.src_data = tuple([random.randint(0,1) for i in range(0, self.src_length)]) - - def tearDown(self): - pass - - def test_hard_decision(self): - for constellation, differential in tested_constellations(): - if differential: - rs = constellation.rotational_symmetry() - rotations = [exp(i*2*pi*(0+1j)/rs) for i in range(0, rs)] - else: - rotations = [None] - for rotation in rotations: - src = gr.vector_source_b(self.src_data) - content = mod_demod(constellation, differential, rotation) - dst = gr.vector_sink_b() - self.tb = gr.top_block() - self.tb.connect(src, content, dst) - self.tb.run() - data = dst.data() - # Don't worry about cut off data for now. - first = constellation.bits_per_symbol() - self.assertEqual (self.src_data[first:len(data)], data[first:]) - - -class mod_demod(gr.hier_block2): - def __init__(self, constellation, differential, rotation): - if constellation.arity() > 256: - # If this becomes limiting some of the blocks should be generalised so that they can work - # with shorts and ints as well as chars. - raise ValueError("Constellation cannot contain more than 256 points.") - - gr.hier_block2.__init__(self, "mod_demod", - gr.io_signature(1, 1, gr.sizeof_char), # Input signature - gr.io_signature(1, 1, gr.sizeof_char)) # Output signature - - arity = constellation.arity() - - # TX - self.constellation = constellation - self.differential = differential - self.blocks = [self] - # We expect a stream of unpacked bits. - # First step is to pack them. - self.blocks.append( - gr.unpacked_to_packed_bb(1, gr.GR_MSB_FIRST)) - # Second step we unpack them such that we have k bits in each byte where - # each constellation symbol hold k bits. - self.blocks.append( - gr.packed_to_unpacked_bb(self.constellation.bits_per_symbol(), - gr.GR_MSB_FIRST)) - # Apply any pre-differential coding - # Gray-coding is done here if we're also using differential coding. - if self.constellation.apply_pre_diff_code(): - self.blocks.append(gr.map_bb(self.constellation.pre_diff_code())) - # Differential encoding. - if self.differential: - self.blocks.append(gr.diff_encoder_bb(arity)) - # Convert to constellation symbols. - self.blocks.append(gr.chunks_to_symbols_bc(self.constellation.points(), self.constellation.dimensionality())) - # CHANNEL - # Channel just consists of a rotation to check differential coding. - if rotation is not None: - self.blocks.append(gr.multiply_const_cc(rotation)) - - # RX - # Convert the constellation symbols back to binary values. - self.blocks.append(gr.constellation_decoder2_cb(self.constellation.base())) - # Differential decoding. - if self.differential: - self.blocks.append(gr.diff_decoder_bb(arity)) - # Decode any pre-differential coding. - if self.constellation.apply_pre_diff_code(): - self.blocks.append(gr.map_bb( - mod_codes.invert_code(self.constellation.pre_diff_code()))) - # unpack the k bit vector into a stream of bits - self.blocks.append(gr.unpack_k_bits_bb( - self.constellation.bits_per_symbol())) - # connect to block output - check_index = len(self.blocks) - self.blocks = self.blocks[:check_index] - self.blocks.append(self) - - self.connect(*self.blocks) - - -if __name__ == '__main__': - gr_unittest.run(test_constellation, "test_constellation.xml") diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_constellation_receiver.py b/gnuradio-core/src/python/gnuradio/gr/qa_constellation_receiver.py deleted file mode 100644 index 544c84cd4..000000000 --- a/gnuradio-core/src/python/gnuradio/gr/qa_constellation_receiver.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -import random - -from gnuradio import gr, blks2, packet_utils, gr_unittest -from gnuradio.utils import mod_codes, alignment - -from qa_constellation import tested_constellations, twod_constell - -# Set a seed so that if errors turn up they are reproducible. -# 1234 fails -random.seed(1239) - -# TESTING PARAMETERS -# The number of symbols to test with. -# We need this many to let the frequency recovery block converge. -DATA_LENGTH = 200000 -# Test fails if fraction of output that is correct is less than this. -REQ_CORRECT = 0.8 - -# CHANNEL PARAMETERS -NOISE_VOLTAGE = 0.01 -FREQUENCY_OFFSET = 0.01 -TIMING_OFFSET = 1.0 - -# RECEIVER PARAMETERS -# Increased from normal default of 0.01 to speed things up. -FREQ_ALPHA = 0.02 -# Decreased from normal default of 0.1 is required for the constellations -# with smaller point separations. -PHASE_ALPHA = 0.02 - - -class test_constellation_receiver (gr_unittest.TestCase): - - # We ignore the first half of the output data since often it takes - # a while for the receiver to lock on. - ignore_fraction = 0.8 - seed = 1234 - max_data_length = DATA_LENGTH * 6 - max_num_samples = 1000 - - def test_basic(self): - """ - Tests a bunch of different constellations by using generic - modulation, a channel, and generic demodulation. The generic - demodulation uses constellation_receiver which is what - we're really trying to test. - """ - # Assumes not more than 64 points in a constellation - # Generates some random input data to use. - self.src_data = tuple( - [random.randint(0,1) for i in range(0, self.max_data_length)]) - # Generates some random indices to use for comparing input and - # output data (a full comparison is too slow in python). - self.indices = alignment.random_sample( - self.max_data_length, self.max_num_samples, self.seed) - - for constellation, differential in tested_constellations(): - # The constellation_receiver doesn't work for constellations - # of multple dimensions (i.e. multiple complex numbers to a - # single symbol). - # That is not implemented since the receiver has no way of - # knowing where the beginning of a symbol is. - # It also doesn't work for non-differential modulation. - if constellation.dimensionality() != 1 or not differential: - continue - data_length = DATA_LENGTH * constellation.bits_per_symbol() - tb = rec_test_tb(constellation, differential, - src_data=self.src_data[:data_length]) - tb.run() - data = tb.dst.data() - d1 = tb.src_data[:int(len(tb.src_data)*self.ignore_fraction)] - d2 = data[:int(len(data)*self.ignore_fraction)] - correct, overlap, offset, indices = alignment.align_sequences( - d1, d2, indices=self.indices) - self.assertTrue(correct > REQ_CORRECT) - - -class rec_test_tb (gr.top_block): - """ - Takes a constellation an runs a generic modulation, channel, - and generic demodulation. - """ - def __init__(self, constellation, differential, - data_length=None, src_data=None): - """ - constellation -- a constellation object - differential -- whether differential encoding is used - data_length -- the number of bits of data to use - src_data -- a list of the bits to use - """ - super(rec_test_tb, self).__init__() - # Transmission Blocks - if src_data is None: - self.src_data = tuple([random.randint(0,1) for i in range(0, data_length)]) - else: - self.src_data = src_data - packer = gr.unpacked_to_packed_bb(1, gr.GR_MSB_FIRST) - src = gr.vector_source_b(self.src_data) - mod = blks2.generic_mod(constellation, differential=differential) - # Channel - channel = gr.channel_model(NOISE_VOLTAGE, FREQUENCY_OFFSET, TIMING_OFFSET) - # Receiver Blocks - demod = blks2.generic_demod(constellation, differential=differential, - freq_alpha=FREQ_ALPHA, - phase_alpha=PHASE_ALPHA) - self.dst = gr.vector_sink_b() - self.connect(src, packer, mod, channel, demod, self.dst) - -if __name__ == '__main__': - gr_unittest.run(test_constellation_receiver, "test_constellation_receiver.xml") |