View | Details | Raw Unified | Return to bug 2259
Collapse All | Expand All

(-)18a1ad3fbedc (+296 lines)
Added Link Here 
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
 * Copyright (c) 2016 University of Washington
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: Tom Henderson (tomhend@u.washington.edu)
19
 */
20
21
#include <cmath>
22
#include "ns3/test.h"
23
#include "ns3/dsss-error-rate-model.h"
24
#include "ns3/yans-error-rate-model.h"
25
#include "ns3/nist-error-rate-model.h"
26
27
using namespace ns3;
28
29
double
30
FromRss (double rssDbw)
31
{
32
  // SINR is based on receiver noise figure of 7 dB and thermal noise
33
  // of -100.5522786 dBm in this 22 MHz bandwidth at 290K
34
  double noisePowerDbw = -100.5522786 + 7;
35
36
  double sinrDb = rssDbw - noisePowerDbw;
37
  // return SINR expressed as ratio
38
  return pow (10.0, sinrDb / 10.0);
39
}
40
41
class WifiErrorRateModelsTestCaseDsss : public TestCase
42
{
43
public:
44
  WifiErrorRateModelsTestCaseDsss ();
45
  virtual ~WifiErrorRateModelsTestCaseDsss ();
46
47
private:
48
  virtual void DoRun (void);
49
};
50
51
WifiErrorRateModelsTestCaseDsss::WifiErrorRateModelsTestCaseDsss ()
52
  : TestCase ("WifiErrorRateModel test case DSSS")
53
{
54
}
55
56
WifiErrorRateModelsTestCaseDsss::~WifiErrorRateModelsTestCaseDsss ()
57
{
58
}
59
60
void
61
WifiErrorRateModelsTestCaseDsss::DoRun (void)
62
{
63
64
  // 1024 bytes plus headers
65
  uint32_t size = (1024 + 40 + 14) * 8;
66
  // Spot test some values returned from DsssErrorRateModel
67
  // Values taken from sample 80211b.c program used in validation paper
68
  double value;
69
  // DBPSK
70
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-105.0), size);
71
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-13, "Not equal within tolerance");
72
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-100.0), size);
73
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1.5e-13, 1e-13, "Not equal within tolerance");
74
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-99.0), size);
75
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.0003, 0.0001, "Not equal within tolerance");
76
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-98.0), size);
77
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.202, 0.005, "Not equal within tolerance");
78
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-97.0), size);
79
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.813, 0.005, "Not equal within tolerance");
80
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-96.0), size);
81
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.984, 0.005, "Not equal within tolerance");
82
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-95.0), size);
83
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
84
  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-90.0), size);
85
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
86
87
  // DQPSK
88
  //
89
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-96.0), size);
90
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-13, "Not equal within tolerance");
91
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-95.0), size);
92
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 4.5e-6, 1e-6, "Not equal within tolerance");
93
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-94.0), size);
94
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.036, 0.005, "Not equal within tolerance");
95
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-93.0), size);
96
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.519, 0.005, "Not equal within tolerance");
97
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-92.0), size);
98
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.915, 0.005, "Not equal within tolerance");
99
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-91.0), size);
100
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.993, 0.005, "Not equal within tolerance");
101
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-90.0), size);
102
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
103
  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-89.0), size);
104
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
105
106
#ifdef HAVE_GSL
107
  // DQPSK_CCK5.5
108
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-94.0), size);
109
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-13, "Not equal within tolerance");
110
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-93.0), size);
111
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 6.6e-14, 5e-14, "Not equal within tolerance");
112
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-92.0), size);
113
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.0001, 0.00005, "Not equal within tolerance");
114
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-91.0), size);
115
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.132, 0.005, "Not equal within tolerance");
116
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-90.0), size);
117
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.744, 0.005, "Not equal within tolerance");
118
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-89.0), size);
119
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.974, 0.005, "Not equal within tolerance");
120
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-88.0), size);
121
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
122
  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-87.0), size);
123
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
124
125
  // DQPSK_CCK11
126
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-91.0), size);
127
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-14, "Not equal within tolerance");
128
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-90.0), size);
129
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 4.7e-14, 1e-14, "Not equal within tolerance");
130
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-89.0), size);
131
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 8.85e-5, 1e-5, "Not equal within tolerance");
132
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-88.0), size);
133
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.128, 0.005, "Not equal within tolerance");
134
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-87.0), size);
135
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.739, 0.005, "Not equal within tolerance");
136
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-86.0), size);
137
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.973, 0.005, "Not equal within tolerance");
138
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-85.0), size);
139
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
140
  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-84.0), size);
141
  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
142
#endif
143
}
144
145
class WifiErrorRateModelsTestCaseNist : public TestCase
146
{
147
public:
148
  WifiErrorRateModelsTestCaseNist ();
149
  virtual ~WifiErrorRateModelsTestCaseNist ();
150
151
private:
152
  virtual void DoRun (void);
153
};
154
155
WifiErrorRateModelsTestCaseNist::WifiErrorRateModelsTestCaseNist ()
156
  : TestCase ("WifiErrorRateModel test case NIST")
