24 #include "ns3/fatal-error.h"    25 #include "ns3/wifi-spectrum-value-helper.h"    26 #include "ns3/wifi-standards.h"    27 #include "ns3/wifi-phy-band.h"    77   virtual void DoRun (
void);
    97   NS_ASSERT (maskRefsLeft.size () % 2 == 0 && maskRefsRight.size () % 2 == 0); 
    98   uint16_t freq = 5170 + (bw / 2); 
    99   double refTxPowerW = 1; 
   101   double outerBandMaximumRejection = -40; 
   108       m_actualSpectrum = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
   118       m_actualSpectrum = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
   125           freq = 2402 + (bw / 2); 
   126           outerBandMaximumRejection = -45;
   129       m_actualSpectrum = WifiSpectrumValueHelper::CreateHtOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
   134       NS_ASSERT (bw == 20 || bw == 40 || bw == 80 || bw == 160);
   135       m_actualSpectrum = WifiSpectrumValueHelper::CreateHtOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
   143           freq = 2402 + (bw / 2); 
   144           outerBandMaximumRejection = -45;
   146       NS_ASSERT (bw == 20 || bw == 40 || bw == 80 || bw == 160);
   147       m_actualSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
   157   for (uint32_t i = 0; i < maskRefsLeft.size (); i = i + 2)
   164   for (uint32_t i = 0; i < maskRefsRight.size (); i = i + 2)
   183   if (
start.first == stop.first) 
   186       vect.push_back (
start);
   191   double slope = (stop.second - 
start.second) / (stop.first - 
start.first);
   192   for (uint32_t i = 
start.first; i <= stop.first; i++)
   194       double val = 
start.second + slope * (i - 
start.first);
   195       vect.push_back (std::make_pair (i, val));
   198   NS_ASSERT (vect.back ().first == stop.first
   206   double currentPowerDbr = 0.0; 
   207   double maxPowerW = (*m_actualSpectrum)[0];
   210       maxPowerW = 
std::max (maxPowerW, *vit);
   216       currentPowerDbr = 10.0 * std::log10 ((*
m_actualSpectrum)[it->first] / maxPowerW);
   217       NS_LOG_LOGIC (
"For " << it->first << 
", expected: " << it->second << 
" vs obtained: " << currentPowerDbr);
   219                                  "Spectrum value mismatch for left guard band (" << it->first << 
")");
   224       currentPowerDbr = 10.0 * std::log10 ((*
m_actualSpectrum)[it->first] / maxPowerW);
   225       NS_LOG_LOGIC (
"For " << it->first << 
", expected: " << it->second << 
" vs obtained: " << currentPowerDbr);
   227                                  "Spectrum value mismatch for right guard band (" << it->first << 
