diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 34e3733c5c..64f7a4772c 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -801,3 +801,27 @@ void freq2time(uint16_t ofdm_symbol_size, break; } } + +void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay) +{ + freq2time(ofdm_symbol_size, (int16_t *)ls_est, (int16_t *)ch_estimates_time); + + int max_pos = delay->delay_max_pos; + int max_val = delay->delay_max_val; + const int sync_pos = 0; + + for (int i = 0; i < ofdm_symbol_size; i++) { + int temp = c16amp2(ch_estimates_time[i]) >> 1; + if (temp > max_val) { + max_pos = i; + max_val = temp; + } + } + + 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; +} diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 5f4d11a1ca..0ac77ffd7a 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -129,6 +129,8 @@ void freq2time(uint16_t ofdm_symbol_size, int16_t *freq_signal, int16_t *time_signal); +void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay); + #define CEILIDIV(a,b) ((a+b-1)/b) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index 31eca819ee..5158a31b93 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -38,29 +38,6 @@ extern openair0_config_t openair0_cfg[MAX_CARDS]; -void nr_est_timing_advance_pusch(const NR_DL_FRAME_PARMS *frame_parms, const int32_t *ul_ch_estimates_time, delay_t *delay) -{ - int max_pos = delay->delay_max_pos; - int max_val = delay->delay_max_val; - const int sync_pos = 0; - - for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) { - c16_t *sample = (c16_t *)&ul_ch_estimates_time[i]; - int temp = (sample->r * sample->r / 2) + (sample->i * sample->i / 2); - if (temp > max_val) { - max_pos = i; - max_val = temp; - } - } - - if (max_pos > frame_parms->ofdm_symbol_size / 2) - max_pos = max_pos - frame_parms->ofdm_symbol_size; - - delay->delay_max_pos = max_pos; - delay->delay_max_val = max_val; - delay->est_delay = max_pos - sync_pos; -} - int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) { int timing_advance = 0; diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 9f0f24a611..116f72deab 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -184,9 +184,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, pilot_cnt += 2; } - freq2time(symbolSize, (int16_t *)ul_ls_est, (int16_t *)pusch_vars->ul_ch_estimates_time[aarx]); - - nr_est_timing_advance_pusch(&gNB->frame_parms, pusch_vars->ul_ch_estimates_time[aarx], delay); + nr_est_delay(gNB->frame_parms.ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[aarx], delay); int delay_idx = get_delay_idx(delay->est_delay, MAX_DELAY_COMP); c16_t *ul_delay_table = gNB->frame_parms.delay_table[delay_idx]; @@ -270,8 +268,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, } // Delay compensation - freq2time(symbolSize, (int16_t *)ul_ls_est, (int16_t *)pusch_vars->ul_ch_estimates_time[aarx]); - nr_est_timing_advance_pusch(&gNB->frame_parms, pusch_vars->ul_ch_estimates_time[aarx], delay); + nr_est_delay(gNB->frame_parms.ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[aarx], delay); int delay_idx = get_delay_idx(-delay->est_delay, MAX_DELAY_COMP); c16_t *ul_delay_table = gNB->frame_parms.delay_table[delay_idx]; for (int n = 0; n < nb_rb_pusch * NR_NB_SC_PER_RB; n++) { diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index f50e0f1bd7..c75b4d4ed7 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -60,9 +60,6 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, unsigned char symbol, uint8_t nrOfLayers); -void nr_est_timing_advance_pusch(const NR_DL_FRAME_PARMS *frame_parms, - const int32_t *ul_ch_estimates_time, delay_t *delay); - int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]); diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index a208522a42..0d78f75612 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -1303,32 +1303,6 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, } } -void nr_est_delay_pdsch(const NR_DL_FRAME_PARMS *frame_parms, const c16_t *dl_ls_est, delay_t *delay) -{ - c16_t dl_ch_estimates_time[frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); - memset(dl_ch_estimates_time, 0, sizeof(dl_ch_estimates_time)); - freq2time(frame_parms->ofdm_symbol_size, (int16_t *)dl_ls_est, (int16_t *)dl_ch_estimates_time); - - int max_pos = delay->delay_max_pos; - int max_val = delay->delay_max_val; - const int sync_pos = 0; - - for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) { - int temp = c16amp2(dl_ch_estimates_time[i]) >> 1; - if (temp > max_val) { - max_pos = i; - max_val = temp; - } - } - - if (max_pos > frame_parms->ofdm_symbol_size / 2) - max_pos = max_pos - frame_parms->ofdm_symbol_size; - - delay->delay_max_pos = max_pos; - delay->delay_max_val = max_val; - delay->est_delay = max_pos - sync_pos; -} - void NFAPI_NR_DMRS_TYPE1_linear_interp(NR_DL_FRAME_PARMS *frame_parms, c16_t *rxF, c16_t *pil, @@ -1370,7 +1344,9 @@ void NFAPI_NR_DMRS_TYPE1_linear_interp(NR_DL_FRAME_PARMS *frame_parms, #endif } - nr_est_delay_pdsch(frame_parms, dl_ls_est, delay); + c16_t ch_estimates_time[frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); + memset(ch_estimates_time, 0, sizeof(ch_estimates_time)); + nr_est_delay(frame_parms->ofdm_symbol_size, dl_ls_est, ch_estimates_time, delay); int delay_idx = get_delay_idx(delay->est_delay, MAX_DELAY_COMP); c16_t *dl_delay_table = frame_parms->delay_table[delay_idx]; @@ -1520,7 +1496,9 @@ void NFAPI_NR_DMRS_TYPE2_linear_interp(NR_DL_FRAME_PARMS *frame_parms, re_offset = (re_offset + 5) % frame_parms->ofdm_symbol_size; } - nr_est_delay_pdsch(frame_parms, dl_ls_est, delay); + c16_t ch_estimates_time[frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); + memset(ch_estimates_time, 0, sizeof(ch_estimates_time)); + nr_est_delay(frame_parms->ofdm_symbol_size, dl_ls_est, ch_estimates_time, delay); int delay_idx = get_delay_idx(delay->est_delay, MAX_DELAY_COMP); c16_t *dl_delay_table = frame_parms->delay_table[delay_idx]; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 2d1d32efbf..a14845bf4d 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -1299,7 +1299,6 @@ int main(int argc, char **argv) frame_parms->ofdm_symbol_size, 1, 1); - LOG_M("chestT0.m", "chT0", &pusch_vars->ul_ch_estimates_time[0][0], frame_parms->ofdm_symbol_size, 1, 1); LOG_M("chestF0_ext.m", "chF0_ext", &pusch_vars->ul_ch_estimates_ext[0][(start_symbol + 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))],