From 493cd2e48eee4850f2ceef20c9dd487b93ea6b9e Mon Sep 17 00:00:00 2001 From: Ben Reynwar Date: Sat, 1 Jan 2011 15:31:55 -0700 Subject: Worked on generic demodulation. --- gnuradio-core/src/lib/general/Makefile.am | 9 +- gnuradio-core/src/lib/general/general.i | 2 + gnuradio-core/src/lib/general/gr_constellation.cc | 127 +++++++++++++++++++++ gnuradio-core/src/lib/general/gr_constellation.h | 108 ++++++++++++++++++ gnuradio-core/src/lib/general/gr_constellation.i | 62 ++++++++++ .../lib/general/gr_constellation_receiver_cb.cc | 51 ++------- .../src/lib/general/gr_constellation_receiver_cb.h | 33 +----- .../src/lib/general/gr_constellation_receiver_cb.i | 15 +-- .../python/gnuradio/blks2impl/generic_mod_demod.py | 8 +- gnuradio-core/src/python/gnuradio/blks2impl/qam.py | 49 +++----- 10 files changed, 339 insertions(+), 125 deletions(-) create mode 100644 gnuradio-core/src/lib/general/gr_constellation.cc create mode 100644 gnuradio-core/src/lib/general/gr_constellation.h create mode 100644 gnuradio-core/src/lib/general/gr_constellation.i diff --git a/gnuradio-core/src/lib/general/Makefile.am b/gnuradio-core/src/lib/general/Makefile.am index daa3c446e..861c82c28 100644 --- a/gnuradio-core/src/lib/general/Makefile.am +++ b/gnuradio-core/src/lib/general/Makefile.am @@ -53,7 +53,9 @@ libgeneral_la_SOURCES = \ gr_complex_to_xxx.cc \ gr_conjugate_cc.cc \ gr_copy.cc \ + gr_constellation.cc \ gr_constellation_decoder_cb.cc \ + gr_constellation_receiver_cb.cc \ gr_correlate_access_code_bb.cc \ gr_costas_loop_cc.cc \ gr_count_bits.cc \ @@ -100,7 +102,6 @@ libgeneral_la_SOURCES = \ gr_math.cc \ gr_misc.cc \ gr_mpsk_receiver_cc.cc \ - gr_constellation_receiver_cb.cc \ gr_nlog10_ff.cc \ gr_nop.cc \ gr_null_sink.cc \ @@ -207,7 +208,9 @@ grinclude_HEADERS = \ gr_complex_to_interleaved_short.h \ gr_complex_to_xxx.h \ gr_conjugate_cc.h \ + gr_constellation.h \ gr_constellation_decoder_cb.h \ + gr_constellation_receiver_cb.h \ gr_copy.h \ gr_correlate_access_code_bb.h \ gr_costas_loop_cc.h \ @@ -257,7 +260,6 @@ grinclude_HEADERS = \ gr_map_bb.h \ gr_math.h \ gr_misc.h \ - gr_constellation_receiver_cb.h \ gr_nco.h \ gr_nlog10_ff.h \ gr_nop.h \ @@ -378,7 +380,9 @@ swiginclude_HEADERS = \ gr_complex_to_interleaved_short.i \ gr_complex_to_xxx.i \ gr_conjugate_cc.i \ + gr_constellation.i \ gr_constellation_decoder_cb.i \ + gr_constellation_receiver_cb.i \ gr_copy.i \ gr_correlate_access_code_bb.i \ gr_costas_loop_cc.i \ @@ -419,7 +423,6 @@ swiginclude_HEADERS = \ gr_lms_dfe_cc.i \ gr_lms_dfe_ff.i \ gr_map_bb.i \ - gr_constellation_receiver_cb.i \ gr_nlog10_ff.i \ gr_nop.i \ gr_null_sink.i \ diff --git a/gnuradio-core/src/lib/general/general.i b/gnuradio-core/src/lib/general/general.i index f758211cc..47cc3b7fa 100644 --- a/gnuradio-core/src/lib/general/general.i +++ b/gnuradio-core/src/lib/general/general.i @@ -70,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -192,6 +193,7 @@ %include "gr_throttle.i" %include "gr_mpsk_receiver_cc.i" %include "gr_constellation_receiver_cb.i" +%include "gr_constellation.i" %include "gr_stream_mux.i" %include "gr_stream_to_streams.i" %include "gr_streams_to_stream.i" diff --git a/gnuradio-core/src/lib/general/gr_constellation.cc b/gnuradio-core/src/lib/general/gr_constellation.cc new file mode 100644 index 000000000..03589dee8 --- /dev/null +++ b/gnuradio-core/src/lib/general/gr_constellation.cc @@ -0,0 +1,127 @@ +/* -*- c++ -*- */ +/* + * Copyright 2010 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. + */ + +#include +#include +#include +#include + +gr_constellation_sptr +gr_make_constellation(std::vector constellation) +{ + return gr_constellation_sptr(new gr_constellation (constellation)); + } + +// Base Constellation Class + +gr_constellation::gr_constellation (std::vector constellation) { + d_constellation = constellation; +} + + +unsigned int get_closest_point(std::vector constellation, gr_complex sample) { + + unsigned int table_size = constellation.size(); + unsigned int min_index = 0; + float min_euclid_dist; + float euclid_dist; + + min_euclid_dist = norm(sample - constellation[0]); + min_index = 0; + for (unsigned int j = 1; j < table_size; j++){ + euclid_dist = norm(sample - constellation[j]); + if (euclid_dist < min_euclid_dist){ + min_euclid_dist = euclid_dist; + min_index = j; + } + } + return min_index; +} + +// Chooses points base on shortest distance. +// Inefficient. +unsigned int gr_constellation::decision_maker(gr_complex sample) +{ + unsigned int min_index; + min_index = get_closest_point(d_constellation, sample); + return min_index; +} + +gr_constellation_sector_sptr +gr_make_constellation_sector(std::vector constellation, + unsigned int real_sectors, unsigned int imag_sectors, + float width_real_sectors, float width_imag_sectors) +{ + return gr_constellation_sector_sptr(new gr_constellation_sector (constellation, real_sectors, imag_sectors, width_real_sectors, width_imag_sectors)); + } + +gr_constellation_sector::gr_constellation_sector (std::vector constellation, + unsigned int real_sectors, unsigned int imag_sectors, + float width_real_sectors, float width_imag_sectors) : + gr_constellation(constellation), + n_sectors(real_sectors * imag_sectors), + n_real_sectors(real_sectors), n_imag_sectors(imag_sectors), + d_width_real_sectors(width_real_sectors), d_width_imag_sectors(width_imag_sectors) +{ + find_sector_values(); +} + +unsigned int gr_constellation_sector::decision_maker (gr_complex sample) { + unsigned int sector; + sector = get_sector(sample); + return sector_values[sector]; +} + +unsigned int gr_constellation_sector::get_sector (gr_complex sample) { + int real_sector, imag_sector; + unsigned int sector; + real_sector = int(real(sample)/d_width_real_sectors + n_real_sectors/2.0); + if (real_sector < 0) real_sector = 0; + if (real_sector >= n_real_sectors) real_sector = n_real_sectors-1; + imag_sector = int(imag(sample)/d_width_imag_sectors + n_imag_sectors/2.0); + if (imag_sector < 0) imag_sector = 0; + if (imag_sector >= n_imag_sectors) imag_sector = n_imag_sectors-1; + sector = real_sector * n_imag_sectors + imag_sector; + return sector; +} + +unsigned int gr_constellation_sector::calc_sector_value (unsigned int sector) { + unsigned int real_sector, imag_sector; + gr_complex sector_center; + unsigned int closest_point; + real_sector = float(sector)/n_imag_sectors; + imag_sector = sector - real_sector * n_imag_sectors; + sector_center = gr_complex((real_sector + 0.5 - n_real_sectors/2.0) * d_width_real_sectors, + (imag_sector + 0.5 - n_imag_sectors/2.0) * d_width_imag_sectors); + closest_point = get_closest_point(d_constellation, sector_center); + return closest_point; +} + + +void gr_constellation_sector::find_sector_values () { + unsigned int i; + sector_values.clear(); + for (i=0; i +#include +#include +#include + +class gr_constellation; +typedef boost::shared_ptr gr_constellation_sptr; + +// public constructor +gr_constellation_sptr + gr_make_constellation (std::vector constellation); + +class gr_constellation : public boost::enable_shared_from_this +{ + public: + + gr_constellation (std::vector constellation); + + //! Returns the set of points in this constellation. + std::vector points() { return d_constellation;} + + //! Returns the constellation point that matches best. + //! Also calculates the phase error. + virtual unsigned int decision_maker (gr_complex sample); + + unsigned int bits_per_symbol () { + return floor(log(d_constellation.size())/log(2)); + } + + gr_constellation_sptr base() { + return shared_from_this(); + } + + protected: + + std::vector d_constellation; + + private: + friend gr_constellation_sptr + gr_make_constellation (std::vector constellation); +}; + +class gr_constellation_sector; +typedef boost::shared_ptr gr_constellation_sector_sptr; + +// public constructor +gr_constellation_sector_sptr +gr_make_constellation_sector (std::vector constellation, unsigned int real_sectors, unsigned int imag_sectors, + float width_real_sectors, float width_imag_sectors); + +class gr_constellation_sector : public gr_constellation +{ + public: + + gr_constellation_sector (std::vector constellation, unsigned int real_sectors, unsigned int imag_sectors, + float width_real_sectors, float width_imag_sectors); + + unsigned int decision_maker (gr_complex sample); + + protected: + + virtual unsigned int get_sector (gr_complex sample); + + virtual unsigned int calc_sector_value (unsigned int sector); + + void find_sector_values (); + + private: + + std::vector sector_values; + unsigned int n_sectors; + unsigned int n_real_sectors; + unsigned int n_imag_sectors; + float d_width_real_sectors; + float d_width_imag_sectors; + + friend gr_constellation_sector_sptr + gr_make_constellation_sector (std::vector constellation, unsigned int real_sectors, unsigned int imag_sectors, + float width_real_sectors, float width_imag_sectors); + +}; + +#endif diff --git a/gnuradio-core/src/lib/general/gr_constellation.i b/gnuradio-core/src/lib/general/gr_constellation.i new file mode 100644 index 000000000..bdc5436f2 --- /dev/null +++ b/gnuradio-core/src/lib/general/gr_constellation.i @@ -0,0 +1,62 @@ +/* -*- c++ -*- */ +/* + * Copyright 2010 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. + */ + +%template(gr_complex_vector) std::vector; +%template(unsigned_int_vector) std::vector; + +class gr_constellation; +typedef boost::shared_ptr gr_constellation_sptr; +%template(gr_constellation_sptr) boost::shared_ptr; +%rename(constellation) gr_make_constellation; +gr_constellation_sptr gr_make_constellation(std::vector constellation); +%ignore gr_constellation; + +class gr_constellation +{ +public: + gr_constellation (std::vector constellation); + std::vector points(); + unsigned int decision_maker (gr_complex sample); + unsigned int bits_per_symbol (); + gr_constellation_sptr base (); +}; + +class gr_constellation_sector; +typedef boost::shared_ptr gr_constellation_sector_sptr; +%template(gr_constellation_sector_sptr) boost::shared_ptr; +%rename(constellation_sector) gr_make_constellation_sector; +gr_constellation_sector_sptr gr_make_constellation_sector(std::vector constellation_sector, + unsigned int real_sectors, unsigned int imag_sectors, + float width_real_sectors, float width_imag_sectors); +%ignore gr_constellation_sector; + +class gr_constellation_sector : public gr_constellation +{ +public: + gr_constellation_sector (std::vector constellation, + unsigned int real_sectors, unsigned int imag_sectors, + float width_real_sectors, float width_imag_sectors); + std::vector points (); + unsigned int decision_maker (gr_complex sample); + unsigned int bits_per_symbol (); + gr_constellation_sptr base (); +}; diff --git a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc index 93af6d078..6520b66b2 100644 --- a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc +++ b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.cc @@ -26,12 +26,11 @@ #include #include +#include #include #include #include #include -// For debugging -#include #define M_TWOPI (2*M_PI) @@ -41,7 +40,7 @@ // Public constructor gr_constellation_receiver_cb_sptr -gr_make_constellation_receiver_cb(gr_constellation constell, +gr_make_constellation_receiver_cb(gr_constellation_sptr constell, float alpha, float beta, float fmin, float fmax) { @@ -49,10 +48,10 @@ gr_make_constellation_receiver_cb(gr_constellation constell, alpha, beta, fmin, fmax)); } - + static int ios[] = {sizeof(char), sizeof(float), sizeof(float), sizeof(float)}; static std::vector iosig(ios, ios+sizeof(ios)/sizeof(int)); -gr_constellation_receiver_cb::gr_constellation_receiver_cb (gr_constellation constellation, +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", @@ -61,12 +60,12 @@ gr_constellation_receiver_cb::gr_constellation_receiver_cb (gr_constellation con 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) -{} +{ +} 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 @@ -82,7 +81,7 @@ gr_constellation_receiver_cb::phase_error_tracking(float phase_error) #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.constellation()[d_current_const_point].real(), d_constellation.constellation()[d_current_const_point].imag()); + d_constellation->points()[d_current_const_point].real(), d_constellation->points()[d_current_const_point].imag()); #endif } @@ -112,9 +111,8 @@ gr_constellation_receiver_cb::general_work (int noutput_items, 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(sample); - phase_error = -arg(sample*conj(d_constellation.constellation()[sym_value])); - //std::cout << "sym_value: " << sym_value << " sample: " << sample << "phase_error: " << phase_error << std::endl; + sym_value = d_constellation->decision_maker(sample); + 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) { @@ -125,38 +123,7 @@ gr_constellation_receiver_cb::general_work (int noutput_items, i++; } - #if 0 - printf("ninput_items: %d noutput_items: %d consuming: %d returning: %d\n", - ninput_items[0], noutput_items, i, i); - #endif - consume_each(i); return i; } -// Base Constellation Class - -gr_constellation::gr_constellation (std::vector constellation) { - d_constellation = constellation; -} - -// Chooses points base on shortest distance. -// Inefficient. -unsigned int gr_constellation::decision_maker(gr_complex sample) -{ - unsigned int table_size = constellation().size(); - unsigned int min_index = 0; - float min_euclid_dist; - float euclid_dist; - - min_euclid_dist = norm(sample - constellation()[0]); - min_index = 0; - for (unsigned int j = 1; j < table_size; j++){ - euclid_dist = norm(sample - constellation()[j]); - if (euclid_dist < min_euclid_dist){ - min_euclid_dist = euclid_dist; - min_index = j; - } - } - return min_index; -} diff --git a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h index ba38bdad6..d40d77fff 100644 --- a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h +++ b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.h @@ -24,40 +24,17 @@ #define INCLUDED_GR_CONSTELLATION_RECEIVER_CB_H #include +#include #include #include #include -class gr_constellation -{ - public: - - gr_constellation (std::vector constellation); - - //! Returns the set of points in this constellation. - std::vector constellation() { return d_constellation;} - - //! Returns the constellation point that matches best. - //! Also calculates the phase error. - unsigned int decision_maker (gr_complex sample); - - unsigned int bits_per_symbol () { - return floor(log(d_constellation.size())/log(2)); - } - - private: - - std::vector d_constellation; -}; - -class gri_mmse_fir_interpolator_cc; - class gr_constellation_receiver_cb; typedef boost::shared_ptr gr_constellation_receiver_cb_sptr; // public constructor gr_constellation_receiver_cb_sptr -gr_make_constellation_receiver_cb (gr_constellation constellation, +gr_make_constellation_receiver_cb (gr_constellation_sptr constellation, float alpha, float beta, float fmin, float fmax); @@ -136,7 +113,7 @@ protected: * 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 constellation, + gr_constellation_receiver_cb (gr_constellation_sptr constellation, float alpha, float beta, float fmin, float fmax); @@ -151,7 +128,7 @@ protected: float d_freq, d_max_freq, d_min_freq; float d_phase; - gr_constellation d_constellation; + gr_constellation_sptr d_constellation; unsigned int d_current_const_point; //! delay line length. @@ -164,7 +141,7 @@ protected: unsigned int d_dl_idx; friend gr_constellation_receiver_cb_sptr - gr_make_constellation_receiver_cb (gr_constellation constell, + gr_make_constellation_receiver_cb (gr_constellation_sptr constell, float alpha, float beta, float fmin, float fmax); }; diff --git a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i index b48322f45..2298d5099 100644 --- a/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i +++ b/gnuradio-core/src/lib/general/gr_constellation_receiver_cb.i @@ -22,24 +22,13 @@ GR_SWIG_BLOCK_MAGIC(gr,constellation_receiver_cb); -%template(gr_complex_vector) std::vector; - -class gr_constellation -{ -public: - gr_constellation (std::vector constellation); - std::vector constellation(); - unsigned int decision_maker (gr_complex sample); - unsigned int bits_per_symbol (); -}; - -gr_constellation_receiver_cb_sptr gr_make_constellation_receiver_cb (gr_constellation constellation, +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 constellation, + gr_constellation_receiver_cb (gr_contellation_sptr constellation, float alpha, float beta, float fmin, float fmax); public: diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/generic_mod_demod.py b/gnuradio-core/src/python/gnuradio/blks2impl/generic_mod_demod.py index 69e11fcb0..60a3fc777 100644 --- a/gnuradio-core/src/python/gnuradio/blks2impl/generic_mod_demod.py +++ b/gnuradio-core/src/python/gnuradio/blks2impl/generic_mod_demod.py @@ -22,7 +22,7 @@ # See gnuradio-examples/python/digital for examples """ -differential BPSK modulation and demodulation. +Generic modulation and demodulation. """ from gnuradio import gr, gru, modulation_utils2 @@ -79,7 +79,7 @@ class generic_mod(gr.hier_block2): gr.io_signature(1, 1, gr.sizeof_char), # Input signature gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature - self._constellation = constellation + self._constellation = constellation.base() self._samples_per_symbol = samples_per_symbol self._excess_bw = excess_bw @@ -96,7 +96,7 @@ class generic_mod(gr.hier_block2): self.diffenc = gr.diff_encoder_bb(arity) - self.chunks2symbols = gr.chunks_to_symbols_bc(self._constellation.constellation()) + self.chunks2symbols = gr.chunks_to_symbols_bc(self._constellation.points()) # pulse shaping filter self.rrc_taps = gr.firdes.root_raised_cosine( @@ -208,7 +208,7 @@ class generic_demod(gr.hier_block2): gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature gr.io_signature(1, 1, gr.sizeof_char)) # Output signature - self._constellation = constellation + self._constellation = constellation.base() self._samples_per_symbol = samples_per_symbol self._excess_bw = excess_bw self._phase_alpha = phase_alpha diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/qam.py b/gnuradio-core/src/python/gnuradio/blks2impl/qam.py index 9da7ca58e..22d80503b 100644 --- a/gnuradio-core/src/python/gnuradio/blks2impl/qam.py +++ b/gnuradio-core/src/python/gnuradio/blks2impl/qam.py @@ -32,19 +32,6 @@ from gnuradio.blks2impl.generic_mod_demod import generic_mod, generic_demod # default values (used in __init__ and add_options) _def_constellation_points = 16 -_def_samples_per_symbol = 2 -_def_excess_bw = 0.35 -_def_verbose = False -_def_log = False - -# Frequency correction -_def_freq_alpha = 0.010 -# Symbol timing recovery -_def_timing_alpha = 0.100 -_def_timing_beta = 0.010 -_def_timing_max_dev = 1.5 -# Fine frequency / Phase correction -_def_phase_alpha = 0.1 def is_power_of_four(x): v = log(x)/log(4) @@ -146,11 +133,7 @@ def make_constellation(m): class qam_mod(generic_mod): - def __init__(self, constellation_points=_def_constellation_points, - samples_per_symbol=_def_samples_per_symbol, - excess_bw=_def_excess_bw, - verbose=_def_verbose, - log=_def_log): + def __init__(self, constellation_points=_def_constellation_points, *args, **kwargs): """ Hierarchical block for RRC-filtered QAM modulation. @@ -174,10 +157,13 @@ class qam_mod(generic_mod): raise ValueError("number of constellation points must be a power of four.") points = make_constellation(constellation_points) - constellation = gr.gr_constellation(points) + side = int(sqrt(constellation_points)) + assert(side * side == constellation_points) + width = 2.0/(side-1) + constellation = gr.constellation_sector(points, side, side, width, width) + #constellation = gr.constellation(points) - super(qam_mod, self).__init__(constellation, samples_per_symbol, - excess_bw, verbose, log) + super(qam_mod, self).__init__(constellation, *args, **kwargs) def add_options(parser): """ @@ -195,15 +181,7 @@ class qam_mod(generic_mod): class qam_demod(generic_demod): - def __init__(self, constellation_points=_def_constellation_points, - samples_per_symbol=_def_samples_per_symbol, - excess_bw=_def_excess_bw, - freq_alpha=_def_freq_alpha, - timing_alpha=_def_timing_alpha, - timing_max_dev=_def_timing_max_dev, - phase_alpha=_def_phase_alpha, - verbose=_def_verbose, - log=_def_log): + def __init__(self, constellation_points=_def_constellation_points, *args, **kwargs): """ Hierarchical block for RRC-filtered QAM modulation. @@ -232,12 +210,13 @@ class qam_demod(generic_demod): """ points = make_constellation(constellation_points) - constellation = gr.gr_constellation(points) + side = int(sqrt(constellation_points)) + assert(side * side == constellation_points) + width = 2.0/(side-1) + constellation = gr.constellation_sector(points, side, side, width, width) + #constellation = gr.constellation(points) - super(qam_demod, self).__init__(constellation, samples_per_symbol, - excess_bw, freq_alpha, timing_alpha, - timing_max_dev, phase_alpha, verbose, - log) + super(qam_demod, self).__init__(constellation, *args, **kwargs) def add_options(parser): """ -- cgit