src/wifi/model/nist-error-rate-model.cc
changeset 11628 243b71de25a0
parent 11450 9f4ae69f12b7
--- a/src/wifi/model/nist-error-rate-model.cc	Wed Sep 02 16:37:05 2015 -0700
+++ b/src/wifi/model/nist-error-rate-model.cc	Thu Sep 03 22:16:49 2015 +0200
@@ -80,6 +80,14 @@
   NS_LOG_INFO ("64-Qam" << " snr=" << snr << " ber=" << ber);
   return ber;
 }
+double
+NistErrorRateModel::Get256QamBer (double snr) const
+{
+  double z = std::sqrt (snr / (85.0 * 2.0));
+  double ber = 15.0 / 32.0 * 0.5 * erfc (z);
+  NS_LOG_INFO ("256-Qam" << " snr=" << snr << " ber=" << ber);
+  return ber;
+}
 
 double
 NistErrorRateModel::GetFecBpskBer (double snr, uint32_t nbits,
@@ -213,15 +221,31 @@
 }
 
 double
-NistErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
+NistErrorRateModel::GetFec256QamBer (double snr, uint32_t nbits,
+                                     uint32_t bValue) const
+{
+  double ber = Get256QamBer (snr);
+  if (ber == 0.0)
+    {
+      return 1.0;
+    }
+  double pe = CalculatePe (ber, bValue);
+  pe = std::min (pe, 1.0);
+  double pms = std::pow (1 - pe, static_cast<double> (nbits));
+  return pms;
+}
+
+double
+NistErrorRateModel::GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint32_t nbits) const
 {
   if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM
       || mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM
-      || mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_HT
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
     {
-      if (mode.GetConstellationSize () == 2)
+      if (mode.GetConstellationSize (1) == 2)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFecBpskBer (snr,
                                     nbits,
@@ -234,9 +258,9 @@
                                     3); //b value
             }
         }
-      else if (mode.GetConstellationSize () == 4)
+      else if (mode.GetConstellationSize (1) == 4)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFecQpskBer (snr,
                                     nbits,
@@ -249,9 +273,9 @@
                                     3); //b value
             }
         }
-      else if (mode.GetConstellationSize () == 16)
+      else if (mode.GetConstellationSize (1) == 16)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFec16QamBer (snr,
                                      nbits,
@@ -264,15 +288,15 @@
                                      3); //b value
             }
         }
-      else if (mode.GetConstellationSize () == 64)
+      else if (mode.GetConstellationSize (1) == 64)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_2_3)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_2_3)
             {
               return GetFec64QamBer (snr,
                                      nbits,
                                      2); //b value
             }
-          else if (mode.GetCodeRate () == WIFI_CODE_RATE_5_6)
+          else if (mode.GetCodeRate (1) == WIFI_CODE_RATE_5_6)
             {
               return GetFec64QamBer (snr,
                                      nbits,
@@ -285,10 +309,27 @@
                                      3); //b value
             }
         }
+      else if (mode.GetConstellationSize (1) == 256)
+        {
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_5_6)
+            {
+              return GetFec256QamBer (snr,
+                                      nbits,
+                                      5     // b value
+                                      );
+            }
+          else
+            {
+              return GetFec256QamBer (snr,
+                                      nbits,
+                                      3     // b value
+                                      );
+            }
+        }
     }
-  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
+  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS || mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
     {
-      switch (mode.GetDataRate ())
+      switch (mode.GetDataRate (20, 0, 1))
         {
         case 1000000:
           return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr, nbits);
@@ -298,6 +339,8 @@
           return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr, nbits);
         case 11000000:
           return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr, nbits);
+        default:
+          NS_ASSERT ("undefined DSSS/HR-DSSS datarate");
         }
     }
   return 0;