Merge remote-tracking branch 'origin/add-functional-test-dft' into integration_2024_w44 (!2988)

Add functional DFT test

- clean up code on (i)dft calls
- add DFT test for some DFT sizes against trivial implementation: it
  tests a simple square signal in only real values
- correctly scale DFT-16
This commit is contained in:
Robert Schmidt
2024-10-31 08:40:21 +01:00
21 changed files with 499 additions and 1694 deletions
+1 -1
View File
@@ -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)
@@ -53,28 +53,23 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
// do ifft of channel estimate
int len=0;
switch(frame_parms->N_RB_DL) {
case 6:
dft(DFT_128,(int16_t*) &lte_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*) &lte_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*) &lte_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*) &lte_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);
@@ -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; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
for (p=0; p<ue->frame_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);
}
@@ -721,44 +721,37 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue,
// do ifft of channel estimate
for (aa=0; aa<ue->frame_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; aa<ue->frame_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);
}
+31 -49
View File
@@ -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);
}
@@ -222,33 +222,25 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
for(i=0; i<Msc_RS; i++)
((int32_t *)temp_in_ifft_0)[i] = ul_ch_estimates[aa][symbol_offset+i];
int len;
switch(frame_parms->N_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; i<Msc_RS; i++)
((int32_t *)temp_in_ifft_0)[i] = ul_ch_estimates[aa][symbol_offset+i];
int len;
switch(frame_parms->N_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)
+13 -79
View File
@@ -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) {
+7 -208
View File
@@ -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; i<Msc_PUSCH; i++,ip+=4) {
@@ -391,9 +193,6 @@ void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) {
((simde__m128i *)z11)[i]=simde_mm_sign_epi16(((simde__m128i *)z11)[i],*(simde__m128i *)&conjugate2[0]);
}
}
simde_mm_empty();
simde_m_empty();
}
+24 -113
View File
@@ -325,139 +325,50 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
prach2 = prach+(Ncp<<1);
// do IDFT
idft_size_idx_t len = 0;
switch (ue->frame_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,
@@ -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;
}
+6 -221
View File
@@ -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];
+8 -63
View File
@@ -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);
+10 -46
View File
@@ -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; aa<frame_parms->nb_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],
+4 -33
View File
@@ -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);
@@ -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,
+4 -2
View File
@@ -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;
+42 -70
View File
@@ -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();
@@ -3595,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
@@ -4234,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
@@ -4562,43 +4534,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);
@@ -4606,9 +4576,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,
@@ -4618,9 +4588,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,
@@ -4628,9 +4598,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,
@@ -7908,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<DFT_SIZE_IDXTABLESIZE),"Invalid dft size index %i\n",sizeidx);
void dft_implementation(uint8_t sizeidx, int16_t *input, int16_t *output, unsigned char scale_flag)
{
AssertFatal((sizeidx >= 0 && sizeidx<DFT_SIZE_IDXTABLESIZE),"Invalid dft size index %i\n",sizeidx);
int algn=0xF;
if ( (dft_ftab[sizeidx].size%3) != 0 ) // there is no AVX2 implementation for multiples of 3 DFTs
algn=0x1F;
@@ -7926,8 +7897,9 @@ void dft(uint8_t sizeidx, int16_t *input,int16_t *output,unsigned char scale_fla
dft_ftab[sizeidx].func(input,output,scale_flag);
};
void idft(uint8_t sizeidx, int16_t *input,int16_t *output,unsigned char scale_flag){
AssertFatal((sizeidx>=0 && sizeidx<DFT_SIZE_IDXTABLESIZE),"Invalid idft size index %i\n",sizeidx);
void idft_implementation(uint8_t sizeidx, int16_t *input, int16_t *output, unsigned char scale_flag)
{
AssertFatal((sizeidx>=0 && sizeidx<DFT_SIZE_IDXTABLESIZE),"Invalid idft size index %i\n",sizeidx);
int algn=0xF;
algn=0x1F;
AssertFatal( ((intptr_t)output&algn)==0,"Buffers should be 16 bytes aligned %p",output);
+6 -30
View File
@@ -3029,19 +3029,6 @@ void dft6144(int16_t *input, int16_t *output,unsigned char scale)
}
}
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
@@ -3649,19 +3636,6 @@ void idft65536(int16_t *x,int16_t *y,unsigned char scale)
simde_mm_empty();
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)));
@@ -7125,8 +7099,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<DFT_SIZE_IDXTABLESIZE),"Invalid dft size index %i\n",sizeidx);
void dft_implementation(uint8_t sizeidx, int16_t *input, int16_t *output, unsigned char scale_flag)
{
AssertFatal((sizeidx >= 0 && sizeidx<DFT_SIZE_IDXTABLESIZE),"Invalid dft size index %i\n",sizeidx);
int algn=0xF;
AssertFatal(((intptr_t)output&algn)==0,"Buffers should be aligned %p",output);
if (((intptr_t)input)&algn) {
@@ -7141,8 +7116,9 @@ void dft(uint8_t sizeidx, int16_t *input,int16_t *output,unsigned char scale_fla
dft_ftab[sizeidx].func(input,output,scale_flag);
};
void idft(uint8_t sizeidx, int16_t *input,int16_t *output,unsigned char scale_flag){
AssertFatal((sizeidx>=0 && sizeidx<DFT_SIZE_IDXTABLESIZE),"Invalid idft size index %i\n",sizeidx);
void idft_implementation(uint8_t sizeidx, int16_t *input, int16_t *output, unsigned char scale_flag)
{
AssertFatal((sizeidx>=0 && sizeidx<DFT_SIZE_IDXTABLESIZE),"Invalid idft size index %i\n",sizeidx);
int algn=0xF;
AssertFatal( ((intptr_t)output&algn)==0,"Buffers should be 16 bytes aligned %p",output);
if (((intptr_t)input)&algn ) {
+6
View File
@@ -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)
+138
View File
@@ -0,0 +1,138 @@
#include <stdio.h>
#include <math.h>
#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;
}
+112 -199
View File
@@ -431,136 +431,110 @@ void init_fft(uint16_t size,
uint16_t *rev);
#define FOREACH_DFTSZ(SZ_DEF) \
SZ_DEF(12) \
SZ_DEF(24) \
SZ_DEF(36) \
SZ_DEF(48) \
SZ_DEF(60) \
SZ_DEF(64) \
SZ_DEF(72) \
SZ_DEF(96) \
SZ_DEF(108) \
SZ_DEF(120) \
SZ_DEF(128) \
SZ_DEF(144) \
SZ_DEF(180) \
SZ_DEF(192) \
SZ_DEF(216) \
SZ_DEF(240) \
SZ_DEF(256) \
SZ_DEF(288) \
SZ_DEF(300) \
SZ_DEF(324) \
SZ_DEF(360) \
SZ_DEF(384) \
SZ_DEF(432) \
SZ_DEF(480) \
SZ_DEF(512) \
SZ_DEF(540) \
SZ_DEF(576) \
SZ_DEF(600) \
SZ_DEF(648) \
SZ_DEF(720) \
SZ_DEF(768) \
SZ_DEF(864) \
SZ_DEF(900) \
SZ_DEF(960) \
SZ_DEF(972) \
SZ_DEF(1024) \
SZ_DEF(1080) \
SZ_DEF(1152) \
SZ_DEF(1200) \
SZ_DEF(1296) \
SZ_DEF(1440) \
SZ_DEF(1500) \
SZ_DEF(1536) \
SZ_DEF(1620) \
SZ_DEF(1728) \
SZ_DEF(1800) \
SZ_DEF(1920) \
SZ_DEF(1944) \
SZ_DEF(2048) \
SZ_DEF(2160) \
SZ_DEF(2304) \
SZ_DEF(2400) \
SZ_DEF(2592) \
SZ_DEF(2700) \
SZ_DEF(2880) \
SZ_DEF(2916) \
SZ_DEF(3000) \
SZ_DEF(3072) \
SZ_DEF(3240) \
SZ_DEF(4096) \
SZ_DEF(6144) \
SZ_DEF(8192) \
SZ_DEF(9216) \
SZ_DEF(12288) \
SZ_DEF(18432) \
SZ_DEF(24576) \
SZ_DEF(36864) \
SZ_DEF(49152) \
SZ_DEF(73728) \
SZ_DEF(12) \
SZ_DEF(24) \
SZ_DEF(36) \
SZ_DEF(48) \
SZ_DEF(60) \
SZ_DEF(64) \
SZ_DEF(72) \
SZ_DEF(96) \
SZ_DEF(108) \
SZ_DEF(120) \
SZ_DEF(128) \
SZ_DEF(144) \
SZ_DEF(180) \
SZ_DEF(192) \
SZ_DEF(216) \
SZ_DEF(240) \
SZ_DEF(256) \
SZ_DEF(288) \
SZ_DEF(300) \
SZ_DEF(324) \
SZ_DEF(360) \
SZ_DEF(384) \
SZ_DEF(432) \
SZ_DEF(480) \
SZ_DEF(512) \
SZ_DEF(540) \
SZ_DEF(576) \
SZ_DEF(600) \
SZ_DEF(648) \
SZ_DEF(720) \
SZ_DEF(768) \
SZ_DEF(864) \
SZ_DEF(900) \
SZ_DEF(960) \
SZ_DEF(972) \
SZ_DEF(1024) \
SZ_DEF(1080) \
SZ_DEF(1152) \
SZ_DEF(1200) \
SZ_DEF(1296) \
SZ_DEF(1440) \
SZ_DEF(1500) \
SZ_DEF(1536) \
SZ_DEF(1620) \
SZ_DEF(1728) \
SZ_DEF(1800) \
SZ_DEF(1920) \
SZ_DEF(1944) \
SZ_DEF(2048) \
SZ_DEF(2160) \
SZ_DEF(2304) \
SZ_DEF(2400) \
SZ_DEF(2592) \
SZ_DEF(2700) \
SZ_DEF(2880) \
SZ_DEF(2916) \
SZ_DEF(3000) \
SZ_DEF(3072) \
SZ_DEF(3240) \
SZ_DEF(4096) \
SZ_DEF(6144) \
SZ_DEF(8192) \
SZ_DEF(12288) \
SZ_DEF(18432) \
SZ_DEF(24576) \
SZ_DEF(36864) \
SZ_DEF(49152) \
SZ_DEF(98304)
#define FOREACH_IDFTSZ(SZ_DEF)\
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(3072) \
SZ_DEF(4096) \
SZ_DEF(6144) \
SZ_DEF(8192) \
SZ_DEF(9216) \
SZ_DEF(12288) \
SZ_DEF(16384) \
SZ_DEF(18432) \
SZ_DEF(24576) \
SZ_DEF(32768) \
SZ_DEF(36864) \
SZ_DEF(49152) \
SZ_DEF(65536) \
SZ_DEF(73728) \
#define FOREACH_IDFTSZ(SZ_DEF) \
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(3072) \
SZ_DEF(4096) \
SZ_DEF(6144) \
SZ_DEF(8192) \
SZ_DEF(12288) \
SZ_DEF(16384) \
SZ_DEF(18432) \
SZ_DEF(24576) \
SZ_DEF(32768) \
SZ_DEF(36864) \
SZ_DEF(49152) \
SZ_DEF(65536) \
SZ_DEF(98304)
#ifdef OAIDFTS_MAIN
typedef void(*adftfunc_t)(int16_t *sigF,int16_t *sig,unsigned char scale_flag);
typedef void(*aidftfunc_t)(int16_t *sigF,int16_t *sig,unsigned char scale_flag);
#define SZ_FUNC(Sz) void dft ## Sz(int16_t *x,int16_t *y,uint8_t scale_flag);
FOREACH_DFTSZ(SZ_FUNC)
#define SZ_iFUNC(Sz) void idft ## Sz(int16_t *x,int16_t *y,uint8_t scale_flag);
FOREACH_IDFTSZ(SZ_iFUNC)
#else
typedef void(*dftfunc_t)(uint8_t sizeidx,int16_t *sigF,int16_t *sig,unsigned char scale_flag);
typedef void(*idftfunc_t)(uint8_t sizeidx,int16_t *sigF,int16_t *sig,unsigned char scale_flag);
# ifdef OAIDFTS_LOADER
dftfunc_t dft;
idftfunc_t idft;
# else
typedef void (*idftfunc_t)(uint8_t sizeidx, int16_t *sigF, int16_t *sig, unsigned char scale_flag);
extern dftfunc_t dft;
extern idftfunc_t idft;
extern int load_dftslib(void);
# endif
#endif
#define SZ_ENUM(Sz) DFT_ ## Sz,
int load_dftslib(void);
#define SZ_ENUM(Sz) DFT_##Sz,
typedef enum dft_size_idx {
FOREACH_DFTSZ(SZ_ENUM)
DFT_SIZE_IDXTABLESIZE
} dft_size_idx_t;
#define SZ_iENUM(Sz) IDFT_ ## Sz,
/*******************************************************************
*
* NAME : get_dft
@@ -572,48 +546,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);
@@ -622,13 +563,23 @@ dft_size_idx_t get_dft(int ofdm_symbol_size)
return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function;
}
#define SZ_iENUM(Sz) IDFT_##Sz,
typedef enum idft_size_idx {
FOREACH_IDFTSZ(SZ_iENUM)
IDFT_SIZE_IDXTABLESIZE
} idft_size_idx_t;
#ifdef OAIDFTS_MAIN
typedef void (*adftfunc_t)(int16_t *sigF, int16_t *sig, unsigned char scale_flag);
typedef void (*aidftfunc_t)(int16_t *sigF, int16_t *sig, unsigned char scale_flag);
#define SZ_FUNC(Sz) void dft##Sz(int16_t *x, int16_t *y, uint8_t scale_flag);
FOREACH_DFTSZ(SZ_FUNC)
#define SZ_iFUNC(Sz) void idft##Sz(int16_t *x, int16_t *y, uint8_t scale_flag);
FOREACH_IDFTSZ(SZ_iFUNC)
#define SZ_PTR(Sz) {dft ## Sz,Sz},
struct {
adftfunc_t func;
@@ -654,54 +605,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);