diff --git a/cmake_targets/lte-simulators/CMakeLists.txt b/cmake_targets/lte-simulators/CMakeLists.txt index 7a0e84b425a8d7493e221ab3e256e7b7486e138f..0b706c8748eae45600e328daef5f39038396170d 100644 --- a/cmake_targets/lte-simulators/CMakeLists.txt +++ b/cmake_targets/lte-simulators/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8) set(PACKAGE_NAME "unitary_tests_simulators") set(PHYSIM True) set(RF_BOARD None) -set(XFORMS False) +set(XFORMS True) set(DEBUG_PHY False) set(MU_RECIEVER False) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 6474e83dd91438e04a4b021d83637ff8ac2eda33..b74de2cb1a17d90f956c3ba99404b303f87088b7 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -2791,8 +2791,16 @@ PMI_FEEDBACK: random_channel(eNB2UE[2],0); random_channel(eNB2UE[3],0); } - } - + + if (PHY_vars_UE->perfect_ce==1) { + // fill in perfect channel estimates + freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); + /* + write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8); + write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1,1,8); + */ + } + } if(abstx) { if (trials==0 && round==0) { @@ -2938,11 +2946,6 @@ PMI_FEEDBACK: if (PHY_vars_UE->perfect_ce==1) { if (awgn_flag==0) { - // fill in perfect channel estimates - freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); - - //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8); - //write_output("channelF.m","chF",desc1->chF[0],nb_samples,1,8); for(k=0; k<NUMBER_OF_eNB_MAX; k++) { for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c index 3720d9f99895becb2388bac4830cbb56ead1809a..591b238acfafdd32d00cddeccd2a66d42cbb308c 100644 --- a/openair1/SIMULATION/TOOLS/abstraction.c +++ b/openair1/SIMULATION/TOOLS/abstraction.c @@ -45,7 +45,7 @@ double **cos_lut=NULL,**sin_lut=NULL; -void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) +int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) { @@ -54,15 +54,17 @@ void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) int16_t f; uint8_t l; + if ((n_samples&1)==0) { + fprintf(stderr, "freq_channel_init: n_samples has to be odd\n"); + return(-1); + } cos_lut = (double **)malloc(n_samples*sizeof(double*)); sin_lut = (double **)malloc(n_samples*sizeof(double*)); - - delta_f = nb_rb*180000/(n_samples-1); - for (f=-(n_samples>>1); f<(n_samples>>1); f++) { + for (f=-(n_samples>>1); f<=(n_samples>>1); f++) { freq=delta_f*(double)f*1e-6;// due to the fact that delays is in mus cos_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double)); @@ -81,9 +83,11 @@ void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) } } + + return(0); } -void freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) +int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) { @@ -93,22 +97,32 @@ void freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) static int freq_channel_init=0; static int n_samples_max=0; - // printf("no of samples:%d,",n_samples); + // do some error checking + // n_samples has to be a odd number because we assume the spectrum is symmetric around the DC and includes the DC + if ((n_samples&1)==0) { + fprintf(stderr, "freq_channel: n_samples has to be odd\n"); + return(-1); + } + // printf("no of taps:%d,",(int)desc->nb_taps); if (freq_channel_init == 0) { // we are initializing the lut for the largets possible n_samples=12*nb_rb+1 // if called with n_samples<12*nb_rb+1, we decimate the lut n_samples_max=12*nb_rb+1; - init_freq_channel(desc,nb_rb,n_samples_max); - freq_channel_init=1; + if (init_freq_channel(desc,nb_rb,n_samples_max)==0) + freq_channel_init=1; + else + return(-1); } - d=n_samples_max/n_samples; + d=(n_samples_max-1)/(n_samples-1); + + //printf("no_samples=%d, n_samples_max=%d, d=%d\n",n_samples,n_samples_max,d); start_meas(&desc->interp_freq); - for (f=-n_samples_max/2,f2=-n_samples/2; f<n_samples_max/2; f+=d,f2++) { + for (f=-n_samples_max/2,f2=-n_samples/2; f<=n_samples_max/2; f+=d,f2++) { clut = cos_lut[n_samples_max/2+f]; slut = sin_lut[n_samples_max/2+f]; @@ -129,6 +143,8 @@ void freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) } stop_meas(&desc->interp_freq); + + return(0); } double compute_pbch_sinr(channel_desc_t *desc, diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index 0dfea70b890febf0a422674fb05dc33d2c13f95d..c72ea743b1e7a7cfadf39a525c8fd35a9862a090 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -354,8 +354,8 @@ int gauss(unsigned int *gauss_LUT,unsigned char Nbits); double gaussdouble(double,double); void randominit(unsigned int seed_init); double uniformrandom(void); -void freq_channel(channel_desc_t *desc,uint16_t nb_rb, int16_t n_samples); -void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples); +int freq_channel(channel_desc_t *desc,uint16_t nb_rb, int16_t n_samples); +int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples); uint8_t multipath_channel_nosigconv(channel_desc_t *desc); void multipath_tv_channel(channel_desc_t *desc, double **tx_sig_re,