QPSK и влияния временной синхронизации
В современных системах цифровой связи обеспечение высокой достоверности передачи информации при наличии помех и ограниченной полосе пропускания канала остается критически важной задачей. Одной из ключевых модуляционных схем, широко применяемых в различных стандартах беспроводной связи, является квадратурная фазовая манипуляция (QPSK), которая обеспечивает эффективное использование спектра за счет передачи двух бит информации на один символ.
В данной работе представлена комплексная модель системы связи с QPSK модуляцией, разработанная для исследования влияния выбора момента дискретизации на помехоустойчивость системы. Модель включает полный тракт передачи сигнала: от генерации случайных данных и их модуляции до процесса демодуляции в условиях аддитивного белого гауссовского шума (AWGN).
Ключевой особенностью данной реализации является исследование влияния параметра временной синхронизации (Select_index) на вероятность битовой ошибки (BER). Фильтр передатчика с приподнятым косинусом увеличивает число отсчетов с 1 до 8 на символ, в то время как фильтр приемника сохраняет это повышенное количество отсчетов. Функция селектора заключается в выборе одного из восьми возможных моментов дискретизации для последующей демодуляции.
Модель реализует следующие ключевые этапы обработки сигнала:
- Генерация случайных целочисленных данных и их преобразование в QPSK символы
- Этап фильтрации приподнятым косинусом (8 отсчетов на символ)
- Добавление гауссовского шума с заданным отношением Eb/No
- Согласованная фильтрация принятого сигнала с сохранением избыточной дискретизации
- Выбор оптимального момента дискретизации через параметр Select_index (1-8)
- Демодуляция QPSK и расчет вероятности битовой ошибки
Теперь запустим нашу модель с исходными параметрами при помощи функции запуска модели и посмотрим результаты по BER.
Код ниже реализует функцию run_model()
для управления запуском модели в среде Engee. Функция выполняет:
- Проверку наличия уже загруженной модели в ядре
- При отсутствии - загружает модель из файла с расширением
.engee
- Запускает модель с выводом прогресса выполнения
- Автоматически закрывает модель после выполнения
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
Ключевые параметры:
Eb_No = 13
- отношение сигнал/шум на бит (13 дБ)Select_index = 1
- индекс выбора момента дискретизации
Eb_No = 13;
Select_index = 1;
run_model("QPSK_timing_sync"); # Запуск модели.
println(simout)
println()
println("BER: $(collect(BER_QPSK).value[end][1])")
Результаты выполнения:
- Модель успешно компилируется с поэтапным прогрессом
- Выводится структура
SimulationResult
с выходными сигналами:RX_out
- принятый сигнал после фильтра приемникаВыбор.1
- выбранные отсчеты для демодуляцииber_qpsk
- рассчитанная вероятность битовой ошибки
- Рассчитанное значение BER составляет 0.0065 (0.65%) для заданных условий
Полученное значение BER демонстрирует хорошее качество связи при выбранном отношении Eb/No и первом моменте дискретизации.
Далее проведём анализ энергетического спектра QPSK сигнала, код ниже выполняет расчет и визуализацию энергетического спектра сигнала после фильтра передатчика с приподнятым косинусом.
Ключевые этапы обработки:
-
Извлечение сигнала - получает комплексный сигнал после передающего фильтра
-
Расчет спектральной плотности мощности:
- Вычисление БПФ сигнала
- Нормировка на длину сигнала и частоту дискретизации (800 Гц)
- Перевод в логарифмическую шкалу (дБ)
-
Сглаживание спектра:
- Применение скользящего среднего с окном 20 отсчетов
- Устранение краевых эффектов свертки
-
Построение графика:
- Центрирование частотной оси относительно нуля
- Отображение в диапазоне ±400 Гц (половина частоты дискретизации)
# Подключение библиотек
neededLibs = ["FFTW", "DSP", "Statistics"]
for lib in neededLibs
try
eval(Meta.parse("using $lib"))
catch ex
Pkg.add(lib)
eval(Meta.parse("using $lib"))
end
end
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)
График показывает практически идеально сформированный спектр QPSK сигнала с характеристиками:
- Плоская вершина в полосе пропускания (за исключением 0)
- Крутые склоны затухания за пределами основной полосы
- Минимальные внеполосные излучения - результат эффективной работы фильтра с приподнятым косинусом
- Симметричная форма относительно нулевой частоты
Спектр демонстрирует отличные спектральные характеристики системы, что подтверждает правильную работу фильтра передатчика и эффективное использование полосы частот.
Далее переходим к тестированию с различными значениями для Select_index.
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
Собранные данные:
- BER значения для 8 различных моментов дискретизации
- Выходные сигналы приемника (RX_out) для каждого случая
- Выбранные отсчеты (Selection_data) для анализа временной синхронизации
Тест успешно завершен и готов для последующего анализа зависимости BER от выбора момента дискретизации, что является критически важным для оценки влияния временной синхронизации на качество связи в QPSK системе.
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 = 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 и 2
- Резкая деградация начинается с индекса 3
- Нулевая эффективность при индексах 5-8 (BER ≈ 0.5 - эквивалентно случайному угадыванию)
Далее более детально рассмотрим лучший и худший результаты.
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)
Эти графики говорят о следующем:
- Спектры идентичны → Фильтрация работает одинаково хорошо в обоих случаях
- Временные данные разные → Момент дискретизации критически важен
- Созвездия разные → Оптимальная синхронизация (синие точки) дает четкие кластеры, плохая синхронизация (красные кресты) - размытые
Отсюда можно сделать вывод, о том, что проблема не в фильтрации или качестве сигнала, а исключительно в точности временнóй синхронизации. Система требует точного выбора момента дискретизации для корректной демодуляции.
Вывод
Проведенное исследование демонстрирует существенную зависимость BER от выбора момента дискретизации, что подтверждает критическую важность точной временной синхронизации в реальных системах цифровой связи. Полученные результаты показывают, что только первые три момента дискретизации обеспечивают приемлемое качество связи, в то время как выбор последующих моментов приводит к резкому ухудшению характеристик системы.