Wurzel ziehen am Cortex M0

Gast #3282921
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
Gast #3282970
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
Gast #3283153
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.
Gast #3285892
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
Moderator (Firma: Titel) Persönliche Seite #3285924
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...
Gast #3286058
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.
Gast #3286087
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.
Gast #3286181
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?
Gast #3286305
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.
Gast #3286825
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
#3286905
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
}

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