Q22.42 division

Gast #2017281
Lesenswert?

Hallo,

ich möchte auf einem STM32 Cortex M3 eine Fixed Point Divisionsroutine
in Assembler erstellen. Wahrscheinlich ergeht es mir wie vielen anderen, 
die Multiplikation war nicht schwierig. Aber bei der Division komme ich 
nicht ganz weiter. Ich verwende das Q22.42 Format und benutze dazu 64 
bit Variable (long long var). Bitte nicht auf ein Q16.16 Format 
verweisen, das schränkt vom Zahlenbereich zu sehr ein. Dabei sollte das 
Ergebnis einer Division von zwei Q22.42 Zahlen wieder ein Q22.42 Zahl 
sein. Es muss doch sicherlich irgendwo in den Tiefen des Netzes ein 
Paper/Tutorial/Library geben die soetwas für den STM32 in optimierter 
(Laufzeit) Form in assembler beschreibt?!?! Der STM32 erfreut sich ja 
ziemlicher beliebtheit.
Ich habe mir jetzt schon echt die Finger Wundgegoogelt aber nichts zu 
wollen...

Danke schonmal für hilfreiches und weiterführendes Material, Tipps oder 
Links!!

Benedikt
Persönliche Seite #2017299
Lesenswert?

hi,

http://forums.arm.com/index.php?/topic/14281-arm-fixed-point-vs-floating-point-cortex-m-3/

schau dir mal diesen Thread an. das ist zwar ein Q16.16 Beispiel was du 
nicht haben wolltest, aber skalier es doch auf 64bit hoch und teste es. 
Dann siehst du, wie der Compiler das in Assambler umsetzt, dann siehst 
du dir an was dir nicht gefällt und optimierst den Assambler Code.

So würde ich vorgehen, wobei ich bisher immer mit 32Bit aus kam.

Mfg

tec
Gast #2017313
Lesenswert?

Hallo TecNologic,

is nicht so einfach! Die größten Register die es im STM32 gibt haben 64 
bit und für die division mit 64/64 bräuchte ich ja ein 128 bit register 
um daraus eine 128/64 zu machen. Die 16 bit routine ist für den STM32 
kein Problem, das kann er schon in HW! Aber ich müsste ja eine 128/64 
bit machen und da ist der knackpunkt!

@holger
ich gebe dir recht wenn ich nur ein paar divisionen machen müsste. 
Berechnet werden soll aber ein Kalamn filter mit einer systemmatrix von 
17x17 ca. 300 Divisionen ergeben sich darus und es kommen noch einige 
von andern Berechnugen hinzu, sowie addition und multiplikation! Da 
kommt es mir schon sehr auf die Zykluszeiten meiner Routinen an!

Grüße,
Benedikt
Gast #2017317
Lesenswert?

>Berechnet werden soll aber ein Kalamn filter mit einer systemmatrix von
>17x17 ca. 300 Divisionen ergeben sich darus und es kommen noch einige
>von andern Berechnugen hinzu,

Da langweilt der sich. Wie eilig hast du es denn?
Gast #2017332
Lesenswert?

Hi Holger,
Ja bei den 300 wird es nicht bleiben, da habe ich echt viel zu tief 
gestapelt aber schau dir die gleichungen im anhang an, A,H,P,Q,K sind 
17x17 matrizen und x und z sind 1x17. Du siehst das die matrizen wild 
miteinander verrechnet werden. Transponieren, Inverse, 
Multiplikationen...
Du meinst wirklich der langweilt sich? Also wenn hier noch mehr der 
meinung sind das es wirklich schnell geht und ich mir keine sorgen wegen 
performance machen muss, dann bin ich schon mal 10kg leichter ;-)
Woher nimmst du deine Erfahrung? Hattest du ähnlich projekte mit dem 
STM32 laufen?

Viele Grüße,
Benedikt
Gast #2017348
Lesenswert?

>Du meinst wirklich der langweilt sich?

Ja. Und ich glaube das du dir mit deinem Q22.42
eine Genauigkeit in die Tasche lügst die du gar nicht
brauchst. Wo kommen die Daten her die du verarbeitest?
Aus einem 24Bit AD Wandler? Da wackeln die letzten 8 Stellen
doch sowieso nur random bei einem Anfängerlayout;)
Gast #2017419
Lesenswert?

Ich benötige diese genauigkeit auch nicht maßgeblich für die 
sensorwerte, sondern für werte die bei der berechnung "entstehen" wie 
kovarianzen und bei den systemrauschthermen. Aber klar, die genauigkeit 
ist hier bewusst über die maßen genau, ich will mir diese library auch 
für den späteren gebrauch bauen.
Gast #2018357
Lesenswert?

Die kovarianzen rechnet der filter doch "selbst"! Ich bin im moment noch 
am überlegen ob ich es öffentlich mache, eventuell später wenn ich etwas 
vorweisen kann! Aber erfahrungen austauschen und das ein oder andere 
ergebnis zur verfügung stellen, das ist doch klar! also wenn ich ne 
division habe wird die hier gepostet! Aber vielleicht gibt ja noch 
jemand einen wertvollen tipp dazu, wir würden jedenfalls freuen ;-)

grüße,
benedikt
Gast #2028545
Lesenswert?

Hallo,

kann mir denn keiner weiterhelfen? Wie teile ich 2 variable also 64bit 
zahl durch 64bit zahl???

Unglaublich aber ich finde im gaaanzen web nix, zu diesem speziellen 
problem. Der stm32 hat ja ein 32bit devide in HW und eine hw 
multiplikation mit 32x32 bit und 64 bit result, falls es bei der lösung 
von nutzen wäre.

Danke schonmal, ich geb's langsam auf....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren