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

📄 chest.cpp

📁 在vc上做的802.16d ofdm phy的仿真
💻 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 + -