Commit aa5bd641 authored by rmagueta's avatar rmagueta Committed by Robert Schmidt

Fix EMA cold-start for noise and SNR/RSSI measurements

Initialize n0_subband_power and power control avg_snr/avg_rssi directly from the first measurement instead of starting from zero
parent 5fcd456a
...@@ -162,6 +162,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy ...@@ -162,6 +162,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy
int32_t n0_subband_tot_perANT[frame_parms->nb_antennas_rx]; int32_t n0_subband_tot_perANT[frame_parms->nb_antennas_rx];
memset(n0_subband_tot_perANT, 0, sizeof(n0_subband_tot_perANT)); memset(n0_subband_tot_perANT, 0, sizeof(n0_subband_tot_perANT));
bool init_meas = measurements->n0_subband_power == NULL;
allocCast2D(n0_subband_power, allocCast2D(n0_subband_power,
unsigned int, unsigned int,
measurements->n0_subband_power, measurements->n0_subband_power,
...@@ -174,6 +175,9 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy ...@@ -174,6 +175,9 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy
if (nb_symb[rb] > 0) { if (nb_symb[rb] > 0) {
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
tmp_n0_subband[aarx][rb] /= nb_symb[rb]; tmp_n0_subband[aarx][rb] /= nb_symb[rb];
// Initialize n0_subband_power from the first measurement before EMA
if (init_meas)
n0_subband_power[aarx][rb] = tmp_n0_subband[aarx][rb];
// apply exponential moving average to smooth noise measurements // apply exponential moving average to smooth noise measurements
n0_subband_power[aarx][rb] = 0.9 * n0_subband_power[aarx][rb] + 0.1 * tmp_n0_subband[aarx][rb]; n0_subband_power[aarx][rb] = 0.9 * n0_subband_power[aarx][rb] + 0.1 * tmp_n0_subband[aarx][rb];
n0_subband_tot_perPRB += n0_subband_power[aarx][rb]; n0_subband_tot_perPRB += n0_subband_power[aarx][rb];
......
...@@ -910,6 +910,11 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, frame_t frame, slot_t slot, con ...@@ -910,6 +910,11 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, frame_t frame, slot_t slot, con
NR_SCHED_UNLOCK(&nrmac->sched_lock); NR_SCHED_UNLOCK(&nrmac->sched_lock);
return; return;
} }
// Msg4 Ack: reset average with first measurement
if (uci_01->ul_cqi != 0xff) {
UE->UE_sched_ctrl.pucch_pc.avg_rssi = uci_01->rssi;
UE->UE_sched_ctrl.pucch_pc.avg_snr = (uci_01->ul_cqi * 5 - 640) * 0.1;
}
} }
if (harq_confidence == 1) { if (harq_confidence == 1) {
UE->mac_stats.pucch0_DTX++; UE->mac_stats.pucch0_DTX++;
......
...@@ -763,7 +763,7 @@ static void nr_rx_ra_sdu(const module_id_t mod_id, ...@@ -763,7 +763,7 @@ static void nr_rx_ra_sdu(const module_id_t mod_id,
if (ul_cqi != 0xff) { if (ul_cqi != 0xff) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
// Msg3: reset average. If this fails (e.g., ul_cqi == 0xff) // Msg3: reset average with first measurement. If this fails (e.g., ul_cqi == 0xff)
// everything starts from predetermined value // everything starts from predetermined value
sched_ctrl->pusch_pc.avg_snr = 0.1 * (ul_cqi * 5 - 640); sched_ctrl->pusch_pc.avg_snr = 0.1 * (ul_cqi * 5 - 640);
sched_ctrl->pusch_pc.avg_rssi = rssi; sched_ctrl->pusch_pc.avg_rssi = rssi;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment