一个基于python的误码率置信度计算器正在为GNU无线电OOT开发.在文献1中,置信度由方程计算。

然而,引用2使用公式计算置信水平:

第一个问题是关于这两个公式。他们为什么不一样?我确实试着把它们都实现了。第一个版本非常简单。然而,第二个公式中的指数运算和阶乘运算导致了一个"OverflowError:数学范围误差“问题。我们怎么处理这件事?
import math
def confidence_level(N,ber,E):
sum = 0.0;
for k in range(0,E):
sum += math.pow(N*ber,k)/math.factorial(k);
cl = 1.0 - math.exp(-N*ber)*sum;
print cl;
confidence_level(1.80e+10, 1.0e-6, 6350);参考文献1:https://www.keysight.com/main/editorial.jspx?ckey=1481106&id=1481106&nid=-11143.0.00&lc=eng&cc=LV
参考文献2:https://www.jitterlabs.com/support/calculators/ber-confidence-level-calculator
编辑,似乎第一个公式简化为CL =1-exp(-NErrors),因为BER =NError/NBits。对于Eb/No =7 dB的BPSK调制,在检测到14个误差后,获得了100%的置信度,这似乎是不准确的。
NBits: 1600 NErrs: 1误码率: 6.2500E-04 CL: 6.3212E-01
NBits: 3200 NErrs: 1误码率:3.1250E-04CL: 6.3212E-01
NBits: 4800 NErrs: 3误码率:6.2500E-04CL: 9.5021E-01
NBits: 8000 NErrs: 6误码率: 7.5000E-04 CL: 9.9752E-01
NBits: 9600 NErrs: 6误码率: 6.2500E-04 CL: 9.9752E-01
NBits: 11200 NErrs: 8误码率: 7.1429E-04 CL: 9.9966E-01
NBits: 12800 NErrs: 8误码率:6.2500E-04CL: 9.9966E-01
NBits: 14400 NErrs: 9误码率: 6.2500E-04 CL: 9.9988E-01
NBits: 16000 NErrs: 9误码率: 5.6250E-04 CL: 9.9988E-01
NBits: 17600 NErrs: 10误码率:5.6818 E-04 CL: 9.9995E-01
NBits: 19200 NErrs: 12误码率:6.2500E-04CL: 9.9999E-01
NBits: 20800 NErrs: 12误码率:5.7692E-04CL: 9.9999E-01
NBits: 22400 NErrs: 12误码率:5.3571E-04CL: 9.9999E-01
NBits: 24000 NErrs: 14误码率: 5.8333E-04 CL: 1.0000E+00
NBits: 25600 NErrs: 16误码率: 6.2500E-04 CL: 1.0000E+00
NBits: 27200 NErrs: 18误码率: 6.6176E-04 CL: 1.0000E+00
NBits: 28800 NErrs: 18误码率: 6.2500E-04 CL: 1.0000E+00
发布于 2019-08-08 08:53:34
为什么公式不同?
只有当您有零错误(即E=0)时,才能使用公式1。在这种情况下,它相当于公式2。
公式2可以用来计算置信度,不管你观察到多少错误。
我们该如何处理溢出的问题?
术语e^(-N*BER_s) *sum(.)第二个方程是参数为lambda = N*BER_s和k= E的N*BER_s,这个函数是在scipy.stats中实现模。因此,我们可以按以下方式计算置信度:
from scipy.stats import poisson
def confidence_level(N, BER_s, E):
return 1 - poisson.cdf(E, N*BER_s)对于您的值(N=1.80e+10,BER_s=1.0e-6,E=6350),此函数返回1.0。因此,你可以100%的自信,你的测试的真实误码率小于1.0e-6。
https://stackoverflow.com/questions/57388832
复制相似问题