Ich muss atan2(x,y)
auf einem FPGA mit einem kontinuierlichen Eingabe- / Ausgabestrom von Daten rechnen. Ich habe es geschafft, es mit nicht gerollten CORDIC-Kerneln in Pipelines zu implementieren, aber um die Genauigkeit zu erreichen, die ich benötige, musste ich 32 Iterationen durchführen. Dies führte dazu, dass eine große Anzahl von LUTs dieser einen Aufgabe gewidmet war. Ich habe versucht, den Fluss so zu ändern, dass teilweise entrollte CORDIC-Kernel verwendet werden, aber dann brauchte ich eine multiplizierte Taktfrequenz, um wiederholte Schleifen auszuführen und trotzdem einen kontinuierlichen Eingabe- / Ausgabe-Fluss aufrechtzuerhalten. Damit konnte ich das Timing nicht einhalten.
Jetzt suche ich nach alternativen Möglichkeiten für die Datenverarbeitung atan2(x,y)
.
Ich dachte darüber nach, Block-RAM-Nachschlagetabellen mit Interpolation zu verwenden, aber da es 2 Variablen gibt, würde ich 2 Dimensionen von Nachschlagetabellen benötigen, und dies ist im Hinblick auf die Block-RAM-Verwendung sehr ressourcenintensiv.
Ich habe dann darüber nachgedacht, die Tatsache zu nutzen, atan2(x,y)
die atan(x/y)
mit der Quadrantenanpassung zusammenhängt. Das Problem dabei ist, dass x/y
eine echte Teilung erforderlich ist, da dies y
keine Konstante ist und die Teilung auf FPGAs sehr ressourcenintensiv ist.
Gibt es neuere Möglichkeiten zur Implementierung atan2(x,y)
auf einem FPGA, die zu einer geringeren LUT-Nutzung führen, aber dennoch eine gute Genauigkeit bieten?
quelle
atan2
. Bin mir aber nicht sicher, ob du ohne Division auskommen kannst.atan2
. Sie benötigen jedoch noch eine Unterteilung.Antworten:
Sie können Logarithmen verwenden, um die Division zu entfernen. Für( x , y) im ersten Quadranten:
Abbildung 1. Diagramm vonatan ( 2z)
Sie müssten sich einem ( 2 z ) im Bereich von - 30 < z < 30atan ( 2z) , um die erforderliche Genauigkeit von 1E-9 zu erhalten. Sie können die Symmetrie atan ( 2 - z ) = π ausnutzen- 30 < z< 30 atan ( 2- z) = π2- atan ( 2z) oder stellen Sie alternativ sicher, dass( x , y) in einem bekannten Oktanten ist. Log2( A ) approximieren:
Abbildung 2. Diagramm vonLog2( c )
Für Ihre Genauigkeitsanforderungen, lineare Interpolation und gleichmäßige Abtastung,214+1=16385 Abtastungen von log2(c) und 30×212+1=122881 Abtastungen vonatan(2z) für0<z<30 ausreichen. Der letztere Tisch ist ziemlich groß. Der Fehler durch Interpolation hängt dabei stark vonz :
Abbildung 3. Größter absoluter Fehler bei einer ( 2 z )atan(2z) für verschiedene Bereiche von z (horizontale Achse) für verschiedene Anzahlen von Stichproben (32 bis 8192) pro Einheitsintervall von z . Der größte absolute Fehler für 0≤z<1 (weggelassen) ist geringfügig kleiner als für floor(log2(z))=0 .
Dieatan ( 2z) -Tabelle kann in mehrere Untertabellen aufgeteilt werden, die 0 ≤ z< 1 und in verschiedene Boden ( log2( z) ) mit z≥ 1 , was einfach zu berechnen ist. Die Tabellenlängen können gemäß Abb. 3 gewählt werden. Der Index innerhalb der Untertabelle kann durch einfache Manipulation von Bitfolgen berechnet werden. Für Ihre Genauigkeitsanforderungen haben die atan ( 2z) -Untertabellen insgesamt 29217 Samples, wenn Sie den Bereich von z bis 0 ≤ z< 32 zur Vereinfachung.
Zum späteren Nachschlagen hier das klobige Python-Skript, mit dem ich die Approximationsfehler berechnet habe:
Der lokale Maximalfehler von Approximieren einer Funktionf( x ) durch lineare Interpolation ff^( x ) aus Proben vonf( x ) , mit Abtastintervall durch gleichförmige Abtastung gemachtΔ x kann durch analytisches angenähert werden:
wof''( x ) die zweite Ableitung vonf( x ) undx ist ein lokales Maximum des absoluten Fehlers. Mit dem obigen erhalten wir die Annäherungen:
Da die Funktionen konkav sind und die Abtastwerte mit der Funktion übereinstimmen, liegt der Fehler immer in einer Richtung. Der lokale maximale absolute Fehler könnte halbiert werden, wenn das Vorzeichen des Fehlers einmal in jedem Abtastintervall hin und her wechselt. Mit linearer Interpolation können nahezu optimale Ergebnisse erzielt werden, indem jede Tabelle vorgefiltert wird durch:
Dabei sindx und y die ursprüngliche und die gefilterte Tabelle, die beide 0≤k≤N c0=98,c1=−116,b0=1516,b1=18,b2=−116 c0,c1 N
for0≤a<1 . Use of the prefilter about halves the approximation error and is easier to do than full optimization of the tables.
Figure 4. Approximation error oflog2(a) from 11 samples, with and without prefilter and with and without end conditioning. Without end conditioning the prefilter has access to values of the function just outside of the table.
This article probably presents a very similar algorithm: R. Gutierrez, V. Torres, and J. Valls, “FPGA-implementation of atan(Y/X) based on logarithmic transformation and LUT-based techniques,” Journal of Systems Architecture, vol. 56, 2010. The abstract says their implementation beats previous CORDIC-based algorithms in speed and LUT-based algorithms in footprint size.
quelle