Проект фильтров дробной задержки конечной импульсной характеристики

Фильтры дробной задержки направлены на перемену цифровой последовательности на нецелочисленное значение через интерполяцию и повторную дискретизацию, объединенные в один фильтр свертки. Этот пример демонстрирует проект и реализацию дробных фильтров конечной импульсной характеристики задержки с помощью инструментов, доступных в DSP System Toolbox™.

Задержка как система свертки

Целые числа целочисленных задержек

Рассмотрим задержку цифрового сигнала, y[n]=x[n-D] где D - целое число. Эта операция может быть представлена как фильтр свертки y=h*x, с конечной импульсной характеристикой h[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

Сдвиньте последовательность путем фильтрации ее через конечную импульсную характеристику 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/A интерполяцию

Задержка последовательности x[n-D] не определяется всякий раз, когда D не является целым числом. Чтобы сделать такие дробные задержки разумными, необходимо добавить промежуточный D/A каскад интерполяции, чтобы дискретизировать выход на contniuum. То есть, y[n]=xnˆ(n-D) где xnˆ обозначает некоторую D/A интерполяцию входного секвенирования x. Интерполяционная функция D/Axnˆ может зависеть от n и может рассматриваться как представление базовой модели аналогового сигнала, от которой зависит последовательность x был взят образец. Эта стратегия используется в других задачах повторной дискретизации, таких как преобразование скорости.

В этом примере будут представлены фильтры дробной задержки, использующие две модели интерполяции, обе из которых предлагаются как часть DSP Systems Toolbox.

  1. Модель интерполяции на основе sinc, которая использует полосно-ограниченную реконструкцию для xnˆ.

  2. Основанная на Лагранже интерполяционная модель, которая использует полиномиальную реконструкцию для xnˆ.

Полосно-ограниченные фильтры дробной задержки

Формула интерполяции Шеннона-Уиттакера xˆ(t)=kx[k]sinc(t-k) моделирует полосно-ограниченные сигналы. То есть промежуточное D/A преобразование xˆ является полосно-ограниченной реконструкцией входа последовательности. Для значения задержки D, дробной задержки y[n]=xˆ(n-D), который использует то же самое xˆ для каждого n может быть представлен как фильтр свертки. Этот фильтр называется идеальным полосно-ограниченным дробным фильтром задержки, и его импульсная характеристика

hD[k]=sinc(k-D).

Соответствующая частотная характеристика (то есть DTFT) задается как HD(ω)=e-iωD.

Причинно-следственная конечная импульсная характеристика Приближения идеального полосно-ограниченного сдвигового фильтра

Идеальный фильтр сдвига синуса, описанный в предыдущем разделе, является полнопроходным фильтром (т.е. |Hd(ω)|=1), но он имеет бесконечную и не причинно-следственную импульсную характеристику hD. В MATLAB он не может быть представлен как вектор, а скорее как функция от индекса k.

% Ideal Filter sequence
D = 0.4;
hIdeal = @(k) sinc(k-D); 

Для практических и вычислительных целей идеальный фильтр может быть усечен в конечном индексе окне за счет некоторой потери полосы пропускания. Для целевого значения задержки D и желаемую длину N, окно индексов kудовлетворение |D-k|N2 симметрично около D, и захватывает основную лепестку идеального фильтра. Для D=i0+FD где 0FD1 и целое число i0, явные индексы окна{i0-N-12,,i0+N2}. Целое число i0 упоминается как целочисленная задержка и может быть выбрана произвольно. Чтобы сделать конечную импульсную характеристику причинно-следственную связь, установите i0=N-12, поэтому окно индекса {0,,N-1}. Приведенный ниже код изображает обоснование причинно-следственной конечной импульсной характеристики приближения.

% 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.

Усечение фильтра sinc вызывает пульсацию в частотной характеристики, которая может быть решена путем применения весов {wk} (такой как Кайзер или Хемминг) к КИХ коэффициентам.

Наконец, полученная конечной импульсной характеристикой приближения модель идеального полосно-ограниченного дробного фильтра задержки приведена ниже.

h[k]=wkhd[k]={wksinc(k-FD-i0)0kN-10otherwise 

Вы можете спроектировать такой фильтр, используя designFracDelayFIR функции и dsp.VariableFractionalDelay Системный объект в 'FIR' режим, в обоих из которых используются веса окон Кайзера.

Фракционные фильтры задержки на основе лагранжа

Фракционные фильтры задержки на основе Лагранжа используют полиномиальную аппроксимацию на движущемся окне входа отсчетов. То есть, xnˆ(t) является полиномом некоторой фиксированной степени K. Как и основанные на sinc фильтры задержки, основанные на Лагранже фильтры задержки могут быть сформулированы как причинная свертка конечной импульсной характеристики (т.е. y=h*x) длины N = K + 1 и поддерживается в окне индекса{-N-12,N2}. Подобно модели на основе синуса, примените причинно-следственную задержку i0=N-12. Учитывая дробную задержку FD, коэффициенты конечной импульсной характеристики h[0],,h[K] (причинно-сдвинутый) фильтр Лагранжа задержки может быть получен путем решения системы линейных уравнений, как написано ниже. Эти уравнения описывают стандартную задачу полинома Лагранжа.

k=0Ktnkh[k]=(FD)n,n=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.

Эта модель может быть реализована как фильтр конечной импульсной характеристики прямой формы, если значение задержки FD фиксировано, или с помощью структуры Farrow, если значение задержки изменяется. Ниже приведен раздел, посвященный реализации интерполяции Лагранжа с использованием 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

Сама реализация может быть выполнена как стандартный конечная импульсная характеристика, такой как 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')

Figure contains an axes. The axes with title Raw Filter Output v.s. Input Sequence contains 2 objects of type scatter. These objects represent Filter Output, Original Sequence.

release(fdfir);

Заметьте, что фактическая задержка фильтра не FD, но скорее FD+i0 из-за причинно-следственной целочисленной задержки i0. Эта задержка возвращается из designFracDelayFIR функция также. Сдвиньте график последовательности входа на FD+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')

Figure contains an axes. The axes with title Filter Output v.s. Time Adjusted Input Sequence contains 2 objects of type scatter. These objects represent Filter Output, Input Sequence (shifted by FD+i0).

Обратите внимание, что сдвинутые входные маркеры, расположенные в (n+FD+i0,x[n]) обычно не совпадают с маркерами выходных выборок (n,y[n]), потому что 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])

