src/propagation/model/jakes-process.cc
changeset 8985 7752dc4ce7e9
parent 8786 8f366d5eee06
child 9003 1aac13cdb643
equal deleted inserted replaced
8984:85eed149a0ea 8985:7752dc4ce7e9
    17  *
    17  *
    18  * Author: Kirill Andreev <andreev@telum.ru>, Alexander Sofronov <sofronov@telum.ru>
    18  * Author: Kirill Andreev <andreev@telum.ru>, Alexander Sofronov <sofronov@telum.ru>
    19  */
    19  */
    20 
    20 
    21 #include "jakes-process.h"
    21 #include "jakes-process.h"
    22 #include "ns3/random-variable.h"
       
    23 #include "ns3/simulator.h"
    22 #include "ns3/simulator.h"
    24 #include "ns3/double.h"
    23 #include "ns3/double.h"
    25 #include "ns3/uinteger.h"
    24 #include "ns3/uinteger.h"
    26 
    25 
    27 namespace ns3 {
    26 namespace ns3 {
    28 const double JakesProcess::PI = 3.14159265358979323846;
    27 const double JakesProcess::PI = 3.14159265358979323846;
       
    28 
       
    29 Ptr<UniformRandomVariable> JakesProcess::m_uniformVariable = CreateObject<UniformRandomVariable> ();
    29 
    30 
    30 /// Represents a single oscillator
    31 /// Represents a single oscillator
    31 JakesProcess::Oscillator::Oscillator (std::complex<double> amplitude, double initialPhase, double omega) :
    32 JakesProcess::Oscillator::Oscillator (std::complex<double> amplitude, double initialPhase, double omega) :
    32   m_amplitude (amplitude),
    33   m_amplitude (amplitude),
    33   m_phase (initialPhase),
    34   m_phase (initialPhase),
    82 
    83 
    83 void
    84 void
    84 JakesProcess::ConstructOscillators ()
    85 JakesProcess::ConstructOscillators ()
    85 {
    86 {
    86   // Initial phase is common for all oscillators:
    87   // Initial phase is common for all oscillators:
    87   double phi = UniformVariable (-PI, PI).GetValue ();
    88   double phi = m_uniformVariable->GetValue ();
    88   // Theta is common for all oscillatoer:
    89   // Theta is common for all oscillatoer:
    89   double theta = UniformVariable (-PI, PI).GetValue ();
    90   double theta = m_uniformVariable->GetValue ();
    90   for (unsigned int i = 0; i < m_nOscillators; i++)
    91   for (unsigned int i = 0; i < m_nOscillators; i++)
    91     {
    92     {
    92       unsigned int n = i + 1;
    93       unsigned int n = i + 1;
    93       /// 1. Rotation speed
    94       /// 1. Rotation speed
    94       /// 1a. Initiate \f[ \alpha_n = \frac{2\pi n - \pi + \theta}{4M},  n=1,2, \ldots,M\f], n is oscillatorNumber, M is m_nOscillators
    95       /// 1a. Initiate \f[ \alpha_n = \frac{2\pi n - \pi + \theta}{4M},  n=1,2, \ldots,M\f], n is oscillatorNumber, M is m_nOscillators
    95       double alpha = (2.0 * PI * n - PI + theta) / (4.0 * m_nOscillators);
    96       double alpha = (2.0 * PI * n - PI + theta) / (4.0 * m_nOscillators);
    96       /// 1b. Initiate rotation speed:
    97       /// 1b. Initiate rotation speed:
    97       double omega = m_omegaDopplerMax * cos (alpha);
    98       double omega = m_omegaDopplerMax * cos (alpha);
    98       /// 2. Initiate complex amplitude:
    99       /// 2. Initiate complex amplitude:
    99       double psi = UniformVariable (-PI, PI).GetValue ();
   100       double psi = m_uniformVariable->GetValue ();
   100       std::complex<double> amplitude = std::complex<double> (cos (psi), sin (psi)) * 2.0 / sqrt (m_nOscillators);
   101       std::complex<double> amplitude = std::complex<double> (cos (psi), sin (psi)) * 2.0 / sqrt (m_nOscillators);
   101       /// 3. Construct oscillator:
   102       /// 3. Construct oscillator:
   102       m_oscillators.push_back (Oscillator (amplitude, phi, omega)); 
   103       m_oscillators.push_back (Oscillator (amplitude, phi, omega)); 
   103     }
   104     }
   104 }
   105 }
   105 
   106 
   106 JakesProcess::JakesProcess () :
   107 JakesProcess::JakesProcess () :
   107   m_omegaDopplerMax (0),
   108   m_omegaDopplerMax (0),
   108   m_nOscillators (0)
   109   m_nOscillators (0)
   109 {}
   110 {
       
   111   m_uniformVariable->SetAttribute ("Min", DoubleValue (-1.0 * PI));
       
   112   m_uniformVariable->SetAttribute ("Max", DoubleValue (PI));
       
   113 }
   110 
   114 
   111 JakesProcess::~JakesProcess()
   115 JakesProcess::~JakesProcess()
   112 {
   116 {
   113   m_oscillators.clear ();
   117   m_oscillators.clear ();
   114 }
   118 }
   129 {
   133 {
   130   std::complex<double> complexGain = GetComplexGain ();
   134   std::complex<double> complexGain = GetComplexGain ();
   131   return (10 * log10 ((pow (complexGain.real (), 2) + pow (complexGain.imag (), 2)) / 2));
   135   return (10 * log10 ((pow (complexGain.real (), 2) + pow (complexGain.imag (), 2)) / 2));
   132 }
   136 }
   133 
   137 
       
   138 int64_t
       
   139 JakesProcess::AssignStreams (int64_t stream)
       
   140 {
       
   141   m_uniformVariable->SetStream (stream);
       
   142   return 1;
       
   143 }
       
   144 
   134 } // namespace ns3
   145 } // namespace ns3