Бинарная частотная манипуляция
Проектирование и моделирование системы бинарной частотной манипуляции
В данной статье рассматривается процесс разработки и моделирования системы передачи данных с использованием бинарной частотной манипуляции (Binary Frequency Shift Keying, BFSK). FSK модуляция является фундаментальной концепцией в современных системах связи. В ее двоичном варианте логическому "0" и "1" соответствуют два различных гармонических сигнала с частотами ( f_1 ) и ( f_2 ). BFSK широко используется в низкоскоростных приложениях благодаря своей помехоустойчивости и простоте реализации, например, в технологиях Bluetooth, GSM на ранних этапах, а также в различных системах телеметрии и радиоуправления.
В данной статье мы разработаем модель системы связи с BFSK, мы пройдем следующие этапы:
- Генерация исходного цифрового сигнала.
- BFSK-модуляция: формирование сигнала путем выбора одной из двух несущих частот в зависимости от бита.
- BFSK-демодуляция: реализация некохерентного метода детектирования. Он основан на разделении сигнала на два частотных канала с помощью полосовых фильтров, выделении их огибающих и принятии решения в пользу того канала, где амплитуда огибающей больше.
- Анализ результатов: сравнение переданного и принятого сообщения.
Особенностью нашей работы является использование в демодуляторе каскада биквадратных фильтров (Biquad Filter). Для корректного выделения информационных составляющих BFSK-сигнала необходимо убедиться, что фильтры настроены именно на те частоты, которые используются в модуляторе. С этой целью мы выполнили анализ их амплитудно-частотной (АЧХ) и фазо-частотной (ФЧХ) характеристик.
using JLD2, Plots
SOS = load("filter_matrix.jld2", "SOS")
Scale = load("filter_matrix.jld2", "Scale")
println("Size SOS: $(size(SOS))")
println("Size Scale: $(size(Scale))")
Коэффициенты фильтра были предварительно рассчитаны и сохранены в файл filter_matrix.jld2. Загружаются две ключевые переменные:
- SOS (Second-Order Sections) — матрица коэффициентов для каждого биквадратного звена. Размер матрицы
(15, 6)означает, что фильтр состоит из 15 последовательно соединенных биквадратных звеньев, каждое из которых описывается шестью коэффициентами. - Scale — вектор масштабирующих коэффициентов для каждого звена. Размер
(16, 1)указывает, что помимо 15 звеньев, добавлен дополнительный масштабирующий коэффициент.
Такая структура (каскад из биквадратных звеньев) является стандартным способом реализации фильтров высоких порядков, обеспечивающим численную устойчивость.
Функция расчета частотной характеристики
Данная функция реализует расчет комплексного коэффициента передачи каскадного фильтра:
-
Для каждой частоты из заданного диапазона вычисляется нормированная угловая частота
omega -
Комплексная переменная
z = exp(1im * omega)соответствует точке на единичной окружности в Z-плоскости -
Для каждого звена рассчитывается его передаточная функция в виде:
-
Общий коэффициент передачи получается перемножением передаточных функций всех звеньев и итогового масштабирующего коэффициента
function biquad_freq_response(SOS, Scale, freqs, fs)
n_sections = size(SOS, 1)
n_freqs = length(freqs)
H = ones(ComplexF64, n_freqs)
for i in 1:n_sections
b0, b1, b2, a0, a1, a2 = SOS[i, :]
for j in 1:n_freqs
omega = 2π * freqs[j] / fs
z = exp(1im * omega)
H_section = (b0 + b1/z + b2/z^2) / (a0 + a1/z + a2/z^2)
H[j] *= H_section
end
end
H .*= prod(Scale)
return H
end
Расчет выполняется для частот от 0 до 24 МГц (половина частоты дискретизации 48 МГц) с разрешением 1024 точки.
Scale_vec = vec(Scale)
fs = 48000000
n_freqs = 1024
freqs = range(0, fs/2, length=n_freqs)
H = biquad_freq_response(SOS, Scale_vec, freqs, fs)
magnitude = 20*log10.(abs.(H))
phase = rad2deg.(angle.(H))
display(plot(freqs, magnitude, xlabel="Частота (Гц)", ylabel="Амплитуда (дБ)", title="АЧХ фильтра"))
display(plot(freqs, phase, xlabel="Частота (Гц)", ylabel="Фаза (градусы)", title="ФЧХ фильтра"))
По графикам можно сделать несколько выводов:
-
Высокое подавление вне полосы: Значения АЧХ быстро убывают за пределами полос пропускания. Это свидетельствует об отличной избирательности фильтра — сигналы на частотах, отличных от целевых, подавляются практически полностью.
-
Нулевое затухание в полосе: В максимумах АЧХ значение близко к 0 дБ (порядка 10⁻⁸ дБ), что означает прохождение полезного сигнала практически без ослабления.
-
Нелинейность фазового сдвига: В полосах пропускания наблюдается сложное поведение фазы, что характерно для фильтров высоких порядков. Это приведет к некоторым фазовым искажениям сигнала, однако для некохерентного детектирования, где анализируется только амплитуда огибающей, фазовые искажения не критичны.

