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