diff --git a/src/spectrum/model/multi-model-spectrum-channel.cc b/src/spectrum/model/multi-model-spectrum-channel.cc index 74c787ec3..62cd61fd7 100644 --- a/src/spectrum/model/multi-model-spectrum-channel.cc +++ b/src/spectrum/model/multi-model-spectrum-channel.cc @@ -289,6 +289,7 @@ MultiModelSpectrumChannel::StartTx(Ptr txParams) "SpectrumModel change was not notified to MultiModelSpectrumChannel " "(i.e., AddRx should be called again after model is changed)"); + auto txAntennaGain{0.0}; if ((*rxPhyIterator) != txParams->txPhy) { auto rxNetDevice = (*rxPhyIterator)->GetDevice(); @@ -320,57 +321,12 @@ MultiModelSpectrumChannel::StartTx(Ptr txParams) if (txMobility && receiverMobility) { - auto txAntennaGain{0.0}; - auto rxAntennaGain{0.0}; - auto propagationGainDb{0.0}; - auto pathLossDb{0.0}; if (rxParams->txAntenna) { Angles txAngles(receiverMobility->GetPosition(), txMobility->GetPosition()); txAntennaGain = rxParams->txAntenna->GetGainDb(txAngles); NS_LOG_LOGIC("txAntennaGain = " << txAntennaGain << " dB"); - pathLossDb -= txAntennaGain; } - auto rxAntenna = DynamicCast((*rxPhyIterator)->GetAntenna()); - if (rxAntenna) - { - Angles rxAngles(txMobility->GetPosition(), receiverMobility->GetPosition()); - rxAntennaGain = rxAntenna->GetGainDb(rxAngles); - NS_LOG_LOGIC("rxAntennaGain = " << rxAntennaGain << " dB"); - pathLossDb -= rxAntennaGain; - } - if (m_propagationLoss) - { - if (txMobility->GetPosition() == receiverMobility->GetPosition()) - { - propagationGainDb = 0; // Assume no propagation loss when co-located - } - else - { - propagationGainDb = - m_propagationLoss->CalcRxPower(0, txMobility, receiverMobility); - } - NS_LOG_LOGIC("propagationGainDb = " << propagationGainDb << " dB"); - pathLossDb -= propagationGainDb; - } - NS_LOG_LOGIC("total pathLoss = " << pathLossDb << " dB"); - // Gain trace - m_gainTrace(txMobility, - receiverMobility, - txAntennaGain, - rxAntennaGain, - propagationGainDb, - pathLossDb); - // Pathloss trace - m_pathLossTrace(txParams->txPhy, *rxPhyIterator, pathLossDb); - if (pathLossDb > m_maxLossDb) - { - // beyond range - continue; - } - auto pathGainLinear = std::pow(10.0, (-pathLossDb) / 10.0); - *(rxParams->psd) *= pathGainLinear; - if (m_propagationDelay) { delay = m_propagationDelay->GetDelay(txMobility, receiverMobility); @@ -386,6 +342,7 @@ MultiModelSpectrumChannel::StartTx(Ptr txParams) &MultiModelSpectrumChannel::StartRx, this, txParams->psd, + txAntennaGain, rxParams, *rxPhyIterator, convertedPsds); @@ -398,6 +355,7 @@ MultiModelSpectrumChannel::StartTx(Ptr txParams) &MultiModelSpectrumChannel::StartRx, this, txParams->psd, + txAntennaGain, rxParams, *rxPhyIterator, convertedPsds); @@ -410,6 +368,7 @@ MultiModelSpectrumChannel::StartTx(Ptr txParams) void MultiModelSpectrumChannel::StartRx( Ptr txPsd, + double txAntennaGain, Ptr params, Ptr receiver, const std::map>& availableConvertedPsds) @@ -454,29 +413,75 @@ MultiModelSpectrumChannel::StartRx( } } - if (m_spectrumPropagationLoss) + auto txMobility = params->txPhy->GetMobility(); + auto rxMobility = receiver->GetMobility(); + if (txMobility && rxMobility) { - params->psd = - m_spectrumPropagationLoss->CalcRxPowerSpectralDensity(params, - params->txPhy->GetMobility(), - receiver->GetMobility()); - } - else if (m_phasedArraySpectrumPropagationLoss) - { - auto txPhasedArrayModel = DynamicCast(params->txPhy->GetAntenna()); - auto rxPhasedArrayModel = DynamicCast(receiver->GetAntenna()); + auto pathLossDb{-txAntennaGain}; + auto rxAntennaGain{0.0}; + auto propagationGainDb{0.0}; - NS_ASSERT_MSG(txPhasedArrayModel && rxPhasedArrayModel, - "PhasedArrayModel instances should be installed at both TX and RX " - "SpectrumPhy in order to use PhasedArraySpectrumPropagationLoss."); + if (auto rxAntenna = DynamicCast(receiver->GetAntenna())) + { + Angles rxAngles(txMobility->GetPosition(), rxMobility->GetPosition()); + rxAntennaGain = rxAntenna->GetGainDb(rxAngles); + NS_LOG_LOGIC("rxAntennaGain = " << rxAntennaGain << " dB"); + pathLossDb -= rxAntennaGain; + } - params = m_phasedArraySpectrumPropagationLoss->CalcRxPowerSpectralDensity( - params, - params->txPhy->GetMobility(), - receiver->GetMobility(), - txPhasedArrayModel, - rxPhasedArrayModel); + if (m_propagationLoss && (txMobility->GetPosition() != rxMobility->GetPosition())) + { + propagationGainDb = m_propagationLoss->CalcRxPower(0, txMobility, rxMobility); + NS_LOG_LOGIC("propagationGainDb = " << propagationGainDb << " dB"); + pathLossDb -= propagationGainDb; + } + + NS_LOG_LOGIC("total pathLoss = " << pathLossDb << " dB"); + + // Gain trace + m_gainTrace(txMobility, + rxMobility, + txAntennaGain, + rxAntennaGain, + propagationGainDb, + pathLossDb); + + // Pathloss trace + m_pathLossTrace(params->txPhy, receiver, pathLossDb); + + if (pathLossDb > m_maxLossDb) + { + // beyond range + return; + } + + const auto pathLossLinear = std::pow(10.0, (-pathLossDb) / 10.0); + *(params->psd) *= pathLossLinear; + + if (m_spectrumPropagationLoss) + { + params->psd = m_spectrumPropagationLoss->CalcRxPowerSpectralDensity(params, + txMobility, + rxMobility); + } + else if (m_phasedArraySpectrumPropagationLoss) + { + auto txPhasedArrayModel = DynamicCast(params->txPhy->GetAntenna()); + auto rxPhasedArrayModel = DynamicCast(receiver->GetAntenna()); + + NS_ASSERT_MSG(txPhasedArrayModel && rxPhasedArrayModel, + "PhasedArrayModel instances should be installed at both TX and RX " + "SpectrumPhy in order to use PhasedArraySpectrumPropagationLoss."); + + params = m_phasedArraySpectrumPropagationLoss->CalcRxPowerSpectralDensity( + params, + txMobility, + rxMobility, + txPhasedArrayModel, + rxPhasedArrayModel); + } } + receiver->StartRx(params); } diff --git a/src/spectrum/model/multi-model-spectrum-channel.h b/src/spectrum/model/multi-model-spectrum-channel.h index 725874c07..b5ca535e3 100644 --- a/src/spectrum/model/multi-model-spectrum-channel.h +++ b/src/spectrum/model/multi-model-spectrum-channel.h @@ -130,12 +130,14 @@ class MultiModelSpectrumChannel : public SpectrumChannel * Used internally to reschedule transmission after the propagation delay. * * @param txPsd The transmitted PSD. + * @param txAntennaGain The antenna gain at the transmitter. * @param params The signal parameters. * @param receiver A pointer to the receiver SpectrumPhy. * @param availableConvertedPsds available converted PSDs from the TX PSD. */ virtual void StartRx( Ptr txPsd, + double txAntennaGain, Ptr params, Ptr receiver, const std::map>& availableConvertedPsds);