diff options
-rw-r--r-- | gr-digital/include/gnuradio/digital/constellation.h | 10 | ||||
-rw-r--r-- | gr-digital/lib/constellation.cc | 33 |
2 files changed, 26 insertions, 17 deletions
diff --git a/gr-digital/include/gnuradio/digital/constellation.h b/gr-digital/include/gnuradio/digital/constellation.h index 8ccd576eda..0a90d7e8d3 100644 --- a/gr-digital/include/gnuradio/digital/constellation.h +++ b/gr-digital/include/gnuradio/digital/constellation.h @@ -66,7 +66,8 @@ namespace gr { constellation(std::vector<gr_complex> constell, std::vector<int> pre_diff_code, unsigned int rotational_symmetry, - unsigned int dimensionality); + unsigned int dimensionality, + bool normalize_points=true); constellation(); virtual ~constellation(); @@ -253,11 +254,13 @@ namespace gr { * coding) (order of list matches constell) * \param rotational_symmetry Number of rotations around unit circle that have the same representation. * \param dimensionality Number of dimensions to the constellation. + * \param normalize_points Normalize constellation points to mean(abs(points))=1 (default is true) */ static sptr make(std::vector<gr_complex> constell, std::vector<int> pre_diff_code, unsigned int rotational_symmetry, - unsigned int dimensionality); + unsigned int dimensionality, + bool normalize_points=true); unsigned int decision_maker(const gr_complex *sample); // void calc_metric(gr_complex *sample, float *metric, trellis_metric_type_t type); @@ -268,7 +271,8 @@ namespace gr { constellation_calcdist(std::vector<gr_complex> constell, std::vector<int> pre_diff_code, unsigned int rotational_symmetry, - unsigned int dimensionality); + unsigned int dimensionality, + bool nomalize_points=true); }; diff --git a/gr-digital/lib/constellation.cc b/gr-digital/lib/constellation.cc index cf7039b313..93fd95da8e 100644 --- a/gr-digital/lib/constellation.cc +++ b/gr-digital/lib/constellation.cc @@ -43,7 +43,8 @@ namespace gr { constellation::constellation(std::vector<gr_complex> constell, std::vector<int> pre_diff_code, unsigned int rotational_symmetry, - unsigned int dimensionality + unsigned int dimensionality, + bool normalize_points ) : d_constellation(constell), d_pre_diff_code(pre_diff_code), @@ -56,16 +57,18 @@ namespace gr { d_lut_precision(0), d_lut_scale(0) { - // Scale constellation points so that average magnitude is 1. - float summed_mag = 0; unsigned int constsize = d_constellation.size(); - for (unsigned int i=0; i<constsize; i++) { - gr_complex c = d_constellation[i]; - summed_mag += sqrt(c.real()*c.real() + c.imag()*c.imag()); - } - d_scalefactor = constsize/summed_mag; - for (unsigned int i=0; i<constsize; i++) { - d_constellation[i] = d_constellation[i]*d_scalefactor; + if (normalize_points) { + // Scale constellation points so that average magnitude is 1. + float summed_mag = 0; + for (unsigned int i=0; i<constsize; i++) { + gr_complex c = d_constellation[i]; + summed_mag += sqrt(c.real()*c.real() + c.imag()*c.imag()); + } + d_scalefactor = constsize/summed_mag; + for (unsigned int i=0; i<constsize; i++) { + d_constellation[i] = d_constellation[i]*d_scalefactor; + } } if(pre_diff_code.size() == 0) d_apply_pre_diff_code = false; @@ -406,19 +409,21 @@ namespace gr { constellation_calcdist::make(std::vector<gr_complex> constell, std::vector<int> pre_diff_code, unsigned int rotational_symmetry, - unsigned int dimensionality) + unsigned int dimensionality, + bool normalize_points) { return constellation_calcdist::sptr( new constellation_calcdist(constell, pre_diff_code, - rotational_symmetry, dimensionality)); + rotational_symmetry, dimensionality, normalize_points)); } constellation_calcdist::constellation_calcdist( std::vector<gr_complex> constell, std::vector<int> pre_diff_code, unsigned int rotational_symmetry, - unsigned int dimensionality) - : constellation(constell, pre_diff_code, rotational_symmetry, dimensionality) + unsigned int dimensionality, + bool normalize_points) + : constellation(constell, pre_diff_code, rotational_symmetry, dimensionality, normalize_points) {} // Chooses points base on shortest distance. |