36#include <gsl/gsl_cdf.h>
37#include <gsl/gsl_integration.h>
38#include <gsl/gsl_math.h>
39#include <gsl/gsl_sf_bessel.h>
41#define min(a, b) ((a) < (b) ? (a) : (b))
42#define max(a, b) ((a) > (b) ? (a) : (b))
43#define WLAN_SIR_perfect 10.0
44#define WLAN_SIR_impossible 0.1
57typedef struct fn_parameter_t
66 return 0.5 * erfc(x / sqrt(2.0));
70f(
double x,
void* params)
75 pow(2 * gsl_cdf_ugaussian_P(x + beta) - 1, n - 1) * exp(-x * x / 2.0) / sqrt(2.0 * M_PI);
85 params.beta = sqrt(2.0 * e2);
87 gsl_integration_workspace* w = gsl_integration_workspace_alloc(1000);
91 gsl_integration_qagiu(&F, -params.beta, 0, 1e-7, 1000, w, &sep, &error);
92 gsl_integration_workspace_free(w);
103 return 1.0 - pow(1.0 -
p_e2(e1 / 2.0), 2.0);
109 return pow(10.0, x / 10.0);
115 return 10.0 * log10(x);
121 double pi = acos(-1.0);
122 return ((sqrt(2.0) + 1.0) / sqrt(8.0 * pi * sqrt(2.0))) * (1.0 / sqrt(x)) *
123 exp(-(2.0 - sqrt(2.0)) * x);
148 double EbN0 = sinr * 22000000.0 / 1000000.0;
149 double ber = 0.5 * exp(-EbN0);
176 double EbN0 = sinr * 22000000.0 / 1000000.0 / 2.0;
196 pew =
min(pew, 0.99999);
197 ber = 8.0 / 15.0 * pew;
216 double pew = 24.0 *
QFunction(sqrt(EcNc * 4.0)) + 16.0 *
QFunction(sqrt(EcNc * 6.0)) +
219 pew =
min(pew, 0.99999);
220 ber = 128.0 / 255.0 * pew;
226main(
int argc,
char* argv[])
229 double totalPkt = 200.0;
234 double EcNc, EbN01, EbN02, EbN05, EbN011;
235 double ieee1, ieee2, ieee5, ieee11;
236 double numBits = (1024. + 40. + 14.) * 8.;
237 double dbpsk, dqpsk, cck16, cck256, sepcck16, sepcck256;
238 noise =
DbToNoneDb(noise) * 1.3803e-23 * 290.0 * 22000000;
239 for (rss = -102.0; rss <= -80.0; rss += 0.1)
242 EcNc = sinr * 22000000.0 / 11000000.0;
243 EbN01 = sinr * 22000000.0 / 1000000.0;
245 EbN02 = sinr * 22000000.0 / 1000000.0 / 2.0;
246 EbN05 = sinr * 22000000.0 / 1375000.0 / 4.0;
247 EbN011 = sinr * 22000000.0 / 1375000.0 / 8.0;
249 printf(
"%g %g %g %g %g %g ",
261 printf(
" %g %g %g %g ", ieee1, ieee2, ieee5, ieee11);
262 ieee1 = totalPkt * pow(1 - ieee1, numBits);
263 ieee2 = totalPkt * pow(1 - ieee2, numBits);
264 ieee5 = totalPkt * pow(1 - ieee5, numBits);
265 ieee11 = totalPkt * pow(1 - ieee11, numBits);
267 printf(
" %g %g %g %g ", ieee1, ieee2, ieee5, ieee11);
270 cck16 =
max(0, 8.0 / 15.0 *
p_e2(4.0 * EbN05 / 2.0));
271 cck256 =
max(0, 128.0 / 255.0 *
p_e1(8.0 * EbN011 / 2.0));
273 printf(
" %g %g %g %g ", dbpsk, dqpsk, cck16, cck256);
274 dbpsk = totalPkt * pow(1 - dbpsk, numBits);
275 dqpsk = totalPkt * pow(1 - dqpsk, numBits);
276 sepcck16 =
p_e2(4.0 * EbN05 / 2.0);
277 sepcck256 =
p_e1(8.0 * EbN011 / 2.0);
278 cck16 = totalPkt * pow(1.0 - sepcck16, numBits / 4.0);
279 cck256 = totalPkt * pow(1.0 - sepcck256, numBits / 8.0);
281 printf(
" %g %g %g %g ", dbpsk, dqpsk, cck16, cck256);
double Get80211bDsssDqpskCCK11BerIeee(double EcNc)
#define WLAN_SIR_impossible
double NoneDbToDb(double x)
double Get80211bDsssDqpskCCK5_5BerIeee(double EcNc)
double Get80211bDsssDbpskBerIeee(double EcNc)
double DQPSKFunction(double x)
double QFunction(double x)
double Get80211bDsssDbpskBer(double sinr)
double Get80211bDsssDqpskBerIeee(double EcNc)
double f(double x, void *params)
double Get80211bDsssDqpskBer(double sinr)
double DbToNoneDb(double x)