Czy implementacja filtrowania jako zwielokrotnienia lub splotu jest bardziej stabilna numerycznie?


12

Piszę program do filtrowania w trybie offline sygnału 20 000 próbek przy użyciu filtra Butterwortha piątego rzędu. Mam dostęp do implementacji FFT. Wydaje się, że istnieją dwie możliwości wdrożenia filtrowania:

  • splot sygnału z odpowiedzią impulsową w dziedzinie czasu, lub
  • zwielokrotnienie sygnału przez odpowiedź impulsową w dziedzinie częstotliwości i odwrotne przekształcenie wyniku

Metody te byłyby identyczne w teoretycznym przypadku FT. Robię to w prawdziwym życiu z DFT, ale chyba wszystko jest inne. Czy jedna z metod jest bardziej stabilna numerycznie? Czy są jeszcze jakieś problemy, o których powinienem wiedzieć? Liczba obliczeń nie jest ważna.


Metoda FFT będzie znacznie szybsza do obliczenia dla większości długości sygnałów. Tylko krótkie długości są szybsze dzięki splotowi w dziedzinie czasu.
endolith,

Odpowiedzi:


5

Dzięki splotowi nie napotkasz żadnych problemów ze stabilnością, ponieważ nie ma filtrowania rekurencyjnego, więc nie będziesz kumulować żadnych błędów. Innymi słowy, w systemie są wszystkie zera, bez biegunów. Słyszałem anegdotycznie, ale nie zweryfikowałem dla siebie, że splot oparty na FFT ma mniejszy błąd niż splot w dziedzinie czasu, po prostu dlatego, że ma operacje arytmetyczne O (n log n) zamiast O (n ^ 2).

Zazwyczaj, o ile mi wiadomo, filtry Butterworth są implementowane jako filtry rekurencyjne (IIR), więc jest to inny temat. Filtry IIR mają bieguny i zera, więc w praktyce mogą wystąpić problemy ze stabilnością. Ponadto, w przypadku filtrów IIR, metody oparte na FFT nie są opcją, ale z drugiej strony, filtry IIR wydają się być bardzo niskiego rzędu.

Jeśli chodzi o problemy ze stabilnością z filtrami IIR, mają one zwykle problemy przy wyższych rzędach - po prostu wyrzucę liczbę i powiem, że popycha ją około 6. rzędu. Zamiast tego są zwykle implementowane jako kaskadowe biquady (sekcje filtrów drugiego rzędu). Dla filtra piątego rzędu napisz go jako funkcję transferu domeny z (będzie to funkcja racjonalna 5. stopnia), a następnie podziel go na 5 biegunów i 5 zer. Zbierz złożone koniugaty, a otrzymasz dwie bikwady i jeden filtr pierwszego rzędu. Ogólnie problemy ze stabilnością pojawiają się, gdy bieguny zbliżają się do okręgu jednostki.

Mogą występować również problemy z szumem i cyklem granicznym w filtrach IIR, więc istnieją różne topologie filtrów (tj. Bezpośrednia forma I, bezpośrednia forma II), które mają różne właściwości liczbowe, ale nie zastanowiłbym się nad tym - po prostu użyj podwójnego- precyzja i prawie na pewno będzie wystarczająco dobra.


Co masz na myśli mówiąc, że działa tylko dla filtrów FIR? Zakładałem, że i tak trzeba będzie jakoś próbkować filtry IIR. Czy filtry IIR są zwykle implementowane w dziedzinie czasu, aby tego uniknąć?
Andreas

1
O ile mi wiadomo, filtry IIR są zawsze implementowane w dziedzinie czasu. Filtr IIR (tutaj na przykład filtr drugiego rzędu lub „biquad”) jest zdefiniowany przez równanie różniczkowe, takie jak y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2). Zauważ, że jest to kombinacja poprzednich próbek wejściowych (wartości x) i poprzednich próbek wyjściowych (wartości y). Filtr FIR zależy tylko od przeszłych danych wejściowych, więc dopuszcza wydajną implementację w dziedzinie częstotliwości. Filtr IIR nie działa, ale i tak jest bardzo wydajny, ponieważ filtry IIR mają tendencję do znacznie niższego rzędu.
sznurek

1
Powodem, dla którego filtry IIR są znacznie niższe, jest to, że bieguny (sprzężenie zwrotne z poprzednimi próbkami wyjściowymi) pozwalają, aby filtr stawał się bardziej stromy przy bardzo niewielu współczynnikach w porównaniu z filtrem FIR. Kiedy mówię o znacznie niższym rzędzie, typowym filtrem IIR może być drugi rząd (5 współczynników), podczas gdy typowy filtr FIR dla tego samego zadania może mieć tysiące współczynników.
sznurek

