Як працюють каскадні біквадні секції для фільтрів вищого порядку?


20

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


Вам потрібно зберігати попередні стани для кожного етапу, залежно від порядку фільтра на цій стадії, щоб не було лише 2, як згадувалося,

Відповіді:


13

Це останнє, що ви сказали ("Або вихід першого фільтра подається як x_in у другий фільтр і так далі?"). Ідея проста: ви розглядаєте біквади як окремі фільтри другого порядку, які є в каскаді. Вихід з першого фільтра - це вхід до другого тощо, тому лінії затримки розкидані між фільтрами. Якщо вам потрібно оптимізувати структуру в обмеженій пам'яті середовищі, ви можете зазначити, що сусідні біквади мають надлишкову пам'ять затримки (тобто останні кілька вихідних зразків етапу 1 такі ж, як останні кілька вхідних зразків етапу 2, тому ви Не потрібно зберігати їх окремо, як ви хотіли б просто застосувати фільтри ізольовано).


Спасибі! Мені просто вдалося швидко зробити це в MATLAB. Причиною попередньої плутанини було те, що я забув примножити виграш (тьфу!) І, отже, всілякі ідеї почали
повзати

Якщо ви не турбуєтесь просити виграш у якості вихідного аргументу від tf2sos (як, наприклад, у моєму прикладі коду, розміщеного), то вам не потрібно буде заново перемножувати його знову.
Learnvst

9

Насправді є два способи реалізації розділів другого порядку: паралельний та послідовний. У послідовної версії виходи розділу N є входами до розділу N + 1. У паралельній версії всі розділи мають один і той же вхід (і лише один реальний нуль замість сполученої складної пари нулів), і кожен результат простого підсумовується. Два способи пов'язані через часткове дробове розширення функції передачі Z-домену. ПОПЕРЕДЖЕННЯ: це численно складна проблема, і стандартна реалізація Matlab "остаточ" може мати дуже великі числові помилки для типових звукових фільтрів, що мають полюси, близькі до одиничного кола.


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

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


@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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.