diff --git a/src/propagation/model/buildings-propagation-loss-model.cc b/src/propagation/model/buildings-propagation-loss-model.cc index b5b8ed531..32ac2009e 100644 --- a/src/propagation/model/buildings-propagation-loss-model.cc +++ b/src/propagation/model/buildings-propagation-loss-model.cc @@ -61,6 +61,12 @@ BuildingsPropagationLossModel::GetTypeId (void) DoubleValue (30.0), MakeDoubleAccessor (&BuildingsPropagationLossModel::m_rooftopHeight), MakeDoubleChecker ()) + + .AddAttribute ("Los2NlosThr", + " Threshold from LoS to NLoS in ITU 1411 [m].", + DoubleValue (200.0), + MakeDoubleAccessor (&BuildingsPropagationLossModel::m_itu1411NlosThreshold), + MakeDoubleChecker ()) .AddAttribute ("MinDistance", "The distance under which the propagation model refuses to give results (m) ", @@ -195,7 +201,14 @@ BuildingsPropagationLossModel::OkumuraHata (Ptr a, Ptr a, Ptr b) const { - return (ItuR1411Los (a,b)); + if (a->GetDistanceFrom (b) < m_itu1411NlosThreshold) + { + return (ItuR1411Los (a,b);) + } + else + { + return (ItuR1411Nlos (a,b)); + } } @@ -338,8 +351,31 @@ BuildingsPropagationLossModel::ItuR1411NlosOverRooftop (Ptr a, Ptr b) const { + // reflection pathloss + double x1 = a->GetStreetCrossingDistence (); + double x2 = b->GetStreetCrossingDistence (); + double f_alpha = 0.0; + if (m_cornerAngle<= 0.33) + { + f_alpha = -41.0 + 11*m_cornerAngle; + } + else if (m_cornerAngle<= 0.42) + { + f_alpha = -13.94 + 28*m_cornerAngle; + } + else if (m_cornerAngle<= 0.71) + { + f_alpha = -5.33 + 7.51*m_cornerAngle; + } + double pi = 3.141592653589793; + double Lr = -20*log10 (x1+x2) + (x1*x2*f_alpha/(m_streetsWidth*m_streetsWidth)) - 20*log10 (4*pi/m_lambda); - return (0.0); + // diffraction pathloss + double Da = -1*(40/(2*pi))*(atan (x2/m_streetsWidth) + atan (x1/m_streetsWidth) - (pi/2)); + double Ld = -10*log10 (x2*x1*(x1+x2)) + 2*Da + 0.1*(90 - m_cornerAngle*(180/pi)) - 20*log10 (4*pi/m_lambda); + + double loss = -10*log10 (pow (10, Lr/10) + pow (10, Ld/10)); + return (loss); } diff --git a/src/propagation/model/buildings-propagation-loss-model.h b/src/propagation/model/buildings-propagation-loss-model.h index 56ae2ee2f..5c969f859 100644 --- a/src/propagation/model/buildings-propagation-loss-model.h +++ b/src/propagation/model/buildings-propagation-loss-model.h @@ -101,11 +101,13 @@ private: double m_minDistance; // in meter double m_frequency; // frequency in MHz double m_rooftopHeight; // in meter (used to discriminate OH and short range canyoning) + double m_itu1411NlosThreshold; // in meters (switch Los -> NLoS) double m_streetsOrientation; // in degrees [0,90] double m_streetsWidth; // in meters double m_buildingsExtend; // in meters double m_buildingSeparation; // in meters + double m_cornerAngle; // in rad. (alpha in ITUR 1411) 1.570796325 = 90 degrees };