A Discrete-Event Network Simulator
API
80211b.c
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2010 The Boeing Company
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: Gary Pei <guangyu.pei@boeing.com>
19 */
20
21/*
22 * This program is used to generate plots found in the paper
23 * G. Pei and Tom Henderson, "Validation of ns-3 802.11b PHY model",
24 * available online at http://www.nsnam.org/~pei/80211b.pdf
25 *
26 * It can be compiled as a C program and relies on a library installation of
27 * the GNU Scientific Library (gsl). To compile:
28 * gcc 80211b.c -o 80211b -lm -lgsl -lgslcblas
29 *
30 * The executable output should be redirected into a text file 80211b.txt
31 * ./80211b > 80211b.txt
32 *
33 * Then gnuplot can load the associated plot file which references 80211b.txt:
34 * gnuplot 80211b.plt
35 */
36
37#include <gsl/gsl_math.h>
38#include <gsl/gsl_integration.h>
39#include <gsl/gsl_cdf.h>
40#include <gsl/gsl_sf_bessel.h>
41
42#define min(a,b) ((a) < (b) ? (a) : (b))
43#define max(a,b) ((a) > (b) ? (a) : (b))
44#define WLAN_SIR_perfect 10.0 // if SIR > 10dB, perfect reception
45#define WLAN_SIR_impossible 0.1 // if SIR < -10dB, impossible to receive
46
59typedef struct fn_parameter_t
60{
61 double beta;
62 double n;
64
65double QFunction (double x)
66{
67 return 0.5 * erfc (x / sqrt (2.0));
68}
69
70double f (double x, void * params)
71{
72 double beta = ((fn_parameters *) params)->beta;
73 double n = ((fn_parameters *) params)->n;
74 double f = pow ( 2 * gsl_cdf_ugaussian_P (x + beta) - 1, n - 1) * exp (-x * x / 2.0) / sqrt (2.0 * M_PI);
75 return f;
76}
77
78double p_e2 (double e2)
79{
80 double sep;
81 double error;
82 fn_parameters params;
83 params.beta = sqrt (2.0 * e2);
84 params.n = 8.0;
85 gsl_integration_workspace* w = gsl_integration_workspace_alloc (1000);
86 gsl_function F;
87 F.function = &f;
88 F.params = &params;
89 gsl_integration_qagiu (&F, -params.beta, 0, 1e-7, 1000, w, &sep, &error);
90 gsl_integration_workspace_free (w);
91 if (error == 0.0)
92 {
93 sep = 1.0;
94 }
95 return 1.0 - sep;
96}
97
98double p_e1 (double e1)
99{
100 return 1.0 - pow ( 1.0 - p_e2 (e1 / 2.0), 2.0);
101}
102
103double DbToNoneDb (double x)
104{
105 return pow (10.0, x / 10.0);
106}
107
108double NoneDbToDb (double x)
109{
110 return 10.0 * log10 (x);
111}
112
113double DQPSKFunction (double x)
114{
115 double pi = acos (-1.0);
116 return ( (sqrt (2.0) + 1.0) / sqrt (8.0 * pi * sqrt (2.0))) * (1.0 / sqrt (x)) * exp ( -(2.0 - sqrt (2.0)) * x);
117}
118
119double Get80211bDsssDbpskBerIeee (double EcNc)
120{
121 double ber;
122 if (EcNc > WLAN_SIR_perfect)
123 {
124 ber = 0;
125 }
126 else if (EcNc < WLAN_SIR_impossible)
127 {
128 ber = 0.5;
129 }
130 else
131 {
132 ber = min (QFunction (sqrt (11.0 * EcNc)),0.5);
133 }
134 return ber;
135}
136
137double Get80211bDsssDbpskBer (double sinr)
138{
139 double EbN0 = sinr * 22000000.0 / 1000000.0;
140 double ber = 0.5 * exp (-EbN0);
141 return ber;
142}
143
144double Get80211bDsssDqpskBerIeee (double EcNc)
145{
146 double ber;
147 if (EcNc > WLAN_SIR_perfect)
148 {
149 ber = 0;
150 }
151 else if (EcNc < WLAN_SIR_impossible)
152 {
153 ber = 0.5;
154 }
155 else
156 {
157 ber = min (QFunction (sqrt (5.5 * EcNc)),0.5);
158 }
159 return ber;
160}
161
162double Get80211bDsssDqpskBer (double sinr)
163{
164// 2 bits per symbol, 1 MSPS
165 double EbN0 = sinr * 22000000.0 / 1000000.0 / 2.0;
166 double ber = DQPSKFunction (EbN0);
167 return ber;
168}
169
171{
172 double ber;
173 if (EcNc > WLAN_SIR_perfect)
174 {
175 ber = 0.0;
176 }
177 else if (EcNc < WLAN_SIR_impossible)
178 {
179 ber = 0.5;
180 }
181 else
182 {
183 double pew = 14.0 * QFunction (sqrt (EcNc * 8.0)) + QFunction (sqrt (EcNc * 16.0));
184 pew = min (pew, 0.99999);
185 ber = 8.0 / 15.0 * pew;
186 }
187 return ber;
188}
189
191{
192 double ber;
193 if (EcNc > WLAN_SIR_perfect)
194 {
195 ber = 0.0;
196 }
197 else if (EcNc < WLAN_SIR_impossible)
198 {
199 ber = 0.5;
200 }
201 else
202 {
203 double pew = 24.0 * QFunction (sqrt (EcNc * 4.0)) + 16.0 * QFunction (sqrt (EcNc * 6.0)) + 174.0 * QFunction (sqrt (EcNc * 8.0)) + 16.0 * QFunction (sqrt (EcNc * 10.0)) + 24.0 * QFunction (sqrt (EcNc * 12.0)) + QFunction (sqrt (EcNc * 16.0));
204 pew = min (pew, 0.99999);
205 ber = 128.0 / 255.0 * pew;
206 }
207 return ber;
208}
209
210int main (int argc, char * argv[])
211{
212 double rss, sinr;
213 double totalPkt = 200.0;
214//double noise = 1.552058; // (dB) this noise figure value corresponds to
215 // -99 dBm noise floor reported in CMU paper
216 double noise = 7; // (dB) this noise figure value corresponds to the
217 // default in YansWifiPhy, and matches CMU testbed results
218 double EcNc, EbN01, EbN02, EbN05, EbN011;
219 double ieee1,ieee2,ieee5,ieee11;
220 double numBits = (1024. + 40. + 14.) * 8.;
221 double dbpsk,dqpsk,cck16,cck256,sepcck16,sepcck256;
222 noise = DbToNoneDb (noise) * 1.3803e-23 * 290.0 * 22000000;
223 for (rss = -102.0; rss <= -80.0; rss += 0.1)
224 {
225 sinr = DbToNoneDb (rss) / 1000.0 / noise;
226 EcNc = sinr * 22000000.0 / 11000000.0; // IEEE sir
227 EbN01 = sinr * 22000000.0 / 1000000.0;
228 // 2 bits per symbol, 1 MSPS
229 EbN02 = sinr * 22000000.0 / 1000000.0 / 2.0;
230 EbN05 = sinr * 22000000.0 / 1375000.0 / 4.0;
231 EbN011 = sinr * 22000000.0 / 1375000.0 / 8.0;
232 // 1=rss, 2=EcNc, 3=EbN01, 4=EbN02, 5=EBN05, 6=EbN011
233 printf ("%g %g %g %g %g %g ", rss, NoneDbToDb (EcNc),
234 NoneDbToDb (EbN01),NoneDbToDb (EbN02),
235 NoneDbToDb (EbN05),NoneDbToDb (EbN011));
236 ieee1 = Get80211bDsssDbpskBerIeee (EcNc);
237 ieee2 = Get80211bDsssDqpskBerIeee (EcNc);
238 ieee5 = Get80211bDsssDqpskCCK5_5BerIeee (EcNc);
239 ieee11 = Get80211bDsssDqpskCCK11BerIeee (EcNc);
240 // 7=ber_ieee1, 8=ber_ieee2, 9=ber_ieee5, 10=ber_ieee11
241 printf (" %g %g %g %g ", ieee1, ieee2,ieee5,ieee11);
242 ieee1 = totalPkt * pow (1 - ieee1, numBits);
243 ieee2 = totalPkt * pow (1 - ieee2, numBits);
244 ieee5 = totalPkt * pow (1 - ieee5, numBits);
245 ieee11 = totalPkt * pow (1 - ieee11, numBits);
246 // 11=pkt_ieee1, 12=pkt_ieee2, 13=pkt_ieee5, 14=pkt_ieee11
247 printf (" %g %g %g %g ", ieee1, ieee2,ieee5,ieee11);
248 dbpsk = Get80211bDsssDbpskBer (sinr);
249 dqpsk = Get80211bDsssDqpskBer (sinr);
250 cck16 = max (0, 8.0 / 15.0 * p_e2 (4.0 * EbN05 / 2.0));
251 cck256 = max (0, 128.0 / 255.0 * p_e1 (8.0 * EbN011 / 2.0));
252 // 15=ber_dbpsk, 16=ber_dqpsk, 17=ber_cck16, 18=ber_cck256
253 printf (" %g %g %g %g ", dbpsk, dqpsk,cck16,cck256);
254 dbpsk = totalPkt * pow (1 - dbpsk,numBits);
255 dqpsk = totalPkt * pow (1 - dqpsk,numBits);
256 sepcck16 = p_e2 (4.0 * EbN05 / 2.0);
257 sepcck256 = p_e1 (8.0 * EbN011 / 2.0);
258 cck16 = totalPkt * pow (1.0 - sepcck16,numBits / 4.0);
259 cck256 = totalPkt * pow (1.0 - sepcck256,numBits / 8.0);
260 // 19=pkt_dbpsk, 20=pkt_dqpsk, 21=pkt_cck16, 22=pkt_cck256
261 printf (" %g %g %g %g ", dbpsk, dqpsk,cck16,cck256);
262 // 23=sinr
263 printf (" %g \n",NoneDbToDb (sinr));
264 }
265 return 0;
266}
#define WLAN_SIR_perfect
Definition: 80211b.c:44
double p_e2(double e2)
Definition: 80211b.c:78
double Get80211bDsssDqpskCCK11BerIeee(double EcNc)
Definition: 80211b.c:190
#define WLAN_SIR_impossible
Definition: 80211b.c:45
double NoneDbToDb(double x)
Definition: 80211b.c:108
double Get80211bDsssDqpskCCK5_5BerIeee(double EcNc)
Definition: 80211b.c:170
double Get80211bDsssDbpskBerIeee(double EcNc)
Definition: 80211b.c:119
double p_e1(double e1)
Definition: 80211b.c:98
#define min(a, b)
Definition: 80211b.c:42
double DQPSKFunction(double x)
Definition: 80211b.c:113
double QFunction(double x)
Definition: 80211b.c:65
double Get80211bDsssDbpskBer(double sinr)
Definition: 80211b.c:137
double Get80211bDsssDqpskBerIeee(double EcNc)
Definition: 80211b.c:144
double f(double x, void *params)
Definition: 80211b.c:70
double Get80211bDsssDqpskBer(double sinr)
Definition: 80211b.c:162
double DbToNoneDb(double x)
Definition: 80211b.c:103
#define max(a, b)
Definition: 80211b.c:43
fn_parameter_t structure
Definition: 80211b.c:60
double beta
beta
Definition: 80211b.c:61
double n
n
Definition: 80211b.c:62