Сообщество Engee

Влияния временной синхронизации на BER

Автор
avatar-yurevyurev
Notebook

QPSK и влияния временной синхронизации

В современных системах цифровой связи обеспечение высокой достоверности передачи информации при наличии помех и ограниченной полосе пропускания канала остается критически важной задачей. Одной из ключевых модуляционных схем, широко применяемых в различных стандартах беспроводной связи, является квадратурная фазовая манипуляция (QPSK), которая обеспечивает эффективное использование спектра за счет передачи двух бит информации на один символ.

В данной работе представлена комплексная модель системы связи с QPSK модуляцией, разработанная для исследования влияния выбора момента дискретизации на помехоустойчивость системы. Модель включает полный тракт передачи сигнала: от генерации случайных данных и их модуляции до процесса демодуляции в условиях аддитивного белого гауссовского шума (AWGN).

Ключевой особенностью данной реализации является исследование влияния параметра временной синхронизации (Select_index) на вероятность битовой ошибки (BER). Фильтр передатчика с приподнятым косинусом увеличивает число отсчетов с 1 до 8 на символ, в то время как фильтр приемника сохраняет это повышенное количество отсчетов. Функция селектора заключается в выборе одного из восьми возможных моментов дискретизации для последующей демодуляции.


image.png

Модель реализует следующие ключевые этапы обработки сигнала:

  • Генерация случайных целочисленных данных и их преобразование в QPSK символы
  • Этап фильтрации приподнятым косинусом (8 отсчетов на символ)
  • Добавление гауссовского шума с заданным отношением Eb/No
  • Согласованная фильтрация принятого сигнала с сохранением избыточной дискретизации
  • Выбор оптимального момента дискретизации через параметр Select_index (1-8)
  • Демодуляция QPSK и расчет вероятности битовой ошибки

Теперь запустим нашу модель с исходными параметрами при помощи функции запуска модели и посмотрим результаты по BER.

Код ниже реализует функцию run_model() для управления запуском модели в среде Engee. Функция выполняет:

  • Проверку наличия уже загруженной модели в ядре
  • При отсутствии - загружает модель из файла с расширением .engee
  • Запускает модель с выводом прогресса выполнения
  • Автоматически закрывает модель после выполнения
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)

Ключевые параметры:

  • Eb_No = 13 - отношение сигнал/шум на бит (13 дБ)
  • Select_index = 1 - индекс выбора момента дискретизации
In [ ]:
Eb_No = 13;
Select_index = 1;

run_model("QPSK_timing_sync"); # Запуск модели.
println(simout)
println()
println("BER: $(collect(BER_QPSK).value[end][1])")
Building...
Progress 0%
Progress 7%
Progress 37%
Progress 47%
Progress 55%
Progress 66%
Progress 80%
Progress 97%
Progress 100%
Progress 100%
SimulationResult(
    "QPSK_timing_sync/ber_qpsk" => WorkspaceArray{Vector{Float64}}("QPSK_timing_sync/ber_qpsk")
,
    "QPSK_timing_sync/Изменение формы.Y" => WorkspaceArray{Vector{ComplexF64}}("QPSK_timing_sync/Изменение формы.Y")
,
    "QPSK_timing_sync/RX_out" => WorkspaceArray{Vector{ComplexF64}}("QPSK_timing_sync/RX_out")
,
    "QPSK_timing_sync/Выбор.1" => WorkspaceArray{ComplexF64}("QPSK_timing_sync/Выбор.1")
,
    "QPSK_timing_sync/QPSK Baseband Modulator.1" => WorkspaceArray{ComplexF64}("QPSK_timing_sync/QPSK Baseband Modulator.1")
,
    "QPSK_timing_sync/AWGN Channel-2.1" => WorkspaceArray{Matrix{ComplexF64}}("QPSK_timing_sync/AWGN Channel-2.1")

)

BER: 0.006493506493506494

Результаты выполнения:

  • Модель успешно компилируется с поэтапным прогрессом
  • Выводится структура SimulationResult с выходными сигналами:
    • RX_out - принятый сигнал после фильтра приемника
    • Выбор.1 - выбранные отсчеты для демодуляции
    • ber_qpsk - рассчитанная вероятность битовой ошибки
  • Рассчитанное значение BER составляет 0.0065 (0.65%) для заданных условий

Полученное значение BER демонстрирует хорошее качество связи при выбранном отношении Eb/No и первом моменте дискретизации.

Далее проведём анализ энергетического спектра QPSK сигнала, код ниже выполняет расчет и визуализацию энергетического спектра сигнала после фильтра передатчика с приподнятым косинусом.

