# HG changeset patch # User Alexander Krotov # Date 1470591498 -10800 # Sun Aug 07 20:38:18 2016 +0300 # Node ID 08af9a93891fa69349c5231fc08590e3f12c2bcc # Parent 99e03b020af78b0801b4c0664ae22ba48098b75d 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 -r 99e03b020af7 -r 08af9a93891f src/spectrum/model/multi-model-spectrum-channel.cc --- a/src/spectrum/model/multi-model-spectrum-channel.cc Mon Aug 08 00:21:22 2016 +0200 +++ b/src/spectrum/model/multi-model-spectrum-channel.cc Sun Aug 07 20:38:18 2016 +0300 @@ -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 (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 +234,9 @@ 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,11 +292,14 @@ { 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); } - for (std::set >::const_iterator rxPhyIterator = rxInfoIterator->second.m_rxPhySet.begin (); rxPhyIterator != rxInfoIterator->second.m_rxPhySet.end (); ++rxPhyIterator) diff -r 99e03b020af7 -r 08af9a93891f src/spectrum/model/spectrum-model.cc --- a/src/spectrum/model/spectrum-model.cc Mon Aug 08 00:21:22 2016 +0200 +++ b/src/spectrum/model/spectrum-model.cc Sun Aug 07 20:38:18 2016 +0300 @@ -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 -r 99e03b020af7 -r 08af9a93891f src/spectrum/model/spectrum-model.h --- a/src/spectrum/model/spectrum-model.h Mon Aug 08 00:21:22 2016 +0200 +++ b/src/spectrum/model/spectrum-model.h Sun Aug 07 20:38:18 2016 +0300 @@ -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