Commit d4a81046 authored by lfarizav's avatar lfarizav

Implementing SSE (float) in the channel model

parent 5a51235e
......@@ -326,7 +326,7 @@ int32_t signal_energy_nodc(int32_t *,uint32_t);
\brief Computes the signal energy per subcarrier
*/
double signal_energy_fp(double *s_re[2], double *s_im[2], uint32_t nb_antennas, uint32_t length,uint32_t offset);
float signal_energy_fp_SSE_float(float *s_re[2], float *s_im[2], uint32_t nb_antennas, uint32_t length,uint32_t offset);
/*!\fn double signal_energy_fp2(struct complex *, uint32_t);
\brief Computes the signal energy per subcarrier
*/
......
......@@ -331,6 +331,19 @@ double signal_energy_fp(double *s_re[2],double *s_im[2],uint32_t nb_antennas,uin
return(V/length/nb_antennas);
}
#endif
float signal_energy_fp_SSE_float(float *s_re[2],float *s_im[2],uint32_t nb_antennas,uint32_t length,uint32_t offset)
{
int32_t aa,i;
float V=0.0;
for (i=0; i<length; i++) {
for (aa=0; aa<nb_antennas; aa++) {
V= V + (s_re[aa][i+offset]*s_re[aa][i+offset]) + (s_im[aa][i+offset]*s_im[aa][i+offset]);
}
}
return(V/length/nb_antennas);
}
double signal_energy_fp2(struct complex *s,uint32_t length)
{
......
......@@ -36,19 +36,47 @@ void adc(double *r_re[2],
{
int i;
int aa;
__m128i r_re128, r_im128, output_re128, output_im128;
__m128d gain128
__m128d r_re128,r_im128,gain128;
double gain = (double)(1<<(B-1));
gain128=_mm_set1_pd(gain);
for (i=0; i<(length>>1); i++) {//SSE can process 8 shorts in parallel (length>>3)
for (i=0; i<(length>>1); i++) {
for (aa=0; aa<nb_rx_antennas; aa++) {
r_re128=_mm_loadu_pd(&r_re[aa][2*i+input_offset]]);
r_im128=_mm_loadu_pd(&r_im[aa][2*i+input_offset]]);
r_re128=_mm_loadu_pd(&r_re[aa][2*i+input_offset]);
r_im128=_mm_loadu_pd(&r_im[aa][2*i+input_offset]);
r_re128=_mm_mul_pd(r_re128,gain128);
r_im128=_mm_mul_pd(r_im128,gain128);
((short *)output[aa])[((2*i+output_offset)<<1)]=_mm_cvttsd_si32(r_re128);
((short *)output[aa])[1+((2*i+output_offset)<<1)]=_mm_cvtsd_si32(r_re128);
}
}
}
#else
void adc(double *r_re[2],
double *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
unsigned int **output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B)
{
int i;
int aa;
//FILE *file1=NULL;
//FILE *file2=NULL;
//file1 = fopen("adc1","w+");
//file1 = fopen("adc2","w+");
double gain = (double)(1<<(B-1));
//double gain = 1.0;
//for (i=0;i<length;i++){
// fprintf(file1,"%d\t%d\t%d\t%d\t%d\n",i,(short)(r_re[0][i+input_offset]*gain),(short)(r_im[0][i+input_offset]*gain),output_offset/14336,i+output_offset);
// }
for (i=0; i<length; i++) {
for (aa=0; aa<nb_rx_antennas; aa++) {
((short *)output[aa])[((i+output_offset)<<1)] = (short)(r_re[aa][i+input_offset]*gain);
((short *)output[aa])[1+((i+output_offset)<<1)] = (short)(r_im[aa][i+input_offset]*gain);
//if (i>10 && i<20)
//printf("Adc outputs %d (%d,%d)-(%d,%d)\n",i+output_offset,((short *)output[aa])[((i+output_offset)<<1)],((short *)output[aa])[1+((i+output_offset)<<1)],(short)(r_re[aa][i+input_offset]*gain),(short)(r_im[aa][i+input_offset]*gain));
if ((r_re[aa][i+input_offset]*gain) > 30000) {
//("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
......@@ -56,9 +84,9 @@ void adc(double *r_re[2],
//printf("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
#else
void adc(double *r_re[2],
double *r_im[2],
#endif
void adc_SSE_float(float *r_re[2],
float *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
unsigned int **output,
......@@ -72,7 +100,7 @@ void adc(double *r_re[2],
//FILE *file2=NULL;
//file1 = fopen("adc1","w+");
//file1 = fopen("adc2","w+");
double gain = (double)(1<<(B-1));
float gain = (float)(1<<(B-1));
//double gain = 1.0;
//for (i=0;i<length;i++){
// fprintf(file1,"%d\t%d\t%d\t%d\t%d\n",i,(short)(r_re[0][i+input_offset]*gain),(short)(r_im[0][i+input_offset]*gain),output_offset/14336,i+output_offset);
......@@ -90,7 +118,6 @@ void adc(double *r_re[2],
//printf("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
#endif
void adc_freq(double *r_re[2],
double *r_im[2],
unsigned int input_offset,
......@@ -210,3 +237,35 @@ void adc_prach(double *r_re[2],
//printf("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
void adc_prach_SSE_float(float *r_re[2],
float *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
unsigned int **output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B)
{
int i;
int aa;
double gain = (double)(1<<(B-1));
//double gain = 1.0;
for (i=0; i<length; i++) {
for (aa=0; aa<nb_rx_antennas; aa++) {
((short *)output[aa])[((i+output_offset/2)<<1)] = (short)(r_re[aa][i+input_offset]*gain);
((short *)output[aa])[1+((i+output_offset/2)<<1)] = (short)(r_im[aa][i+input_offset]*gain);
#ifdef DEBUG_ADC
if (i<10)
printf("[adc_prach]i %d. input (%d,%d), output (%d,%d)\n",i,(short)(r_re[aa][i+input_offset]),(short)(r_im[aa][i+input_offset]),((short *)output[aa])[((i+output_offset/2)<<1)],((short *)output[aa])[1+((i+output_offset/2)<<1)]);
if (i>length-10&&i<length)
#endif
if ((r_re[aa][i+input_offset]*gain) > 30000) {
//("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
//printf("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
......@@ -75,7 +75,6 @@ void dac(double *s_re[2],
}
#define dac_SSE
#ifdef dac_SSE
//This implementation of dac_fixed_gain using SSE does not work
double dac_fixed_gain(double *s_re[2],
double *s_im[2],
uint32_t **input,
......@@ -113,13 +112,8 @@ double dac_fixed_gain(double *s_re[2],
input_im128=_mm_mul_pd(input_im128,_mm_set1_pd(div));
_mm_storeu_pd(&s_re[aa][2*i],input_re128);
_mm_storeu_pd(&s_im[aa][2*i],input_im128);
//s_re[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)])/amp1; ///(1<<(B-1));
//s_im[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)+1])/amp1; ///(1<<(B-1));
}
}
/*for (i=0;i<length;i++)
printf(" s_re_out[%d] %e, s_im_out[%d] %e, input_re[%d] %e, input_im[%d] %e\n",i,s_re[0][i],i,s_im[0][i],i,((double)(((short *)input[0]))[((i+input_offset)<<1)]),i,((double)(((short *)input[0]))[((i+input_offset)<<1)+1]));*/
// printf("ener %e\n",signal_energy_fp(s_re,s_im,nb_tx_antennas,length,0));
return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
}
......@@ -180,6 +174,48 @@ double dac_fixed_gain(double *s_re[2],
return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
}
#endif
double dac_fixed_gain_SSE_float(float *s_re[2],
float *s_im[2],
uint32_t **input,
uint32_t input_offset,
uint32_t nb_tx_antennas,
uint32_t length,
uint32_t input_offset_meas,
uint32_t length_meas,
uint8_t B,
float txpwr_dBm,
int NB_RE)
{
int i;
int aa;
float amp,amp1,div;
__m128 input_re128, input_im128;
amp = //sqrt(NB_RE)*pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
amp1 = 0;
for (aa=0; aa<nb_tx_antennas; aa++) {
amp1 += sqrt((float)signal_energy((int32_t*)&input[aa][input_offset_meas],length_meas)/NB_RE);
}
amp1/=nb_tx_antennas;
div=amp/amp1;
for (i=0; i<(length>>2); i++) {
for (aa=0; aa<nb_tx_antennas; aa++) {
input_re128=_mm_set_ps(((float)(((short *)input[aa]))[(((4*i+3)+input_offset)<<1)]),((float)(((short *)input[aa]))[(((4*i+2)+input_offset)<<1)]),((float)(((short *)input[aa]))[(((4*i+1)+input_offset)<<1)]),((float)(((short *)input[aa]))[((4*i+input_offset)<<1)]));
input_im128=_mm_set_ps(((float)(((short *)input[aa]))[(((4*i+3)+input_offset)<<1)+1]),((float)(((short *)input[aa]))[(((4*i+2)+input_offset)<<1)+1]),((float)(((short *)input[aa]))[(((4*i+1)+input_offset)<<1)+1]),((float)(((short *)input[aa]))[((4*i+input_offset)<<1)+1]));
input_re128=_mm_mul_ps(input_re128,_mm_set1_ps(div));
input_im128=_mm_mul_ps(input_im128,_mm_set1_ps(div));
_mm_storeu_ps(&s_re[aa][4*i],input_re128);
_mm_storeu_ps(&s_im[aa][4*i],input_im128);
}
}
return(signal_energy_fp_SSE_float(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
}
double dac_fixed_gain_prach(double *s_re[2],
double *s_im[2],
uint32_t *input,
......@@ -245,3 +281,68 @@ double dac_fixed_gain_prach(double *s_re[2],
return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
}
float dac_fixed_gain_prach_SSE_float(float *s_re[2],
float *s_im[2],
uint32_t *input,
uint32_t input_offset,
uint32_t nb_tx_antennas,
uint32_t length,
uint32_t input_offset_meas,
uint32_t length_meas,
uint8_t B,
float txpwr_dBm,
int NB_RE,
int ofdm_symbol_size)
{
int i;
int aa;
float amp,amp1;
int k;
amp = //sqrt(NB_RE)*pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
amp1 = 0;
for (aa=0; aa<nb_tx_antennas; aa++) {
amp1 += sqrt((float)signal_energy_prach((int32_t*)&input[input_offset_meas],length_meas)/NB_RE);
}
amp1/=nb_tx_antennas;
// printf("DAC: amp1 %f dB (%d,%d), tx_power %f\n",20*log10(amp1),input_offset,input_offset_meas,txpwr_dBm);
/*
if (nb_tx_antennas==2)
amp1 = AMP/2;
else if (nb_tx_antennas==4)
amp1 = ((AMP*ONE_OVER_SQRT2_Q15)>>16);
else //assume (nb_tx_antennas==1)
amp1 = ((AMP*ONE_OVER_SQRT2_Q15)>>15);
amp1 = amp1*sqrt(512.0/300.0); //account for loss due to null carriers
//printf("DL: amp1 %f dB (%d,%d), tx_power %f\n",20*log10(amp1),input_offset,input_offset_meas,txpwr_dBm);
*/
#ifdef DEBUG_DAC
printf("DAC: input_offset %d, amp %e, amp1 %e\n",input_offset,amp,amp1);
#endif
k=input_offset;
for (i=0; i<length*2; i+=2) {
for (aa=0; aa<nb_tx_antennas; aa++) {
s_re[aa][i/2] = amp*((float)(((short *)input))[((k))])/amp1; ///(1<<(B-1));
s_im[aa][i/2] = amp*((float)(((short *)input))[((k))+1])/amp1; ///(1<<(B-1));
#ifdef DEBUG_DAC
if(i<20)
printf("DAC[%d]: input (%d,%d). output (%e,%e)\n",i/2,(((short *)input))[((k))],(((short *)input))[((k))+1],s_re[aa][i/2],s_im[aa][i/2]);
if (i>length*2-20&&i<length*2)
printf("DAC[%d]: input (%d,%d). output (%e,%e)\n",i/2,(((short *)input))[((k))],(((short *)input))[((k))+1],s_re[aa][i/2],s_im[aa][i/2]);
#endif
k+=2;
if (k==12*2*ofdm_symbol_size)
k=0;
}
}
// printf("ener %e\n",signal_energy_fp(s_re,s_im,nb_tx_antennas,length,0));
return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
}
......@@ -72,6 +72,16 @@ void rf_rx_simple_freq(double *r_re[2],
unsigned int symbols_per_tti,
unsigned int ofdm_symbol_size,
unsigned int n_samples);
void rf_rx_simple_freq_SSE_float(float *r_re[2],
float *r_im[2],
unsigned int nb_rx_antennas,
unsigned int length,
float s_time,
float rx_gain_dB,
unsigned int symbols_per_tti,
unsigned int ofdm_symbol_size,
unsigned int n_samples);
void adc(double *r_re[2],
double *r_im[2],
......@@ -81,7 +91,14 @@ void adc(double *r_re[2],
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B);
void adc_SSE_float(float *r_re[2],
float *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
int **output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B);
void adc_freq(double *r_re[2],
double *r_im[2],
unsigned int input_offset,
......@@ -99,6 +116,14 @@ void adc_prach(double *r_re[2],
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B);
void adc_prach_SSE_float(float *r_re[2],
float *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
int **output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B);
void dac(double *s_re[2],
double *s_im[2],
......@@ -134,6 +159,18 @@ double dac_fixed_gain(double *s_re[2],
double gain,
int NB_RE);
float dac_fixed_gain_SSE_float(float *s_re[2],
float *s_im[2],
int **input,
unsigned int input_offset,
unsigned int nb_tx_antennas,
unsigned int length,
unsigned int input_offset_meas,
unsigned int length_meas,
unsigned char B,
float gain,
int NB_RE);
double dac_fixed_gain_prach(double *s_re[2],
double *s_im[2],
int *input,
......@@ -146,3 +183,15 @@ double dac_fixed_gain_prach(double *s_re[2],
double gain,
int NB_RE,
int ofdm_symbol_size);
float dac_fixed_gain_prach_SSE_float(float *s_re[2],
float *s_im[2],
int *input,
unsigned int input_offset,
unsigned int nb_tx_antennas,
unsigned int length,
unsigned int input_offset_meas,
unsigned int length_meas,
unsigned char B,
float gain,
int NB_RE,
int ofdm_symbol_size);
......@@ -298,8 +298,10 @@ clock_t start=clock();*/
rx128_re = _mm_loadu_pd(&r_re[a][2*i]);//r_re[a][i],r_re[a][i+1]
rx128_im = _mm_loadu_pd(&r_im[a][2*i]);//r_im[a][i],r_im[a][i+1]
rx128_gain_lin = _mm_set1_pd(rx_gain_lin);
gauss_0_128_sqrt_NOW = _mm_set1_pd(sqrt_NOW*ziggurat(0.0,1.0));
gauss_1_128_sqrt_NOW = _mm_set1_pd(sqrt_NOW*ziggurat(0.0,1.0));
gauss_0_128_sqrt_NOW = _mm_set_pd(ziggurat(0.0,1.0),ziggurat(0.0,1.0));
gauss_1_128_sqrt_NOW = _mm_set_pd(ziggurat(0.0,1.0),ziggurat(0.0,1.0));
gauss_0_128_sqrt_NOW = _mm_mul_pd(gauss_0_128_sqrt_NOW,_mm_set1_pd(sqrt_NOW));
gauss_1_128_sqrt_NOW = _mm_mul_pd(gauss_1_128_sqrt_NOW,_mm_set1_pd(sqrt_NOW));
// Amplify by receiver gain and apply 3rd order non-linearity
//r_re[a][i] = rx_gain_lin*(r_re[a][i] + sqrt(.5*N0W)*gaussdouble(0.0,1.0));
//r_im[a][i] = rx_gain_lin*(r_im[a][i] + sqrt(.5*N0W)*gaussdouble(0.0,1.0));
......@@ -364,7 +366,79 @@ sum=(sum+stop-start);*/
}
#endif
void rf_rx_simple_freq_SSE_float(float *r_re[2],
float *r_im[2],
unsigned int nb_rx_antennas,
unsigned int length,
float s_time,
float rx_gain_dB,
unsigned int symbols_per_tti,
unsigned int ofdm_symbol_size,
unsigned int n_samples)
{
/* static int first_run=0;
static double sum;
static int count;
if (!first_run)
{
first_run=1;
sum=0;
count=0;
}
count++;*/
__m128 rx128_re,rx128_im,rx128_gain_lin,gauss_0_128_sqrt_NOW,gauss_1_128_sqrt_NOW;//double
int i,a;
float rx_gain_lin = pow(10.0,.05*rx_gain_dB);
//double rx_gain_lin = 1.0;
float N0W = pow(10.0,.1*(-174.0 - 10*log10(s_time*1e-9)));
float sqrt_NOW = sqrt(.5*N0W);
//double N0W = 0.0;
// printf("s_time=%f, N0W=%g\n",s_time,10*log10(N0W));
//Loop over input
#ifdef DEBUG_RF
printf("N0W = %f dBm\n",10*log10(N0W));
printf("rx_gain = %f dB(%f)\n",rx_gain_dB,rx_gain_lin);
#endif
//rx128_gain_lin=mm_loadu_pd(rx_gain_lin);
/*count++;
clock_t start=clock();*/
for (i=0; i<(length>>2); i++) {
for (a=0; a<nb_rx_antennas; a++) {
if (i%(ofdm_symbol_size>>2)>(n_samples>>2) && i%(ofdm_symbol_size>>2)<(ofdm_symbol_size>>2)-(n_samples>>2))
{
//printf("i = %d\n",i);
//_mm_storeu_pd(&r_re[a][2*i],_mm_setzero_pd());
//_mm_storeu_pd(&r_im[a][2*i],_mm_setzero_pd());
break;
}
else
{
//rx128_gain_lin=mm_mul_set1_ps(rx_gain_lin);
rx128_re = _mm_loadu_ps(&r_re[a][4*i]);//r_re[a][i],r_re[a][i+1]
rx128_im = _mm_loadu_ps(&r_im[a][4*i]);//r_im[a][i],r_im[a][i+1]
rx128_gain_lin = _mm_set1_ps(rx_gain_lin);
gauss_0_128_sqrt_NOW = _mm_set_ps(ziggurat(0.0,1.0),ziggurat(0.0,1.0),ziggurat(0.0,1.0),ziggurat(0.0,1.0));
gauss_1_128_sqrt_NOW = _mm_set_ps(ziggurat(0.0,1.0),ziggurat(0.0,1.0),ziggurat(0.0,1.0),ziggurat(0.0,1.0));
gauss_0_128_sqrt_NOW = _mm_mul_ps(gauss_0_128_sqrt_NOW,_mm_set1_ps(sqrt_NOW));
gauss_1_128_sqrt_NOW = _mm_mul_ps(gauss_1_128_sqrt_NOW,_mm_set1_ps(sqrt_NOW));
// Amplify by receiver gain and apply 3rd order non-linearity
//r_re[a][i] = rx_gain_lin*(r_re[a][i] + sqrt(.5*N0W)*gaussdouble(0.0,1.0));
//r_im[a][i] = rx_gain_lin*(r_im[a][i] + sqrt(.5*N0W)*gaussdouble(0.0,1.0));
rx128_re = _mm_add_ps(rx128_re,gauss_0_128_sqrt_NOW);
rx128_im = _mm_add_ps(rx128_im,gauss_1_128_sqrt_NOW);
rx128_re = _mm_mul_ps(rx128_re,rx128_gain_lin);
rx128_im = _mm_mul_ps(rx128_im,rx128_gain_lin);
_mm_storeu_ps(&r_re[a][4*i],rx128_re);
_mm_storeu_ps(&r_im[a][4*i],rx128_im);
}
}
}
/*clock_t stop=clock();
printf("do_DL_sig time is %f s, AVERAGE time is %f s, count %d, sum %e\n",(float) (stop-start)/CLOCKS_PER_SEC,(float) (sum+stop-start)/(count*CLOCKS_PER_SEC),count,sum+stop-start);
sum=(sum+stop-start);*/
}
#ifdef RF_MAIN
#define INPUT_dBm -70.0
......
......@@ -292,6 +292,18 @@ void multipath_channel_freq(channel_desc_t *desc,
uint8_t UE_id,
uint8_t CC_id,
uint8_t th_id);
void multipath_channel_freq_SSE_float(channel_desc_t *desc,
float *tx_sig_re[2],
float *tx_sig_im[2],
float *rx_sig_re[2],
float *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel,
uint8_t eNB_id,
uint8_t UE_id,
uint8_t CC_id,
uint8_t th_id);
/**\fn void multipath_channel_prach(channel_desc_t *desc,
double tx_sig_re[2],
double tx_sig_im[2],
......@@ -328,6 +340,17 @@ void multipath_channel_prach(channel_desc_t *desc,
uint8_t eNB_id,
uint8_t prach_fmt,
uint8_t n_ra_prb);
void multipath_channel_prach_SSE_float(channel_desc_t *desc,
float *tx_sig_re[2],
float *tx_sig_im[2],
float *rx_sig_re[2],
float *rx_sig_im[2],
LTE_DL_FRAME_PARMS* const fp,
uint32_t length,
uint8_t keep_channel,
uint8_t eNB_id,
uint8_t prach_fmt,
uint8_t n_ra_prb);
/*
\fn double compute_pbch_sinr(channel_desc_t *desc,
channel_desc_t *desc_i1,
......
......@@ -292,6 +292,7 @@ void multipath_channel_freq(channel_desc_t *desc,
/*clock_t stop=clock();
printf("UE_freq_channel time is %f s, AVERAGE time is %f s, count %d, sum %e\n",(float) (stop-start)/CLOCKS_PER_SEC,(float) (sum+stop-start)/(count*CLOCKS_PER_SEC),count,sum+stop-start);
sum=(sum+stop-start);*/
random_channel(desc,0);
freq_channel(desc,nb_rb,n_samples);//Find desc->chF
//freq_channel_prach(desc,nb_rb,n_samples,1,44);//Find desc->chF
}
......@@ -424,6 +425,7 @@ void multipath_channel_freq(channel_desc_t *desc,
if (keep_channel) {
// do nothing - keep channel
} else {
random_channel(desc,0);
freq_channel(desc,nb_rb,n_samples);//Find desc->chF
}
//clock_t start=clock();
......@@ -478,7 +480,139 @@ void multipath_channel_freq(channel_desc_t *desc,
}//k
}
#endif
void multipath_channel_freq_SSE_float(channel_desc_t *desc,
float *tx_sig_re[2],
float *tx_sig_im[2],
float *rx_sig_re[2],
float *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel,
uint8_t eNB_id,
uint8_t UE_id,
uint8_t CC_id,
uint8_t th_id)
{
/*static int first_run=0;
static double sum;
static int count;
if (!first_run)
{
first_run=1;
sum=0;
count=0;
}
count++;*/
int ii,j,f;
__m128 rx_tmp128_re_f,rx_tmp128_im_f,rx_tmp128_re,rx_tmp128_im, rx_tmp128_1,rx_tmp128_2,rx_tmp128_3,rx_tmp128_4,tx128_re,tx128_im,chF128_x,chF128_y,pathloss128;
//struct complex rx_tmp;
float path_loss = pow(10,desc->path_loss_dB/20);
pathloss128 = _mm_set1_ps(path_loss);
int nb_rb, n_samples, ofdm_symbol_size, symbols_per_tti;
nb_rb=PHY_vars_UE_g[UE_id][CC_id]->frame_parms.N_RB_DL;
n_samples=PHY_vars_UE_g[UE_id][CC_id]->frame_parms.N_RB_DL*12+1;
ofdm_symbol_size=length/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.symbols_per_tti;
symbols_per_tti=length/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.ofdm_symbol_size;
#ifdef DEBUG_CH
printf("[CHANNEL_FREQ] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length);
#endif
if (keep_channel) {
// do nothing - keep channel
} else {
random_channel(desc,0);
freq_channel(desc,nb_rb,n_samples);//Find desc->chF
}
for (j=0;j<(symbols_per_tti>>2);j++){
for (ii=0; ii<desc->nb_rx; ii++) {
_mm_storeu_ps(&rx_sig_re[ii][4*j*ofdm_symbol_size],_mm_setzero_ps());
_mm_storeu_ps(&rx_sig_im[ii][4*j*ofdm_symbol_size],_mm_setzero_ps());
}
}
for (f=0;f<((ofdm_symbol_size*symbols_per_tti)>>2); f++) {//f2 = 0-1024*14-1 ---- for 10 Mhz BW
//printf("f is %d\n",f);
for (ii=0; ii<desc->nb_rx; ii++) {
//rx_tmp.x = 0;
//rx_tmp.y = 0;
rx_tmp128_re_f = _mm_setzero_ps();
rx_tmp128_im_f = _mm_setzero_ps();
if (f%(ofdm_symbol_size>>2)<(n_samples>>2))//1-300
{
for (j=0; j<desc->nb_tx; j++) {
//first n_samples>>1 samples of each frequency ofdm symbol out of ofdm_symbol_size
//RX_RE(k) += TX_RE(k).chF(k).x - TX_IM(k).chF(k).y
//RX_IM(k) += TX_IM(k).chF(k).x + TX_RE(k).chF(k).y
tx128_re = _mm_loadu_ps(&tx_sig_re[j][(4*f+1)]);
tx128_im = _mm_loadu_ps(&tx_sig_im[j][(4*f+1)]);
chF128_x = _mm_set1_ps(desc->ch[ii+(j*desc->nb_rx)][(4*(f%(ofdm_symbol_size>>2)))+(n_samples>>2)].x);
chF128_y = _mm_set1_ps(desc->ch[ii+(j*desc->nb_rx)][(4*(f%(ofdm_symbol_size>>2)))+(n_samples>>2)].y);
//rx_tmp.x += (tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].x)//tx128_re*ch128_x
// -(tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].y);//-tx128_im*ch128_y
//rx_tmp.y += (tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].x)//tx128_im*ch128_x
// +(tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].y);//+tx128_re*ch128_y
rx_tmp128_1 = _mm_mul_ps(tx128_re,chF128_x);
rx_tmp128_2 = _mm_mul_ps(tx128_im,chF128_y);
rx_tmp128_3 = _mm_mul_ps(tx128_im,chF128_x);
rx_tmp128_4 = _mm_mul_ps(tx128_re,chF128_y);
rx_tmp128_re = _mm_sub_ps(rx_tmp128_1,rx_tmp128_2);
rx_tmp128_im = _mm_add_ps(rx_tmp128_3,rx_tmp128_4);
rx_tmp128_re_f = _mm_add_ps(rx_tmp128_re_f,rx_tmp128_re);
rx_tmp128_im_f = _mm_add_ps(rx_tmp128_im_f,rx_tmp128_im);
} // j
//rx_sig_re[ii][f+k*ofdm_symbol_size] = rx_tmp.x*path_loss;
//rx_sig_im[ii][f+k*ofdm_symbol_size] = rx_tmp.y*path_loss;
rx_tmp128_re_f = _mm_mul_ps(rx_tmp128_re_f,pathloss128);
rx_tmp128_im_f = _mm_mul_ps(rx_tmp128_im_f,pathloss128);
_mm_storeu_ps(&rx_sig_re[ii][(4*f+1)],rx_tmp128_re_f);
_mm_storeu_ps(&rx_sig_im[ii][(4*f+1)],rx_tmp128_im_f);
}
else if (f%(ofdm_symbol_size>>2)>(n_samples>>2) && f%(ofdm_symbol_size>>2)<(ofdm_symbol_size>>2)-(n_samples>>2))
{
//rx_sig_re[ii][f+k*ofdm_symbol_size] = 0;
//rx_sig_im[ii][f+k*ofdm_symbol_size] = 0;
//_mm_storeu_pd(&rx_sig_re[ii][2*f],_mm_setzero_pd());
//_mm_storeu_pd(&rx_sig_im[ii][2*f],_mm_setzero_pd());
break;
}
else
{
for (j=0; j<desc->nb_tx; j++) {
//last n_samples>>1 samples of each frequency ofdm symbol out of ofdm_symbol_size
//RX_RE(k) += TX_RE(k).chF(k).x - TX_IM(k).chF(k).y
//RX_IM(k) += TX_IM(k).chF(k).x + TX_RE(k).chF(k).y
tx128_re = _mm_loadu_ps(&tx_sig_re[j][4*f]);
tx128_im = _mm_loadu_ps(&tx_sig_im[j][4*f]);
chF128_x = _mm_set1_ps(desc->ch[ii+(j*desc->nb_rx)][4*(f%(ofdm_symbol_size>>2)-((ofdm_symbol_size>>2)-(n_samples>>2)))].x);
chF128_y = _mm_set1_ps(desc->ch[ii+(j*desc->nb_rx)][4*(f%(ofdm_symbol_size>>2)-((ofdm_symbol_size>>2)-(n_samples>>2)))].y);
//rx_tmp.x += (tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].x)
// -(tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].y);
//rx_tmp.y += (tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].x)
// +(tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].y);
rx_tmp128_1 = _mm_mul_ps(tx128_re,chF128_x);
rx_tmp128_2 = _mm_mul_ps(tx128_im,chF128_y);
rx_tmp128_3 = _mm_mul_ps(tx128_im,chF128_x);
rx_tmp128_4 = _mm_mul_ps(tx128_re,chF128_y);
rx_tmp128_re = _mm_sub_ps(rx_tmp128_1,rx_tmp128_2);
rx_tmp128_im = _mm_add_ps(rx_tmp128_3,rx_tmp128_4);
rx_tmp128_re_f = _mm_add_ps(rx_tmp128_re_f,rx_tmp128_re);
rx_tmp128_im_f = _mm_add_ps(rx_tmp128_im_f,rx_tmp128_im);
} // j
//rx_sig_re[ii][f+k*ofdm_symbol_size] = rx_tmp.x*path_loss;
//rx_sig_im[ii][f+k*ofdm_symbol_size] = rx_tmp.y*path_loss;
rx_tmp128_re_f = _mm_mul_ps(rx_tmp128_re_f,pathloss128);
rx_tmp128_im_f = _mm_mul_ps(rx_tmp128_im_f,pathloss128);
_mm_storeu_ps(&rx_sig_re[ii][4*f],rx_tmp128_re_f);
_mm_storeu_ps(&rx_sig_im[ii][4*f],rx_tmp128_im_f);
}
} // ii
} // f,f2,f3
//}//k
}
#ifdef CHANNEL_SSE
void multipath_channel_prach(channel_desc_t *desc,
double *tx_sig_re[2],
......@@ -510,6 +644,7 @@ void multipath_channel_prach(channel_desc_t *desc,
if (keep_channel) {
// do nothing - keep channel
} else {
random_channel(desc,0);
freq_channel_prach(desc,nb_rb,n_samples,prach_fmt,n_ra_prb);//Find desc->chF_prach
}
for (f=0;f<(length>>1); f++) {
......@@ -577,7 +712,7 @@ void multipath_channel_prach(channel_desc_t *desc,
if (keep_channel) {
// do nothing - keep channel
} else {
//random_channel(desc,0);//Find a(l)
random_channel(desc,0);//Find a(l)
freq_channel_prach(desc,nb_rb,n_samples,prach_fmt,n_ra_prb);//Find desc->chF_prach
}
for (f=0;f<lenght; f++) {
......@@ -597,6 +732,74 @@ void multipath_channel_prach(channel_desc_t *desc,
} // f
}
#endif
void multipath_channel_prach_SSE_float(channel_desc_t *desc,
float *tx_sig_re[2],
float *tx_sig_im[2],
float *rx_sig_re[2],
float *rx_sig_im[2],
LTE_DL_FRAME_PARMS* const fp,
uint32_t length,
uint8_t keep_channel,
uint8_t eNB_id,
uint8_t prach_fmt,
uint8_t n_ra_prb)
{
int ii,j,f;
__m128 rx_tmp128_re_f,rx_tmp128_im_f,rx_tmp128_re,rx_tmp128_im, rx_tmp128_1,rx_tmp128_2,rx_tmp128_3,rx_tmp128_4,tx128_re,tx128_im,chF128_x,chF128_y,pathloss128;
struct complex rx_tmp;
float path_loss = pow(10,desc->path_loss_dB/20);
pathloss128 = _mm_set1_ps(path_loss);
int nb_rb, n_samples;
nb_rb=fp->N_RB_DL;
n_samples=fp->N_RB_DL*12+1;
#ifdef DEBUG_CH
printf("[CHANNEL_PRACH] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,desc->channel_length);
#endif
if (keep_channel) {
// do nothing - keep channel
} else {
random_channel(desc,0);
freq_channel_prach(desc,nb_rb,n_samples,prach_fmt,n_ra_prb);//Find desc->chF_prach
}
for (f=0;f<(length>>2); f++) {
//rx_tmp.x = 0;
//rx_tmp.y = 0;
rx_tmp128_re_f = _mm_setzero_ps();
rx_tmp128_im_f = _mm_setzero_ps();
for (ii=0; ii<desc->nb_rx; ii++) {
for (j=0; j<desc->nb_tx; j++) {
//RX_RE(k) = TX_RE(k).chF(k).x - TX_IM(k).chF(k).y
//RX_IM(k) = TX_IM(k).chF(k).x + TX_RE(k).chF(k).y
tx128_re = _mm_loadu_ps(&tx_sig_re[j][(4*f)]);
tx128_im = _mm_loadu_ps(&tx_sig_im[j][(4*f)]);
chF128_x = _mm_set1_ps(desc->ch[ii+(j*desc->nb_rx)][4*f+(prach_fmt<4)?13:3].x);
chF128_y = _mm_set1_ps(desc->ch[ii+(j*desc->nb_rx)][4*f+(prach_fmt<4)?13:3].y);
//rx_tmp.x += (tx_sig_re[ii][f] * desc->chF_prach[ii+(j*desc->nb_rx)][f+(prach_fmt<4)?13:3].x)-(tx_sig_im[ii][f] * desc->chF_prach[ii+(j*desc->nb_rx)][f+(prach_fmt<4)?13:3].y);
//rx_tmp.y += (tx_sig_im[ii][f] * desc->chF_prach[ii+(j*desc->nb_rx)][f+(prach_fmt<4)?13:3].x)+(tx_sig_re[ii][f] * desc->chF_prach[ii+(j*desc->nb_rx)][f+(prach_fmt<4)?13:3].y);
rx_tmp128_1 = _mm_mul_ps(tx128_re,chF128_x);
rx_tmp128_2 = _mm_mul_ps(tx128_im,chF128_y);
rx_tmp128_3 = _mm_mul_ps(tx128_im,chF128_x);
rx_tmp128_4 = _mm_mul_ps(tx128_re,chF128_y);
rx_tmp128_re = _mm_sub_ps(rx_tmp128_1,rx_tmp128_2);
rx_tmp128_im = _mm_add_ps(rx_tmp128_3,rx_tmp128_4);
rx_tmp128_re_f = _mm_add_ps(rx_tmp128_re_f,rx_tmp128_re);
rx_tmp128_im_f = _mm_add_ps(rx_tmp128_im_f,rx_tmp128_im);
} // j
//printf("[multipath prach] k: %d\n",k/2);
//rx_sig_re[ii][f] = rx_tmp.x*path_loss;
//rx_sig_im[ii][f] = rx_tmp.y*path_loss;
rx_tmp128_re_f = _mm_mul_ps(rx_tmp128_re_f,pathloss128);
rx_tmp128_im_f = _mm_mul_ps(rx_tmp128_im_f,pathloss128);
_mm_storeu_ps(&rx_sig_re[ii][4*f],rx_tmp128_re_f); // max index: length-dd -1 + dd = length -1
_mm_storeu_ps(&rx_sig_im[ii][4*f],rx_tmp128_im_f);
} // ii
} // f
}
void multipath_channel_freq_test(channel_desc_t *desc,
double *tx_sig_re[2],
double *tx_sig_im[2],
......
......@@ -158,8 +158,6 @@ double nfix(void)
{
const double r = 3.442620;
static double x, y;
long l;
double d;
for (;;)
{
x=hz * wn[iz];
......@@ -193,7 +191,7 @@ double nfix(void)
void table_nor(unsigned long seed)
{
jsr=seed;
printf("seed is %d\n",seed);
//printf("Seed for Ziggurat random number generator is %d\n",seed);
double dn = 3.442619855899;
int i;
const double m1 = 2147483648.0;
......
......@@ -65,7 +65,20 @@
int number_rb_ul;
int first_rbUL ;
#define SSE_float
#ifdef SSE_float
float r_re_DL[NUMBER_OF_UE_MAX][2][30720];
float r_im_DL[NUMBER_OF_UE_MAX][2][30720];
float r_re_UL[NUMBER_OF_eNB_MAX][2][30720];
float r_im_UL[NUMBER_OF_eNB_MAX][2][30720];
float r_re_DL_f[NUMBER_OF_UE_MAX][2][2048*14];
float r_im_DL_f[NUMBER_OF_UE_MAX][2][2048*14];
float r_re_UL_f[NUMBER_OF_eNB_MAX][2][2048*14];
float r_im_UL_f[NUMBER_OF_eNB_MAX][2][2048*14];
float r_re_UL_f_prach[NUMBER_OF_eNB_MAX][2][2048*14];
float r_im_UL_f_prach[NUMBER_OF_eNB_MAX][2][2048*14];
#else
double r_re_DL[NUMBER_OF_UE_MAX][2][30720];
double r_im_DL[NUMBER_OF_UE_MAX][2][30720];
double r_re_UL[NUMBER_OF_eNB_MAX][2][30720];
......@@ -77,6 +90,7 @@ double r_re_UL_f[NUMBER_OF_eNB_MAX][2][2048*14];
double r_im_UL_f[NUMBER_OF_eNB_MAX][2][2048*14];
double r_re_UL_f_prach[NUMBER_OF_eNB_MAX][2][2048*14];
double r_im_UL_f_prach[NUMBER_OF_eNB_MAX][2][2048*14];
#endif
int eNB_output_mask[NUMBER_OF_UE_MAX];
int UE_output_mask[NUMBER_OF_eNB_MAX];
......@@ -377,7 +391,7 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
uint8_t UE_id,
int CC_id)
{
static int first_run=0;
/*static int first_run=0;
static double sum;
static int count;
if (!first_run)
......@@ -386,12 +400,16 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
sum=0;
count=0;
}
count++;
count++;*/
//int32_t att_eNB_id=-1;
int32_t **txdataF,**rxdataF;
uint8_t eNB_id=0;
#ifdef SSE_float
double tx_pwr;
#else
float tx_pwr;
#endif
//double rx_pwr;
//int32_t rx_pwr0,rx_pwr1,rx_pwr2, rx_pwr3;
uint32_t i,aa;
......@@ -401,7 +419,20 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
uint8_t hold_channel=0;
uint8_t nb_antennas_rx = eNB2UE[0][0][CC_id]->nb_rx; // number of rx antennas at UE
uint8_t nb_antennas_tx = eNB2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB
#ifdef SSE_float
float s_re0_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float s_re1_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *s_re_f[2];
float s_im0_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float s_im1_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *s_im_f[2];
float r_re00_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float r_re01_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *r_re0_f[2];
float r_im00_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float r_im01_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *r_im0_f[2];
#else
double s_re0_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double s_re1_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double *s_re_f[2];
......@@ -413,8 +444,8 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
double *r_re0_f[2];
double r_im00_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double r_im01_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double *r_im0_f[2];
#endif
s_re_f[0] = s_re0_f;
s_im_f[0] = s_im0_f;
......@@ -460,6 +491,19 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
//for (int idx=0;idx<10;idx++) printf("dumping DL raw subframe %d: txdataF[%d] = (%d,%d)\n", subframe, idx, ((short*)&txdataF[0][sf_offset+idx])[0], ((short*)&txdataF[0][sf_offset+idx])[1]);
start_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_dac_fixed_gain);
#ifdef SSE_float
tx_pwr = dac_fixed_gain_SSE_float(s_re_f,
s_im_f,
txdataF,
sf_offset,
nb_antennas_tx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
sf_offset,
frame_parms->ofdm_symbol_size,
14,
frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE
frame_parms->N_RB_DL*12);
#else
tx_pwr = dac_fixed_gain(s_re_f,
s_im_f,
txdataF,
......@@ -471,13 +515,14 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
14,
frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE
frame_parms->N_RB_DL*12);
#endif
stop_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_dac_fixed_gain);
//print_meas (&eNB2UE[eNB_id][UE_id][CC_id]->DL_dac_fixed_gain,"[DL][dac_fixed_gain]", &eNB2UE[eNB_id][UE_id][CC_id]->DL_dac_fixed_gain, &eNB2UE[eNB_id][UE_id][CC_id]->DL_dac_fixed_gain);
//for (x=0;x<frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;x++){
// fprintf(file1,"%d\t%e\t%e\n",x,s_re_f[0][x],s_im_f[0][x]);
//}
//write_output("chsim_txsigF_DL.m","chsm_txsF_DL", PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.txdataF[0][0],10*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
//write_output("chsim_txsigF_DL.m","chsm_txsF_DL", PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.txdataF[0][0],10*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
//for (int idx=0;idx<10;idx++) printf("dumping DL raw tx subframe (input) %d: s_f[%d] = (%f,%f)\n", subframe, idx, s_re_f[0][idx],s_im_f[0][idx]);
......@@ -491,8 +536,13 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
//eNB2UE[eNB_id][UE_id]->path_loss_dB = 0;
//clock_t start=clock();
start_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_multipath_channel_freq);
#ifdef SSE_float
multipath_channel_freq_SSE_float(eNB2UE[eNB_id][UE_id][CC_id],s_re_f,s_im_f,r_re0_f,r_im0_f,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,hold_channel,eNB_id,UE_id,CC_id,subframe&0x1);
#else
multipath_channel_freq(eNB2UE[eNB_id][UE_id][CC_id],s_re_f,s_im_f,r_re0_f,r_im0_f,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,hold_channel,eNB_id,UE_id,CC_id,subframe&0x1);
#endif
stop_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_multipath_channel_freq);
//print_meas (&eNB2UE[eNB_id][UE_id][CC_id]->DL_multipath_channel_freq,"[DL][multipath_channel_freq]", &eNB2UE[eNB_id][UE_id][CC_id]->DL_multipath_channel_freq, &eNB2UE[eNB_id][UE_id][CC_id]->DL_multipath_channel_freq);
......@@ -531,6 +581,7 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
frame_parms->ofdm_symbol_size,
sf_offset)/(12.0*frame_parms->N_RB_DL);
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for subframe %d\n",UE_id,
10*log10(rx_pwr),
10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),subframe);
......@@ -552,6 +603,17 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
/*count++;
clock_t start=clock();*/
start_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_rf_rx_simple_freq);
#ifdef SSE_float
rf_rx_simple_freq_SSE_float(r_re0_f,
r_im0_f,
nb_antennas_rx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
(float)1e3/eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate, // sampling time (ns)
(float)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
frame_parms->symbols_per_tti,
frame_parms->ofdm_symbol_size,
12.0*frame_parms->N_RB_DL);
#else
rf_rx_simple_freq(r_re0_f,
r_im0_f,
nb_antennas_rx,
......@@ -561,6 +623,7 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
frame_parms->symbols_per_tti,
frame_parms->ofdm_symbol_size,
12.0*frame_parms->N_RB_DL);
#endif
stop_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_rf_rx_simple_freq);
//print_meas (&eNB2UE[eNB_id][UE_id][CC_id]->DL_rf_rx_simple_freq,"[DL][rf_rx_simple_freq]", &eNB2UE[eNB_id][UE_id][CC_id]->DL_rf_rx_simple_freq, &eNB2UE[eNB_id][UE_id][CC_id]->DL_rf_rx_simple_freq);
......@@ -592,9 +655,13 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
eNB_output_mask[UE_id] |= (1<<eNB_id);
if (eNB_output_mask[UE_id] == (1<<NB_eNB_INST)-1) {
eNB_output_mask[UE_id]=0;
#ifdef SSE_float
float *r_re_p_f[2] = {r_re_DL_f[UE_id][0],r_re_DL_f[UE_id][1]};
float *r_im_p_f[2] = {r_im_DL_f[UE_id][0],r_im_DL_f[UE_id][1]};
#else
double *r_re_p_f[2] = {r_re_DL_f[UE_id][0],r_re_DL_f[UE_id][1]};
double *r_im_p_f[2] = {r_im_DL_f[UE_id][0],r_im_DL_f[UE_id][1]};
#endif
#ifdef DEBUG_SIM
rx_pwr0 = signal_energy_fp(r_re_p_f,r_im_p_f,nb_antennas_rx,frame_parms->ofdm_symbol_size,sf_offset)/(12.0*frame_parms->N_RB_DL);
......@@ -608,6 +675,16 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
//printf("[ch_sim] sf_offset %d\n",sf_offset);
start_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_adc);
#ifdef SSE_float
adc_SSE_float(r_re_p_f,
r_im_p_f,
0,
sf_offset,
rxdataF,
nb_antennas_rx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
12);
#else
adc(r_re_p_f,
r_im_p_f,
0,
......@@ -616,12 +693,13 @@ void do_DL_sig_freq(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][
nb_antennas_rx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
12);
#endif
stop_meas(&eNB2UE[eNB_id][UE_id][CC_id]->DL_adc);
//print_meas (&eNB2UE[eNB_id][UE_id][CC_id]->DL_adc,"[DL][adc]", &eNB2UE[eNB_id][UE_id][CC_id]->DL_adc, &eNB2UE[eNB_id][UE_id][CC_id]->DL_adc);
//for (int idx=0;idx<10;idx++) printf("dumping DL raw rx subframe %d: rxdataF[%d] = (%d,%d)=====>%s\n", subframe, idx, ((short*)&rxdataF[0][sf_offset+idx])[0], ((short*)&rxdataF[0][sf_offset+idx])[1],(((((r_re_p_f[0][idx]<0)&&(((short*)&rxdataF[0][sf_offset+idx])[0]<0))||((r_re_p_f[0][idx]>=0)&&(((short*)&rxdataF[0][sf_offset+idx])[0]>=0))))&&(((r_im_p_f[0][idx]<0)&&(((short*)&rxdataF[0][sf_offset+idx])[1]<0))||((r_im_p_f[0][idx]>=0)&&(((short*)&rxdataF[0][sf_offset+idx])[1]>=0))))?"OK":"ERROR");
//write_output("chsim_rxsigF_subframe0.m","chsm_rxsF0", PHY_vars_UE_g[UE_id][CC_id]->common_vars.common_vars_rx_data_per_thread[0].rxdataF[0],10*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
//write_output("chsim_rxsigF_subframe1.m","chsm_rxsF1", PHY_vars_UE_g[UE_id][CC_id]->common_vars.common_vars_rx_data_per_thread[1].rxdataF[0],10*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
//write_output("chsim_rxsigF_subframe0.m","chsm_rxsF0", PHY_vars_UE_g[UE_id][CC_id]->common_vars.common_vars_rx_data_per_thread[0].rxdataF[0],10*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
//write_output("chsim_rxsigF_subframe1.m","chsm_rxsF1", PHY_vars_UE_g[UE_id][CC_id]->common_vars.common_vars_rx_data_per_thread[1].rxdataF[0],10*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
#ifdef DEBUG_SIM
rx_pwr2 = signal_energy((rxdataF[0])+sf_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL);
......@@ -855,8 +933,11 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
uint8_t nb_antennas_rx = UE2eNB[0][0][CC_id]->nb_rx; // number of rx antennas at eNB
uint8_t nb_antennas_tx = UE2eNB[0][0][CC_id]->nb_tx; // number of tx antennas at UE
#ifdef SSE_float
float tx_pwr, rx_pwr;
#else
double tx_pwr, rx_pwr;
#endif
int32_t rx_pwr2;
uint32_t i,aa;
uint32_t sf_offset;
......@@ -873,7 +954,20 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
int ulfrrb2 ;
uint8_t harq_pid;
#endif
#ifdef SSE_float
float s_re0_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float s_re1_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *s_re_f[2];
float s_im0_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float s_im1_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *s_im_f[2];
float r_re00_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float r_re01_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *r_re0_f[2];
float r_im00_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float r_im01_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
float *r_im0_f[2];
#else
double s_re0_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double s_re1_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double *s_re_f[2];
......@@ -886,6 +980,7 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
double r_im00_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double r_im01_f[2048*14];//ofdm_symbol_size*symbols_per_tti;
double *r_im0_f[2];
#endif
s_re_f[0] = s_re0_f;
s_im_f[0] = s_im0_f;
......@@ -966,6 +1061,19 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
// UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB));
} else {
start_meas(&UE2eNB[UE_id][eNB_id][CC_id]->UL_dac_fixed_gain);
#ifdef SSE_float
tx_pwr = dac_fixed_gain_SSE_float((float**)s_re_f,
(float**)s_im_f,
txdataF,
sf_offset,
nb_antennas_tx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
sf_offset,
frame_parms->ofdm_symbol_size,
14,
(float)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]); // This make the previous argument the total power
#else
tx_pwr = dac_fixed_gain((double**)s_re_f,
(double**)s_im_f,
txdataF,
......@@ -977,6 +1085,7 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
14,
(double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]); // This make the previous argument the total power
#endif
stop_meas(&UE2eNB[UE_id][eNB_id][CC_id]->UL_dac_fixed_gain);
//print_meas (&UE2eNB[UE_id][eNB_id][CC_id]->UL_dac_fixed_gain,"[UL][dac_fixed_gain]", &UE2eNB[UE_id][eNB_id][CC_id]->UL_dac_fixed_gain, &UE2eNB[UE_id][eNB_id][CC_id]->UL_dac_fixed_gain);
/*for (int idx=subframe*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;idx<(subframe+1)*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;idx++){
......@@ -991,8 +1100,13 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
subframe,sf_offset);
//write_output("chsim_s_re_f_UL.m","chsm_sref_UL", s_re_f,10*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
start_meas(&UE2eNB[UE_id][eNB_id][CC_id]->UL_multipath_channel_freq);
#ifdef SSE_float
multipath_channel_freq_SSE_float(UE2eNB[UE_id][eNB_id][CC_id],s_re_f,s_im_f,r_re0_f,r_im0_f,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,hold_channel,eNB_id,UE_id,CC_id,subframe&0x1);//ue timer subframe&0x1
#else
multipath_channel_freq(UE2eNB[UE_id][eNB_id][CC_id],s_re_f,s_im_f,r_re0_f,r_im0_f,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,hold_channel,eNB_id,UE_id,CC_id,subframe&0x1);//ue timer subframe&0x1
#endif
stop_meas(&UE2eNB[UE_id][eNB_id][CC_id]->UL_multipath_channel_freq);
//print_meas (&UE2eNB[UE_id][eNB_id][CC_id]->UL_multipath_channel_freq,"[UL][multipath_channel_freq]", NULL, NULL);
//for (int x=0;x<frame_parms->N_RB_DL*12;x++){
......@@ -1017,8 +1131,11 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
LOG_D(OCM,"[SIM][UL] subframe %d Channel UE %d => eNB %d : %f dB (hold %d,length %d, PL %f)\n",subframe,UE_id,eNB_id,10*log10(rx_pwr),
hold_channel,12*frame_parms->N_RB_DL+1,
UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB);
#ifdef SSE_float
rx_pwr = signal_energy_fp_SSE_float(r_re0_f,r_im0_f,nb_antennas_rx,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,0);
#else
rx_pwr = signal_energy_fp(r_re0_f,r_im0_f,nb_antennas_rx,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,0);
#endif
LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for subframe %d, sptti %d\n",
eNB_id,10*log10(rx_pwr),rx_pwr,subframe,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti);
......@@ -1037,10 +1154,25 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
pthread_mutex_unlock(&UE_output_mutex[eNB_id]);
}
} //UE_id
#ifdef SSE_float
float *r_re_p_f[2] = {r_re_UL_f[eNB_id][0],r_re_UL_f[eNB_id][1]};
float *r_im_p_f[2] = {r_im_UL_f[eNB_id][0],r_im_UL_f[eNB_id][1]};
#else
double *r_re_p_f[2] = {r_re_UL_f[eNB_id][0],r_re_UL_f[eNB_id][1]};
double *r_im_p_f[2] = {r_im_UL_f[eNB_id][0],r_im_UL_f[eNB_id][1]};
#endif
start_meas(&UE2eNB[0][eNB_id][CC_id]->UL_rf_rx_simple_freq);
#ifdef SSE_float
rf_rx_simple_freq_SSE_float(r_re_p_f,
r_im_p_f,
nb_antennas_rx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
(float)1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns)
(float)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
frame_parms->symbols_per_tti,
frame_parms->ofdm_symbol_size,
12.0*frame_parms->N_RB_DL);
#else
rf_rx_simple_freq(r_re_p_f,
r_im_p_f,
nb_antennas_rx,
......@@ -1050,6 +1182,7 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
frame_parms->symbols_per_tti,
frame_parms->ofdm_symbol_size,
12.0*frame_parms->N_RB_DL);
#endif
stop_meas(&UE2eNB[0][eNB_id][CC_id]->UL_rf_rx_simple_freq);
//print_meas (&UE2eNB[UE_id][eNB_id][CC_id]->UL_rf_rx_simple_freq,"[UL][rf_rx_simple_freq]", &UE2eNB[UE_id][eNB_id][CC_id]->UL_rf_rx_simple_freq, &UE2eNB[UE_id][eNB_id][CC_id]->UL_rf_rx_simple_freq);
/*for (int idx=subframe*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;idx<(subframe+1)*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;idx++){
......@@ -1064,6 +1197,16 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
rxdataF = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdataF[0];
sf_offset = 0;//subframe*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;
start_meas(&UE2eNB[0][eNB_id][CC_id]->UL_adc);
#ifdef SSE_float
adc_SSE_float(r_re_p_f,
r_im_p_f,
sf_offset,
sf_offset,
rxdataF,
nb_antennas_rx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
12);
#else
adc(r_re_p_f,
r_im_p_f,
sf_offset,
......@@ -1072,6 +1215,7 @@ void do_UL_sig_freq(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][
nb_antennas_rx,
frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,
12);
#endif
stop_meas(&UE2eNB[0][eNB_id][CC_id]->UL_adc);
/*for (int idx=0;idx<frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;idx++){
if (((short*)&txdataF[0][idx+subframe*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti])[0]!=0 || ((short*)&txdataF[0][idx+subframe*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti])[1]!=0)
......@@ -1117,8 +1261,11 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
int16_t *tx_prachF;
uint8_t nb_antennas_rx = UE2eNB[0][0][CC_id]->nb_rx; // number of rx antennas at eNB
uint8_t nb_antennas_tx = UE2eNB[0][0][CC_id]->nb_tx; // number of tx antennas at UE
#ifdef SSE_float
float tx_pwr, rx_pwr;
#else
double tx_pwr, rx_pwr;
#endif
int32_t rx_pwr2;
uint32_t i,aa;
uint32_t sf_offset;
......@@ -1134,7 +1281,20 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
int ulfrrb2 ;
uint8_t harq_pid;
#endif
#ifdef SSE_float
float s_re0_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float s_re1_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float *s_re_f_prach[2];
float s_im0_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float s_im1_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float *s_im_f_prach[2];
float r_re00_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float r_re01_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float *r_re0_f_prach[2];
float r_im00_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float r_im01_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
float *r_im0_f_prach[2];
#else
double s_re0_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
double s_re1_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
double *s_re_f_prach[2];
......@@ -1147,6 +1307,7 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
double r_im00_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
double r_im01_f_prach[2048*14*12];//ofdm_symbol_size*symbols_per_tti;
double *r_im0_f_prach[2];
#endif
s_re_f_prach[0] = s_re0_f_prach;
s_im_f_prach[0] = s_im0_f_prach;
......@@ -1211,6 +1372,20 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
//UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB));
} else {
start_meas(&UE2eNB[UE_id][eNB_id][CC_id]->dac_fixed_gain_PRACH);
#ifdef SSE_float
tx_pwr = dac_fixed_gain_prach_SSE_float((float**)s_re_f_prach,
(float**)s_im_f_prach,
(int *)tx_prachF,
pointer_firstvalue_PRACH,
nb_antennas_tx,
(prach_fmt<4)?839:139,
pointer_firstvalue_PRACH,
(prach_fmt<4)?839:139,
14,
(float)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe],
PHY_vars_UE_g[UE_id][CC_id]->frame_parms.ofdm_symbol_size); // This make the previous argument the total power
#else
tx_pwr = dac_fixed_gain_prach((double**)s_re_f_prach,
(double**)s_im_f_prach,
(int *)tx_prachF,
......@@ -1223,6 +1398,7 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
(double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe],
PHY_vars_UE_g[UE_id][CC_id]->frame_parms.ofdm_symbol_size); // This make the previous argument the total power
#endif
stop_meas(&UE2eNB[UE_id][eNB_id][CC_id]->dac_fixed_gain_PRACH);
//for (int idx=0;idx<10;idx++) printf("dumping raw PRACH UL tx subframe (input) %d: s_f[%d] = (%f,%f)\n", subframe, idx, s_re_f_prach[0][idx],s_im_f_prach[0][idx]);
//for (int idx=829;idx<839;idx++) printf("dumping raw PRACH UL tx subframe (input) %d: s_f[%d] = (%f,%f)\n", subframe, idx, s_re_f_prach[0][idx],s_im_f_prach[0][idx]);
......@@ -1237,8 +1413,13 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
// write_output("s_re_f_prach.m","s_re_f_prach_txF", s_re_f_prach,frame_parms->ofdm_symbol_size*12,1,1);
start_meas(&UE2eNB[UE_id][eNB_id][CC_id]->multipath_channel_freq_PRACH);
#ifdef SSE_float
multipath_channel_prach_SSE_float(UE2eNB[UE_id][eNB_id][CC_id],s_re_f_prach,s_im_f_prach,r_re0_f_prach,r_im0_f_prach,&PHY_vars_UE_g[UE_id][CC_id]->frame_parms,
(prach_fmt<4)?13+839+12:3+139+2,hold_channel,eNB_id,prach_fmt,n_ra_prb);
#else
multipath_channel_prach(UE2eNB[UE_id][eNB_id][CC_id],s_re_f_prach,s_im_f_prach,r_re0_f_prach,r_im0_f_prach,&PHY_vars_UE_g[UE_id][CC_id]->frame_parms,
(prach_fmt<4)?13+839+12:3+139+2,hold_channel,eNB_id,prach_fmt,n_ra_prb);
#endif
stop_meas(&UE2eNB[UE_id][eNB_id][CC_id]->multipath_channel_freq_PRACH);
//for (int idx=0;idx<10;idx++) printf("dumping raw PRACH UL tx subframe (output) %d: r_f[%d] = (%f,%f)\n", subframe, idx, r_re0_f_prach[0][idx],r_im0_f_prach[0][idx]);
......@@ -1248,8 +1429,11 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
LOG_D(OCM,"[SIM][UL] subframe %d Channel UE %d => eNB %d : %f dB (hold %d,length %d, PL %f)\n",subframe,UE_id,eNB_id,10*log10(rx_pwr),
hold_channel,12*frame_parms->N_RB_DL+1,
UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB);
#ifdef SSE_float
rx_pwr = signal_energy_fp_SSE_float(r_re0_f_prach,r_im0_f_prach,nb_antennas_rx,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*12,0);
#else
rx_pwr = signal_energy_fp(r_re0_f_prach,r_im0_f_prach,nb_antennas_rx,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*12,0);
#endif
LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for subframe %d, sptti %d\n",
eNB_id,10*log10(rx_pwr),rx_pwr,subframe,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*12);
#ifdef DEBUG_SIM
......@@ -1275,19 +1459,38 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
pthread_mutex_unlock(&UE_output_mutex[eNB_id]);
}
} //UE_id
#ifdef SSE_float
float *r_re_p_f_prach[2] = {r_re_UL_f_prach[eNB_id][0],r_re_UL_f_prach[eNB_id][1]};
float *r_im_p_f_prach[2] = {r_im_UL_f_prach[eNB_id][0],r_im_UL_f_prach[eNB_id][1]};
#else
double *r_re_p_f_prach[2] = {r_re_UL_f_prach[eNB_id][0],r_re_UL_f_prach[eNB_id][1]};
double *r_im_p_f_prach[2] = {r_im_UL_f_prach[eNB_id][0],r_im_UL_f_prach[eNB_id][1]};
#endif
/*for (int idx=0;idx<10;idx++) printf("dumping raw PRACH UL tx subframe (output) %d: r_re_im_p_f_prach[%d] = (%d,%d)\n", subframe, idx, (short)(r_re_p_f_prach[0][idx]),(short)(r_im_p_f_prach[0][idx]));
for (int idx=829;idx<839;idx++) printf("dumping raw PRACH UL tx subframe (output) %d: r_re_im_p_f_prach[%d] = (%d,%d)\n", subframe, idx, (short)(r_re_p_f_prach[0][idx]),(short)(r_im_p_f_prach[0][idx]));*/
//clock_t start=clock();
start_meas(&UE2eNB[0][eNB_id][CC_id]->rf_rx_simple_freq_PRACH);
rf_rx_simple(r_re_p_f_prach,
#ifdef SSE_float
rf_rx_simple_freq_SSE_float(r_re_p_f_prach,
r_im_p_f_prach,
nb_antennas_rx,
(prach_fmt<4)?839:139,
(float)1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns)
(float)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227,
frame_parms->symbols_per_tti,
frame_parms->ofdm_symbol_size,
12.0*frame_parms->N_RB_DL);
#else
rf_rx_simple_freq(r_re_p_f_prach,
r_im_p_f_prach,
nb_antennas_rx,
(prach_fmt<4)?839:139,
1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns)
(double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
(double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227,
frame_parms->symbols_per_tti,
frame_parms->ofdm_symbol_size,
12.0*frame_parms->N_RB_DL);
#endif
stop_meas(&UE2eNB[0][eNB_id][CC_id]->rf_rx_simple_freq_PRACH);
/*clock_t stop=clock();
......@@ -1302,6 +1505,16 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
rx_prachF = PHY_vars_eNB_g[eNB_id][CC_id]->prach_vars.rxsigF;
sf_offset = pointer_firstvalue_PRACH;
//start_meas(&UE2eNB[UE_id][eNB_id][CC_id]->adc_PRACH);
#ifdef SSE_float
adc_prach_SSE_float(r_re_p_f_prach,
r_im_p_f_prach,
0,
sf_offset,
(int **)rx_prachF,
nb_antennas_rx,
(prach_fmt<4)?839:139,
12);
#else
adc_prach(r_re_p_f_prach,
r_im_p_f_prach,
0,
......@@ -1310,6 +1523,7 @@ void do_UL_sig_freq_prach(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB
nb_antennas_rx,
(prach_fmt<4)?839:139,
12);
#endif
stop_meas(&UE2eNB[0][eNB_id][CC_id]->adc_PRACH);
//write_output("chsim_rxsigF.m","chsim_rx_sigF", PHY_vars_eNB_g[eNB_id][CC_id]->prach_vars.rxsigF[0],4*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,16);
#ifdef DEBUG_SIM
......
......@@ -228,6 +228,7 @@ help (void)
printf ("-b Set the number of local eNB\n");
printf ("-B Set the mobility model for eNB, options are: STATIC, RWP, RWALK, \n");
printf ("-c [1,2,3,4] Activate the config generator (OCG) to process the scenario descriptor, or give the scenario manually: -c template_1.xml \n");
printf ("-d Enable Frequency Domain Analysis (Time Domain Analysis is default)\n");
printf ("-C [0-6] Sets TDD configuration\n");
printf ("-e Activates extended prefix mode\n");
printf ("-E Random number generator seed\n");
......
......@@ -1176,7 +1176,6 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
sum=0;
count=0;
}
count++;
int ret = nsamps;
int UE_id = device->Mod_id;
......@@ -1244,7 +1243,7 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
if (do_ofdm_mod)
{
//start_meas(&dl_chan_stats_f);
//clock_t start=clock();
clock_t start=clock();
do_DL_sig_freq(eNB2UE,
enb_data,
ue_data,
......@@ -1253,14 +1252,16 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
&PHY_vars_UE_g[UE_id][CC_id]->frame_parms,
UE_id,
CC_id);
/*lock_t stop=clock();
clock_t stop=clock();
printf("do_DL_sig time is %f s, AVERAGE time is %f s, count %d, sum %e\n",(float) (stop-start)/CLOCKS_PER_SEC,(float) (sum+stop-start)/(count*CLOCKS_PER_SEC),count,sum+stop-start);
sum=(sum+stop-start);*/
sum=(sum+stop-start);
count++;
//stop_meas(&dl_chan_stats_f);
//print_meas(&dl_chan_stats_f,"DL_Channel Stats Frequency Domain",&dl_chan_stats_f,&dl_chan_stats_f);
}
else
{
//clock_t start=clock();
do_DL_sig(eNB2UE,
enb_data,
ue_data,
......@@ -1269,6 +1270,10 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
&PHY_vars_UE_g[UE_id][CC_id]->frame_parms,
UE_id,
CC_id);
/*clock_t stop=clock();
printf("do_DL_sig time is %f s, AVERAGE time is %f s, count %d, sum %e\n",(float) (stop-start)/CLOCKS_PER_SEC,(float) (sum+stop-start)/(count*CLOCKS_PER_SEC),count,sum+stop-start);
sum=(sum+stop-start);
count++;*/
}
last_UE_rx_timestamp[UE_id][CC_id] = last;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment