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

Далее зададим вспомогательную функцию для запуска модели.
# Подключение вспомогательной функции запуска модели.
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(5)
return model_output
end
Далее выполним инициализацию показателей отношения сигнала к шуму для нашей модели и объявим переменную битовой ошибки.
EbNoArr = collect(-9:3:9);
Eb_No = 0;
ber = zeros(length(EbNoArr));
BER = 0;
Теперь выполним запуск модели при разных значениях отношения сигнала к шуму.
for i in 1:length(EbNoArr)
Eb_No = EbNoArr[i]
run_model("QPSK") # Запуск модели.
BER = collect(BER)
ber[i]=BER.value[end][1]
println("BER: $(ber[i])")
end
Построим график BER.
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 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))
Вывод
Как видно на этом примере, чем выше отношение сигнала к шуму, тем меньше ошибка.
Здесь мы разобрали, как построить график BER для простой модели системы связи и узнали, как применить данный метод для проведения анализа системы.