BPSK的BER计算
错误率计算块按比特计算错误率(bit error rate,BER)。 使用该块,我们可以获得通信系统的BER数据并分析我们系统的有效性。 在这个例子中,我们将看一个简单的BPSK接收机和发射机模型。 如下图所示。
接下来,我们将设置一个辅助函数来运行模型。
In [ ]:
# 启用辅助模型启动功能。
function run_model( name_model)
Path = (@__DIR__) * "/" * name_model * ".engee"
if name_model in [m.name for m in engee.get_all_models()] # 检查将模型加载到内核的条件
model = engee.open( name_model ) # 打开模型
model_output = engee.run( model, verbose=true ); # 启动模型
else
model = engee.load( Path, force=true ) # 上传模型
model_output = engee.run( model, verbose=true ); # 启动模型
engee.close( name_model, force=true ); # 关闭模型
end
sleep(1)
return model_output
end
Out[0]:
接下来,我们将初始化模型的信噪比指标,并声明一个误码变量。
In [ ]:
EbNoArr = collect(-7:3:7);
Eb_No = 0;
ber = zeros(length(EbNoArr));
BER = 0;
现在让我们在信噪比的不同值下运行模型。
In [ ]:
for i in 1:length(EbNoArr)
Eb_No = EbNoArr[i]
run_model("BPSK_BER") # 启动模型。
BER = collect(BER)
ber[i]=BER.value[end]
println("BER: $(ber[i])")
end
我们将从模型和理论计算中构建一个BER图.
In [ ]:
using SpecialFunctions
function berawgn_psk(EbNo_dB, M)
EbNo = 10 .^ (EbNo_dB ./ 10)
if M == 2
return 0.5 .* erfc.(sqrt.(EbNo))# 同样对于具有灰色编码的QPSK
else
k = log2(M)
return 2 * erfc.(sqrt.(k .* EbNo) .* sin(π/M)) / k
end
end
ber_ref = berawgn_psk(EbNoArr, 2)
println("__Eb_No__: $EbNoArr")
println("_ber_ref_: $(round.(ber_ref, digits=3))")
println("ber_model: $(round.(ber, digits=3))")
p1 = plot(EbNoArr, ber_ref, seriestype = :scatter, marker = :rect, label = "Theoretical BPSK", yscale = :log10)
plot!(p1, EbNoArr, ber, seriestype = :scatter, marker = :diamond, label = "Model BPSK")
xlabel!(p1, "Eb/No (dB)")
ylabel!(p1, "BER")
title!(p1, "Bit Error Rate (Log Scale)")
# 第二张图:正常比例
p2 = plot(EbNoArr, ber_ref, seriestype = :scatter, marker = :rect, label = "")
plot!(p2, EbNoArr, ber, seriestype = :scatter, marker = :diamond, label = "")
ylabel!(p2, "BER")
title!(p2, "Bit Error Rate (Linear Scale)")
# 一般结论:两个图并排
plot(p2, p1, layout = (2, 1), size=(1000,400))
Out[0]:
结论
正如您在此示例中看到的,信噪比越高,误差越低。
在这里,我们已经弄清楚了如何为一个简单的通信系统模型构建一个BER图,并学习了如何应用这种方法来分析系统。