157
{
158
}
159
160
WifiErrorRateModelsTestCaseNist::~WifiErrorRateModelsTestCaseNist ()
161
{
162
}
163
164
void
165
WifiErrorRateModelsTestCaseNist::DoRun (void)
166
{
167
168
  uint32_t FrameSize = 2000;
169
  WifiTxVector txVector;
170
  Ptr<NistErrorRateModel> nist = CreateObject<NistErrorRateModel> ();
171
172
  double ps; // probability of success
173
  double snr; // dB
174
175
  // Spot test some values returned from NistErrorRateModel
176
  // values can be generated by the example program ofdm-validation.cc
177
  snr = 2.5;
178
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
179
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 2.04e-10, 1e-10, "Not equal within tolerance");
180
  snr = 3.0;
181
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
182
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.020, 0.001, "Not equal within tolerance");
183
  snr = 4.0;
184
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
185
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.885, 0.001, "Not equal within tolerance");
186
  snr = 5.0;
187
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
188
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.997, 0.001, "Not equal within tolerance");
189
190
  snr = 6.0;
191
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
192
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.097, 0.001, "Not equal within tolerance");
193
  snr = 7.0;
194
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
195
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.918, 0.001, "Not equal within tolerance");
196
  snr = 8.0;
197
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
198
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.998, 0.001, "Not equal within tolerance");
199
  snr = 9.0;
200
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
201
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
202
203
  snr = 6.0;
204
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
205
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.0174, 0.001, "Not equal within tolerance");
206
  snr = 7.0;
207
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
208
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.881, 0.001, "Not equal within tolerance");
209
  snr = 8.0;
210
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
211
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.997, 0.001, "Not equal within tolerance");
212
  snr = 9.0;
213
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
214
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
215
216
  snr = 8.5;
217
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
218
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 2.85e-6, 1e-6, "Not equal within tolerance");
219
  snr = 9.5;
220
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
221
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.623, 0.001, "Not equal within tolerance");
222
  snr = 10.5;
223
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
224
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.985, 0.001, "Not equal within tolerance");
225
  snr = 11.5;
226
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
227
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
228
229
  snr = 12.0;
230
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
231
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 2.22e-7, 1e-7, "Not equal within tolerance");
232
  snr = 13.0;
233
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
234
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.495, 0.001, "Not equal within tolerance");
235
  snr = 14.0;
236
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
237
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.974, 0.001, "Not equal within tolerance");
238
  snr = 15.0;
239
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
240
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
241
242
  snr = 15.5;
243
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
244
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.012, 0.001, "Not equal within tolerance");
245
  snr = 16.5;
246
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
247
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.818, 0.001, "Not equal within tolerance");
248
  snr = 17.5;
249
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
250
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.993, 0.001, "Not equal within tolerance");
251
  snr = 18.5;
252
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
253
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
254
255
  snr = 20.0;
256
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
257
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 1.3e-4, 1e-4, "Not equal within tolerance");
258
  snr = 21.0;
259
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
260
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.649, 0.001, "Not equal within tolerance");
261
  snr = 22.0;
262
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
263
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.983, 0.001, "Not equal within tolerance");
264
  snr = 23.0;
265
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
266
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
267
268
  snr = 21.0;
269
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
270
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 5.44e-8, 1e-8, "Not equal within tolerance");
271
  snr = 22.0;
272
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
273
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.410, 0.001, "Not equal within tolerance");
274
  snr = 23.0;
275
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
276
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.958, 0.001, "Not equal within tolerance");
277
  snr = 24.0;
278
  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
279
  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
280
}
281
282
class WifiErrorRateModelsTestSuite : public TestSuite
283
{
284
public:
285
  WifiErrorRateModelsTestSuite ();
286
};
287
288
WifiErrorRateModelsTestSuite::WifiErrorRateModelsTestSuite ()
289
  : TestSuite ("wifi-error-rate-models", UNIT)
290
{
291
  AddTestCase (new WifiErrorRateModelsTestCaseDsss, TestCase::QUICK);
292
  AddTestCase (new WifiErrorRateModelsTestCaseNist, TestCase::QUICK);
293
}
294
295
static WifiErrorRateModelsTestSuite wifiErrorRateModelsTestSuite;
296
(-)a/src/wifi/wscript (+1 lines)
 Lines 90-95    Link Here 
90
        'test/power-rate-adaptation-test.cc',
90
        'test/power-rate-adaptation-test.cc',
91
        'test/wifi-test.cc',
91
        'test/wifi-test.cc',
92
        'test/wifi-aggregation-test.cc',
92
        'test/wifi-aggregation-test.cc',
93
        'test/wifi-error-rate-models-test.cc',
93
        ]
94
        ]
94
95
95
    headers = bld(features='ns3header')
96
    headers = bld(features='ns3header')

Return to bug 2259