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

📄 est_channel.cpp

📁 扩展的直序扩频系统
💻 CPP
字号:
#include "Common.h"

extern float SNR;

void TimeEst(complex *CEsequence)
{
	complex channel[PREAMBLE_LENGTH] = {0., 0.},  hsum = {0.f,0.f};
	int i,j;
	complex *P, *PH, *Pa, *Painv;
	complex msequence[PREAMBLE_LENGTH] = {0.f, 0.f}, conjm[PREAMBLE_LENGTH] = {0.f, 0.f};
	float Ai = 0.f;

	FILE *fpt_CEchannel;

	if((fpt_CEchannel = fopen("CE_channel.dat","wb")) == NULL)
	{
		printf("Can not open the RxSignal.dat\n");
		return;
	}

	Gen_msequence(msequence);

	Ai = (float)(sqrt((SNR*(float)(CHIP_SIZE))/(float)(BPS)));
	
	#if (EST_MODE == 1)
	{

		for(i=0; i<PREAMBLE_LENGTH; i++)
		{
			CEsequence[i] = ComplexMulR(CEsequence[i], (float)(1./Ai));                // the normol CE sequence
		}

		for (i=0; i<PREAMBLE_LENGTH; i++)
		{
			conjm[i] = ComplexConj(msequence[i]);
		//	conjm[i+PREAMBLE_LENGTH] = conjm[i];
		}

		for(i=0; i<PREAMBLE_LENGTH; i++)       //get every multipath
		{
			for(j=0; j<PREAMBLE_LENGTH; j++)   //滑动相关
			{
				channel[i] = ComplexAdd( channel[i], ComplexMul(CEsequence[(i+j)%PREAMBLE_LENGTH], conjm[j]) ); 
			}
			hsum = ComplexAdd(hsum, channel[i]);
//			channel[i] = ComplexMulR(channel[i], (float)(1./30.));
		}

		for(i=0; i<PREAMBLE_LENGTH; i++)
		{
			channel[i] = ComplexMulR(ComplexAdd(channel[i] , hsum), (float)(1./32.));
		} 
	}
	
	#else
	{
		P  = (complex *) calloc(PREAMBLE_LENGTH*PREAMBLE_LENGTH,sizeof(complex));     //generate the P Matrix
		PH = (complex *) calloc(PREAMBLE_LENGTH*PREAMBLE_LENGTH,sizeof(complex));
		Pa = (complex *) calloc(PREAMBLE_LENGTH*PREAMBLE_LENGTH,sizeof(complex));
		Painv = (complex *) calloc(PREAMBLE_LENGTH*PREAMBLE_LENGTH,sizeof(complex));
		
		for(i=0; i<PREAMBLE_LENGTH; i++)
		{
			msequence[i] = ComplexMulR(msequence[i], Ai);                // the Ai m sequence
		}

		for(i=0; i<PREAMBLE_LENGTH; i++)
		{
			for(j=0; j<PREAMBLE_LENGTH; j++)
			{
				P[i*PREAMBLE_LENGTH+j] = msequence[(PREAMBLE_LENGTH-j+i)%PREAMBLE_LENGTH];  
			}
		}

		ComMatrix_H(P,PREAMBLE_LENGTH,PREAMBLE_LENGTH,PH);                              // PH
		ComMatrix_Mul(PH,P,PREAMBLE_LENGTH,PREAMBLE_LENGTH,PREAMBLE_LENGTH,Pa);           // PH*P
		ComMatrix_Inv(Pa,PREAMBLE_LENGTH,Painv);                                            //INV(PH*P)
		ComMatrix_Mul(Painv,PH,PREAMBLE_LENGTH,PREAMBLE_LENGTH,PREAMBLE_LENGTH,P);           //INV(PH*P)*PH
		ComMatrix_Mul(P,CEsequence,PREAMBLE_LENGTH,PREAMBLE_LENGTH,1,channel);         //INV(PH*P)*PH*CE

		free(P);
		free(PH);
		free(Pa);
		free(Painv);

//		for(i=0; i<PREAMBLE_LENGTH; i++)
//		{
//			channel[i] = ComplexMulR(channel[i], );
//		}
	}
    #endif

	fwrite(channel, sizeof(complex), PREAMBLE_LENGTH, fpt_CEchannel);     //保存供Rake使用

	fclose(fpt_CEchannel);

}
 
void FrequencyEst(complex *CEsequence)
{
	complex channel[PREAMBLE_LENGTH] = {0.,0.}, temp = {0.,0.};
	complex Fchannel[PREAMBLE_LENGTH] = {0.,0.};
	complex FFTCE[PREAMBLE_LENGTH] = {0.,0.};
	complex FFTM[PREAMBLE_LENGTH] = {0.,0.};
	complex msequence[PREAMBLE_LENGTH] = {0.f, 0.f};

	int i;
	FILE *fpt_CEchannel;
	
	if((fpt_CEchannel = fopen("CE_channel.dat","wb")) == NULL)
	{
		printf("Can not open the RxSignal.dat\n");
		return;
	}

	Gen_msequence(msequence);

	FFT( CEsequence, FFTCE, 1, PREAMBLE_LENGTH);
	FFT( msequence,  FFTM,  1, PREAMBLE_LENGTH);

    #if(EST_MODE == 1)	
	   for(i=0; i<PREAMBLE_LENGTH; i++)       
	   {	 
		    Fchannel[i] = ComplexMul(FFTCE[i], ComplexConj(FFTM[i])); 
	   }
    #else
	   for(i=0; i<PREAMBLE_LENGTH; i++)
	   {
		   Fchannel[i] = ComplexDiv(FFTCE[i], FFTM[i]);
	   }

    #endif

	FFT( Fchannel, channel, -1, PREAMBLE_LENGTH);

	fwrite(channel, sizeof(complex), PREAMBLE_LENGTH, fpt_CEchannel);     //保存供Rake使用

	fclose(fpt_CEchannel);	
}











































⌨️ 快捷键说明

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