Фильтры дробной задержки направлены на сдвиг цифровой последовательности на неинтегрированное значение, посредством интерполяции и повторной дискретизации объединены в единый сверточный фильтр. В этом примере показана конструкция и реализация фильтров КИХ с дробной задержкой с использованием инструментов, доступных в DSP System Toolbox™.
Рассмотрим задержку цифрового сигнала, n-D], где D - целое число. Эта операция может быть представлена как = h * x, с конечной импульсной n] = δ [n-D]. Соответствующая передаточная - H (z) = z-D, а - H (λ) = e-iλ D. Программно реализовать такой фильтр целочисленной задержки можно с помощью следующего кода MATLAB ®.
% Create the FIR D = 3; % Delay value h = [zeros(1,D) 1]
h = 1×4
0 0 0 1
Сдвиг последовательности путем фильтрации ее через FIR h. Обратите внимание на начальные нули в начале выходного сигнала, которые обозначают начальное условие, присущее таким фильтрам.
x = (1:10)'; dfir = dsp.FIRFilter(h); y = dfir(x)'
y = 1×10
0 0 0 1 2 3 4 5 6 7
Задержка последовательности ] не определяется всякий раз, когда D не является целым числом. Чтобы сделать такие дробные задержки разумными, необходимо добавить промежуточный этап интерполяции D/A, чтобы выполнить выборку выходного сигнала на contniuum. То есть n-D), xnˆ обозначает некоторую D/A-интерполяцию входной последовательности x. D/A-интерполяционная xnˆ может зависеть от n и может рассматриваться как представление базовой модели аналогового сигнала, из которой была дискретизирована последовательность x. Эта стратегия используется в других проблемах повторной выборки, таких как преобразование ставок.
В этом примере представлены фильтры дробной задержки, использующие две модели интерполяции, обе из которых предлагаются как часть панели инструментов DSP Systems Toolbox.
Модель интерполяции на основе sinc, которая использует реконструкцию с ограничением полосы пропускания для
Модель интерполяции на основе Лагранжа, которая использует полиномиальную реконструкцию для
Интерполяционная формула Шеннона-Уиттакера t-k) моделирует сигналы с ограниченной полосой пропускания. То есть промежуточный xˆ D/A преобразования представляет собой ограниченную полосу частот реконструкцию входной последовательности. Для значения задержки D дробная (n-D), которая использует один и тот же xˆ для каждого n, может быть представлена как сверточный фильтр. Этот фильтр называется идеальным полосовым фильтром дробной задержки, и его импульсной характеристикой является
k-D).
Соответствующий частотный отклик (то есть DTFT) задаётся e-istartD .
Идеальным фильтром сдвига sinc, описанным в предыдущем разделе, является фильтр всех частот (то есть | = 1), но он имеет бесконечную и некаузальную импульсную характеристику hD. В MATLAB он не может быть представлен как вектор, а скорее как функция индекса k.
% Ideal Filter sequence
D = 0.4;
hIdeal = @(k) sinc(k-D); Для практических и вычислительных целей идеальный фильтр может быть усечен в окне конечного индекса, что приводит к некоторой потере полосы пропускания. Для целевого значения задержки и требуемой длины N окно индексов удовлетворяющих , симметрично относительно и захватывает главный лепесток идеального фильтра. Для + FD, 0≤FD≤1 и целое число i0, явными индексами окна ., i0+⌊N2 ⌋}. Целое число i0 называется целочисленной задержкой и может быть выбрано произвольно. Чтобы сделать КИО установите i0=⌊N-12 ⌋, так чтобы было {0,..., N-1}. Код ниже изображает обоснование причинного приближения FIR.
% FIR approximation with causal shift N = 6; idxWindow = (-floor((N-1)/2):floor(N/2))'; i0 = -idxWindow(1); % Causal latency hApprox = hIdeal(idxWindow); plot_causal_fir("sinc",D,N,i0,hApprox,hIdeal);
![Figure contains 2 axes. Axes 1 with title sinc-based Fractional Delay Non-Causal FIR, Truncated on [-2:3] contains 6 objects of type stem, patch, scatter, line, constantline. These objects represent Truncated FIR, Anti-Causal Indices, Causal Indices, Ideal Filter. Axes 2 with title Causal Shift of sinc-based Fractional Delay FIR, Truncated on [0:5] contains 3 objects of type stem, patch, constantline. These objects represent Truncated Causal FIR, All Causal Indices.](../../examples/dsp/win64/DesignOfFractionalDelayFiltersExample_01.png)
Усечение синк-фильтра вызывает пульсацию частотной характеристики, которая может быть устранена путем применения весов (таких как Кайзер или Хэмминг) к коэффициентам FIR.
Наконец, полученная модель аппроксимации КИХ идеального фильтра дробной задержки с ограниченной полосой частот приведена ниже.
0≤k≤N-10otherwise
Вы можете разработать такой фильтр с помощью designFracDelayFIR функции и dsp.VariableFractionalDelay Системный объект в 'FIR' режим, в которых используются веса окон Кайзера.
Фильтры дробной задержки на основе лагранжа используют полиномиальную подгонку на движущееся окно входных выборок. То есть является многочленом некоторой фиксированной степени K. Как и фильтры задержки на основе sinc, фильтры задержки на основе Лагранжа могут быть сформулированы как причинный КИХ сверток (то есть y * x) длины N = K + 1, и поддерживаются в индекса
0,..., K
Здесь t0,...,tK перечисляемые индексы окна выборки. Реализация проста.
% Filter parameters FD = 0.4; K = 7; % Polynomial degree N = K+1; % FIR Length idxWindow = (-floor((N-1)/2):floor(N/2))'; % Define and solve Lagrange interpolation equations V = idxWindow.^(0:K); % Vandermonde structure C = FD.^(0:K); hLagrange = C/V; % Solve for the coefficients i0 = -idxWindow(1); % Causal latency plot_causal_fir("Lagrange",FD,N,i0,hLagrange);
![Figure contains 2 axes. Axes 1 with title Lagrange-based Fractional Delay Non-Causal FIR, Supported on [-3:4] contains 4 objects of type stem, patch, constantline. These objects represent FIR, Anti-Causal Indices, Causal Indices. Axes 2 with title Causal Shift of Lagrange-based Fractional Delay FIR, Supported on [0:7] contains 3 objects of type stem, patch, constantline. These objects represent Causal FIR, All Causal Indices.](../../examples/dsp/win64/DesignOfFractionalDelayFiltersExample_02.png)
Эта модель может быть реализована как FIR-фильтр прямой формы, если значение задержки FD фиксировано, или с использованием структуры Фэрроу, если значение задержки изменяется. Ниже приведен раздел, посвященный реализации интерполяции Лагранжа с использованием dsp.VariableFractionalDelay в 'Farrow' режим.
Следующий раздел посвящен разработке и внедрению фильтров дробной задержки на основе sinc.
designFracDelayFIR в режиме проектирования длиныФункция designFracDelayFIR предоставляет простой интерфейс для проектирования фильтра КИХ с дробной задержкой значения задержки FD и длины N.
FD = 0.32381; N = 10; h = designFracDelayFIR(FD,N)
h = 1×10
0.0046 -0.0221 0.0635 -0.1664 0.8198 0.3926 -0.1314 0.0552 -0.0200 0.0042
Сама реализация может быть выполнена как стандартный фильтр FIR, такой как dsp.FIRFilter Системный объект.
% Create an FIR filter object
fdfir = dsp.FIRFilter(h); Задерживайте сигнал, фильтруя его через проектируемый фильтр.
% Generate some input n = (1:100)'; x = gen_input_signal(n); % Filter the input signal y = fdfir(x); plot_sequences(n,x, n,y); legend('Filter Output','Original Sequence') title('Raw Filter Output v.s. Input Sequence')