")");
   254   NS_LOG_INFO (
"Creating WifiTransmitMaskTestSuite");
   263   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   264   maskSlopesLeft.push_back (std::make_pair (31, -28.375)); 
   265   maskSlopesLeft.push_back (std::make_pair (32, -28.000)); 
   266   maskSlopesLeft.push_back (std::make_pair (60, -20.276)); 
   267   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   268   maskSlopesLeft.push_back (std::make_pair (63, -20.0)); 
   269   maskSlopesLeft.push_back (std::make_pair (64, -20.0)); 
   270   maskSlopesLeft.push_back (std::make_pair (69, -3.333)); 
   271   maskSlopesRight.push_back (std::make_pair (123, -3.333)); 
   272   maskSlopesRight.push_back (std::make_pair (128, -20.0)); 
   273   maskSlopesRight.push_back (std::make_pair (129, -20.0)); 
   274   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   275   maskSlopesRight.push_back (std::make_pair (132, -20.276)); 
   276   maskSlopesRight.push_back (std::make_pair (160, -28.000)); 
   277   maskSlopesRight.push_back (std::make_pair (161, -28.375)); 
   278   maskSlopesRight.push_back (std::make_pair (192, -40.0)); 
   280                                                5, maskSlopesLeft, maskSlopesRight, tol),
   285   maskSlopesLeft.clear ();
   286   maskSlopesRight.clear ();
   287   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   288   maskSlopesLeft.push_back (std::make_pair (31, -28.375)); 
   289   maskSlopesLeft.push_back (std::make_pair (32, -28.000)); 
   290   maskSlopesLeft.push_back (std::make_pair (60, -20.276)); 
   291   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   292   maskSlopesLeft.push_back (std::make_pair (63, -20.0)); 
   293   maskSlopesLeft.push_back (std::make_pair (64, -20.0)); 
   294   maskSlopesLeft.push_back (std::make_pair (69, -3.333)); 
   295   maskSlopesRight.push_back (std::make_pair (123, -3.333)); 
   296   maskSlopesRight.push_back (std::make_pair (128, -20.0)); 
   297   maskSlopesRight.push_back (std::make_pair (129, -20.0)); 
   298   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   299   maskSlopesRight.push_back (std::make_pair (132, -20.276)); 
   300   maskSlopesRight.push_back (std::make_pair (160, -28.000)); 
   301   maskSlopesRight.push_back (std::make_pair (161, -28.375)); 
   302   maskSlopesRight.push_back (std::make_pair (192, -40.0)); 
   304                                                10, maskSlopesLeft, maskSlopesRight, tol),
   311   maskSlopesLeft.clear ();
   312   maskSlopesRight.clear ();
   313   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   314   maskSlopesLeft.push_back (std::make_pair (31, -28.375)); 
   315   maskSlopesLeft.push_back (std::make_pair (32, -28.000)); 
   316   maskSlopesLeft.push_back (std::make_pair (60, -20.276)); 
   317   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   318   maskSlopesLeft.push_back (std::make_pair (63, -20.0)); 
   319   maskSlopesLeft.push_back (std::make_pair (64, -20.0)); 
   320   maskSlopesLeft.push_back (std::make_pair (69, -3.333)); 
   321   maskSlopesRight.push_back (std::make_pair (123, -3.333)); 
   322   maskSlopesRight.push_back (std::make_pair (128, -20.0)); 
   323   maskSlopesRight.push_back (std::make_pair (129, -20.0)); 
   324   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   325   maskSlopesRight.push_back (std::make_pair (132, -20.276)); 
   326   maskSlopesRight.push_back (std::make_pair (160, -28.000)); 
   327   maskSlopesRight.push_back (std::make_pair (161, -28.375)); 
   328   maskSlopesRight.push_back (std::make_pair (192, -40.0)); 
   330                                                20, maskSlopesLeft, maskSlopesRight, tol),
   337                                                20, maskSlopesLeft, maskSlopesRight, tol),
   344                                                20, maskSlopesLeft, maskSlopesRight, tol),
   351   maskSlopesLeft.clear ();
   352   maskSlopesRight.clear ();
   353   maskSlopesLeft.push_back (std::make_pair (0, -45.000)); 
   354   maskSlopesLeft.push_back (std::make_pair (31, -28.531)); 
   355   maskSlopesLeft.push_back (std::make_pair (32, -28.000)); 
   356   maskSlopesLeft.push_back (std::make_pair (60, -20.276)); 
   357   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   358   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   359   maskSlopesLeft.push_back (std::make_pair (62, -20.0)); 
   360   maskSlopesLeft.push_back (std::make_pair (67, -3.333)); 
   361   maskSlopesRight.push_back (std::make_pair (125, -3.333)); 
   362   maskSlopesRight.push_back (std::make_pair (130, -20.0)); 
   363   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   364   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   365   maskSlopesRight.push_back (std::make_pair (132, -20.276)); 
   366   maskSlopesRight.push_back (std::make_pair (160, -28.000)); 
   367   maskSlopesRight.push_back (std::make_pair (161, -28.531)); 
   368   maskSlopesRight.push_back (std::make_pair (192, -45.000)); 
   370                                                20, maskSlopesLeft, maskSlopesRight, tol),
   375   maskSlopesLeft.clear ();
   376   maskSlopesRight.clear ();
   377   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   378   maskSlopesLeft.push_back (std::make_pair (31, -28.375)); 
   379   maskSlopesLeft.push_back (std::make_pair (32, -28.000)); 
   380   maskSlopesLeft.push_back (std::make_pair (60, -20.276)); 
   381   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   382   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   383   maskSlopesLeft.push_back (std::make_pair (62, -20.0)); 
   384   maskSlopesLeft.push_back (std::make_pair (67, -3.333)); 
   385   maskSlopesRight.push_back (std::make_pair (125, -3.333)); 
   386   maskSlopesRight.push_back (std::make_pair (130, -20.0)); 
   387   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   388   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   389   maskSlopesRight.push_back (std::make_pair (132, -20.276)); 
   390   maskSlopesRight.push_back (std::make_pair (160, -28.000)); 
   391   maskSlopesRight.push_back (std::make_pair (161, -28.375)); 
   392   maskSlopesRight.push_back (std::make_pair (192, -40.0)); 
   394                                                20, maskSlopesLeft, maskSlopesRight, tol),
   399   maskSlopesLeft.clear ();
   400   maskSlopesRight.clear ();
   401   maskSlopesLeft.push_back (std::make_pair (0, -45.000)); 
   402   maskSlopesLeft.push_back (std::make_pair (63, -28.266)); 
   403   maskSlopesLeft.push_back (std::make_pair (64, -28.000)); 
   404   maskSlopesLeft.push_back (std::make_pair (124, -20.131)); 
   405   maskSlopesLeft.push_back (std::make_pair (125, -20.0)); 
   406   maskSlopesLeft.push_back (std::make_pair (125, -20.0)); 
   407   maskSlopesLeft.push_back (std::make_pair (126, -20.0)); 
   408   maskSlopesLeft.push_back (std::make_pair (131, -3.333)); 
   409   maskSlopesRight.push_back (std::make_pair (253, -3.333)); 
   410   maskSlopesRight.push_back (std::make_pair (258, -20.0)); 
   411   maskSlopesRight.push_back (std::make_pair (259, -20.0)); 
   412   maskSlopesRight.push_back (std::make_pair (259, -20.0)); 
   413   maskSlopesRight.push_back (std::make_pair (260, -20.131)); 
   414   maskSlopesRight.push_back (std::make_pair (320, -28.000)); 
   415   maskSlopesRight.push_back (std::make_pair (321, -28.266)); 
   416   maskSlopesRight.push_back (std::make_pair (384, -45.000)); 
   418                                                40, maskSlopesLeft, maskSlopesRight, tol),
   423   maskSlopesLeft.clear ();
   424   maskSlopesRight.clear ();
   425   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   426   maskSlopesLeft.push_back (std::make_pair (63, -28.188)); 
   427   maskSlopesLeft.push_back (std::make_pair (64, -28.000)); 
   428   maskSlopesLeft.push_back (std::make_pair (124, -20.131)); 
   429   maskSlopesLeft.push_back (std::make_pair (125, -20.0)); 
   430   maskSlopesLeft.push_back (std::make_pair (125, -20.0)); 
   431   maskSlopesLeft.push_back (std::make_pair (126, -20.0)); 
   432   maskSlopesLeft.push_back (std::make_pair (131, -3.333)); 
   433   maskSlopesRight.push_back (std::make_pair (253, -3.333)); 
   434   maskSlopesRight.push_back (std::make_pair (258, -20.0)); 
   435   maskSlopesRight.push_back (std::make_pair (259, -20.0)); 
   436   maskSlopesRight.push_back (std::make_pair (259, -20.0)); 
   437   maskSlopesRight.push_back (std::make_pair (260, -20.131)); 
   438   maskSlopesRight.push_back (std::make_pair (320, -28.000)); 
   439   maskSlopesRight.push_back (std::make_pair (321, -28.188)); 
   440   maskSlopesRight.push_back (std::make_pair (384, -40.0)); 
   442                                                40, maskSlopesLeft, maskSlopesRight, tol),
   449   maskSlopesLeft.clear ();
   450   maskSlopesRight.clear ();
   451   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   452   maskSlopesLeft.push_back (std::make_pair (31, -28.375)); 
   453   maskSlopesLeft.push_back (std::make_pair (32, -28.000)); 
   454   maskSlopesLeft.push_back (std::make_pair (60, -20.276)); 
   455   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   456   maskSlopesLeft.push_back (std::make_pair (61, -20.0)); 
   457   maskSlopesLeft.push_back (std::make_pair (62, -20.0)); 
   458   maskSlopesLeft.push_back (std::make_pair (67, -3.333)); 
   459   maskSlopesRight.push_back (std::make_pair (125, -3.333)); 
   460   maskSlopesRight.push_back (std::make_pair (130, -20.0)); 
   461   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   462   maskSlopesRight.push_back (std::make_pair (131, -20.0)); 
   463   maskSlopesRight.push_back (std::make_pair (132, -20.276)); 
   464   maskSlopesRight.push_back (std::make_pair (160, -28.000)); 
   465   maskSlopesRight.push_back (std::make_pair (161, -28.375)); 
   466   maskSlopesRight.push_back (std::make_pair (192, -40.0)); 
   468                                                20, maskSlopesLeft, maskSlopesRight, tol),
   473   maskSlopesLeft.clear ();
   474   maskSlopesRight.clear ();
   475   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   476   maskSlopesLeft.push_back (std::make_pair (63, -28.188)); 
   477   maskSlopesLeft.push_back (std::make_pair (64, -28.000)); 
   478   maskSlopesLeft.push_back (std::make_pair (124, -20.131)); 
   479   maskSlopesLeft.push_back (std::make_pair (125, -20.0)); 
   480   maskSlopesLeft.push_back (std::make_pair (125, -20.0)); 
   481   maskSlopesLeft.push_back (std::make_pair (126, -20.0)); 
   482   maskSlopesLeft.push_back (std::make_pair (131, -3.333)); 
   483   maskSlopesRight.push_back (std::make_pair (253, -3.333)); 
   484   maskSlopesRight.push_back (std::make_pair (258, -20.0)); 
   485   maskSlopesRight.push_back (std::make_pair (259, -20.0)); 
   486   maskSlopesRight.push_back (std::make_pair (259, -20.0)); 
   487   maskSlopesRight.push_back (std::make_pair (260, -20.131)); 
   488   maskSlopesRight.push_back (std::make_pair (320, -28.000)); 
   489   maskSlopesRight.push_back (std::make_pair (321, -28.188)); 
   490   maskSlopesRight.push_back (std::make_pair (384, -40.0)); 
   492                                                40, maskSlopesLeft, maskSlopesRight, tol),
   497   maskSlopesLeft.clear ();
   498   maskSlopesRight.clear ();
   499   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   500   maskSlopesLeft.push_back (std::make_pair (127, -28.094)); 
   501   maskSlopesLeft.push_back (std::make_pair (128, -28.000)); 
   502   maskSlopesLeft.push_back (std::make_pair (252, -20.064)); 
   503   maskSlopesLeft.push_back (std::make_pair (253, -20.0)); 
   504   maskSlopesLeft.push_back (std::make_pair (253, -20.0)); 
   505   maskSlopesLeft.push_back (std::make_pair (254, -20.0)); 
   506   maskSlopesLeft.push_back (std::make_pair (259, -3.333)); 
   507   maskSlopesRight.push_back (std::make_pair (509, -3.333)); 
   508   maskSlopesRight.push_back (std::make_pair (514, -20.0)); 
   509   maskSlopesRight.push_back (std::make_pair (515, -20.0)); 
   510   maskSlopesRight.push_back (std::make_pair (515, -20.0)); 
   511   maskSlopesRight.push_back (std::make_pair (516, -20.064)); 
   512   maskSlopesRight.push_back (std::make_pair (640, -28.000)); 
   513   maskSlopesRight.push_back (std::make_pair (641, -28.094)); 
   514   maskSlopesRight.push_back (std::make_pair (768, -40.0)); 
   516                                                80, maskSlopesLeft, maskSlopesRight, tol),
   521   maskSlopesLeft.clear ();
   522   maskSlopesRight.clear ();
   523   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   524   maskSlopesLeft.push_back (std::make_pair (255, -28.047)); 
   525   maskSlopesLeft.push_back (std::make_pair (256, -28.000)); 
   526   maskSlopesLeft.push_back (std::make_pair (508, -20.032)); 
   527   maskSlopesLeft.push_back (std::make_pair (509, -20.0)); 
   528   maskSlopesLeft.push_back (std::make_pair (509, -20.0)); 
   529   maskSlopesLeft.push_back (std::make_pair (510, -20.0)); 
   530   maskSlopesLeft.push_back (std::make_pair (515, -3.333)); 
   531   maskSlopesRight.push_back (std::make_pair (1021, -3.333)); 
   532   maskSlopesRight.push_back (std::make_pair (1026, -20.0)); 
   533   maskSlopesRight.push_back (std::make_pair (1027, -20.0)); 
   534   maskSlopesRight.push_back (std::make_pair (1027, -20.0)); 
   535   maskSlopesRight.push_back (std::make_pair (1028, -20.032)); 
   536   maskSlopesRight.push_back (std::make_pair (1280, -28.000)); 
   537   maskSlopesRight.push_back (std::make_pair (1281, -28.047)); 
   538   maskSlopesRight.push_back (std::make_pair (1536, -40.0)); 
   540                                                160, maskSlopesLeft, maskSlopesRight, tol),
   547   maskSlopesLeft.clear ();
   548   maskSlopesRight.clear ();
   549   maskSlopesLeft.push_back (std::make_pair (0, -45.000)); 
   550   maskSlopesLeft.push_back (std::make_pair (127, -28.133)); 
   551   maskSlopesLeft.push_back (std::make_pair (128, -28.000)); 
   552   maskSlopesLeft.push_back (std::make_pair (252, -20.064)); 
   553   maskSlopesLeft.push_back (std::make_pair (253, -20.0)); 
   554   maskSlopesLeft.push_back (std::make_pair (255, -20.0)); 
   555   maskSlopesLeft.push_back (std::make_pair (256, -20.0)); 
   556   maskSlopesLeft.push_back (std::make_pair (261, -3.333)); 
   557   maskSlopesRight.push_back (std::make_pair (507, -3.333)); 
   558   maskSlopesRight.push_back (std::make_pair (512, -20.0)); 
   559   maskSlopesRight.push_back (std::make_pair (513, -20.0)); 
   560   maskSlopesRight.push_back (std::make_pair (515, -20.0)); 
   561   maskSlopesRight.push_back (std::make_pair (516, -20.064)); 
   562   maskSlopesRight.push_back (std::make_pair (640, -28.000)); 
   563   maskSlopesRight.push_back (std::make_pair (641, -28.133)); 
   564   maskSlopesRight.push_back (std::make_pair (768, -45.000)); 
   566                                                20, maskSlopesLeft, maskSlopesRight, tol),
   571   maskSlopesLeft.clear ();
   572   maskSlopesRight.clear ();
   573   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   574   maskSlopesLeft.push_back (std::make_pair (127, -28.094)); 
   575   maskSlopesLeft.push_back (std::make_pair (128, -28.000)); 
   576   maskSlopesLeft.push_back (std::make_pair (252, -20.064)); 
   577   maskSlopesLeft.push_back (std::make_pair (253, -20.0)); 
   578   maskSlopesLeft.push_back (std::make_pair (255, -20.0)); 
   579   maskSlopesLeft.push_back (std::make_pair (256, -20.0)); 
   580   maskSlopesLeft.push_back (std::make_pair (261, -3.333)); 
   581   maskSlopesRight.push_back (std::make_pair (507, -3.333)); 
   582   maskSlopesRight.push_back (std::make_pair (512, -20.0)); 
   583   maskSlopesRight.push_back (std::make_pair (513, -20.0)); 
   584   maskSlopesRight.push_back (std::make_pair (515, -20.0)); 
   585   maskSlopesRight.push_back (std::make_pair (516, -20.064)); 
   586   maskSlopesRight.push_back (std::make_pair (640, -28.000)); 
   587   maskSlopesRight.push_back (std::make_pair (641, -28.094)); 
   588   maskSlopesRight.push_back (std::make_pair (768, -40.0)); 
   590                                                20, maskSlopesLeft, maskSlopesRight, tol),
   595   maskSlopesLeft.clear ();
   596   maskSlopesRight.clear ();
   597   maskSlopesLeft.push_back (std::make_pair (0, -45.000)); 
   598   maskSlopesLeft.push_back (std::make_pair (255, -28.066)); 
   599   maskSlopesLeft.push_back (std::make_pair (256, -28.000)); 
   600   maskSlopesLeft.push_back (std::make_pair (505, -20.032)); 
   601   maskSlopesLeft.push_back (std::make_pair (506, -20.0)); 
   602   maskSlopesLeft.push_back (std::make_pair (510, -20.0)); 
   603   maskSlopesLeft.push_back (std::make_pair (511, -20.0)); 
   604   maskSlopesLeft.push_back (std::make_pair (523, -1.538)); 
   605   maskSlopesRight.push_back (std::make_pair (1013, -1.538)); 
   606   maskSlopesRight.push_back (std::make_pair (1025, -20.0)); 
   607   maskSlopesRight.push_back (std::make_pair (1026, -20.0)); 
   608   maskSlopesRight.push_back (std::make_pair (1030, -20.0)); 
   609   maskSlopesRight.push_back (std::make_pair (1031, -20.032)); 
   610   maskSlopesRight.push_back (std::make_pair (1280, -28.000)); 
   611   maskSlopesRight.push_back (std::make_pair (1281, -28.066)); 
   612   maskSlopesRight.push_back (std::make_pair (1536, -45.000)); 
   614                                                40, maskSlopesLeft, maskSlopesRight, tol),
   619   maskSlopesLeft.clear ();
   620   maskSlopesRight.clear ();
   621   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   622   maskSlopesLeft.push_back (std::make_pair (255, -28.047)); 
   623   maskSlopesLeft.push_back (std::make_pair (256, -28.000)); 
   624   maskSlopesLeft.push_back (std::make_pair (505, -20.032)); 
   625   maskSlopesLeft.push_back (std::make_pair (506, -20.0)); 
   626   maskSlopesLeft.push_back (std::make_pair (510, -20.0)); 
   627   maskSlopesLeft.push_back (std::make_pair (511, -20.0)); 
   628   maskSlopesLeft.push_back (std::make_pair (523, -1.538)); 
   629   maskSlopesRight.push_back (std::make_pair (1013, -1.538)); 
   630   maskSlopesRight.push_back (std::make_pair (1025, -20.0)); 
   631   maskSlopesRight.push_back (std::make_pair (1026, -20.0)); 
   632   maskSlopesRight.push_back (std::make_pair (1030, -20.0)); 
   633   maskSlopesRight.push_back (std::make_pair (1031, -20.032)); 
   634   maskSlopesRight.push_back (std::make_pair (1280, -28.000)); 
   635   maskSlopesRight.push_back (std::make_pair (1281, -28.047)); 
   636   maskSlopesRight.push_back (std::make_pair (1536, -40.0)); 
   638                                                40, maskSlopesLeft, maskSlopesRight, tol),
   643   maskSlopesLeft.clear ();
   644   maskSlopesRight.clear ();
   645   maskSlopesLeft.push_back (std::make_pair (0, -45.000)); 
   646   maskSlopesLeft.push_back (std::make_pair (511, -28.033)); 
   647   maskSlopesLeft.push_back (std::make_pair (512, -28.000)); 
   648   maskSlopesLeft.push_back (std::make_pair (1017, -20.016)); 
   649   maskSlopesLeft.push_back (std::make_pair (1018, -20.0)); 
   650   maskSlopesLeft.push_back (std::make_pair (1022, -20.0)); 
   651   maskSlopesLeft.push_back (std::make_pair (1023, -20.0)); 
   652   maskSlopesLeft.push_back (std::make_pair (1035, -1.538)); 
   653   maskSlopesRight.push_back (std::make_pair (2037, -1.538)); 
   654   maskSlopesRight.push_back (std::make_pair (2049, -20.0)); 
   655   maskSlopesRight.push_back (std::make_pair (2050, -20.0)); 
   656   maskSlopesRight.push_back (std::make_pair (2054, -20.0)); 
   657   maskSlopesRight.push_back (std::make_pair (2055, -20.016)); 
   658   maskSlopesRight.push_back (std::make_pair (2560, -28.000)); 
   659   maskSlopesRight.push_back (std::make_pair (2561, -28.033)); 
   660   maskSlopesRight.push_back (std::make_pair (3072, -45.000)); 
   662                                                80, maskSlopesLeft, maskSlopesRight, tol),
   667   maskSlopesLeft.clear ();
   668   maskSlopesRight.clear ();
   669   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   670   maskSlopesLeft.push_back (std::make_pair (511, -28.023)); 
   671   maskSlopesLeft.push_back (std::make_pair (512, -28.000)); 
   672   maskSlopesLeft.push_back (std::make_pair (1017, -20.016)); 
   673   maskSlopesLeft.push_back (std::make_pair (1018, -20.0)); 
   674   maskSlopesLeft.push_back (std::make_pair (1022, -20.0)); 
   675   maskSlopesLeft.push_back (std::make_pair (1023, -20.0)); 
   676   maskSlopesLeft.push_back (std::make_pair (1035, -1.538)); 
   677   maskSlopesRight.push_back (std::make_pair (2037, -1.538)); 
   678   maskSlopesRight.push_back (std::make_pair (2049, -20.0)); 
   679   maskSlopesRight.push_back (std::make_pair (2050, -20.0)); 
   680   maskSlopesRight.push_back (std::make_pair (2054, -20.0)); 
   681   maskSlopesRight.push_back (std::make_pair (2055, -20.016)); 
   682   maskSlopesRight.push_back (std::make_pair (2560, -28.000)); 
   683   maskSlopesRight.push_back (std::make_pair (2561, -28.023)); 
   684   maskSlopesRight.push_back (std::make_pair (3072, -40.0)); 
   686                                                80, maskSlopesLeft, maskSlopesRight, tol),
   693   maskSlopesLeft.clear ();
   694   maskSlopesRight.clear ();
   695   maskSlopesLeft.push_back (std::make_pair (0, -40.0)); 
   696   maskSlopesLeft.push_back (std::make_pair (1023, -28.012)); 
   697   maskSlopesLeft.push_back (std::make_pair (1024, -28.000)); 
   698   maskSlopesLeft.push_back (std::make_pair (2041, -20.008)); 
   699   maskSlopesLeft.push_back (std::make_pair (2042, -20.0)); 
   700   maskSlopesLeft.push_back (std::make_pair (2046, -20.0)); 
   701   maskSlopesLeft.push_back (std::make_pair (2047, -20.0)); 
   702   maskSlopesLeft.push_back (std::make_pair (2059, -1.538)); 
   703   maskSlopesRight.push_back (std::make_pair (4085, -1.538)); 
   704   maskSlopesRight.push_back (std::make_pair (4097, -20.0)); 
   705   maskSlopesRight.push_back (std::make_pair (4098, -20.0)); 
   706   maskSlopesRight.push_back (std::make_pair (4102, -20.0)); 
   707   maskSlopesRight.push_back (std::make_pair (4103, -20.008)); 
   708   maskSlopesRight.push_back (std::make_pair (5120, -28.000)); 
   709   maskSlopesRight.push_back (std::make_pair (5121, -28.012)); 
   710   maskSlopesRight.push_back (std::make_pair (6144, -40.0)); 
   712                                                160, maskSlopesLeft, maskSlopesRight, tol),
 ERP-OFDM PHY (Clause 19, Section 19.5) 
