#include <math.h>
#define PI 3.14159
struct AWGN
{
long reset;
long ix;
long iy;
long iz;
double snr;
double sigma;
double I_sigma; //(1/(sigma*sigma))
double rate;
};
double random_u(struct AWGN *gauss)
{
double temp;
gauss->ix = (gauss->ix*249) % 61967;
gauss->iy = (gauss->iy*251) % 63443;
gauss->iz = (gauss->iz*252) % 63599;
temp= ( (double)gauss->ix/(double)61967 + (double)gauss->iy/(double)63443+ (double)gauss->iz/(double)63599 )
-(int)( (double)gauss->ix/(double)61967+ (double)gauss->iy/(double)63443+(double)gauss->iz/(double)63599 );
return(temp);
}
double gauss_g(struct AWGN *gauss)
{
double u1,u2;
double x;
double var;
var = gauss->sigma;
u1=random_u(gauss);
u2=random_u(gauss);
x=(double)sqrt((double)(-2)*log((double)1-u1))*(double)cos((double)2*(double)PI*u2);
x=(double)var*x; /*** 常数系数指标准差 ***/
return(x);
}
void awgn_channel (int input[] , double output[] , struct AWGN *gauss , int len)
{
int i;
double add;
int COLUMN;
COLUMN = len;
for (i=0;i<COLUMN;i++)
{
add = gauss_g(gauss);
output = input + add;
}
}
评论0