summaryrefslogtreecommitdiff
path: root/gr-digital/lib
diff options
context:
space:
mode:
authorDavid Pi <david.pinho@gmail.com>2021-07-17 13:25:03 +0100
committermormj <34754695+mormj@users.noreply.github.com>2021-09-07 09:58:26 -0400
commit0a4225dc9dd9e4d3c5ad58d40570d40d59f5670f (patch)
tree5c426ddd4217b38caf81592ed9fe4656aa0fa25e /gr-digital/lib
parent3eb08389106e29354ba3de4827c632373664f909 (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.cc27
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;