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

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

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

image.png

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

  1. Квадратурно-фазововая манипуляция (QPSK – quadrature phase-shift keying, или 4-PSK) использует созвездие из четырёх точек, размещённых на равных расстояниях на окружности.

  2. Двоичная фазовая манипуляция (BPSK, binary phase shift keying). При такой модуляции используют два фазовых смещения (одно для логической единицы и второе для логического нуля).

  3. Квадратурная модуляция (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")

interactive-scripts/images/communication_demo_Constellations/10e1a72ce410e1fa26ccb6c1d06d3e8c3789004c

Как мы видим, в данном примере 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)

interactive-scripts/images/communication_demo_Constellations/4116d905df570796510d59f2d0f0966e72f67070

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)

interactive-scripts/images/communication_demo_Constellations/1eef351907a684d8e37205758e6f4de94a294229

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)

interactive-scripts/images/communication_demo_Constellations/8f8d18e580406bef07665c22a05d816923b96bc7

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

Вывод

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