Delay compensation for PUCCH2

This commit is contained in:
rmagueta
2025-01-14 11:34:22 +01:00
committed by Laurent THOMAS
parent f7d3b72851
commit 39a50faa6e
4 changed files with 150 additions and 10 deletions
+11 -1
View File
@@ -25,6 +25,8 @@
#define USE_128BIT
#endif
#define PEAK_DETECT_THRESHOLD 15
int16_t saturating_sub(int16_t a, int16_t b)
{
int32_t result = (int32_t)a - (int32_t)b;
@@ -367,20 +369,28 @@ void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates
int max_val = delay->delay_max_val;
const int sync_pos = 0;
uint64_t mean_val = 0;
for (int i = 0; i < ofdm_symbol_size; i++) {
int temp = c16amp2(ch_estimates_time[i]) >> 1;
mean_val += temp;
if (temp > max_val) {
max_pos = i;
max_val = temp;
}
}
mean_val /= ofdm_symbol_size;
if (max_pos > ofdm_symbol_size / 2)
max_pos = max_pos - ofdm_symbol_size;
delay->delay_max_pos = max_pos;
delay->delay_max_val = max_val;
delay->est_delay = max_pos - sync_pos;
// The peak in general is quite clear. It only gives a small peak when the noise is high, generally obtaining an incorrect
// estimated delay, and causing the delay compensation to worsen the result instead of improving it. After analyzing several
// peaks, and doing many tests, a PEAK_DETECT_THRESHOLD = 15 is an adequate value, to apply delay compensation only when there is
// clearly a peak
delay->est_delay = mean_val > 0 && max_val / mean_val > PEAK_DETECT_THRESHOLD ? max_pos - sync_pos : 0;
}
unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int total_nb_rb, int nb_rb)