release(fdfir);
Обратите внимание, что фактическая задержка фильтра - не , а скорее i0 из-за причинной целочисленной i0. Эта задержка возвращается из designFracDelayFIR также функционируют. Сместите график входной последовательности на i0, чтобы выровнять выходной сигнал фильтра с ожидаемым результатом.
[h,i0] = designFracDelayFIR(FD,N); y = fdfir(x); plot_sequences(n+i0+FD,x, n,y); legend('Filter Output','Input Sequence (shifted by FD+i0)') title('Filter Output v.s. Time Adjusted Input Sequence')

Заметим, что сдвинутые входные маркеры, расположенные в [n]), обычно не совпадают с маркерами выходных выборок y [n]), + FD + i0 падает на неинтегрированные значения на оси x, тогда как n является целым числом. Вместо этого сдвинутые входные выборки попадают приблизительно на линию, соединяющую каждые две последовательные выходные выборки.
plot_sequences(n+i0+FD,x, n,y,'with line'); legend('Filter Output','Input Sequence (shifted by FD+i0)') title('Output Samples v.s. Shifted Input Samples ') xlim([20,30])

dsp.VariableFractionalDelay Системный объект в 'FIR' СпособАналогично designFracDelayFIR, dsp.VariableFractionalDelay объект может также создавать фильтры задержки на основе sinc при использовании с 'FIR' интроляционный режим. Начните с создания экземпляра объекта System. Длина FIR всегда четная и задается как параметр половинной длины.
vfd_fir = dsp.VariableFractionalDelay('InterpolationMethod','FIR','FilterHalfLength',N/2); i0_vfd_fir = vfd_fir.FilterHalfLength; % Interger latency
Передайте требуемую дробную задержку в качестве второго входного аргумента вызову объекта. Убедитесь, что указанное значение задержки включает целочисленную задержку.
y = vfd_fir(x,i0+FD); release(vfd_fir) plot_sequences(n+i0+FD,x, n,y); legend('Filter Output','Input Sequence (shifted by FD+i0)') title('dsp.VariableFractionalDelay in FIR Mode')