Figure contains an axes. The axes with title Output Samples v.s. Shifted Input Samples contains 3 objects of type scatter, line. These objects represent Filter Output, Input Sequence (shifted by FD+i0).

The dsp.VariableFractionalDelay Системный объект в 'FIR' Способ

Аналогично designFracDelayFIR, а dsp.VariableFractionalDelay объект может также проектировать основанные на sinc фильтры задержки при использовании с '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')

Figure contains an axes. The axes with title dsp.VariableFractionalDelay in FIR Mode contains 2 objects of type scatter. These objects represent Filter Output, Input Sequence (shifted by FD+i0).

Сравнение designFracDelayFIR и dsp.VariableFractionalDelay в режиме ' конечной импульсной характеристике'

Оба designFracDelayFIR и dsp.VariableFractionalDelay в 'FIR' mode обеспечивают основанные на sinc фильтры дробной задержки, но их реализации различаются.

  • The dsp.VariableFractionalDelay аппроксимирует значение задержки на рациональное число FDkL до некоторого допуска, и затем дискретизирует дробную задержку как k-ю фазу (длинного) интерполяционного фильтра длины L. Это требует увеличенного использования памяти и приводит к меньшей точной задержке.

  • Напротив, designFracDelayFIR генерирует коэффициенты конечной импульсной характеристики непосредственно, а не дискретизирует их из более длинной конечной импульсной характеристики. Это дает точное значение дробной задержки и стоит меньше памяти.

  • The designFracDelayFIR имеет простой функциональный интерфейс, возвращающий коэффициенты конечной импульсной характеристики, оставляя реализацию фильтра пользователю. The 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])