Демодуляция BFSK-сигнала (блок FSK Demodulator), реализует некохерентный детектор на основе полосовых фильтров. Этот метод не требует точного знания фазы несущей, что упрощает реализацию.
Алгоритм работы демодулятора состоит из следующих этапов:
- Входной BFSK-сигнал подается параллельно на два умножителя (Product).
- Формирование двух параллельных канала на разных частотах:
- В верхнем канале сигнал умножается на опорное колебание с частотой "1" (
Carrier Mark Freq1). Результат умножения содержит низкочастотную составляющую (пропорциональную косинусу разности фаз) и высокочастотные гармоники. - В нижнем канале сигнал умножается на опорное колебание с частотой "0" (
Carrier Space Freq1).
- В верхнем канале сигнал умножается на опорное колебание с частотой "1" (
- Сигналы с выходов умножителей поступают на идентичные полосовые фильтры (
Biquad FilterиBiquad Filter-1). Эти фильтры играют ключевую роль:- Они подавляют высокочастотные составляющие, возникшие при умножении.
- Их полоса пропускания настроена таким образом, чтобы выделить именно ту частоту, которая соответствует каналу. По сути, каждый фильтр работает как детектор огибающей. На выходе фильтра мы получаем сигнал, амплитуда которого пропорциональна амплитуде входного сигнала на частоте настройки фильтра.
- Усиление и сравнение:
- Отфильтрованные сигналы усиливаются с разными коэффициентами (Gain) для компенсации потерь и приведения к удобному для сравнения диапазону.
- Далее сигналы поступают на вычитатель.
- Результирующий сигнал разности подается на управляющий порт
Switch.- Если разность
> 0(энергия в канале "1" больше, чем в канале "0"), ключ пропускает на выход значение "1". - В противном случае, если разность
< 0, на выход подается "0".
- Если разность
- Сформированный таким образом цифровой сигнал (
Demodulated Signal) соответствует исходной переданной последовательности.
Далее выполним запуск модели.
.png)
function run_model( name_model)
Path = (@__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
sleep(0.1)
return model_output
end
run_model("Binary_FSK")
Теперь последовательно извлечем результаты моделирования:
- Input_Signal - исходный набор бит.
- Modulated_Signal - сформированный BFSK-сигнал .
- filt_1_minus_filt_2 - Сигнал разности после фильтров.
- Demodulated_Signal - Восстановленного цифрового сигнала.
Input_Signal = (collect(simout["Binary_FSK/Signal From Workspace.1"]).value)
Input_Signal = [x for subvec in Input_Signal for x in subvec]
println("Input_Signal: $Input_Signal")
Принцип работы модулятора BFSK предельно прост, он функционирует как управляемый переключатель:
- На вход модулятора подается цифровой сигнал
Digital Data(последовательность битов: 0 и 1). - Модулятор содержит два генератора гармонических сигналов (Sine Wave):
Carrier Mark Freq: генерирует сигнал с частотой, соответствующей логической "1" (mark frequency). В нашей модели это частота ( f_1 ), период которой укладывается 5 раз за такт (Samples=5).Carrier Space Freq: генерирует сигнал с частотой, соответствующей логическому "0" (space frequency). В нашей модели это частота ( f_2 ), период которой укладывается 50 раз за такт (Samples=50).
- Управляющий сигнал
Digital Dataподается на управляющий порт переключателя, на выходе модулятора формируется BFSK-сигнал, готовый к передаче.
.png)
Ниже представлен график модулируемого сигнала для нашей последовательности бит.
Modulated_Signal = (collect(simout["Binary_FSK/FSK Modulator.Modulated Signal"]).value)
Modulated_Signal = [x for subvec in Modulated_Signal for x in subvec]
println("Input_Signal: $Input_Signal")
plot(Modulated_Signal)
Сигнал filt_1_minus_filt_2 представляет собой разность отфильтрованных компонент каналов "1" и "0" в демодуляторе. Его форма обусловлена следующими факторами:
-
Переключение битов вызывает резкие переходы между положительной и отрицательной областями, соответствующие смене передаваемого символа.
-
Инерционность фильтров (память системы) порождает затухающие колебания после каждого переключения, что объясняется конечной шириной полосы пропускания фильтров (видно из АЧХ).
-
Межсимвольная интерференция возникает из-за наложения откликов от предыдущих битов, что усложняет форму сигнала.
Главное: Для демодуляции используется не вся сложная форма сигнала, а только его знак в момент стробирования, что позволяет однозначно восстановить исходную битовую последовательность.
filt_1_minus_filt_2 = (collect(simout["Binary_FSK/FSK Demodulator/Add.1"]).value)
filt_1_minus_filt_2 = [x for subvec in filt_1_minus_filt_2 for x in subvec]
println("Input_Signal: $Input_Signal")
plot(filt_1_minus_filt_2)
Как мы видем в результате входной набор бит был безошибочно декодирован.
Demodulated_Signal = (collect(simout["Binary_FSK/FSK Demodulator.Demodulated Signal"]).value)
Demodulated_Signal = [x for subvec in Demodulated_Signal for x in subvec]
println("Input_Signal: $Input_Signal")
println("Demodulated_Signal: $(Demodulated_Signal[2:1100:end])")
display(plot(Demodulated_Signal))
Вывод
В результате проделанной работы была успешно создана и протестирована имитационная модель системы связи с бинарной частотной манипуляцией (BFSK). Сравнение переданной ([1, 0, 0, 1, 0]) и принятой последовательности подтвердило, что разработанная схема демодуляции корректно восстанавливает исходные данные в условиях идеального канала связи. Этот результат подтверждает работоспособность предложенной архитектуры с каскадом биквадратных фильтров и корректность выбора параметров системы, что является основой для дальнейшего усложнения модели, например, путем добавления шума в канал связи для оценки помехоустойчивости.