designFracDelayFIR и dsp.VariableFractionalDelay в режиме «FIR»Оба designFracDelayFIR и dsp.VariableFractionalDelay в 'FIR' режим обеспечивает фильтры дробной задержки на основе sinc, но их реализации отличаются.
dsp.VariableFractionalDelay аппроксимирует значение задержки рациональным числом вплоть до некоторого допуска, а затем отсчитывает дробную задержку в качестве k-й фазы (длинного) интерполяционного фильтра длины L. Это требует увеличения использования памяти и дает менее точную задержку.
Напротив, designFracDelayFIR генерирует коэффициенты FIR непосредственно, а не производит их выборку из более длинного FIR. Это дает точное значение дробной задержки и стоит меньше памяти.
designFracDelayFIR имеет простой функциональный интерфейс, возвращающий коэффициенты FIR, оставляя реализацию фильтра пользователю. dsp.VariableFractionalDelay Системный объект предназначен для полного инкапсулирования конструкции и реализации фильтра.
Использование designFractionalDelayFIR является более предпочтительным, чем dsp.VariableFractionalDelay в 'FIR' режим для его простоты, лучшей производительности и эффективности. На рисунке ниже фильтр разработан с dsp.VariableFractionalDelay имеет более короткую полосу пропускания, а его групповая задержка отключена на ~ 0,02 от номинального значения .
% Obtain the FIR coefficients from the dsp.VariableFractionalDelay object h_vfd_fir = vfd_fir([1;zeros(31,1)],i0_vfd_fir+FD); release(vfd_fir); plot_freq_and_gd(h,i0,[],"designFracDelayFIR", h_vfd_fir,i0_vfd_fir,[],"dsp.VariableFractionalDelay FIR mode"); hold on; yline(FD,'DisplayName','Target Fractional Delay'); ylim([-0.1,0.4])

Фильтр дробной задержки на основе лагранжа является экономичным в вычислительном отношении и может быть эффективно реализован с использованием структуры Фэрроу. Фильтр Фэрроу - особый тип FIR, реализуемый с помощью только элементарных алгебраических операций, таких как скалярные сложения и умножения. В отличие от конструкций на основе sinc, фильтры Фэрроу не требуют специализированных функций (таких как sinc или Бессель) для вычисления коэффициентов FIR задержки. Это делает фильтры дробной задержки Фэрроу особенно простыми для реализации на базовом оборудовании.
С обратной стороны, фильтры задержки на основе Лагранжа ограничены низкими порядками, из-за очень нестабильного характера полиномиальных приближений высокой степени. Обычно это приводит к более низкой полосе пропускания по сравнению с фильтром на основе sinc.
dsp.VariableFractionalDelay в 'Farrow' modeИспользовать системный объект dsp.VariableFractionalDelay в 'Farrow' для создания и реализации фильтров задержки Farrow. Начните с создания экземпляра системного объекта:
vfd = dsp.VariableFractionalDelay('InterpolationMethod','Farrow','FilterLength',8); i0var = floor(vfd.FilterLength/2) % Interger latency of the filter
i0var = 4
Примените созданный объект к входному сигналу и постройте график результата.
y = vfd(x,i0var+FD); plot_sequences(n+i0var+FD,x, n,y); legend('Farrow Fractional Delay Output','Input Sequence (shifted by FD+i0)') title('dsp.VariableFractionalDelay in Farrow Mode')

Можно также изменять значения дробной задержки. Приведенный ниже код работает на кадрах из 20 выборок, увеличивая значение задержки с каждым кадром. Обратите внимание на увеличение задержки на выходном графике, соответствующее изменениям значений задержки.
release(vfd) FDs = i0var+5*(0:0.2:0.8); % Fractional delays vector xsource = dsp.SignalSource(x,20); ysink = dsp.AsyncBuffer; for FD=FDs xk = xsource(); yk = vfd(xk, FD); write(ysink,yk); end y = read(ysink); plot_sequences(n+i0var,x, n,y); legend('Variable Fractional Delay Output','Original Sequence (shifted by i0)') title('dsp.VariableFractionalDelay in Farrow Mode, Varying Delay')

