diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 4ca616537f..9867c879d1 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -934,38 +934,8 @@ void freq2time(uint16_t ofdm_symbol_size, int16_t *freq_signal, int16_t *time_signal) { - switch (ofdm_symbol_size) { - case 128: - idft(IDFT_128, freq_signal, time_signal, 1); - break; - case 256: - idft(IDFT_256, freq_signal, time_signal, 1); - break; - case 512: - idft(IDFT_512, freq_signal, time_signal, 1); - break; - case 1024: - idft(IDFT_1024, freq_signal, time_signal, 1); - break; - case 1536: - idft(IDFT_1536, freq_signal, time_signal, 1); - break; - case 2048: - idft(IDFT_2048, freq_signal, time_signal, 1); - break; - case 4096: - idft(IDFT_4096, freq_signal, time_signal, 1); - break; - case 6144: - idft(IDFT_6144, freq_signal, time_signal, 1); - break; - case 8192: - idft(IDFT_8192, freq_signal, time_signal, 1); - break; - default: - AssertFatal (1 == 0, "Invalid ofdm_symbol_size %i\n", ofdm_symbol_size); - break; - } + const idft_size_idx_t idft_size = get_idft(ofdm_symbol_size); + idft(idft_size, freq_signal, time_signal, 1); } void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay) diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 7bd0c9d839..de19d30819 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -139,61 +139,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input volatile int *output_ptr=(int*)0; int *temp_ptr=(int*)0; - idft_size_idx_t idftsize; - - switch (fftsize) { - case 128: - idftsize = IDFT_128; - break; - - case 256: - idftsize = IDFT_256; - break; - - case 512: - idftsize = IDFT_512; - break; - - case 768: - idftsize = IDFT_768; - break; - - case 1024: - idftsize = IDFT_1024; - break; - - case 1536: - idftsize = IDFT_1536; - break; - - case 2048: - idftsize = IDFT_2048; - break; - - case 3072: - idftsize = IDFT_3072; - break; - - case 4096: - idftsize = IDFT_4096; - break; - - case 6144: - idftsize= IDFT_6144; - break; - - case 12288: - idftsize= IDFT_12288; - break; - - case 24576: - idftsize= IDFT_24576; - break; - - default: - idftsize = IDFT_512; - break; - } + idft_size_idx_t idft_size = get_idft(fftsize); #ifdef DEBUG_OFDM_MOD printf("[PHY] OFDM mod (size %d,prefix %d) Symbols %d, input %p, output %p\n", @@ -209,9 +155,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input #endif // on AVX2 need 256-bit alignment - idft(idftsize,(int16_t *)&input[i*fftsize], - (int16_t *)temp, - 1); + idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)temp, 1); // Copy to frame buffer with Cyclic Extension // Note: will have to adjust for synchronization offset! 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 f7806aa504..fc89fdafd9 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -479,86 +479,10 @@ int nr_prs_channel_estimation(uint8_t gNB_id, if(second_half > 0) memcpy((int16_t *)&chF_interpol[rxAnt][0], &ch_tmp[first_half << 1], second_half * sizeof(int32_t)); - // Time domain IMPULSE response - idft_size_idx_t idftsizeidx; - switch (NR_PRS_IDFT_OVERSAMP_FACTOR*frame_params->ofdm_symbol_size) { - case 128: - idftsizeidx = IDFT_128; - break; - - case 256: - idftsizeidx = IDFT_256; - break; - - case 512: - idftsizeidx = IDFT_512; - break; - - case 768: - idftsizeidx = IDFT_768; - break; - - case 1024: - idftsizeidx = IDFT_1024; - break; - - case 1536: - idftsizeidx = IDFT_1536; - break; - - case 2048: - idftsizeidx = IDFT_2048; - break; - - case 3072: - idftsizeidx = IDFT_3072; - break; - - case 4096: - idftsizeidx = IDFT_4096; - break; - - case 6144: - idftsizeidx = IDFT_6144; - break; - - // 16x IDFT oversampling - case 8192: - idftsizeidx = IDFT_8192; - break; - - case 12288: - idftsizeidx = IDFT_12288; - break; - - case 16384: - idftsizeidx = IDFT_16384; - break; - - case 24576: - idftsizeidx = IDFT_24576; - break; - - case 32768: - idftsizeidx = IDFT_32768; - break; - - case 49152: - idftsizeidx = IDFT_49152; - break; - - case 65536: - idftsizeidx = IDFT_65536; - break; - - default: - LOG_I(PHY, "%s: unsupported ofdm symbol size \n", __FUNCTION__); - assert(0); - } - - idft(idftsizeidx, - (int16_t *)&chF_interpol[rxAnt][0], - (int16_t *)&chT_interpol[rxAnt][0],1); + // Convert to time domain + freq2time(NR_PRS_IDFT_OVERSAMP_FACTOR * frame_params->ofdm_symbol_size, + (int16_t *)&chF_interpol[rxAnt][0], + (int16_t *)&chT_interpol[rxAnt][0]); // peak estimator mean_val = squaredMod(((c16_t *)ch_tmp)[(prs_cfg->NumRB * 12) >> 1]); @@ -785,53 +709,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, break; } - idft_size_idx_t idftsizeidx; - - switch (ue->frame_parms.ofdm_symbol_size) { - case 128: - idftsizeidx = IDFT_128; - break; - - case 256: - idftsizeidx = IDFT_256; - break; - - case 512: - idftsizeidx = IDFT_512; - break; - - case 768: - idftsizeidx = IDFT_768; - break; - - case 1024: - idftsizeidx = IDFT_1024; - break; - - case 1536: - idftsizeidx = IDFT_1536; - break; - - case 2048: - idftsizeidx = IDFT_2048; - break; - - case 3072: - idftsizeidx = IDFT_3072; - break; - - case 4096: - idftsizeidx = IDFT_4096; - break; - - case 6144: - idftsizeidx = IDFT_6144; - break; - - default: - printf("unsupported ofdm symbol size \n"); - assert(0); - } // generate pilot // Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS @@ -926,10 +803,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, { // do ifft of channel estimate LOG_D(PHY,"Channel Impulse Computation Slot %d Symbol %d ch_offset %d\n", Ns, symbol, ch_offset); - idft(idftsizeidx, - (int16_t*) &dl_ch_estimates[aarx][ch_offset], - (int16_t*) dl_ch_estimates_time[aarx], - 1); + freq2time(ue->frame_parms.ofdm_symbol_size, + (int16_t *)&dl_ch_estimates[aarx][ch_offset], + (int16_t *)&dl_ch_estimates_time[aarx]); } } diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 4a418d43b1..8f93a3fd6b 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -679,14 +679,20 @@ idft_size_idx_t get_idft(int ofdm_symbol_size) return IDFT_9216; case 12288: return IDFT_12288; + case 16384: + return IDFT_16384; case 18432: return IDFT_18432; case 24576: return IDFT_24576; + case 32768: + return IDFT_32768; case 36864: return IDFT_36864; case 49152: return IDFT_49152; + case 65536: + return IDFT_65536; case 73728: return IDFT_73728; case 98304: