diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index 57f4a6f7ab983b27464a9592ad877fbbe423194d..c612893c5cfa90ff808771857a83974389b6391b 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -50,6 +50,10 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, void (*dft)(int16_t *,int16_t *, int); + int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs + unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; + unsigned int rx_offset; + switch (frame_parms->ofdm_symbol_size) { case 128: dft = dft128; @@ -103,28 +107,37 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, #endif for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { - + rx_offset = slot_offset +nb_prefix_samples0; if (l==0) { - dft( -#ifndef OFDMA_ULSCH - (int16_t *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][slot_offset + - nb_prefix_samples0], -#else - (int16_t *)&eNB_common_vars->rxdata[eNB_id][aa][((frame_parms->samples_per_tti>>1)*Ns) + - nb_prefix_samples0], -#endif - (int16_t *)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol],1); + dft( (int16_t *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][rx_offset], + (int16_t *)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol], + 1 + ); } else { - dft( -#ifndef OFDMA_ULSCH - (short *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][slot_offset + -#else - (short *)&eNB_common_vars->rxdata[eNB_id][aa][((frame_parms->samples_per_tti>>1)*Ns) + -#endif - (frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + - (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1)], - (short*)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol],1); + rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l; + if(rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) + { + memcpy((void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][frame_length_samples], + (void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][0], + frame_parms->ofdm_symbol_size*sizeof(int)); + } + + if( (rx_offset & 7) != 0){ + memcpy((void *)&tmp_dft_in, + (void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][(rx_offset % frame_length_samples)], + frame_parms->ofdm_symbol_size*sizeof(int)); + dft( (short *) tmp_dft_in, + (short*) &eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol], + 1 + ); + } + else{ + dft( (short *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][rx_offset], + (short*)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol], + 1 + ); + } } }