Saya membutuhkan komputasi atan2(x,y)
pada FPGA dengan aliran input / output data yang berkelanjutan. Saya berhasil mengimplementasikannya menggunakan kernel CORDIC yang belum di-pipeline, tetapi untuk mendapatkan akurasi yang saya butuhkan, saya harus melakukan 32 iterasi. Hal ini menyebabkan sejumlah besar LUT dikhususkan untuk tugas yang satu ini. Saya mencoba mengubah aliran untuk menggunakan kernel CORDIC yang tidak dikontrol sebagian, tetapi kemudian saya membutuhkan frekuensi clock yang dikalikan untuk mengeksekusi loop berulang sambil tetap mempertahankan aliran input / output yang berkelanjutan. Dengan ini, saya tidak dapat menemukan waktu.
Jadi sekarang saya mencari cara komputasi alternatif atan2(x,y)
.
Saya berpikir tentang menggunakan tabel look-up blok-RAM dengan interpolasi, tetapi karena ada 2 variabel saya akan membutuhkan 2 dimensi tabel lookup, dan ini sangat sumber daya intensif dalam hal penggunaan block-RAM.
Saya kemudian berpikir untuk menggunakan fakta yang atan2(x,y)
terkait atan(x/y)
dengan penyesuaian kuadran. Masalahnya adalah ini x/y
perlu pembagian yang benar karena y
tidak konstan, dan pembagian pada FPGA sangat intensif sumber daya.
Apakah ada cara baru untuk menerapkan atan2(x,y)
pada FPGA yang akan menghasilkan penggunaan LUT yang lebih rendah, tetapi masih memberikan akurasi yang baik?
sumber
atan2
. Namun, tidak yakin apakah Anda bisa bertahan tanpa pembagian.atan2
. Anda masih akan membutuhkan pembagian.Jawaban:
Anda dapat menggunakan logaritma untuk menyingkirkan divisi. Untuk(x,y) di kuadran pertama:
Gambar 1. Plotatan(2z)
Untuk referensi nanti, berikut ini adalah skrip Python kikuk yang saya gunakan untuk menghitung kesalahan aproksimasi:
di mana adalah turunan kedua dari dan adalah maksimum lokal dari kesalahan absolut. Dengan yang di atas kita mendapatkan perkiraan:f′′(x) f(x) x
Karena fungsinya cekung dan sampel cocok dengan fungsinya, kesalahan selalu ke satu arah. Kesalahan absolut maksimum lokal dapat dikurangi setengahnya jika tanda kesalahan dibuat bergantian bolak-balik setiap interval pengambilan sampel. Dengan interpolasi linier, hasil yang mendekati optimal dapat dicapai dengan memfilter setiap tabel dengan:
di mana dan adalah asli dan tabel yang difilter mencakup rentang dan bobotnya adalah . Pengkondisian akhir (baris pertama dan terakhir dalam persamaan di atas) mengurangi kesalahan pada ujung tabel dibandingkan dengan menggunakan sampel fungsi di luar tabel, karena sampel pertama dan terakhir tidak perlu disesuaikan untuk mengurangi kesalahan dari interpolasi antara itu dan sampel di luar tabel. Subtabel dengan interval pengambilan sampel yang berbeda harus difilter secara terpisah. Nilai bobot ditemukan dengan meminimalkan secara berurutan untuk meningkatkan eksponenx y 0≤k≤N c0=98,c1=−116,b0=1516,b1=18,b2=−116 c0,c1 N nilai absolut maksimum kesalahan perkiraan:
untuk posisi interpolasi antar sampel , dengan fungsi cekung atau cembung (misalnya ). Dengan bobot tersebut diselesaikan, nilai bobot akhir pengkondisian ditemukan dengan meminimalkan nilai absolut maksimum:0≤a<1 f(x) f(x)=ex b0,b1,b2
untuk . Penggunaan prefilter tentang separuh kesalahan aproksimasi dan lebih mudah dilakukan daripada optimasi penuh tabel.0≤a<1
Gambar 4. Kesalahan perkiraan dari 11 sampel, dengan dan tanpa prefilter dan dengan dan tanpa pengkondisian akhir. Tanpa akhir pengkondisian prefilter memiliki akses ke nilai-nilai fungsi tepat di luar tabel.log2(a)
Artikel ini mungkin menyajikan algoritma yang sangat mirip: R. Gutierrez, V. Torres, dan J. Valls, " FPGA-implementasi atan (Y / X) berdasarkan transformasi logaritmik dan teknik berbasis LUT, " Journal of Systems Architecture , vol . 56, 2010. Abstrak mengatakan implementasi mereka mengalahkan algoritma berbasis CORDIC sebelumnya dalam kecepatan dan algoritma berbasis LUT dalam ukuran jejak.
sumber