From 16a4d770ef9cbee821ec8ec95554116a862e84ec Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Sun, 7 Aug 2016 20:38:18 +0300 Subject: [PATCH] spectrum: (fixes #2467) Do not schedule StartRx for receivers with orthogonal SpectrumModels This change greatly reduces number of StartRx calls, propagation delay computations and SpectrumValue conversions for scenarios with large number of transmitters and receivers operating in different non-overlapping channels, i.e., Wi-Fi scenarios with multiple BSS operating in different channels. --- .../model/multi-model-spectrum-channel.cc | 25 +++++++++++++------ src/spectrum/model/spectrum-model.cc | 19 ++++++++++++++ src/spectrum/model/spectrum-model.h | 8 ++++++ 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/spectrum/model/multi-model-spectrum-channel.cc b/src/spectrum/model/multi-model-spectrum-channel.cc index be45abb89..edd5fa10f 100644 --- a/src/spectrum/model/multi-model-spectrum-channel.cc +++ b/src/spectrum/model/multi-model-spectrum-channel.cc @@ -190,11 +190,16 @@ MultiModelSpectrumChannel::AddRx (Ptr phy) ++txInfoIterator) { Ptr txSpectrumModel = txInfoIterator->second.m_txSpectrumModel; - NS_LOG_LOGIC ("Creating converters between SpectrumModelUids " << txSpectrumModel->GetUid () << " and " << rxSpectrumModelUid ); - SpectrumConverter converter (txSpectrumModel, rxSpectrumModel); - std::pair ret2; - ret2 = txInfoIterator->second.m_spectrumConverterMap.insert (std::make_pair (rxSpectrumModelUid, converter)); - NS_ASSERT (ret2.second); + SpectrumModelUid_t txSpectrumModelUid = txSpectrumModel->GetUid (); + + if (rxSpectrumModelUid != txSpectrumModelUid && !txSpectrumModel->IsOrthogonal (*rxSpectrumModel)) + { + NS_LOG_LOGIC ("Creating converter between SpectrumModelUid " << txSpectrumModel->GetUid () << " and " << rxSpectrumModelUid); + SpectrumConverter converter (txSpectrumModel, rxSpectrumModel); + std::pair ret2; + ret2 = txInfoIterator->second.m_spectrumConverterMap.insert (std::make_pair (rxSpectrumModelUid, converter)); + NS_ASSERT (ret2.second); + } } } else @@ -231,9 +236,9 @@ MultiModelSpectrumChannel::FindAndEventuallyAddTxSpectrumModel (Ptr rxSpectrumModel = rxInfoIterator->second.m_rxSpectrumModel; SpectrumModelUid_t rxSpectrumModelUid = rxSpectrumModel->GetUid (); - if (rxSpectrumModelUid != txSpectrumModelUid) + if (rxSpectrumModelUid != txSpectrumModelUid && !txSpectrumModel->IsOrthogonal (*rxSpectrumModel)) { - NS_LOG_LOGIC ("Creating converters between SpectrumModelUids " << txSpectrumModelUid << " and " << rxSpectrumModelUid ); + NS_LOG_LOGIC ("Creating converter between SpectrumModelUid " << txSpectrumModelUid << " and " << rxSpectrumModelUid); SpectrumConverter converter (txSpectrumModel, rxSpectrumModel); std::pair ret2; @@ -289,7 +294,11 @@ MultiModelSpectrumChannel::StartTx (Ptr txParams) { NS_LOG_LOGIC (" converting txPowerSpectrum SpectrumModelUids" << txSpectrumModelUid << " --> " << rxSpectrumModelUid); SpectrumConverterMap_t::const_iterator rxConverterIterator = txInfoIteratorerator->second.m_spectrumConverterMap.find (rxSpectrumModelUid); - NS_ASSERT (rxConverterIterator != txInfoIteratorerator->second.m_spectrumConverterMap.end ()); + if (rxConverterIterator == txInfoIteratorerator->second.m_spectrumConverterMap.end ()) + { + // No converter means TX SpectrumModel is orthogonal to RX SpectrumModel + continue; + } convertedTxPowerSpectrum = rxConverterIterator->second.Convert (txParams->psd); } diff --git a/src/spectrum/model/spectrum-model.cc b/src/spectrum/model/spectrum-model.cc index 29ab93c5b..e89e223da 100644 --- a/src/spectrum/model/spectrum-model.cc +++ b/src/spectrum/model/spectrum-model.cc @@ -101,6 +101,25 @@ SpectrumModel::GetUid () const return m_uid; } +bool +SpectrumModel::IsOrthogonal (const SpectrumModel &other) const +{ + for (Bands::const_iterator myIt = Begin (); + myIt != End (); + ++myIt) + { + for (Bands::const_iterator otherIt = other.Begin (); + otherIt != other.End (); + ++otherIt) + { + if (std::max (myIt->fl, otherIt->fl) < std::min (myIt->fh, otherIt->fh)) + { + return false; + } + } + } + return true; +} } // namespace ns3 diff --git a/src/spectrum/model/spectrum-model.h b/src/spectrum/model/spectrum-model.h index 9ea4280f0..cb84a42f3 100644 --- a/src/spectrum/model/spectrum-model.h +++ b/src/spectrum/model/spectrum-model.h @@ -120,6 +120,14 @@ public: */ Bands::const_iterator End () const; + /** + * Check if another SpectrumModels has bands orthogonal to our bands. + * + * \param other another SpectrumModel + * \returns true if bands are orthogonal + */ + bool IsOrthogonal (const SpectrumModel &other) const; + private: Bands m_bands; //!< Actual definition of frequency bands within this SpectrumModel SpectrumModelUid_t m_uid; //!< unique id for a given set of frequencies