From 5c6865fbc6d093ed9b836c318df35eaa9ff0eec5 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Mon, 26 Apr 2021 16:09:32 +0200 Subject: [PATCH] 5G NR: simplify init_timeshift_rotation() Only Ncp1 is used, so get rid of the second timeshift_symbol_rotation array. Also simplify the computation of "t0 * Tc * f". --- openair1/PHY/MODULATION/nr_modulation.c | 67 +++---------------------- openair1/PHY/MODULATION/slot_fep_nr.c | 4 +- openair1/PHY/defs_nr_common.h | 2 +- 3 files changed, 11 insertions(+), 62 deletions(-) diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c index d38373afff..c81a88ff30 100644 --- a/openair1/PHY/MODULATION/nr_modulation.c +++ b/openair1/PHY/MODULATION/nr_modulation.c @@ -747,69 +747,18 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) { void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp) { - const double fd = 15e3*(float)(1<numerology_index); - const double Tc=(1/480e3/4096); - const double Ncp0=16*64 + (144*64*(1/(float)(1<numerology_index))); - const double Ncp1=(144*64*(1/(float)(1<numerology_index))); - double t0; - double poff; - double exp_re; - double exp_im; - double f; - int16_t *timeshift_symbol_rotation; - int i; - - for (i = 0; i < fp->ofdm_symbol_size/2; i++) { - timeshift_symbol_rotation = fp->timeshift_symbol_rotation[0]; - f = fd * i; - t0 = Ncp0 / fp->ofdm_offset_divisor; - poff = 2 * M_PI * -t0 * Tc * f; - exp_re = cos(poff); - exp_im = sin(-poff); - timeshift_symbol_rotation[i*2] = (int16_t)floor(exp_re * 32767); - timeshift_symbol_rotation[i*2+1] = (int16_t)floor(exp_im * 32767); - - timeshift_symbol_rotation = fp->timeshift_symbol_rotation[1]; - t0 = Ncp1 / fp->ofdm_offset_divisor; - poff = 2 * M_PI * -t0 * Tc * f; - exp_re = cos(poff); - exp_im = sin(-poff); - timeshift_symbol_rotation[i*2] = (int16_t)floor(exp_re * 32767); - timeshift_symbol_rotation[i*2+1] = (int16_t)floor(exp_im * 32767); + for (int i = 0; i < fp->ofdm_symbol_size; i++) { + double poff = -i * 2.0 * M_PI * 144.0 / 2048.0 / fp->ofdm_offset_divisor; + double exp_re = cos(poff); + double exp_im = sin(-poff); + fp->timeshift_symbol_rotation[i*2] = (int16_t)round(exp_re * 32767); + fp->timeshift_symbol_rotation[i*2+1] = (int16_t)round(exp_im * 32767); if (i < 10) LOG_I(PHY,"Timeshift symbol rotation %d => (%d,%d) %f\n",i, - fp->timeshift_symbol_rotation[0][i*2], - fp->timeshift_symbol_rotation[0][i*2+1], + fp->timeshift_symbol_rotation[i*2], + fp->timeshift_symbol_rotation[i*2+1], poff); - - } - - i = 1; - for (int j = fp->ofdm_symbol_size-1; j > fp->ofdm_symbol_size/2-1; j--) { - timeshift_symbol_rotation = fp->timeshift_symbol_rotation[0]; - f = -fd * i; - t0 = Ncp0 / fp->ofdm_offset_divisor; - poff = 2 * M_PI * -t0 * Tc * f; - exp_re = cos(poff); - exp_im = sin(-poff); - timeshift_symbol_rotation[j*2] = (int16_t)ceil(exp_re * 32767); - timeshift_symbol_rotation[j*2+1] = (int16_t)ceil(exp_im * 32767); - - timeshift_symbol_rotation = fp->timeshift_symbol_rotation[1]; - t0 = Ncp1 / fp->ofdm_offset_divisor; - poff = 2 * M_PI * -t0 * Tc * f; - exp_re = cos(poff); - exp_im = sin(-poff); - timeshift_symbol_rotation[j*2] = (int16_t)ceil(exp_re * 32767); - timeshift_symbol_rotation[j*2+1] = (int16_t)ceil(exp_im * 32767); - - if (j > fp->ofdm_symbol_size-10-1) - LOG_I(PHY,"Timeshift symbol rotation %d => (%d,%d) %f\n",-i, - fp->timeshift_symbol_rotation[0][j*2], - fp->timeshift_symbol_rotation[0][j*2+1], - poff); - i++; } } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index bd8d89bdca..f0abd52c7f 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -158,7 +158,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, frame_parms->ofdm_symbol_size, 15); - int16_t *shift_rot = frame_parms->timeshift_symbol_rotation[1]; + int16_t *shift_rot = frame_parms->timeshift_symbol_rotation; multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], shift_rot, @@ -367,7 +367,7 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, length, 15); - int16_t *shift_rot = frame_parms->timeshift_symbol_rotation[1]; + int16_t *shift_rot = frame_parms->timeshift_symbol_rotation; multadd_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol], shift_rot, diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index f89c3d66af..0b729302a9 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -331,7 +331,7 @@ struct NR_DL_FRAME_PARMS { int16_t symbol_rotation[2][224*2]; /// sequence used to compensate the phase rotation due to timeshifted OFDM symbols /// First dimenstion is for different CP lengths - int16_t timeshift_symbol_rotation[2][4096*2] __attribute__ ((aligned (16))); + int16_t timeshift_symbol_rotation[4096*2] __attribute__ ((aligned (16))); /// shift of pilot position in one RB uint8_t nushift; /// SRS configuration from TS 38.331 RRC