⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blueghost4.cpp

📁 信道基本特性的仿真程序
💻 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:循环次数 */
#define No_symbols 1000000

/* 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],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;

/* 随机数表的初期化 */
	srand((unsigned)time(NULL));
	ofstream outfile("output");
	if(!outfile)
	{
		cerr<<"Can't open file for output!";
	}

/* 信道参数的输入 */
/* 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(真値) */
/*	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);
/* 数据生成的初始化设定 */
/* 变量 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++) 
{
/* 数据a(k)的生成 用PN码来生成*/
/* A:用PN码产生的信号 */
	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调制 */
	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;

/* 数据判别 */
/* #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的误码记数器 */
/* BER_CD_D:#2的误码记数器*/
/* BER_CD_T:分集接收信号的的误码记数器*/
	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 + -