Loading...
Searching...
No Matches
sat-link-results-plot.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2014 Magister Solutions
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Budiarto Herman <budiarto.herman@magister.fi>
19 *
20 */
21
22#include "ns3/core-module.h"
23#include "ns3/gnuplot.h"
24#include "ns3/satellite-env-variables.h"
25#include "ns3/satellite-look-up-table.h"
26#include "ns3/singleton.h"
27
28#include <fstream>
29#include <stdint.h>
30
38NS_LOG_COMPONENT_DEFINE("SatLinkResultsPlot");
39
40namespace ns3
41{
42
62class SatLinkResultsPlot : public SimpleRefCount<SatLinkResultsPlot>
63{
64 public:
68 void Run();
69
70 private:
71 void RunDvbRcs2Qpsk();
72 void RunDvbRcs2Psk8();
73 void RunDvbRcs2Qam16();
74 void RunDvbS2Qpsk();
75 void RunDvbS2Psk8();
76 void RunDvbS2Apsk16();
77 void RunDvbS2Apsk32();
78
79 Gnuplot2dDataset GetGnuplotDataset(Ptr<SatLookUpTable> table, std::string title);
80 Gnuplot GetGnuplot(std::string outputName, std::string title);
81
85 std::string m_inputPath;
86
87}; // end of class SatLinkResultsPlot
88
90{
91 m_resolutionDb = 0.01;
92 m_minSinrDb = 0.0;
93 m_maxSinrDb = 20.0;
94 m_inputPath = SatEnvVariables::GetInstance()->GetDataPath() + "/additional-input/linkresults/";
95}
96
97void
108
109void
111{
112 Ptr<SatLookUpTable> table1 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat2.txt");
113 Ptr<SatLookUpTable> table2 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat3.txt");
114 Ptr<SatLookUpTable> table3 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat4.txt");
115 Ptr<SatLookUpTable> table4 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat5.txt");
116 Ptr<SatLookUpTable> table5 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat6.txt");
117 Ptr<SatLookUpTable> table6 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat7.txt");
118 Ptr<SatLookUpTable> table7 =
119 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat13.txt");
120 Ptr<SatLookUpTable> table8 =
121 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat14.txt");
122 Ptr<SatLookUpTable> table9 =
123 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat15.txt");
124 Ptr<SatLookUpTable> table10 =
125 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat16.txt");
126 Ptr<SatLookUpTable> table11 =
127 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat17.txt");
128
129 Gnuplot2dDataset dataset1 = GetGnuplotDataset(table1, "Waveform 2: 112 bits, QPSK 1/3");
130 Gnuplot2dDataset dataset2 = GetGnuplotDataset(table2, "Waveform 3: 304 bits, QPSK 1/3");
131 Gnuplot2dDataset dataset3 = GetGnuplotDataset(table3, "Waveform 4: 472 bits, QPSK 1/2");
132 Gnuplot2dDataset dataset4 = GetGnuplotDataset(table4, "Waveform 5: 680 bits, QPSK 2/3");
133 Gnuplot2dDataset dataset5 = GetGnuplotDataset(table5, "Waveform 6: 768 bits, QPSK 3/4");
134 Gnuplot2dDataset dataset6 = GetGnuplotDataset(table6, "Waveform 7: 864 bits, QPSK 5/6");
135 Gnuplot2dDataset dataset7 = GetGnuplotDataset(table7, "Waveform 13: 984 bits, QPSK 1/3");
136 Gnuplot2dDataset dataset8 = GetGnuplotDataset(table8, "Waveform 14: 1504 bits, QPSK 1/2");
137 Gnuplot2dDataset dataset9 = GetGnuplotDataset(table9, "Waveform 15: 2112 bits, QPSK 2/3");
138 Gnuplot2dDataset dataset10 = GetGnuplotDataset(table10, "Waveform 16: 2384 bits, QPSK 3/4");
139 Gnuplot2dDataset dataset11 = GetGnuplotDataset(table11, "Waveform 17: 2664 bits, QPSK 5/6");
140
141 Gnuplot plot = GetGnuplot("rcs2_qpsk", "Link Results for DVB-RCS2 with QPSK");
142 plot.AddDataset(dataset1);
143 plot.AddDataset(dataset2);
144 plot.AddDataset(dataset3);
145 plot.AddDataset(dataset4);
146 plot.AddDataset(dataset5);
147 plot.AddDataset(dataset6);
148 plot.AddDataset(dataset7);
149 plot.AddDataset(dataset8);
150 plot.AddDataset(dataset9);
151 plot.AddDataset(dataset10);
152 plot.AddDataset(dataset11);
153
154 std::string plotFileName = "rcs2_qpsk.plt";
155 std::ofstream plotFile(plotFileName.c_str());
156 plot.GenerateOutput(plotFile);
157 plotFile.close();
158
159 std::cout << "Output file written: " << plotFileName << std::endl;
160
161} // end of void SatLinkResultsPlot::RunDvbRcs2Qpsk ()
162
163void
165{
166 Ptr<SatLookUpTable> table1 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat8.txt");
167 Ptr<SatLookUpTable> table2 = CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat9.txt");
168 Ptr<SatLookUpTable> table3 =
169 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat10.txt");
170 Ptr<SatLookUpTable> table4 =
171 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat18.txt");
172 Ptr<SatLookUpTable> table5 =
173 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat19.txt");
174 Ptr<SatLookUpTable> table6 =
175 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat20.txt");
176
177 Gnuplot2dDataset dataset1 = GetGnuplotDataset(table1, "Waveform 8: 920 bits, 8PSK 2/3");
178 Gnuplot2dDataset dataset2 = GetGnuplotDataset(table2, "Waveform 9: 1040 bits, 8PSK 3/4");
179 Gnuplot2dDataset dataset3 = GetGnuplotDataset(table3, "Waveform 10: 1152 bits, 8PSK 5/6");
180 Gnuplot2dDataset dataset4 = GetGnuplotDataset(table4, "Waveform 18: 2840 bits, 8PSK 2/3");
181 Gnuplot2dDataset dataset5 = GetGnuplotDataset(table5, "Waveform 19: 3200 bits, 8PSK 3/4");
182 Gnuplot2dDataset dataset6 = GetGnuplotDataset(table6, "Waveform 20: 3552 bits, 8PSK 5/6");
183
184 Gnuplot plot = GetGnuplot("rcs2_8psk", "Link Results for DVB-RCS2 with 8PSK");
185 plot.AddDataset(dataset1);
186 plot.AddDataset(dataset2);
187 plot.AddDataset(dataset3);
188 plot.AddDataset(dataset4);
189 plot.AddDataset(dataset5);
190 plot.AddDataset(dataset6);
191
192 std::string plotFileName = "rcs2_8psk.plt";
193 std::ofstream plotFile(plotFileName.c_str());
194 plot.GenerateOutput(plotFile);
195 plotFile.close();
196
197 std::cout << "Output file written: " << plotFileName << std::endl;
198
199} // end of void SatLinkResultsPlot::RunDvbRcs2Psk8 ()
200
201void
203{
204 Ptr<SatLookUpTable> table1 =
205 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat11.txt");
206 Ptr<SatLookUpTable> table2 =
207 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat12.txt");
208 Ptr<SatLookUpTable> table3 =
209 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat21.txt");
210 Ptr<SatLookUpTable> table4 =
211 CreateObject<SatLookUpTable>(m_inputPath + "rcs2_waveformat22.txt");
212
213 Gnuplot2dDataset dataset1 = GetGnuplotDataset(table1, "Waveform 11: 1400 bits, 16QAM 3/4");
214 Gnuplot2dDataset dataset2 = GetGnuplotDataset(table2, "Waveform 12: 1552 bits, 16QAM 5/6");
215 Gnuplot2dDataset dataset3 = GetGnuplotDataset(table3, "Waveform 21: 4312 bits, 16QAM 3/4");
216 Gnuplot2dDataset dataset4 = GetGnuplotDataset(table4, "Waveform 22: 4792 bits, 16QAM 5/6");
217
218 Gnuplot plot = GetGnuplot("rcs2_16qam", "Link Results for DVB-RCS2 with 16QAM");
219 plot.AddDataset(dataset1);
220 plot.AddDataset(dataset2);
221 plot.AddDataset(dataset3);
222 plot.AddDataset(dataset4);
223
224 std::string plotFileName = "rcs2_16qam.plt";
225 std::ofstream plotFile(plotFileName.c_str());
226 plot.GenerateOutput(plotFile);
227 plotFile.close();
228
229 std::cout << "Output file written: " << plotFileName << std::endl;
230
231} // end of void SatLinkResultsPlot::RunDvbRcs2Qam16 ()
232
233void
235{
236 Ptr<SatLookUpTable> table1 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_1_to_2.txt");
237 Ptr<SatLookUpTable> table2 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_2_to_3.txt");
238 Ptr<SatLookUpTable> table3 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_3_to_4.txt");
239 Ptr<SatLookUpTable> table4 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_3_to_5.txt");
240 Ptr<SatLookUpTable> table5 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_4_to_5.txt");
241 Ptr<SatLookUpTable> table6 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_5_to_6.txt");
242 Ptr<SatLookUpTable> table7 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_8_to_9.txt");
243 Ptr<SatLookUpTable> table8 = CreateObject<SatLookUpTable>(m_inputPath + "s2_qpsk_9_to_10.txt");
244
245 Gnuplot2dDataset dataset1 = GetGnuplotDataset(table1, "QPSK 1/2");
246 Gnuplot2dDataset dataset2 = GetGnuplotDataset(table2, "QPSK 2/3");
247 Gnuplot2dDataset dataset3 = GetGnuplotDataset(table3, "QPSK 3/4");
248 Gnuplot2dDataset dataset4 = GetGnuplotDataset(table4, "QPSK 3/5");
249 Gnuplot2dDataset dataset5 = GetGnuplotDataset(table5, "QPSK 4/5");
250 Gnuplot2dDataset dataset6 = GetGnuplotDataset(table6, "QPSK 5/6");
251 Gnuplot2dDataset dataset7 = GetGnuplotDataset(table7, "QPSK 8/9");
252 Gnuplot2dDataset dataset8 = GetGnuplotDataset(table8, "QPSK 9/10");
253
254 Gnuplot plot = GetGnuplot("s2_qpsk", "Link Results for DVB-S2 with QPSK");
255 plot.AddDataset(dataset1);
256 plot.AddDataset(dataset2);
257 plot.AddDataset(dataset3);
258 plot.AddDataset(dataset4);
259 plot.AddDataset(dataset5);
260 plot.AddDataset(dataset6);
261 plot.AddDataset(dataset7);
262 plot.AddDataset(dataset8);
263
264 std::string plotFileName = "s2_qpsk.plt";
265 std::ofstream plotFile(plotFileName.c_str());
266 plot.GenerateOutput(plotFile);
267 plotFile.close();
268
269 std::cout << "Output file written: " << plotFileName << std::endl;
270
271} // end of void SatLinkResultsPlot::RunDvbS2Qpsk ()
272
273void
275{
276 Ptr<SatLookUpTable> table1 = CreateObject<SatLookUpTable>(m_inputPath + "s2_8psk_2_to_3.txt");
277 Ptr<SatLookUpTable> table2 = CreateObject<SatLookUpTable>(m_inputPath + "s2_8psk_3_to_4.txt");
278 Ptr<SatLookUpTable> table3 = CreateObject<SatLookUpTable>(m_inputPath + "s2_8psk_3_to_5.txt");
279 Ptr<SatLookUpTable> table4 = CreateObject<SatLookUpTable>(m_inputPath + "s2_8psk_5_to_6.txt");
280 Ptr<SatLookUpTable> table5 = CreateObject<SatLookUpTable>(m_inputPath + "s2_8psk_8_to_9.txt");
281 Ptr<SatLookUpTable> table6 = CreateObject<SatLookUpTable>(m_inputPath + "s2_8psk_9_to_10.txt");
282
283 Gnuplot2dDataset dataset1 = GetGnuplotDataset(table1, "8PSK 2/3");
284 Gnuplot2dDataset dataset2 = GetGnuplotDataset(table2, "8PSK 3/4");
285 Gnuplot2dDataset dataset3 = GetGnuplotDataset(table3, "8PSK 3/5");
286 Gnuplot2dDataset dataset4 = GetGnuplotDataset(table4, "8PSK 5/6");
287 Gnuplot2dDataset dataset5 = GetGnuplotDataset(table5, "8PSK 8/9");
288 Gnuplot2dDataset dataset6 = GetGnuplotDataset(table6, "8PSK 9/10");
289
290 Gnuplot plot = GetGnuplot("s2_8psk", "Link Results for DVB-S2 with 8PSK");
291 plot.AddDataset(dataset1);
292 plot.AddDataset(dataset2);
293 plot.AddDataset(dataset3);
294 plot.AddDataset(dataset4);
295 plot.AddDataset(dataset5);
296 plot.AddDataset(dataset6);
297
298 std::string plotFileName = "s2_8psk.plt";
299 std::ofstream plotFile(plotFileName.c_str());
300 plot.GenerateOutput(plotFile);
301 plotFile.close();
302
303 std::cout << "Output file written: " << plotFileName << std::endl;
304
305} // end of void SatLinkResultsPlot::RunDvbS2Psk8 ()
306
307void
309{
310 Ptr<SatLookUpTable> table1 = CreateObject<SatLookUpTable>(m_inputPath + "s2_16apsk_2_to_3.txt");
311 Ptr<SatLookUpTable> table2 = CreateObject<SatLookUpTable>(m_inputPath + "s2_16apsk_3_to_4.txt");
312 Ptr<SatLookUpTable> table3 = CreateObject<SatLookUpTable>(m_inputPath + "s2_16apsk_4_to_5.txt");
313 Ptr<SatLookUpTable> table4 = CreateObject<SatLookUpTable>(m_inputPath + "s2_16apsk_5_to_6.txt");
314 Ptr<SatLookUpTable> table5 = CreateObject<SatLookUpTable>(m_inputPath + "s2_16apsk_8_to_9.txt");
315 Ptr<SatLookUpTable> table6 =
316 CreateObject<SatLookUpTable>(m_inputPath + "s2_16apsk_9_to_10.txt");
317
318 Gnuplot2dDataset dataset1 = GetGnuplotDataset(table1, "16APSK 2/3");
319 Gnuplot2dDataset dataset2 = GetGnuplotDataset(table2, "16APSK 3/4");
320 Gnuplot2dDataset dataset3 = GetGnuplotDataset(table3, "16APSK 4/5");
321 Gnuplot2dDataset dataset4 = GetGnuplotDataset(table4, "16APSK 5/6");
322 Gnuplot2dDataset dataset5 = GetGnuplotDataset(table5, "16APSK 8/9");
323 Gnuplot2dDataset dataset6 = GetGnuplotDataset(table6, "16APSK 9/10");
324
325 Gnuplot plot = GetGnuplot("s2_16apsk", "Link Results for DVB-S2 with 16APSK");
326 plot.AddDataset(dataset1);
327 plot.AddDataset(dataset2);
328 plot.AddDataset(dataset3);
329 plot.AddDataset(dataset4);
330 plot.AddDataset(dataset5);
331 plot.AddDataset(dataset6);
332
333 std::string plotFileName = "s2_16apsk.plt";
334 std::ofstream plotFile(plotFileName.c_str());
335 plot.GenerateOutput(plotFile);
336 plotFile.close();
337
338 std::cout << "Output file written: " << plotFileName << std::endl;
339
340} // end of void SatLinkResultsPlot::RunDvbS2Apsk16 ()
341
342void
344{
345 Ptr<SatLookUpTable> table1 = CreateObject<SatLookUpTable>(m_inputPath + "s2_32apsk_3_to_4.txt");
346 Ptr<SatLookUpTable> table2 = CreateObject<SatLookUpTable>(m_inputPath + "s2_32apsk_4_to_5.txt");
347 Ptr<SatLookUpTable> table3 = CreateObject<SatLookUpTable>(m_inputPath + "s2_32apsk_5_to_6.txt");
348 Ptr<SatLookUpTable> table4 = CreateObject<SatLookUpTable>(m_inputPath + "s2_32apsk_8_to_9.txt");
349
350 Gnuplot2dDataset dataset1 = GetGnuplotDataset(table1, "32APSK 3/4");
351 Gnuplot2dDataset dataset2 = GetGnuplotDataset(table2, "32APSK 4/5");
352 Gnuplot2dDataset dataset3 = GetGnuplotDataset(table3, "32APSK 5/6");
353 Gnuplot2dDataset dataset4 = GetGnuplotDataset(table4, "32APSK 8/9");
354
355 Gnuplot plot = GetGnuplot("s2_32apsk", "Link Results for DVB-S2 with 32APSK");
356 plot.AddDataset(dataset1);
357 plot.AddDataset(dataset2);
358 plot.AddDataset(dataset3);
359 plot.AddDataset(dataset4);
360
361 std::string plotFileName = "s2_32apsk.plt";
362 std::ofstream plotFile(plotFileName.c_str());
363 plot.GenerateOutput(plotFile);
364 plotFile.close();
365
366 std::cout << "Output file written: " << plotFileName << std::endl;
367
368} // end of void SatLinkResultsPlot::RunDvbS2Apsk32 ()
369
370Gnuplot2dDataset
371SatLinkResultsPlot::GetGnuplotDataset(Ptr<SatLookUpTable> table, std::string title)
372{
373 Gnuplot2dDataset ret;
374 ret.SetTitle(title);
375 ret.SetStyle(Gnuplot2dDataset::LINES);
376
377 bool writeFlag = false;
378 double bler;
379
380 for (double sinr = m_minSinrDb; sinr < m_maxSinrDb; sinr += m_resolutionDb)
381 {
382 bler = table->GetBler(sinr);
383
384 if (!writeFlag)
385 {
386 if (bler < 1)
387 {
388 // first time error rate is not 100%
389 writeFlag = true; // start writing the plot
390 ret.Add(sinr - m_resolutionDb, 1.0); // also add the previous point
391 ret.Add(sinr, bler);
392 }
393 }
394 else
395 {
396 if (bler < 1e-10)
397 {
398 // close enough to 0% error rate
399 writeFlag = false; // stop writing the plot
400 sinr = m_maxSinrDb; // exit for
401 }
402 else
403 {
404 ret.Add(sinr, bler);
405 }
406 }
407
408 } // end of for (sinr = m_minSinrDb; sinr < m_maxSinrDb; sinr += m_resolutionDb)
409
410 return ret;
411
412} // end of GetGnuplotDataset
413
414Gnuplot
415SatLinkResultsPlot::GetGnuplot(std::string outputName, std::string title)
416{
417 Gnuplot ret(outputName + ".png");
418 ret.SetTitle(title);
419 ret.SetTerminal("png");
420 ret.SetLegend("SINR (in dB)", "BLER");
421 ret.AppendExtra("set key bottom left");
422 ret.AppendExtra("set logscale y 10");
423 ret.AppendExtra("set ytics 10");
424 ret.AppendExtra("set mxtics 5");
425 ret.AppendExtra("set grid xtics mxtics ytics");
426 // TODO probably better if the X axis and its labels are on top and maybe emphasize major grid
427 // lines more than minor ones
428 return ret;
429}
430
431} // end of namespace ns3
432
433int
434main(int argc, char* argv[])
435{
436 ns3::Ptr<ns3::SatLinkResultsPlot> stub;
437 stub = ns3::Create<ns3::SatLinkResultsPlot>();
438 stub->Run();
439
440 return 0;
441}
static Ptr< SatEnvVariables > GetInstance()
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.