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

📄 test_gsmchannel.c

📁 基于MATLAB的GSM仿真系统 并附有直接画出性能曲线的简化程序。
💻 C
字号:
#include "test_GSMChannel.h"

int DebugGSMChannel(double sigFrame[2][BURSTLEN*OVERSAMPLE],
                    double sigRecv[2][BURSTLEN*OVERSAMPLE],double SNR,long seed[1])
{
	int i,j;
	double noise[2];
//	long s[1];
	double sigma;

	//Ideal Channel
	for (i=0;i<BURSTLEN;i++)
	{
		for (j=0;j<OVERSAMPLE;j++)
		{
			sigRecv[0][i*OVERSAMPLE+j]=sigFrame[0][i*OVERSAMPLE+j];
			sigRecv[1][i*OVERSAMPLE+j]=sigFrame[1][i*OVERSAMPLE+j];
			//sigRecv[0][i*4+j]=tempArray[0][i*4+j];
			//sigRecv[1][i*4+j]=tempArray[1][i*4+j];
		}
	}
	//ISI
	/*for (i=0;i<BURSTLEN;i++)
	{
		if (i>0)
		{
			for (j=0;j<4;j++)
			{
				sigRecv[0][i*4+j]=sigFrame[0][i*4+j]+0.5*sigFrame[0][(i-1)*4+j+3];
				sigRecv[1][i*4+j]=sigFrame[1][i*4+j]+0.5*sigFrame[1][(i-1)*4+j+3];
			}
		}
		else
		{
			for (j=0;j<4;j++)
			{
				//sigRecv[0][i*4+j]=sigFrame[0][i*4+j];
				//sigRecv[1][i*4+j]=sigFrame[1][i*4+j];
				sigRecv[0][i*4+j]=0;
				sigRecv[1][i*4+j]=0;
			}
		}
	}*/
	/*for (i=0;i<BURSTLEN;i++)
	{
		if (i>4)
		{
			for (j=0;j<4;j++)
			{
				sigRecv[0][i*4+j]=sigFrame[0][i*4+j]+0.5*sigFrame[0][(i-1)*4+j]
					              +0.0*sigFrame[0][(i-2)*4+j]+0.0*sigFrame[0][(i-3)*4+j]
								  +0.0*sigFrame[0][(i-4)*4+j]+0.0*sigFrame[0][(i-5)*4+j];
				sigRecv[1][i*4+j]=sigFrame[1][i*4+j]+0.5*sigFrame[1][(i-1)*4+j]
					              +0.0*sigFrame[1][(i-2)*4+j]+0.0*sigFrame[1][(i-3)*4+j]
								  +0.0*sigFrame[1][(i-4)*4+j]+0.0*sigFrame[1][(i-5)*4+j];
			}
		}
		else
		{
			for (j=0;j<4;j++)
			{
				sigRecv[0][i*4+j]=sigFrame[0][i*4+j];
				sigRecv[1][i*4+j]=sigFrame[1][i*4+j];
			}
		}
	}*/

	//Add AWGN;
	sigma = pow(10.0,(SNR/10));
//	sigma = pow(10.0,(SNR[0]/10));
	for (i=0;i<BURSTLEN;i++)
	{
		for (j=0;j<OVERSAMPLE;j++)
		{
			DebugCgauss(noise,seed);
			//For Debug
			//printf("%f %f  ",noise[0],noise[1]);
			sigRecv[0][i*OVERSAMPLE+j]=sigRecv[0][i*OVERSAMPLE+j]+noise[0]/(sqrt(2*sigma));
			sigRecv[1][i*OVERSAMPLE+j]=sigRecv[1][i*OVERSAMPLE+j]+noise[1]/(sqrt(2*sigma));
		}
		//printf("\n");
	}
/*	mean = 0;
	sigma = 1*exp(-SNR/10);
	//s[0] = (unsigned)time( NULL );
	s[0] = 12;
	for (i=0;i<BURSTLEN;i++)
	{
		for (j=0;j<OVERSAMPLE;j++)
		{
			noise = gauss(mean,sigma,s);
			//For Debug
			//printf("%f ",noise);
			noise = noise/sqrt(2);
			sigRecv[0][i*OVERSAMPLE+j]=sigRecv[0][i*OVERSAMPLE+j]+noise;
			sigRecv[1][i*OVERSAMPLE+j]=sigRecv[1][i*OVERSAMPLE+j]+noise;
		}
		//printf("\n");
	}
	
*/
	return 0;
}


int DebugCgauss(double noise[2],long seed[1])
{
	double y,r1,v1,v2;

	r1 = 0;
	y = 0;
		do {
			v1 = (2.0 * uniform(seed)) - 1.0;
			v2 = (2.0 * uniform(seed)) - 1.0;
			r1 = (v1*v1);
			r1 = r1+(v2*v2);
		} while (r1 >= 1.0);
	y = log(r1);
//	y = log(r1);
	y = -2.0*y/r1;
	y = sqrt(y);
	noise[0] = v2*y;
	noise[1] = v1*y;

	return 0;
}


double uniform(long seed[1])
//--------------------------------------------------------------------
//       Returns uniform deviate between 0.0 and 1.0.
//       Used to generate PN data
//---------------------------------------------------------------------

{
	double r1;
	long hi;

	hi = seed[0]/LQ;
	seed[0] = LA*(seed[0]-hi*LQ) - LR*hi;
	if ((seed[0]) < 0) (seed[0]) += LM;
	r1  = LAM*(seed[0]);

	return(r1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -