?? blueghost4.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>
#include <iostream.h>
#include <fstream.h>
#define PI 3.1415926535
/* 變量 No_symbols:循環(huán)次數(shù) */
#define No_symbols 1000000
/* rand_ra() : 返回1到30000的隨機數(shù)(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],DIVER[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, k, TIME, A_CD;
int ERROR,BITERROR;
double fading_I_D, fading_Q_D, AWGN_D_I, AWGN_D_Q;
double fading_F,fading_F_D,fading_F_T;
double T_I_D[17], T_Q_D[17];
double RECEIVEDSIGNAL_I_D, RECEIVEDSIGNAL_Q_D,d_I_D;
double BER_CD_total_D,BER_CD_D;
double BER_CD_total_T,BER_CD_T;
double l;
int A_CD_D,A_CD_T,M;
int ERROR_D,ERROR_T;
double BITERROR_D,BITERROR_T;
/* 隨機數(shù)表的初期化 */
srand((unsigned)time(NULL));
ofstream outfile("output");
if(!outfile)
{
cerr<<"Can't open file for output!";
}
/* 信道參數(shù)的輸入 */
/* fD = 最大多譜勒頻移, 1/T = 碼速*/
/* 輸入fDt */
/* 變量 FDT:FDT的値 */
printf ("2PSK Simulater \n");
printf ("fDT ? \n");
scanf("%lf",&FDT);
printf ("fDT= %f \n",FDT);
/* l:分集接收天線的位置?(距離)/(波長) */
l=0.5;
/* S/N的輸入 */
/* 變量 EBNR:SNR(dB) SNR:SNR(真?zhèn)? */
/* printf ("S/N (dB) ? \n");
scanf("%lf",&EBNR);
SNR = pow(10,EBNR/10);
printf ("S/N(dB)= %f \n",EBNR);
*/
for(EBNR=0;EBNR<10;EBNR=EBNR+2)
{
SNR = pow(10,EBNR/10);
/* 數(shù)據(jù)生成的初始化設定 */
/* 變量 BER_CD:誤碼檢測器 */
BER_CD = 0;
BER_CD_D=0;
BER_CD_T=0;
/* PN碼用位移寄存器的初始化 */
R[1]=1; R[2]=1; R[3]=1; R[4]=1; R[5]=1;
/* 變量 NORM:fading功率的歸一化用*/
NORM = sqrt(1./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]);
DIVER[N]=PI*l*sin(THETA[N]);
}
/* 主程序 */
for (k=1; k < No_symbols+1; k++)
{
/* 數(shù)據(jù)a(k)的生成 用PN碼來生成*/
/* A:用PN碼產(chǎn)生的信號 */
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"注:因為使用了2PSK調(diào)制 */
SIGNAL_I = 2 * A - 1; SIGNAL_Q = 0;
/* 瑞利衰落仿真器*/
fading_I = 0; fading_Q = 0;
fading_I_D = 0; fading_Q_D = 0;
//(這里是各自編寫的程序部分.詳細的說明請參照「程序追加部分的説明」)
for(N=1;N<=16;N++)
{
T_I[N]=cos(ALPHA[N]*k+PHI[N]+DIVER[N]);
T_Q[N]=sin(ALPHA[N]*k+PHI[N]+DIVER[N]);
T_I_D[N]=cos(ALPHA[N]*k+PHI[N]-DIVER[N]);
T_Q_D[N]=sin(ALPHA[N]*k+PHI[N]-DIVER[N]);
fading_I=fading_I+T_I[N];
fading_Q=fading_Q+T_Q[N];
fading_I_D=fading_I_D+T_I_D[N];
fading_Q_D=fading_Q_D+T_Q_D[N];
}
fading_I=fading_I*NORM;
fading_Q=fading_Q*NORM;
fading_I_D=fading_I_D*NORM;
fading_Q_D=fading_Q_D*NORM;
/* fading_F:衰落在天線#1的振幅(絶対値), fading_F_D:衰落在天線#2的振幅(絶対値)*/
fading_F = sqrt(pow(fading_I,2)+pow(fading_Q,2));
fading_F_D = sqrt(pow(fading_I_D,2)+pow(fading_Q_D,2));
/* 高斯噪聲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);
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_D_I = AA*cos(2*PI*B); AWGN_D_Q = AA*sin(2*PI*B);
/* 接收信號r(k)的生成 */
/* 變量 RECEIVEDSIGNAL_I:#1接收信號r(k)的實部 RECEIVEDSIGNAL_Q:#1接收信號r(k)的虛部 */
/* 變量RECEIVEDSIGNAL_I_D:#2接收信號r(k) 的實部 RECEIVEDSIGNAL_Q_D:#2接收信號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);
RECEIVEDSIGNAL_I_D=(SIGNAL_I*fading_I_D - SIGNAL_Q*fading_Q_D)+AWGN_D_I/sqrt(2*SNR);
RECEIVEDSIGNAL_Q_D=(SIGNAL_I*fading_Q_D + SIGNAL_Q*fading_I_D)+AWGN_D_Q/sqrt(2*SNR);
/* 同步檢波*/
/* 變量 d_I:#1同步檢波后的信號d(k)的實部*/
/* 變量 d_I_D:#2同步檢波后的信號d(k)的實部*/
d_I = RECEIVEDSIGNAL_I * fading_I + RECEIVEDSIGNAL_Q * fading_Q;
d_I_D = RECEIVEDSIGNAL_I_D * fading_I_D + RECEIVEDSIGNAL_Q_D * fading_Q_D;
/* 數(shù)據(jù)判別 */
/* #1のd_I:( 同步檢波的實部)如果為正,A_CD(接收信號)為1,負時A_CD為0 */
/* #2のd_I_D:( 同步檢波的實部)如果為正,A_CD_D(接收信號)為1,負時A_CD 為0 */
if (d_I > 0.) A_CD = 1;
else A_CD = 0;
if (d_I_D > 0.) A_CD_D = 1;
else A_CD_D = 0;
/* 分集接收信號的選擇(接收信號)*/
/* 變量A_CD_T :#1的振幅fading_Fと#2的振幅fading_F_D兩者相比較較大的信號一個被采用 */
if (fading_F >= fading_F_D) A_CD_T = A_CD;
else A_CD_T = A_CD_D;
/* 誤碼判別 */
/* 變量 ERROR:#1有錯誤置1,無錯置0 */
/* 變量 ERROR_D:#2有錯誤置1,無錯置0 */
/* 變量 ERROR_T:分集接受信號有錯誤置1,無錯置0*/
ERROR = (A - A_CD) % 2;
ERROR_D =(A - A_CD_D) % 2;
ERROR_T =(A - A_CD_T) % 2;
if (ERROR == 0) BITERROR = 0.;
else BITERROR = 1.;
if (ERROR_D == 0) BITERROR_D = 0.;
else BITERROR_D = 1.;
if (ERROR_T == 0) BITERROR_T = 0.;
else BITERROR_T = 1.;
/* BER_CD:#1的誤碼記數(shù)器 */
/* BER_CD_D:#2的誤碼記數(shù)器*/
/* BER_CD_T:分集接收信號的的誤碼記數(shù)器*/
BER_CD = BER_CD + BITERROR;
BER_CD_D = BER_CD_D + BITERROR_D;
BER_CD_T = BER_CD_T + BITERROR_T;
}
/* 誤碼率的計算和輸出 */
/* 變量 BER_CD_total:#1的誤碼率 */
/* 變量BER_CD_total_D:#2的誤碼率*/
/* 變量BER_CD_total_T:分集接收的誤碼率*/
BER_CD_total = BER_CD / No_symbols;
BER_CD_total_D = BER_CD_D / No_symbols;
BER_CD_total_T = BER_CD_T / No_symbols;
printf ("BER #1 = %f #2 = %f Divercity = %f \n",BER_CD_total,BER_CD_total_D,BER_CD_total_T);
outfile<<BER_CD_total<<" "<<BER_CD_total_D<<" "<<BER_CD_total_T;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -