23 #include "ns3/snr-to-block-error-rate-manager.h"
24 #include "ns3/snr-to-block-error-rate-record.h"
25 #include "default-traces.h"
33 SNRToBlockErrorRateManager::SNRToBlockErrorRateManager (
void)
36 for (
int i = 0; i < 7; i++)
38 m_recordModulation[i] =
new std::vector<SNRToBlockErrorRateRecord*> ();
40 m_activateLoss =
false;
41 std::strcpy (m_traceFilePath,
"DefaultTraces");
44 SNRToBlockErrorRateManager::~SNRToBlockErrorRateManager (
void)
47 for (
int i = 0; i < 7; i++)
49 delete m_recordModulation[i];
54 SNRToBlockErrorRateManager::ClearRecords (
void)
56 for (
int i = 0; i < 7; i++)
59 for (std::vector<SNRToBlockErrorRateRecord*>::iterator iter = m_recordModulation[i]->begin (); iter
60 != m_recordModulation[i]->end (); ++iter)
68 m_recordModulation[i]->clear ();
75 m_activateLoss = loss;
81 std::ifstream m_ifTraceFile;
83 double snrValue, bitErrorRate, burstErrorRate, sigma2, I1, I2;
85 for (
int i = 0; i < 7; i++)
88 sprintf (traceFile,
"%s/modulation%d.txt", m_traceFilePath, i);
90 m_ifTraceFile.open (traceFile, std::ifstream::in);
91 if (m_ifTraceFile.good () ==
false)
93 NS_LOG_INFO (
"Unable to load " << traceFile <<
"!! Loading default traces...");
97 while (m_ifTraceFile.good ())
99 m_ifTraceFile >> snrValue >> bitErrorRate >> burstErrorRate >> sigma2 >> I1 >> I2;
106 m_recordModulation[i]->push_back (record);
109 m_ifTraceFile.close ();
111 m_activateLoss =
true;
117 double snrValue, bitErrorRate, burstErrorRate, sigma2, I1, I2;
119 for (
unsigned int j = 0; j <
sizeof(modulation0[0]) /
sizeof(
double); j++)
121 snrValue = modulation0[0][j];
122 bitErrorRate = modulation0[1][j];
123 burstErrorRate = modulation0[2][j];
124 sigma2 = modulation0[3][j];
125 I1 = modulation0[4][j];
126 I2 = modulation0[5][j];
133 m_recordModulation[0]->push_back (record);
135 for (
unsigned int j = 0; j <
sizeof(modulation1[0]) /
sizeof(
double); j++)
137 snrValue = modulation1[0][j];
138 bitErrorRate = modulation1[1][j];
139 burstErrorRate = modulation1[2][j];
140 sigma2 = modulation1[3][j];
141 I1 = modulation1[4][j];
142 I2 = modulation1[5][j];
149 m_recordModulation[1]->push_back (record);
151 for (
unsigned int j = 0; j <
sizeof(modulation2[0]) /
sizeof(
double); j++)
153 snrValue = modulation2[0][j];
154 bitErrorRate = modulation2[1][j];
155 burstErrorRate = modulation2[2][j];
156 sigma2 = modulation2[3][j];
157 I1 = modulation2[4][j];
158 I2 = modulation2[5][j];
165 m_recordModulation[2]->push_back (record);
167 for (
unsigned int j = 0; j <
sizeof(modulation3[0]) /
sizeof(
double); j++)
169 snrValue = modulation3[0][j];
170 bitErrorRate = modulation3[1][j];
171 burstErrorRate = modulation3[2][j];
172 sigma2 = modulation3[3][j];
173 I1 = modulation3[4][j];
174 I2 = modulation3[5][j];
181 m_recordModulation[3]->push_back (record);
183 for (
unsigned int j = 0; j <
sizeof(modulation4[0]) /
sizeof(
double); j++)
185 snrValue = modulation4[0][j];
186 bitErrorRate = modulation4[1][j];
187 burstErrorRate = modulation4[2][j];
188 sigma2 = modulation4[3][j];
189 I1 = modulation4[4][j];
190 I2 = modulation4[5][j];
197 m_recordModulation[4]->push_back (record);
199 for (
unsigned int j = 0; j <
sizeof(modulation5[0]) /
sizeof(
double); j++)
201 snrValue = modulation5[0][j];
202 bitErrorRate = modulation5[1][j];
203 burstErrorRate = modulation5[2][j];
204 sigma2 = modulation5[3][j];
205 I1 = modulation5[4][j];
206 I2 = modulation5[5][j];
213 m_recordModulation[5]->push_back (record);
215 for (
unsigned int j = 0; j <
sizeof(modulation6[0]) /
sizeof(
double); j++)
217 snrValue = modulation6[0][j];
218 bitErrorRate = modulation6[1][j];
219 burstErrorRate = modulation6[2][j];
220 sigma2 = modulation6[3][j];
221 I1 = modulation6[4][j];
222 I2 = modulation6[5][j];
229 m_recordModulation[6]->push_back (record);
231 m_activateLoss =
true;
237 double snrValue, bitErrorRate, burstErrorRate, sigma2, I1, I2;
241 std::ifstream m_ifTraceFile;
243 for (
int i = 0; i < 7; i++)
245 char traceFile[1024];
246 sprintf (traceFile,
"%s/Modulation%d.txt", m_traceFilePath, i);
248 m_ifTraceFile.open (traceFile, std::ifstream::in);
249 if (m_ifTraceFile.good () ==
false)
251 NS_LOG_INFO (
"Unable to load " << traceFile <<
"!!Loading default traces...");
255 while (m_ifTraceFile.good ())
257 m_ifTraceFile >> snrValue >> bitErrorRate >> burstErrorRate >> sigma2 >> I1 >> I2;
265 m_recordModulation[i]->push_back (record);
268 m_ifTraceFile.close ();
270 m_activateLoss =
true;
276 std::strcpy (m_traceFilePath, traceFilePath);
282 return (std::string (m_traceFilePath));
289 if (m_activateLoss ==
false)
294 std::vector<SNRToBlockErrorRateRecord *> *record = 0;
296 record = m_recordModulation[modulation];
298 if (SNR <= (record->at (0)->GetSNRValue ()))
302 if (SNR >= (record->at (record->size () - 1)->GetSNRValue ()))
307 std::vector<SNRToBlockErrorRateRecord*>::const_iterator iter;
309 for (i = 0; i < record->size (); i++)
311 if (SNR < record->at (i)->GetSNRValue ())
316 double intervalSize = (record->at (i)->GetSNRValue () - record->at (i - 1)->GetSNRValue ());
317 double coeff1 = (SNR - record->at (i - 1)->GetSNRValue ()) / intervalSize;
318 double coeff2 = -1 * (SNR - record->at (i)->GetSNRValue ()) / intervalSize;
319 double BlockErrorRate = coeff2 * (record->at (i - 1)->GetBlockErrorRate ()) + coeff1 * (record->at (i)->GetBlockErrorRate ());
320 return BlockErrorRate;
328 if (m_activateLoss ==
false)
333 std::vector<SNRToBlockErrorRateRecord *> *record = 0;
334 record = m_recordModulation[modulation];
336 if (SNR <= (record->at (0)->GetSNRValue ()))
339 record->at (0)->Copy ();
341 if (SNR >= (record->at (record->size () - 1)->GetSNRValue ()))
344 record->at (record->size () - 1)->Copy ();
347 std::vector<SNRToBlockErrorRateRecord*>::const_iterator iter;
349 for (i = 0; i < record->size (); i++)
351 if (SNR < record->at (i)->GetSNRValue ())
356 double intervalSize = (record->at (i)->GetSNRValue ()
357 - record->at (i - 1)->GetSNRValue ());
358 double coeff1 = (SNR - record->at (i - 1)->GetSNRValue ()) / intervalSize;
359 double coeff2 = -1 * (SNR - record->at (i)->GetSNRValue ()) / intervalSize;
360 double BER = coeff2 * (record->at (i - 1)->GetBitErrorRate ()) + coeff1 * (record->at (i)->GetBitErrorRate ());
361 double BlcER = coeff2 * (record->at (i - 1)->GetBlockErrorRate ()) + coeff1 * (record->at (i)->GetBlockErrorRate ());
362 double sigma2 = coeff2 * (record->at (i - 1)->GetSigma2 ()) + coeff1 * (record->at (i)->GetSigma2 ());
363 double I1 = coeff2 * (record->at (i - 1)->GetI1 ()) + coeff1 * (record->at (i)->GetI1 ());
364 double I2 = coeff2 * (record->at (i - 1)->GetI2 ()) + coeff1 * (record->at (i)->GetI2 ());
367 return SNRToBlockErrorRate;
void LoadDefaultTraces(void)
Loads the default traces from default-traces.h file.
std::string GetTraceFilePath(void)
#define NS_LOG_COMPONENT_DEFINE(name)
This class represents a record (handled by SnrToBlockErrorRate manager) that keeps a mapping between ...
SNRToBlockErrorRateRecord * GetSNRToBlockErrorRateRecord(double SNR, uint8_t modulation)
returns a record of type SNRToBlockErrorRateRecord corresponding to a given modulation and SNR value ...
void ActivateLoss(bool loss)
If activate loss is called with false, all the returned BlcER will be 0 (no losses) ...
void SetTraceFilePath(char *traceFilePath)
Set the path of the repository containing the traces.
void LoadTraces(void)
Loads the traces form the repository specified in the constructor or setted by SetTraceFilePath funct...
double GetBlockErrorRate(double SNR, uint8_t modulation)
returns the Block Error Rate for a given modulation and SNR value
void ReLoadTraces(void)
Reloads the trace.