[fix](trx-rs): normalize FT2 bitmetrics before LDPC
This commit is contained in:
@@ -763,29 +763,30 @@ static bool ft2_extract_bitmetrics_raw(const float complex* signal, float bitmet
|
|||||||
bitmetrics[i][1] = metric2[i];
|
bitmetrics[i][1] = metric2[i];
|
||||||
bitmetrics[i][2] = metric4[i];
|
bitmetrics[i][2] = metric4[i];
|
||||||
}
|
}
|
||||||
|
for (int metric = 0; metric < 3; ++metric)
|
||||||
|
{
|
||||||
|
float sum = 0.0f;
|
||||||
|
float sum2 = 0.0f;
|
||||||
|
for (int i = 0; i < 2 * FT2_FRAME_SYMBOLS; ++i)
|
||||||
|
{
|
||||||
|
float v = bitmetrics[i][metric];
|
||||||
|
sum += v;
|
||||||
|
sum2 += v * v;
|
||||||
|
}
|
||||||
|
float mean = sum / (2 * FT2_FRAME_SYMBOLS);
|
||||||
|
float variance = (sum2 / (2 * FT2_FRAME_SYMBOLS)) - (mean * mean);
|
||||||
|
float sigma = (variance > 0.0f) ? sqrtf(variance) : sqrtf(fmaxf(sum2 / (2 * FT2_FRAME_SYMBOLS), 0.0f));
|
||||||
|
if (sigma > 1.0e-6f)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 2 * FT2_FRAME_SYMBOLS; ++i)
|
||||||
|
{
|
||||||
|
bitmetrics[i][metric] /= sigma;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ft2_normalize_logl(float* log174)
|
|
||||||
{
|
|
||||||
float sum = 0.0f;
|
|
||||||
float sum2 = 0.0f;
|
|
||||||
for (int i = 0; i < FTX_LDPC_N; ++i)
|
|
||||||
{
|
|
||||||
sum += log174[i];
|
|
||||||
sum2 += log174[i] * log174[i];
|
|
||||||
}
|
|
||||||
float inv_n = 1.0f / FTX_LDPC_N;
|
|
||||||
float variance = (sum2 - (sum * sum * inv_n)) * inv_n;
|
|
||||||
if (variance <= 1.0e-6f)
|
|
||||||
return;
|
|
||||||
float norm_factor = sqrtf(24.0f / variance);
|
|
||||||
for (int i = 0; i < FTX_LDPC_N; ++i)
|
|
||||||
{
|
|
||||||
log174[i] *= norm_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ft2_pack_bits(const uint8_t bit_array[], int num_bits, uint8_t packed[])
|
static void ft2_pack_bits(const uint8_t bit_array[], int num_bits, uint8_t packed[])
|
||||||
{
|
{
|
||||||
int num_bytes = (num_bits + 7) / 8;
|
int num_bytes = (num_bits + 7) / 8;
|
||||||
@@ -977,7 +978,6 @@ static bool ft2_decode_hit(
|
|||||||
{
|
{
|
||||||
float log174[FTX_LDPC_N];
|
float log174[FTX_LDPC_N];
|
||||||
memcpy(log174, llr_passes[pass], sizeof(log174));
|
memcpy(log174, llr_passes[pass], sizeof(log174));
|
||||||
ft2_normalize_logl(log174);
|
|
||||||
int ldpc_errors = 0;
|
int ldpc_errors = 0;
|
||||||
bp_decode(log174, 50, plain174, &ldpc_errors);
|
bp_decode(log174, 50, plain174, &ldpc_errors);
|
||||||
if (ldpc_errors > 0)
|
if (ldpc_errors > 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user