Engee 文档
Notebook

8-PSK的BER计算

错误率计算块按比特计算错误率(bit error rate,BER)。 使用该块,我们可以获得通信系统的BER数据并分析我们系统的有效性。 在这个例子中,我们将看一个简单的8-PSK接收器和发射器模型。 如下图所示。

image_2.png

接下来,我们将设置一个辅助函数来运行模型。

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(0.5)
    return model_output
end
Out[0]:
run_model (generic function with 1 method)

接下来,我们将初始化模型的信噪比指标,并声明一个误码变量。

In [ ]:
EbNoArr = collect(-9:3:9);
Eb_No = 0;
ber = zeros(length(EbNoArr));
BER = 0;

现在让我们在信噪比的不同值下运行模型。

In [ ]:
for i in 1:length(EbNoArr)
    Eb_No = EbNoArr[i]
    run_model("8-PSK") # Запуск модели.
    BER = collect(BER)
    ber[i]=BER.value[end][1]
    println("BER: $(ber[i])")
end
Building...
Progress 0%
Progress 21%
Progress 100%
BER: 0.4042624042624043
Building...
Progress 0%
Progress 53%
Progress 100%
BER: 0.351981351981352
Building...
Progress 0%
Progress 43%
Progress 100%
BER: 0.3016983016983017
Building...
Progress 0%
Progress 40%
Progress 100%
BER: 0.20646020646020646
Building...
Progress 0%
Progress 38%
Progress 100%
BER: 0.10556110556110557
Building...
Progress 0%
Progress 34%
Progress 100%
Progress 100%
BER: 0.042624042624042624
Building...
Progress 0%
Progress 20%
Progress 100%
Progress 100%
BER: 0.004329004329004329

我们将从模型和理论计算中构建一个BER图.

In [ ]:
using SpecialFunctions
function berawgn_psk(EbNo_dB, M)
    EbNo = 10 .^ (EbNo_dB ./ 10)
    k = log2(M)
    return 2 * erfc.(sqrt.(k .* EbNo) .* sin(π/M)) / k
end
ber_ref = berawgn_psk(EbNoArr, 8)
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 QPSK", yscale = :log10)
plot!(p1, EbNoArr, ber, seriestype = :scatter, marker = :diamond, label = "Model QPSK")
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))
__Eb_No__: [-9, -6, -3, 0, 3, 6, 9]
_ber_ref_: [0.493, 0.426, 0.338, 0.232, 0.124, 0.041, 0.005]
ber_model: [0.404, 0.352, 0.302, 0.206, 0.106, 0.043, 0.004]
Out[0]:

结论

正如您在此示例中看到的,信噪比越高,误差越低。
在这里,我们已经弄清楚了如何为一个简单的通信系统模型构建一个BER图,并学习了如何应用这种方法来分析系统。