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);
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);
anew[aarx+(aatx*desc->nb_rx)].x=sqrt(desc->ricean_factor*desc->amps[i]/2)*ziggurat(0.0,1.0);// Ziggurat function to improve pseudo-random normal number generation.
anew[aarx+(aatx*desc->nb_rx)].y=sqrt(desc->ricean_factor*desc->amps[i]/2)*ziggurat(0.0,1.0);// Ziggurat function to improve pseudo-random normal number generation.
if((i==0)&&(desc->ricean_factor!=1.0)){
if((i==0)&&(desc->ricean_factor!=1.0)){
if(desc->random_aoa==1){
if(desc->random_aoa==1){
...
@@ -1422,8 +1422,8 @@ int random_channel_freq(channel_desc_t *desc, uint8_t abstraction_flag) {
...
@@ -1422,8 +1422,8 @@ int random_channel_freq(channel_desc_t *desc, uint8_t abstraction_flag) {
anew[aarx+(aatx*desc->nb_rx)].x=sqrt(desc->ricean_factor*desc->amps[i]/2)*ziggurat(0.0,1.0);// Ziggurat function to improve pseudo-random normal number generation.
anew[aarx+(aatx*desc->nb_rx)].y=sqrt(desc->ricean_factor*desc->amps[i]/2)*ziggurat(0.0,1.0);// Ziggurat function to improve pseudo-random normal number generation.
/*!\brief Ziggurat random number generator based on rejection sampling. It returns a pseudorandom normally distributed double number with x=0 and variance=1*/
//Procedure to create tables for normal distribution kn,wn and fn
/*!\brief Ziggurat random number generator based on rejection sampling. It returns a pseudo-random normally distributed number with x=0 and variance=1*/
#define NOR (hz=SHR3,iz=(hz&127),(abs(hz)<kn[iz])? hz*wn[iz] : nfix())
#define NOR (hz=SHR3,iz=(hz&127),(abs(hz)<kn[iz])? hz*wn[iz] : nfix())
staticdoublewn[128],fn[128];
staticuint32_tiz,jz,jsr=123456789,kn[128];
staticint32_thz;
staticuint32_tjsr4[4]__attribute__((aligned(16)))={123456789,112548569,985584512,452236879};//This initialization depends on the seed for nor_table function in oaisim_functions.c file.
staticuint32_tjsr4[4]__attribute__((aligned(16)))={123456789,112548569,985584512,452236879};//This initialization depends on the seed for nor_table function in oaisim_functions.c file.
//#define jsr4 (jz=jsr, jsr^=(jsr<<13),jsr^=(jsr>>17),jsr^=(jsr<<5),jz+jsr,printf("seed %d, next seed %d\n",jz,jsr))
//#define SHR3_SSE (jsr_128=_mm_loadu_si128(jsr4),jz_128=jsr_128, printf("jsr4 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), jsr_128=_mm_xor_si128(_mm_slli_epi32(jsr_128,13),jsr_128),_mm_storeu_si128((__m128i *)jsr4,jsr_128),printf("jsr128<<13 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), jsr_128=_mm_xor_si128(_mm_srli_epi32(jsr_128,17),jsr_128),_mm_storeu_si128((__m128i *)jsr4,jsr_128),printf("jsr128>>17 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), jsr_128=_mm_xor_si128(_mm_slli_epi32(jsr_128,5),jsr_128),_mm_storeu_si128((__m128i *)jsr4,jsr_128), printf("jsr128<<5 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), _mm_storeu_si128(out,_mm_add_epi32(jz_128,jsr_128)),printf("out is %lu,%lu,%lu,%lu\n",out[0],out[1],out[2],out[3]),_mm_add_epi32(jz_128,jsr_128))
//#define UNI_SSE (_mm_storeu_ps(out,_mm_add_ps(_mm_mul_ps(_mm_set1_ps(0.2328306e-9),_mm_cvtepi32_ps(SHR3_SSE)),_mm_set1_ps(0.5))),printf("out is %e,%e,%e,%e\n",out[0],out[1],out[2],out[3]),_mm_add_ps(_mm_mul_ps(_mm_set1_ps(0.2328306e-9),_mm_cvtepi32_ps(SHR3_SSE)),_mm_set1_ps(0.5)))
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);*/
v2=2.0*UNI-1.0;
v2=2.0*UNI-1.0;
r=v1*v1+v2*v2;
r=v1*v1+v2*v2;
//printf("Inside do: r %e\n",r);
}while(r>=1.0);
}while(r>=1.0);
//printf("outside do: r %e\n",r);
fac=sqrt(-2.0*log(r)/r);
fac=sqrt(-2.0*log(r)/r);
gset=v1*fac;
gset=v1*fac;
iset=1;
iset=1;
return(sqrt(variance)*v2*fac+mean);
return(sqrt(variance)*v2*fac+mean);
}else{
}else{
iset=0;
iset=0;
//printf("normal random number %e, max %e, min %e\n",sqrt(variance)*gset + mean, max,min);
// this need to be integrated with the existing rng, like taus: navid
msg("Initializing random number generator, seed %x\n",seed_init);
randominit();
if (seed_init == 0) {
srand((unsigned)time(NULL));
seed_array[0] = (unsigned int) rand();
seed_array[1] = (unsigned int) rand();
seed_array[2] = (unsigned int) rand();
seed_array[3] = (unsigned int) rand();
seed = (unsigned int) rand();
} else {
seed = seed_init;
seed_array[0] = seed_init;
seed_array[1] = log(seed_init);
seed_array[2] = pow(seed_init,3);
seed_array[3] = sqrt(seed_init);
}
if (seed % 2 == 0) seed += 1; // seed and mod are relative prime
for (i=0;i<4;i++)
if (seed_array[i] % 2 == 0) seed_array[i] += 1; // seed and mod are relative prime
for(i=0;i<10;i++){
for (i=1; i<4*98; i++) { //4 times 98 to use in SSE implementations
printf("%f\n",gaussdouble(0.0,1.0));
seed_array[i%4] = a*seed_array[i%4]; // mod 2**32
ir[i]= seed_array[i%4]; // initialize the shuffle table
}
}
}
for ( i = 0; i < 4*98; i++ ){
#endif
printf("ir[%d]: %d\n",i,ir[i]);
}
iy=1;
}*/
//#define jsr4 (jz=jsr, jsr^=(jsr<<13),jsr^=(jsr>>17),jsr^=(jsr<<5),jz+jsr,printf("seed %d, next seed %d\n",jz,jsr))
//#define SHR3_SSE (jsr_128=_mm_loadu_si128(jsr4),jz_128=jsr_128, printf("jsr4 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), jsr_128=_mm_xor_si128(_mm_slli_epi32(jsr_128,13),jsr_128),_mm_storeu_si128((__m128i *)jsr4,jsr_128),printf("jsr128<<13 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), jsr_128=_mm_xor_si128(_mm_srli_epi32(jsr_128,17),jsr_128),_mm_storeu_si128((__m128i *)jsr4,jsr_128),printf("jsr128>>17 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), jsr_128=_mm_xor_si128(_mm_slli_epi32(jsr_128,5),jsr_128),_mm_storeu_si128((__m128i *)jsr4,jsr_128), printf("jsr128<<5 is %lu,%lu,%lu,%lu\n",jsr4[0],jsr4[1],jsr4[2],jsr4[3]), _mm_storeu_si128(out,_mm_add_epi32(jz_128,jsr_128)),printf("out is %lu,%lu,%lu,%lu\n",out[0],out[1],out[2],out[3]),_mm_add_epi32(jz_128,jsr_128))
//#define UNI_SSE (_mm_storeu_ps(out,_mm_add_ps(_mm_mul_ps(_mm_set1_ps(0.2328306e-9),_mm_cvtepi32_ps(SHR3_SSE)),_mm_set1_ps(0.5))),printf("out is %e,%e,%e,%e\n",out[0],out[1],out[2],out[3]),_mm_add_ps(_mm_mul_ps(_mm_set1_ps(0.2328306e-9),_mm_cvtepi32_ps(SHR3_SSE)),_mm_set1_ps(0.5)))