|
小的是c语言初学者,前段时间遇到个很奇怪的问题 至今还没解决 学校的机器是linux的编程是gcc 我的电脑是window 用的 VC++
恳请复制代码运行一下 正确的是SNR=12以后BER=0
大致意思就是 一个010101的数字串 经过高斯噪音 (就是加一个高斯分布函数 ) 随着SNR信噪比的增大最后的BER比特误码率会变成0
试验结果在linux下BER可以最后变成0 windows下不行 不过很奇怪的是开头的几个数和linux下的 数据是一样的,但是后面就不行了 一直降不下来 我觉得是不是精度的问题 ?或者是random函数又问题 ? 请高人指教
程序如下
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define L 1000
double GaussN(double sigma2) {
double U1,U2,Z,a,X1,sigma;
sigma=sqrt(sigma2);
U1=(double)rand()/RAND_MAX;
U2=(double)rand()/RAND_MAX;
Z=sqrt(-2*log(1-U1));
a=U2*2*3.1415926;
X1=Z*cos(a)*sigma;
return X1;
}
void make_packet(int* tr_packet) {
double temp;
int i;
for (i=0;i<L;i++){
temp=rand();
if (temp<0.5) {
tr_packet=0;
} else {
tr_packet=1;
}
}
}
int main(void)
{
double r0,p,sigma2,SNRdB;
double SNR;
int i,j,A;
int tr_packet[L], re_packet[L];
int numofbiterror=0;
int N=1000;
FILE* fp;
A=1;
sigma2=1/(2*SNR);
make_packet(tr_packet);
for (SNRdB = 0; SNRdB <= 20; SNRdB += 2) {
numofbiterror=0;
SNR=pow(10,(SNRdB/10));
sigma2=1/(2*SNR);
for (i = 0; i < N; i++) {
for(j=0;j<L;j++) {
if (tr_packet[j]==0){
r0=A+GaussN(sigma2);
} else {
r0=-A+GaussN(sigma2);
}
if(r0>0) {
re_packet[j]=0;
} else {
re_packet[j]=1;
}
if (tr_packet[j]!=re_packet[j]) {
numofbiterror=numofbiterror+1;
}
}
}
p = (double)numofbiterror / (N * L);
printf("SNRdB=%f\tBER=%d/%d=%f\n",SNRdB,numofbiterror,N*L,p);
0;
} |
|