45#ifndef DOXYGEN_SHOULD_SKIP_THIS 
   47#include <gsl/gsl_cdf.h> 
   48#include <gsl/gsl_integration.h> 
   49#include <gsl/gsl_math.h> 
   50#include <gsl/gsl_sf_bessel.h> 
   52#define min(a, b) ((a) < (b) ? (a) : (b)) 
   53#define max(a, b) ((a) > (b) ? (a) : (b)) 
   54#define WLAN_SIR_perfect 10.0    
   55#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)
 
   72    double beta = ((fn_parameters*)params)->beta;
 
   73    double n = ((fn_parameters*)params)->n;
 
   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);
 
  119DQPSKFunction(
double 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);
 
  127Get80211bDsssDbpskBerIeee(
double EcNc)
 
  130    if (EcNc > WLAN_SIR_perfect)
 
  134    else if (EcNc < WLAN_SIR_impossible)
 
  140        ber = min(QFunction(sqrt(11.0 * EcNc)), 0.5);
 
  146Get80211bDsssDbpskBer(
double sinr)
 
  148    double EbN0 = sinr * 22000000.0 / 1000000.0;
 
  149    double ber = 0.5 * exp(-EbN0);
 
  154Get80211bDsssDqpskBerIeee(
double EcNc)
 
  157    if (EcNc > WLAN_SIR_perfect)
 
  161    else if (EcNc < WLAN_SIR_impossible)
 
  167        ber = min(QFunction(sqrt(5.5 * EcNc)), 0.5);
 
  173Get80211bDsssDqpskBer(
double sinr)
 
  176    double EbN0 = sinr * 22000000.0 / 1000000.0 / 2.0;
 
  177    double ber = DQPSKFunction(EbN0);
 
  182Get80211bDsssDqpskCCK5_5BerIeee(
double EcNc)
 
  185    if (EcNc > WLAN_SIR_perfect)
 
  189    else if (EcNc < WLAN_SIR_impossible)
 
  195        double pew = 14.0 * QFunction(sqrt(EcNc * 8.0)) + QFunction(sqrt(EcNc * 16.0));
 
  196        pew = min(pew, 0.99999);
 
  197        ber = 8.0 / 15.0 * pew;
 
  203Get80211bDsssDqpskCCK11BerIeee(
double EcNc)
 
  206    if (EcNc > WLAN_SIR_perfect)
 
  210    else if (EcNc < WLAN_SIR_impossible)
 
  216        double pew = 24.0 * QFunction(sqrt(EcNc * 4.0)) + 16.0 * QFunction(sqrt(EcNc * 6.0)) +
 
  217                     174.0 * QFunction(sqrt(EcNc * 8.0)) + 16.0 * QFunction(sqrt(EcNc * 10.0)) +
 
  218                     24.0 * QFunction(sqrt(EcNc * 12.0)) + QFunction(sqrt(EcNc * 16.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)
 
  241        sinr = DbToNoneDb(rss) / 1000.0 / noise;
 
  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 ",
 
  256        ieee1 = Get80211bDsssDbpskBerIeee(EcNc);
 
  257        ieee2 = Get80211bDsssDqpskBerIeee(EcNc);
 
  258        ieee5 = Get80211bDsssDqpskCCK5_5BerIeee(EcNc);
 
  259        ieee11 = Get80211bDsssDqpskCCK11BerIeee(EcNc);
 
  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);
 
  268        dbpsk = Get80211bDsssDbpskBer(sinr);
 
  269        dqpsk = Get80211bDsssDqpskBer(sinr);
 
  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);
 
  283        printf(
" %g \n", NoneDbToDb(sinr));
 
FtrParams params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.