23 #include <ns3/trace-fading-loss-model.h>
24 #include <ns3/mobility-model.h>
25 #include <ns3/spectrum-value.h>
27 #include <ns3/string.h>
28 #include <ns3/double.h>
29 #include "ns3/uinteger.h"
31 #include <ns3/simulator.h>
37 NS_OBJECT_ENSURE_REGISTERED (TraceFadingLossModel);
41 TraceFadingLossModel::TraceFadingLossModel ()
48 TraceFadingLossModel::~TraceFadingLossModel ()
50 m_fadingTrace.clear ();
51 m_windowOffsetsMap.clear ();
52 m_startVariableMap.clear ();
57 TraceFadingLossModel::GetTypeId (
void)
59 static TypeId tid = TypeId (
"ns3::TraceFadingLossModel")
60 .SetParent<SpectrumPropagationLossModel> ()
61 .AddConstructor<TraceFadingLossModel> ()
62 .AddAttribute (
"TraceFilename",
63 "Name of file to load a trace from.",
65 MakeStringAccessor (&TraceFadingLossModel::SetTraceFileName),
67 .AddAttribute (
"TraceLength",
68 "The total length of the fading trace (default value 10 s.)",
70 MakeTimeAccessor (&TraceFadingLossModel::SetTraceLength),
72 .AddAttribute (
"SamplesNum",
73 "The number of samples the trace is made of (default 10000)",
74 UintegerValue (10000),
75 MakeUintegerAccessor (&TraceFadingLossModel::m_samplesNum),
76 MakeUintegerChecker<uint32_t> ())
77 .AddAttribute (
"WindowSize",
78 "The size of the window for the fading trace (default value 0.5 s.)",
80 MakeTimeAccessor (&TraceFadingLossModel::m_windowSize),
82 .AddAttribute (
"RbNum",
83 "The number of RB the trace is made of (default 100)",
85 MakeUintegerAccessor (&TraceFadingLossModel::m_rbNum),
86 MakeUintegerChecker<uint8_t> ())
92 TraceFadingLossModel::SetTraceFileName (std::string fileName)
96 m_traceFile = fileName;
100 TraceFadingLossModel::SetTraceLength (Time t)
113 TraceFadingLossModel::LoadTrace ()
116 std::ifstream ifTraceFile;
117 ifTraceFile.open (m_traceFile.c_str (), std::ifstream::in);
118 m_fadingTrace.clear ();
119 if (!ifTraceFile.good ())
122 NS_ASSERT_MSG(ifTraceFile.good (),
" Fading trace file not found");
127 for (uint32_t i = 0; i < m_rbNum; i++)
130 for (uint32_t j = 0; j < m_samplesNum; j++)
133 ifTraceFile >> sample;
134 rbTimeFadingTrace.push_back (sample);
136 m_fadingTrace.push_back (rbTimeFadingTrace);
151 std::map <ChannelRealizationId_t, int >::iterator itOff;
153 itOff = m_windowOffsetsMap.find (mobilityPair);
154 if (itOff!=m_windowOffsetsMap.end ())
160 std::map <ChannelRealizationId_t, int >::iterator itOff2;
161 for (itOff2 = m_windowOffsetsMap.begin (); itOff2 != m_windowOffsetsMap.end (); itOff2++)
163 std::map <ChannelRealizationId_t, Ptr<UniformRandomVariable> >::iterator itVar;
164 itVar = m_startVariableMap.find ((*itOff2).first);
165 (*itOff2).second = (*itVar).second->GetValue ();
172 NS_LOG_LOGIC (
this <<
"insert new channel realization, m_windowOffsetMap.size () = " << m_windowOffsetsMap.size ());
178 m_windowOffsetsMap.insert (std::pair<ChannelRealizationId_t,int> (mobilityPair, startV->GetValue ()));
183 Values::iterator vit = rxPsd->ValuesBegin ();
193 int lastUpdate_ms =
static_cast<int> (m_lastWindowUpdate.
GetMilliSeconds () * m_timeGranularity);
194 int index = ((*itOff).second + now_ms - lastUpdate_ms) % m_samplesNum;
196 while (vit != rxPsd->ValuesEnd ())
201 double fading = m_fadingTrace.at (subChannel).at (index);
202 NS_LOG_INFO (
this <<
" FADING now " << now_ms <<
" offset " << (*itOff).second <<
" id " << index <<
" fading " << fading);
204 power = 10 * std::log10 (180000 * power);
206 NS_LOG_LOGIC (
this << subChannel << *vit << power << fading);
208 *vit = std::pow (10., ((power + fading) / 10)) / 180000;
227 int64_t currentStream = stream;
228 std::map <ChannelRealizationId_t, Ptr<UniformRandomVariable> >::iterator itVar;
229 itVar = m_startVariableMap.begin ();
230 while (itVar!=m_startVariableMap.end ())
232 (*itVar).second->SetStream (currentStream);
235 return (currentStream - stream);
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
int64_t AssignStreams(int64_t stream)
std::vector< double > FadingTraceSample
virtual void DoInitialize(void)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
double GetSeconds(void) const
std::pair< Ptr< const MobilityModel >, Ptr< const MobilityModel > > ChannelRealizationId_t
The couple of mobility mnode that form a fading channel realization.
#define NS_LOG_LOGIC(msg)
Ptr< SpectrumValue > DoCalcRxPowerSpectralDensity(Ptr< const SpectrumValue > txPsd, Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const
void SetNext(Ptr< SpectrumPropagationLossModel > next)
#define NS_ASSERT_MSG(condition, message)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Hold an floating point type.
void SetAttribute(std::string name, const AttributeValue &value)
int64_t GetMilliSeconds(void) const