22 #include "nist-error-rate-model.h"
30 NS_OBJECT_ENSURE_REGISTERED (NistErrorRateModel);
33 NistErrorRateModel::GetTypeId (
void)
35 static TypeId tid = TypeId (
"ns3::NistErrorRateModel")
36 .SetParent<ErrorRateModel> ()
37 .AddConstructor<NistErrorRateModel> ()
42 NistErrorRateModel::NistErrorRateModel ()
47 NistErrorRateModel::GetBpskBer (
double snr)
const
49 double z = std::sqrt (snr);
50 double ber = 0.5 * erfc (z);
55 NistErrorRateModel::GetQpskBer (
double snr)
const
57 double z = std::sqrt (snr / 2.0);
58 double ber = 0.5 * erfc (z);
63 NistErrorRateModel::Get16QamBer (
double snr)
const
65 double z = std::sqrt (snr / (5.0 * 2.0));
66 double ber = 0.75 * 0.5 * erfc (z);
67 NS_LOG_INFO (
"16-Qam" <<
" snr=" << snr <<
" ber=" << ber);
71 NistErrorRateModel::Get64QamBer (
double snr)
const
73 double z = std::sqrt (snr / (21.0 * 2.0));
74 double ber = 7.0 / 12.0 * 0.5 * erfc (z);
75 NS_LOG_INFO (
"64-Qam" <<
" snr=" << snr <<
" ber=" << ber);
79 NistErrorRateModel::GetFecBpskBer (
double snr,
double nbits,
80 uint32_t bValue)
const
82 double ber = GetBpskBer (snr);
87 double pe = CalculatePe (ber, bValue);
88 pe = std::min (pe, 1.0);
89 double pms = std::pow (1 - pe, nbits);
93 NistErrorRateModel::GetFecQpskBer (
double snr,
double nbits,
94 uint32_t bValue)
const
96 double ber = GetQpskBer (snr);
101 double pe = CalculatePe (ber, bValue);
102 pe = std::min (pe, 1.0);
103 double pms = std::pow (1 - pe, nbits);
107 NistErrorRateModel::CalculatePe (
double p, uint32_t bValue)
const
109 double D = std::sqrt (4.0 * p * (1.0 - p));
114 pe = 0.5 * ( 36.0 * std::pow (D, 10.0)
115 + 211.0 * std::pow (D, 12.0)
116 + 1404.0 * std::pow (D, 14.0)
117 + 11633.0 * std::pow (D, 16.0)
118 + 77433.0 * std::pow (D, 18.0)
119 + 502690.0 * std::pow (D, 20.0)
120 + 3322763.0 * std::pow (D, 22.0)
121 + 21292910.0 * std::pow (D, 24.0)
122 + 134365911.0 * std::pow (D, 26.0)
125 else if (bValue == 2)
128 pe = 1.0 / (2.0 * bValue) *
129 ( 3.0 * std::pow (D, 6.0)
130 + 70.0 * std::pow (D, 7.0)
131 + 285.0 * std::pow (D, 8.0)
132 + 1276.0 * std::pow (D, 9.0)
133 + 6160.0 * std::pow (D, 10.0)
134 + 27128.0 * std::pow (D, 11.0)
135 + 117019.0 * std::pow (D, 12.0)
136 + 498860.0 * std::pow (D, 13.0)
137 + 2103891.0 * std::pow (D, 14.0)
138 + 8784123.0 * std::pow (D, 15.0)
141 else if (bValue == 3)
144 pe = 1.0 / (2.0 * bValue) *
145 ( 42.0 * std::pow (D, 5.0)
146 + 201.0 * std::pow (D, 6.0)
147 + 1492.0 * std::pow (D, 7.0)
148 + 10469.0 * std::pow (D, 8.0)
149 + 62935.0 * std::pow (D, 9.0)
150 + 379644.0 * std::pow (D, 10.0)
151 + 2253373.0 * std::pow (D, 11.0)
152 + 13073811.0 * std::pow (D, 12.0)
153 + 75152755.0 * std::pow (D, 13.0)
154 + 428005675.0 * std::pow (D, 14.0)
165 NistErrorRateModel::GetFec16QamBer (
double snr, uint32_t nbits,
166 uint32_t bValue)
const
168 double ber = Get16QamBer (snr);
173 double pe = CalculatePe (ber, bValue);
174 pe = std::min (pe, 1.0);
175 double pms = std::pow (1 - pe, static_cast<double> (nbits));
179 NistErrorRateModel::GetFec64QamBer (
double snr, uint32_t nbits,
180 uint32_t bValue)
const
182 double ber = Get64QamBer (snr);
187 double pe = CalculatePe (ber, bValue);
188 pe = std::min (pe, 1.0);
189 double pms = std::pow (1 - pe, static_cast<double> (nbits));
193 NistErrorRateModel::GetChunkSuccessRate (WifiMode mode,
double snr, uint32_t nbits)
const
198 if (mode.GetConstellationSize () == 2)
202 return GetFecBpskBer (snr,
209 return GetFecBpskBer (snr,
215 else if (mode.GetConstellationSize () == 4)
219 return GetFecQpskBer (snr,
226 return GetFecQpskBer (snr,
232 else if (mode.GetConstellationSize () == 16)
236 return GetFec16QamBer (snr,
243 return GetFec16QamBer (snr,
249 else if (mode.GetConstellationSize () == 64)
253 return GetFec64QamBer (snr,
260 return GetFec64QamBer (snr,
269 switch (mode.GetDataRate ())
272 return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr, nbits);
274 return DsssErrorRateModel::GetDsssDqpskSuccessRate (snr, nbits);
276 return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr, nbits);
278 return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr, nbits);
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)