Анализ модуляций
В данном примере разберем возможности построения созвездий различных сигналов и выполним сравнение BER вариантов модуляции битового потока при общем для них уровне шума.
Далее показана реализованная демонстрационная модель.
Как мы видим, в данном примере используется 3 вида модуляций.
-
Квадратурно-фазововая манипуляция (QPSK – quadrature phase-shift keying, или 4-PSK) использует созвездие из четырёх точек, размещённых на равных расстояниях на окружности.
-
Двоичная фазовая манипуляция (BPSK, binary phase shift keying). При такой модуляции используют два фазовых смещения (одно для логической единицы и второе для логического нуля).
-
Квадратурная модуляция (QAM – Quadrature Amplitude Modulation) – разновидность амплитудной модуляции сигнала, которая представляет собой сумму двух несущих колебаний одной частоты, но сдвинутых по фазе относительно друг друга на 90° (π/2 радиана).
Для начала подключим библиотеку Plots, чтобы построить графики, и объявим отношение энергии информационных битов на символ к спектральной плотности мощности шума.
using Plots
EbNo = 25;
Теперь объявим функцию запуска модели и выполним моделирование.
function run_model(name_model)
Path = string(@__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
return model_output
end
run_model (generic function with 1 method)
run_model("demo_model")
Building...
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%
Dict{String, DataFrames.DataFrame} with 3 entries:
"Selector-1.1" => 1001×2 DataFrame…
"Selector.1" => 1001×2 DataFrame…
"Selector-2.1" => 1001×2 DataFrame…
Выделим из simout статистику BER.
# Считывание из simout залогированных сигналов
BER_qpsk = simout["demo_model/Selector-1.1"];
BER_qpsk = collect(BER_qpsk);
BER_bpsk = simout["demo_model/Selector.1"];
BER_bpsk = collect(BER_bpsk);
BER_qam = simout["demo_model/Selector-2.1"];
BER_qam = collect(BER_qam);
BER_qpsk.value[1:2]
2-element Vector{Any}:
[0.0]
[0.0]
Как мы видим, данные записаны в формате вектора матриц. Преобразуем их в скалярные векторы.
BER_qpsk_new = [(i...)+0 for i in BER_qpsk.value];
BER_bpsk_new = [(i...)+0 for i in BER_bpsk.value];
BER_qam_new = [(i...)+0 for i in BER_qam.value];
BER_qam_new[1:2]
2-element Vector{Float64}:
0.0
0.0
Построим графики BER.
plot(title="BER")
plot!(BER_qpsk_new, label = "qpsk")
plot!(BER_bpsk_new, label = "bpsk")
plot!(BER_qam_new, label = "qam")
Как мы видим, в данном примере QAM8 имеет самый большой показатель ошибок.
Теперь выполним построения созведия для каждой из модуляций. Начнём с QPSK, после чего построим BPSK и QAM8.
qpsk = collect(qpsk);
qpsk_new = [(i...)+0 for i in qpsk.value];
plot(title="QPSK")
plot!(ComplexF64.(qpsk_new), seriestype=:scatter)
plot!([0.75+0.75im, 0.75-0.75im, -0.75+0.75im, -0.75-0.75im], seriestype=:scatter)
bpsk = collect(bpsk);
bpsk_new = [(i...)+0 for i in bpsk.value];
plot(title="BPSK")
plot!(ComplexF64.(bpsk_new), seriestype=:scatter)
plot!([-1+0im, 1+0im], seriestype=:scatter)
qam = collect(qam);
qam_new = [(i...)+0 for i in qam.value];
plot(title="QAM8")
plot!(ComplexF64.(qam_new), seriestype=:scatter)
plot!(cis.(2pi*[0:7...]/8), seriestype=:scatter)
Как мы видим из приведённых выше созвездий, первые две модуляции имеют более ярко выраженный разнос по точкам. И в первых двух вариантах значительно меньше областей пересечения точек, в связи с чем мы и получили в QPSK и BPSK значения битовой ошибки в четыре раза меньше, чем при использовании QAM8.