From 793042d63f11e7cbe74798c844b92177187fa24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deronne?= Date: Thu, 18 Nov 2021 21:30:40 +0100 Subject: [PATCH] spectrum: Pass SpectrumSignalParameters to CalcRxPowerSpectralDensity --- .../three-gpp-v2v-channel-example.cc | 41 +++++------------ .../examples/three-gpp-channel-example.cc | 35 ++++----------- .../constant-spectrum-propagation-loss.cc | 5 ++- .../constant-spectrum-propagation-loss.h | 2 +- .../model/friis-spectrum-propagation-loss.cc | 5 ++- .../model/friis-spectrum-propagation-loss.h | 2 +- .../model/multi-model-spectrum-channel.cc | 4 +- ...d-array-spectrum-propagation-loss-model.cc | 7 +-- ...ed-array-spectrum-propagation-loss-model.h | 14 +++--- .../model/single-model-spectrum-channel.cc | 2 +- .../model/spectrum-propagation-loss-model.cc | 7 +-- .../model/spectrum-propagation-loss-model.h | 16 +++---- ...ree-gpp-spectrum-propagation-loss-model.cc | 5 ++- ...hree-gpp-spectrum-propagation-loss-model.h | 4 +- src/spectrum/model/trace-fading-loss-model.cc | 7 +-- src/spectrum/model/trace-fading-loss-model.h | 5 +-- .../test/three-gpp-channel-test-suite.cc | 45 ++++++------------- 17 files changed, 73 insertions(+), 133 deletions(-) diff --git a/examples/channel-models/three-gpp-v2v-channel-example.cc b/examples/channel-models/three-gpp-v2v-channel-example.cc index 36bba82dd..6e0f10f20 100644 --- a/examples/channel-models/three-gpp-v2v-channel-example.cc +++ b/examples/channel-models/three-gpp-v2v-channel-example.cc @@ -45,6 +45,7 @@ #include "ns3/three-gpp-spectrum-propagation-loss-model.h" #include "ns3/three-gpp-v2v-propagation-loss-model.h" #include "ns3/three-gpp-channel-model.h" +#include "ns3/spectrum-signal-parameters.h" using namespace ns3; @@ -63,31 +64,10 @@ struct ComputeSnrParams { Ptr txMob; //!< the tx mobility model Ptr rxMob; //!< the rx mobility model - Ptr txPsd; //!< the PSD of the tx signal + Ptr txParams; //!< the params of the tx signal double noiseFigure; //!< the noise figure in dB Ptr txAntenna; //!< the tx antenna array Ptr rxAntenna; //!< the rx antenna array - - /** - * \brief Constructor - * \param pTxMob the tx mobility model - * \param pRxMob the rx mobility model - * \param pTxPsd the PSD of the tx signal - * \param pNoiseFigure the noise figure in dB - * \param pTxAntenna the tx antenna array - * \param pRxAntenna the rx antenna array - */ - ComputeSnrParams (Ptr pTxMob, Ptr pRxMob, - Ptr pTxPsd, double pNoiseFigure, - Ptr pTxAntenna, Ptr pRxAntenna) - { - txMob = pTxMob; - rxMob = pRxMob; - txPsd = pTxPsd; - noiseFigure = pNoiseFigure; - txAntenna = pTxAntenna; - rxAntenna = pRxAntenna; - } }; /** @@ -117,10 +97,8 @@ DoBeamforming (Ptr thisDevice, Ptr thisAntenna, Ptr * \param params A structure that holds a bunch of parameters needed by ComputSnr function to calculate the average SNR */ static void -ComputeSnr (ComputeSnrParams& params) +ComputeSnr (const ComputeSnrParams& params) { - Ptr rxPsd = params.txPsd->Copy (); - // check the channel condition Ptr cond = m_condModel->GetChannelCondition (params.txMob, params.rxMob); @@ -128,10 +106,10 @@ ComputeSnr (ComputeSnrParams& params) double propagationGainDb = m_propagationLossModel->CalcRxPower (0, params.txMob, params.rxMob); NS_LOG_DEBUG ("Pathloss " << -propagationGainDb << " dB"); double propagationGainLinear = std::pow (10.0, (propagationGainDb) / 10.0); - *(rxPsd) *= propagationGainLinear; + *(params.txParams->psd) *= propagationGainLinear; // apply the fast fading and the beamforming gain - rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (rxPsd, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna); + Ptr rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (params.txParams, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna); NS_LOG_DEBUG ("Average rx power " << 10 * log10 (Sum (*rxPsd) * 180e3) << " dB"); // create the noise psd @@ -140,7 +118,7 @@ ComputeSnr (ComputeSnrParams& params) double kT_W_Hz = std::pow (10.0, (kT_dBm_Hz - 30) / 10.0); double noiseFigureLinear = std::pow (10.0, params.noiseFigure / 10.0); double noisePowerSpectralDensity = kT_W_Hz * noiseFigureLinear; - Ptr noisePsd = Create (params.txPsd->GetSpectrumModel ()); + Ptr noisePsd = Create (params.txParams->psd->GetSpectrumModel ()); (*noisePsd) = noisePowerSpectralDensity; // compute the SNR @@ -354,14 +332,17 @@ main (int argc, char *argv[]) rbs.push_back (rb); } Ptr spectrumModel = Create (rbs); - Ptr txPsd = Create (spectrumModel); + Ptr txPsd = Create (spectrumModel); + Ptr txParams = Create (); double txPow_w = std::pow (10., (txPow_dbm - 30) / 10); double txPowDens = (txPow_w / (numRb * subCarrierSpacing)); (*txPsd) = txPowDens; + txParams->psd = txPsd->Copy (); for (int i = 0; i < simTime / timeRes; i++) { - Simulator::Schedule (timeRes * i, &ComputeSnr, ComputeSnrParams (txMob, rxMob, txPsd, noiseFigure, txAntenna, rxAntenna)); + ComputeSnrParams params{txMob, rxMob, txParams, noiseFigure, txAntenna, rxAntenna}; + Simulator::Schedule (timeRes * i, &ComputeSnr, params); } // initialize the output file diff --git a/src/spectrum/examples/three-gpp-channel-example.cc b/src/spectrum/examples/three-gpp-channel-example.cc index 63b0359dc..5412d6150 100644 --- a/src/spectrum/examples/three-gpp-channel-example.cc +++ b/src/spectrum/examples/three-gpp-channel-example.cc @@ -42,6 +42,7 @@ #include "ns3/lte-spectrum-value-helper.h" #include "ns3/channel-condition-model.h" #include "ns3/three-gpp-propagation-loss-model.h" +#include "ns3/spectrum-signal-parameters.h" NS_LOG_COMPONENT_DEFINE ("ThreeGppChannelExample"); @@ -63,26 +64,6 @@ struct ComputeSnrParams double noiseFigure; //!< the noise figure in dB Ptr txAntenna; //!< the tx antenna array Ptr rxAntenna; //!< the rx antenna array - - /** - * \brief Constructor - * \param pTxMob the tx mobility model - * \param pRxMob the rx mobility model - * \param pTxPow the tx power in dBm - * \param pNoiseFigure the noise figure in dB - * \param pTxAntenna the tx antenna array - * \param pRxAntenna the rx antenna array - */ - ComputeSnrParams (Ptr pTxMob, Ptr pRxMob, double pTxPow, double pNoiseFigure, - Ptr pTxAntenna, Ptr pRxAntenna) - { - txMob = pTxMob; - rxMob = pRxMob; - txPow = pTxPow; - noiseFigure = pNoiseFigure; - txAntenna = pTxAntenna; - rxAntenna = pRxAntenna; - } }; /** @@ -131,7 +112,7 @@ DoBeamforming (Ptr thisDevice, Ptr thisAntenna, Ptr * \param params A structure that holds the parameters that are needed to perform calculations in ComputeSnr */ static void -ComputeSnr (ComputeSnrParams& params) +ComputeSnr (const ComputeSnrParams& params) { // Create the tx PSD using the LteSpectrumValueHelper // 100 RBs corresponds to 18 MHz (1 RB = 180 kHz) @@ -142,7 +123,8 @@ ComputeSnr (ComputeSnrParams& params) activeRbs0[i] = i; } Ptr txPsd = LteSpectrumValueHelper::CreateTxPowerSpectralDensity (2100, 100, params.txPow, activeRbs0); - Ptr rxPsd = txPsd->Copy (); + Ptr txParams = Create (); + txParams->psd = txPsd->Copy (); NS_LOG_DEBUG ("Average tx power " << 10*log10(Sum (*txPsd) * 180e3) << " dB"); // create the noise PSD @@ -153,14 +135,14 @@ ComputeSnr (ComputeSnrParams& params) double propagationGainDb = m_propagationLossModel->CalcRxPower (0, params.txMob, params.rxMob); NS_LOG_DEBUG ("Pathloss " << -propagationGainDb << " dB"); double propagationGainLinear = std::pow (10.0, (propagationGainDb) / 10.0); - *(rxPsd) *= propagationGainLinear; + *(txParams->psd) *= propagationGainLinear; NS_ASSERT_MSG (params.txAntenna, "params.txAntenna is nullptr!"); NS_ASSERT_MSG (params.rxAntenna, "params.rxAntenna is nullptr!"); // apply the fast fading and the beamforming gain - rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (rxPsd, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna); - NS_LOG_DEBUG ("Average rx power " << 10 * log10 (Sum (*rxPsd) * 180e3) << " dB"); + Ptr rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (txParams, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna); + NS_LOG_DEBUG ("Average rx power " << 10*log10 (Sum (*rxPsd) * 180e3) << " dB"); // compute the SNR NS_LOG_DEBUG ("Average SNR " << 10 * log10 (Sum (*rxPsd) / Sum (*noisePsd)) << " dB"); @@ -272,7 +254,8 @@ main (int argc, char *argv[]) for (int i = 0; i < floor (simTime / timeRes); i++) { - Simulator::Schedule (MilliSeconds (timeRes*i), &ComputeSnr, ComputeSnrParams (txMob, rxMob, txPow, noiseFigure, txAntenna, rxAntenna)); + ComputeSnrParams params{txMob, rxMob, txPow, noiseFigure, txAntenna, rxAntenna}; + Simulator::Schedule (MilliSeconds (timeRes*i), &ComputeSnr, params); } Simulator::Run (); diff --git a/src/spectrum/model/constant-spectrum-propagation-loss.cc b/src/spectrum/model/constant-spectrum-propagation-loss.cc index 04553ed62..a085622d6 100644 --- a/src/spectrum/model/constant-spectrum-propagation-loss.cc +++ b/src/spectrum/model/constant-spectrum-propagation-loss.cc @@ -23,6 +23,7 @@ #include "ns3/log.h" #include "ns3/constant-spectrum-propagation-loss.h" +#include "spectrum-signal-parameters.h" #include "ns3/double.h" @@ -78,13 +79,13 @@ ConstantSpectrumPropagationLossModel::GetLossDb () const Ptr -ConstantSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (Ptr txPsd, +ConstantSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const { NS_LOG_FUNCTION (this); - Ptr rxPsd = Copy (txPsd); + Ptr rxPsd = Copy (params->psd); Values::iterator vit = rxPsd->ValuesBegin (); Bands::const_iterator fit = rxPsd->ConstBandsBegin (); diff --git a/src/spectrum/model/constant-spectrum-propagation-loss.h b/src/spectrum/model/constant-spectrum-propagation-loss.h index 002a5b123..b1061279d 100644 --- a/src/spectrum/model/constant-spectrum-propagation-loss.h +++ b/src/spectrum/model/constant-spectrum-propagation-loss.h @@ -42,7 +42,7 @@ public: */ static TypeId GetTypeId (); - virtual Ptr DoCalcRxPowerSpectralDensity (Ptr txPsd, + virtual Ptr DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const; /** diff --git a/src/spectrum/model/friis-spectrum-propagation-loss.cc b/src/spectrum/model/friis-spectrum-propagation-loss.cc index 8e8785e43..89a3b479d 100644 --- a/src/spectrum/model/friis-spectrum-propagation-loss.cc +++ b/src/spectrum/model/friis-spectrum-propagation-loss.cc @@ -20,6 +20,7 @@ #include #include +#include "spectrum-signal-parameters.h" #include // for M_PI @@ -50,11 +51,11 @@ FriisSpectrumPropagationLossModel::GetTypeId (void) Ptr -FriisSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (Ptr txPsd, +FriisSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const { - Ptr rxPsd = Copy (txPsd); + Ptr rxPsd = Copy (params->psd); Values::iterator vit = rxPsd->ValuesBegin (); Bands::const_iterator fit = rxPsd->ConstBandsBegin (); diff --git a/src/spectrum/model/friis-spectrum-propagation-loss.h b/src/spectrum/model/friis-spectrum-propagation-loss.h index 44ba49709..ae95c82fc 100644 --- a/src/spectrum/model/friis-spectrum-propagation-loss.h +++ b/src/spectrum/model/friis-spectrum-propagation-loss.h @@ -56,7 +56,7 @@ public: static TypeId GetTypeId (); - virtual Ptr DoCalcRxPowerSpectralDensity (Ptr txPsd, + virtual Ptr DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const; diff --git a/src/spectrum/model/multi-model-spectrum-channel.cc b/src/spectrum/model/multi-model-spectrum-channel.cc index 571721e80..cd3bf84e4 100644 --- a/src/spectrum/model/multi-model-spectrum-channel.cc +++ b/src/spectrum/model/multi-model-spectrum-channel.cc @@ -339,7 +339,7 @@ MultiModelSpectrumChannel::StartTx (Ptr txParams) if (m_spectrumPropagationLoss) { - rxParams->psd = m_spectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams->psd, txMobility, receiverMobility); + rxParams->psd = m_spectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams, txMobility, receiverMobility); } else if (m_phasedArraySpectrumPropagationLoss) { @@ -348,7 +348,7 @@ MultiModelSpectrumChannel::StartTx (Ptr txParams) NS_ASSERT_MSG (txPhasedArrayModel && rxPhasedArrayModel, "PhasedArrayModel instances should be installed at both TX and RX SpectrumPhy in order to use PhasedArraySpectrumPropagationLoss."); - rxParams->psd = m_phasedArraySpectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams->psd, txMobility, receiverMobility, txPhasedArrayModel, rxPhasedArrayModel); + rxParams->psd = m_phasedArraySpectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams, txMobility, receiverMobility, txPhasedArrayModel, rxPhasedArrayModel); } if (m_propagationDelay) diff --git a/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc b/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc index 703b1e2a1..d068b8987 100644 --- a/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc +++ b/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc @@ -21,6 +21,7 @@ #include "phased-array-spectrum-propagation-loss-model.h" #include #include +#include "ns3/spectrum-signal-parameters.h" namespace ns3 { @@ -60,7 +61,7 @@ void PhasedArraySpectrumPropagationLossModel::SetNext (Ptr -PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity (Ptr txPsd, +PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b, Ptr aPhasedArrayModel, @@ -69,10 +70,10 @@ PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity (Ptr rxPsd = DoCalcRxPowerSpectralDensity (txPsd, a, b, aPhasedArrayModel, bPhasedArrayModel); + Ptr rxPsd = DoCalcRxPowerSpectralDensity (params, a, b, aPhasedArrayModel, bPhasedArrayModel); if (m_next != 0) { - rxPsd = m_next->CalcRxPowerSpectralDensity (rxPsd, a, b, aPhasedArrayModel, bPhasedArrayModel); + rxPsd = m_next->CalcRxPowerSpectralDensity (params, a, b, aPhasedArrayModel, bPhasedArrayModel); } return rxPsd; } diff --git a/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h b/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h index 19c0173b0..bb9fb8a0b 100644 --- a/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h +++ b/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h @@ -28,6 +28,7 @@ namespace ns3 { +struct SpectrumSignalParameters; /** * \ingroup spectrum @@ -63,11 +64,7 @@ public: /** * This method is to be called to calculate * - * @param txPsd the SpectrumValue representing the power spectral - * density of the transmission. Watt units are to be used for radio - * communications, and Pascal units for acoustic communications - * (e.g., underwater). - * + * @param params the spectrum signal parameters. * @param a sender mobility * @param b receiver mobility * @param aPhasedArrayModel the instance of the phased antenna array of the sender @@ -76,7 +73,7 @@ public: * @return set of values Vs frequency representing the received * power in the same units used for the txPower parameter. */ - Ptr CalcRxPowerSpectralDensity (Ptr txPsd, + Ptr CalcRxPowerSpectralDensity (Ptr txPsd, Ptr a, Ptr b, Ptr aPhasedArrayModel, @@ -89,8 +86,7 @@ protected: private: /** * - * @param txPsd set of values Vs frequency representing the - * transmission power. See SpectrumChannel for details. + * @param params the spectrum signal parameters. * @param a sender mobility * @param b receiver mobility * @param aPhasedArrayModel the instance of the phased antenna array of the sender @@ -99,7 +95,7 @@ private: * @return set of values Vs frequency representing the received * power in the same units used for the txPower parameter. */ - virtual Ptr DoCalcRxPowerSpectralDensity (Ptr txPsd, + virtual Ptr DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b, Ptr aPhasedArrayModel, diff --git a/src/spectrum/model/single-model-spectrum-channel.cc b/src/spectrum/model/single-model-spectrum-channel.cc index 86daece41..06083e7ae 100644 --- a/src/spectrum/model/single-model-spectrum-channel.cc +++ b/src/spectrum/model/single-model-spectrum-channel.cc @@ -185,7 +185,7 @@ SingleModelSpectrumChannel::StartTx (Ptr txParams) if (m_spectrumPropagationLoss) { - rxParams->psd = m_spectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams->psd, senderMobility, receiverMobility); + rxParams->psd = m_spectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams, senderMobility, receiverMobility); } if (m_propagationDelay) diff --git a/src/spectrum/model/spectrum-propagation-loss-model.cc b/src/spectrum/model/spectrum-propagation-loss-model.cc index f047ae455..8a14cea07 100644 --- a/src/spectrum/model/spectrum-propagation-loss-model.cc +++ b/src/spectrum/model/spectrum-propagation-loss-model.cc @@ -21,6 +21,7 @@ #include "spectrum-propagation-loss-model.h" #include +#include "spectrum-signal-parameters.h" namespace ns3 { @@ -61,14 +62,14 @@ void SpectrumPropagationLossModel::SetNext (Ptr ne Ptr -SpectrumPropagationLossModel::CalcRxPowerSpectralDensity (Ptr txPsd, +SpectrumPropagationLossModel::CalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const { - Ptr rxPsd = DoCalcRxPowerSpectralDensity (txPsd, a, b); + Ptr rxPsd = DoCalcRxPowerSpectralDensity (params, a, b); if (m_next != 0) { - rxPsd = m_next->CalcRxPowerSpectralDensity (rxPsd, a, b); + rxPsd = m_next->CalcRxPowerSpectralDensity (params, a, b); } return rxPsd; } diff --git a/src/spectrum/model/spectrum-propagation-loss-model.h b/src/spectrum/model/spectrum-propagation-loss-model.h index 657ee582d..669e15be7 100644 --- a/src/spectrum/model/spectrum-propagation-loss-model.h +++ b/src/spectrum/model/spectrum-propagation-loss-model.h @@ -28,8 +28,7 @@ namespace ns3 { - - +struct SpectrumSignalParameters; /** * \ingroup spectrum @@ -63,18 +62,14 @@ public: /** * This method is to be called to calculate * - * @param txPsd the SpectrumValue representing the power spectral - * density of the transmission. Watt units are to be used for radio - * communications, and Pascal units for acoustic communications - * (e.g., underwater). - * + * @param params the spectrum signal parameters. * @param a sender mobility * @param b receiver mobility * * @return set of values Vs frequency representing the received * power in the same units used for the txPower parameter. */ - Ptr CalcRxPowerSpectralDensity (Ptr txPsd, + Ptr CalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const; @@ -85,15 +80,14 @@ protected: private: /** * - * @param txPsd set of values Vs frequency representing the - * transmission power. See SpectrumChannel for details. + * @param params the spectrum signal parameters. * @param a sender mobility * @param b receiver mobility * * @return set of values Vs frequency representing the received * power in the same units used for the txPower parameter. */ - virtual Ptr DoCalcRxPowerSpectralDensity (Ptr txPsd, + virtual Ptr DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const = 0; diff --git a/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc b/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc index 6035b8288..2c3c1f33d 100644 --- a/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc +++ b/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc @@ -23,6 +23,7 @@ #include "ns3/log.h" #include "three-gpp-channel-model.h" #include "three-gpp-spectrum-propagation-loss-model.h" +#include "spectrum-signal-parameters.h" #include "ns3/net-device.h" #include "ns3/node.h" #include "ns3/double.h" @@ -322,7 +323,7 @@ ThreeGppSpectrumPropagationLossModel::GetLongTerm (Ptr -ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (Ptr txPsd, +ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b, Ptr aPhasedArrayModel, @@ -335,7 +336,7 @@ ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (PtrGetDistanceFrom (b) > 0.0, "The position of a and b devices cannot be the same"); - Ptr rxPsd = Copy (txPsd); + Ptr rxPsd = Copy (params->psd); // retrieve the antenna of device a NS_ASSERT_MSG (aPhasedArrayModel, "Antenna not found for node " << aId); diff --git a/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h b/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h index a5565980d..a47f3b484 100644 --- a/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h +++ b/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h @@ -110,14 +110,14 @@ public: * a certain channel is cached and recomputed only when the channel realization * is updated, or when the beamforming vectors change. * - * \param txPsd tx PSD + * \param params tx parameters * \param a first node mobility model * \param b second node mobility model * \param aPhasedArrayModel the antenna array of the first node * \param bPhasedArrayModel the antenna array of the second node * \return the received PSD */ - Ptr DoCalcRxPowerSpectralDensity (Ptr txPsd, + Ptr DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b, Ptr aPhasedArrayModel, diff --git a/src/spectrum/model/trace-fading-loss-model.cc b/src/spectrum/model/trace-fading-loss-model.cc index 5e8469c0e..7e1f12900 100644 --- a/src/spectrum/model/trace-fading-loss-model.cc +++ b/src/spectrum/model/trace-fading-loss-model.cc @@ -29,6 +29,7 @@ #include "ns3/uinteger.h" #include #include +#include "spectrum-signal-parameters.h" namespace ns3 { @@ -149,11 +150,11 @@ TraceFadingLossModel::LoadTrace () Ptr TraceFadingLossModel::DoCalcRxPowerSpectralDensity ( - Ptr txPsd, + Ptr params, Ptr a, Ptr b) const { - NS_LOG_FUNCTION (this << *txPsd << a << b); + NS_LOG_FUNCTION (this << *params->psd << a << b); std::map ::iterator itOff; ChannelRealizationId_t mobilityPair = std::make_pair (a,b); @@ -192,7 +193,7 @@ TraceFadingLossModel::DoCalcRxPowerSpectralDensity ( } - Ptr rxPsd = Copy (txPsd); + Ptr rxPsd = Copy (params->psd); Values::iterator vit = rxPsd->ValuesBegin (); //Vector aSpeedVector = a->GetVelocity (); diff --git a/src/spectrum/model/trace-fading-loss-model.h b/src/spectrum/model/trace-fading-loss-model.h index ee49edfb3..e74c59c9c 100644 --- a/src/spectrum/model/trace-fading-loss-model.h +++ b/src/spectrum/model/trace-fading-loss-model.h @@ -73,14 +73,13 @@ public: private: /** - * \param txPsd set of values vs frequency representing the - * transmission power. See SpectrumChannel for details. + * @param params the spectrum signal parameters. * \param a sender mobility * \param b receiver mobility * \return set of values vs frequency representing the received * power in the same units used for the txPsd parameter. */ - Ptr DoCalcRxPowerSpectralDensity (Ptr txPsd, + Ptr DoCalcRxPowerSpectralDensity (Ptr params, Ptr a, Ptr b) const; diff --git a/src/spectrum/test/three-gpp-channel-test-suite.cc b/src/spectrum/test/three-gpp-channel-test-suite.cc index 9a6aa1af4..5b593e3a2 100644 --- a/src/spectrum/test/three-gpp-channel-test-suite.cc +++ b/src/spectrum/test/three-gpp-channel-test-suite.cc @@ -35,6 +35,7 @@ #include "ns3/channel-condition-model.h" #include "ns3/three-gpp-spectrum-propagation-loss-model.h" #include "ns3/wifi-spectrum-value-helper.h" +#include "ns3/spectrum-signal-parameters.h" using namespace ns3; @@ -358,35 +359,12 @@ ThreeGppChannelMatrixUpdateTest::DoRun (void) struct CheckLongTermUpdateParams { Ptr lossModel; //!< the ThreeGppSpectrumPropagationLossModel object used to compute the rx PSD - Ptr txPsd; //!< the PSD of the tx signal + Ptr txParams; //!< the params of the tx signal Ptr txMob; //!< the mobility model of the tx device Ptr rxMob; //!< the mobility model of the rx device Ptr rxPsdOld; //!< the previously received PSD Ptr txAntenna; //!< the antenna array of the tx device Ptr rxAntenna; //!< the antenna array of the rx device - - /** - * \brief Constructor - * \param pLossModel the ThreeGppSpectrumPropagationLossModel object used to compute the rx PSD - * \param pTxPsd the PSD of the tx signal - * \param pTxMob the tx mobility model - * \param pRxMob the rx mobility model - * \param pRxPsdOld the previously received PSD - * \param pTxAntenna the tx antenna array - * \param pRxAntenna the rx antenna array - */ - CheckLongTermUpdateParams (Ptr pLossModel, Ptr pTxPsd, - Ptr pTxMob, Ptr pRxMob, Ptr pRxPsdOld, - Ptr pTxAntenna, Ptr pRxAntenna) - { - lossModel = pLossModel; - txPsd = pTxPsd; - txMob = pTxMob; - rxMob = pRxMob; - rxPsdOld = pRxPsdOld; - txAntenna = pTxAntenna; - rxAntenna = pRxAntenna; - } }; /** @@ -432,7 +410,7 @@ private: * matrix is recomputed * \param params a structure that contains the set of parameters needed by CheckLongTermUpdate in order to perform calculations */ - void CheckLongTermUpdate (CheckLongTermUpdateParams ¶ms); + void CheckLongTermUpdate (const CheckLongTermUpdateParams ¶ms); /** * Checks if two PSDs are equal @@ -481,9 +459,9 @@ ThreeGppSpectrumPropagationLossModelTest::ArePsdEqual (Ptr first, } void -ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate (CheckLongTermUpdateParams ¶ms) +ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate (const CheckLongTermUpdateParams ¶ms) { - Ptr rxPsdNew = params.lossModel->DoCalcRxPowerSpectralDensity (params.txPsd, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna); + Ptr rxPsdNew = params.lossModel->DoCalcRxPowerSpectralDensity (params.txParams, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna); NS_TEST_ASSERT_MSG_EQ (ArePsdEqual (params.rxPsdOld, rxPsdNew), false, "The long term is not updated when the channel matrix is recomputed"); } @@ -547,13 +525,15 @@ ThreeGppSpectrumPropagationLossModelTest::DoRun () WifiSpectrumValue5MhzFactory sf; double txPower = 0.1; // Watts uint32_t channelNumber = 1; - Ptr txPsd = sf.CreateTxPowerSpectralDensity (txPower, channelNumber); + Ptr txPsd = sf.CreateTxPowerSpectralDensity (txPower, channelNumber); + Ptr txParams = Create (); + txParams->psd = txPsd->Copy (); // compute the rx psd - Ptr rxPsdOld = lossModel->DoCalcRxPowerSpectralDensity (txPsd, txMob, rxMob, txAntenna, rxAntenna); + Ptr rxPsdOld = lossModel->DoCalcRxPowerSpectralDensity (txParams, txMob, rxMob, txAntenna, rxAntenna); // 1) check that the rx PSD is equal for both the direct and the reverse channel - Ptr rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txPsd, rxMob, txMob, rxAntenna, txAntenna); + Ptr rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txParams, rxMob, txMob, rxAntenna, txAntenna); NS_TEST_ASSERT_MSG_EQ (ArePsdEqual (rxPsdOld, rxPsdNew), true, "The long term for the direct and the reverse channel are different"); // 2) check if the long term is updated when changing the BF vector @@ -563,15 +543,16 @@ ThreeGppSpectrumPropagationLossModelTest::DoRun () txBfVector [0] = std::complex (0.0, 0.0); txAntenna->SetBeamformingVector (txBfVector); - rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txPsd, rxMob, txMob, rxAntenna, txAntenna); + rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txParams, rxMob, txMob, rxAntenna, txAntenna); NS_TEST_ASSERT_MSG_EQ (ArePsdEqual (rxPsdOld, rxPsdNew), false, "Changing the BF vectors the rx PSD does not change"); // update rxPsdOld rxPsdOld = rxPsdNew; // 3) check if the long term is updated when the channel matrix is recomputed + CheckLongTermUpdateParams params{lossModel, txParams, txMob, rxMob, rxPsdOld, txAntenna, rxAntenna}; Simulator::Schedule (MilliSeconds (101), &ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate, - this, CheckLongTermUpdateParams (lossModel, txPsd, txMob, rxMob, rxPsdOld, txAntenna, rxAntenna)); + this, params); Simulator::Run (); Simulator::Destroy ();