Hat jemand Erfahrungen wie viele wurzen pro sekunde auf einem Arm cortex M0 (32 Mhz) möglich sind mit sqrt() bzw wie lange die dauer einer Berechnung von der Zahl abhängt? FPUs haben die M0s ja nicht... lg bigm
Hallo, so jetzt noch die Frage aus welcher Variablen: integer 8 bit integer 16 bit integer 32 bit oder floating point 32 bit IEEE. Es gibt da einen algorithmus, der in integer sehr schnell geht und wurde in assembler auf dem GBA (ARM7) entwickelt. Ist aber ein leichtes es auf Cortex M0 umzuschreiben. Ist im Web zu finden. Mit der Software FPU (C-Library) hängt es vom Copiler ab und auch je nach Genauigkeit. Frage was solls den werden. Gruß Sascha
Hi, es geht rein um eine Scheinleistungsberechnung und da ist die frage ob ich diese Kontinuierlich mit den Messwerter hinbekomme also mit 10kHz oder ob ich sampln muss und nur bei Bedarf rechne. Naja in Frage kommt nur 32bit idealerweiße float. Hast du einen Link zu dieser Implementierung? lg bigm
Bigm schrieb: > kontinuierlich mit den Messwerter Moment mal, wieviele Bits haben Deine Meßwerte? Eventuell reicht ja auch eine Tabelle im Flash.
Nicht ganz vergleichbar, aber ein paar Zahlen http://www.smxrtos.com/ussw/gofast/gofast_thumb2_iar.htm M3, LM3S8962, 50 MHz, alles in Mikrosekunden double sqrt 13.7 (GoFast) 53.4 (IAR) single sqrt 7.6 (GoFast) 11.3 (IAR)
Jim Meba schrieb: > Moment mal, wieviele Bits haben Deine Meßwerte? Eventuell reicht ja auch > eine Tabelle im Flash. 2 * voll 16bit da es sich um signed werte handelt.... lg Michael
Bigm schrieb: > 2 * voll 16bit da es sich um signed werte handelt.... Du meinst signed 16bit in und signed 16bit out? Dann sind es nur 15bit in, weil man sich das "j" je nach Vorzeichen dazumultiplizieren kann. Dafür reichen dann auch 64kByte.
Bigm schrieb: > Jim Meba schrieb: >> Moment mal, wieviele Bits haben Deine Meßwerte? Eventuell reicht ja auch >> eine Tabelle im Flash. > > 2 * voll 16bit da es sich um signed werte handelt.... Bei der Frage war wohl eher gemeint, wieviel gültige Bits die Messwerte haben. Die Wurzel aus Rauschen (i.e. Messfehlern und Störungen) dürfte im Mittel eher uninteressant sein.
Wolfgang schrieb: > Bei der Frage war wohl eher gemeint, wieviel gültige Bits die > Messwerte haben. ja da sind es bei der Spannungs messung 12bit und bei der Strommessung auch 13 bit. jeweils die obere Hälfte des Wertebereichs für Positiv und die untere hälfte für Negativ. lg
Schau dir mal den Heron-Algorithmus an. Das ist ein iteratives Verfahren zur Berechnung der Quadratwurzel und besteht aus einer Addition und Division. mfg
Oliver K. schrieb: > Schau dir mal den Heron-Algorithmus an. Das ist ein iteratives Verfahren > zur Berechnung der Quadratwurzel und besteht aus einer Addition und > Division. Wie hoch sind meine chancen das besser als sqrt zu implementieren bzw was steckt da drinnen? lg
"Wie hoch sind meine chancen das besser als sqrt zu implementieren bzw was steckt da drinnen? lg" Sehr gut, wenn du dich nur auf die wichtigen Bits konzentrierst und nicht die größtmögliche Bitgröße abdecken willst.
Wäre sowas interessant ? http://www.microchip.com/forums/m577584-print.aspx Eventuell Assembler-Optimiert ?
Hallo, ich suche gerade noch nach der Implementierung für die Wurzel, muss da aber einige alte Backups noch durchstöbern. Bitte nicht vergessen, das der ADC Wert erst noch Offset und Gain korrigiert werden muss, vor man die Wurzel zieht. Andere Frage, wozu das negative Vorzeichen? Es gibt keine Wurzel aus einer negativen Zahl! Ha habe jetzt die Seite wieder gefunden. http://www.finesse.demon.co.uk/steven/sqrt.html Gruß Sascha
> Andere Frage, wozu das negative Vorzeichen? Es gibt keine Wurzel aus > einer negativen Zahl! - ------- \ / | = 2 i \/ -4
Sascha schrieb: > Andere Frage, wozu das negative Vorzeichen? Es gibt keine Wurzel aus > einer negativen Zahl! Doch gibt es... Aber ob es sinnvoll ist einem Mikrocontroller imaginäre Zahlen beizubringen? Gruß Chris
Oliver K. schrieb: > Schau dir mal den Heron-Algorithmus an. Das ist ein iteratives Verfahren > zur Berechnung der Quadratwurzel und besteht aus einer Addition und > Division. Ich hätte da noch den Beitrag "Quelle für Quadratwurzelalgorithmus" Der dortige Algorithmus braucht nicht mal eine Division, sondern nur Schiebeoperationen. Und wenn man dann die Rechenbreite auf die benötigten Bits einschränkt, wäre sicher ein Blumentopf zu gewinnen...
Mal so als Größenordnung: auf einem ATMega mit 18MHz habe ich aus einem Int32 unsigned 22k Quadratwurzeln / Sekunde ziehen können, jedoch wurde in jedem Zyklus ein A/D-Wandler auf 6 Kanälen abgefragt, ein paar einfache anderen Rechenoperationen (Addition, Multiplikation, schieben)zugefügt und ein DAC per SPI beschrieben. War ein RMS-Wandler für ein 3D-Accelerometer. Konnte alles in allem je Achse und für alle Achsen zusammen ca. 5,5k Aktualisierungen/Sekunde samplen, berechnen und ausgeben.
Hallo, also wenns ein Messgerät werden soll würde ich das in Floating Point machen. Übrigens ein Cortex M4F wie von ST der STM32F373 hat alles drin ! Sogar kann die FPU VSQRT Floating-point square root. Na da sind doch alle Problem weg. Gruß Sascha PS. habe das Teil schon in einem Messgerät drin, leuft ausgezeichnet.
Sascha schrieb: > also wenns ein Messgerät werden soll würde ich das in Floating Point > machen. Och da wäre ich sehr vorsichtig, gerade wenn damit weitergerechnet werden soll (z.B. DC offset etc) auf dem Gerät. Rechenbeispiel (IEEE743 32 Bit float) 18000000.0f + 1.0f ist?
Maxx schrieb: > 18000000.0f + 1.0f ist ? Gleichviel wie 18000000.0f - 1.0f... Wobei für 18 Mio. auch beim Integer schon 25 Bits nötig sind.
Hallo, ja klar ich kenne das Problem die Mantisse ist ja nur 23 Bit groß. Aber Wurzel aus 32 bit Integer ist ja wohl auch nicht besser oder ? Gruß Sascha
Sascha schrieb: > Aber Wurzel aus 32 bit Integer ist ja wohl auch nicht besser oder ? Wenn es sich nicht gerade um eng angebundene, integrierte Fließkommaeinheiten dreht: doch es macht einen deutlichen Unterschied bis zu einigen Größenordnungen (kommt halt auf die Implementierung / den Kern an) Ein Cortex M0 kommt in der Regel ohne FPU daher. Und macht float-Berechnungen in Software.
Wie wärs mit fixkomma. geht tierisch schnell... 1x division. Tut mir leid für den Code, den muss man natürlich für eine reine C-Implementierung adaptieren, aber die Rechenweise ist sehr optimal.
sche*****, falsche funktion :-D das war die rsqrt. aber der einzige unterhschied ist, das zähler und nenner bei der Division verdreht sind^^ nochmal korrekt.. Achso: Gezogen wird die Wurzel aus "Data".
Hallo, intressant, nur sehe ich richtig, es beinhaltet eine 64 Bit Division und ausgegangen wird von 32 Bit? Eine Division mit 64 Bit geht aber auch nicht rasch von statten. wo oder was ist "*this" und dann ist da noch eine Multiplikation mit 32Bit * 32Bit = 64Bit, der ARM7TDMI-S ARM9 CM3 CM4 könnte das, ich glaube im CM0 ist der Befehl nicht vorhanden? (SMLAL,UMULL,UMLAL) CLZ gibts auch nicht im CM0. Code: int ld = (31-__builtin_clz(Data)) - FracBits; Muss ich mal in Assembler umsetzen, aber einige Stellen des Codes kann ich nicht deuten. Gibts da noch eine Dokumantation für die Funktionen? Oh man, da sehe ich auch noch was auf mich zukommen, weil ich auch einen CM0 bald einsetzen will!!! Gruß Sascha
Dieser Algorithmus ist für integer relativ schnell, wenn man ihn in Assembler implementiert. http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Binary_numeral_system_.28base_2.29
1 | short isqrt(short num) { |
2 | short res = 0; |
3 | short bit = 1 << 14; // The second-to-top bit is set: 1L<<30 for long |
4 | |
5 | // "bit" starts at the highest power of four <= the argument.
|
6 | while (bit > num) |
7 | bit >>= 2; |
8 | |
9 | while (bit != 0) { |
10 | if (num >= res + bit) { |
11 | num -= res + bit; |
12 | res = (res >> 1) + bit; |
13 | }
|
14 | else
|
15 | res >>= 1; |
16 | bit >>= 2; |
17 | }
|
18 | return res; |
19 | }
|
Hier gibt es einige Implementierungen für ARM7. Leider kein thumb... http://www.finesse.demon.co.uk/steven/sqrt.html
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.