Ptr< SpectrumValue > m_actualSpectrum
actual spectrum value 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Test suite for checking the consistency of different OFDM-based transmit masks. 
IndexPowerVect m_expectedLeftPsd
expected power values for left guard bandwidth 
double m_tolerance
tolerance (in dB) 
Test checks if Wifi spectrum values for OFDM are generated properly. 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
std::pair< uint32_t, double > IndexPowerPair
typedef for a pair of sub-band index and relative power value (dBr) 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
Values::const_iterator ConstValuesBegin() const
static void InterpolateAndAppendValues(IndexPowerVect &vect, IndexPowerPair start, IndexPowerPair stop, double tol)
Interpolate PSD values for indexes between provided start and stop and append to provided vector...
WifiPhyStandard
Identifies the PHY specification that a Wifi device is configured to use. 
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite. 
bool TestDoubleIsEqual(const double x1, const double x2, const double epsilon)
Compare two double precision floating point numbers and declare them equal if they are within some ep...
OFDM PHY (Clause 17 - amendment for 10 MHz and 5 MHz channels) 
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC. 
#define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report if ...
IndexPowerVect m_expectedRightPsd
expected power values for right guard bandwidth 
WifiOfdmMaskSlopesTestCase(const char *str, WifiPhyStandard standard, WifiPhyBand band, uint8_t bw, IndexPowerVect maskRefsLeft, IndexPowerVect maskRefsRight, double tol)
Constructor. 
This is intended to be the configuration used in this paper: Gavin Holland, Nitin Vaidya and Paramvir...
virtual ~WifiOfdmMaskSlopesTestCase()
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
Values::const_iterator ConstValuesEnd() const
WifiTransmitMaskTestSuite()
std::vector< IndexPowerPair > IndexPowerVect
typedef for a vector of pairs of sub-band index and relative power value (dBr) 
WifiPhyBand
Identifies the PHY band. 
static WifiTransmitMaskTestSuite g_WifiTransmitMaskTestSuite
virtual void DoRun(void)
Implementation to actually run this TestCase.