Merge remote-tracking branch 'origin/nr_timing_fixes' into integration_2021_wk45_b
This commit is contained in:
+7
-2
@@ -460,13 +460,18 @@ int computeSamplesShift(PHY_VARS_NR_UE *UE) {
|
|||||||
// compute TO compensation that should be applied for this frame
|
// compute TO compensation that should be applied for this frame
|
||||||
if ( UE->rx_offset < UE->frame_parms.samples_per_frame/2 &&
|
if ( UE->rx_offset < UE->frame_parms.samples_per_frame/2 &&
|
||||||
UE->rx_offset > 0 ) {
|
UE->rx_offset > 0 ) {
|
||||||
//LOG_I(PHY,"!!!adjusting -1 samples!!!\n");
|
LOG_I(PHY,"!!!adjusting -1 samples!!! rx_offset == %d\n", UE->rx_offset);
|
||||||
|
UE->rx_offset = 0; // reset so that it is not applied falsely in case of SSB being only in every second frame
|
||||||
|
UE->max_pos_fil = 0; // reset IIR filter when sample shift is applied
|
||||||
return -1 ;
|
return -1 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( UE->rx_offset > UE->frame_parms.samples_per_frame/2 &&
|
if ( UE->rx_offset > UE->frame_parms.samples_per_frame/2 &&
|
||||||
UE->rx_offset < UE->frame_parms.samples_per_frame ) {
|
UE->rx_offset < UE->frame_parms.samples_per_frame ) {
|
||||||
//LOG_I(PHY,"!!!adjusting +1 samples!!!\n");
|
int rx_offset = UE->rx_offset - UE->frame_parms.samples_per_frame;
|
||||||
|
LOG_I(PHY,"!!!adjusting +1 samples!!! rx_offset == %d\n", rx_offset);
|
||||||
|
UE->rx_offset = 0; // reset so that it is not applied falsely in case of SSB being only in every second frame
|
||||||
|
UE->max_pos_fil = 0; // reset IIR filter when sample shift is applied
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
short coef)
|
short coef)
|
||||||
{
|
{
|
||||||
|
|
||||||
static int max_pos_fil = 0;
|
|
||||||
static int count_max_pos_ok = 0;
|
static int count_max_pos_ok = 0;
|
||||||
static int first_time = 1;
|
static int first_time = 1;
|
||||||
int max_val = 0, max_pos = 0;
|
int max_val = 0, max_pos = 0;
|
||||||
@@ -55,13 +54,14 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
LOG_D(PHY,"AbsSubframe %d: rx_offset (before) = %d\n",subframe,ue->rx_offset);
|
LOG_D(PHY,"AbsSubframe %d: rx_offset (before) = %d\n",subframe,ue->rx_offset);
|
||||||
|
|
||||||
// we only use channel estimates from tx antenna 0 here
|
// search for maximum position within the cyclic prefix
|
||||||
for (int i = 0; i < frame_parms->nb_prefix_samples; i++) {
|
for (int i = -frame_parms->nb_prefix_samples/2; i < frame_parms->nb_prefix_samples/2; i++) {
|
||||||
int temp = 0;
|
int temp = 0;
|
||||||
|
|
||||||
|
int j = (i < 0) ? (i + frame_parms->ofdm_symbol_size) : i;
|
||||||
for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
||||||
int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(i<<1)];
|
int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(j<<1)];
|
||||||
int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(i<<1)];
|
int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(j<<1)];
|
||||||
temp += (Re*Re/2) + (Im*Im/2);
|
temp += (Re*Re/2) + (Im*Im/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,19 +71,16 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_pos > frame_parms->ofdm_symbol_size/2)
|
|
||||||
max_pos = max_pos - frame_parms->ofdm_symbol_size;
|
|
||||||
|
|
||||||
// filter position to reduce jitter
|
// filter position to reduce jitter
|
||||||
if (clear == 1)
|
if (clear == 1)
|
||||||
max_pos_fil = max_pos;
|
ue->max_pos_fil = max_pos;
|
||||||
else
|
else
|
||||||
max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
|
ue->max_pos_fil = ((ue->max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
|
||||||
|
|
||||||
// do not filter to have proactive timing adjustment
|
// do not filter to have proactive timing adjustment
|
||||||
//max_pos_fil = max_pos;
|
//ue->max_pos_fil = max_pos;
|
||||||
|
|
||||||
int diff = max_pos_fil - sync_pos;
|
int diff = ue->max_pos_fil - sync_pos;
|
||||||
|
|
||||||
if (frame_parms->freq_range==nr_FR2)
|
if (frame_parms->freq_range==nr_FR2)
|
||||||
sync_offset = 2;
|
sync_offset = 2;
|
||||||
@@ -131,7 +128,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
ue->rx_offset,
|
ue->rx_offset,
|
||||||
clear,
|
clear,
|
||||||
max_pos,
|
max_pos,
|
||||||
max_pos_fil,
|
ue->max_pos_fil,
|
||||||
max_val,
|
max_val,
|
||||||
sync_pos);
|
sync_pos);
|
||||||
#endif //DEBUG_PHY
|
#endif //DEBUG_PHY
|
||||||
|
|||||||
@@ -917,9 +917,10 @@ typedef struct {
|
|||||||
uint8_t init_sync_frame;
|
uint8_t init_sync_frame;
|
||||||
/// temporary offset during cell search prior to MIB decoding
|
/// temporary offset during cell search prior to MIB decoding
|
||||||
int ssb_offset;
|
int ssb_offset;
|
||||||
uint16_t symbol_offset; // offset in terms of symbols for detected ssb in sync
|
uint16_t symbol_offset; /// offset in terms of symbols for detected ssb in sync
|
||||||
int rx_offset; /// Timing offset
|
int rx_offset; /// Timing offset
|
||||||
int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
|
int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
|
||||||
|
int max_pos_fil; /// Timing offset IIR filter
|
||||||
int time_sync_cell;
|
int time_sync_cell;
|
||||||
|
|
||||||
/// Timing Advance updates variables
|
/// Timing Advance updates variables
|
||||||
|
|||||||
@@ -403,8 +403,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
|
|
||||||
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||||
|
|
||||||
int timing_advance_update, cqi;
|
|
||||||
int sync_pos;
|
|
||||||
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];
|
||||||
NR_gNB_SCH_STATS_t *stats=get_ulsch_stats(gNB,ulsch);
|
NR_gNB_SCH_STATS_t *stats=get_ulsch_stats(gNB,ulsch);
|
||||||
@@ -412,19 +410,20 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
|
nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
|
||||||
|
|
||||||
// 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
|
int sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
|
||||||
|
|
||||||
// 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
|
||||||
uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
|
uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
|
||||||
int sync_pos_rounded;
|
|
||||||
// do some integer rounding to improve TA accuracy
|
// do some integer rounding to improve TA accuracy
|
||||||
|
int sync_pos_rounded;
|
||||||
if (sync_pos > 0)
|
if (sync_pos > 0)
|
||||||
sync_pos_rounded = sync_pos + (bw_scaling / 2) - 1;
|
sync_pos_rounded = sync_pos + (bw_scaling / 2) - 1;
|
||||||
else
|
else
|
||||||
sync_pos_rounded = sync_pos - (bw_scaling / 2) - 1;
|
sync_pos_rounded = sync_pos - (bw_scaling / 2) + 1;
|
||||||
if (stats) stats->sync_pos = sync_pos;
|
if (stats) stats->sync_pos = sync_pos;
|
||||||
|
|
||||||
timing_advance_update = sync_pos_rounded / bw_scaling;
|
int timing_advance_update = sync_pos_rounded / bw_scaling;
|
||||||
|
|
||||||
// put timing advance command in 0..63 range
|
// put timing advance command in 0..63 range
|
||||||
timing_advance_update += 31;
|
timing_advance_update += 31;
|
||||||
@@ -449,6 +448,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
|
|
||||||
LOG_D(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f, noise %f)\n", SNRtimes10/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot)/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot)/10.0);
|
LOG_D(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f, noise %f)\n", SNRtimes10/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot)/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot)/10.0);
|
||||||
|
|
||||||
|
int cqi;
|
||||||
if (SNRtimes10 < -640) cqi=0;
|
if (SNRtimes10 < -640) cqi=0;
|
||||||
else if (SNRtimes10 > 635) cqi=255;
|
else if (SNRtimes10 > 635) cqi=255;
|
||||||
else cqi=(640+SNRtimes10)/5;
|
else cqi=(640+SNRtimes10)/5;
|
||||||
|
|||||||
Reference in New Issue
Block a user