summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.cc78
-rw-r--r--gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.h64
-rw-r--r--gnuradio-core/src/lib/general/gr_constellation_decoder2_cb.i38
-rw-r--r--gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc130
-rw-r--r--gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h149
-rw-r--r--gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i43
-rw-r--r--gnuradio-core/src/python/gnuradio/gr/qa_constellation.py203
-rw-r--r--gnuradio-core/src/python/gnuradio/gr/qa_constellation_receiver.py132
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")