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

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

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

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

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 радиана).

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

In [ ]:
Eb_No = 10;

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

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 0%
Progress 14%
Progress 44%
Progress 71%
Progress 99%
Progress 100%
Out[0]:
SimulationResult(
    "Selector-1.1" => WorkspaceArray{Vector{Float64}}("demo_model/Selector-1.1")
,
    "Selector.1" => WorkspaceArray{Vector{Float64}}("demo_model/Selector.1")
,
    "Selector-2.1" => WorkspaceArray{Vector{Float64}}("demo_model/Selector-2.1")

)

Выполним построения созведия для каждой из модуляций. Начнём с 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 модуляций.