fix timing advance command scaling
scaling with 2^mu is already part of 'bw_scaling', so don't do it twice! Also simplify the computation in get_bw_scaling() by using a one-line computation instead of a switch-case table.
This commit is contained in:
@@ -367,7 +367,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
|
|
||||||
int timing_advance_update, cqi;
|
int timing_advance_update, cqi;
|
||||||
int sync_pos;
|
int sync_pos;
|
||||||
uint16_t mu = gNB->frame_parms.numerology_index;
|
|
||||||
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
|
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
|
||||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
||||||
|
|
||||||
@@ -375,19 +374,10 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
|
|
||||||
// pdu->data = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
|
// pdu->data = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
|
||||||
sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
|
sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
|
||||||
timing_advance_update = sync_pos * (1 << mu); // scale by the used scs numerology
|
|
||||||
|
|
||||||
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
|
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
|
||||||
switch (gNB->frame_parms.N_RB_DL) {
|
uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
|
||||||
case 24: timing_advance_update /= 4; break;
|
timing_advance_update = sync_pos / bw_scaling;
|
||||||
case 106: timing_advance_update /= 16; break;
|
|
||||||
case 217: timing_advance_update /= 32; break;
|
|
||||||
case 245: timing_advance_update /= 32; break;
|
|
||||||
case 273: timing_advance_update /= 32; break;
|
|
||||||
case 66: timing_advance_update /= 12; break;
|
|
||||||
case 32: timing_advance_update /= 12; break;
|
|
||||||
default: AssertFatal(0==1,"No case defined for PRB %d to calculate timing_advance_update\n",gNB->frame_parms.N_RB_DL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// put timing advance command in 0..63 range
|
// put timing advance command in 0..63 range
|
||||||
timing_advance_update += 31;
|
timing_advance_update += 31;
|
||||||
|
|||||||
@@ -202,22 +202,15 @@ uint8_t get_ra_PreambleIndex(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_id){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert time factor "16 * 64 * T_c / (2^mu)" in N_TA calculation in TS38.213 section 4.2 to samples by multiplying with samples per second
|
||||||
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
|
// 16 * 64 * T_c / (2^mu) * samples_per_second
|
||||||
uint16_t get_bw_scaling(uint16_t nb_rb){
|
// = 16 * T_s / (2^mu) * samples_per_second
|
||||||
uint16_t bw_scaling;
|
// = 16 * 1 / (15 kHz * 2048) / (2^mu) * (15 kHz * 2^mu * ofdm_symbol_size)
|
||||||
|
// = 16 * 1 / 2048 * ofdm_symbol_size
|
||||||
switch (nb_rb) {
|
// = 16 * ofdm_symbol_size / 2048
|
||||||
case 24: bw_scaling = 4; break;
|
static inline
|
||||||
case 32: bw_scaling = 4; break;
|
uint16_t get_bw_scaling(uint16_t ofdm_symbol_size){
|
||||||
case 66: bw_scaling = 8; break;
|
return 16 * ofdm_symbol_size / 2048;
|
||||||
case 106: bw_scaling = 16; break;
|
|
||||||
case 217: bw_scaling = 32; break;
|
|
||||||
case 245: bw_scaling = 32; break;
|
|
||||||
case 273: bw_scaling = 32; break;
|
|
||||||
default: AssertFatal(1==0,"N_RB_UL %d not supported\n",nb_rb);
|
|
||||||
}
|
|
||||||
return bw_scaling;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UL time alignment procedures:
|
// UL time alignment procedures:
|
||||||
@@ -235,18 +228,16 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
|
|||||||
|
|
||||||
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
|
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
|
||||||
|
|
||||||
uint8_t numerology = ue->frame_parms.numerology_index;
|
uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
|
||||||
uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
|
uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
|
||||||
int factor_mu = 1 << numerology;
|
|
||||||
uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
|
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: applying timing advance -- frame %d -- slot %d -- UE_mode %d\n", __FUNCTION__, frame_tx, slot_tx, ue->UE_mode[gNB_id]);
|
LOG_D(PHY, "In %s: applying timing advance -- frame %d -- slot %d -- UE_mode %d\n", __FUNCTION__, frame_tx, slot_tx, ue->UE_mode[gNB_id]);
|
||||||
|
|
||||||
if (ue->UE_mode[gNB_id] == RA_RESPONSE){
|
if (ue->UE_mode[gNB_id] == RA_RESPONSE){
|
||||||
|
|
||||||
ue->timing_advance = ul_time_alignment->ta_command * bw_scaling / factor_mu;
|
ue->timing_advance += ul_time_alignment->ta_command * bw_scaling;
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Received (RAR) timing advance command %d new value is %u \n",
|
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Received (RAR) timing advance command %u new value is %d\n",
|
||||||
__FUNCTION__,
|
__FUNCTION__,
|
||||||
ue->Mod_id,
|
ue->Mod_id,
|
||||||
frame_tx,
|
frame_tx,
|
||||||
@@ -256,7 +247,7 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
|
|||||||
|
|
||||||
} else if (ue->UE_mode[gNB_id] == PUSCH){
|
} else if (ue->UE_mode[gNB_id] == PUSCH){
|
||||||
|
|
||||||
ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling / factor_mu;
|
ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling;
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
|
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
|
||||||
__FUNCTION__,
|
__FUNCTION__,
|
||||||
@@ -1259,7 +1250,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
if (ue->mac_enabled == 1) {
|
if (ue->mac_enabled == 1) {
|
||||||
|
|
||||||
uint16_t bw_scaling = get_bw_scaling(ue->frame_parms.N_RB_DL);
|
uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
|
||||||
|
|
||||||
/* Time Alignment procedure
|
/* Time Alignment procedure
|
||||||
// - UE processing capability 1
|
// - UE processing capability 1
|
||||||
@@ -1268,7 +1259,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
// - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are
|
// - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are
|
||||||
// computed according to sections 5.3 and 6.4 of TS 38.214 */
|
// computed according to sections 5.3 and 6.4 of TS 38.214 */
|
||||||
factor_mu = 1 << numerology;
|
factor_mu = 1 << numerology;
|
||||||
N_TA_max = 3846 * bw_scaling / factor_mu;
|
N_TA_max = 3846 * bw_scaling;
|
||||||
|
|
||||||
/* PDSCH decoding time N_1 for processing capability 1 */
|
/* PDSCH decoding time N_1 for processing capability 1 */
|
||||||
if (ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == pdsch_dmrs_pos0)
|
if (ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == pdsch_dmrs_pos0)
|
||||||
|
|||||||
Reference in New Issue
Block a user