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

📄 blueghost6.cpp

📁 信道基本特性的仿真程序
💻 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 + -