26 #include "ns3/mobility-model.h"
27 #include "ns3/boolean.h"
28 #include "ns3/double.h"
29 #include "ns3/string.h"
30 #include "ns3/pointer.h"
88 int64_t currentStream = stream;
94 return (currentStream - stream);
105 static TypeId tid =
TypeId (
"ns3::RandomPropagationLossModel")
107 .AddConstructor<RandomPropagationLossModel> ()
108 .AddAttribute (
"Variable",
"The random variable used to pick a loss everytime CalcRxPower is invoked.",
109 StringValue (
"ns3::ConstantRandomVariable[Constant=1.0]"),
111 MakePointerChecker<RandomVariableStream> ())
131 return txPowerDbm + rxc;
151 static TypeId tid =
TypeId (
"ns3::FriisPropagationLossModel")
153 .AddConstructor<FriisPropagationLossModel> ()
154 .AddAttribute (
"Frequency",
155 "The carrier frequency (in Hz) at which propagation occurs (default is 5.15 GHz).",
159 MakeDoubleChecker<double> ())
160 .AddAttribute (
"SystemLoss",
"The system loss",
163 MakeDoubleChecker<double> ())
164 .AddAttribute (
"MinDistance",
165 "The distance under which the propagation model refuses to give results (m)",
169 MakeDoubleChecker<double> ())
202 static const double C = 299792458.0;
215 double mw = std::pow (10.0,dbm/10.0);
222 double dbm = std::log10 (w * 1000.0) * 10.0;
267 double pr = 10 * std::log10 (numerator / denominator);
268 NS_LOG_DEBUG (
"distance="<<distance<<
"m, attenuation coefficient="<<pr<<
"dB");
269 return txPowerDbm + pr;
289 static TypeId tid =
TypeId (
"ns3::TwoRayGroundPropagationLossModel")
291 .AddConstructor<TwoRayGroundPropagationLossModel> ()
292 .AddAttribute (
"Frequency",
293 "The carrier frequency (in Hz) at which propagation occurs (default is 5.15 GHz).",
297 MakeDoubleChecker<double> ())
298 .AddAttribute (
"SystemLoss",
"The system loss",
301 MakeDoubleChecker<double> ())
302 .AddAttribute (
"MinDistance",
303 "The distance under which the propagation model refuses to give results (m)",
307 MakeDoubleChecker<double> ())
308 .AddAttribute (
"HeightAboveZ",
309 "The height of the antenna (m) above the node's Z coordinate",
312 MakeDoubleChecker<double> ())
350 static const double C = 299792458.0;
363 double mw = std::pow (10.0,dbm / 10.0);
370 double dbm = std::log10 (w * 1000.0) * 10.0;
422 double dCross = (4 *
PI * txAntHeight * rxAntHeight) /
m_lambda;
424 if (distance <= dCross)
430 double pr = 10 * std::log10 (numerator / denominator);
431 NS_LOG_DEBUG (
"Receiver within crossover (" << dCross <<
"m) for Two_ray path; using Friis");
432 NS_LOG_DEBUG (
"distance=" << distance <<
"m, attenuation coefficient=" << pr <<
"dB");
433 return txPowerDbm + pr;
437 tmp = txAntHeight * rxAntHeight;
438 double rayNumerator = tmp * tmp;
439 tmp = distance * distance;
441 double rayPr = 10 * std::log10 (rayNumerator / rayDenominator);
442 NS_LOG_DEBUG (
"distance=" << distance <<
"m, attenuation coefficient=" << rayPr <<
"dB");
443 return txPowerDbm + rayPr;
462 static TypeId tid =
TypeId (
"ns3::LogDistancePropagationLossModel")
464 .AddConstructor<LogDistancePropagationLossModel> ()
465 .AddAttribute (
"Exponent",
466 "The exponent of the Path Loss propagation model",
469 MakeDoubleChecker<double> ())
470 .AddAttribute (
"ReferenceDistance",
471 "The distance at which the reference loss is calculated (m)",
474 MakeDoubleChecker<double> ())
475 .AddAttribute (
"ReferenceLoss",
476 "The reference loss at reference distance (dB). (Default is Friis at 1m with 5.15 GHz)",
479 MakeDoubleChecker<double> ())
533 "attenuation coefficient="<<rxc<<
"db");
534 return txPowerDbm + rxc;
551 static TypeId tid =
TypeId (
"ns3::ThreeLogDistancePropagationLossModel")
553 .AddConstructor<ThreeLogDistancePropagationLossModel> ()
554 .AddAttribute (
"Distance0",
555 "Beginning of the first (near) distance field",
558 MakeDoubleChecker<double> ())
559 .AddAttribute (
"Distance1",
560 "Beginning of the second (middle) distance field.",
563 MakeDoubleChecker<double> ())
564 .AddAttribute (
"Distance2",
565 "Beginning of the third (far) distance field.",
568 MakeDoubleChecker<double> ())
569 .AddAttribute (
"Exponent0",
570 "The exponent for the first field.",
573 MakeDoubleChecker<double> ())
574 .AddAttribute (
"Exponent1",
575 "The exponent for the second field.",
578 MakeDoubleChecker<double> ())
579 .AddAttribute (
"Exponent2",
580 "The exponent for the third field.",
583 MakeDoubleChecker<double> ())
584 .AddAttribute (
"ReferenceLoss",
585 "The reference loss at distance d0 (dB). (Default is Friis at 1m with 5.15 GHz)",
588 MakeDoubleChecker<double> ())
633 NS_LOG_DEBUG (
"ThreeLogDistance distance=" << distance <<
"m, " <<
634 "attenuation=" << pathLossDb <<
"dB");
636 return txPowerDbm - pathLossDb;
653 static TypeId tid =
TypeId (
"ns3::NakagamiPropagationLossModel")
655 .AddConstructor<NakagamiPropagationLossModel> ()
656 .AddAttribute (
"Distance1",
657 "Beginning of the second distance field. Default is 80m.",
660 MakeDoubleChecker<double> ())
661 .AddAttribute (
"Distance2",
662 "Beginning of the third distance field. Default is 200m.",
665 MakeDoubleChecker<double> ())
667 "m0 for distances smaller than Distance1. Default is 1.5.",
670 MakeDoubleChecker<double> ())
672 "m1 for distances smaller than Distance2. Default is 0.75.",
675 MakeDoubleChecker<double> ())
677 "m2 for distances greater than Distance2. Default is 0.75.",
680 MakeDoubleChecker<double> ())
681 .AddAttribute (
"ErlangRv",
682 "Access to the underlying ErlangRandomVariable",
685 MakePointerChecker<ErlangRandomVariable> ())
686 .AddAttribute (
"GammaRv",
687 "Access to the underlying GammaRandomVariable",
690 MakePointerChecker<GammaRandomVariable> ());
726 double powerW = std::pow (10, (txPowerDbm - 30) / 10);
732 unsigned int int_m =
static_cast<unsigned int>(std::floor (m));
743 double resultPowerDbm = 10 * std::log10 (resultPowerW) + 30;
745 NS_LOG_DEBUG (
"Nakagami distance=" << distance <<
"m, " <<
746 "power=" << powerW <<
"W, " <<
747 "resultPower=" << resultPowerW <<
"W=" << resultPowerDbm <<
"dBm");
749 return resultPowerDbm;
770 .AddConstructor<FixedRssLossModel> ()
771 .AddAttribute (
"Rss",
"The fixed receiver Rss.",
774 MakeDoubleChecker<double> ())
815 static TypeId tid =
TypeId (
"ns3::MatrixPropagationLossModel")
817 .AddConstructor<MatrixPropagationLossModel> ()
818 .AddAttribute (
"DefaultLoss",
"The default value for propagation loss, dB.",
821 MakeDoubleChecker<double> ())
847 std::map<MobilityPair, double>::iterator i =
m_loss.find (p);
851 m_loss.insert (std::make_pair (p, loss));
869 std::map<MobilityPair, double>::const_iterator i =
m_loss.find (std::make_pair (a, b));
873 return txPowerDbm - i->second;
895 static TypeId tid =
TypeId (
"ns3::RangePropagationLossModel")
897 .AddConstructor<RangePropagationLossModel> ()
898 .AddAttribute (
"MaxRange",
899 "Maximum Transmission Range (meters)",
902 MakeDoubleChecker<double> ())
void SetFrequency(double frequency)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
void SetDefaultLoss(double)
Set default loss (in dB, positive) to be used, infinity if not set.
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
double GetDistanceFrom(Ptr< const MobilityModel > position) const
void SetPathLossExponent(double n)
void SetNext(Ptr< PropagationLossModel > next)
Enables a chain of loss models to act on the signal.
hold variables of type string
a Two-Ray Ground propagation loss model ported from NS2
#define NS_ASSERT(condition)
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
double GetFrequency(void) const
Vector GetPosition(void) const
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
double GetMinDistance(void) const
The propagation loss depends only on the distance (range) between transmitter and receiver...
double m_default
default loss
double GetPathLossExponent(void) const
Ptr< RandomVariableStream > m_variable
static TypeId GetTypeId(void)
static TypeId GetTypeId(void)
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
RandomPropagationLossModel()
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
virtual double GetValue(void)=0
Returns a random double from the underlying distribution.
A log distance path loss propagation model with three distance fields.
static TypeId GetTypeId(void)
void SetMinDistance(double minDistance)
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
Ptr< PropagationLossModel > GetNext()
Gets the next PropagationLossModel in the chain of loss models that act on the signal.
double DbmToW(double dbm) const
static TypeId GetTypeId(void)
virtual ~RandomPropagationLossModel()
static TypeId GetTypeId(void)
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const =0
static TypeId GetTypeId(void)
double CalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
The propagation loss follows a random distribution.
ThreeLogDistancePropagationLossModel()
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
void SetMinDistance(double minDistance)
LogDistancePropagationLossModel()
a Friis propagation loss model
Ptr< GammaRandomVariable > m_gammaRandomVariable
virtual ~PropagationLossModel()
FriisPropagationLossModel()
NakagamiPropagationLossModel()
Ptr< PropagationLossModel > m_next
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
NS_LOG_COMPONENT_DEFINE("PropagationLossModel")
Nakagami-m fast fading propagation loss model.
Ptr< ErlangRandomVariable > m_erlangRandomVariable
void SetSystemLoss(double systemLoss)
double GetMinDistance(void) const
virtual ~MatrixPropagationLossModel()
double m_referenceDistance
double GetSystemLoss(void) const
Modelize the propagation loss through a transmission medium.
static TypeId GetTypeId(void)
double GetSystemLoss(void) const
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
static TypeId GetTypeId(void)
#define NS_LOG_DEBUG(msg)
void SetLoss(Ptr< MobilityModel > a, Ptr< MobilityModel > b, double loss, bool symmetric=true)
Set loss (in dB, positive) between pair of ns-3 objects (typically, nodes).
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
double DbmToW(double dbm) const
void SetFrequency(double frequency)
void SetHeightAboveZ(double heightAboveZ)
RangePropagationLossModel()
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
void SetReference(double referenceDistance, double referenceLoss)
a base class which provides memory management and object aggregation
std::pair< Ptr< MobilityModel >, Ptr< MobilityModel > > MobilityPair
static TypeId GetTypeId(void)
void SetSystemLoss(double systemLoss)
a log distance propagation model.
Hold a floating point type.
MatrixPropagationLossModel()
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
The propagation loss is fixed for each pair of nodes and doesn't depend on their actual positions...
TwoRayGroundPropagationLossModel()
int64_t AssignStreams(int64_t stream)
If this loss model uses objects of type RandomVariableStream, set the stream numbers to the integers ...
double GetFrequency(void) const
virtual int64_t DoAssignStreams(int64_t stream)
Subclasses must implement this; those not using random variables can return zero. ...
double DbmFromW(double w) const
double DbmFromW(double w) const
std::map< MobilityPair, double > m_loss
Fixed loss between pair of nodes.
double z
z coordinate of vector
virtual double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
virtual int64_t DoAssignStreams(int64_t stream)=0
Subclasses must implement this; those not using random variables can return zero. ...