Saya memiliki filter low pass tiang tunggal sederhana (untuk pemulusan parameter) yang dapat dijelaskan dengan rumus berikut:
Arsitektur yang saya gunakan memiliki akses ke instruksi tunggal, banyak data (SIMD) instruksi yang dapat melakukan beberapa perhitungan vektor secara paralel. Saya ingin memanfaatkan kemampuan ini, tetapi saya tidak yakin bagaimana melakukannya untuk filter rekursif seperti ini. Masalahnya adalah bahwa setiap perhitungan membutuhkan hasil sebelumnya.
filters
infinite-impulse-response
pengguna1132968
sumber
sumber
Jawaban:
Dengan asumsi bahwa Anda melakukan operasi vektorM. elemen sekaligus, Anda dapat membuka gulungan persamaan perbedaan dengan faktor M. cukup mudah untuk filter tiang tunggal sederhana. Asumsikan bahwa Anda telah menghitung semua output hinggay[ n ] . Kemudian, Anda dapat menghitung yang berikutnya sebagai berikut:
Secara umum, Anda bisa menulisy[ n + k ] sebagai:
Untuk setiap indeks sampeln + k , ini terlihat seperti filter FIR dengan k + 1 ketukan: satu ketukan mengalikan hasil filter terakhir y[ n ] , Dan lainnya k mengetuk gandakan input filter x [ n + 1 ] , ... , x [ n + k ] . Yang menyenangkan adalah bahwa koefisien yang digunakan untuk semua keran ini dapat dihitung ulang, memungkinkan Anda untuk membuka gulungan filter rekursif ke dalamM. M.+ 1 -tap filter paralel non-rekursif (filter ini menghitung sampel keluaran y[ N + 1 ] , ... , y[ n + M] ), memperbarui istilah umpan balik setiap M. sampel keluaran. Jadi, diberikan kondisi awaly[ n ] (yang diasumsikan sebagai output terakhir yang dihitung pada iterasi vektor sebelumnya), Anda dapat menghitung berikutnya M. output secara paralel.
Ada beberapa peringatan untuk pendekatan ini:
JikaM. menjadi besar, maka Anda akhirnya mengalikan sekelompok angka bersama-sama untuk mendapatkan koefisien FIR yang efektif untuk filter yang belum dibuka. Tergantung pada format angka Anda dan nilaiSebuah , ini bisa memiliki implikasi presisi numerik.
Juga, Anda tidak mendapatkanM. speedup lipat dengan pendekatan ini: Anda akhirnya menghitung y[ n + k ] dengan jumlah apa a k -tap filter FIR. Meskipun Anda sedang menghitungM. output secara paralel, fakta yang harus Anda lakukan k operasi multiply-akumulasi (MAC) bukan implementasi rekursif tingkat pertama sederhana mengurangi beberapa manfaat untuk vektorisasi. Pendekatan non-vektor menggunakan 2 MAC per output, jadi Anda perlu2 M. operasi untuk menghitung M. output. Skema vektor menghitungM. output sekaligus, membutuhkan M.+ 1 MAC dalam proses. Jadi, pengurangan operasi dapat dinyatakan sebagai fungsiM. sebagai:
Begitu pun denganM. sangat besar, Anda bisa mendapatkan maksimum 50% pengurangan dalam jumlah perhitungan menggunakan metode ini. Untuk nilai umumM.= 4 dan M.= 8 , pengurangannya masing-masing adalah 37,5% dan 43,75%. Namun, selain pengurangan murni dalam jumlah operasi, Anda dapat memperoleh manfaat kinerja tambahan karena pola akses memori yang berbeda yang digunakan oleh pendekatan yang tidak terbuka; untuk implementasi yang lebih sederhana, Anda dapat mengalami keterlambatan karena ketergantungan dari masing-masing sampel keluarany[ n ] pada sampel sebelumnya y[ n - 1 ] . Efek ini jelas sangat tergantung platform.
sumber
Secara umum, Anda hanya dapat melakukan vectorisasi set komputasi yang sepenuhnya independen. Tetapi dalam low pass IIR Anda, setiap output bergantung pada yang lain (kecuali yang pertama), jadi vektorisasi tidak dimungkinkan.
Jika variabel "a" Anda cukup besar sehingga (1-a) ^ n cepat meluruh di bawah lantai kebisingan yang Anda kehendaki atau kesalahan yang diizinkan, Anda bisa mengganti pendekatan filter FIR pendek untuk IIR Anda, dan sebaliknya mengubah vektor konvolusi itu. Tapi itu tidak mungkin lebih cepat.
sumber
Anda hanya dapat benar-benar membuat vektor ini secara efektif jika Anda memiliki lebih dari satu sinyal yang ingin Anda terapkan filter yang sama, misalnya jika itu adalah sinyal audio stereo maka Anda dapat memproses saluran kiri dan kanan secara paralel. Empat atau delapan saluran secara paralel jelas akan lebih baik.
sumber
Bagaimana dengan memperluas persamaan menjadi 4 langkah dan menggunakan perkalian matriks? a adalah konstan sehingga satu matriks dapat dihitung sebelumnya
sumber
Paling efisien untuk menyamakan penyaringan beberapa aliran independen secara paralel.
Jika Anda hanya memiliki satu aliran panjang, Anda juga dapat membagi aliran menjadi beberapa bagian yang tumpang tindih dan memfilternya seolah-olah itu adalah aliran independen.
Anda ingin tumpang tindih karena beberapa sampel pertama dari setiap aliran akan salah. Jumlah sampel yang perlu Anda buang akan tergantung pada nilai a dan presisi yang diinginkan. Anda harus membuang n sampel di mana (1 / a) (1-a) ** n <eps agar hasilnya akurat untuk eps * max (| x [i] |).
Misalnya, jika a = 0,1, maka dalam 128 sampel kesalahan yang disebabkan oleh (1 / a) (1-a) ^ n akan kurang dari LSB dalam bilangan bulat 16bit, sedangkan untuk a = 0,9 Anda hanya perlu membuang sekitar 6 sampel.
sumber