Ключевые этапы обработки:

  1. Извлечение сигнала - получает комплексный сигнал после передающего фильтра

  2. Расчет спектральной плотности мощности:

    • Вычисление БПФ сигнала
    • Нормировка на длину сигнала и частоту дискретизации (800 Гц)
    • Перевод в логарифмическую шкалу (дБ)
  3. Сглаживание спектра:

    • Применение скользящего среднего с окном 20 отсчетов
    • Устранение краевых эффектов свертки
  4. Построение графика:

    • Центрирование частотной оси относительно нуля
    • Отображение в диапазоне ±400 Гц (половина частоты дискретизации)
In [ ]:
using FFTW, DSP, Statistics
Out_Transmit_Filter_value = vcat(simout["QPSK_timing_sync/RX_out"].value...)
fs = 800  
power_spectrum_raw = abs.(fft(Out_Transmit_Filter_value)).^2 / (length(Out_Transmit_Filter_value) * fs)
power_spectrum_db_raw = 10*log10.(power_spectrum_raw)
window_size = 20  
kernel = ones(window_size) / window_size 
power_spectrum_smoothed = conv(power_spectrum_db_raw, kernel)[window_size÷2+1:end-window_size÷2]
freqs = fftfreq(length(power_spectrum_smoothed), fs)

plot(fftshift(freqs), fftshift(power_spectrum_smoothed),
     title="Энергетический спектр (скользящее среднее, окно $window_size)",
     xlabel="Частота, Гц",
     ylabel="Спектральная плотность мощности, дБ/Гц",
     legend=false,
     linewidth=2,
     grid=true)
Out[0]:

График показывает практически идеально сформированный спектр QPSK сигнала с характеристиками:

  • Плоская вершина в полосе пропускания (за исключением 0)
  • Крутые склоны затухания за пределами основной полосы
  • Минимальные внеполосные излучения - результат эффективной работы фильтра с приподнятым косинусом
  • Симметричная форма относительно нулевой частоты

Спектр демонстрирует отличные спектральные характеристики системы, что подтверждает правильную работу фильтра передатчика и эффективное использование полосы частот.

Далее переходим к тестированию с различными значениями для Select_index.

In [ ]:
ber_qpsk = zeros(8);
RX_out = Vector{Vector{ComplexF64}}(undef, 8)
Selection_data = Vector{Vector{ComplexF64}}(undef, 8) 
fs = 800 
global Select_index

@time for i in 1:8
    println("Запуск модели для Select_index = $i")
    Select_index = Int32(i)
    run_model("QPSK_timing_sync")
    ber_qpsk[i] = collect(BER_QPSK).value[end][1]
    RX_out[i] = vcat(simout["QPSK_timing_sync/RX_out"].value...)
    Selection_data[i] = simout["QPSK_timing_sync/Выбор.1"].value
end
Запуск модели для Select_index = 1
Building...
Progress 0%
Progress 6%
Progress 25%
Progress 38%
Progress 52%
Progress 80%
Progress 95%
Progress 100%
Progress 100%
Запуск модели для Select_index = 2
Building...
Progress 0%
Progress 9%
Progress 26%
Progress 41%
Progress 56%
Progress 71%
Progress 94%
Progress 100%
Progress 100%
Запуск модели для Select_index = 3
Building...
Progress 0%
Progress 7%
Progress 27%
Progress 51%
Progress 73%
Progress 90%
Progress 100%
Progress 100%
Запуск модели для Select_index = 4
Building...
Progress 0%
Progress 8%
Progress 27%
Progress 43%
Progress 66%
Progress 81%
Progress 98%
Progress 100%
Progress 100%
Запуск модели для Select_index = 5
Building...
Progress 0%
Progress 6%
Progress 31%
Progress 52%
Progress 72%
Progress 97%
Progress 100%
Progress 100%
Запуск модели для Select_index = 6
Building...
Progress 0%
Progress 5%
Progress 24%
Progress 38%
Progress 51%
Progress 69%
Progress 89%
Progress 100%
Progress 100%
Запуск модели для Select_index = 7
Building...
Progress 0%
Progress 6%
Progress 21%
Progress 39%
Progress 62%
Progress 74%
Progress 91%
Progress 100%
Progress 100%
Запуск модели для Select_index = 8
Building...
Progress 0%
Progress 8%
Progress 25%
Progress 41%
Progress 64%
Progress 79%
Progress 93%
Progress 100%
Progress 100%
 39.272979 seconds (13.90 M allocations: 824.041 MiB, 0.68% gc time, 129 lock conflicts, 16.38% compilation time)

Собранные данные:

  • BER значения для 8 различных моментов дискретизации
  • Выходные сигналы приемника (RX_out) для каждого случая
  • Выбранные отсчеты (Selection_data) для анализа временной синхронизации

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

