uint32_t d[] =
{ 12, 14, 16, 18, 20, 22, 24, 26, 28 };
double Bd[] =
{
33, 281, 2179, 15035LLU, 105166LLU, 692330LLU, 4580007LLU, 29692894LLU,
190453145LLU
};
// double Rc = 1.0 / 2.0;
double ebno = std::pow (10.0, sinr / 10.0);
double perror = 1.0 / (2.0 + ebno);
double P[9];
if (sinr >= 10)
{
return 0;
}
if (sinr <= 6)
{
return 1;
}
for (uint32_t r = 0; r < 9; r++)
{
double sumd = 0;
for (uint32_t k = 0; k < d[r]; k++)
{
sumd = sumd + NChooseK (d[r] - 1 + k, k) * std::pow (1 - perror, (double) k);
}
P[r] = std::pow (perror, (double) d[r]) * sumd;
}
double Pb = 0;
for (uint32_t r = 0; r < 8; r++)
{
Pb = Pb + Bd[r] * P[r];
}