Документация Engee
Notebook

Расчёт BER для BPSK

Блок Error Rate Calculation вычисляет частоту ошибок по битам (bit error rate, BER). Используя этот блок, мы можем получить данные о BER для системы связи и провести анализ эффективности нашей системы. В этом примере мы рассмотрим простую модель BPSK приёмника и передатчика. Она показана на рисунке ниже.

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

Далее выполним инициализацию показателей отношения сигнала к шуму для нашей модели и объявим переменную битовой ошибки.

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
Building...
Progress 0%
Progress 100%
Progress 100%
BER: 0.28515625
Building...
Progress 0%
Progress 100%
Progress 100%
BER: 0.2021484375
Building...
Progress 0%
Progress 100%
Progress 100%
BER: 0.091796875
Building...
Progress 0%
Progress 100%
Progress 100%
BER: 0.03515625
Building...
Progress 0%
Progress 100%
Progress 100%
BER: 0.005859375

Построим график 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 с Gray-кодированием
    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))
__Eb_No__: [-7, -4, -1, 2, 5]
_ber_ref_: [0.264, 0.186, 0.104, 0.038, 0.006]
ber_model: [0.285, 0.202, 0.092, 0.035, 0.006]
Out[0]:

Вывод

Как видно на этом примере, чем выше отношение сигнала к шуму, тем меньше ошибка. Здесь мы разобрали, как построить график BER для простой модели системы связи и узнали, как применить данный метод для проведения анализа системы.