Figure contains 2 axes. Axes 1 with title Gain response contains 2 objects of type line. These objects represent Gain ResponsedesignFracDelayFIR, Gain Response dsp.VariableFractionalDelay FIR mode. Axes 2 with title Group Delay (i0 adjusted) contains 3 objects of type line, constantline. These objects represent Group Delay designFracDelayFIR, Group Delay dsp.VariableFractionalDelay FIR mode, Target Fractional Delay.

Проектирование и реализация основанных на Лагранже фильтров задержки

Фракционный фильтр задержки на основе Лагранжа является в вычислительном отношении дешевым и может быть эффективно реализован с использованием структуры Фэрроу. Фильтр Фэрроу является специальным типом конечной импульсной характеристикой, который реализован с использованием только элементарных алгебраических операций, таких как скалярные сложения и умножения. В отличие от проектов на основе sinc, фильтры Фэрроу не требуют специализированных функций (таких как sinc или Bessel), чтобы вычислить коэффициенты конечной импульсной характеристики задержки. Это делает фильтры дробной задержки Farrow особенно простыми в реализации на основном оборудовании.

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

Системный объект 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')

Figure contains an axes. The axes with title dsp.VariableFractionalDelay in Farrow Mode contains 2 objects of type scatter. These objects represent Farrow Fractional Delay Output, Input Sequence (shifted by FD+i0).

Можно также изменить значения дробной задержки. Приведенный ниже код работает с системами координат 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')

Figure contains an axes. The axes with title dsp.VariableFractionalDelay in Farrow Mode, Varying Delay contains 2 objects of type scatter. These objects represent Variable Fractional Delay Output, Original Sequence (shifted by i0).

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

Более длинные фильтры дают лучшее приближение идеального фильтра задержки. Действительно, с точки зрения необработанных квадратичных норм это так. Однако нам нужна метрика, которая является более практически значимой, например, полоса пропускания. Функция 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])

Figure contains 2 axes. Axes 1 with title Gain response contains 4 objects of type line, constantline. These objects represent Gain ResponseN=16, Gain Response N=256, Combined Bandwidth N=16, Combined Bandwidth N=256. Axes 2 with title Group Delay (i0 adjusted) contains 4 objects of type line, constantline. These objects represent Group Delay N=16, Group Delay N=256, Combined Bandwidth N=16, Combined Bandwidth N=256.

Функциональная 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.

Искажение в сигналах с высокой пропускной способностью

В этом разделе мы сравниваем эффективность двух проектов (длинный sinc против короткого Lagrange) с высоким входом в полосу пропускания. The 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])

Figure contains 2 axes. Axes 1 with title Gain response contains 2 objects of type line. These objects represent Gain ResponseSinc-based, Gain Response Farrow. Axes 2 with title Group Delay (i0 adjusted) contains 2 objects of type line. These objects represent Group Delay Sinc-based, Group Delay Farrow.

Примените эти два фильтра к сигналу с высокой пропускной способностью, по сравнению с рисунком ниже. Sinc на левом столбце, Farrow на правом. Временной интервал в верхней строке, частота в нижней части. Результаты, как и ожидалось:

  • Более длинный фильтр sinc имеет более высокую пропускную способность. Более короткий фильтр Фэрроу имеет более низкую полосу пропускания.

  • Искажения сигнала практически не существует с помощью более длинного фильтра sinc, но легко заметен в более коротком фильтре Фэрроу.

  • Более высокая точность достигается за счет большей задержки: примерно 25 выборки против 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);

Figure contains 4 axes. Axes 1 with title designFracDelayFIR contains 4 objects of type line, scatter. These objects represent True Input Signal (delayed), Filtered signal. Axes 2 contains 2 objects of type line. These objects represent Signal, FIR Gain. Axes 3 with title dsp.VariableFractionalDelay contains 4 objects of type line, scatter. These objects represent True Input Signal (delayed), Filtered signal. Axes 4 contains 2 objects of type line. These objects represent Signal, FIR Gain.

Который следует использовать: dsp.VariableFractionalDelay или designFracDelayFIR ?

Это решение в значительной степени основано на требованиях к фильтру и целевой платформе.

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

  • Для изменяющихся во времени фильтров задержки, направленных на низкопроизводительное вычислительное устройство, используйте dsp.VariableFractionalDelay с 'Farrow' режим.