enhance llr unitary tests

This commit is contained in:
Laurent THOMAS
2025-07-24 13:48:36 +02:00
parent f57f6a8d4e
commit 3264eca6db
2 changed files with 44 additions and 53 deletions
+43 -52
View File
@@ -48,12 +48,11 @@ void exit_function(const char *file, const char *function, const int line, const
#include "openair1/PHY/TOOLS/phy_test_tools.hpp" #include "openair1/PHY/TOOLS/phy_test_tools.hpp"
#include <random> #include <random>
int16_t saturating_sub(int16_t a, int16_t b) int16_t saturating_sub(int a, int b)
{ {
int32_t result = (int32_t)a - (int32_t)b; int result = a - abs(b);
if (result < -INT16_MAX) {
if (result < INT16_MIN) { return -INT16_MAX;
return INT16_MIN;
} else if (result > INT16_MAX) { } else if (result > INT16_MAX) {
return INT16_MAX; return INT16_MAX;
} else { } else {
@@ -71,8 +70,8 @@ void nr_16qam_llr_ref(c16_t *rxdataF_comp, int32_t *ch_mag, int16_t *llr, uint32
int16_t mag_imag = ch_mag_i16[2 * i + 1]; int16_t mag_imag = ch_mag_i16[2 * i + 1];
llr[4 * i] = real; llr[4 * i] = real;
llr[4 * i + 1] = imag; llr[4 * i + 1] = imag;
llr[4 * i + 2] = saturating_sub(mag_real, std::abs(real)); llr[4 * i + 2] = saturating_sub(mag_real, real);
llr[4 * i + 3] = saturating_sub(mag_imag, std::abs(imag)); llr[4 * i + 3] = saturating_sub(mag_imag, imag);
} }
} }
@@ -91,12 +90,12 @@ void nr_64qam_llr_ref(c16_t *rxdataF_comp,
int16_t mag_imag = ch_mag_i16[2 * i + 1]; int16_t mag_imag = ch_mag_i16[2 * i + 1];
llr[6 * i] = real; llr[6 * i] = real;
llr[6 * i + 1] = imag; llr[6 * i + 1] = imag;
llr[6 * i + 2] = saturating_sub(mag_real, std::abs(real)); llr[6 * i + 2] = saturating_sub(mag_real, real);
llr[6 * i + 3] = saturating_sub(mag_imag, std::abs(imag)); llr[6 * i + 3] = saturating_sub(mag_imag, imag);
int16_t mag_realb = ch_magb_i16[2 * i]; int16_t mag_realb = ch_magb_i16[2 * i];
int16_t mag_imagb = ch_magb_i16[2 * i + 1]; int16_t mag_imagb = ch_magb_i16[2 * i + 1];
llr[6 * i + 4] = saturating_sub(mag_realb, std::abs(llr[6 * i + 2])); llr[6 * i + 4] = saturating_sub(mag_realb, llr[6 * i + 2]);
llr[6 * i + 5] = saturating_sub(mag_imagb, std::abs(llr[6 * i + 3])); llr[6 * i + 5] = saturating_sub(mag_imagb, llr[6 * i + 3]);
} }
} }
@@ -117,16 +116,16 @@ void nr_256qam_llr_ref(c16_t *rxdataF_comp,
int16_t mag_imag = ch_mag_i16[2 * i + 1]; int16_t mag_imag = ch_mag_i16[2 * i + 1];
llr[8 * i] = real; llr[8 * i] = real;
llr[8 * i + 1] = imag; llr[8 * i + 1] = imag;
llr[8 * i + 2] = saturating_sub(mag_real, std::abs(real)); llr[8 * i + 2] = saturating_sub(mag_real, real);
llr[8 * i + 3] = saturating_sub(mag_imag, std::abs(imag)); llr[8 * i + 3] = saturating_sub(mag_imag, imag);
int16_t magb_real = ch_magb_i16[2 * i]; int16_t magb_real = ch_magb_i16[2 * i];
int16_t magb_imag = ch_magb_i16[2 * i + 1]; int16_t magb_imag = ch_magb_i16[2 * i + 1];
llr[8 * i + 4] = saturating_sub(magb_real, std::abs(llr[8 * i + 2])); llr[8 * i + 4] = saturating_sub(magb_real, llr[8 * i + 2]);
llr[8 * i + 5] = saturating_sub(magb_imag, std::abs(llr[8 * i + 3])); llr[8 * i + 5] = saturating_sub(magb_imag, llr[8 * i + 3]);
int16_t magc_real = ch_magc_i16[2 * i]; int16_t magc_real = ch_magc_i16[2 * i];
int16_t magc_imag = ch_magc_i16[2 * i + 1]; int16_t magc_imag = ch_magc_i16[2 * i + 1];
llr[8 * i + 6] = saturating_sub(magc_real, std::abs(llr[8 * i + 4])); llr[8 * i + 6] = saturating_sub(magc_real, llr[8 * i + 4]);
llr[8 * i + 7] = saturating_sub(magc_imag, std::abs(llr[8 * i + 5])); llr[8 * i + 7] = saturating_sub(magc_imag, llr[8 * i + 5]);
} }
} }
@@ -136,23 +135,21 @@ void test_function_16_qam(AlignedVector512<uint32_t> nb_res)
uint32_t nb_re = nb_res[i]; uint32_t nb_re = nb_res[i];
auto rf_data = generate_random_c16(nb_re); auto rf_data = generate_random_c16(nb_re);
auto magnitude_data = generate_random_uint16(nb_re * 2); auto magnitude_data = generate_random_uint16(nb_re * 2);
AlignedVector512<uint64_t> llr_ref; AlignedVector512<int16_t> llr_ref;
llr_ref.resize(nb_re); llr_ref.resize(nb_re * 4);
std::fill(llr_ref.begin(), llr_ref.end(), 0); std::fill(llr_ref.begin(), llr_ref.end(), 0);
nr_16qam_llr_ref((c16_t *)rf_data.data(), (int32_t *)magnitude_data.data(), (int16_t *)llr_ref.data(), nb_re); nr_16qam_llr_ref((c16_t *)rf_data.data(), (int32_t *)magnitude_data.data(), (int16_t *)llr_ref.data(), nb_re);
AlignedVector512<uint64_t> llr; AlignedVector512<int16_t> llr;
llr.resize(nb_re); llr.resize(nb_re * 4);
std::fill(llr.begin(), llr.end(), 0); std::fill(llr.begin(), llr.end(), 0);
nr_16qam_llr((int32_t *)rf_data.data(), (int32_t *)magnitude_data.data(), (int16_t *)llr.data(), nb_re); nr_16qam_llr((int32_t *)rf_data.data(), (int32_t *)magnitude_data.data(), (int16_t *)llr.data(), nb_re);
int num_errors = 0; int num_errors = 0;
for (auto i = 0U; i < nb_re; i++) { for (auto i = 0U; i < llr_ref.size(); i++) {
EXPECT_EQ(llr_ref[i], llr[i]) EXPECT_LE(llr_ref[i] - llr[i] ? (llr_ref[i] - llr[i]) / (float)llr[i] : 0, 0.001)
<< "Mismatch 16qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i; << "Mismatch 16qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i
if (llr_ref[i] != llr[i]) { << "total err: " << ++num_errors;
num_errors++;
}
} }
EXPECT_EQ(num_errors, 0) << " Errors during testing 16qam llr " << num_errors << " nb res " << nb_re; EXPECT_EQ(num_errors, 0) << " Errors during testing 16qam llr " << num_errors << " nb res " << nb_re;
} }
@@ -165,8 +162,8 @@ void test_function_64_qam(AlignedVector512<uint32_t> nb_res)
auto rf_data = generate_random_c16(nb_re); auto rf_data = generate_random_c16(nb_re);
auto magnitude_data = generate_random_uint16(nb_re * 2); auto magnitude_data = generate_random_uint16(nb_re * 2);
auto magnitude_b_data = generate_random_uint16(nb_re * 2); auto magnitude_b_data = generate_random_uint16(nb_re * 2);
AlignedVector512<uint32_t> llr_ref; AlignedVector512<int16_t> llr_ref;
llr_ref.resize(nb_re * 3); llr_ref.resize(nb_re * 6);
std::fill(llr_ref.begin(), llr_ref.end(), 0); std::fill(llr_ref.begin(), llr_ref.end(), 0);
nr_64qam_llr_ref((c16_t *)rf_data.data(), nr_64qam_llr_ref((c16_t *)rf_data.data(),
(int32_t *)magnitude_data.data(), (int32_t *)magnitude_data.data(),
@@ -174,8 +171,8 @@ void test_function_64_qam(AlignedVector512<uint32_t> nb_res)
(int16_t *)llr_ref.data(), (int16_t *)llr_ref.data(),
nb_re); nb_re);
AlignedVector512<uint32_t> llr; AlignedVector512<int16_t> llr;
llr.resize(nb_re * 3); llr.resize(nb_re * 6);
std::fill(llr.begin(), llr.end(), 0); std::fill(llr.begin(), llr.end(), 0);
nr_64qam_llr((int32_t *)rf_data.data(), nr_64qam_llr((int32_t *)rf_data.data(),
(int32_t *)magnitude_data.data(), (int32_t *)magnitude_data.data(),
@@ -184,12 +181,10 @@ void test_function_64_qam(AlignedVector512<uint32_t> nb_res)
nb_re); nb_re);
int num_errors = 0; int num_errors = 0;
for (auto i = 0U; i < nb_re * 3; i++) { for (auto i = 0U; i < llr.size(); i++) {
EXPECT_EQ(llr_ref[i], llr[i]) EXPECT_LE(llr_ref[i] - llr[i] ? (llr_ref[i] - llr[i]) / (float)llr[i] : 0, 0.001)
<< "Mismatch 64qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i; << "Mismatch 64qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i
if (llr_ref[i] != llr[i]) { << "total err: " << ++num_errors;
num_errors++;
}
} }
EXPECT_EQ(num_errors, 0) << " Errors during testing 64qam llr " << num_errors << " nb res " << nb_re; EXPECT_EQ(num_errors, 0) << " Errors during testing 64qam llr " << num_errors << " nb res " << nb_re;
} }
@@ -203,8 +198,8 @@ void test_function_256_qam(AlignedVector512<uint32_t> nb_res)
auto magnitude_data = generate_random_uint16(nb_re * 2); auto magnitude_data = generate_random_uint16(nb_re * 2);
auto magnitude_b_data = generate_random_uint16(nb_re * 2); auto magnitude_b_data = generate_random_uint16(nb_re * 2);
auto magnitude_c_data = generate_random_uint16(nb_re * 2); auto magnitude_c_data = generate_random_uint16(nb_re * 2);
AlignedVector512<uint32_t> llr_ref; AlignedVector512<int16_t> llr_ref;
llr_ref.resize(nb_re * 4); llr_ref.resize(nb_re * 8);
std::fill(llr_ref.begin(), llr_ref.end(), 0); std::fill(llr_ref.begin(), llr_ref.end(), 0);
nr_256qam_llr_ref((c16_t *)rf_data.data(), nr_256qam_llr_ref((c16_t *)rf_data.data(),
(int32_t *)magnitude_data.data(), (int32_t *)magnitude_data.data(),
@@ -213,8 +208,8 @@ void test_function_256_qam(AlignedVector512<uint32_t> nb_res)
(int16_t *)llr_ref.data(), (int16_t *)llr_ref.data(),
nb_re); nb_re);
AlignedVector512<uint32_t> llr; AlignedVector512<int16_t> llr;
llr.resize(nb_re * 4); llr.resize(nb_re * 8);
std::fill(llr.begin(), llr.end(), 0); std::fill(llr.begin(), llr.end(), 0);
nr_256qam_llr((int32_t *)rf_data.data(), nr_256qam_llr((int32_t *)rf_data.data(),
(int32_t *)magnitude_data.data(), (int32_t *)magnitude_data.data(),
@@ -224,12 +219,10 @@ void test_function_256_qam(AlignedVector512<uint32_t> nb_res)
nb_re); nb_re);
int num_errors = 0; int num_errors = 0;
for (auto i = 0U; i < nb_re * 4; i++) { for (auto i = 0U; i < llr.size(); i++) {
EXPECT_EQ(llr_ref[i], llr[i]) EXPECT_LE(llr_ref[i] - llr[i] ? (llr_ref[i] - llr[i]) / (float)llr[i] : 0, 0.001)
<< "Mismatch 256qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i; << "Mismatch 256qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i
if (llr_ref[i] != llr[i]) { << "total err: " << ++num_errors;
num_errors++;
}
} }
EXPECT_EQ(num_errors, 0) << " Errors during testing 256qam llr " << num_errors << " nb res " << nb_re; EXPECT_EQ(num_errors, 0) << " Errors during testing 256qam llr " << num_errors << " nb res " << nb_re;
} }
@@ -401,11 +394,9 @@ TEST(test_llr, check_2_res_256_qam)
int num_errors = 0; int num_errors = 0;
for (auto i = 0U; i < 2 * 8; i++) { for (auto i = 0U; i < 2 * 8; i++) {
EXPECT_EQ(llr_ref[i], llr[i]) EXPECT_LE(llr_ref[i] - llr[i] ? (llr_ref[i] - llr[i]) / (float)llr[i] : 0, 0.001)
<< "Mismatch 256qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i; << "Mismatch 256qam REF " << std::hex << llr_ref[i] << " != DUT " << llr[i] << " at " << std::dec << i
if (llr_ref[i] != llr[i]) { << "total err: " << ++num_errors;
num_errors++;
}
} }
EXPECT_EQ(num_errors, 0) << " Errors during testing 256qam llr " << num_errors << " nb res " << 2; EXPECT_EQ(num_errors, 0) << " Errors during testing 256qam llr " << num_errors << " nb res " << 2;
} }
+1 -1
View File
@@ -81,7 +81,7 @@ AlignedVector512<c16_t> generate_random_c16(size_t num)
{ {
std::random_device rd; std::random_device rd;
std::mt19937 rng(rd()); std::mt19937 rng(rd());
std::uniform_int_distribution<int16_t> dist(INT16_MIN, INT16_MAX); std::uniform_int_distribution<int16_t> dist(-INT16_MAX, INT16_MAX);
AlignedVector512<c16_t> vec; AlignedVector512<c16_t> vec;
vec.resize(num); vec.resize(num);
auto gen = [&]() { return (c16_t){dist(rng), dist(rng)}; }; auto gen = [&]() { return (c16_t){dist(rng), dist(rng)}; };