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

Дробная задержка с фильтром Фарроу

Фильтр Фарроу — это цифровой интерполяционный фильтр, который может быть использован для передискретизации (изменения частоты дискретизации) сигналов с нецелым коэффициентом. Он был предложен Крисом Фарроу (Chris Farrow) в 1988 году.

Как работает фильтр Фарроу?

  1. Входной сигнал разбивается на отрезки (обычно по 4 отсчёта для кубической интерполяции).

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

  3. Положение нового отсчёта определяется дробным задержкой (например, между x[n] и x[n+1]).

  4. На выходе получается сигнал с новой частотой дискретизации.

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

Дробная задержка — это сдвиг сигнала на дробное число отсчётов (например, на 0.5, 0.73 или 1.25 от периода дискретизации).

  • Целая задержка (1, 2, 3…) легко реализуется буфером FIFO.

  • Дробная задержка требует интерполяции между отсчётами, и здесь помогает фильтр Фарроу.

Пример описывает две реализации блочных моделей фильтра Фарроу - первого и третьего порядка. В общем случае структура основывается на КИХ-фильтрах и схеме интерполяционного полинома:

image_2.png

Реализация фильтров Фарроу в модели

Модель fractional_delay.engee содержит две подсистемы фильтров Фарроу. Подсистема Первый_порядок реализует простую схему линейной интерполяции:

image.png

В то время как подсистема Третий_порядокбольше напоминает общую структуру Фарроу, и содержит в себе три КИХ-фильтра:

image.png

Причём второй и третий КИХ-фильтры реализованы в виде блоков Дискретный КИХ-фильтр библиотеки обработки сигналов, а первый - в виде подсистемы, где из примитивных арифметических элементов собрана прямая структура обратно-симметричного КИХ-фильтра:

image.png

Общая модель рассматривает прохождение синусоидального сигнала частотой 50 Гц через две подсистемы на частоте дискретизации в 1000 Гц с коэффициентом дробной задержки в 0.3 периода:

image.png

На графиках во временной области можно заметить, что линейный фильтр (1-г порядка) успешно вносит дробную задержку в 0.3 периода. Это отчётливо видно на области прохождения синусоид через ноль. Фильтр 3-го порядка имеет более сложную структуру и вносит дополнительную групповую задержку в 1 период - результирующая задержка в итоге составляет 1.3 периода:

image.png

Анализ АЧХ фильтров Фарроу

Если оба фильтра справляются с задачей внесения дробной задержки, то на что же влияет сложность структуры и порядок фильтра?

Для этого нам необходимо проанализировать их частотные характеристики. Одним из способов анализа является подача на вход линейной стационарной системы (фильтра) единичного импульса. Выход фильтра в таком случае будет отражать его импульсную характеристику, от которой несложно перейти к амплитудно-частотной характеристике (АЧХ). Вспомогательная модель fractional_delay_impulse.engeeв качестве источника сигнала имеет блок источника дискретного импульса, а также содержит два блока В рабочую область для автоматизации анализа фильтров функциями библиотеки DSP.jl:

image.png

Воспользуемся функцией автоматического запуска модели:

In [ ]:
function start_model_engee()
    try
        engee.close("fractional_delay_impulse", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/fractional_delay_impulse.engee") # загрузка модели
        end;

    try
        engee.run(m, verbose=true) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/fractional_delay_impulse.engee") # загрузка модели
            engee.run(m, verbose=true) # запуск модели
        end
end
Out[0]:
start_model_engee (generic function with 1 method)
In [ ]:
start_model_engee();
Building...
Progress 0%
Progress 100%
Progress 100%

Соберём выходные данные (импульсные характеристики фильтров) и построим их АЧХ:

In [ ]:
using DSP
fs = 1000;
dataframe1 = collect(data1);
dataframe3 = collect(data3);
b1 = dataframe1.value;
b3 = dataframe3.value;
farrow_1 = PolynomialRatio(b1, 1);
farrow_3 = PolynomialRatio(b3, 1);
H1, w1 = freqresp(farrow_1);
H3, w3 = freqresp(farrow_3);
freq_vec = fs*w1/(2*pi);
plot(freq_vec, pow2db.(abs.(H1))*2, 
                    linewidth=3, 
                    title = "АЧХ фильтров Фарроу", 
                    xguide = "Частота, Гц",
                    label = "Линейный фильтр")
plot!(freq_vec, pow2db.(abs.(H3))*2, 
                    linewidth=3, 
                    yguide = "Амплитуда, дБ",
                    label = "3-й порядок") 
Out[0]:

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

Заключение

Преимущества фильтра Фарроу для дробной задержки:

Гибкость — можно задавать любую дробную задержку (0.1, 0.75 и т. д.).
Умеренная вычислительная сложность — требует меньше ресурсов, чем sinc-интерполяция.
Хорошее качество — кубическая интерполяция даёт лучшую точность, чем линейная.

Применение дробной задержки:

  • Синхронизация в цифровой связи (подстройка тактового сигнала).

  • Аудиоэффекты (плавный pitch-shifting, фазовые корректоры).

  • Радарные и гидролокационные системы (точное временное выравнивание сигналов).

  • Адаптивные фильтры (подстройка задержки в системах noise cancellation).

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

Блоки, использованные в примере