Bagaimana saya bisa melakukan vektorisasi perhitungan untuk filter rekursif orde pertama?


9

Saya memiliki filter low pass tiang tunggal sederhana (untuk pemulusan parameter) yang dapat dijelaskan dengan rumus berikut:

y[n]=(1-Sebuah)y[n-1]+Sebuahx[n]

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.


Bisakah seseorang menjelaskan mengapa ini ditutup sebagai "di luar topik"?
Paul R

Pertanyaannya tumpang tindih antara sini dan Stack Overflow. Pertanyaan awal ditanyakan secara khusus bagaimana menerapkannya menggunakan ekstensi ARM NEON. Pertanyaannya akan hidup di kedua situs; telah diedit di sini untuk menjadikannya lebih sebagai diskusi teoretis tentang penataan masalah untuk memanfaatkan paralelisme.
Jason R

@ PaulR Saya memintanya untuk dimigrasikan di sini kemarin, tetapi phonon merasa dengan kuat bahwa itu milik SO, dan bukan di sini. Saya akui, saya tidak tahu tentang ARM NEON secara khusus, dan dia mungkin benar dan saya menghargai penilaiannya. Lihat pertanyaan meta ini . Jawaban saya yang dihapus pada dasarnya mengatakan bahwa saya setuju dengan Jason R dan bahwa pengguna harus menandai pertanyaan untuk migrasi seperti itu
Lorem Ipsum

1
Terima kasih baik untuk klarifikasi - Saya sudah melakukan yang terbaik di SO untuk mendapatkan pertanyaan terkait DSP bermigrasi di sini untuk meningkatkan profil kami, jadi saya khawatir apakah ini hal yang benar untuk dilakukan ketika pertanyaan ini ditutup - senang melihatnya terbuka lagi sekarang dalam bentuk yang lebih umum.
Paul R

Jawaban:


7

Dengan asumsi bahwa Anda melakukan operasi vektor M. 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:

y[n+1]=(1-Sebuah)y[n]+Sebuahx[n+1]y[n+2]=(1-Sebuah)y[n+1]+Sebuahx[n+2]=(1-Sebuah)((1-Sebuah)y[n]+Sebuahx[n+1])+Sebuahx[n+2]=(1-Sebuah)2y[n]+Sebuah(1-Sebuah)x[n+1]+Sebuahx[n+2]

Secara umum, Anda bisa menulis y[n+k] sebagai:

y[n+k]=(1-Sebuah)ky[n]+saya=1kSebuah(1-Sebuah)k-sayax[n+saya]

Untuk setiap indeks sampel n+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:

  • Jika M.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 mendapatkan M.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 koperasi multiply-akumulasi (MAC) bukan implementasi rekursif tingkat pertama sederhana mengurangi beberapa manfaat untuk vektorisasi. Pendekatan non-vektor menggunakan 2 MAC per output, jadi Anda perlu2M. operasi untuk menghitung M.output. Skema vektor menghitungM. output sekaligus, membutuhkan M.+1MAC dalam proses. Jadi, pengurangan operasi dapat dinyatakan sebagai fungsiM. sebagai:

    R=M.+12M.=12(1+1M.)

    Begitu pun dengan M.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.


3

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.


2

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.


0

Bagaimana dengan memperluas persamaan menjadi 4 langkah dan menggunakan perkalian matriks? a adalah konstan sehingga satu matriks dapat dihitung sebelumnya


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.