23 #include "yans-error-rate-model.h"
31 NS_OBJECT_ENSURE_REGISTERED (YansErrorRateModel);
34 YansErrorRateModel::GetTypeId (
void)
36 static TypeId tid = TypeId (
"ns3::YansErrorRateModel")
37 .SetParent<ErrorRateModel> ()
38 .AddConstructor<YansErrorRateModel> ()
43 YansErrorRateModel::YansErrorRateModel ()
48 YansErrorRateModel::Log2 (
double val)
const
50 return std::log (val) / std::log (2.0);
53 YansErrorRateModel::GetBpskBer (
double snr, uint32_t signalSpread, uint32_t phyRate)
const
55 double EbNo = snr * signalSpread / phyRate;
56 double z = std::sqrt (EbNo);
57 double ber = 0.5 * erfc (z);
62 YansErrorRateModel::GetQamBer (
double snr,
unsigned int m, uint32_t signalSpread, uint32_t phyRate)
const
64 double EbNo = snr * signalSpread / phyRate;
65 double z = std::sqrt ((1.5 * Log2 (m) * EbNo) / (m - 1.0));
66 double z1 = ((1.0 - 1.0 / std::sqrt (m)) * erfc (z));
67 double z2 = 1 - std::pow ((1 - z1), 2.0);
68 double ber = z2 / Log2 (m);
69 NS_LOG_INFO (
"Qam m=" << m <<
" rate=" << phyRate <<
" snr=" << snr <<
" ber=" << ber);
73 YansErrorRateModel::Factorial (uint32_t k)
const
84 YansErrorRateModel::Binomial (uint32_t k,
double p, uint32_t n)
const
86 double retval = Factorial (n) / (Factorial (k) * Factorial (n - k)) * std::pow (p, static_cast<double> (k)) * std::pow (1 - p, static_cast<double> (n - k));
90 YansErrorRateModel::CalculatePdOdd (
double ber,
unsigned int d)
const
93 unsigned int dstart = (d + 1) / 2;
94 unsigned int dend = d;
97 for (
unsigned int i = dstart; i < dend; i++)
99 pd += Binomial (i, ber, d);
104 YansErrorRateModel::CalculatePdEven (
double ber,
unsigned int d)
const
107 unsigned int dstart = d / 2 + 1;
108 unsigned int dend = d;
111 for (
unsigned int i = dstart; i < dend; i++)
113 pd += Binomial (i, ber, d);
115 pd += 0.5 * Binomial (d / 2, ber, d);
121 YansErrorRateModel::CalculatePd (
double ber,
unsigned int d)
const
126 pd = CalculatePdEven (ber, d);
130 pd = CalculatePdOdd (ber, d);
136 YansErrorRateModel::GetFecBpskBer (
double snr,
double nbits,
137 uint32_t signalSpread, uint32_t phyRate,
138 uint32_t dFree, uint32_t adFree)
const
140 double ber = GetBpskBer (snr, signalSpread, phyRate);
145 double pd = CalculatePd (ber, dFree);
146 double pmu = adFree * pd;
147 pmu = std::min (pmu, 1.0);
148 double pms = std::pow (1 - pmu, nbits);
153 YansErrorRateModel::GetFecQamBer (
double snr, uint32_t nbits,
154 uint32_t signalSpread,
156 uint32_t m, uint32_t dFree,
157 uint32_t adFree, uint32_t adFreePlusOne)
const
159 double ber = GetQamBer (snr, m, signalSpread, phyRate);
165 double pd = CalculatePd (ber, dFree);
166 double pmu = adFree * pd;
168 pd = CalculatePd (ber, dFree + 1);
169 pmu += adFreePlusOne * pd;
170 pmu = std::min (pmu, 1.0);
171 double pms = std::pow (1 - pmu, static_cast<double> (nbits));
176 YansErrorRateModel::GetChunkSuccessRate (WifiMode mode,
double snr, uint32_t nbits)
const
181 if (mode.GetConstellationSize () == 2)
185 return GetFecBpskBer (snr,
187 mode.GetBandwidth (),
195 return GetFecBpskBer (snr,
197 mode.GetBandwidth (),
204 else if (mode.GetConstellationSize () == 4)
208 return GetFecQamBer (snr,
210 mode.GetBandwidth (),
220 return GetFecQamBer (snr,
222 mode.GetBandwidth (),
231 else if (mode.GetConstellationSize () == 16)
235 return GetFecQamBer (snr,
237 mode.GetBandwidth (),
247 return GetFecQamBer (snr,
249 mode.GetBandwidth (),
258 else if (mode.GetConstellationSize () == 64)
262 return GetFecQamBer (snr,
264 mode.GetBandwidth (),
274 return GetFecQamBer (snr,
276 mode.GetBandwidth (),
288 switch (mode.GetDataRate ())
291 return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr, nbits);
293 return DsssErrorRateModel::GetDsssDqpskSuccessRate (snr, nbits);
295 return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr, nbits);
297 return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr, nbits);
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)