UL-CQI and AMC in RrFfMacScheduler

This commit is contained in:
mmiozzo
2011-04-06 14:41:21 +02:00
parent 62bef6e4f0
commit 0342f56a27
4 changed files with 116 additions and 24 deletions

View File

@@ -23,29 +23,11 @@
#include "ns3/network-module.h"
#include "ns3/mobility-module.h"
#include "ns3/lte-module.h"
#include "ns3/config-store.h"
//#include "ns3/gtk-config-store.h"
using namespace ns3;
int main (int argc, char *argv[])
{
CommandLine cmd;
cmd.Parse (argc, argv);
// to save a template default attribute file run it like this:
// ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
//
// to load a previously created default attribute file
// ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
// note that the latter will override any of the defaults set via command-line arguments
//
ConfigStore inputConfig;
inputConfig.ConfigureDefaults ();
LenaHelper lena;
lena.EnableLogComponents ();
@@ -84,6 +66,9 @@ int main (int argc, char *argv[])
Simulator::Run ();
//GtkConfigStore config;
//config.ConfigureAttributes ();
Simulator::Destroy ();
return 0;
}

View File

@@ -851,6 +851,8 @@ PfFfMacScheduler::DoSchedUlCqiInfoReq (const struct FfMacSchedSapProvider::Sched
}
}
// remove obsolete info on allocation
m_allocationMaps.erase (m_allocationMaps.begin (), ++itMap);
return;
}

View File

@@ -207,7 +207,8 @@ RrSchedulerMemberSchedSapProvider::SchedUlCqiInfoReq (const struct SchedUlCqiInf
RrFfMacScheduler::RrFfMacScheduler ()
: m_cschedSapUser (0),
m_schedSapUser (0)
m_schedSapUser (0),
m_schedTtiDelay (2) // WILD ACK: based on a m_macChTtiDelay = 1
{
m_cschedSapProvider = new RrSchedulerMemberCschedSapProvider (this);
m_schedSapProvider = new RrSchedulerMemberSchedSapProvider (this);
@@ -544,7 +545,7 @@ RrFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched
int rbAllocated = 0;
FfMacSchedSapUser::SchedUlConfigIndParameters ret;
std::vector <uint16_t> rbgAllocationMap;
for (it = m_ceBsrRxed.begin (); it != m_ceBsrRxed.end (); it++)
{
if (rbAllocated + rbPerFlow > m_cschedCellConfig.m_ulBandwidth)
@@ -552,12 +553,45 @@ RrFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched
// limit to physical resources last resource assignment
rbPerFlow = m_cschedCellConfig.m_ulBandwidth - rbAllocated;
}
// store info on allocation for managing ul-cqi interpretation
for (int i = 0; i < rbPerFlow; i++)
{
rbgAllocationMap.push_back ((*it).first);
}
UlDciListElement_s uldci;
uldci.m_rnti = (*it).first;
uldci.m_rbStart = rbAllocated;
uldci.m_rbLen = rbPerFlow;
rbAllocated += rbPerFlow;
uldci.m_mcs = 0; // MCS 0 -> UL-AMC TBD
std::map <uint16_t, std::vector <double> >::iterator itCqi = m_ueCqi.find ((*it).first);
if (itCqi == m_ueCqi.end ())
{
// no cqi info about this UE
uldci.m_mcs = 0; // MCS 0 -> UL-AMC TBD
//NS_LOG_DEBUG (this << " UE does not have ULCQI " << (*it).first );
}
else
{
// take the lowest CQI value (worst RB)
double minSinr = (*itCqi).second.at(uldci.m_rbStart);
for (uint16_t i = uldci.m_rbStart; i < uldci.m_rbStart + uldci.m_rbLen; i++)
{
//NS_LOG_DEBUG (this << " UE " << (*it).first << " has CQI " << (*itCqi).second.at(i));
if ((*itCqi).second.at(i) < minSinr)
{
minSinr = (*itCqi).second.at(i);
}
}
// translate SINR -> cqi: WILD ACK: same as DL
double s = log2 ( 1 + (
pow (10, minSinr / 10 ) /
( (-log (5.0 * 0.00005 )) / 1.5) ));
int cqi = LteAmc::GetCqiFromSpectralEfficiency (s);
uldci.m_mcs = LteAmc::GetMcsFromCqi (cqi);
//NS_LOG_DEBUG (this << " UE " << (*it).first << " minsinr " << minSinr << " -> mcs " << (uint16_t)uldci.m_mcs);
}
uldci.m_tbSize = (LteAmc::GetTbSizeFromMcs (uldci.m_mcs, rbPerFlow) / 8); // MCS 0 -> UL-AMC TBD
uldci.m_ndi = 1;
uldci.m_cceIndex = 0;
@@ -573,6 +607,7 @@ RrFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched
uldci.m_pdcchPowerOffset = 0; // not used
ret.m_dciList.push_back (uldci);
}
m_allocationMaps.insert (std::pair <uint16_t, std::vector <uint16_t> > (params.m_sfnSf, rbgAllocationMap));
m_schedSapUser->SchedUlConfigInd (ret);
return;
}
@@ -628,7 +663,62 @@ void
RrFfMacScheduler::DoSchedUlCqiInfoReq (const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params)
{
NS_LOG_FUNCTION (this);
// TODO: Implementation of the API
//NS_LOG_DEBUG (this << " RX UL CQI at " << params.m_sfnSf);
// correlate info on UL-CQIs with previous scheduling -> calculate m_sfnSf of transmission
uint32_t frameNo = (0xFF & params.m_sfnSf) >> 4;
uint32_t subframeNo = (0xF & params.m_sfnSf);
//NS_LOG_DEBUG (this << " sfn " << frameNo << " sbfn " << subframeNo);
if (subframeNo - m_schedTtiDelay < 0)
{
frameNo--;
}
subframeNo = (subframeNo - m_schedTtiDelay) % 10;
//NS_LOG_DEBUG (this << " Actual sfn " << frameNo << " sbfn " << subframeNo);
uint16_t sfnSf = ((0xFF & frameNo) << 4) | (0xF & subframeNo);
// retrieve the allocation for this subframe
std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
std::map <uint16_t, std::vector <double> >::iterator itCqi;
itMap = m_allocationMaps.find (sfnSf);
if (itMap == m_allocationMaps.end())
{
NS_LOG_DEBUG (this << " Does not find info on allocation");
return;
}
for (uint32_t i = 0; i < (*itMap).second.size (); i++)
{
// convert from fixed point notation Sxxxxxxxxxxx.xxx to double
double sinr = LteFfConverter::fpS11dot3toDouble (params.m_ulCqi.m_sinr.at (i));
//NS_LOG_DEBUG (this << " UE " << (*itMap).second.at (i) << " SINRfp " << params.m_ulCqi.m_sinr.at (i) << " sinrdb " << sinr);
itCqi = m_ueCqi.find ((*itMap).second.at (i));
if (itCqi == m_ueCqi.end ())
{
// create a new entry
std::vector <double> newCqi;
for (uint32_t j = 0; j < m_cschedCellConfig.m_ulBandwidth; j++)
{
if (i==j)
{
newCqi.push_back (sinr);
}
else
{
// initialize with minumum values according to the fixed point notation
newCqi.push_back (LteFfConverter::getMinFpS11dot3Value ());
}
}
m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
}
else
{
// update the value
(*itCqi).second.at (i) = sinr;
}
}
// remove obsolete info on allocation
m_allocationMaps.erase (m_allocationMaps.begin (), ++itMap);
return;
}

View File

@@ -27,6 +27,7 @@
#include <ns3/ff-mac-scheduler.h>
#include <vector>
#include <map>
#include <ns3/lte-common.h>
namespace ns3 {
@@ -127,7 +128,19 @@ private:
/*
* Map of UE's DL CQI P01 received
*/
std::map <uint16_t,uint8_t> m_p10CqiRxed;
std::map <uint16_t,uint8_t> m_p10CqiRxed;
/*
* Map of previous allocated UE per RBG
* (used to retrieve info from UL-CQI)
*/
std::map <uint16_t, std::vector <uint16_t> > m_allocationMaps;
/*
* Map of UEs' UL-CQI per RBG
*/
std::map <uint16_t, std::vector <double> > m_ueCqi;
/*
@@ -144,6 +157,8 @@ private:
// Internal parameters
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig;
uint8_t m_schedTtiDelay; // delay between scheduling and reception (based on m_macChTtiDelay)
};