📄 est_channel.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 + -