📄 cservicearea.cpp
字号:
//////////////////////////////////////////////////////////////////////////
//TITLE: AvePowerOutput(输出扇区的平均发射功率)
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
// 依照时间顺序输出扇区的平均发射功率
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//CALLED FUNCTIONS:
// CNetworkDrive::SimulationRun()
//
//DATE: 20040929
//////////////////////////////////////////////////////////////////////////
void CServiceArea::AvePowerOutput()
{
float fAvePower=0.0;
CStdioFile f;
char buf[50];
if(!f.Open("SectorAveragePower.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //exception handling
#endif
}
f.SeekToEnd();
//使文件指针指向文件尾部,输出数据可以在文件尾部接着写
f.WriteString("The Sector Average Transmission Power are:\n");
for(int i=0;i<m_iArrayPosition;i++)
{
_gcvt(m_fSectorAveragePower[i],8,buf);
f.WriteString(buf);
f.WriteString(" ");
}
f.Close();
//by zl 20050425
// int j=(int)(INITIALSLOT/100);
for(i=0;i<m_iArrayPosition;i++)
fAvePower+=m_fSectorAveragePower[i];
fAvePower/=(m_iArrayPosition);
if(!f.Open("voice.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //exception handling
#endif
}
f.SeekToEnd();
f.WriteString("扇区平均发射功率:");
_gcvt(fAvePower,8,buf);
f.WriteString(buf);
f.WriteString("\n");
f.WriteString("--------------------------------------------\n");
f.Close();
}
//////////////////////////////////////////////////////////////////////////
//TITLE: Translation(阴影小区转换函数)
//
//PARAMETERS:小区标号
//
//PURPOSE AND ALGORITHMS:
// 具体算法见《关于服务区环境模型的一些初步设想》
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//////////////////////////////////////////////////////////////////////////
CELLID_TYPE CServiceArea::Translation(CELLID_TYPE cellid)
{
if(cellid.m<=0)
{
cellid.m+=MM;
}
if(cellid.m>=MM+1)
{
cellid.m-=MM;
}
if(cellid.n<=0)
{
cellid.n+=NN;
}
if(cellid.n>=NN+1)
{
cellid.n-=NN;
}
return cellid;
}
//////////////////////////////////////////////////////////////////////////
// 以下为get(), set()接口函数 //
//////////////////////////////////////////////////////////////////////////
SECTORID_TYPE CServiceArea::GetCurrentSector() //返回当前扇区号
{
return m_stCurrentSector;
}
void CServiceArea::SetSiteDistance(float f_inputDistance) //设置基站间隔
{
m_fSiteDistance=f_inputDistance;
}
float CServiceArea::GetSiteDistance() //返回基站间隔
{
return m_fSiteDistance;
}
void CServiceArea::SetOrthogonalFactor(float i_inputOrthogonalFactor) //设置正交因子
{
m_fOrthogonalFactor=i_inputOrthogonalFactor;
}
float CServiceArea::GetOrthogonalFactor() //返回正交因子
{
return m_fOrthogonalFactor;
}
void CServiceArea::SectorPowerToFile(int iSlotNum)
{
//for compile
CStdioFile f;
char buf[50];
if(!f.Open("The sector power file.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
f.SeekToEnd();
f.WriteString("当前时隙为:");
_itoa(iSlotNum,buf,10);
f.WriteString(buf);
f.WriteString("\n");
f.WriteString("扇区编号: 扇区发射功率: 扇区DCH信道功率: 扇区DPCCH信道功率: 扇区DSCH信道功率:\n");
for(int m = 0; m<MM;m++)
{
for( int n = 0; n<NN;n++)
{
for(int i=0;i<SectorNumber;i++)
{
//获取扇区指针
CSector* pSector =&(m_aCellArray[m][n].m_aSectorInCell[i]);
//将发射功率参量输出到参数文件中
f.WriteString("(");
_gcvt(m+1,8,buf);
f.WriteString(buf);
f.WriteString(",");
_gcvt(n+1,8,buf);
f.WriteString(buf);
f.WriteString(",");
_gcvt(i+1,8,buf);
f.WriteString(buf);
f.WriteString(")\t\t");
_gcvt(pSector->GetTxPower(),8,buf);
f.WriteString(buf);
f.WriteString("\t");
_gcvt(pSector->GetTotalDCHPower(),8,buf);
f.WriteString(buf);
f.WriteString("\t");
_gcvt(pSector->GetHSDSCHPower(),8,buf);
f.WriteString(buf);
f.WriteString("\n");
}
}
}
}
/////////////////////////////////////////////////////////////////////////
//
// TITLE: HSDSCHProcess()
//
// PURPOSE: HS-DSCH用户处理过程
//
// CALLED BY FUNCTIONS:
//
// CALLING FUNCTIONS:
//
// AUTHOR: zhanglin
//
// DATE: 05/04(MM/YY)
//
// MODIFICATIONS SINCE 05/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CServiceArea::HSDSCHProcess()
{
CSector *pCurSector = NULL;
CDataMs *pCurDataMs=NULL;
NCHANNELSAW_TYPE* stSAW=NULL;
////循环所有扇区 revised by HuangFan
for(int m=0;m<MM;m++)
for(int n=0;n<NN;n++)
for(int iSectorNum = 0; iSectorNum < SectorNumber; ++iSectorNum )
{
////获取当前扇区最高优先级的HSDSCH用户
pCurSector = &m_aCellArray[m][n].m_aSectorInCell[iSectorNum]; //20050425
pCurDataMs = pCurSector->GetHighestPriorityDataMs();
if(pCurDataMs!=NULL)
{
if( pCurDataMs->IsTransmitNow()==false)
{
// 没有传输
pCurDataMs->NewTTIGenerate(); //产生新的TTI
pCurSector->SetIsExistHighestPriority(true); //设置扇区存在最高优先级
//如果采用的调度算法是最大C/I
if(pCurDataMs->m_fScheduleAlgorithm==MAXC2I)
{
pCurDataMs->SAWProcess(); //处理子信道
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
//该子信道上传输的是新数据,则进行速率预测
if(stSAW->bNewDataIndicator == true)
{
pCurDataMs->HSRatePrediction();
stSAW->pstRate2CI=pCurDataMs->GetHSDataRate();
}
}
//如果采用的调度算法轮询
else if(pCurDataMs->m_fScheduleAlgorithm==RANDOMR)
{
pCurDataMs->SAWProcess(); //处理子信道
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
if(stSAW->bNewDataIndicator == true)
{
pCurDataMs->HSRatePrediction();
stSAW->pstRate2CI=pCurDataMs->GetHSDataRate();
}
}
else if(pCurDataMs->m_fScheduleAlgorithm==PROPFAIRNESS)
{
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
}
else if(pCurDataMs->m_fScheduleAlgorithm==GradePF) //20051205
{
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
}
else if(pCurDataMs->m_fScheduleAlgorithm==AdaptiveGPF) //20051219
{
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
}
else if(pCurDataMs->m_fScheduleAlgorithm==Utility) //20060111
{
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
}
else if(pCurDataMs->m_fScheduleAlgorithm==M_LWDF)//20060405 by huangfan
{
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
}
else if(pCurDataMs->m_fScheduleAlgorithm==EXP) //20060405 by huangfan
{
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
}
}
else
{
stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
/* 20051223
if(stSAW->pstRate2CI->fDataRate!=0)
{
//正在传输,计算每个时隙的C/I
pCurDataMs->C2ICalculate();
pCurDataMs->m_fHSDSCHSlotC2IindB[HSDSCHTTISLOTNUM-pCurDataMs->GetSlotNumRemained()]=pCurDataMs->GetCurrentC2IindB();
//stSAW=pCurDataMs->GetSAWChannel(pCurDataMs->GetCurrChannelIndex());
}*/
}
pCurDataMs->TTITransmit(); //传输数据
if( pCurDataMs->IsTransmitNow()==true)//wlm 060223 准备下一时隙传输
{
TTINumInitialization();
}
// if(pCurDataMs->m_fScheduleAlgorithm==PROPFAIRNESS || pCurDataMs->m_fScheduleAlgorithm == GradePF || pCurDataMs->m_fScheduleAlgorithm == Utility)
pCurDataMs->m_fAverageRate+=(float)( stSAW->pstRate2CI->fDataRate/ fConstTc);
if( pCurDataMs->IsTTIEnd() == true )
{
//传输结束
pCurSector->SetPriorityFactor(-100000); // 设该扇区的最高优先级置0
pCurSector->SetHighestPriorityDataMs(NULL); // 清除扇区最高优先级的用户
pCurSector->SetIsExistHighestPriority(false); //扇区不存在最高优先级的用户
float fChannelC2IindB;
if(stSAW->pstRate2CI->fDataRate!=0)
{
//chase Combining
//pCurDataMs->TTIMeanC2ICalculate(); 20051223
float fTTIMeanC2IindB=pCurDataMs->GetTTIMeanC2IindB();
float fTTIMeanC2I=(float)pow(10,(fTTIMeanC2IindB/10));
stSAW->fChannelC2I+=fTTIMeanC2I;
fChannelC2IindB=float(10*log10(stSAW->fChannelC2I));
}
else
{fChannelC2IindB=-20;}
pCurDataMs->HSFERPredition(fChannelC2IindB); //误码率预测
stSAW->iFeedbackTimer=1;
pCurDataMs->HSTTIStatics(); //TTI统计
pCurDataMs->SectorStatistics(); //移动台和扇区的统计
pCurDataMs->SetCurrChannelIndex((int)-1); //清除当前的子信道下标
// if(stSAW->bNewDataIndicator==true)
// pCurDataMs->ThresholdAdjust(); //门限调整
//pCurDataMs->ThresholdOrderAdjust(); //门限顺序调整
//pCurDataMs->IntervalStatistics(); //区间统计
}
else
{
//传输没有结束,没有操作
}
}
}
}
void CServiceArea::TTINumInitialization()//wlm 置0
{
m_iTTINum=0;
}
void CServiceArea::TTINumAddOne()//wlm 步进
{
m_iTTINum++;
}
int CServiceArea::GetTTINum()//wlm 返回
{
return m_iTTINum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -