LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 872|回复: 1

跪求c语言解答 在线等

[复制链接]
发表于 2009-4-25 12:00:07 | 显示全部楼层 |阅读模式
小的是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;
}
发表于 2009-4-25 19:36:24 | 显示全部楼层
不要用VC++写C程序, VC++并不支持C语言编程。VC++是用于编写C++的,对于C语言只支持“兼容C89语法的老式严格ANSI C语言程序“。记住:C++和 C是 完全不同的两种语言,强制自己的程序仅仅在两种语言的交集中编程是非常痛苦和自虐的。

一般我们写 C 程序应当使用一个支持纯C语言尤其是支持C99标准的编译器,例如 gcc。楼主可以尝试一下 windows 版本的 gcc
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表