Apakah filter IIR (dan khususnya filter Butterworth) bersifat kausal?
Saya baru mengenal pemrosesan sinyal. Saya sekarang belajar tentang pemfilteran dan saya mencoba menerapkan filter lolos tinggi (HPF), dan kemudian filter band-pass (BPF). Saya menerapkan filter Python 3.8
dengan NumPy
dan SciPy
.
Untuk kasus offline (memfilter waktu yang direkam sebelumnya) saya merancang filter high-pass Butterworth , dan menerapkan sinyal pada domain waktu menggunakan signal.filtfilt
fungsi. Namun, seperti yang ditunjukkan oleh dokumentasi, pendekatan ini hanya bagus untuk kasus offline dan bukan untuk waktu nyata, karena filter memindai sinyal maju dan kemudian mundur. Saya dapat memulihkan respons frekuensi dari filter menggunakan signal.freqz
fungsi.
Sekarang saya ingin filter ini akan bekerja juga secara real-time (jadi perlu kausal, dan saya bertanya apakah ini mungkin untuk filter jenis ini. Berikut pertanyaan saya:
- Jika saya mengerti dengan benar, filter Butterworth adalah filter IIR (respons impuls tak terbatas). Benarkah
- Apakah filter IIR kausal? Bisa jadi semua filter IIR tidak kausal dan mungkin ada juga yang tidak. Apa kasus di mana filter IIR bersifat kausal?
- Apakah filter Butterworth kausal? Jika tidak selalu, dalam hal apakah itu kausal?
- Jika jawaban ke 3 benar, bagaimana cara menerapkan filter kausal Butterworth, baik pada domain waktu maupun domain frekuensi? (Saya dapat menggunakan
SciPy
fungsi sepertisignal.butter
,signal.freqz
dll.)
Tautan yang relevan:
- Membantu mendesain filter Butterworth
- filtfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html
Terima kasih.
Jawaban
- Ya, Butterworth adalah IIR. Kerusakan dari suatu dorongan secara teknis berlangsung selamanya.
- Ya, semua IIR [yang dapat diimplementasikan] bersifat kausal.
- Ya, karena # 1 dan # 2.
- Jangan gunakan signal.filtfilt. Gunakan signal.lfilter.
filtfilt
melakukan hal yang samalfilter
, kecuali dua kali, dalam arah yang berlawanan, yang mengubah filter kausal menjadi filter fase nol.
Namun, seperti yang disarankan oleh dokumentasi untuk kedua fungsi tersebut, untuk sebagian besar penggunaan praktis, Anda sebaiknya benar-benar menggunakan varian SOS:
Fungsi
sosfilt
(dan penggunaan desain filteroutput='sos'
) harus lebih disukai daripadalfilter
untuk sebagian besar tugas pemfilteran, karena bagian orde dua memiliki masalah numerik yang lebih sedikit.
Untuk meringkas fungsi:
- lfilter: Pemfilteran satu tahap kausal (hanya pesanan rendah)
- filtfilt: Pemfilteran satu tahap fase nol (hanya pesanan rendah)
- sosfilt: Pemfilteran bagian urutan kedua kausal
- sosfiltfilt: Pemfilteran bagian urutan kedua fase nol
Sungguh satu-satunya alasan untuk menggunakan lfilter
atau filtfilt
adalah jika koefisien Anda sudah dalam b, a
format, jika Anda menerapkan sesuatu dari buku teks, dll.
Jika Anda mendesain filter sendiri, cukup gunakan formulir SOS, yang mengurangi kesalahan numerik.
Perhatikan bahwa filtfilt
fungsi menerapkan filter dua kali, sehingga urutannya akan dua kali lipat dari filter aslinya.
Apakah filter IIR kausal? Bisa jadi semua filter IIR tidak kausal dan mungkin ada juga yang tidak. Apa kasus di mana filter IIR bersifat kausal?
Semua filter IIR yang nyata bersifat kausal. Semua sistem nyata adalah kausal, kecuali alam semesta jauh lebih aneh daripada yang terlihat.
Anda dapat menentukan filter yang bekerja pada informasi masa depan; yaitu Anda bisa mengatakan itu$y_n = 0.9 y_{n+1} + x_n$. Itu akan (dengan banyak kata untuk mengatasi keraguan pembaca) menggambarkan filter yang respons impulsnya$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$
Namun, Anda tidak dapat benar-benar menerapkan filter seperti itu dalam kehidupan nyata.