double
NrInitialAssociation::ComputeMaxRsrp(const Ptr<NetDevice>& gnbDevice, LocalSearchParams& lsps)
{
auto& chParams = lsps.chParams;
auto& mobility = lsps.mobility;
auto& antennas = lsps.antennaArrays;
uint8_t activePanelIndex = GetUeActivePanel();
antennas.gnbArrayModel = ExtractGnbParameters(gnbDevice, lsps);
auto gnbTxPower = DynamicCast<NrGnbNetDevice>(gnbDevice)->GetPhy(0)->GetTxPower();
for (size_t k = 0; k < antennas.ueArrayModel.size(); k++)
{
for (size_t j = 0; j < m_rowBeamAngles.size(); j++)
{
for (size_t i = 0; i < m_colBeamAngles.size(); i++)
{
auto bf =
GenBeamforming(m_rowBeamAngles[j], m_colBeamAngles[i], antennas.gnbArrayModel);
antennas.gnbArrayModel->SetBeamformingVector(bf);
txParams->psd = Copy<SpectrumValue>(fakePsd);
auto rxParam = chParams.spectrumPropModel->DoCalcRxPowerSpectralDensity(
txParams,
mobility.gnbMobility,
mobility.ueMobility,
antennas.gnbArrayModel,
antennas.ueArrayModel[k]);
auto eng = gnbTxPower * ComputeRxPsd(rxParam);
if (eng > lsps.maxPsdFound)
{
lsps.maxPsdFound = eng;
bfAngles = {m_rowBeamAngles[j], m_colBeamAngles[i]};
activePanelIndex =
k; // active panel has to be update to K as better beam has found
}
}
}
}
auto attenuation =
chParams.pathLossModel->CalcRxPower(0, mobility.gnbMobility, mobility.ueMobility);
m_bestBfVectors.push_back(bfAngles);
return pow(10.0, attenuation / 10.0) * lsps.maxPsdFound;
}