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 } |