📄 clinkprediction.cpp
字号:
const char* cSpecificString = "FER估计部分";
/* 打开数据文件准备读*/
if( !f1.Open( m_sRate_FERPredictionFileName,
CFile::modeRead ) )
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
char buf[100]; //定义一个数据缓冲区,用于存放一行字符串
//FER表的结构如下:
//字符标志(标识PER估计部分的数据起始位置) 多码个数(整型)
//码字数(整型) 信道类型的个数(整型)
// 信道类型(整型:'1') MCS级别的个数(整型)
// MCS级别(实型) 数据点的个数(整型)
// C/I(实型) FER(实型)
// ……
// ……
// ……
// C/I(实型) FER(实型)
// MCS级别(实型) 数据点的个数(整型)
// C/I(实型) FER(实型)
// ……
// ……
// ……
// C/I(实型) FER(实型)
// ……
// ……
// ……
// MCS级别(实型) 数据点的个数(整型)
// ……
// ……
// ……
// 信道类型(整型:'4') MCS级别的个数(整型)
// ……
// ……
// ……
// 信道类型(整型:'5') MCS级别的个数(整型)
//……
//……
//……
//码字数 信道类型的个数(整型)
//……
//……
//……
bFlag = false;
while( f1.ReadString( buf,100 ) != NULL )
{
s1 = buf; //把这一行字符串内容赋给对象s1
if ( s1.Find( cSpecificString ) >= 0 )
{
bFlag = TRUE;
break;
}
}
if ( !bFlag )
{
cerr<<"Cannot find the string "<<cSpecificString<<endl;
f1.Close();
exit(0);
}
s2 = s1.Right( s1.GetLength() - s1.Find(' ') - 1 );
m_MultiCodeNum = (int)strtod( s2, &q ); //有几种类型的多码
HSCodeNum2FER_TYPE *pCodeNum2FER = new HSCodeNum2FER_TYPE[m_MultiCodeNum];
HSChannel2FER_TYPE *pChannel2FER;
HSMCS2FER_TYPE *pMCS2FER;
HSCI2FER_TYPE *pCI2FER;
for ( i = 0; i<m_MultiCodeNum; i++ )
{
f1.ReadString(buf,100);
x = strtod( buf, &q ); //多码个数
pCodeNum2FER[i].iCodeNum = (int)x;
strcpy( buf, q );
x = strtod( buf, &q ); //信道个数
pCodeNum2FER[i].iChannel2FERLength = (int)x;
pChannel2FER = new HSChannel2FER_TYPE[pCodeNum2FER[i].iChannel2FERLength];
for (j = 0; j < pCodeNum2FER[i].iChannel2FERLength; j++)
{
f1.ReadString( buf, 100 );
x = strtod( buf, &q); //信道类型
pChannel2FER[j].iChannelMode = (int)x;
strcpy( buf, q );
x = strtod( buf, &q ); //MCS个数
pChannel2FER[j].iMCS2FERLength = (int)x;
pMCS2FER = new HSMCS2FER_TYPE[pChannel2FER[j].iMCS2FERLength];
for( k=0; k<pChannel2FER[i].iMCS2FERLength; k++)
{
f1.ReadString( buf, 100 );
x=strtod( buf, &q ); //MCS级别
pMCS2FER[k].iMCSMode=(int)x;
strcpy( buf, q );
x=strtod( buf, &q ); //number of data
pMCS2FER[k].iCI2FERLength = (int)x;
pCI2FER = new HSCI2FER_TYPE[pMCS2FER[k].iCI2FERLength];
for ( l = 0; l<pMCS2FER[k].iCI2FERLength; l++)
{
f1.ReadString( buf, 100 );
x = strtod( buf, &q ); //C/I 有待和地理因子的换算
pCI2FER[l].fC2I = (float)x;
strcpy( buf, q );
x=strtod( buf, &q ); //FER
pCI2FER[l].fFER = (float)x;
}
pMCS2FER[k].pstAddrOfCI2FER = pCI2FER;
}
pChannel2FER[j].pstAddrOfMCS2FER = pMCS2FER;
}
pCodeNum2FER[i].pstAddrOfChannel2FER = pChannel2FER;
}
m_pstFERPredictionTable = pCodeNum2FER;
f1.Close();
}
//////////////////////////////////////////////////////////////////////////
/*
TITLE: Getting FER Function
PURPOSE:通过查FER估计表,获得相应的FER数据,参数为码字个数、
TTI的平均C/I、信道模型、MCS模式
INPUTS: iCodeNum -- 码字个数
fMeanC2I -- TTI的平均C/I
iChnnelMode -- 信道模型
iMCSMode -- MCS模式
OUTPUTS:
fFER -- the frame error
CALLED BY FUNCTIONS:
CDataMs::FERPrediction()
AUTHOR: Su Lijun
DATE: 05/04/05
*/
//////////////////////////////////////////////////////////////////////////
float CLinkPrediction::GetFER(int iCurCodeNum, float fCurMeanC2I,
int iCurChannelMode, int iCurMCSMode)
{
HSCodeNum2FER_TYPE *pCodeNum2FER;
HSChannel2FER_TYPE *pChannel2FER;
HSMCS2FER_TYPE *pMCS2FER;
HSCI2FER_TYPE *pCI2FER[2];
int i;
//find in the first level of the table
for ( i=0; i<m_MultiCodeNum; i++ )
{
pCodeNum2FER = &m_pstFERPredictionTable[i];
if ( fabs( pCodeNum2FER->iCodeNum - iCurCodeNum ) < 1e-6 )
break;
}
if (i == m_MultiCodeNum)
{
cerr<<"Illegal multi_code number of "<<m_MultiCodeNum<<endl
<<"Can't find this kind of packet size in the table!"<<endl;
return 1.0;
}
//find in the second level of the table
for ( i=0; i < pCodeNum2FER->iChannel2FERLength; i++)
{
pChannel2FER = & (pCodeNum2FER -> pstAddrOfChannel2FER)[i];
if( fabs( pChannel2FER->iChannelMode-iCurChannelMode ) < 1e-6 )
break;
}
//find in the third level of the table
for ( i=0; i < pChannel2FER->iMCS2FERLength; i++)
{
pMCS2FER = &( pChannel2FER -> pstAddrOfMCS2FER )[i];
if( fabs( pMCS2FER->iMCSMode - iCurMCSMode ) < 1e-6 )
break;
}
//deal with the forth level of the table
for ( i=0; i < pMCS2FER->iCI2FERLength; i++)
{
pCI2FER[1] = &( pMCS2FER -> pstAddrOfCI2FER )[i];
if( pCI2FER[1] -> fC2I > fCurMeanC2I )
break;
pCI2FER[0] = pCI2FER[1];
}
if( i == 0 )
pCI2FER[0] = pCI2FER[1];
float x, y, x1, y1, x2, y2;
x = fCurMeanC2I;
x1 = pCI2FER[0] -> fC2I;
y1 = pCI2FER[0]->fFER;
x2 = pCI2FER[1] -> fC2I;
y2 = pCI2FER[1]->fFER;
if (y1<1e-4)
y1=-4;
else
y1=(float)log10(y1);
if (y2<1e-4)
y2=-4;
else
y2=(float)log10(y2);
if( x1 == x2 )
y = (y1 + y2) / 2;
else
y = ( (x2-x)*y1 + (x-x1)*y2 ) / (x2-x1);
y = (float)pow(10,y);
/*
//by slj, for test
char buf[50];
CStdioFile myfile;
myfile.Open("table.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
myfile.SeekToEnd();
_gcvt(iCurCodeNum,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
_gcvt(iCurChannelMode,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
_gcvt(iCurMCSMode,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
_gcvt(fCurMeanC2I,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
x1 = (float)pow(10,x1);
y1 = (float)pow(10,y1);
x2 = (float)pow(10,x2);
y2 = (float)pow(10,y2);
_gcvt(x1,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
_gcvt(y1,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
_gcvt(x2,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
_gcvt(y2,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\t");
_gcvt(y,10,buf);
myfile.WriteString(buf);
myfile.WriteString("\n");
*/
return y;
}
///////////////////////////////////////////////////////////////////////////
//by slj
void CLinkPrediction::SetRate_FERPredictionFileName(char *sFilename)
{
strcpy(m_sRate_FERPredictionFileName,
sFilename);
}
HSCodeNum2FER_TYPE* CLinkPrediction::GetFERPredictionTable()
{
return m_pstFERPredictionTable;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -