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

📄 blueghost3.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>
#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 + -