📄 timelinear.cpp
字号:
/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * Linear channel estimation in time direction * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *\******************************************************************************/#include "TimeLinear.h"/* Implementation *************************************************************/_REAL CTimeLinear::Estimate(CVectorEx<_COMPLEX>* pvecInputData, CComplexVector& veccOutputData, CVector<int>& veciMapTab, CVector<_COMPLEX>& veccPilotCells, _REAL rSNR){ int i, j; int iPiHiIndex; int iTimeDiffOld; int iTimeDiffNew; _COMPLEX cOldPilot; _COMPLEX cNewPilot; _COMPLEX cGrad; /* Channel estimation buffer -------------------------------------------- */ /* Move data in channel estimation-buffer (from iLenHistBuff - 1 towards 0) */ for (j = 0; j < iLenHistBuff - 1; j++) { for (i = 0; i < iNumIntpFreqPil; i++) matcChanEstHist[j][i] = matcChanEstHist[j + 1][i]; } /* Clear current symbol for new channel estimates */ for (i = 0; i < iNumIntpFreqPil; i++) matcChanEstHist[iLenHistBuff - 1][i] = _COMPLEX((_REAL) 0.0, (_REAL) 0.0); /* Timing correction history -------------------------------------------- */ /* Update timing correction history (shift register) */ vecTiCorrHist.AddEnd(0); /* Add new one to all history values */ for (i = 0; i < iLenTiCorrHist; i++) vecTiCorrHist[i] += (*pvecInputData).GetExData().iCurTimeCorr; /* Main loop ------------------------------------------------------------ */ /* Identify and calculate transfer function at the pilot positions */ for (i = 0; i < iNumCarrier; i++) { if (_IsScatPil(veciMapTab[i])) { /* Pilots are only every "iScatPilFreqInt"'th carrier */ iPiHiIndex = i / iScatPilFreqInt; /* h = r / s, h: transfer function of channel, r: received signal, s: transmitted signal */ matcChanEstHist[iLenHistBuff - 1][iPiHiIndex] = (*pvecInputData)[i] / veccPilotCells[i]; /* Linear interpolate in time direction from this current pilot to the corresponding pilot in the last symbol of the history */ for (j = 1; j < iLenHistBuff - 1; j++) { /* We need to correct pilots due to timing corrections ------ */ /* Calculate timing difference to old and new pilot */ iTimeDiffOld = vecTiCorrHist[0] - vecTiCorrHist[j]; iTimeDiffNew = 0 - vecTiCorrHist[j]; /* Correct pilot information for phase rotation */ cOldPilot = Rotate( matcChanEstHist[0][iPiHiIndex], i, iTimeDiffOld); cNewPilot = Rotate( matcChanEstHist[iLenHistBuff - 1][iPiHiIndex], i, iTimeDiffNew); /* Linear interpolation ------------------------------------- */ /* First, calculate gradient */ cGrad = (cNewPilot - cOldPilot) / (_REAL) (iLenHistBuff - 1); /* Apply linear interpolation to cells in between */ matcChanEstHist[j][iPiHiIndex] = cGrad * (_REAL) j + cOldPilot; } } } /* Copy channel estimation from current symbol in output buffer */ for (i = 0; i < iNumIntpFreqPil; i++) veccOutputData[i] = matcChanEstHist[0][i]; /* No SNR improvement by linear interpolation */ return rSNR;}int CTimeLinear::Init(CParameter& Parameter){ /* Init base class, must be at the beginning of this init! */ CPilotModiClass::InitRot(Parameter); /* Get parameters from global struct */ iNumCarrier = Parameter.iNumCarrier; iNumIntpFreqPil = Parameter.iNumIntpFreqPil; iScatPilFreqInt = Parameter.iScatPilFreqInt; /* Set length of history-buffer according to time-int-index */ iLenHistBuff = Parameter.iScatPilTimeInt + 1; /* Init timing correction history with zeros */ iLenTiCorrHist = iLenHistBuff - 1; vecTiCorrHist.Init(iLenTiCorrHist, 0); /* Allocate memory for channel estimation history and init with ones */ matcChanEstHist.Init(iLenHistBuff, iNumIntpFreqPil, _COMPLEX((_REAL) 1.0, (_REAL) 0.0)); /* Return delay of channel estimation in time direction */ return iLenHistBuff;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -