A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
yans-error-rate-model.cc
Go to the documentation of this file.
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
32 {
33  static TypeId tid = TypeId ("ns3::YansErrorRateModel")
35  .AddConstructor<YansErrorRateModel> ()
36  ;
37  return tid;
38 }
39 
41 {
42 }
43 
44 double
45 YansErrorRateModel::Log2 (double val) const
46 {
47  return log (val) / log (2.0);
48 }
49 double
50 YansErrorRateModel::GetBpskBer (double snr, uint32_t signalSpread, uint32_t phyRate) const
51 {
52  double EbNo = snr * signalSpread / phyRate;
53  double z = sqrt (EbNo);
54  double ber = 0.5 * erfc (z);
55  NS_LOG_INFO ("bpsk snr=" << snr << " ber=" << ber);
56  return ber;
57 }
58 double
59 YansErrorRateModel::GetQamBer (double snr, unsigned int m, uint32_t signalSpread, uint32_t phyRate) const
60 {
61  double EbNo = snr * signalSpread / phyRate;
62  double z = sqrt ((1.5 * Log2 (m) * EbNo) / (m - 1.0));
63  double z1 = ((1.0 - 1.0 / sqrt (m)) * erfc (z));
64  double z2 = 1 - pow ((1 - z1), 2.0);
65  double ber = z2 / Log2 (m);
66  NS_LOG_INFO ("Qam m=" << m << " rate=" << phyRate << " snr=" << snr << " ber=" << ber);
67  return ber;
68 }
69 uint32_t
71 {
72  uint32_t fact = 1;
73  while (k > 0)
74  {
75  fact *= k;
76  k--;
77  }
78  return fact;
79 }
80 double
81 YansErrorRateModel::Binomial (uint32_t k, double p, uint32_t n) const
82 {
83  double retval = Factorial (n) / (Factorial (k) * Factorial (n - k)) * pow (p, k) * pow (1 - p, n - k);
84  return retval;
85 }
86 double
87 YansErrorRateModel::CalculatePdOdd (double ber, unsigned int d) const
88 {
89  NS_ASSERT ((d % 2) == 1);
90  unsigned int dstart = (d + 1) / 2;
91  unsigned int dend = d;
92  double pd = 0;
93 
94  for (unsigned int i = dstart; i < dend; i++)
95  {
96  pd += Binomial (i, ber, d);
97  }
98  return pd;
99 }
100 double
101 YansErrorRateModel::CalculatePdEven (double ber, unsigned int d) const
102 {
103  NS_ASSERT ((d % 2) == 0);
104  unsigned int dstart = d / 2 + 1;
105  unsigned int dend = d;
106  double pd = 0;
107 
108  for (unsigned int i = dstart; i < dend; i++)
109  {
110  pd += Binomial (i, ber, d);
111  }
112  pd += 0.5 * Binomial (d / 2, ber, d);
113 
114  return pd;
115 }
116 
117 double
118 YansErrorRateModel::CalculatePd (double ber, unsigned int d) const
119 {
120  double pd;
121  if ((d % 2) == 0)
122  {
123  pd = CalculatePdEven (ber, d);
124  }
125  else
126  {
127  pd = CalculatePdOdd (ber, d);
128  }
129  return pd;
130 }
131 
132 double
133 YansErrorRateModel::GetFecBpskBer (double snr, double nbits,
134  uint32_t signalSpread, uint32_t phyRate,
135  uint32_t dFree, uint32_t adFree) const
136 {
137  double ber = GetBpskBer (snr, signalSpread, phyRate);
138  if (ber == 0.0)
139  {
140  return 1.0;
141  }
142  double pd = CalculatePd (ber, dFree);
143  double pmu = adFree * pd;
144  pmu = std::min (pmu, 1.0);
145  double pms = pow (1 - pmu, nbits);
146  return pms;
147 }
148 
149 double
150 YansErrorRateModel::GetFecQamBer (double snr, uint32_t nbits,
151  uint32_t signalSpread,
152  uint32_t phyRate,
153  uint32_t m, uint32_t dFree,
154  uint32_t adFree, uint32_t adFreePlusOne) const
155 {
156  double ber = GetQamBer (snr, m, signalSpread, phyRate);
157  if (ber == 0.0)
158  {
159  return 1.0;
160  }
161  /* first term */
162  double pd = CalculatePd (ber, dFree);
163  double pmu = adFree * pd;
164  /* second term */
165  pd = CalculatePd (ber, dFree + 1);
166  pmu += adFreePlusOne * pd;
167  pmu = std::min (pmu, 1.0);
168  double pms = pow (1 - pmu, nbits);
169  return pms;
170 }
171 
172 double
173 YansErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
174 {
177  {
178  if (mode.GetConstellationSize () == 2)
179  {
180  if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
181  {
182  return GetFecBpskBer (snr,
183  nbits,
184  mode.GetBandwidth (), // signal spread
185  mode.GetPhyRate (), // phy rate
186  10, // dFree
187  11 // adFree
188  );
189  }
190  else
191  {
192  return GetFecBpskBer (snr,
193  nbits,
194  mode.GetBandwidth (), // signal spread
195  mode.GetPhyRate (), // phy rate
196  5, // dFree
197  8 // adFree
198  );
199  }
200  }
201  else if (mode.GetConstellationSize () == 4)
202  {
203  if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
204  {
205  return GetFecQamBer (snr,
206  nbits,
207  mode.GetBandwidth (), // signal spread
208  mode.GetPhyRate (), // phy rate
209  4, // m
210  10, // dFree
211  11, // adFree
212  0 // adFreePlusOne
213  );
214  }
215  else
216  {
217  return GetFecQamBer (snr,
218  nbits,
219  mode.GetBandwidth (), // signal spread
220  mode.GetPhyRate (), // phy rate
221  4, // m
222  5, // dFree
223  8, // adFree
224  31 // adFreePlusOne
225  );
226  }
227  }
228  else if (mode.GetConstellationSize () == 16)
229  {
230  if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
231  {
232  return GetFecQamBer (snr,
233  nbits,
234  mode.GetBandwidth (), // signal spread
235  mode.GetPhyRate (), // phy rate
236  16, // m
237  10, // dFree
238  11, // adFree
239  0 // adFreePlusOne
240  );
241  }
242  else
243  {
244  return GetFecQamBer (snr,
245  nbits,
246  mode.GetBandwidth (), // signal spread
247  mode.GetPhyRate (), // phy rate
248  16, // m
249  5, // dFree
250  8, // adFree
251  31 // adFreePlusOne
252  );
253  }
254  }
255  else if (mode.GetConstellationSize () == 64)
256  {
257  if (mode.GetCodeRate () == WIFI_CODE_RATE_2_3)
258  {
259  return GetFecQamBer (snr,
260  nbits,
261  mode.GetBandwidth (), // signal spread
262  mode.GetPhyRate (), // phy rate
263  64, // m
264  6, // dFree
265  1, // adFree
266  16 // adFreePlusOne
267  );
268  }
269  else
270  {
271  return GetFecQamBer (snr,
272  nbits,
273  mode.GetBandwidth (), // signal spread
274  mode.GetPhyRate (), // phy rate
275  64, // m
276  5, // dFree
277  8, // adFree
278  31 // adFreePlusOne
279  );
280  }
281  }
282  }
283  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
284  {
285  switch (mode.GetDataRate ())
286  {
287  case 1000000:
289  case 2000000:
291  case 5500000:
293  case 11000000:
295  }
296  }
297  return 0;
298 }
299 
300 } // namespace ns3