📄 blueghost3.cpp
字号:
/* 瑞利衰落仿真 */
/* Visual C++ 版 Ver. 2.10 / 2001.4.10 */
/* Adachi Lab. / SAO Tomoki */
/* 初始定義 */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define PI 3.1415926535
#define No_symbols 1000000
/* 随机数产生函数 rand_ra() 的定義 */
/* rand_ra() : 返回从1到30000的随机数(only Visual C++) */
int rand_ra()
{
int r,i=0;
while(i == 0)
{
r = rand() - 2767;
if (r >= 0) break;
}
return r;
}
void main()
{
double FDT, EBNR, SNR, B, AA, NORM;
double fading_I, fading_Q;
double ALPHA[17], PHI[17], THETA[17];
double T_I[17], T_Q [17];
double SIGNAL_I, SIGNAL_Q;
double RECEIVEDSIGNAL_I, RECEIVEDSIGNAL_Q, d_I;
double AWGN_I, AWGN_Q;
double rnd1,rnd2,rnd3,rnd4,rnd5,rnd6;
double BER_CD, BER_CD_total;
int R[6],temp;
int A, N, NM, k, TIME, A_CD;
int ERROR,BITERROR;
/* 随机数表的初始化 */
srand((unsigned)time(NULL));
/*参数的输入 */
/* fDT的输入 */
/* 变量 FDT:FDT的値 */
printf ("2PSK Simulater \n"); //输入FDT的值
printf ("fDt? \n");
scanf("%lf",&FDT);
printf ("fDT = %f \n",FDT);
//FDT=0.0031;
/* S/N的输入 */
/* 变量 EBNR:SNR(dB) SNR:SNR(真値) */
/*printf ("S/N (dB) ? \n"); //SN比(信号対噪音的功率比,与SNR,S/N相同)的输入
scanf("%lf",&EBNR);
SNR = pow(10,EBNR/10);
printf ("S/N(dB)= %f \n",EBNR);*/
for(EBNR=0;EBNR<=10;EBNR++)
{
SNR = pow(10,EBNR/10);
/* 数据生成的初始設定 */
/* 变量 BER_CD:数据错误累加器 */
BER_CD = 0; //累加器的初始化
/* PN码用 位移存储器的初始化 */
R[1]=1; R[2]=1; R[3]=1; R[4]=1; R[5]=1;
/* 变量 NORM:为使衰落的平均功率归一化*/
NORM = sqrt(1./16.); //到来波为16个
/* 衰落的角度,相位的初始花设定*/
//(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)
FDT= 0.0030864;
rnd1=rand_ra();
THETA[1]=(double)(rnd1/30000*2*PI/16);
for(N=2;N<=16;N++)
{
THETA[N]=2*PI/16 +THETA[N-1];
}
for(N=1;N<=16;N++)
{
rnd2=(double)rand_ra()/30000;
PHI[N]=(double)(2*PI*rnd2);
ALPHA[N]=2*PI*FDT*cos(THETA[N]);
}
for(k=0; k<No_symbols;k++)
{
/* 数据a(k)的生成 用PN码生成数字序列*/
/* A:发生的数字序列*/
A = R[5]; temp = (R[2] + R[5]) % 2; R[5] = R[4];
R[4] = R[3]; R[3] = R[2]; R[2] = R[1]; R[1] = temp;
/* 2PSK信号s(k)的生成 */
/* 变量 SIGNAL_I:信号s(k)的实部, SIGNAL_Q:信号s(k)的虚部 */
/* A是"1"时,SIGNAL_I(信号的实部)是1,"0"时,是-1*/
/* SIGNAL_Q(信号的虚部)"0" */
SIGNAL_I = 2 * A - 1; SIGNAL_Q = 0;
/* 瑞利衰落器 */
fading_I = 0; fading_Q = 0;
//(★无衰落时的仿真如何实现也在这里考虑★)
fading_I=0;fading_Q=1;
//adding code
/*for(N=1;N<=16;N++)
{
T_I[N]=cos(ALPHA[N]*k+PHI[N]);
T_Q[N]=sin(ALPHA[N]*k+PHI[N]);
fading_I=T_I[N]+fading_I;
fading_Q=T_Q[N]+fading_Q;
}
fading_I=fading_I*NORM;
fading_Q=fading_Q*NORM;*/
/* 高斯噪声w(k)的生成 */
/* AWGN_I: 高斯噪声w(k)的实部 AWGN_Q: 高斯噪声w(k)的虚部 */
rnd3= rand_ra()%10000; rnd4= rand_ra()%10000;
rnd5= rand_ra()%10000; rnd6= rand_ra()%10000;
AA = sqrt(-2. * log((rnd3*0.0001)+(rnd4*0.00000001) + 0.000000001));
B = (rnd5* 0.0001)+(rnd6* 0.00000001);
AWGN_I = AA*cos(2*PI*B);
AWGN_Q = AA*sin(2*PI*B);
/* 接收信号r(k)的生成 */
/* 变量 RECEIVEDSIGNAL_I:接收信号r(k)的实部 RECEIVEDSIGNAL_Q:接收信号r(k)的虚部 */
RECEIVEDSIGNAL_I=(SIGNAL_I*fading_I - SIGNAL_Q*fading_Q)+AWGN_I/sqrt(2*SNR);
RECEIVEDSIGNAL_Q=(SIGNAL_I*fading_Q + SIGNAL_Q*fading_I)+AWGN_Q/sqrt(2*SNR);
/* 同步检波*/
/* 变量 d_I: 同步检波后的信号d(k)的实部*/
d_I = RECEIVEDSIGNAL_I * fading_I + RECEIVEDSIGNAL_Q * fading_Q;
/* 数据判别 */
/* d_I:( 同步检波后的信号d(k)的实部)为正时,A_CD(接收信号)为1,負时为0 */
if (d_I > 0.) A_CD = 1;
else A_CD = 0;
/* 错误识别 */
/* 变量 ERROR:传输错误时为1,传输正确时为0 */
ERROR = (A - A_CD) % 2;
if (ERROR == 0) BITERROR = 0;
else BITERROR = 1;
/* BER_CD: 错误次数累加*/
BER_CD = BER_CD + BITERROR;
}
/* 误码率(BER)的計算?输出 */ /* 变量 BER_CD_total: 误码率*/
BER_CD_total = BER_CD/No_symbols;
printf ("BER = %f \n",BER_CD_total);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -