|
|
| 332 |
return (-1); |
332 |
return (-1); |
| 333 |
} |
333 |
} |
| 334 |
|
334 |
|
|
|
335 |
double |
| 336 |
RrFfMacScheduler::EstimateUlSinr (uint16_t rnti, uint16_t rb) |
| 337 |
{ |
| 338 |
std::map <uint16_t, std::vector <double> >::iterator itCqi = m_ueCqi.find (rnti); |
| 339 |
if (itCqi == m_ueCqi.end ()) |
| 340 |
{ |
| 341 |
// no cqi info about this UE |
| 342 |
return (NO_SINR); |
| 343 |
|
| 344 |
} |
| 345 |
else |
| 346 |
{ |
| 347 |
// take the average SINR value among the available |
| 348 |
double sinrSum = 0; |
| 349 |
unsigned int sinrNum = 0; |
| 350 |
for (uint32_t i = 0; i < m_cschedCellConfig.m_ulBandwidth; i++) |
| 351 |
{ |
| 352 |
double sinr = (*itCqi).second.at (i); |
| 353 |
if (sinr != NO_SINR) |
| 354 |
{ |
| 355 |
sinrSum += sinr; |
| 356 |
sinrNum++; |
| 357 |
} |
| 358 |
} |
| 359 |
double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX; |
| 360 |
// store the value |
| 361 |
(*itCqi).second.at (rb) = estimatedSinr; |
| 362 |
return (estimatedSinr); |
| 363 |
} |
| 364 |
} |
| 365 |
|
| 335 |
bool |
366 |
bool |
| 336 |
RrFfMacScheduler::SortRlcBufferReq (FfMacSchedSapProvider::SchedDlRlcBufferReqParameters i,FfMacSchedSapProvider::SchedDlRlcBufferReqParameters j) |
367 |
RrFfMacScheduler::SortRlcBufferReq (FfMacSchedSapProvider::SchedDlRlcBufferReqParameters i,FfMacSchedSapProvider::SchedDlRlcBufferReqParameters j) |
| 337 |
{ |
368 |
{ |
|
|
| 1384 |
{ |
1415 |
{ |
| 1385 |
// take the lowest CQI value (worst RB) |
1416 |
// take the lowest CQI value (worst RB) |
| 1386 |
double minSinr = (*itCqi).second.at (uldci.m_rbStart); |
1417 |
double minSinr = (*itCqi).second.at (uldci.m_rbStart); |
|
|
1418 |
if (minSinr == NO_SINR) |
| 1419 |
{ |
| 1420 |
minSinr = EstimateUlSinr ((*it).first, uldci.m_rbStart); |
| 1421 |
} |
| 1387 |
for (uint16_t i = uldci.m_rbStart; i < uldci.m_rbStart + uldci.m_rbLen; i++) |
1422 |
for (uint16_t i = uldci.m_rbStart; i < uldci.m_rbStart + uldci.m_rbLen; i++) |
| 1388 |
{ |
1423 |
{ |
| 1389 |
if ((*itCqi).second.at (i) < minSinr) |
1424 |
double sinr = (*itCqi).second.at (i); |
|
|
1425 |
if (sinr == NO_SINR) |
| 1390 |
{ |
1426 |
{ |
| 1391 |
minSinr = (*itCqi).second.at (i); |
1427 |
sinr = EstimateUlSinr ((*it).first, i); |
|
|
1428 |
} |
| 1429 |
if (sinr < minSinr) |
| 1430 |
{ |
| 1431 |
minSinr = sinr; |
| 1392 |
} |
1432 |
} |
| 1393 |
} |
1433 |
} |
| 1394 |
// translate SINR -> cqi: WILD ACK: same as DL |
1434 |
// translate SINR -> cqi: WILD ACK: same as DL |