src/devices/wifi/yans-error-rate-model.cc
changeset 4038 c6f634d0fc6f
parent 3905 99c9346b5d71
child 4039 50a070c2750c
equal deleted inserted replaced
4037:a8f42518c058 4038:c6f634d0fc6f
       
     1 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
       
     2 /*
       
     3  * Copyright (c) 2005,2006 INRIA
       
     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: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
       
    19  */
       
    20 #include "yans-error-rate-model.h"
       
    21 #include "wifi-phy.h"
       
    22 #include "ns3/log.h"
       
    23 
       
    24 NS_LOG_COMPONENT_DEFINE ("YansErrorRateModel");
       
    25 
       
    26 namespace ns3 {
       
    27 
       
    28 NS_OBJECT_ENSURE_REGISTERED (YansErrorRateModel);
       
    29 
       
    30 TypeId 
       
    31 YansErrorRateModel::GetTypeId (void)
       
    32 {
       
    33   static TypeId tid = TypeId ("ns3::YansErrorRateModel")
       
    34     .SetParent<ErrorRateModel> ()
       
    35     .AddConstructor<YansErrorRateModel> ()
       
    36     ;
       
    37   return tid;
       
    38 }
       
    39 
       
    40 YansErrorRateModel::YansErrorRateModel ()
       
    41 {}
       
    42 
       
    43 double 
       
    44 YansErrorRateModel::Log2 (double val) const
       
    45 {
       
    46   return log(val) / log(2.0);
       
    47 }
       
    48 double 
       
    49 YansErrorRateModel::GetBpskBer (double snr, uint32_t signalSpread, uint32_t phyRate) const
       
    50 {
       
    51   double EbNo = snr * signalSpread / phyRate;
       
    52   double z = sqrt(EbNo);
       
    53   double ber = 0.5 * erfc(z);
       
    54   NS_LOG_INFO ("bpsk snr="<<snr<<" ber="<<ber);
       
    55   return ber;
       
    56 }
       
    57 double 
       
    58 YansErrorRateModel::GetQamBer (double snr, unsigned int m, uint32_t signalSpread, uint32_t phyRate) const
       
    59 {
       
    60   double EbNo = snr * signalSpread / phyRate;
       
    61   double z = sqrt ((1.5 * Log2 (m) * EbNo) / (m - 1.0));
       
    62   double z1 = ((1.0 - 1.0 / sqrt (m)) * erfc (z)) ;
       
    63   double z2 = 1 - pow ((1-z1), 2.0);
       
    64   double ber = z2 / Log2 (m);
       
    65   NS_LOG_INFO ("Qam m="<<m<<" rate=" << phyRate << " snr="<<snr<<" ber="<<ber);
       
    66   return ber;
       
    67 }
       
    68 uint32_t
       
    69 YansErrorRateModel::Factorial (uint32_t k) const
       
    70 {
       
    71   uint32_t fact = 1;
       
    72   while (k > 0) 
       
    73     {
       
    74       fact *= k;
       
    75       k--;
       
    76     }
       
    77   return fact;
       
    78 }
       
    79 double 
       
    80 YansErrorRateModel::Binomial (uint32_t k, double p, uint32_t n) const
       
    81 {
       
    82   double retval = Factorial (n) / (Factorial (k) * Factorial (n-k)) * pow (p, k) * pow (1-p, n-k);
       
    83   return retval;
       
    84 }
       
    85 double 
       
    86 YansErrorRateModel::CalculatePdOdd (double ber, unsigned int d) const
       
    87 {
       
    88   NS_ASSERT ((d % 2) == 1);
       
    89   unsigned int dstart = (d + 1) / 2;
       
    90   unsigned int dend = d;
       
    91   double pd = 0;
       
    92 
       
    93   for (unsigned int i = dstart; i < dend; i++) 
       
    94     {
       
    95       pd += Binomial (i, ber, d);
       
    96     }
       
    97   return pd;
       
    98 }
       
    99 double 
       
   100 YansErrorRateModel::CalculatePdEven (double ber, unsigned int d) const
       
   101 {
       
   102   NS_ASSERT ((d % 2) == 0);
       
   103   unsigned int dstart = d / 2 + 1;
       
   104   unsigned int dend = d;
       
   105   double pd = 0;
       
   106 
       
   107   for (unsigned int i = dstart; i < dend; i++)
       
   108     {
       
   109       pd +=  Binomial (i, ber, d);
       
   110     }
       
   111   pd += 0.5 * Binomial (d / 2, ber, d);
       
   112 
       
   113   return pd;
       
   114 }
       
   115 
       
   116 double 
       
   117 YansErrorRateModel::CalculatePd (double ber, unsigned int d) const
       
   118 {
       
   119   double pd;
       
   120   if ((d % 2) == 0) 
       
   121     {
       
   122       pd = CalculatePdEven (ber, d);
       
   123     } 
       
   124   else 
       
   125     {
       
   126       pd = CalculatePdOdd (ber, d);
       
   127     }
       
   128   return pd;
       
   129 }
       
   130 
       
   131 double
       
   132 YansErrorRateModel::GetFecBpskBer (double snr, double nbits, 
       
   133                          uint32_t signalSpread, uint32_t phyRate,
       
   134                          uint32_t dFree, uint32_t adFree) const
       
   135 {
       
   136   double ber = GetBpskBer (snr, signalSpread, phyRate);
       
   137   if (ber == 0.0) 
       
   138     {
       
   139       return 1.0;
       
   140     }
       
   141   double pd = CalculatePd (ber, dFree);
       
   142   double pmu = adFree * pd;
       
   143   pmu = std::min (pmu, 1.0);
       
   144   double pms = pow (1 - pmu, nbits);
       
   145   return pms;
       
   146 }
       
   147 
       
   148 double
       
   149 YansErrorRateModel::GetFecQamBer (double snr, uint32_t nbits, 
       
   150                        uint32_t signalSpread,
       
   151                        uint32_t phyRate,
       
   152                        uint32_t m, uint32_t dFree,
       
   153                        uint32_t adFree, uint32_t adFreePlusOne) const
       
   154 {
       
   155   double ber = GetQamBer (snr, m, signalSpread, phyRate);
       
   156   if (ber == 0.0) 
       
   157     {
       
   158       return 1.0;
       
   159     }
       
   160   /* first term */
       
   161   double pd = CalculatePd (ber, dFree);
       
   162   double pmu = adFree * pd;
       
   163   /* second term */
       
   164   pd = CalculatePd (ber, dFree + 1);
       
   165   pmu += adFreePlusOne * pd;
       
   166   pmu = std::min (pmu, 1.0);
       
   167   double pms = pow (1 - pmu, nbits);
       
   168   return pms;
       
   169 }
       
   170 
       
   171 double 
       
   172 YansErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
       
   173 {
       
   174   if (mode == WifiPhy::g_6mba)
       
   175     {
       
   176       return GetFecBpskBer (snr, 
       
   177                             nbits,
       
   178                             mode.GetBandwidth (), // signal spread
       
   179                             mode.GetPhyRate (), // phy rate
       
   180                             10, // dFree
       
   181                             11 // adFree
       
   182                             );      
       
   183     }
       
   184   else if (mode == WifiPhy::g_9mba)
       
   185     {
       
   186       return GetFecBpskBer (snr, 
       
   187                             nbits,
       
   188                             mode.GetBandwidth (), // signal spread
       
   189                             mode.GetPhyRate (), // phy rate
       
   190                             5, // dFree
       
   191                             8 // adFree
       
   192                             );
       
   193     }
       
   194   else if (mode == WifiPhy::g_12mba)
       
   195     {
       
   196       return GetFecQamBer (snr, 
       
   197                            nbits,
       
   198                            mode.GetBandwidth (), // signal spread
       
   199                            mode.GetPhyRate (), // phy rate
       
   200                            4,  // m 
       
   201                            10, // dFree
       
   202                            11, // adFree
       
   203                            0   // adFreePlusOne
       
   204                            );
       
   205     }
       
   206   else if (mode == WifiPhy::g_18mba)
       
   207     {
       
   208       return GetFecQamBer (snr, 
       
   209                            nbits,
       
   210                            mode.GetBandwidth (), // signal spread
       
   211                            mode.GetPhyRate (), // phy rate
       
   212                            4, // m
       
   213                            5, // dFree
       
   214                            8, // adFree
       
   215                            31 // adFreePlusOne
       
   216                            );
       
   217     }
       
   218   else if (mode == WifiPhy::g_24mba)
       
   219     {
       
   220       return GetFecQamBer (snr, 
       
   221                            nbits,
       
   222                            mode.GetBandwidth (), // signal spread
       
   223                            mode.GetPhyRate (), // phy rate
       
   224                            16, // m
       
   225                            10, // dFree
       
   226                            11, // adFree
       
   227                            0   // adFreePlusOne
       
   228                            );
       
   229     }
       
   230   else if (mode == WifiPhy::g_36mba)
       
   231     {
       
   232       return GetFecQamBer (snr, 
       
   233                            nbits,
       
   234                            mode.GetBandwidth (), // signal spread
       
   235                            mode.GetPhyRate (), // phy rate
       
   236                            16, // m
       
   237                            5,  // dFree
       
   238                            8,  // adFree
       
   239                            31  // adFreePlusOne
       
   240                            );
       
   241     }
       
   242   else if (mode == WifiPhy::g_48mba)
       
   243     {
       
   244       return GetFecQamBer (snr, 
       
   245                            nbits,
       
   246                            mode.GetBandwidth (), // signal spread
       
   247                            mode.GetPhyRate (), // phy rate
       
   248                            64, // m
       
   249                            6,  // dFree
       
   250                            1,  // adFree
       
   251                            16  // adFreePlusOne
       
   252                            );
       
   253     }
       
   254   else if (mode == WifiPhy::g_54mba)
       
   255     {
       
   256       return GetFecQamBer (snr, 
       
   257                            nbits,
       
   258                            mode.GetBandwidth (), // signal spread
       
   259                            mode.GetPhyRate (), // phy rate
       
   260                            64, // m
       
   261                            5,  // dFree
       
   262                            8,  // adFree
       
   263                            31  // adFreePlusOne
       
   264                            );
       
   265     }
       
   266   return 0;
       
   267 }
       
   268 
       
   269 } // namespace ns3