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

Анализ модуляций

Открыть пример в Engee

В данном примере разберем возможности построения созвездий различных сигналов и выполним сравнение BER вариантов модуляции битового потока при общем для них уровне шума.

Далее показана реализованная демонстрационная модель.

image_2.png

Как мы видим, в данном примере используется 3 вида модуляций.

  1. Квадратурно-фазововая манипуляция (QPSK – quadrature phase-shift keying, или 4-PSK) использует созвездие из четырёх точек, размещённых на равных расстояниях на окружности.
  2. Двоичная фазовая манипуляция (BPSK, binary phase shift keying). При такой модуляции используют два фазовых смещения (одно для логической единицы и второе для логического нуля).
  3. Квадратурная модуляция (QAM – Quadrature Amplitude Modulation) – разновидность амплитудной модуляции сигнала, которая представляет собой сумму двух несущих колебаний одной частоты, но сдвинутых по фазе относительно друг друга на 90° (π/2 радиана).

Для начала подключим библиотеку Plots, чтобы построить графики, и объявим отношение энергии информационных битов на символ к спектральной плотности мощности шума.

In [ ]:
using Plots
In [ ]:
EbNo = 25;

Теперь объявим функцию запуска модели и выполним моделирование.

In [ ]:
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
Out[0]:
run_model (generic function with 1 method)
In [ ]:
run_model("demo_model")
Building...
Progress 100%
Out[0]:
Dict{String, DataFrame} with 3 entries:
  "Selector-1.1" => 1001×2 DataFrame…
  "Selector.1"   => 1001×2 DataFrame…
  "Selector-2.1" => 1001×2 DataFrame

Выделим из simout статистику BER.

In [ ]:
# Считывание из 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]
Out[0]:
2-element Vector{Vector{Float64}}:
 [0.0]
 [0.0]

Как мы видим, данные записаны в формате вектора матриц. Преобразуем их в скалярные векторы.

In [ ]:
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]
Out[0]:
2-element Vector{Float64}:
 0.0
 0.0

Построим графики BER.

In [ ]:
plot(title="BER")
plot!(BER_qpsk_new, label = "qpsk")
plot!(BER_bpsk_new, label = "bpsk")
plot!(BER_qam_new, label = "qam")
Out[0]:

Как мы видим, в данном примере 8-PSK имеет самый большой показатель ошибок.

Теперь выполним построения созведия для каждой из модуляций. Начнём с QPSK, после чего построим BPSK и 8-PSK.

In [ ]:
qpsk = collect(qpsk);
qpsk_new = [(i...)+0 for i in qpsk.value];
In [ ]:
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)
Out[0]:
In [ ]:
bpsk = collect(bpsk);
bpsk_new = [(i...)+0 for i in bpsk.value];
In [ ]:
plot(title="BPSK")
plot!(ComplexF64.(bpsk_new), seriestype=:scatter)
plot!([-1+0im, 1+0im], seriestype=:scatter)
Out[0]:
In [ ]:
qam = collect(qam);
qam_new = [(i...)+0 for i in qam.value];
In [ ]:
plot(title="8-PSK")
plot!(ComplexF64.(qam_new), seriestype=:scatter)
plot!(cis.(2pi*[0:7...]/8), seriestype=:scatter)
Out[0]:

Как мы видим из приведённых выше созвездий, первые две модуляции имеют более ярко выраженный разнос по точкам. И в первых двух вариантах значительно меньше областей пересечения точек, в связи с чем мы и получили в QPSK и BPSK значения битовой ошибки в четыре раза меньше, чем при использовании 8-PSK.

Вывод

В данном примере мы рассмотрели способы построения и анализа модулируемых сигналов на примере QPSK, BPSK и QAM модуляций.