📄 chest.cpp
字号:
#include "typedef.h"
#include "global_var.h"
#include "interpolation.h"
#include "chest.h"
//LS
void chEst (Uint8 chEstMode,
Int16 *pChEstIn,
Uint16 chEstInLength,
PreambleIFreqTable Preamble,
Uint16 preambleLength,
ChannelEstResult *pPrevChEstOut,
ChannelEstResult *pChEstOut)
{
Uint16 i;
// Int16 preambleEnergy;
Int16 chEstTemp0[2*PREAMBLE_FREQ_FULL_SIZE];
Int16 chEstTemp1[2*PREAMBLE_FREQ_FULL_SIZE];
Int16 interpTemp0[PREAMBLE_FREQ_FULL_SIZE];//temp
Int16 interpTemp1[PREAMBLE_FREQ_FULL_SIZE];
Int32 noisePower;
Int32 signalPower;
Int16 shiftdistance;
Int16 bitWidth = 11;//(averagebitwidth-1)
shiftdistance = 15;
for (i = 0; i < chEstInLength; i++)
{
chEstTemp0[2*i] = 0;
chEstTemp0[2*i+1] = 0;
chEstTemp1[2*i] = 0;
chEstTemp1[2*i+1] = 0;
}
switch (chEstMode)
{
case LONGPREAMBLE_64:
{
// preambleEnergy = g_preamble64[SLIP] * g_preamble64[SLIP] + g_preamble64[SLIP] * g_preamble64[SLIP];
for (i = 0; i <= chEstInLength / 4; i++)
{
chEstTemp0[8*i] = (Int16)(((Int32)pChEstIn[8*i] * Preamble.preambleFreqTable64[8*i]
+ (Int32)pChEstIn[8*i+1] * Preamble.preambleFreqTable64[8*i+1]) >> (CHEST_SCALE + 1));
chEstTemp0[8*i+1] = (Int16)(((Int32)pChEstIn[8*i+1] * Preamble.preambleFreqTable64[8*i]
- (Int32)pChEstIn[8*i] * Preamble.preambleFreqTable64[8*i+1]) >> (CHEST_SCALE + 1));
}
for (i = 0; i < chEstInLength /2; i++)
{
interpTemp0[2*i] = chEstTemp0[8*i];
interpTemp0[2*i+1] = chEstTemp0[8*i+1];
}
interpolation (interpTemp0, chEstInLength / 4, 4, pChEstOut->ChEstOut);
(*pChEstOut).ChEstOut[400] = chEstTemp0[400];
(*pChEstOut).ChEstOut[401] = chEstTemp0[401];
for (i = 0; i <= chEstInLength; i++)
{
(*pChEstOut).chEstPwr[i] = ((*pChEstOut).ChEstOut[2*i] * (*pChEstOut).ChEstOut[2*i]
+ (*pChEstOut).ChEstOut[2*i+1] * (*pChEstOut).ChEstOut[2*i+1])
>> bitWidth;
}
noisePower = 0;
signalPower = 0;
for (i = 0; i <= chEstInLength / 4; i++)
{
signalPower += ((Int32)pChEstIn[8*i] * pChEstIn[8*i]
+ (Int32)pChEstIn[8*i+1] * pChEstIn[8*i+1]) / (chEstInLength / 4);
}
(*pChEstOut).rxSignalPower = (Int16) (signalPower >> (shiftdistance+1));
for (i = 0; i < chEstInLength/4; i++)
{
noisePower += (pChEstIn[8*i+2] * pChEstIn[8*i+2] + pChEstIn[8*i+3] * pChEstIn[8*i+3]
+ pChEstIn[8*i+4] * pChEstIn[8*i+4] + pChEstIn[8*i+5] * pChEstIn[8*i+5]
+ pChEstIn[8*i+6] * pChEstIn[8*i+6] + pChEstIn[8*i+7] * pChEstIn[8*i+7]);
}
(*pChEstOut).rxNoisePower = 3 * noisePower / (chEstInLength / 4);;
break;
}
case LONGPREAMBLE_128:
{
//preambleEnergy = g_preamble128Even[SLIP] * g_preamble128Even[SLIP] + g_preamble128Even[SLIP+1] * g_preamble128Even[SLIP+1];
for (i = 0; i <= chEstInLength / 2; i++)
{
chEstTemp0[4*i] = (Int16)(((Int32)pChEstIn[4*i] * Preamble.preambleFreqTable128Even[4*i]
+ (Int32)pChEstIn[4*i+1] * Preamble.preambleFreqTable128Even[4*i+1]) >> CHEST_SCALE);
chEstTemp0[4*i+1] = (Int16)(((Int32)pChEstIn[4*i+1] * Preamble.preambleFreqTable128Even[4*i]
- (Int32)pChEstIn[4*i] * Preamble.preambleFreqTable128Even[4*i+1]) >> CHEST_SCALE);
}
for (i = 0; i < chEstInLength /2; i++)
{
interpTemp0[2*i] = chEstTemp0[4*i];
interpTemp0[2*i+1] = chEstTemp0[4*i+1];
}
interpolation (interpTemp0, chEstInLength/2, 2, pChEstOut->ChEstOut);
(*pChEstOut).ChEstOut[400] = chEstTemp0[400];
(*pChEstOut).ChEstOut[401] = chEstTemp0[401];
for (i = 0; i <= chEstInLength; i++)
{
(*pChEstOut).chEstPwr[i] = ((*pChEstOut).ChEstOut[2*i] * (*pChEstOut).ChEstOut[2*i]
+ (*pChEstOut).ChEstOut[2*i+1] * (*pChEstOut).ChEstOut[2*i+1])
>> bitWidth;
}
noisePower = 0;
signalPower = 0;
for (i = 0; i <= chEstInLength / 2 ; i++)
{
signalPower += ((Int32)pChEstIn[4*i] * pChEstIn[4*i]
+ (Int32)pChEstIn[4*i+1] * pChEstIn[4*i+1]) / (chEstInLength / 2);
}
(*pChEstOut).rxSignalPower = (Int16) (signalPower >> shiftdistance);
//rxSignalPower maybe exceed 48db
for (i = 0; i < chEstInLength / 2; i++)
{
noisePower += (pChEstIn[4*i+2] * pChEstIn[4*i+2] + pChEstIn[4*i+3] * pChEstIn[4*i+3]);
}
(*pChEstOut).rxNoisePower = noisePower / (chEstInLength / 2);
for (i = 0; i < chEstInLength; i++)
{
(*pChEstOut).ChEstOut[2*i] = ((*pChEstOut).ChEstOut[2*i] + (*pPrevChEstOut).ChEstOut[2*i]) / 2;
(*pChEstOut).ChEstOut[2*i+1]= ((*pChEstOut).ChEstOut[2*i+1] + (*pPrevChEstOut).ChEstOut[2*i+1]) / 2;
}
for (i = 0; i < chEstInLength; i++)
{
(*pChEstOut).rxSignalPower = ((*pChEstOut).rxSignalPower + (*pPrevChEstOut).rxSignalPower) >> 1;
}
for (i = 0; i < chEstInLength; i++)
{
(*pChEstOut).rxNoisePower = ((*pChEstOut).rxNoisePower + (*pPrevChEstOut).rxNoisePower) >> 1;
}
break;
}
case SHORTPREAMBLE_128:
{
//preambleEnergy = g_preamble128Even[SLIP] * g_preamble128Even[SLIP] + g_preamble128Even[SLIP+1] * g_preamble128Even[SLIP+1];
for (i = 0; i <= chEstInLength / 2; i++)
{
chEstTemp0[4*i] = (Int16)(((Int32)pChEstIn[4*i] * Preamble.preambleFreqTable128Even[4*i]
+ (Int32)pChEstIn[4*i+1] * Preamble.preambleFreqTable128Even[4*i+1]) >> CHEST_SCALE);
chEstTemp0[4*i+1] = (Int16)(((Int32)pChEstIn[4*i+1] * Preamble.preambleFreqTable128Even[4*i]
- (Int32) pChEstIn[4*i] * Preamble.preambleFreqTable128Even[4*i+1]) >> CHEST_SCALE);
}
for (i = 0; i < chEstInLength /2; i++)
{
interpTemp0[2*i] = chEstTemp0[4*i];
interpTemp0[2*i+1] = chEstTemp0[4*i+1];
}
interpolation (interpTemp0, chEstInLength/2, 2, (*pChEstOut).ChEstOut);
(*pChEstOut).ChEstOut[400] = chEstTemp0[400];
(*pChEstOut).ChEstOut[401] = chEstTemp0[401];
for (i = 0; i <= chEstInLength; i++)
{
(*pChEstOut).chEstPwr[i] = ((*pChEstOut).ChEstOut[2*i] * (*pChEstOut).ChEstOut[2*i]
+ (*pChEstOut).ChEstOut[2*i+1] * (*pChEstOut).ChEstOut[2*i+1])
>> bitWidth;
}
noisePower = 0;
signalPower = 0;
for (i = 0; i <= chEstInLength / 2 ; i++)
{
signalPower += ((Int32)pChEstIn[4*i] * pChEstIn[4*i]
+ (Int32)pChEstIn[4*i+1] * pChEstIn[4*i+1]) / (chEstInLength / 2);
}
(*pChEstOut).rxSignalPower = (Int16) (signalPower >> shiftdistance);
//rxSignalPower maybe exceed 48db
for (i = 0; i < chEstInLength / 2; i++)
{
noisePower += (pChEstIn[4*i+2] * pChEstIn[4*i+2] + pChEstIn[4*i+3] * pChEstIn[4*i+3]);
}
(*pChEstOut).rxNoisePower = noisePower / (chEstInLength / 2);
break;
}
case PREAMBLE_STC:
{
//preambleEnergy = g_preamble128Even[SLIP] * g_preamble128Even[SLIP] + g_preamble128Even[SLIP+1] * g_preamble128Even[SLIP+1];
for (i = 0; i < chEstInLength / 2; i++)
{
chEstTemp0[4*i] = (Int16)(((Int32)pChEstIn[4*i] * Preamble.preambleFreqTable128Even[4*i]
+ (Int32)pChEstIn[4*i+1] * Preamble.preambleFreqTable128Even[4*i+1]) >> CHEST_SCALE);
chEstTemp0[4*i+1] = (Int16)(((Int32)pChEstIn[4*i+1] * Preamble.preambleFreqTable128Even[4*i]
- (Int32)pChEstIn[4*i] * Preamble.preambleFreqTable128Even[4*i+1]) >> CHEST_SCALE);
chEstTemp1[4*i+2] = (Int16)(((Int32)pChEstIn[4*i+2] * Preamble.preambleFreqTable128Odd[4*i+2]
+ (Int32)pChEstIn[4*i+3] * Preamble.preambleFreqTable128Odd[4*i+3]) >> CHEST_SCALE);
chEstTemp1[4*i+3] = (Int16)(((Int32)pChEstIn[4*i+3] * Preamble.preambleFreqTable128Odd[4*i+2]
- (Int32)pChEstIn[4*i+2] * Preamble.preambleFreqTable128Odd[4*i+3]) >> CHEST_SCALE);
}
chEstTemp0[400] = (Int16)(((Int32)pChEstIn[400] * Preamble.preambleFreqTable128Even[400]
+ (Int32)pChEstIn[401] * Preamble.preambleFreqTable128Even[401]) >> CHEST_SCALE);
chEstTemp0[401] = (Int16)(((Int32)pChEstIn[401] * Preamble.preambleFreqTable128Even[400]
- (Int32)pChEstIn[400] * Preamble.preambleFreqTable128Even[401]) >> CHEST_SCALE);
for (i = 0; i < chEstInLength /2; i++)
{
interpTemp0[2*i] = chEstTemp0[4*i];
interpTemp0[2*i+1] = chEstTemp0[4*i+1];
interpTemp1[2*i] = chEstTemp1[4*i+2];
interpTemp1[2*i+1] = chEstTemp1[4*i+3];
}
interpolation (interpTemp0, chEstInLength/2, 2, pChEstOut[0].ChEstOut);
interpolation (interpTemp1, chEstInLength/2, 2, pChEstOut[1].ChEstOut+2);
pChEstOut[0].ChEstOut[400] = chEstTemp0[400];
pChEstOut[0].ChEstOut[401] = chEstTemp0[401];
pChEstOut[1].ChEstOut[0] = (9 * chEstTemp1[2] - chEstTemp1[6]) / 8;
pChEstOut[1].ChEstOut[1] = (9 * chEstTemp1[3] - chEstTemp1[7]) / 8;
for (i = 0; i <= chEstInLength; i++)
{
pChEstOut[0].chEstPwr[i] = (pChEstOut[0].ChEstOut[2*i] * pChEstOut[0].ChEstOut[2*i]
+ pChEstOut[0].ChEstOut[2*i+1] * pChEstOut[0].ChEstOut[2*i+1])
>> bitWidth;
pChEstOut[1].chEstPwr[i] = (pChEstOut[1].ChEstOut[2*i] * pChEstOut[1].ChEstOut[2*i]
+ pChEstOut[1].ChEstOut[2*i+1] * pChEstOut[1].ChEstOut[2*i+1])
>> bitWidth;
}
pChEstOut[0].rxSignalPower = 0;
pChEstOut[0].rxNoisePower = 0;
pChEstOut[1].rxSignalPower = 0;
pChEstOut[1].rxNoisePower = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -