Дробная задержка с фильтром Фарроу
Фильтр Фарроу — это цифровой интерполяционный фильтр, который может быть использован для передискретизации (изменения частоты дискретизации) сигналов с нецелым коэффициентом. Он был предложен Крисом Фарроу (Chris Farrow) в 1988 году.
Как работает фильтр Фарроу?
-
Входной сигнал разбивается на отрезки (обычно по 4 отсчёта для кубической интерполяции).
-
Для каждого нового значения между отсчётами вычисляется полиномиальная аппроксимация.
-
Положение нового отсчёта определяется дробным задержкой (например, между
x[n]
иx[n+1]
). -
На выходе получается сигнал с новой частотой дискретизации.
В этом примере мы рассмотрим применение фильтра Фарроу для реализации дробной задержки сигналов, что особенно полезно в цифровой обработке сигналов (ЦОС), телекоммуникациях, РЛС и аудиосистемах.
Дробная задержка — это сдвиг сигнала на дробное число отсчётов (например, на 0.5
, 0.73
или 1.25
от периода дискретизации).
-
Целая задержка (
1, 2, 3…
) легко реализуется буфером FIFO. -
Дробная задержка требует интерполяции между отсчётами, и здесь помогает фильтр Фарроу.
Пример описывает две реализации блочных моделей фильтра Фарроу - первого и третьего порядка. В общем случае структура основывается на КИХ-фильтрах и схеме интерполяционного полинома:

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

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

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

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

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

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

Воспользуемся функцией автоматического запуска модели:
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
start_model_engee();
Соберём выходные данные (импульсные характеристики фильтров) и построим их АЧХ:
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-й порядок")
Как можно заметить, с ростом порядка фильтра увеличивается его линейность и расширяется полоса пропускания. Фильтры малых порядков успешно справляются лишь с сигналами на низких частотах, в то время как фильтры более высоких порядков могут работать в широком диапазоне частот входящих сигналов.
Заключение
Преимущества фильтра Фарроу для дробной задержки:
✅ Гибкость — можно задавать любую дробную задержку (0.1
, 0.75
и т. д.).
✅ Умеренная вычислительная сложность — требует меньше ресурсов, чем sinc-интерполяция.
✅ Хорошее качество — кубическая интерполяция даёт лучшую точность, чем линейная.
Применение дробной задержки:
-
Синхронизация в цифровой связи (подстройка тактового сигнала).
-
Аудиоэффекты (плавный pitch-shifting, фазовые корректоры).
-
Радарные и гидролокационные системы (точное временное выравнивание сигналов).
-
Адаптивные фильтры (подстройка задержки в системах noise cancellation).
Фильтр Фарроу — это эффективный способ реализации дробной задержки с балансом между точностью и вычислительными затратами. Он особенно полезен в задачах, где требуется плавное изменение задержки без потери качества сигнала.