diff -r ccbdc2b19ea5 -r a2127017ecb4 src/devices/wifi/propagation-loss-model.cc --- a/src/devices/wifi/propagation-loss-model.cc Thu Feb 25 13:51:59 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,546 +0,0 @@ -/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2005,2006,2007 INRIA - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation; - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Author: Mathieu Lacage - * Contributions: Timo Bingmann - */ - -#include "propagation-loss-model.h" -#include "ns3/log.h" -#include "ns3/mobility-model.h" -#include "ns3/boolean.h" -#include "ns3/double.h" -#include - -NS_LOG_COMPONENT_DEFINE ("PropagationLossModel"); - -namespace ns3 { - -// ------------------------------------------------------------------------- // - -NS_OBJECT_ENSURE_REGISTERED (PropagationLossModel); - -TypeId -PropagationLossModel::GetTypeId (void) -{ - static TypeId tid = TypeId ("ns3::PropagationLossModel") - .SetParent () - ; - return tid; -} - -PropagationLossModel::PropagationLossModel () - : m_next (0) -{} - -PropagationLossModel::~PropagationLossModel () -{} - -void -PropagationLossModel::SetNext (Ptr next) -{ - m_next = next; -} - -double -PropagationLossModel::CalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const -{ - double self = DoCalcRxPower (txPowerDbm, a, b); - if (m_next != 0) - { - self = m_next->CalcRxPower (self, a, b); - } - return self; -} - -// ------------------------------------------------------------------------- // - -NS_OBJECT_ENSURE_REGISTERED (RandomPropagationLossModel); - -TypeId -RandomPropagationLossModel::GetTypeId (void) -{ - static TypeId tid = TypeId ("ns3::RandomPropagationLossModel") - .SetParent () - .AddConstructor () - .AddAttribute ("Variable", "The random variable used to pick a loss everytime CalcRxPower is invoked.", - RandomVariableValue (ConstantVariable (1.0)), - MakeRandomVariableAccessor (&RandomPropagationLossModel::m_variable), - MakeRandomVariableChecker ()) - ; - return tid; -} -RandomPropagationLossModel::RandomPropagationLossModel () - : PropagationLossModel () -{} - -RandomPropagationLossModel::~RandomPropagationLossModel () -{} - -double -RandomPropagationLossModel::DoCalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const -{ - double rxc = -m_variable.GetValue (); - NS_LOG_DEBUG ("attenuation coefficent="< () - .AddConstructor () - .AddAttribute ("Lambda", - "The wavelength (default is 5.15 GHz at 300 000 km/s).", - DoubleValue (300000000.0 / 5.150e9), - MakeDoubleAccessor (&FriisPropagationLossModel::m_lambda), - MakeDoubleChecker ()) - .AddAttribute ("SystemLoss", "The system loss", - DoubleValue (1.0), - MakeDoubleAccessor (&FriisPropagationLossModel::m_systemLoss), - MakeDoubleChecker ()) - .AddAttribute ("MinDistance", - "The distance under which the propagation model refuses to give results (m)", - DoubleValue (0.5), - MakeDoubleAccessor (&FriisPropagationLossModel::SetMinDistance, - &FriisPropagationLossModel::GetMinDistance), - MakeDoubleChecker ()) - ; - return tid; -} - -FriisPropagationLossModel::FriisPropagationLossModel () -{} -void -FriisPropagationLossModel::SetSystemLoss (double systemLoss) -{ - m_systemLoss = systemLoss; -} -double -FriisPropagationLossModel::GetSystemLoss (void) const -{ - return m_systemLoss; -} -void -FriisPropagationLossModel::SetMinDistance (double minDistance) -{ - m_minDistance = minDistance; -} -double -FriisPropagationLossModel::GetMinDistance (void) const -{ - return m_minDistance; -} -void -FriisPropagationLossModel::SetLambda (double frequency, double speed) -{ - m_lambda = speed / frequency; -} -void -FriisPropagationLossModel::SetLambda (double lambda) -{ - m_lambda = lambda; -} -double -FriisPropagationLossModel::GetLambda (void) const -{ - return m_lambda; -} - -double -FriisPropagationLossModel::DbmToW (double dbm) const -{ - double mw = pow(10.0,dbm/10.0); - return mw / 1000.0; -} - -double -FriisPropagationLossModel::DbmFromW (double w) const -{ - double dbm = log10 (w * 1000.0) * 10.0; - return dbm; -} - -double -FriisPropagationLossModel::DoCalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const -{ - /* - * Friis free space equation: - * where Pt, Gr, Gr and P are in Watt units - * L is in meter units. - * - * P Gt * Gr * (lambda^2) - * --- = --------------------- - * Pt (4 * pi * d)^2 * L - * - * Gt: tx gain (unit-less) - * Gr: rx gain (unit-less) - * Pt: tx power (W) - * d: distance (m) - * L: system loss - * lambda: wavelength (m) - * - * Here, we ignore tx and rx gain and the input and output values - * are in dB or dBm: - * - * lambda^2 - * rx = tx + 10 log10 (-------------------) - * (4 * pi * d)^2 * L - * - * rx: rx power (dB) - * tx: tx power (dB) - * d: distance (m) - * L: system loss (unit-less) - * lambda: wavelength (m) - */ - double distance = a->GetDistanceFrom (b); - if (distance <= m_minDistance) - { - return txPowerDbm; - } - double numerator = m_lambda * m_lambda; - double denominator = 16 * PI * PI * distance * distance * m_systemLoss; - double pr = 10 * log10 (numerator / denominator); - NS_LOG_DEBUG ("distance="< () - .AddConstructor () - .AddAttribute ("Exponent", - "The exponent of the Path Loss propagation model", - DoubleValue (3.0), - MakeDoubleAccessor (&LogDistancePropagationLossModel::m_exponent), - MakeDoubleChecker ()) - .AddAttribute ("ReferenceDistance", - "The distance at which the reference loss is calculated (m)", - DoubleValue (1.0), - MakeDoubleAccessor (&LogDistancePropagationLossModel::m_referenceDistance), - MakeDoubleChecker ()) - .AddAttribute ("ReferenceLoss", - "The reference loss at reference distance (dB). (Default is Friis at 1m with 5.15 GHz)", - DoubleValue (46.6777), - MakeDoubleAccessor (&LogDistancePropagationLossModel::m_referenceLoss), - MakeDoubleChecker ()) - ; - return tid; - -} - -LogDistancePropagationLossModel::LogDistancePropagationLossModel () -{} - -void -LogDistancePropagationLossModel::SetPathLossExponent (double n) -{ - m_exponent = n; -} -void -LogDistancePropagationLossModel::SetReference (double referenceDistance, double referenceLoss) -{ - m_referenceDistance = referenceDistance; - m_referenceLoss = referenceLoss; -} -double -LogDistancePropagationLossModel::GetPathLossExponent (void) const -{ - return m_exponent; -} - -double -LogDistancePropagationLossModel::DoCalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const -{ - double distance = a->GetDistanceFrom (b); - if (distance <= m_referenceDistance) - { - return txPowerDbm; - } - /** - * The formula is: - * rx = 10 * log (Pr0(tx)) - n * 10 * log (d/d0) - * - * Pr0: rx power at reference distance d0 (W) - * d0: reference distance: 1.0 (m) - * d: distance (m) - * tx: tx power (dB) - * rx: dB - * - * Which, in our case is: - * - * rx = rx0(tx) - 10 * n * log (d/d0) - */ - double pathLossDb = 10 * m_exponent * log10 (distance / m_referenceDistance); - double rxc = -m_referenceLoss - pathLossDb; - NS_LOG_DEBUG ("distance="< () - .AddConstructor () - .AddAttribute ("Distance0", - "Beginning of the first (near) distance field", - DoubleValue (1.0), - MakeDoubleAccessor (&ThreeLogDistancePropagationLossModel::m_distance0), - MakeDoubleChecker ()) - .AddAttribute ("Distance1", - "Beginning of the second (middle) distance field.", - DoubleValue (200.0), - MakeDoubleAccessor (&ThreeLogDistancePropagationLossModel::m_distance1), - MakeDoubleChecker ()) - .AddAttribute ("Distance2", - "Beginning of the third (far) distance field.", - DoubleValue (500.0), - MakeDoubleAccessor (&ThreeLogDistancePropagationLossModel::m_distance2), - MakeDoubleChecker ()) - .AddAttribute ("Exponent0", - "The exponent for the first field.", - DoubleValue (1.9), - MakeDoubleAccessor (&ThreeLogDistancePropagationLossModel::m_exponent0), - MakeDoubleChecker ()) - .AddAttribute ("Exponent1", - "The exponent for the second field.", - DoubleValue (3.8), - MakeDoubleAccessor (&ThreeLogDistancePropagationLossModel::m_exponent1), - MakeDoubleChecker ()) - .AddAttribute ("Exponent2", - "The exponent for the third field.", - DoubleValue (3.8), - MakeDoubleAccessor (&ThreeLogDistancePropagationLossModel::m_exponent2), - MakeDoubleChecker ()) - .AddAttribute ("ReferenceLoss", - "The reference loss at distance d0 (dB). (Default is Friis at 1m with 5.15 GHz)", - DoubleValue (46.6777), - MakeDoubleAccessor (&ThreeLogDistancePropagationLossModel::m_referenceLoss), - MakeDoubleChecker ()) - ; - return tid; - -} - -ThreeLogDistancePropagationLossModel::ThreeLogDistancePropagationLossModel () -{ -} - -double -ThreeLogDistancePropagationLossModel::DoCalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const -{ - double distance = a->GetDistanceFrom (b); - NS_ASSERT(distance >= 0); - - // See doxygen comments for the formula and explanation - - double pathLossDb; - - if (distance < m_distance0) - { - pathLossDb = 0; - } - else if (distance < m_distance1) - { - pathLossDb = m_referenceLoss - + 10 * m_exponent0 * log10(distance / m_distance0); - } - else if (distance < m_distance2) - { - pathLossDb = m_referenceLoss - + 10 * m_exponent0 * log10(m_distance1 / m_distance0) - + 10 * m_exponent1 * log10(distance / m_distance1); - } - else - { - pathLossDb = m_referenceLoss - + 10 * m_exponent0 * log10(m_distance1 / m_distance0) - + 10 * m_exponent1 * log10(m_distance2 / m_distance1) - + 10 * m_exponent2 * log10(distance / m_distance2); - } - - NS_LOG_DEBUG ("ThreeLogDistance distance=" << distance << "m, " << - "attenuation=" << pathLossDb << "dB"); - - return txPowerDbm - pathLossDb; -} - -// ------------------------------------------------------------------------- // - -NS_OBJECT_ENSURE_REGISTERED (NakagamiPropagationLossModel); - -TypeId -NakagamiPropagationLossModel::GetTypeId (void) -{ - static TypeId tid = TypeId ("ns3::NakagamiPropagationLossModel") - .SetParent () - .AddConstructor () - .AddAttribute ("Distance1", - "Beginning of the second distance field. Default is 80m.", - DoubleValue (80.0), - MakeDoubleAccessor (&NakagamiPropagationLossModel::m_distance1), - MakeDoubleChecker ()) - .AddAttribute ("Distance2", - "Beginning of the third distance field. Default is 200m.", - DoubleValue (200.0), - MakeDoubleAccessor (&NakagamiPropagationLossModel::m_distance2), - MakeDoubleChecker ()) - .AddAttribute ("m0", - "m0 for distances smaller than Distance1. Default is 1.5.", - DoubleValue (1.5), - MakeDoubleAccessor (&NakagamiPropagationLossModel::m_m0), - MakeDoubleChecker ()) - .AddAttribute ("m1", - "m1 for distances smaller than Distance2. Default is 0.75.", - DoubleValue (0.75), - MakeDoubleAccessor (&NakagamiPropagationLossModel::m_m1), - MakeDoubleChecker ()) - .AddAttribute ("m2", - "m2 for distances greater than Distance2. Default is 0.75.", - DoubleValue (0.75), - MakeDoubleAccessor (&NakagamiPropagationLossModel::m_m2), - MakeDoubleChecker ()) - ; - return tid; - -} - -NakagamiPropagationLossModel::NakagamiPropagationLossModel () -{} - -double -NakagamiPropagationLossModel::DoCalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const -{ - // select m parameter - - double distance = a->GetDistanceFrom (b); - NS_ASSERT(distance >= 0); - - double m; - if (distance < m_distance1) - { - m = m_m0; - } - else if (distance < m_distance2) - { - m = m_m1; - } - else - { - m = m_m2; - } - - // the current power unit is dBm, but Watt is put into the Nakagami / - // Rayleigh distribution. - double powerW = pow(10, (txPowerDbm - 30) / 10); - - double resultPowerW; - - // switch between Erlang- and Gamma distributions: this is only for - // speed. (Gamma is equal to Erlang for any positive integer m.) - unsigned int int_m = static_cast(floor(m)); - - if (int_m == m) - { - resultPowerW = m_erlangRandomVariable.GetValue(int_m, powerW / m); - } - else - { - resultPowerW = m_gammaRandomVariable.GetValue(m, powerW / m); - } - - double resultPowerDbm = 10 * log10(resultPowerW) + 30; - - NS_LOG_DEBUG ("Nakagami distance=" << distance << "m, " << - "power=" << powerW <<"W, " << - "resultPower=" << resultPowerW << "W=" << resultPowerDbm << "dBm"); - - return resultPowerDbm; -} - -// ------------------------------------------------------------------------- // - -NS_OBJECT_ENSURE_REGISTERED (FixedRssLossModel); - -TypeId -FixedRssLossModel::GetTypeId (void) -{ - static TypeId tid = TypeId ("ns3::FixedRssLossModel") - .SetParent () - .AddConstructor () - .AddAttribute ("Rss", "The fixed receiver Rss.", - DoubleValue (-150.0), - MakeDoubleAccessor (&FixedRssLossModel::m_rss), - MakeDoubleChecker ()) - ; - return tid; -} -FixedRssLossModel::FixedRssLossModel () - : PropagationLossModel () -{} - -FixedRssLossModel::~FixedRssLossModel () -{} - -void -FixedRssLossModel::SetRss (double rss) -{ - m_rss = rss; -} - -double -FixedRssLossModel::DoCalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const -{ - return m_rss; -} - -// ------------------------------------------------------------------------- // - -} // namespace ns3