4

W prawie wszystkich przypadkach najlepszym wyborem nie jest ani splot, ani FFT, ale po prostu zastosowanie filtra IIR bezpośrednio (za pomocą np. Funkcji sosfilt ()). Będzie to znacznie bardziej wydajne pod względem zużycia procesora i pamięci.

To, czy ma to znaczenie liczbowe, zależy od konkretnego filtra. Jedynym przypadkiem, w którym może się wkraść pewna różnica, jest to, że bieguny są bardzo, bardzo blisko koła jednostki. Nawet tam jest kilka sztuczek, które mogą pomóc. NIE UŻYWAJ reprezentacji funkcji przesyłania i filter (), ale używaj biegunów i zer z sosfilt (). Oto przykład różnicy.

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 () psuje się przy odcięciu około 15 Hz przy 44,1 kHz. W przypadku sosfilt () odcięcie może być znacznie poniżej 1/100 Hz przy 44,1 kHz bez żadnych problemów.

JEŚLI masz problemy ze stabilnością, FFT też niewiele pomaga. Ponieważ twój filtr jest filtrem IIR, odpowiedź impulsowa jest nieskończona i musiałaby zostać najpierw obcięta. Przy tak bardzo niskiej częstotliwości odpowiedź impulsowa staje się tak długa, że ​​FFT również staje się niepraktyczne.

Na przykład, jeśli chcesz mieć wartość graniczną 1/100 Hz przy 44,1 kHz i chcesz zakres dynamiczny w odpowiedzi impulsowej 100 dB, potrzebujesz około 25 milionów próbek !!! To prawie 10 minut przy 44,1 kHz i wiele, wiele razy dłużej niż oryginalny sygnał


To tak naprawdę nie odpowiada na pytanie dotyczące problemów numerycznych, ale nie wiedziałem o problemach z filter- dzięki! Moja górnoprzepustowa wartość graniczna wynosi 0,5 Hz @ 250 Hz. Jaki jest powód problemów filter? Sam piszę implementację.
Andreas,

2

Jak myślisz, dlaczego będzie inaczej? Koncepcje teoretyczne powinny przełożyć się na praktyczne zastosowania, z tą różnicą, że problemami zmiennoprzecinkowymi są problemy, których nie możemy uniknąć. Możesz łatwo zweryfikować za pomocą prostego przykładu w 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

Jak widać, błędy są rzędu dokładności maszyny. Nie powinno być żadnego powodu, aby nie używać metody FFT. Jak wspomniano Endolith, znacznie częściej stosuje się metodę FFT do filtrowania / zwijania / korelacji krzyżowej itp. I znacznie szybciej, z wyjątkiem bardzo małych próbek (jak w tym przykładzie). Nie chodzi o to, że przetwarzanie w dziedzinie czasu nigdy nie jest wykonywane ... wszystko sprowadza się do aplikacji, potrzeb i ograniczeń.


1
Myślę, że pierwotne pytanie dotyczyło zagadnień zmiennoprzecinkowych związanych z filtrowaniem opartym na FFT w porównaniu z bezpośrednią implementacją filtra w dziedzinie czasu. Może to stanowić poważny problem przy przetwarzaniu sygnału w punkcie stałym, jeśli na przykład masz naprawdę długie filtry lub źle wykonujesz FFT. Na pewno nie zobaczysz żadnych efektów dla sekwencji o długości 5 w zmiennoprzecinkowym podwójnej precyzji.
Jason R

@JasonR Błędy nadal są precyzyjne dla maszyny, jeśli zwiększysz długość sekwencji do 1e6 w powyższym przykładzie. Błędy, o których wspominasz, pojawiają się głównie z powodu złego projektu filtra lub złej implementacji FFT. Jeśli są w porządku, nie rozumiem, dlaczego splot w dziedzinie czasu powinien dać inną odpowiedź niż ta w dziedzinie częstotliwości.
Lorem Ipsum

1
Nie powinno to dać innej odpowiedzi w zależności od dziedziny, w której wykonujesz obliczenia. Moim jedynym punktem jest to, że rzeczywiste operacje matematyczne różnią się znacznie między tymi dwoma podejściami, więc w zależności od implementacji każdego z dostępnych, możliwe jest, że widziałem namacalne różnice. Dla podwójnej precyzji, zakładając, że masz dobre implementacje, nie spodziewałbym się żadnej różnicy, z wyjątkiem ekstremalnych przypadków.
Jason R
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.