23 #include "ns3/double.h"
25 #include "ns3/mobility-model.h"
28 #include "okumura-hata-propagation-loss-model.h"
34 NS_OBJECT_ENSURE_REGISTERED (OkumuraHataPropagationLossModel);
38 OkumuraHataPropagationLossModel::GetTypeId (
void)
40 static TypeId tid = TypeId (
"ns3::OkumuraHataPropagationLossModel")
42 .SetParent<PropagationLossModel> ()
44 .AddAttribute (
"Frequency",
45 "The propagation frequency in Hz",
47 MakeDoubleAccessor (&OkumuraHataPropagationLossModel::m_frequency),
48 MakeDoubleChecker<double> ())
50 .AddAttribute (
"Environment",
51 "Environment Scenario",
52 EnumValue (UrbanEnvironment),
53 MakeEnumAccessor (&OkumuraHataPropagationLossModel::m_environment),
54 MakeEnumChecker (UrbanEnvironment,
"Urban",
55 SubUrbanEnvironment,
"SubUrban",
56 OpenAreasEnvironment,
"OpenAreas"))
58 .AddAttribute (
"CitySize",
59 "Dimension of the city",
60 EnumValue (LargeCity),
61 MakeEnumAccessor (&OkumuraHataPropagationLossModel::m_citySize),
62 MakeEnumChecker (SmallCity,
"Small",
73 double fmhz = m_frequency / 1e6;
75 if (m_frequency <= 1.500e9)
79 double log_f = std::log10 (fmhz);
82 NS_ASSERT_MSG (hb > 0 && hm > 0,
"nodes' height must be greater then 0");
83 double log_aHeight = 13.82 * std::log10 (hb);
84 double log_bHeight = 0.0;
85 if (m_citySize == LargeCity)
89 log_bHeight = 8.29 * std::pow (log10 (1.54 * hm), 2) - 1.1;
93 log_bHeight = 3.2 * std::pow (log10 (11.75 * hm), 2) - 4.97;
98 log_bHeight = 0.8 + (1.1 * log_f - 0.7) * hm - 1.56 * log_f;
101 NS_LOG_INFO (
this <<
" logf " << 26.16 * log_f <<
" loga " << log_aHeight <<
" X " << (((44.9 - (6.55 * std::log10 (hb)) )) * std::log10 (a->
GetDistanceFrom (b))) <<
" logb " << log_bHeight);
102 loss = 69.55 + (26.16 * log_f) - log_aHeight + (((44.9 - (6.55 * std::log10 (hb)) )) * std::log10 (dist)) - log_bHeight;
103 if (m_environment == SubUrbanEnvironment)
105 loss += -2 * (std::pow (std::log10 (fmhz / 28), 2)) - 5.4;
107 else if (m_environment == OpenAreasEnvironment)
109 loss += -4.70 * std::pow (std::log10 (fmhz),2) + 18.33 * std::log10 (fmhz) - 40.94;
118 double log_f = std::log10 (fmhz);
121 NS_ASSERT_MSG (hb > 0 && hm > 0,
"nodes' height must be greater then 0");
122 double log_aHeight = 13.82 * std::log10 (hb);
123 double log_bHeight = 0.0;
126 if (m_citySize == LargeCity)
128 log_bHeight = 3.2 * std::pow ((std::log10 (11.75 * hm)), 2);
133 log_bHeight = 1.1 * log_f - 0.7 * hm - (1.56 * log_f - 0.8);
136 loss = 46.3 + (33.9 * log_f) - log_aHeight + (((44.9 - (6.55 * std::log10 (hb)) )) * std::log10 (dist)) - log_bHeight + C;
142 OkumuraHataPropagationLossModel::DoCalcRxPower (
double txPowerDbm,
146 return (txPowerDbm -
GetLoss (a, b));
double GetDistanceFrom(Ptr< const MobilityModel > position) const
#define NS_LOG_COMPONENT_DEFINE(name)
Vector GetPosition(void) const
double GetLoss(Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
#define NS_ASSERT_MSG(condition, message)
virtual int64_t DoAssignStreams(int64_t stream)