Apakah secara numerik lebih stabil untuk menerapkan penyaringan sebagai perkalian atau konvolusi?

12

Saya sedang menulis sebuah program untuk memfilter 20.000 sampel sinyal dengan filter Butterworth orde kelima secara offline. Saya punya akses ke implementasi FFT. Tampaknya ada dua alternatif untuk menerapkan penyaringan:

  • menggabungkan sinyal dengan respons impuls dalam domain waktu, atau
  • mengalikan sinyal dengan respon impuls dalam domain frekuensi dan mengubah hasilnya

Metode-metode ini akan identik dalam kasus FT teoretis. Namun, melakukannya dalam kehidupan nyata dengan DFT, saya kira segalanya berbeda. Apakah salah satu metode secara numerik lebih stabil? Apakah ada masalah lain yang harus saya ketahui? Jumlah perhitungannya tidak penting.

Andreas
sumber
Metode FFT akan jauh lebih cepat untuk menghitung untuk sebagian besar panjang sinyal. Hanya panjang pendek lebih cepat dengan konvolusi domain waktu.
endolith

Jawaban:

5

Dengan konvolusi, Anda tidak akan mengalami masalah stabilitas, karena tidak ada penyaringan rekursif, sehingga Anda tidak akan mengakumulasi kesalahan apa pun. Dengan kata lain, sistem ini semua nol, tidak ada kutub. Saya telah mendengar secara anekdot, tetapi tidak diverifikasi untuk diri saya sendiri, bahwa konvolusi berbasis FFT memiliki kesalahan lebih rendah daripada konvolusi domain-waktu, hanya karena ia memiliki operasi aritmatika O (n log n) daripada O (n ^ 2).

Biasanya, sejauh yang saya ketahui, filter Butterworth diimplementasikan sebagai filter rekursif (IIR), sehingga topik yang berbeda. Filter IIR memiliki kutub dan nol, sehingga dapat terjadi masalah stabilitas dalam praktiknya. Juga, untuk filter IIR, metode berbasis FFT bukanlah suatu pilihan, tetapi pada sisi baiknya, filter IIR cenderung urutan yang sangat rendah.

Sejauh masalah stabilitas dengan filter IIR, mereka cenderung memiliki masalah pada pesanan yang lebih tinggi - Saya hanya akan membuang nomor dan mengatakan kira-kira urutan keenam mendorongnya. Sebagai gantinya, mereka biasanya diimplementasikan sebagai cascaded biquads (bagian filter urutan ke-2). Untuk filter pesanan ke-5 Anda, tulis sebagai fungsi transfer domain-z (itu akan menjadi fungsi rasional tingkat 5), lalu masukkan ke dalam 5 kutub dan 5 nol. Kumpulkan konjugat kompleks, dan Anda akan memiliki dua biquads dan satu filter urutan pertama. Secara umum, masalah stabilitas cenderung muncul ketika kutub semakin dekat dengan lingkaran unit.

Mungkin juga ada masalah dengan siklus noise dan limit dalam filter IIR, jadi ada topologi filter yang berbeda (yaitu bentuk langsung I, bentuk langsung II) yang memiliki sifat numerik yang berbeda, tapi saya tidak akan terlalu memikirkan hal ini - cukup gunakan dua kali presisi dan hampir pasti akan cukup baik.

schnarf
sumber
Apa maksud Anda dengan itu hanya berfungsi untuk filter FIR? Saya berasumsi bahwa filter IIR harus disampel bagaimanapun juga. Apakah filter IIR biasanya diterapkan dalam domain waktu untuk menghindari ini?
Andreas
1
Sejauh yang saya ketahui, filter IIR selalu diimplementasikan dalam domain waktu. Filter IIR (di sini, misalnya, filter orde kedua atau "biquad") didefinisikan oleh persamaan perbedaan seperti y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2). Perhatikan bahwa ini adalah kombinasi dari sampel input sebelumnya (nilai x), dan sampel output sebelumnya (nilai y). Filter FIR hanya bergantung pada input yang lalu, sehingga ia mengakui implementasi domain frekuensi yang efisien. Filter IIR tidak, tetapi tetap sangat efisien karena filter IIR cenderung urutan yang jauh lebih rendah.
schnarf
1
Alasan filter IIR cenderung urutan jauh lebih rendah adalah bahwa kutub (umpan balik dari sampel keluaran sebelumnya) memungkinkan filter mendapatkan jauh lebih curam dengan koefisien yang sangat sedikit dibandingkan dengan filter FIR. Ketika saya mengatakan urutan jauh lebih rendah, filter IIR tipikal mungkin urutan kedua (5 koefisien), sedangkan filter FIR tipikal untuk tugas yang sama mungkin memiliki ribuan koefisien.
schnarf
4

