diff options
author | David Pi <david.pinho@gmail.com> | 2021-07-17 13:25:03 +0100 |
---|---|---|
committer | mormj <34754695+mormj@users.noreply.github.com> | 2021-09-07 09:58:26 -0400 |
commit | 0a4225dc9dd9e4d3c5ad58d40570d40d59f5670f (patch) | |
tree | 5c426ddd4217b38caf81592ed9fe4656aa0fa25e /gr-digital/lib | |
parent | 3eb08389106e29354ba3de4827c632373664f909 (diff) |
gr-digital: Fix constellation normalization by average power
Correct power normalization calculation.
Add a qa test for amplitude and power normalization.
Signed-off-by: David Pi <david.pinho@gmail.com>
Diffstat (limited to 'gr-digital/lib')
-rw-r--r-- | gr-digital/lib/constellation.cc | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/gr-digital/lib/constellation.cc b/gr-digital/lib/constellation.cc index 82c53e91a9..609b4546b8 100644 --- a/gr-digital/lib/constellation.cc +++ b/gr-digital/lib/constellation.cc @@ -45,25 +45,26 @@ constellation::constellation(std::vector<gr_complex> constell, d_lut_scale(0) { unsigned int constsize = d_constellation.size(); - float summed_mag = 0; switch (normalization) { - case NO_NORMALIZATION: + case NO_NORMALIZATION: { break; - - case POWER_NORMALIZATION: + } + case POWER_NORMALIZATION: { // Scale constellation points so that average power is 1. + float summed_power = 0; for (unsigned int i = 0; i < constsize; i++) { gr_complex c = d_constellation[i]; - summed_mag += std::norm(c); + summed_power += std::norm(c); } - d_scalefactor = constsize / sqrt(summed_mag); + d_scalefactor = sqrt(constsize / summed_power); for (unsigned int i = 0; i < constsize; i++) { d_constellation[i] = d_constellation[i] * d_scalefactor; } break; - - case AMPLITUDE_NORMALIZATION: + } + case AMPLITUDE_NORMALIZATION: { // 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 += std::abs(c); @@ -73,7 +74,7 @@ constellation::constellation(std::vector<gr_complex> constell, d_constellation[i] = d_constellation[i] * d_scalefactor; } break; - + } default: throw std::runtime_error("Invalid constellation normalization type."); } @@ -131,14 +132,10 @@ float constellation::get_distance(unsigned int index, const gr_complex* sample) unsigned int constellation::get_closest_point(const gr_complex* sample) { + float min_euclid_dist = get_distance(0, sample); unsigned int min_index = 0; - float min_euclid_dist; - float euclid_dist; - - min_euclid_dist = get_distance(0, sample); - min_index = 0; for (unsigned int j = 1; j < d_arity; j++) { - euclid_dist = get_distance(j, sample); + float euclid_dist = get_distance(j, sample); if (euclid_dist < min_euclid_dist) { min_euclid_dist = euclid_dist; min_index = j; |