作者onlywig (环岛旅行ing)
看板C_and_CPP
标题Re: [问题] 关於浮点数的运算
时间Wed Jul 8 09:09:16 2009
原文吃光~~
我的程式码如下:
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<math.h>
//----------------------------------
#define N 100000
#define fs 10
#define ts 0.1
#define pi 3.141592653589793
#define length N*fs
#define SNR_dB 12
//----------------------------------bpsk random sequence and WGN
double Eb=1.0;
int bpsk(double mean,double sigma)
{
int i,m,g;
static double ak[N]={0.0};
static double sn[length]={0.0};
static double x[length]={0.0};
static double y[length]={0.0};
static double R[length]={0.0};
static double theta[length]={0.0};
static double randn[length]={0.0};
static double r[length]={0.0};
static double de_sn[length]={0.0};
int error = 0;
unsigned seed;
srand(time(NULL));
//----------------------------------continuous signal
for(m=0;m<N;m++)
{
ak[m]=rand()%2*2.0-1.0;
for(g=0;g<fs;g++)
{
sn[g+(m*fs)]=ak[m]*sqrt(2.0*Eb);
}
}
//----------------------------------AWGN
for(i=0;i<length;i++)
{
x[i]=rand()/32767.0;
y[i]=rand()/32767.0;
R[i]=sigma*sqrt(2.0*log(1.0/(1.0-x[i])));
theta[i]=2.0*pi*y[i];
randn[i]=R[i]*cos(theta[i])+mean;
r[i]=sn[i]+randn[i];
if(r[i]>0)
{
de_sn[i]=1.000000*sqrt(2*Eb);
}
else
{
de_sn[i]=-1.00000*sqrt(2*Eb);
}
if(de_sn[i]!=sn[i])
{
error=error+1;
}
else
{
error=error;
}
}
return error;
}
//--------------------------------------------------start
int main(void)
{
int k;
double mean[SNR_dB]={0.0};
double N0[SNR_dB]={0.0};
double sigma[SNR_dB]={0.0};
double SNRdB[SNR_dB]={0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0};
double SNR[SNR_dB]={0.0};
static double ber;
FILE *fp;
char *filename="ber.dat";
fp=fopen(filename,"wt");
for(k=0;k<SNR_dB;k++)
{
SNR[k]=pow(10.0,SNRdB[k]/10.0);
N0[k]=Eb/SNR[k];
sigma[k]=sqrt(N0[k]);
ber=(double)bpsk(mean[k],sigma[k])/(double)(N*fs);
fprintf(fp,"%f\t%d\n",ber,bpsk(mean[k],sigma[k]));
}
fclose(fp);
return 0;
}
很多写法还蛮新手的 希望别介意...
主要就是先产生不同的能量 再将能量的标准差(sigma表示)丢入bpsk副程式~
副程式里面做的事情就是先产生乱数讯号1 and -1 乘上sqrt(2)
如果是1就产生10个sqrt(2) 负1就产生10个-sqrt(2)
再来 产生杂讯 跟讯号混在一起~
再判断跟原讯号有无相同~ 不相同即错误+1 最後将错误丢回主程式 算错误率~
能量SNR_dB在1~9时都OK~ 10开始就误差很大了...
希望有人能解惑罗~
也谢谢各位看完我这新手程式码....
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.18.104.154
1F:推 Ebergies:建议你列出算式然後再尽可能最佳化 07/08 10:14
2F:→ VictorTom:老实说这code不知道怎麽简化成8/1000000还发现差很大的. 07/08 10:43
3F:→ onlywig:在存档的ber.dat里面 後面的整数代表各个数值除100万... 07/08 12:05
4F:→ onlywig:总之 先谢谢各位罗> < 07/08 12:06
5F:推 VictorTom:印double型态的时候, 改用 %lf 试试?? 07/08 13:06
6F:→ VictorTom:另外, %.15lf 也可以试试, 让它多印几位~~ 07/08 13:39
7F:→ VictorTom:虽然说那个8/1000000的数据看起来不是这个问题Orz 07/08 13:39
8F:→ onlywig:VT大 很感谢您一直帮我找问题~ 不过我想这可能就是为什麽 07/08 13:51
9F:→ onlywig:通讯系统的模拟都用MATLAB的关系吧.... 07/08 13:52
10F:→ onlywig:号外!!!!我找出问题了 原来是我程式码有bug 感动 07/08 14:35