Forum: Mikrocontroller und Digitale Elektronik Q22.42 division


von Benedikt (Gast)


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

von holger (Gast)


Lesenswert?

>ich möchte auf einem STM32 Cortex M3 eine Fixed Point Divisionsroutine
>in Assembler erstellen.

Schreib die doch in C. Das Teil ist schnell genug dafür.

von Alex E. (tecnologic) Benutzerseite


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

von Benedikt (Gast)


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

von holger (Gast)


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?

von Benedikt (Gast)


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

von Benedikt (Gast)


Lesenswert?

Ach ja, geschwindigkeit natürlich as fast as possible! Sagen wir im 
zweistelligen ms bereich sollte es schon sein!

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Ist langsam spät... Hier die Formeln

von holger (Gast)


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;)

von Benedikt (Gast)


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.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

hi Benedikt,

rein Interesse halber was für ein System 17. Ordnung hast du? Ich werde 
demnächst auch das Problem haben einen Kalman Filter mit 
Zustandsregelung in einem STM32 aufzubauen, dieses System bewegt sich 
aber in der größe 10. Ordnung. Vllt kann ich deine library auf mich 
herrunter brechen.

MfG

Tec

von Benedikt (Gast)


Lesenswert?

Hi,

es geht mal wieder um ein Navigationssystem bzw. Lageregler, je nachdem 
ob GPS empfang da is oder nicht ;-)

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Hi,

sowas in der Richtung habe ich auch vor. Der Zeit beschäftige ich mich 
aber mit dem Kalman Filter, bzw der Ermittlung der Kovarianzen.
Stellst du das irgend wo rein wenn du fertig bist? Oder ist das 
geschäftlich?

MfG

Tec

von Benedikt (Gast)


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

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Hi,

ok dann habe ich da noch was falsch verstanden. Ich bin noch relativ am 
Anfang mit dem Filter, muss gerade noch meine Bachelorthesis fertig 
machen. Danach habe ich da wieder Zeit für Matlab zu quälen.

MfG

Tec

von b. (Gast)


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....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.