exponenta event banner

Проектирование фильтров КИХ с дробной задержкой

Фильтры дробной задержки направлены на сдвиг цифровой последовательности на неинтегрированное значение, посредством интерполяции и повторной дискретизации объединены в единый сверточный фильтр. В этом примере показана конструкция и реализация фильтров КИХ с дробной задержкой с использованием инструментов, доступных в 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

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

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

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

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

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

Фильтры дробной задержки с ограниченной полосой пропускания

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

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

Соответствующий частотный отклик (то есть DTFT) задаётся HD (λ) = e-istartD .

Causal FIR аппроксимация идеального фильтра сдвига с ограниченной полосой частот

Идеальным фильтром сдвига sinc, описанным в предыдущем разделе, является фильтр всех частот (то есть | 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, где 0≤FD≤1 и целое число i0, явными индексами окна являются {i0- N-12 ,..., 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.

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

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

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

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

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

Фильтры дробной задержки на основе лагранжа используют полиномиальную подгонку на движущееся окно входных выборок. То есть xnˆ (t) является многочленом некоторой фиксированной степени K. Как и фильтры задержки на основе sinc, фильтры задержки на основе Лагранжа могут быть сформулированы как причинный КИХ сверток (то есть y = h * x) длины N = K + 1, и поддерживаются в окне индекса {- N-12 ⌋,... ⌊ N2 ⌋}. Аналогично модели на основе sinc, примените 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.

Эта модель может быть реализована как FIR-фильтр прямой формы, если значение задержки FD фиксировано, или с использованием структуры Фэрроу, если значение задержки изменяется. Ниже приведен раздел, посвященный реализации интерполяции Лагранжа с использованием dsp.VariableFractionalDelay в 'Farrow' режим.

Проектирование и внедрение фильтров КИХ с дробной задержкой на основе sinc

Следующий раздел посвящен разработке и внедрению фильтров дробной задержки на основе 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')

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

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')

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 в режиме «FIR»

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

  • dsp.VariableFractionalDelay аппроксимирует значение задержки рациональным числом FD≈kL вплоть до некоторого допуска, а затем отсчитывает дробную задержку в качестве 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])

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.

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

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

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.

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

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

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-фильтр имеет более высокую полосу пропускания. Более короткий фильтр Фэрроу имеет меньшую полосу пропускания.

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

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

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' режим.