From f1f02ec0a1979ec4dcf1c5354a9b6f2c5b63004f Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Wed, 25 Sep 2024 19:53:34 +0200 Subject: [PATCH 1/6] use existing functions to retrieve (i)dft enum value --- .../PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c | 27 +- .../lte_dl_channel_estimation.c | 49 +--- .../lte_dl_mbsfn_channel_estimation.c | 76 +++--- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 80 +++--- .../lte_ul_channel_estimation.c | 52 ++-- openair1/PHY/LTE_TRANSPORT/prach.c | 92 +------ .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 215 +--------------- openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c | 137 ++-------- .../PHY/LTE_UE_TRANSPORT/ulsch_modulation.c | 237 +----------------- openair1/PHY/MODULATION/nr_modulation.c | 227 +---------------- openair1/PHY/MODULATION/slot_fep.c | 71 +----- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 56 +---- openair1/PHY/MODULATION/slot_fep_ul.c | 37 +-- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 226 +---------------- openair1/PHY/TOOLS/tools_defs.h | 93 +------ 15 files changed, 201 insertions(+), 1474 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c index aac8e71828..137035d0d7 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c @@ -53,28 +53,23 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, for (aa=0; aanb_antennas_rx; aa++) { // do ifft of channel estimate + int len=0; switch(frame_parms->N_RB_DL) { case 6: - dft(DFT_128,(int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], - (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], - 1); - break; + len = 128; + break; case 25: - dft(DFT_512,(int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], - (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], - 1); - break; + len = 512; + break; case 50: - dft(DFT_1024,(int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], - (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], - 1); - break; + len = 1024; + break; case 100: - dft(DFT_2048,(int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], - (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], - 1); - break; + len = 2048; + break; } + if (len) + dft(get_dft(len), (int16_t *)lte_eNB_srs->srs_ch_estimates[aa], (int16_t *)lte_eNB_srs->srs_ch_estimates_time[aa], 1); #ifdef DEBUG_PHY sprintf(fname,"srs_ch_estimates_time_%d%d.m",ind,aa); sprintf(vname,"srs_time_%d%d",ind,aa); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 1e27e99166..fe995885cb 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -47,9 +47,10 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift,pilot0,pilot1,pilot2,pilot3; uint8_t previous_thread_id = ue->current_thread_id[Ns>>1]==0 ? (RX_NB_TH-1):(ue->current_thread_id[Ns>>1]-1); - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; + LTE_UE_COMMON_PER_THREAD * vars=&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]]; + int **dl_ch_estimates =vars->dl_ch_estimates[eNB_offset]; int **dl_ch_estimates_previous=ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; + int **rxdataF=vars->rxdataF; pilot0 = 0; if (ue->frame_parms.Ncp == 0) { // normal prefix @@ -657,53 +658,27 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, } } - 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 1024: - idftsizeidx = IDFT_1024; - break; - - case 1536: - idftsizeidx = IDFT_1536; - break; - - case 2048: - idftsizeidx = IDFT_2048; - break; - - default: - idftsizeidx = IDFT_512; - break; - } + int s = ue->frame_parms.ofdm_symbol_size; + if (s != 128 && s != 256 && s != 512 && s != 1024 && s != 1536 && s != 2048) + s = 512; if( ((Ns%2) == 0) && (l == pilot0)) { // do ifft of channel estimate for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) for (p=0; pframe_parms.nb_antenna_ports_eNB; p++) { - if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx]) { + if (dl_ch_estimates[(p<<1)+aarx]) { //LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l); - idft(idftsizeidx,(int16_t *) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], - (int16_t *) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); + idft(get_idft(s), + (int16_t *)&dl_ch_estimates[(p << 1) + aarx][8], + (int16_t *)vars->dl_ch_estimates_time[eNB_offset][(p << 1) + aarx], + 1); } } } T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(0), T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].frame_rx%1024), T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].subframe_rx), - T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4)); + T_INT(0), T_BUFFER(&vars->dl_ch_estimates_time[eNB_offset][0][0], 512 * 4)); return(0); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index 05e27de1a6..90606c63c4 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -721,44 +721,37 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue, // do ifft of channel estimate for (aa=0; aaframe_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) { - if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa]) { + int32_t *tmp = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa]; + if (tmp) { + int len; switch (ue->frame_parms.N_RB_DL) { case 6: - idft(IDFT_128,(int16_t *) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], - (int16_t *) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], - 1); + len = 128; break; - case 25: - idft(IDFT_512,(int16_t *) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], - (int16_t *) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], - 1); + len = 512; break; - case 50: - idft(IDFT_1024,(int16_t *) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], - (int16_t *) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], - 1); + len = 1024; break; - case 75: - idft(IDFT_1536,(int16_t *) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], - (int16_t *) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], - 1); + len=1536; break; - case 100: - idft(IDFT_2048,(int16_t *) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], - (int16_t *) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], - 1); + len = 2048; break; - default: - break; + LOG_E(PHY, "Unknown N_RB_DL %d\n", ue->frame_parms.N_RB_DL); + return -1; } + + idft(get_idft(len), + (int16_t *)&tmp[8], + (int16_t *)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]] + .dl_ch_estimates_time[eNB_offset][aa], + 1); } } - return(0); } @@ -907,30 +900,27 @@ int lte_dl_mbsfn_khz_1dot25_channel_estimation(PHY_VARS_UE *ue, // do ifft of channel estimate for (aa=0; aaframe_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) { - if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[0][aa]) { + int32_t *tmp = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[0][aa]; + if (tmp) { + int len = 0; switch (ue->frame_parms.N_RB_DL) { - case 25: - idft(IDFT_6144,(int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[0][aa][8], - (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[0][aa], - 1); - break; - case 50: - idft(IDFT_12288,(int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[0][aa][8], - (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[0][aa], - 1); - break; - case 100: - idft(IDFT_24576,(int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[0][aa][8], - (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[0][aa], - 1); - break; - default: - break; + case 25: + len = 6144; + break; + case 50: + len = 12288; + break; + case 100: + len = 24576; + break; } + if (len) + idft(get_idft(len), + (int16_t *)&tmp[8], + (int16_t *)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[0][aa], + 1); } } - - return(0); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index e80de0798d..4a1980af8c 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -37,33 +37,29 @@ static c16_t *primary_synch_time[3] __attribute__((aligned(32))); static void doIdft(int size, short *in, short *out) { + int len; switch (size) { - case 6: - idft(IDFT_128,in,out,1); - break; - - case 25: - idft(IDFT_512,in,out,1); - break; - - case 50: - idft(IDFT_1024,in,out,1); - break; - - case 75: - idft(IDFT_1536,in,out,1); - break; - - case 100: - idft(IDFT_2048,in,out,1); - break; - - default: - LOG_E(PHY,"Unsupported N_RB_DL %d\n",size); - abort(); - break; - } + case 6: + len = 128; + break; + case 25: + len = 512; + break; + case 50: + len = 1024; + break; + case 75: + len=1536; + break; + case 100: + len = 2048; + break; + default: + LOG_E(PHY, "Unknown N_RB_DL %d\n", size); + return; } + idft(get_idft(len), in, out, 1); +} static void copyPrimary( c16_t *out, struct complex16 *in, int ofdmSize) { int k=ofdmSize-36; @@ -187,43 +183,29 @@ int ru_sync_time_init(RU_t *ru) { // LTE_UE_COMMON *common_vars 0, ru->frame_parms->N_RB_DL, 0); - + int len; switch (ru->frame_parms->N_RB_DL) { case 6: - idft(IDFT_128,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); + len = 128; break; - case 25: - idft(IDFT_512,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); + len = 512; break; - case 50: - idft(IDFT_1024,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); + len = 1024; break; - case 75: - idft(IDFT_1536,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, - 1); /// complex output + len = 1536; break; - case 100: - idft(IDFT_2048,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); + len = 2048; break; - default: - AssertFatal(1==0,"Unsupported N_RB_DL %d\n",ru->frame_parms->N_RB_DL); - break; + LOG_E(PHY, "Unknown N_RB_DL %d\n", ru->frame_parms->N_RB_DL); + return -1; } - + idft(get_idft(len), (int16_t *)&dmrsp[0][3 * ru->frame_parms->ofdm_symbol_size], ru->dmrssync, + 1); /// complex output return(0); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index e081a9d869..a2c6494534 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -222,33 +222,25 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, for(i=0; iN_RB_DL) { case 6: - idft(IDFT_128,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 128; break; - case 25: - idft(IDFT_512,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 512; break; - case 50: - idft(IDFT_1024,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 1024; break; - case 100: - idft(IDFT_2048,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 2048; break; + default: + LOG_E(PHY, "Unknown N_RB_DL %d\n", frame_parms->N_RB_DL); + return -1; } - + idft(get_idft(len), (int16_t *)temp_in_ifft_0, (int16_t *)ul_ch_estimates_time[aa], 1); #if T_TRACER if (aa == 0) @@ -501,33 +493,25 @@ int32_t lte_ul_channel_estimation_RRU(LTE_DL_FRAME_PARMS *frame_parms, for(i=0; iN_RB_DL) { case 6: - idft(IDFT_128,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 128; break; - case 25: - idft(IDFT_512,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 512; break; - case 50: - idft(IDFT_1024,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 1024; break; - case 100: - idft(IDFT_2048,(int16_t *) temp_in_ifft_0, - (int16_t *) ul_ch_estimates_time[aa], - 1); + len = 2048; break; + default: + LOG_E(PHY, "Unknown N_RB_DL %d\n", frame_parms->N_RB_DL); + return -1; } - + idft(get_idft(len), (int16_t *)temp_in_ifft_0, (int16_t *)ul_ch_estimates_time[aa], 1); #if T_TRACER if (aa == 0) diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index ec5fa88d94..92350194ca 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -292,104 +292,38 @@ void rx_prach0(PHY_VARS_eNB *eNB, // do DFT switch (fp->N_RB_UL) { case 6: - if (prach_fmt == 4) { - dft(DFT_256,prach2,rxsigF[aa],1); - fft_size=256; - } else { - dft(DFT_1536,prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1); - fft_size=1536; - } - + fft_size = prach_fmt == 4 ? 256 : 1536; break; case 15: - if (prach_fmt == 4) { - dft(DFT_256,prach2,rxsigF[aa],1); - fft_size=256; - } else { - dft(DFT_3072,prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1); - } - fft_size=3072; + fft_size = prach_fmt == 4 ? 256 : 3072; break; case 25: default: - if (prach_fmt == 4) { - dft(DFT_1024,prach2,rxsigF[aa],1); - fft_size = 1024; - } else { - dft(DFT_6144,prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft(DFT_6144,prach2+12288,rxsigF[aa]+12288,1); - - fft_size = 6144; - } - + fft_size = prach_fmt == 4 ? 1024 : 6144; break; case 50: - if (prach_fmt == 4) { - dft(DFT_2048,prach2,rxsigF[aa],1); - fft_size=2048; - } else { - dft(DFT_12288,prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1); - fft_size=12288; - } - + fft_size = prach_fmt == 4 ? 2048 : 12288; break; case 75: - if (prach_fmt == 4) { - dft(DFT_3072,prach2,rxsigF[aa],1); - fft_size=3072; - } else { - dft(DFT_18432,prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft(DFT_18432,prach2+36864,rxsigF[aa]+36864,1); - fft_size=18432; - } - + fft_size = prach_fmt == 4 ? 3072 : 18432; break; case 100: - if (fp->threequarter_fs==0) { - if (prach_fmt == 4) { - dft(DFT_4096,prach2,rxsigF[aa],1); - fft_size=2048; - } else { - dft(DFT_24576,prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1); - fft_size=24576; - } - } else { - if (prach_fmt == 4) { - dft(DFT_3072,prach2,rxsigF[aa],1); - fft_size=3072; - } else { - dft(DFT_18432,prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft(DFT_18432,prach2+36864,rxsigF[aa]+36864,1); - fft_size=18432; - } - } - + if (fp->threequarter_fs == 0) + fft_size = prach_fmt == 4 ? 4096 : 24576; + else + fft_size = prach_fmt == 4 ? 3072 : 18432; break; } + dft(get_dft(fft_size), prach2, rxsigF[aa], 1); + if (prach_fmt > 1 && prach_fmt != 4) + dft(get_dft(fft_size), prach2 + 2 * fft_size, rxsigF[aa] + 2 * fft_size, 1); + k = (12*n_ra_prb) - 6*fp->N_RB_UL; if (k<0) { diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 897f4b1371..4052e5ce89 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -127,12 +127,12 @@ void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) { ((uint32_t *)idft_in2)[ip+3] = z11[i]; } } - + dft_size_idx_t dftsize = get_dft(Msc_PUSCH); switch (Msc_PUSCH) { case 12: - dft(DFT_12,(int16_t *)idft_in0,(int16_t *)idft_out0,0); - dft(DFT_12,(int16_t *)idft_in1,(int16_t *)idft_out1,0); - dft(DFT_12,(int16_t *)idft_in2,(int16_t *)idft_out2,0); + dft(dftsize, (int16_t *)idft_in0, (int16_t *)idft_out0, 0); + dft(dftsize, (int16_t *)idft_in1, (int16_t *)idft_out1, 0); + dft(dftsize, (int16_t *)idft_in2, (int16_t *)idft_out2, 0); norm128 = simde_mm_set1_epi16(9459); for (i=0; i<12; i++) { @@ -143,208 +143,10 @@ void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) { break; - case 24: - dft(DFT_24,idft_in0,idft_out0,1); - dft(DFT_24,idft_in1,idft_out1,1); - dft(DFT_24,idft_in2,idft_out2,1); - break; - - case 36: - dft(DFT_36,idft_in0,idft_out0,1); - dft(DFT_36,idft_in1,idft_out1,1); - dft(DFT_36,idft_in2,idft_out2,1); - break; - - case 48: - dft(DFT_48,idft_in0,idft_out0,1); - dft(DFT_48,idft_in1,idft_out1,1); - dft(DFT_48,idft_in2,idft_out2,1); - break; - - case 60: - dft(DFT_60,idft_in0,idft_out0,1); - dft(DFT_60,idft_in1,idft_out1,1); - dft(DFT_60,idft_in2,idft_out2,1); - break; - - case 72: - dft(DFT_72,idft_in0,idft_out0,1); - dft(DFT_72,idft_in1,idft_out1,1); - dft(DFT_72,idft_in2,idft_out2,1); - break; - - case 96: - dft(DFT_96,idft_in0,idft_out0,1); - dft(DFT_96,idft_in1,idft_out1,1); - dft(DFT_96,idft_in2,idft_out2,1); - break; - - case 108: - dft(DFT_108,idft_in0,idft_out0,1); - dft(DFT_108,idft_in1,idft_out1,1); - dft(DFT_108,idft_in2,idft_out2,1); - break; - - case 120: - dft(DFT_120,idft_in0,idft_out0,1); - dft(DFT_120,idft_in1,idft_out1,1); - dft(DFT_120,idft_in2,idft_out2,1); - break; - - case 144: - dft(DFT_144,idft_in0,idft_out0,1); - dft(DFT_144,idft_in1,idft_out1,1); - dft(DFT_144,idft_in2,idft_out2,1); - break; - - case 180: - dft(DFT_180,idft_in0,idft_out0,1); - dft(DFT_180,idft_in1,idft_out1,1); - dft(DFT_180,idft_in2,idft_out2,1); - break; - - case 192: - dft(DFT_192,idft_in0,idft_out0,1); - dft(DFT_192,idft_in1,idft_out1,1); - dft(DFT_192,idft_in2,idft_out2,1); - break; - - case 216: - dft(DFT_216,idft_in0,idft_out0,1); - dft(DFT_216,idft_in1,idft_out1,1); - dft(DFT_216,idft_in2,idft_out2,1); - break; - - case 240: - dft(DFT_240,idft_in0,idft_out0,1); - dft(DFT_240,idft_in1,idft_out1,1); - dft(DFT_240,idft_in2,idft_out2,1); - break; - - case 288: - dft(DFT_288,idft_in0,idft_out0,1); - dft(DFT_288,idft_in1,idft_out1,1); - dft(DFT_288,idft_in2,idft_out2,1); - break; - - case 300: - dft(DFT_300,idft_in0,idft_out0,1); - dft(DFT_300,idft_in1,idft_out1,1); - dft(DFT_300,idft_in2,idft_out2,1); - break; - - case 324: - dft(DFT_324,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_324,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_324,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 360: - dft(DFT_360,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_360,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_360,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 384: - dft(DFT_384,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_384,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_384,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 432: - dft(DFT_432,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_432,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_432,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 480: - dft(DFT_480,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_480,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_480,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 540: - dft(DFT_540,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_540,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_540,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 576: - dft(DFT_576,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_576,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_576,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 600: - dft(DFT_600,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_600,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_600,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 648: - dft(DFT_648,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_648,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_648,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 720: - dft(DFT_720,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_720,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_720,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 768: - dft(DFT_768,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_768,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_768,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 864: - dft(DFT_864,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_864,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_864,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 900: - dft(DFT_900,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_900,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_900,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 960: - dft(DFT_960,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_960,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_960,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 972: - dft(DFT_972,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_972,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_972,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 1080: - dft(DFT_1080,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_1080,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_1080,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 1152: - dft(DFT_1152,(int16_t *)idft_in0,(int16_t *)idft_out0,1); - dft(DFT_1152,(int16_t *)idft_in1,(int16_t *)idft_out1,1); - dft(DFT_1152,(int16_t *)idft_in2,(int16_t *)idft_out2,1); - break; - - case 1200: - dft(DFT_1200,idft_in0,idft_out0,1); - dft(DFT_1200,idft_in1,idft_out1,1); - dft(DFT_1200,idft_in2,idft_out2,1); - break; - default: - // should not be reached - LOG_E( PHY, "Unsupported Msc_PUSCH value of %"PRIu16"\n", Msc_PUSCH ); - return; + dft(dftsize, idft_in0, idft_out0, 1); + dft(dftsize, idft_in1, idft_out1, 1); + dft(dftsize, idft_in2, idft_out2, 1); } for (i=0,ip=0; iframe_parms.N_RB_UL) { case 6: - if (prach_fmt == 4) { - idft(IDFT_256,prachF,prach2,1); - memmove( prach, prach+512, Ncp<<2 ); - prach_len = 256+Ncp; - } else { - idft(IDFT_1536,prachF,prach2,1); - memmove( prach, prach+3072, Ncp<<2 ); - prach_len = 1536+Ncp; - - if (prach_fmt>1) { - memmove( prach2+3072, prach2, 6144 ); - prach_len = 2*1536+Ncp; - } - } - + len = prach_fmt == 4 ? 256 : 1536; break; case 15: - if (prach_fmt == 4) { - idft(IDFT_512,prachF,prach2,1); - //TODO: account for repeated format in dft output - memmove( prach, prach+1024, Ncp<<2 ); - prach_len = 512+Ncp; - } else { - idft(IDFT_3072,prachF,prach2,1); - memmove( prach, prach+6144, Ncp<<2 ); - prach_len = 3072+Ncp; - - if (prach_fmt>1) { - memmove( prach2+6144, prach2, 12288 ); - prach_len = 2*3072+Ncp; - } - } - + len = prach_fmt == 4 ? 512 : 3072; break; case 25: default: - if (prach_fmt == 4) { - idft(IDFT_1024,prachF,prach2,1); - memmove( prach, prach+2048, Ncp<<2 ); - prach_len = 1024+Ncp; - } else { - idft(IDFT_6144,prachF,prach2,1); - /*for (i=0;i<6144*2;i++) - prach2[i]<<=1;*/ - memmove( prach, prach+12288, Ncp<<2 ); - prach_len = 6144+Ncp; - - if (prach_fmt>1) { - memmove( prach2+12288, prach2, 24576 ); - prach_len = 2*6144+Ncp; - } - } - + len = prach_fmt == 4 ? 1024 : 6144; break; case 50: - if (prach_fmt == 4) { - idft(IDFT_2048,prachF,prach2,1); - memmove( prach, prach+4096, Ncp<<2 ); - prach_len = 2048+Ncp; - } else { - idft(IDFT_12288,prachF,prach2,1); - memmove( prach, prach+24576, Ncp<<2 ); - prach_len = 12288+Ncp; - - if (prach_fmt>1) { - memmove( prach2+24576, prach2, 49152 ); - prach_len = 2*12288+Ncp; - } - } - + len = prach_fmt == 4 ? 2048 : 12288; break; case 75: - if (prach_fmt == 4) { - idft(IDFT_3072,prachF,prach2,1); - //TODO: account for repeated format in dft output - memmove( prach, prach+6144, Ncp<<2 ); - prach_len = 3072+Ncp; - } else { - idft(IDFT_18432,prachF,prach2,1); - memmove( prach, prach+36864, Ncp<<2 ); - prach_len = 18432+Ncp; - - if (prach_fmt>1) { - memmove( prach2+36834, prach2, 73728 ); - prach_len = 2*18432+Ncp; - } - } - + len = prach_fmt == 4 ? 3072 : 18432; break; case 100: - if (ue->frame_parms.threequarter_fs == 0) { - if (prach_fmt == 4) { - idft(IDFT_4096,prachF,prach2,1); - memmove( prach, prach+8192, Ncp<<2 ); - prach_len = 4096+Ncp; - } else { - idft(IDFT_24576,prachF,prach2,1); - memmove( prach, prach+49152, Ncp<<2 ); - prach_len = 24576+Ncp; - - if (prach_fmt>1) { - memmove( prach2+49152, prach2, 98304 ); - prach_len = 2* 24576+Ncp; - } - } - } else { - if (prach_fmt == 4) { - idft(IDFT_3072,prachF,prach2,1); - //TODO: account for repeated format in dft output - memmove( prach, prach+6144, Ncp<<2 ); - prach_len = 3072+Ncp; - } else { - idft(IDFT_18432,prachF,prach2,1); - memmove( prach, prach+36864, Ncp<<2 ); - prach_len = 18432+Ncp; - printf("Generated prach for 100 PRB, 3/4 sampling\n"); - - if (prach_fmt>1) { - memmove( prach2+36834, prach2, 73728 ); - prach_len = 2*18432+Ncp; - } - } - } - + if (ue->frame_parms.threequarter_fs == 0) + len = prach_fmt == 4 ? 4096 : 24576; + else + len = prach_fmt == 4 ? 3072 : 18432; break; } + if (prach_fmt == 4) { + idft(get_idft(len), prachF, prach2, 1); + // TODO: account for repeated format in dft output + memmove(prach, prach + 2 * len, Ncp << 2); + prach_len = len + Ncp; + } else { + idft(get_idft(len), prachF, prach2, 1); + memmove(prach, prach + 2 * len, Ncp << 2); + prach_len = len + Ncp; + if (prach_fmt > 1) { + memmove(prach2 + 2 * len, prach2, 73728); + prach_len = 2 * len + Ncp; + } + } //LOG_I(PHY,"prach_len=%d\n",prach_len); AssertFatal(prach_fmt<4, diff --git a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c index fb70eb6196..9d555c62fe 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c @@ -92,41 +92,12 @@ void dft_lte(int32_t *z,struct complex16 *input, int32_t Msc_PUSCH, uint8_t Nsym } // printf("\n"); - + dft_size_idx_t dftsize = get_dft(Msc_PUSCH); switch (Msc_PUSCH) { case 12: - dft(DFT_12,(int16_t *)dft_in0,(int16_t *)dft_out0,0); - dft(DFT_12,(int16_t *)dft_in1,(int16_t *)dft_out1,0); - dft(DFT_12,(int16_t *)dft_in2,(int16_t *)dft_out2,0); - - /* - dft12f(&((simde__m128i *)dft_in0)[0],&((simde__m128i *)dft_in0)[1],&((simde__m128i *)dft_in0)[2],&((simde__m128i - *)dft_in0)[3],&((simde__m128i *)dft_in0)[4],&((simde__m128i *)dft_in0)[5],&((simde__m128i *)dft_in0)[6],&((simde__m128i - *)dft_in0)[7],&((simde__m128i *)dft_in0)[8],&((simde__m128i *)dft_in0)[9],&((simde__m128i *)dft_in0)[10],&((simde__m128i - *)dft_in0)[11], - &((simde__m128i *)dft_out0)[0],&((simde__m128i *)dft_out0)[1],&((simde__m128i *)dft_out0)[2],&((simde__m128i - *)dft_out0)[3],&((simde__m128i *)dft_out0)[4],&((simde__m128i *)dft_out0)[5],&((simde__m128i *)dft_out0)[6],&((simde__m128i - *)dft_out0)[7],&((simde__m128i *)dft_out0)[8],&((simde__m128i *)dft_out0)[9],&((simde__m128i *)dft_out0)[10],&((simde__m128i - *)dft_out0)[11]); - - dft12f(&((simde__m128i *)dft_in1)[0],&((simde__m128i *)dft_in1)[1],&((simde__m128i *)dft_in1)[2],&((simde__m128i - *)dft_in1)[3],&((simde__m128i *)dft_in1)[4],&((simde__m128i *)dft_in1)[5],&((simde__m128i *)dft_in1)[6],&((simde__m128i - *)dft_in1)[7],&((simde__m128i *)dft_in1)[8],&((simde__m128i *)dft_in1)[9],&((simde__m128i *)dft_in1)[10],&((simde__m128i - *)dft_in1)[11], - &((simde__m128i *)dft_out1)[0],&((simde__m128i *)dft_out1)[1],&((simde__m128i *)dft_out1)[2],&((simde__m128i - *)dft_out1)[3],&((simde__m128i *)dft_out1)[4],&((simde__m128i *)dft_out1)[5],&((simde__m128i *)dft_out1)[6],&((simde__m128i - *)dft_out1)[7],&((simde__m128i *)dft_out1)[8],&((simde__m128i *)dft_out1)[9],&((simde__m128i *)dft_out1)[10],&((simde__m128i - *)dft_out1)[11]); - - dft12f(&((simde__m128i *)dft_in2)[0],&((simde__m128i *)dft_in2)[1],&((simde__m128i *)dft_in2)[2],&((simde__m128i - *)dft_in2)[3],&((simde__m128i *)dft_in2)[4],&((simde__m128i *)dft_in2)[5],&((simde__m128i *)dft_in2)[6],&((simde__m128i - *)dft_in2)[7],&((simde__m128i *)dft_in2)[8],&((simde__m128i *)dft_in2)[9],&((simde__m128i *)dft_in2)[10],&((simde__m128i - *)dft_in2)[11], - &((simde__m128i *)dft_out2)[0],&((simde__m128i *)dft_out2)[1],&((simde__m128i *)dft_out2)[2],&((simde__m128i - *)dft_out2)[3],&((simde__m128i *)dft_out2)[4],&((simde__m128i *)dft_out2)[5],&((simde__m128i *)dft_out2)[6],&((simde__m128i - *)dft_out2)[7],&((simde__m128i *)dft_out2)[8],&((simde__m128i *)dft_out2)[9],&((simde__m128i *)dft_out2)[10],&((simde__m128i - *)dft_out2)[11]); - */ + dft(dftsize, (int16_t *)dft_in0, (int16_t *)dft_out0, 0); + dft(dftsize, (int16_t *)dft_in1, (int16_t *)dft_out1, 0); + dft(dftsize, (int16_t *)dft_in2, (int16_t *)dft_out2, 0); norm128 = simde_mm_set1_epi16(9459); for (i = 0; i < 12; i++) { ((simde__m128i *)dft_out0)[i] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(((simde__m128i *)dft_out0)[i], norm128), 1); @@ -136,202 +107,10 @@ void dft_lte(int32_t *z,struct complex16 *input, int32_t Msc_PUSCH, uint8_t Nsym break; - case 24: - dft(DFT_24,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_24,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_24,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 36: - dft(DFT_36,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_36,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_36,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 48: - dft(DFT_48,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_48,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_48,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 60: - dft(DFT_60,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_60,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_60,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 72: - dft(DFT_72,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_72,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_72,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 96: - dft(DFT_96,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_96,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_96,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 108: - dft(DFT_108,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_108,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_108,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 120: - dft(DFT_120,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_120,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_120,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 144: - dft(DFT_144,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_144,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_144,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 180: - dft(DFT_180,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_180,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_180,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 192: - dft(DFT_192,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_192,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_192,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 216: - dft(DFT_216,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_216,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_216,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 240: - dft(DFT_240,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_240,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_240,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 288: - dft(DFT_288,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_288,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_288,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 300: - dft(DFT_300,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_300,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_300,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 324: - dft(DFT_324,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_324,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_324,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 360: - dft(DFT_360,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_360,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_360,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 384: - dft(DFT_384,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_384,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_384,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 432: - dft(DFT_432,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_432,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_432,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 480: - dft(DFT_480,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_480,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_480,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 540: - dft(DFT_540,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_540,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_540,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 576: - dft(DFT_576,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_576,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_576,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 600: - dft(DFT_600,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_600,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_600,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 648: - dft(DFT_648,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_648,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_648,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 720: - dft(DFT_720,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_720,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_720,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 768: - dft(DFT_768,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_768,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_768,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 864: - dft(DFT_864,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_864,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_864,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 900: - dft(DFT_900,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_900,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_900,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 960: - dft(DFT_960,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_960,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_960,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 972: - dft(DFT_972,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_972,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_972,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 1080: - dft(DFT_1080,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_1080,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_1080,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 1152: - dft(DFT_1152,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_1152,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_1152,(int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 1200: - dft(DFT_1200,(int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft(DFT_1200,(int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft(DFT_1200,(int16_t*)dft_in2,(int16_t*)dft_out2,1); + default: + dft(dftsize, (int16_t *)dft_in0, (int16_t *)dft_out0, 1); + dft(dftsize, (int16_t *)dft_in1, (int16_t *)dft_out1, 1); + dft(dftsize, (int16_t *)dft_in2, (int16_t *)dft_out2, 1); break; } diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c index 3285dab149..10cafe7d51 100644 --- a/openair1/PHY/MODULATION/nr_modulation.c +++ b/openair1/PHY/MODULATION/nr_modulation.c @@ -341,236 +341,21 @@ void nr_dft(c16_t *z, c16_t *d, uint32_t Msc_PUSCH) dft_in0[ip] = d[i]; } } - + dft_size_idx_t dftsize = get_dft(Msc_PUSCH); switch (Msc_PUSCH) { case 12: - dft(DFT_12,(int16_t *)dft_in0, (int16_t *)dft_out0,0); - + dft(dftsize, (int16_t *)dft_in0, (int16_t *)dft_out0, 0); norm128 = simde_mm_set1_epi16(9459); - for (i=0; i<12; i++) { - ((simde__m128i*)dft_out0)[i] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(((simde__m128i*)dft_out0)[i], norm128), 1); + for (i = 0; i < 12; i++) { + ((simde__m128i *)dft_out0)[i] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(((simde__m128i *)dft_out0)[i], norm128), 1); } break; - - case 24: - dft(DFT_24,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 36: - dft(DFT_36,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 48: - dft(DFT_48,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 60: - dft(DFT_60,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 72: - dft(DFT_72,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 96: - dft(DFT_96,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 108: - dft(DFT_108,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 120: - dft(DFT_120,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 144: - dft(DFT_144,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 180: - dft(DFT_180,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 192: - dft(DFT_192,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 216: - dft(DFT_216,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 240: - dft(DFT_240,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 288: - dft(DFT_288,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 300: - dft(DFT_300,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 324: - dft(DFT_324,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 360: - dft(DFT_360,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 384: - dft(DFT_384,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 432: - dft(DFT_432,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 480: - dft(DFT_480,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 540: - dft(DFT_540,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 576: - dft(DFT_576,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 600: - dft(DFT_600,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 648: - dft(DFT_648,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 720: - dft(DFT_720,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 768: - dft(DFT_768,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 864: - dft(DFT_864,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 900: - dft(DFT_900,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 960: - dft(DFT_960,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 972: - dft(DFT_972,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1080: - dft(DFT_1080,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1152: - dft(DFT_1152,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1200: - dft(DFT_1200,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1296: - dft(DFT_1296,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1440: - dft(DFT_1440,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1500: - dft(DFT_1500,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1536: - //dft(DFT_1536,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - dft(DFT_1536,(int16_t*)d, (int16_t*)z, 1); - break; - - case 1620: - dft(DFT_1620,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1728: - dft(DFT_1728,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1800: - dft(DFT_1800,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1920: - dft(DFT_1920,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 1944: - dft(DFT_1944,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 2160: - dft(DFT_2160,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 2304: - dft(DFT_2304,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 2400: - dft(DFT_2400,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 2592: - dft(DFT_2592,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 2700: - dft(DFT_2700,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 2880: - dft(DFT_2880,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 2916: - dft(DFT_2916,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 3000: - dft(DFT_3000,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - - case 3072: - //dft(DFT_3072,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - dft(DFT_3072,(int16_t*)d, (int16_t*)z, 1); - break; - - case 3240: - dft(DFT_3240,(int16_t*)dft_in0, (int16_t*)dft_out0, 1); - break; - default: - // should not be reached - LOG_E( PHY, "Unsupported Msc_PUSCH value of %"PRIu16"\n", Msc_PUSCH ); - return; - + dft(dftsize, (int16_t *)dft_in0, (int16_t *)dft_out0, 1); + break; } - if ((Msc_PUSCH % 1536) > 0) { for (i = 0, ip = 0; i < Msc_PUSCH; i++, ip+=4) z[i] = dft_out0[ip]; diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index e32816f76a..8488545355 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -49,39 +49,11 @@ int slot_fep(PHY_VARS_UE *ue, unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; int uespec_pilot[9][1200];*/ - dft_size_idx_t dftsizeidx; int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs - - switch (frame_parms->ofdm_symbol_size) { - case 128: - dftsizeidx = DFT_128; - break; - - case 256: - dftsizeidx = DFT_256; - break; - - case 512: - dftsizeidx = DFT_512; - break; - - case 1024: - dftsizeidx = DFT_1024; - break; - - case 1536: - dftsizeidx = DFT_1536; - break; - - case 2048: - dftsizeidx = DFT_2048; - break; - - default: - dftsizeidx = DFT_512; - break; - } - + int s = frame_parms->ofdm_symbol_size; + if (s != 128 && s != 256 && s != 512 && s != 1024 && s != 1536 && s != 2048) + s = 512; + const dft_size_idx_t dftsizeidx = get_dft(s); if (no_prefix) { subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns%2); @@ -231,38 +203,11 @@ int front_end_fft(PHY_VARS_UE *ue, unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; int uespec_pilot[9][1200];*/ - dft_size_idx_t dftsizeidx; int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs - - switch (frame_parms->ofdm_symbol_size) { - case 128: - dftsizeidx = DFT_128; - break; - - case 256: - dftsizeidx = DFT_256; - break; - - case 512: - dftsizeidx = DFT_512; - break; - - case 1024: - dftsizeidx = DFT_1024; - break; - - case 1536: - dftsizeidx = DFT_1536; - break; - - case 2048: - dftsizeidx = DFT_2048; - break; - - default: - dftsizeidx = DFT_512; - break; - } + int s = frame_parms->ofdm_symbol_size; + if (s != 128 && s != 256 && s != 512 && s != 1024 && s != 1536 && s != 2048) + s = 512; + dft_size_idx_t dftsizeidx = get_dft(s); if (no_prefix) { subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index ae62cc8e9b..fa34219593 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -42,38 +42,10 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue, unsigned int subframe_offset; // int i; unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; - dft_size_idx_t dftsizeidx; - - switch (frame_parms->ofdm_symbol_size) { - case 128: - dftsizeidx = DFT_128; - break; - - case 256: - dftsizeidx = DFT_256; - break; - - case 512: - dftsizeidx = DFT_512; - break; - - case 1024: - dftsizeidx = DFT_1024; - break; - - case 1536: - dftsizeidx = DFT_1536; - break; - - case 2048: - dftsizeidx = DFT_2048; - break; - - default: - dftsizeidx = DFT_512; - break; - } - + int s = frame_parms->ofdm_symbol_size; + if (s != 128 && s != 256 && s != 512 && s != 1024 && s != 1536 && s != 2048) + s = 512; + dft_size_idx_t dftsizeidx = get_dft(s); if (no_prefix) { subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * subframe; } else { @@ -200,52 +172,44 @@ int slot_fep_mbsfn_khz_1dot25(PHY_VARS_UE *ue, int ofdm_symbol_size; unsigned int subframe_offset; unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; - dft_size_idx_t dftsizeidx; AssertFatal(frame_parms->frame_type == FDD, "Frame is TDD!\n"); switch (frame_parms->ofdm_symbol_size) { case 128: - dftsizeidx = DFT_1536; ofdm_symbol_size=1536; nb_prefix_samples=384; break; case 256: - AssertFatal(1==0,"FeMBMS dft3072 not implemented\n"); - dftsizeidx = DFT_3072; + AssertFatal(1 == 0, "FeMBMS dft3072 not implemented\n"); ofdm_symbol_size=3072; nb_prefix_samples=768; break; case 512: - dftsizeidx = DFT_6144; - nb_prefix_samples=1536; ofdm_symbol_size=6144; + nb_prefix_samples = 1536; break; case 1024: - dftsizeidx = DFT_12288; - nb_prefix_samples=3072; ofdm_symbol_size=12288; + nb_prefix_samples = 3072; break; case 1536: - dftsizeidx = DFT_18432; - nb_prefix_samples=4608; ofdm_symbol_size=18432; + nb_prefix_samples = 4608; break; case 2048: - dftsizeidx = DFT_24576; - nb_prefix_samples=6144; ofdm_symbol_size=24576; + nb_prefix_samples = 6144; break; default: AssertFatal(1==0,"Illegal ofdm symbol size %d\n",frame_parms->ofdm_symbol_size); break; } - subframe_offset = frame_parms->samples_per_tti * subframe; #ifdef DEBUG_FEP LOG_D(PHY,"slot_fep_mbsfn125: subframe %d, nb_prefix_samples %d, subframe_offset %d, sample_offset %d\n", subframe, nb_prefix_samples,subframe_offset, @@ -255,7 +219,7 @@ int slot_fep_mbsfn_khz_1dot25(PHY_VARS_UE *ue, for (aa=0; aanb_antennas_rx; aa++) { memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][0],0,ofdm_symbol_size*sizeof(int)); start_UE_TIMING(ue->rx_dft_stats); - dft(dftsizeidx,(int16_t *)&common_vars->rxdata[aa][(sample_offset + + dft(get_dft(ofdm_symbol_size),(int16_t *)&common_vars->rxdata[aa][(sample_offset + nb_prefix_samples + subframe_offset - SOFFSET) % frame_length_samples], diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index ccb7ee5f3e..51c215fe46 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -43,42 +43,13 @@ int slot_fep_ul(RU_t *ru, // unsigned int subframe_offset; unsigned int slot_offset; - - dft_size_idx_t dftsize; - int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs unsigned int frame_length_samples = fp->samples_per_tti * 10; unsigned int rx_offset; - - switch (fp->ofdm_symbol_size) { - case 128: - dftsize = DFT_128; - break; - - case 256: - dftsize = DFT_256; - break; - - case 512: - dftsize = DFT_512; - break; - - case 1024: - dftsize = DFT_1024; - break; - - case 1536: - dftsize = DFT_1536; - break; - - case 2048: - dftsize = DFT_2048; - break; - - default: - dftsize = DFT_512; - break; - } + int s = fp->ofdm_symbol_size; + if (s != 128 && s != 256 && s != 512 && s != 1024 && s != 1536 && s != 2048) + s = 512; + const dft_size_idx_t dftsize = get_dft(s); if (no_prefix) { // subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index e29e3e7b51..82407980fe 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -32,233 +32,21 @@ void nr_idft(int32_t *z, uint32_t Msc_PUSCH) for (i = 0, ip = 0; i < Msc_PUSCH; i++, ip+=4) ((uint32_t*)idft_in0)[ip+0] = z[i]; } - + dft_size_idx_t dftsize = get_dft(Msc_PUSCH); switch (Msc_PUSCH) { case 12: - dft(DFT_12,(int16_t *)idft_in0, (int16_t *)idft_out0,0); + dft(dftsize, (int16_t *)idft_in0, (int16_t *)idft_out0, 0); norm128 = simde_mm_set1_epi16(9459); for (i = 0; i < 12; i++) { - ((simde__m128i*)idft_out0)[i] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(((simde__m128i*)idft_out0)[i], norm128), 1); + ((simde__m128i *)idft_out0)[i] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(((simde__m128i *)idft_out0)[i], norm128), 1); } break; - - case 24: - dft(DFT_24,idft_in0, idft_out0, 1); - break; - - case 36: - dft(DFT_36,idft_in0, idft_out0, 1); - break; - - case 48: - dft(DFT_48,idft_in0, idft_out0, 1); - break; - - case 60: - dft(DFT_60,idft_in0, idft_out0, 1); - break; - - case 72: - dft(DFT_72,idft_in0, idft_out0, 1); - break; - - case 96: - dft(DFT_96,idft_in0, idft_out0, 1); - break; - - case 108: - dft(DFT_108,idft_in0, idft_out0, 1); - break; - - case 120: - dft(DFT_120,idft_in0, idft_out0, 1); - break; - - case 144: - dft(DFT_144,idft_in0, idft_out0, 1); - break; - - case 180: - dft(DFT_180,idft_in0, idft_out0, 1); - break; - - case 192: - dft(DFT_192,idft_in0, idft_out0, 1); - break; - - case 216: - dft(DFT_216,idft_in0, idft_out0, 1); - break; - - case 240: - dft(DFT_240,idft_in0, idft_out0, 1); - break; - - case 288: - dft(DFT_288,idft_in0, idft_out0, 1); - break; - - case 300: - dft(DFT_300,idft_in0, idft_out0, 1); - break; - - case 324: - dft(DFT_324,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 360: - dft(DFT_360,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 384: - dft(DFT_384,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 432: - dft(DFT_432,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 480: - dft(DFT_480,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 540: - dft(DFT_540,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 576: - dft(DFT_576,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 600: - dft(DFT_600,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 648: - dft(DFT_648,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 720: - dft(DFT_720,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 768: - dft(DFT_768,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 864: - dft(DFT_864,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 900: - dft(DFT_900,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 960: - dft(DFT_960,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 972: - dft(DFT_972,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1080: - dft(DFT_1080,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1152: - dft(DFT_1152,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1200: - dft(DFT_1200,idft_in0, idft_out0, 1); - break; - - case 1296: - dft(DFT_1296,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1440: - dft(DFT_1440,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1500: - dft(DFT_1500,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1536: - //dft(DFT_1536,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - idft(IDFT_1536,(int16_t*)z, (int16_t*)z, 1); - break; - - case 1620: - dft(DFT_1620,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1728: - dft(DFT_1728,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1800: - dft(DFT_1800,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1920: - dft(DFT_1920,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 1944: - dft(DFT_1944,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 2160: - dft(DFT_2160,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 2304: - dft(DFT_2304,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 2400: - dft(DFT_2400,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 2592: - dft(DFT_2592,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 2700: - dft(DFT_2700,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 2880: - dft(DFT_2880,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 2916: - dft(DFT_2916,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 3000: - dft(DFT_3000,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - - case 3072: - //dft(DFT_3072,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - idft(IDFT_3072,(int16_t*)z, (int16_t*)z, 1); - break; - - case 3240: - dft(DFT_3240,(int16_t*)idft_in0, (int16_t*)idft_out0, 1); - break; - default: - // should not be reached - LOG_E( PHY, "Unsupported Msc_PUSCH value of %"PRIu16"\n", Msc_PUSCH ); - return; + dft(dftsize, idft_in0, idft_out0, 1); + break; } if ((Msc_PUSCH % 1536) > 0) { @@ -270,10 +58,6 @@ void nr_idft(int32_t *z, uint32_t Msc_PUSCH) ((simde__m128i*)z)[i] = simde_mm_sign_epi16(((simde__m128i*)z)[i], *(simde__m128i*)&conjugate2[0]); } } - - simde_mm_empty(); - simde_m_empty(); - } static void nr_ulsch_extract_rbs(c16_t* const rxdataF, diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index d1ed050f6f..a3fd1b857c 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -572,48 +572,15 @@ typedef enum dft_size_idx { * DESCRIPTION : get dft function depending of ofdm size * *********************************************************************/ +#define FIND_ENUM(Sz) \ + case Sz: \ + return DFT_##Sz; \ + break; static inline dft_size_idx_t get_dft(int ofdm_symbol_size) { switch (ofdm_symbol_size) { - case 128: - return DFT_128; - case 256: - return DFT_256; - case 512: - return DFT_512; - case 768: - return DFT_768; - case 1024: - return DFT_1024; - case 1536: - return DFT_1536; - case 2048: - return DFT_2048; - case 3072: - return DFT_3072; - case 4096: - return DFT_4096; - case 6144: - return DFT_6144; - case 8192: - return DFT_8192; - case 9216: - return DFT_9216; - case 12288: - return DFT_12288; - case 18432: - return DFT_18432; - case 24576: - return DFT_24576; - case 36864: - return DFT_36864; - case 49152: - return DFT_49152; - case 73728: - return DFT_73728; - case 98304: - return DFT_98304; + FOREACH_DFTSZ(FIND_ENUM) default: printf("function get_dft : unsupported ofdm symbol size \n"); assert(0); @@ -654,54 +621,16 @@ struct { * DESCRIPTION : get idft function depending of ofdm size * *********************************************************************/ +#define FIND_iENUM(iSz) \ + case iSz: \ + return IDFT_##iSz; \ + break; + static inline idft_size_idx_t get_idft(int ofdm_symbol_size) { switch (ofdm_symbol_size) { - case 128: - return IDFT_128; - case 256: - return IDFT_256; - case 512: - return IDFT_512; - case 768: - return IDFT_768; - case 1024: - return IDFT_1024; - case 1536: - return IDFT_1536; - case 2048: - return IDFT_2048; - case 3072: - return IDFT_3072; - case 4096: - return IDFT_4096; - case 6144: - return IDFT_6144; - case 8192: - return IDFT_8192; - case 9216: - 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: - return IDFT_98304; + FOREACH_IDFTSZ(FIND_iENUM) default: printf("function get_idft : unsupported ofdm symbol size \n"); assert(0); From 4cf2719bd93447649dc8cc461a4a1d360180e819 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Mon, 14 Oct 2024 11:12:22 +0200 Subject: [PATCH 2/6] scale in DFT16 as per normal scaling sqrt(16) = 4 --- openair1/PHY/TOOLS/oai_dfts.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index e97913633f..140dc7b112 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -1268,17 +1268,16 @@ __attribute__((always_inline)) static inline void dft16_simd256(int16_t *x, int1 x02t = simde_mm256_adds_epi16(xtmp0,xtmp2); x13t = simde_mm256_adds_epi16(xtmp1,xtmp3); - ytmp0 = simde_mm256_adds_epi16(x02t,x13t); - ytmp2 = simde_mm256_subs_epi16(x02t,x13t); + ytmp0 = simde_mm256_srai_epi16(simde_mm256_adds_epi16(x02t, x13t), 2); + ytmp2 = simde_mm256_srai_epi16(simde_mm256_subs_epi16(x02t, x13t), 2); x1_flip = simde_mm256_sign_epi16(xtmp1, *(simde__m256i *)conjugatedft); x1_flip = simde_mm256_shuffle_epi8(x1_flip,complex_shuffle); x3_flip = simde_mm256_sign_epi16(xtmp3, *(simde__m256i *)conjugatedft); x3_flip = simde_mm256_shuffle_epi8(x3_flip,complex_shuffle); x02t = simde_mm256_subs_epi16(xtmp0,xtmp2); x13t = simde_mm256_subs_epi16(x1_flip,x3_flip); - ytmp1 = simde_mm256_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f - ytmp3 = simde_mm256_subs_epi16(x02t,x13t); // x0 - x1f - x2 + x3f - + ytmp1 = simde_mm256_srai_epi16(simde_mm256_adds_epi16(x02t, x13t), 2); // x0 + x1f - x2 - x3f + ytmp3 = simde_mm256_srai_epi16(simde_mm256_subs_epi16(x02t, x13t), 2); // x0 - x1f - x2 + x3f // [y0 y1 y2 y3 y16 y17 y18 y19] // [y4 y5 y6 y7 y20 y21 y22 y23] @@ -1652,14 +1651,14 @@ void dft64(int16_t *x,int16_t *y,unsigned char scale) if (scale>0) { - y256[0] = shiftright_int16_simd256(y256[0],3); - y256[1] = shiftright_int16_simd256(y256[1],3); - y256[2] = shiftright_int16_simd256(y256[2],3); - y256[3] = shiftright_int16_simd256(y256[3],3); - y256[4] = shiftright_int16_simd256(y256[4],3); - y256[5] = shiftright_int16_simd256(y256[5],3); - y256[6] = shiftright_int16_simd256(y256[6],3); - y256[7] = shiftright_int16_simd256(y256[7],3); + y256[0] = shiftright_int16_simd256(y256[0], 1); + y256[1] = shiftright_int16_simd256(y256[1], 1); + y256[2] = shiftright_int16_simd256(y256[2], 1); + y256[3] = shiftright_int16_simd256(y256[3], 1); + y256[4] = shiftright_int16_simd256(y256[4], 1); + y256[5] = shiftright_int16_simd256(y256[5], 1); + y256[6] = shiftright_int16_simd256(y256[6], 1); + y256[7] = shiftright_int16_simd256(y256[7], 1); } simde_mm_empty(); From 5cd5f725332eea7768a76157e5d176799855ce8c Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 29 Oct 2024 18:47:30 +0100 Subject: [PATCH 3/6] case DFT12 processing with specific data organization: remove intermediate pointer --- openair1/PHY/TOOLS/oai_dfts.c | 50 +++++++++++++++++------------------ 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index 140dc7b112..da5d973d37 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -4561,43 +4561,41 @@ __attribute__((always_inline)) static inline void dft12f_simd256(simd256_q15_t * simd256_q15_t tmp_dft12[12]; - simd256_q15_t *tmp_dft12_ptr = &tmp_dft12[0]; - // msg("dft12\n"); bfly4_tw1_256(x0, x3, x6, x9, - tmp_dft12_ptr, - tmp_dft12_ptr+3, - tmp_dft12_ptr+6, - tmp_dft12_ptr+9); + tmp_dft12, + tmp_dft12+3, + tmp_dft12+6, + tmp_dft12+9); bfly4_tw1_256(x1, x4, x7, x10, - tmp_dft12_ptr+1, - tmp_dft12_ptr+4, - tmp_dft12_ptr+7, - tmp_dft12_ptr+10); + tmp_dft12+1, + tmp_dft12+4, + tmp_dft12+7, + tmp_dft12+10); bfly4_tw1_256(x2, x5, x8, x11, - tmp_dft12_ptr+2, - tmp_dft12_ptr+5, - tmp_dft12_ptr+8, - tmp_dft12_ptr+11); + tmp_dft12+2, + tmp_dft12+5, + tmp_dft12+8, + tmp_dft12+11); // k2=0; - bfly3_tw1_256(tmp_dft12_ptr, - tmp_dft12_ptr+1, - tmp_dft12_ptr+2, + bfly3_tw1_256(tmp_dft12, + tmp_dft12+1, + tmp_dft12+2, y0, y4, y8); @@ -4605,9 +4603,9 @@ __attribute__((always_inline)) static inline void dft12f_simd256(simd256_q15_t * // k2=1; - bfly3_256(tmp_dft12_ptr+3, - tmp_dft12_ptr+4, - tmp_dft12_ptr+5, + bfly3_256(tmp_dft12+3, + tmp_dft12+4, + tmp_dft12+5, y1, y5, y9, @@ -4617,9 +4615,9 @@ __attribute__((always_inline)) static inline void dft12f_simd256(simd256_q15_t * // k2=2; - bfly3_256(tmp_dft12_ptr+6, - tmp_dft12_ptr+7, - tmp_dft12_ptr+8, + bfly3_256(tmp_dft12+6, + tmp_dft12+7, + tmp_dft12+8, y2, y6, y10, @@ -4627,9 +4625,9 @@ __attribute__((always_inline)) static inline void dft12f_simd256(simd256_q15_t * W4_12_256); // k2=3; - bfly3_256(tmp_dft12_ptr+9, - tmp_dft12_ptr+10, - tmp_dft12_ptr+11, + bfly3_256(tmp_dft12+9, + tmp_dft12+10, + tmp_dft12+11, y3, y7, y11, From ffa3260ab580dbe9c13c3b21c7770850202ce444 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 29 Oct 2024 12:12:46 +0100 Subject: [PATCH 4/6] Set explicit wd, set LD_LIBRARY_PATH to find dfts.so --- ci-scripts/cls_containerize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 5a3408250a..df7fcf7cda 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -783,7 +783,7 @@ class Containerize(): HTML.CreateHtmlTestRowQueue("Build unit tests", 'OK', [dockerfile]) # it worked, build and execute tests, and close connection - ret = cmd.run(f'docker run -a STDOUT --rm ran-unittests:{baseTag} ctest --output-on-failure --no-label-summary -j$(nproc)') + ret = cmd.run(f'docker run -a STDOUT --workdir /oai-ran/build/ --env LD_LIBRARY_PATH=/oai-ran/build/ --rm ran-unittests:{baseTag} ctest --output-on-failure --no-label-summary -j$(nproc)') cmd.run(f'docker rmi ran-unittests:{baseTag}') build_log_name = f'build_log_{self.testCase_id}' CopyLogsToExecutor(cmd, lSourcePath, build_log_name) From 576d468809c331d7878201f53c2d22f41b2ebc1f Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 29 Oct 2024 18:54:16 +0100 Subject: [PATCH 5/6] Clean up intermediate DFT macros, remove non-existing DFTs DFT for 9216 and 73728 don't exist and/or assert, so remove them from the list. --- openair1/PHY/TOOLS/dfts_load.c | 6 +- openair1/PHY/TOOLS/oai_dfts.c | 37 +---- openair1/PHY/TOOLS/oai_dfts_neon.c | 36 +---- openair1/PHY/TOOLS/tools_defs.h | 218 +++++++++++++---------------- 4 files changed, 117 insertions(+), 180 deletions(-) diff --git a/openair1/PHY/TOOLS/dfts_load.c b/openair1/PHY/TOOLS/dfts_load.c index ec8869b54f..2e4ddb595f 100644 --- a/openair1/PHY/TOOLS/dfts_load.c +++ b/openair1/PHY/TOOLS/dfts_load.c @@ -44,6 +44,8 @@ /* function description array, to be used when loading the dfts/idfts lib */ static loader_shlibfunc_t shlib_fdesc[2]; static char *arg[64] = {"phytest", "-O", "cmdlineonly::dbgl0"}; +dftfunc_t dft; +idftfunc_t idft; int load_dftslib(void) { char *ptr = (char *)config_get_if(); @@ -51,8 +53,8 @@ int load_dftslib(void) uniqCfg = load_configmodule(3, (char **)arg, CONFIG_ENABLECMDLINEONLY); logInit(); } - shlib_fdesc[0].fname = "dft"; - shlib_fdesc[1].fname = "idft"; + shlib_fdesc[0].fname = "dft_implementation"; + shlib_fdesc[1].fname = "idft_implementation"; int ret = load_module_shlib("dfts", shlib_fdesc, sizeof(shlib_fdesc) / sizeof(loader_shlibfunc_t), NULL); AssertFatal((ret >= 0), "Error loading dftsc decoder"); dft = (dftfunc_t)shlib_fdesc[0].fptr; diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index da5d973d37..dcb206b5a4 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -3594,19 +3594,6 @@ void dft6144(int16_t *input, int16_t *output,unsigned char scale) simde_m_empty(); } -int16_t twa9216[6144] __attribute__((aligned(32))); -int16_t twb9216[6144] __attribute__((aligned(32))); -// 3072 x 3 -void dft9216(int16_t *input, int16_t *output,uint8_t scale) { - - AssertFatal(1==0,"Need to do this ..\n"); -} - -void idft9216(int16_t *input, int16_t *output,uint8_t scale) { - - AssertFatal(1==0,"Need to do this ..\n"); -} - int16_t twa12288[8192] __attribute__((aligned(32))); int16_t twb12288[8192] __attribute__((aligned(32))); // 4096 x 3 @@ -4233,20 +4220,6 @@ void idft65536(int16_t *x,int16_t *y,unsigned char scale) simde_m_empty(); } -int16_t twa73728[49152] __attribute__((aligned(32))); -int16_t twb73728[49152] __attribute__((aligned(32))); -// 24576 x 3 -void dft73728(int16_t *input, int16_t *output,uint8_t scale) { - - AssertFatal(1==0,"Need to do this ..\n"); -} - -void idft73728(int16_t *input, int16_t *output,uint8_t scale) { - - AssertFatal(1==0,"Need to do this ..\n"); -} - - int16_t twa98304[65536] __attribute__((aligned(32))); int16_t twb98304[65536] __attribute__((aligned(32))); // 32768 x 3 @@ -7905,8 +7878,9 @@ int dfts_autoinit(void) #ifndef MR_MAIN -void dft(uint8_t sizeidx, int16_t *input,int16_t *output,unsigned char scale_flag){ - AssertFatal((sizeidx >= 0 && sizeidx= 0 && sizeidx=0 && sizeidx=0 && sizeidx= 0 && sizeidx= 0 && sizeidx=0 && sizeidx=0 && sizeidx Date: Tue, 29 Oct 2024 18:54:48 +0100 Subject: [PATCH 6/6] Add functional test for DFT --- openair1/PHY/TOOLS/tests/CMakeLists.txt | 6 ++ openair1/PHY/TOOLS/tests/test_dft.c | 138 ++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 openair1/PHY/TOOLS/tests/test_dft.c diff --git a/openair1/PHY/TOOLS/tests/CMakeLists.txt b/openair1/PHY/TOOLS/tests/CMakeLists.txt index 2b846a8cd3..9480af781f 100644 --- a/openair1/PHY/TOOLS/tests/CMakeLists.txt +++ b/openair1/PHY/TOOLS/tests/CMakeLists.txt @@ -15,3 +15,9 @@ target_link_libraries(test_log2_approx PRIVATE GTest::gtest LOG minimal_lib) add_dependencies(tests test_log2_approx) add_test(NAME test_log2_approx COMMAND ./test_log2_approx --gtest_filter=-log2_approx.complete) + +add_executable(dft_test test_dft.c ../dfts_load.c) +target_link_libraries(dft_test minimal_lib shlib_loader SIMU m) +add_dependencies(tests dft_test) +add_dependencies(dft_test dfts) # trigger build of dfts (shared lib for DFT) +add_test(NAME dft_test COMMAND ./dft_test) diff --git a/openair1/PHY/TOOLS/tests/test_dft.c b/openair1/PHY/TOOLS/tests/test_dft.c new file mode 100644 index 0000000000..8b4c344c6c --- /dev/null +++ b/openair1/PHY/TOOLS/tests/test_dft.c @@ -0,0 +1,138 @@ +#include +#include +#include "openair1/PHY/TOOLS/tools_defs.h" +#include "openair1/SIMULATION/TOOLS/sim.h" +#include "common/utils/utils.h" + +// should be FOREACH_DFTSZ but we restrict to tested DFT sizes +#define FOREACH_DFTSZ_working(SZ_DEF) \ + SZ_DEF(12) \ + SZ_DEF(64) \ + SZ_DEF(128) \ + SZ_DEF(256) \ + SZ_DEF(512) \ + SZ_DEF(768) \ + SZ_DEF(1024) \ + SZ_DEF(1536) \ + SZ_DEF(2048) \ + SZ_DEF(4096) \ + SZ_DEF(6144) \ + SZ_DEF(8192) \ + SZ_DEF(12288) + +#define SZ_PTR(Sz) {Sz}, +struct { + int size; +} const dftFtab[] = {FOREACH_DFTSZ_working(SZ_PTR)}; + +#define SZ_iPTR(Sz) {Sz}, +struct { + int size; +} const idftFtab[] = {FOREACH_IDFTSZ(SZ_iPTR)}; + +bool error(c16_t v16, cd_t vd, double percent) +{ + cd_t err = {abs(v16.r - vd.r), abs(v16.i - vd.i)}; + if (err.r < 10 && err.i < 10) + return false; // ignore quantization noise + int denomr = min(abs(v16.r), abs(vd.r)); + if (denomr && err.r / denomr > percent / 100) + return true; + int denomi = min(abs(v16.i), abs(vd.i)); + if (denomi && err.i / denomi > percent / 100) + return true; + return false; +} + +void math_dft(cd_t *in, cd_t *out, int len) +{ + for (int k = 0; k < len; k++) { + cd_t tmp = {0}; + // wrote this way to help gcc to generate SIMD + double phi[len], sint[len], cost[len]; + for (int n = 0; n < len; n++) + phi[n] = -2 * M_PI * ((double)k / len) * n; + for (int n = 0; n < len; n++) + sint[n] = sin(phi[n]); + for (int n = 0; n < len; n++) + cost[n] = cos(phi[n]); + for (int n = 0; n < len; n++) { + cd_t coeff = {.r = cost[n], .i = sint[n]}; + cd_t component = cdMul(coeff, in[n]); + tmp.r += component.r; + tmp.i += component.i; + } + out[k].r = tmp.r / sqrt(len); + out[k].i = tmp.i / sqrt(len); + } +} + +int main(void) +{ + int ret = 0; + load_dftslib(); + c16_t *d16 = malloc16(12 * dftFtab[sizeofArray(dftFtab) - 1].size * sizeof(*d16)); + c16_t *o16 = malloc16(12 * dftFtab[sizeofArray(dftFtab) - 1].size * sizeof(*d16)); + for (int sz = 0; sz < sizeofArray(dftFtab); sz++) { + const int n = dftFtab[sz].size; + cd_t data[n]; + double coeffs[] = {0.25, 0.5, 1, 1.5, 2, 2.5, 3}; + cd_t out[n]; + for (int i = 0; i < n; i++) { + data[i].r = gaussZiggurat(0, 1.0); // gaussZiggurat not used paramters, to fix + data[i].i = gaussZiggurat(0, 1.0); + } + math_dft(data, out, n); + double evm[sizeofArray(coeffs)] = {0}; + double samples[sizeofArray(coeffs)] = {0}; + for (int coeff = 0; coeff < sizeofArray(coeffs); coeff++) { + double expand = coeffs[coeff] * SHRT_MAX / sqrt(n); + if (n == 12) { + for (int i = 0; i < n; i++) + for (int j = 0; j < 4; j++) { + d16[i * 4 + j].r = expand * data[i].r; + d16[i * 4 + j].i = expand * data[i].i; + } + } else { + for (int i = 0; i < n; i++) { + d16[i].r = expand * data[i].r; + d16[i].i = expand * data[i].i; + } + } + dft(get_dft(n), (int16_t *)d16, (int16_t *)o16, 1); + if (n == 12) { + for (int i = 0; i < n; i++) { + cd_t error = {.r = o16[i * 4].r / (expand * sqrt(n)) - out[i].r, .i = o16[i * 4].i / (expand * sqrt(n)) - out[i].i}; + evm[coeff] += sqrt(squaredMod(error)) / sqrt(squaredMod(out[i])); + samples[coeff] += sqrt(squaredMod(d16[i])); + } + } else { + for (int i = 0; i < n; i++) { + cd_t error = {.r = o16[i].r / expand - out[i].r, .i = o16[i].i / expand - out[i].i}; + evm[coeff] += sqrt(squaredMod(error)) / sqrt(squaredMod(out[i])); + samples[coeff] += sqrt(squaredMod(d16[i])); + /* + if (error(o16[i], out[i], 5)) + printf("Error in dft %d at %d, (%d, %d) != %f, %f)\n", n, i, o16[i].r, o16[i].i, gslout[i].r, gslout[i].i); + */ + } + } + } + printf("done DFT size %d (evm (%%), avg samples amplitude) = ", n); + for (int coeff = 0; coeff < sizeofArray(coeffs); coeff++) + printf("(%.2f, %.0f) ", (evm[coeff] / n) * 100, samples[coeff] / n); + printf("\n"); + int i; + for (i = 0; i < sizeofArray(coeffs); i++) + if (evm[i] / n < 0.01) + break; + if (i == sizeofArray(coeffs)) { + printf("DFT size: %d, minimum error is more than 1%%, setting the test as failed\n", n); + ret = 1; + } + fflush(stdout); + } + free(d16); + free(o16); + return ret; +}