Add nr_mac_pc_reset_snr() to harmonize SNR reset on first reception

This commit is contained in:
Robert Schmidt
2026-04-16 15:03:38 +02:00
parent aa5bd641fd
commit 6f2d90fee9
4 changed files with 19 additions and 7 deletions
@@ -4200,6 +4200,21 @@ void nr_mac_pc_snr(nr_power_control_t *pc, int snrx10, int rssi)
pc->tpc_in_flight = PC_AVG_CNST * pc->tpc_in_flight; // + (1 - PC_AVG_CNST) * 0.0f
}
/**
* @brief Enter new SNR and RSSI value for the latest UL transmission as new
* fixed averages. Reset "TPC in flight" to zero.
*
* @param pc the power control loop
* @param snrx10 the current SNR measurement multiplied by 10
* @param rssi the current RSSI measurement
*/
void nr_mac_pc_reset_snr(nr_power_control_t *pc, int snrx10, int rssi)
{
pc->avg_snr = 0.1f * snrx10;
pc->avg_rssi = rssi;
pc->tpc_in_flight = 0.0f;
}
/**
* @brief Set a new target SNR for this power control loop, which can be
* updated on a continuous basis, and will be reflected immediately upon
@@ -911,10 +911,8 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, frame_t frame, slot_t slot, con
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 (uci_01->ul_cqi != 0xff)
nr_mac_pc_reset_snr(&UE->UE_sched_ctrl.pucch_pc, uci_01->ul_cqi * 5 - 640, uci_01->rssi);
}
if (harq_confidence == 1) {
UE->mac_stats.pucch0_DTX++;
@@ -762,11 +762,9 @@ static void nr_rx_ra_sdu(const module_id_t mod_id,
}
if (ul_cqi != 0xff) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
// Msg3: reset average with first measurement. If this fails (e.g., ul_cqi == 0xff)
// everything starts from predetermined value
sched_ctrl->pusch_pc.avg_snr = 0.1 * (ul_cqi * 5 - 640);
sched_ctrl->pusch_pc.avg_rssi = rssi;
nr_mac_pc_reset_snr(&UE->UE_sched_ctrl.pusch_pc, ul_cqi * 5 - 640, rssi);
}
if (!sdu) { // NACK
+1
View File
@@ -500,6 +500,7 @@ void post_process_ulsch(gNB_MAC_INST *nr_mac, post_process_pusch_t *pusch, NR_UE
float nr_mac_get_snr(const nr_power_control_t *pc);
void nr_mac_pc_snr(nr_power_control_t *pc, int snrx10, int rssi);
void nr_mac_pc_reset_snr(nr_power_control_t *pc, int snrx10, int rssi);
void nr_mac_set_target_snrx10(nr_power_control_t *pc, int target_snrx10);
void nr_mac_set_rssi_threshold(nr_power_control_t *pc, int rssi_threshold);
void nr_mac_signal_dtx(nr_power_control_t *pc);