Документация Engee
Notebook

Фильтр Гильберта

Фильтр Гильберта – это линейный электронный (или цифровой) фильтр, который осуществляет фазовый сдвиг на 90° для всех частот входного сигнала, не изменяя его амплитуды. От большинства фильтров, которые мы рассматривали в других примерах, мы требовали частотной избирательности, то есть усиления или ослабления сигнала в определённых полосах, в то время как фильтр Гильберта должен вести себя как идеальный фазовращатель.

Ключевые понятия:

  • Выходной сигнал фильтра Гильберта – это гильбертово преобразование входного сигнала

  • Фильтр Гильберта не изменяет амплитуду сигнала на любой частоте (идеальный случай)

  • Для реализации используются КИХ- или БИХ-фильтры с приближённой характеристикой

  • Комбинация исходного сигнала и его гильбертова преобразования позволяет получить аналитический сигнал - комплексный сигнал, состоящий из исходного вещественного сигнала и квадратуры в качестве мнимой части

Фильтр Гильберта повсеместно используется в задачах ЦОС, но в нашем примере мы конкретно рассмотрим его применение для выделения огибающей периодического дискретного сигнала.

Прототип фильтра Гильберта

Синтезируем коэффициенты требуемого фильтра при помощи метода remez. Наш прототип будет иметь длину в 65 отсчётов. Отобразим импульсную характеристику (т.е. отсчёты вектора Num):

In [ ]:
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 = "Импульсная характеристика фильтра Гильберта")
Out[0]:

Мы видим обратную симметрию коэффициентов, а также чередующиеся нули в отсчётах - типичный вид характеристики для фильтров Гильберта с нечётным количеством отсчётов.

Теперь рассчитаем и отобразим АЧХ и ФЧХ фильтра. Мы планируем использовать его для сигналов с частотой дискретизации в 5000 Гц:

In [ ]:
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))
Out[0]:
In [ ]:
phi, w = phaseresp(myfilt);
plot(freq_vec, rad2deg.(phi), linewidth = 3, 
    xlabel = "Частота, Гц", legend = false,
    ylabel = "Фаза, град",
    title = "ФЧХ фильтра Гильберта")
Out[0]:

ФЧХ линейна в широкой области частот, и АЧХ также не искажает амплитуду, почти покрывая всю первую зону Найквиста (от 0 до 2500 Гц). Впрочем, приближаясь к верхней или нижней границе фильтр будет работать не так эффективно, что мы и заметим на симуляции в динамической модели.

Модель фильтра Гильберта

Рассмотрим динамическую модель Hilbert_filter.engee:

image.png

Она содержит:

  • блок источника амплитудно-модулированного синусоидального сигнала с возможностью выбора несущей частоты (частота модуляции - всегда 10 Гц)

  • блок КИХ-фильтра с коэффициентами прототипа фильтра Гильберта Num

  • компенсирующую линию задержки в 32 отсчёта (ntaps -1 / 2)

  • блок формирования комплексного сигнала из сигналов действительной и мнимой части

  • блок вычисления модуля комплексного числа

Симуляция с параметрами модели по-умолчанию

Запустив модель, в окне графиков можно наблюдать формы сигналов real, imag и mag. Последний отвечает за вычисление огибающей аналитического сигнала. При несущей частоте в 200 Гц сигналы выглядят вот так:

image.png

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

Промотав в окне графиков ниже можно наблюдать сравнение действительного и аналитического сигналов в частотной области:

image.png

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

Изменение частоты источника сигнала

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

image.png

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

image.png

Если нужно расширить эффективную полосу пропускания - придётся увеличивать порядок фильтра.

В области частот также можно наблюдать не такое эффективное подавление отрицательных частот аналитического сигнала:

image.png

Ну а для сигнала с несущей в 500 Гц таких искажений не будет, так как он в области АЧХ, не искажающей амплитуду.

Заключение

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