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

📄 clinkprediction.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -