wifi: Do not calculate bands for each received packet

This commit is contained in:
Sébastien Deronne
2023-02-21 07:53:28 +01:00
committed by Sébastien Deronne
parent eaeb098720
commit e50b86d01b
3 changed files with 61 additions and 69 deletions

View File

@@ -127,7 +127,7 @@ SpectrumWifiPhy::UpdateInterferenceHelperBands()
NS_LOG_FUNCTION(this);
NS_ASSERT(!m_spectrumPhyInterfaces.empty());
uint16_t channelWidth = GetChannelWidth();
std::vector<WifiSpectrumBandInfo> bands{};
WifiSpectrumPhyInterface::WifiSpectrumBands bands{};
if (channelWidth < 20)
{
bands.push_back(GetBand(channelWidth));
@@ -142,23 +142,26 @@ SpectrumWifiPhy::UpdateInterferenceHelperBands()
}
}
}
WifiSpectrumPhyInterface::WifiSpectrumBands allBands{bands};
if (GetStandard() >= WIFI_STANDARD_80211ax)
{
auto&& ruBands = HePhy::GetRuBands(this, channelWidth, GetGuardBandwidth(channelWidth));
for (const auto& bandRuPair : ruBands)
{
bands.push_back(bandRuPair.first);
allBands.push_back(bandRuPair.first);
}
m_currentSpectrumPhyInterface->SetRuBands(std::move(ruBands));
}
m_currentSpectrumPhyInterface->SetBands(std::move(bands));
if (m_interference->HasBands(GetCurrentFrequencyRange()))
{
m_interference->UpdateBands(bands, GetCurrentFrequencyRange());
m_interference->UpdateBands(allBands, GetCurrentFrequencyRange());
}
else
{
for (const auto& band : bands)
for (const auto& band : allBands)
{
m_interference->AddBand(band, GetCurrentFrequencyRange());
}
@@ -300,47 +303,37 @@ SpectrumWifiPhy::StartRx(Ptr<SpectrumSignalParameters> rxParams,
// total energy apparent to the "demodulator".
// This is done per 20 MHz channel band.
const auto channelWidth = interface ? interface->GetChannelWidth() : GetChannelWidth();
const auto& bands =
interface ? interface->GetBands() : m_currentSpectrumPhyInterface->GetBands();
double totalRxPowerW = 0;
RxPowerWattPerChannelBand rxPowerW;
if (channelWidth < 20)
std::size_t index = 0;
uint16_t prevBw = 0;
for (const auto& band : bands)
{
const auto filteredBand = GetBandForInterface(channelWidth, 0, freqRange, channelWidth);
uint16_t bw = (band.frequencies.second - band.frequencies.first) / 1e6;
NS_ASSERT(bw <= channelWidth);
index = ((bw != prevBw) ? 0 : (index + 1));
double rxPowerPerBandW =
WifiSpectrumValueHelper::GetBandPowerW(receivedSignalPsd, filteredBand.indices);
NS_LOG_DEBUG("Signal power received (watts) before antenna gain: " << rxPowerPerBandW);
WifiSpectrumValueHelper::GetBandPowerW(receivedSignalPsd, band.indices);
NS_LOG_DEBUG("Signal power received (watts) before antenna gain for "
<< bw << " MHz channel band " << index << ": " << band);
rxPowerPerBandW *= DbToRatio(GetRxGain());
totalRxPowerW += rxPowerPerBandW;
rxPowerW.insert({filteredBand, rxPowerPerBandW});
rxPowerW.insert({band, rxPowerPerBandW});
NS_LOG_DEBUG("Signal power received after antenna gain for "
<< channelWidth << " MHz channel: " << rxPowerPerBandW << " W ("
<< bw << " MHz channel band " << index << ": " << rxPowerPerBandW << " W ("
<< WToDbm(rxPowerPerBandW) << " dBm)");
}
for (uint16_t bw = 160; bw >= 20; bw = bw / 2)
{
for (uint32_t i = 0; i < (channelWidth / bw); i++)
if (bw <= 20)
{
const auto filteredBand = GetBandForInterface(bw, i, freqRange, channelWidth);
double rxPowerPerBandW =
WifiSpectrumValueHelper::GetBandPowerW(receivedSignalPsd, filteredBand.indices);
NS_LOG_DEBUG("Signal power received (watts) before antenna gain for "
<< bw << " MHz channel band " << +i << ": " << rxPowerPerBandW);
rxPowerPerBandW *= DbToRatio(GetRxGain());
if (bw == 20)
{
totalRxPowerW += rxPowerPerBandW;
}
rxPowerW.insert({filteredBand, rxPowerPerBandW});
NS_LOG_DEBUG("Signal power received after antenna gain for "
<< bw << " MHz channel band " << +i << ": " << rxPowerPerBandW << " W ("
<< WToDbm(rxPowerPerBandW) << " dBm)");
totalRxPowerW += rxPowerPerBandW;
}
prevBw = bw;
}
if (GetStandard() >= WIFI_STANDARD_80211ax)
{
const auto ruBands =
const auto& ruBands =
interface ? interface->GetRuBands() : m_currentSpectrumPhyInterface->GetRuBands();
NS_ASSERT(!ruBands.empty());
for (const auto& [band, ru] : ruBands)
@@ -493,15 +486,7 @@ SpectrumWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const
WifiSpectrumBandInfo
SpectrumWifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex /* = 0 */)
{
return GetBandForInterface(bandWidth, bandIndex, GetCurrentFrequencyRange(), GetChannelWidth());
}
WifiSpectrumBandInfo
SpectrumWifiPhy::GetBandForInterface(uint16_t bandWidth,
uint8_t bandIndex,
FrequencyRange freqRange,
uint16_t channelWidth)
{
auto channelWidth = GetChannelWidth();
auto subcarrierSpacing = GetSubcarrierSpacing();
auto numBandsInChannel = static_cast<size_t>(channelWidth * 1e6 / subcarrierSpacing);
auto numBandsInBand = static_cast<size_t>(bandWidth * 1e6 / subcarrierSpacing);
@@ -509,7 +494,8 @@ SpectrumWifiPhy::GetBandForInterface(uint16_t bandWidth,
{
numBandsInChannel += 1; // symmetry around center frequency
}
auto rxSpectrumModel = m_spectrumPhyInterfaces.at(freqRange)->GetRxSpectrumModel();
NS_ABORT_IF(!m_currentSpectrumPhyInterface);
auto rxSpectrumModel = m_currentSpectrumPhyInterface->GetRxSpectrumModel();
size_t totalNumBands = rxSpectrumModel->GetNumBands();
NS_ASSERT_MSG((numBandsInChannel % 2 == 1) && (totalNumBands % 2 == 1),
"Should have odd number of bands");
@@ -517,7 +503,8 @@ SpectrumWifiPhy::GetBandForInterface(uint16_t bandWidth,
NS_ASSERT(totalNumBands >= numBandsInChannel);
auto startIndex = ((totalNumBands - numBandsInChannel) / 2) + (bandIndex * numBandsInBand);
auto stopIndex = startIndex + numBandsInBand - 1;
auto frequencies = ConvertIndicesForInterface({startIndex, stopIndex}, freqRange);
auto frequencies = ConvertIndicesToFrequencies({startIndex, stopIndex});
auto freqRange = m_currentSpectrumPhyInterface->GetFrequencyRange();
NS_ASSERT(frequencies.first >= (freqRange.minFrequency * 1e6));
NS_ASSERT(frequencies.second <= (freqRange.maxFrequency * 1e6));
NS_ASSERT((frequencies.second - frequencies.first) == (bandWidth * 1e6));
@@ -532,14 +519,8 @@ SpectrumWifiPhy::GetBandForInterface(uint16_t bandWidth,
WifiSpectrumBandFrequencies
SpectrumWifiPhy::ConvertIndicesToFrequencies(const WifiSpectrumBandIndices& indices) const
{
return ConvertIndicesForInterface(indices, GetCurrentFrequencyRange());
}
WifiSpectrumBandFrequencies
SpectrumWifiPhy::ConvertIndicesForInterface(const WifiSpectrumBandIndices& indices,
const FrequencyRange& freqRange) const
{
auto rxSpectrumModel = m_spectrumPhyInterfaces.at(freqRange)->GetRxSpectrumModel();
NS_ABORT_IF(!m_currentSpectrumPhyInterface);
auto rxSpectrumModel = m_currentSpectrumPhyInterface->GetRxSpectrumModel();
auto startGuardBand = rxSpectrumModel->Begin();
auto startChannel = std::next(startGuardBand, indices.first);
auto endChannel = std::next(startGuardBand, indices.second + 1);

View File

@@ -118,21 +118,6 @@ class SpectrumWifiPhy : public WifiPhy
*/
Ptr<AntennaModel> GetAntenna() const;
/**
* Get the info of a given band for a given spectrum PHY interface
*
* \param bandWidth the width of the band to be returned (MHz)
* \param bandIndex the index of the band to be returned
* \param range the frequency range identifying the spectrum PHY interface
* \param channelWidth the channel width currently used by the spectrum PHY interface
*
* \return the info that defines the band
*/
WifiSpectrumBandInfo GetBandForInterface(uint16_t bandWidth,
uint8_t bandIndex,
FrequencyRange freqRange,
uint16_t channelWidth);
/**
* Callback invoked when the PHY model starts to process a signal
*
@@ -185,9 +170,6 @@ class SpectrumWifiPhy : public WifiPhy
//!< reasons)
private:
WifiSpectrumBandFrequencies ConvertIndicesForInterface(const WifiSpectrumBandIndices& indices,
const FrequencyRange& freqRange) const;
/**
* Perform run-time spectrum model change
*/

View File

@@ -55,7 +55,6 @@ static const uint16_t GUARD_WIDTH =
class ExtSpectrumWifiPhy : public SpectrumWifiPhy
{
public:
using SpectrumWifiPhy::GetBandForInterface;
using SpectrumWifiPhy::SpectrumWifiPhy;
using WifiPhy::GetBand;
@@ -76,6 +75,36 @@ class ExtSpectrumWifiPhy : public SpectrumWifiPhy
{
return m_currentSpectrumPhyInterface;
}
/**
* Get the info of a given band for a given spectrum PHY interface
*
* \param bandWidth the width of the band to be returned (MHz)
* \param bandIndex the index of the band to be returned
* \param freqRange the frequency range identifying the spectrum PHY interface
* \param channelWidth the channel width currently used by the spectrum PHY interface
*
* \return the info that defines the band
*/
WifiSpectrumBandInfo GetBandForInterface(uint16_t bandWidth,
uint8_t bandIndex,
const FrequencyRange& freqRange,
uint16_t channelWidth)
{
auto subcarrierSpacing = GetSubcarrierSpacing();
auto numBandsInChannel = static_cast<size_t>(channelWidth * 1e6 / subcarrierSpacing);
auto numBandsInBand = static_cast<size_t>(bandWidth * 1e6 / subcarrierSpacing);
auto rxSpectrumModel = m_spectrumPhyInterfaces.at(freqRange)->GetRxSpectrumModel();
size_t totalNumBands = rxSpectrumModel->GetNumBands();
auto startIndex = ((totalNumBands - numBandsInChannel) / 2) + (bandIndex * numBandsInBand);
auto stopIndex = startIndex + numBandsInBand - 1;
auto startGuardBand = rxSpectrumModel->Begin();
auto startChannel = startGuardBand + startIndex;
auto endChannel = startGuardBand + stopIndex + 1;
auto lowFreq = static_cast<uint64_t>(startChannel->fc);
auto highFreq = static_cast<uint64_t>(endChannel->fc);
return {{startIndex, stopIndex}, {lowFreq, highFreq}};
}
};
/**