Forum: Mikrocontroller und Digitale Elektronik Wurzel ziehen am Cortex M0


von Bigm (Gast)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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

von Bigm (Gast)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

Bigm schrieb:
> kontinuierlich mit den Messwerter

Moment mal, wieviele Bits haben Deine Meßwerte? Eventuell reicht ja auch 
eine Tabelle im Flash.

von Arc N. (arc)


Lesenswert?

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)

von Bigm (Gast)


Lesenswert?

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

von uint32_t (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Bigm (Gast)


Lesenswert?

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

von Oliver K. (olli_k)


Lesenswert?

Schau dir mal den Heron-Algorithmus an. Das ist ein iteratives Verfahren 
zur Berechnung der Quadratwurzel und besteht aus einer Addition und 
Division.

mfg

von Bigm (Gast)


Lesenswert?

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

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

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

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Wäre sowas interessant ?

http://www.microchip.com/forums/m577584-print.aspx

Eventuell Assembler-Optimiert ?

von Sascha (Gast)


Lesenswert?

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

von Trebe (Gast)


Lesenswert?

> Andere Frage, wozu das negative Vorzeichen? Es gibt keine Wurzel aus
> einer negativen Zahl!



-    -------
 \  /       |  = 2 i
  \/   -4

von Christoph H. (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von kk (Gast)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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.

von Maxx (Gast)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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

von Maxx (Gast)


Lesenswert?

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.

von ... (Gast)


Angehängte Dateien:

Lesenswert?

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.

von ... (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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

von Tim  . (cpldcpu)


Lesenswert?

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
}

von Tim  . (cpldcpu)


Lesenswert?

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
Noch kein Account? Hier anmelden.