In [ ]:
println("\nРезультаты BER:")
for i in 1:8
    println("Select_index = $i: BER = $(ber_qpsk[i])")
end
plot(1:8, ber_qpsk, 
     title="Зависимость BER от Select_index",
     xlabel="Select_index", 
     ylabel="BER",
     marker=:circle,
     linewidth=2,
     grid=true,
     legend=false,
     yscale=:log10)
Результаты BER:
Select_index = 1: BER = 0.006493506493506494
Select_index = 2: BER = 0.005994005994005994
Select_index = 3: BER = 0.013486513486513486
Select_index = 4: BER = 0.09140859140859141
Select_index = 5: BER = 0.25374625374625376
Select_index = 6: BER = 0.3986013986013986
Select_index = 7: BER = 0.481018981018981
Select_index = 8: BER = 0.4935064935064935
Out[0]:

Анализ зависимости BER от момента дискретизации

График в логарифмическом масштабе наглядно демонстрирует экспоненциальный характер деградации качества связи при отклонении от оптимального момента дискретизации. Оптимальные моменты дискретизации: Select_index = 2: BER = 0.0060 (наилучший результат) и Select_index = 1: BER = 0.0065 (очень близко к оптимальному). Критическое ухудшение качества начинается с Select_index = 3: BER = 0.0135 (в 2 раза хуже оптимального), а наихудшие случаи Select_index = 5-8: BER > 0.25 (фактически потеря связи)

Исходя из этого можно сделать следующие выводы:

  1. Оптимальная синхронизация достигается при индексах 1 и 2
  2. Резкая деградация начинается с индекса 3
  3. Нулевая эффективность при индексах 5-8 (BER ≈ 0.5 - эквивалентно случайному угадыванию)

Далее более детально рассмотрим лучший и худший результаты.

In [ ]:
best_idx = argmin(ber_qpsk)
worst_idx = argmax(ber_qpsk)
best_selection = Selection_data[best_idx]
worst_selection = Selection_data[worst_idx]
downsample_factor = 20
best_constellation = best_selection[1:downsample_factor:end]
worst_constellation = worst_selection[1:downsample_factor:end]
function compute_spectrum_q(signal, fs)
    q_signal = imag(signal)
    N = length(q_signal)
    power_spectrum = abs.(fft(q_signal)).^2 / (N * fs)
    power_spectrum_db = 10*log10.(power_spectrum)
    freqs = fftfreq(N, fs)
    return fftshift(freqs), fftshift(power_spectrum_db)
end
freqs_best, spectrum_best = compute_spectrum_q(RX_out[best_idx], fs)
freqs_worst, spectrum_worst = compute_spectrum_q(RX_out[worst_idx], fs)
p_combined = plot(layout=(3,1), size=(800, 900))

t = 1:200
plot!(p_combined[1], t, imag(best_selection[t]), 
      label="Лучший (Index $best_idx)", linewidth=2, color=:blue)
plot!(p_combined[1], t, imag(worst_selection[t]), 
      label="Худший (Index $worst_idx)", linewidth=2, color=:red, linestyle=:dash)
title!(p_combined[1], "Временные данные Q компонента")

plot!(p_combined[2], freqs_best, spectrum_best, 
      label="Лучший", linewidth=2, color=:blue)
plot!(p_combined[2], freqs_worst, spectrum_worst, 
      label="Худший", linewidth=2, color=:red, linestyle=:dash)
title!(p_combined[2], "Спектры Q компонентов")

scatter!(p_combined[3], 1:length(best_constellation), imag(best_constellation), 
         label="Лучший", markersize=4, alpha=0.7, color=:blue,
         markerstrokewidth=0, marker=:circle)
scatter!(p_combined[3], 1:length(worst_constellation), imag(worst_constellation), 
         label="Худший", markersize=4, alpha=0.7, color=:red,
         markerstrokewidth=0, marker=:x)
title!(p_combined[3], "Q компоненты созвездий")
plot!(p_combined, titlefontsize=12, legendfontsize=10)
Out[0]:

Эти графики говорят о следующем:

  1. Спектры идентичны → Фильтрация работает одинаково хорошо в обоих случаях
  2. Временные данные разные → Момент дискретизации критически важен
  3. Созвездия разные → Оптимальная синхронизация (синие точки) дает четкие кластеры, плохая синхронизация (красные кресты) - размытые

Отсюда можно сделать вывод, о том, что проблема не в фильтрации или качестве сигнала, а исключительно в точности временнóй синхронизации. Система требует точного выбора момента дискретизации для корректной демодуляции.

Вывод

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