Чи чисельніше стабільніше реалізувати фільтрацію як множення чи згортання?


12

Я пишу програму для фільтрування сигналу зразка 20 000 за допомогою фільтра Баттерворта в п'ятому порядку. У мене є доступ до реалізації FFT. Здається, є дві альтернативи для здійснення фільтрації:

  • згортання сигналу з імпульсною реакцією у часовій області, або
  • множення сигналу на імпульсну характеристику в частотній області і зворотне перетворення результату

Ці методи були б ідентичними в теоретичному випадку FT. Робити це в реальному житті з DFT, хоча, я гадаю, все інакше. Чи є один із методів чисельніше стійкішим? Чи є якісь інші проблеми, про які я маю знати? Кількість розрахунків не важлива.


Метод FFT буде набагато швидше обчислити для більшості довжин сигналу. Тільки короткі довжини швидші з згортанням часової області.
ендоліт

Відповіді:


5

З згортанням ви не збираєтеся стикатися з будь-якими проблемами стабільності, оскільки немає рекурсивної фільтрації, тому ви не збираєтеся накопичувати помилки. Іншими словами, у системі всі нулі, ніяких полюсів. Я чув анекдотично, але не підтвердив для себе, що на основі FFT згортання має меншу помилку, ніж згортання часової області, просто тому, що вона має арифметичні операції O (n log n), а не O (n ^ 2).

Як правило, наскільки мені відомо, фільтри Баттерворта реалізуються як рекурсивні (IIR) фільтри, тож це вже інша тема. Фільтри IIR мають полюси, а також нулі, тому на практиці можуть виникнути проблеми зі стабільністю. Крім того, для фільтрів IIR методи, засновані на FFT, не є варіантом, але, в сторону, фільтри IIR, як правило, дуже низькі.

Що стосується проблем стабільності з фільтрами IIR, вони, як правило, мають проблеми при більш високих порядках - я просто викину число і скажу, що приблизно 6-й порядок штовхає його. Натомість вони, як правило, реалізуються як каскадні біквади (секції фільтрів 2-го порядку). Для вашого фільтра 5-го порядку запишіть його як функцію передачі z-домену (це буде раціональна функція 5-го ступеня), а потім розподіліть її на 5 полюсів і 5 нулів. Зберіть складні кон'югати, і у вас буде два біквади та один фільтр першого порядку. Взагалі проблеми стійкості, як правило, вирішуються, коли полюси наближаються до одиничного кола.

Також можуть виникати проблеми із шумовими та обмежувальними циклами у фільтрах IIR, тому існують різні топології фільтрів (тобто пряма форма I, пряма форма II), які мають різні числові властивості, але я б не переосмислював цей момент - просто використовуйте подвійний- точність, і це майже напевно буде досить добре.


Що ви маєте на увазі, коли він працює лише для фільтрів FIR? Я припускав, що фільтри IIR так чи інакше доведеться відбирати. Чи зазвичай фільтри IIR реалізуються у часовій області, щоб уникнути цього?
Андреас

1
Наскільки мені відомо, фільтри IIR завжди реалізуються у часовій області. Фільтр IIR (тут, наприклад, фільтр другого порядку або "біквад") визначається рівнянням різниці, як y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2). Зауважте, що це комбінація попередніх вхідних вибірок (значення x) та попередніх вихідних вибірок (значень y). Фільтр FIR залежить лише від минулих входів, тому він дозволяє ефективно реалізувати частотну область. IIR фільтр не має, але все-таки дуже ефективний, оскільки фільтри IIR мають значно нижчий рівень.
schnarf

