# HG changeset patch # User Alexander Krotov # Date 1470591498 -10800 # Sun Aug 07 20:38:18 2016 +0300 # Node ID b7772667c1f5eb55fe72fb19d53e3f3fcb1e6c01 # Parent 8b197f75774b1db937b95bdc92cff7dc90b4bffc spectrum: 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. diff --git a/src/spectrum/model/multi-model-spectrum-channel.cc b/src/spectrum/model/multi-model-spectrum-channel.cc --- a/src/spectrum/model/multi-model-spectrum-channel.cc +++ b/src/spectrum/model/multi-model-spectrum-channel.cc @@ -190,11 +190,14 @@ ++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); + if (!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 @@ -289,7 +292,11 @@ { 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 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 --- a/src/spectrum/model/spectrum-model.cc +++ b/src/spectrum/model/spectrum-model.cc @@ -101,6 +101,26 @@ 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 --- a/src/spectrum/model/spectrum-model.h +++ b/src/spectrum/model/spectrum-model.h @@ -120,6 +120,14 @@ */ 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