Dalam hampir semua kasus, pilihan terbaik Anda bukanlah konvolusi atau FFT tetapi cukup menerapkan filter IIR secara langsung (menggunakan misalnya fungsi sosfilt ()). Ini akan jauh lebih efisien dalam hal konsumsi CPU dan memori.

Apakah itu membuat perbedaan numerik tergantung pada filter spesifik. Satu-satunya kasus di mana beberapa perbedaan dapat terjadi adalah jika kutubnya sangat, sangat dekat dengan lingkaran unit. Bahkan ada beberapa trik yang bisa membantu. JANGAN GUNAKAN representasi fungsi transfer dan filter () tetapi gunakan kutub dan nol dengan sosfilt (). Berikut adalah contoh perbedaannya.

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 () memburuk saat cutoff sekitar 15Hz @ 44.1kHz. Untuk sosfilt () cutoffnya bisa jauh di bawah 1/100 dari Hz @ 44.1kHz tanpa masalah.

JIKA Anda memiliki masalah stabilitas, FFT juga tidak banyak membantu. Karena filter Anda adalah filter IIR, respons impuls tidak terbatas dan harus dipotong terlebih dahulu. Pada frekuensi yang sangat rendah ini, respons impuls menjadi begitu lama sehingga FFT menjadi tidak praktis juga.

Sebagai contoh jika Anda ingin cutoff 1/100 Hz @ 44,1 kHz dan ingin rentang dinamis dalam respons impuls 100 dB, Anda memerlukan sekitar 25 juta sampel !!! Itu hampir 10 menit pada 44,1 kHz dan banyak, berkali-kali lebih lama dari sinyal asli Anda

Hilmar
sumber
Ini tidak benar-benar menjawab pertanyaan tentang masalah numerik, tapi saya tidak menyadari masalah dengan filter- terima kasih! Cutoff high-pass saya adalah 0,5 Hz @ 250 Hz. Apa alasan untuk masalah ini filter? Saya sedang menulis implementasinya sendiri.
Andreas
2

Mengapa Anda mengira hal-hal akan berbeda? Konsep teoritis harus diterjemahkan ke aplikasi praktis, dengan satu-satunya perbedaan adalah bahwa masalah floating point, yang tidak bisa kita hindari. Anda dapat dengan mudah memverifikasi dengan contoh sederhana di 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

Seperti yang Anda lihat, kesalahannya ada pada urutan presisi alat berat. Seharusnya tidak ada alasan untuk tidak menggunakan metode FFT. Seperti yang disebutkan Endolith, jauh lebih umum untuk menggunakan pendekatan FFT untuk menyaring / berbelit-belit, dll. Dan jauh lebih cepat kecuali untuk sampel yang sangat kecil (seperti dalam contoh ini). Bukan berarti pemrosesan domain waktu tidak pernah dilakukan ... semuanya bermuara pada aplikasi, kebutuhan, dan kendala.

Lorem Ipsum
sumber
1
Saya pikir pertanyaan aslinya adalah menggali langsung ke masalah floating-point yang melekat dalam penyaringan berbasis FFT versus implementasi langsung dari filter dalam domain waktu. Ini bisa menjadi masalah nyata untuk pemrosesan sinyal titik tetap, jika Anda memiliki filter yang sangat panjang, atau jika Anda memiliki implementasi FFT yang buruk, misalnya. Anda pasti tidak akan melihat efek untuk urutan panjang 5 di titik mengambang presisi ganda.
Jason R
@JasonR Kesalahan masih presisi mesin jika Anda memperpanjang panjang urutan ke 1e6 pada contoh di atas. Kesalahan yang Anda sebutkan muncul terutama karena desain filter yang buruk atau implementasi FFT yang buruk. Jika itu baik-baik saja, saya tidak melihat mengapa konvolusi dalam domain waktu harus memberikan jawaban yang berbeda dari yang ada di domain frekuensi.
Lorem Ipsum
1
Seharusnya tidak memberikan jawaban yang berbeda berdasarkan pada domain mana Anda melakukan perhitungan. Satu-satunya poin saya adalah bahwa operasi matematika yang sebenarnya sangat berbeda antara kedua pendekatan, jadi tergantung pada implementasi dari masing-masing yang Anda miliki, mungkin saja Anda bisa melihat perbedaan nyata. Untuk presisi ganda, dengan asumsi Anda memiliki implementasi yang baik, saya tidak akan mengharapkan perbedaan kecuali dalam kasus yang ekstrim.
Jason R