Фильтр Гильберта
Фильтр Гильберта – это линейный электронный (или цифровой) фильтр, который осуществляет фазовый сдвиг на 90° для всех частот входного сигнала, не изменяя его амплитуды. От большинства фильтров, которые мы рассматривали в других примерах, мы требовали частотной избирательности, то есть усиления или ослабления сигнала в определённых полосах, в то время как фильтр Гильберта должен вести себя как идеальный фазовращатель.
Ключевые понятия:
-
Выходной сигнал фильтра Гильберта – это гильбертово преобразование входного сигнала
-
Фильтр Гильберта не изменяет амплитуду сигнала на любой частоте (идеальный случай)
-
Для реализации используются КИХ- или БИХ-фильтры с приближённой характеристикой
-
Комбинация исходного сигнала и его гильбертова преобразования позволяет получить аналитический сигнал - комплексный сигнал, состоящий из исходного вещественного сигнала и квадратуры в качестве мнимой части
Фильтр Гильберта повсеместно используется в задачах ЦОС, но в нашем примере мы конкретно рассмотрим его применение для выделения огибающей периодического дискретного сигнала.
Прототип фильтра Гильберта
Синтезируем коэффициенты требуемого фильтра при помощи метода remez
. Наш прототип будет иметь длину в 65 отсчётов. Отобразим импульсную характеристику (т.е. отсчёты вектора Num
):
using DSP
myHBT = remez(65, [(0.05, 0.95) => 1]; Hz = 2, neg=true);
Num = reverse(myHBT);
plot(Num, line=:stem, marker=:circle, linewidth = 2, legend = false,
title = "Импульсная характеристика фильтра Гильберта")
Мы видим обратную симметрию коэффициентов, а также чередующиеся нули в отсчётах - типичный вид характеристики для фильтров Гильберта с нечётным количеством отсчётов.
Теперь рассчитаем и отобразим АЧХ и ФЧХ фильтра. Мы планируем использовать его для сигналов с частотой дискретизации в 5000 Гц:
myfilt = PolynomialRatio(Num,1);
H, w = freqresp(myfilt);
freq_vec = 5000*w/(2*pi);
plot(freq_vec, pow2db.(abs.(H))*2, linewidth=3,
xlabel = "Частота, Гц", legend = false,
ylabel = "Амплитуда, дБ",
title = "АЧХ фильтра Гильберта",
ylim=(-30,5))
phi, w = phaseresp(myfilt);
plot(freq_vec, rad2deg.(phi), linewidth = 3,
xlabel = "Частота, Гц", legend = false,
ylabel = "Фаза, град",
title = "ФЧХ фильтра Гильберта")
ФЧХ линейна в широкой области частот, и АЧХ также не искажает амплитуду, почти покрывая всю первую зону Найквиста (от 0 до 2500 Гц). Впрочем, приближаясь к верхней или нижней границе фильтр будет работать не так эффективно, что мы и заметим на симуляции в динамической модели.
Модель фильтра Гильберта
Рассмотрим динамическую модель Hilbert_filter.engee
:

Она содержит:
-
блок источника амплитудно-модулированного синусоидального сигнала с возможностью выбора несущей частоты (частота модуляции - всегда 10 Гц)
-
блок КИХ-фильтра с коэффициентами прототипа фильтра Гильберта
Num
-
компенсирующую линию задержки в 32 отсчёта (ntaps -1 / 2)
-
блок формирования комплексного сигнала из сигналов действительной и мнимой части
-
блок вычисления модуля комплексного числа
Симуляция с параметрами модели по-умолчанию
Запустив модель, в окне графиков можно наблюдать формы сигналов real, imag
и mag
. Последний отвечает за вычисление огибающей аналитического сигнала. При несущей частоте в 200 Гц сигналы выглядят вот так:

Мы можем наблюдать формирование квадратурной составляющей (со сдвигом в 90 градусов относительно исходного действительного сигнала), а также плавную форму модуля аналитического сигнала, т.е. огибающей.
Промотав в окне графиков ниже можно наблюдать сравнение действительного и аналитического сигналов в частотной области:

У действительного сигнала пики находятся на частотах -210 Гц, -190 Гц, 190 Гц и 210 Гц. Обратите внимание на эффективное подавление отрицательной области частот фильтром Гильберта для аналитического сигнала.
Изменение частоты источника сигнала
Источник сигнала в модели позволяет быстро менять несущую частоту при помощи маски с выпадающим списком:

Если изменить значение на 100 Гц и запустить симуляцию, можно убедиться, что при приближении к нижней границе полосы пропускания КИХ-фильтра, форма огибающей начинает искажаться:

Если нужно расширить эффективную полосу пропускания - придётся увеличивать порядок фильтра.
В области частот также можно наблюдать не такое эффективное подавление отрицательных частот аналитического сигнала:

Ну а для сигнала с несущей в 500 Гц таких искажений не будет, так как он в области АЧХ, не искажающей амплитуду.
Заключение
Мы рассмотрели пример анализа прототипа фильтра Гильберта, а также динамическую модель на основе КИХ-реализации - приближения, работающего в ограниченной полосе частот.