📄 blueghost6.cpp
字号:
/* 瑞利衰落仿真 */
/* K-factor Version */
/* Program by SAO Tomoki, OKUNO Kousuke */
/* 初始定义 */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define PI 3.1415926535
/* 变量 No_symbols:循环次数 */
#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, NORM1, NORM2, AA, B;
double fading_I, fading_Q;
double fading1_I, fading1_Q;
double fading2_I, fading2_Q;
double ALPHA1[17], PHI1[17], THETA1[17];
double ALPHA2, PHI2, THETA2;
double T1_I[17], T1_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,rnd7,rnd8,K;
double BER_CD, BITERROR ,BER_CD_total;
int R[6],temp;
int A, N, k, TIME, A_CD;
int ERROR;
/* 随机数表的初始化 */
srand((unsigned)time(NULL));
/*参数的输入 */
/* fDt的输入 */
/* 变量 FDT:FDT的値 */
/* printf ("2PSK Simulater \n");
printf ("fDt? \n");
scanf("%lf",&FDT);
printf ("fDT = %f \n",FDT); */
FDT=0.0031;
/* K值的输入 */
printf("K ?\n");
scanf("%lf",&K);
printf("K=%f\n",K);
/* S/N的输入 */
/* 变量 EBNR:SNR(dB) SNR:SNR(真値) */
/* printf ("S/N (dB) ? \n");
scanf("%lf",&EBNR);
SNR = pow(10,EBNR/10);
printf ("S/N(dB)= %f \n",EBNR);*/
/* 数据生成的确初始设定 */
/* 变量 BER_CD:数据差错检测器 */
for(EBNR=0;EBNR<=3;EBNR++)
{
SNR=pow(10,EBNR/10);
BER_CD = 0;
/* PN用移位寄存器的初始化 */
R[1]=1; R[2]=1; R[3]=1; R[4]=1; R[5]=1;
/* 使散射波与直射波的功率和为1的归一化*/
/* NORM1:散射波归一化变量 */
/* NORM2: 直射波归一化变量*/
NORM1=sqrt(1./16.)*sqrt(1./(K+1));
NORM2=sqrt(K/(K+1));
/* 衰落的角度和相位的初始设定 */
//(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)
FDT= 0.0030864;
rnd1=rand_ra();
THETA1[1]=(double)(rnd1/30000*2*PI/16);
for(N=2;N<=16;N++)
{
THETA1[N]=2*PI/16 +THETA1[N-1];
}
for(N=1;N<=16;N++)
{
rnd2=(double)rand_ra()/30000;
PHI1[N]=(double)(2*PI*rnd2);
ALPHA1[N]=2*PI*FDT*cos(THETA1[N]);
}
THETA2=(double)rand_ra()/30000*2*PI;
PHI2=(double)rand_ra()/30000*2*PI;
ALPHA2=2*PI*FDT*cos(THETA2);
for (k=0; k < No_symbols; k++)
{
/*用PN码生成数据a(k) */
/* 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"时,SIGNAL_I(信号的实部)是-1*/
/* SIGNAL_Q(信号的虚部)为"0" */
SIGNAL_I = 2 * A - 1; SIGNAL_Q = 0;
/* 瑞利仿真器 */
/* 初始设定 */
fading1_I = 0; fading1_Q = 0;
fading2_I = 0; fading2_Q = 0;
//(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)
for(N=1;N<=16;N++)
{
T1_I[N]=cos(ALPHA1[N]*k+PHI1[N]);
T1_Q[N]=sin(ALPHA1[N]*k+PHI1[N]);
fading1_I=T1_I[N]+fading1_I;
fading1_Q=T1_Q[N]+fading1_Q;
}
fading1_I=fading1_I*NORM1;
fading1_Q=fading1_Q*NORM1;
fading2_I=NORM2*cos(ALPHA2*k+PHI2);
fading2_Q=NORM2*sin(ALPHA2*k+PHI2);
fading_I=fading1_I+fading2_I;
fading_Q=fading1_Q+fading2_Q;
/* 高斯噪声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:(同步检波后的信号的实部)为正时,A_CD(接受信号)为1,負时为A_CD 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 + -