mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Q22.42 division


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tec Nologic (tecnologic) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

http://forums.arm.com/index.php?/topic/14281-arm-f...

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

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

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ist langsam spät... Hier die Formeln

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tec Nologic (tecnologic) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Autor: Tec Nologic (tecnologic) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tec Nologic (tecnologic) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: b. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.