Как работают каскадные биквадные секции для фильтров более высокого порядка?

20

Я пытаюсь внедрить БИХ-фильтр 8-го порядка, и в каждой записке приложения и учебнике, которые я прочитал, говорится, что лучше всего использовать любой фильтр порядка более 2 в качестве разделов второго порядка. Я использовал tf2sosв MATLAB, чтобы получить коэффициенты для секций второго порядка, что дало мне 6x4 коэффициентов для 4 секций второго порядка, как и ожидалось. До внедрения в качестве SOS фильтр 8-го порядка требовал сохранения 7 предыдущих значений выборки (а также выходных значений). Теперь при реализации в качестве секций второго порядка, как работает поток от ввода к выводу, нужно ли мне хранить только 2 предыдущих значения выборки? Или выход первого фильтра подается как x_inво второй фильтр и так далее?

anasimtiaz
источник
вам нужно хранить предыдущие состояния для каждого этапа, в зависимости от порядка фильтра на этом этапе, чтобы не было только 2, как вы упомянули

Ответы:

13

Это последнее, что вы сказали («Или вывод первого фильтра подается как x_in во второй фильтр и так далее?»). Идея проста: вы рассматриваете биквадры как отдельные фильтры второго порядка, которые находятся в каскаде. Выход первого фильтра является входом второго и т. Д., Поэтому линии задержки распределены между фильтрами. Если вам необходимо оптимизировать структуру в среде с ограниченным объемом памяти, вы можете заметить, что смежные биквады имеют избыточную память с задержкой (т. Е. Последние несколько выходных выборок этапа 1 совпадают с последними несколькими входными выборками этапа 2, поэтому не нужно хранить их отдельно, как если бы вы просто внедрили фильтры в отдельности).

Джейсон Р
источник
Благодарность! Мне просто удалось быстро сделать это в MATLAB. Причина более ранней путаницы заключалась в том, что я забыл умножить прибыль (тьфу!), И, следовательно, начали
появляться
Если вам не нужно запрашивать усиление в качестве выходного аргумента из tf2sos (как в приведенном мной примере кода), то вам не нужно беспокоиться о его повторном умножении.
учись
9

На самом деле существует два способа реализации секций второго порядка: параллельный и последовательный. В последовательной версии выходы секции N являются входами секции N + 1. В параллельной версии все секции имеют один и тот же вход (и только один действительный ноль вместо сопряженной комплексной пары нулей), а выходные данные каждой секции просто суммируются. Эти два метода связаны через разложение по частям передаточной функции Z-домена. ВНИМАНИЕ: это численно сложная проблема, и стандартная реализация Matlab «остаток» может иметь очень большие числовые ошибки для типичных аудиофильтров, полюса которых находятся близко к единичному кругу.

Hilmar
источник
6

Вот небольшой демонстрационный код, чтобы показать, почему вам лучше каскадировать секции 2-го порядка.

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

Для фильтра нижних частот, приведенного в вышеприведенном примере, порядка порядка 12-13 числовые ошибки накапливаются, чтобы дать заметно различную импульсную характеристику для реализации, в которой не используются каскадные биквады. В зависимости от фильтра ваш пробег будет варьироваться.

ЗАКАЗАТЬ = 10

введите описание изображения здесь

ЗАКАЗАТЬ = 13

введите описание изображения здесь

learnvst
источник
@learvst Поправь меня, если я ошибаюсь, но твой код не получает выгоды. Не должно ли быть:[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);
user915783