1
Причина IIR-фільтрів, як правило, значно нижча за те, що полюси (зворотний зв'язок попередніх вихідних зразків) дозволяють фільтру стати набагато крутішим з дуже малим коефіцієнтом порівняно з фільтром FIR. Коли я кажу набагато нижчий порядок, типовий фільтр IIR може бути другого порядку (5 коефіцієнтів), тоді як типовий фільтр FIR для тієї ж задачі може мати тисячі коефіцієнтів.
шнарф

4

Майже у всіх випадках найкращим вибором є ні згортка, ні FFT, а просто застосування фільтра IIR безпосередньо (використовуючи, наприклад, функцію sosfilt ()). Це буде набагато ефективніше з точки зору споживання процесора та пам'яті.

Чи має це чисельна різниця, залежить від конкретного фільтра. Єдиний випадок, коли якась різниця може повзати - це якщо полюси дуже, дуже близькі до одиничного кола. Навіть є кілька хитрощів, які можуть допомогти. НЕ ВИКОРИСТОВУЙТЕ представлення функції передачі та фільтра (), але використовуйте полюси та нулі з допомогою sosfilt (). Ось приклад для різниці.

n = 2^16;  % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');

filter () поганий при відсіченні близько 15 Гц при 44,1 кГц. Для sosfilt () обріз може бути набагато нижче 1/100 Гц при 44,1 кГц без проблем.

Якщо у вас є проблеми зі стабільністю, FFT також не дуже допомагає. Оскільки ваш фільтр - це фільтр IIR, імпульсна характеристика нескінченна і її слід спочатку обрізати. На цих дуже низьких частотах імпульсна характеристика стає настільки довгою, що і FFT стає непрактичним.

Наприклад, якщо ви хочете відключити 1/100 Гц при 44,1 кГц і хочете динамічний діапазон в імпульсній реакції 100 дБ, вам потрібно приблизно 25 мільйонів проб !!! Це майже 10 хвилин на 44,1 кГц і багато, багато разів довше, ніж ваш вихідний сигнал


Це насправді не відповідає на питання про числові проблеми, але я не знав про проблеми з filter- дякую! Мій високий прохідний відрізок становить 0,5 Гц при 250 Гц. У чому причина проблем filter? Я сам пишу реалізацію.
Андреас

2

Чому ви гадаєте, що все буде інакше? Теоретичні концепції повинні бути приведені до практичних застосувань, з тією лише різницею, що стосується питань з плаваючою комою, яких ми не можемо уникнути. Ви можете легко перевірити на простому прикладі в MATLAB:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

Як бачите, помилки є в порядку машинної точності. Не повинно бути причин не використовувати метод FFT. Як зазначав Ендоліт, набагато частіше використовувати підхід FFT для фільтрування / згортання / перехресного співвідношення тощо і набагато швидше, за винятком дуже малих зразків (як у цьому прикладі). Не те, що обробка часових доменів ніколи не робиться ... все зводиться до програми, потреб і обмежень.


1
Я думаю, що первісне питання було висвітлено безпосередньо з питаннями з плаваючою комою, властивими фільтрації на основі FFT, а не безпосередньою реалізацією фільтра у часовій області. Це може викликати серйозне занепокоєння щодо обробки сигналів з фіксованою точкою, якщо у вас дійсно довгі фільтри, або якщо у вас погана реалізація FFT, наприклад. Ви точно не побачите жодних ефектів для послідовностей довжиною 5 з плаваючою точкою подвійної точності.
Джейсон R

@JasonR Помилки все ще є машинною точністю, якщо збільшити довжину послідовностей до 1e6 у наведеному вище прикладі. Помилки, які ви згадуєте, виникають в основному через поганий дизайн фільтра або погану реалізацію FFT. Якщо це добре, я не розумію, чому згортання у часовій області має відповідати іншим, ніж частотна область.
Lorem Ipsum

1
Він не повинен давати іншої відповіді, залежно від того, в якому домені ви робите обчислення. Мій єдиний момент полягає в тому, що фактичні математичні операції сильно відрізняються між двома підходами, тому залежно від реалізацій кожного, що є у вас в наявності, можливо, що ви можна було побачити відчутні відмінності. Для подвійної точності, якщо припустити, що у вас є хороші реалізації, я не очікував би різниці, крім крайніх випадків.
Джейсон R
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.