Более длинные фильтры дают лучшее приближение идеального фильтра задержки. Действительно, с точки зрения необработанных квадратичных норм это так. Однако нам нужна более значимая метрика, например, пропускная способность. Функция designFracDelayFIR измеряет комбинированную полосу пропускания, которая определяется как диапазон частот, в котором коэффициент усиления и групповая задержка находятся в пределах 1% от их номинальных значений. Измеренная комбинированная полоса пропускания может быть получена как возвращаемое значение designFracDelayFIR функция. Сравните фильтр длиной 16 (синий) с фильтром длиной 256 (красный) на рисунке ниже. Как и ожидалось, более длинный фильтр имеет значительно более высокую комбинированную полосу пропускания.
FD = 0.3; N1 = 16; N2 = 256; [h1,i1,bw1] = designFracDelayFIR(FD, N1); [h2,i2,bw2] = designFracDelayFIR(FD, N2); plot_freq_and_gd(h1,i1,bw1,"N="+num2str(N1), h2,i2,bw2,"N="+num2str(N2)); ylim([-0.2,0.6])

designFracDelayFIR в режиме проектирования полосы пропусканияРежим проектирования полосы пропускания designFracDelayFIR может определить требуемую длину для данной полосы пропускания. Укажите значение задержки и требуемую целевую полосу пропускания в качестве входных данных функции, и функция найдет соответствующую длину.
FD = 0.3;
bwLower = 0.9; % Target bandwidth lower limit
[h,i0fixed,bw] = designFracDelayFIR(FD,bwLower);
fdfir = dsp.FIRFilter(h);
info(fdfir)ans = 6x35 char array
'Discrete-Time FIR Filter (real) '
'------------------------------- '
'Filter Structure : Direct-Form FIR'
'Filter Length : 52 '
'Stable : Yes '
'Linear Phase : No '
Обратите внимание, что bwLower является просто нижней границей для комбинированной полосы пропускания. Функция возвращает фильтр, комбинированная полоса пропускания которого равна, по крайней мере, значению, указанному в bwLow.
В этом разделе мы сравним производительность двух точек проектирования (long sinc v.s. short Lagrange) с вводом с высокой пропускной способностью. dsp.VariableFractionalDelay в предыдущем разделе представлена 8-градусная структура Фэрроу, фактически КИХ длиной 9. Фильтр, полученный designFracDelayFIR(FD,0.9) имеет длину 52 образца. Объединение двух частотных откликов КИХ на одном графике демонстрирует разницу в полосе пропускания между ними.
release(vfd); hvar = vfd([1;zeros(31,1)],i0var+FD); plot_freq_and_gd(h,i0fixed,bw,"Sinc-based", hvar,i0var,[],"Farrow"); ylim([-0.2,0.6])

Примените два фильтра к сигналу с высокой пропускной способностью, как показано на рисунке ниже. Синк в левом столбце, Фэрроу в правом. Временная область в верхнем ряду, частота в нижнем. Результаты, как и ожидалось:
Более длинный sinc-фильтр имеет более высокую полосу пропускания. Более короткий фильтр Фэрроу имеет меньшую полосу пропускания.
Искажение сигнала практически отсутствует при использовании более длинного синк-фильтра, но легко заметно в более коротком Фэрроу-фильтре.
Более высокая точность достигается за счет большей латентности: приблизительно 25 выборок v.s. только 4 в более коротком фильтре.
n=(1:80)'; x = high_bw_signal(n); y1 = fdfir(x); y2 = vfd(x,i0var+FD); plot_signal_comparison(n,x,y1,y2,h,hvar,i0fixed,i0var,FD);

dsp.VariableFractionalDelay или designFracDelayFIR ?Это решение в значительной степени основано на требованиях к фильтру и целевой платформе.
Для обеспечения высокой пропускной способности и точного ответа на групповую задержку используйте designFracDelayFIR функция. Помните, что этот процесс конструирования требует больших вычислительных затрат. Следовательно, лучше ли это подходит для развертывания на аппаратных средствах более высокого уровня, особенно если требуется настройка значения задержки в реальном времени. Он также подходит для развертывания оборудования нижнего уровня, если значение задержки фиксировано, и проектирование может быть выполнено в автономном режиме.
Для изменяющихся во времени фильтров задержки, предназначенных для низкоэффективных вычислительных устройств, используйте dsp.VariableFractionalDelay с 'Farrow' режим.