summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gr-digital/include/gnuradio/digital/constellation.h10
-rw-r--r--gr-digital/lib/constellation.cc33
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.