Forum: Digitale Signalverarbeitung / DSP / Machine Learning Betrag (cplx) schnell berechnen


von Christoph M. (mchris)


Lesenswert?

Kennt jemand einen schnellen, effizienten Algortihmus zur Berechnung des 
Betrags einer komplexen Zahl?

von Nils (Gast)


Lesenswert?

Christoph M. schrieb:
> Kennt jemand einen schnellen, effizienten Algortihmus zur
> Berechnung des
> Betrags einer komplexen Zahl?

klar:

  float mag = sqrt (re*re+im*im);

Wenn Du es schneller brauchst, dann sag uns für welche Platform Du es 
brauchst und was für eine Genauigkeit Dir vorschwebt.

von Christoph M. (mchris)


Lesenswert?

>Wenn Du es schneller brauchst,

Danke für die Antwort. Ich will die Amplitude von int16_t.
Hier gibt's eine ziemlich schnelle Methode:
https://dspguru.com/dsp/tricks/magnitude-estimator/

Allerdings ist mir unklar, ob die in der Tabelle tatsächlich 25dB Fehler 
meinen.

von El Ef (Gast)


Lesenswert?

Das schnellste ist 
https://en.m.wikipedia.org/wiki/Alpha_max_plus_beta_min_algorithm

Kann man auch noch bisschen auf Genauigkeit tunen, in dem man je nach 
Bereich unterschiedliche Koeffizienten verwendet.

Alternativ wäre CORDIC auch eine Möglichkeit

von Christoph M. (mchris)


Angehängte Dateien:

Lesenswert?

>Das schnellste ist
Danke, das ist der aus dem Link weiter vorne, aber mit besserer 
Beschreibung und noch einer Approximation mehr. Mal sehen, ca. 1.2% 
Fehler ist gar nicht so schlecht für 3 Multiplikationen und ein wenige 
Hühnerfutter.

Cordic ist mir glaube ich zu rechenintensiv.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Christoph M. schrieb:
> CPLX_ABS_Estimation.png

Dieses Verfahren lässt sich verallgemeinern:


Für optimale Parameter α_i und β_i beträgt der maximale relative Fehler


1
     max. rel.
2
 n    Fehler
3
——————————————
4
 1    3.957%
5
 2    0.970%
6
 3    0.430%
7
 4    0.241%
8
 5    0.154%
9
 6    0.107%
10
 7    0.079%
11
 8    0.060%
12
——————————————

Dafür werden jeweils 2n Multiplikationen benötigt. Mit α₀=1 und evtl.
auch β₀ und entsprechender Anpassung der anderen Parameter spart man
eine oder zwei Multiplikation ein, ohne dass die Genauigkeit des
Ergebnisses allzu sehr darunter leidet. Nur ist dann die Berechnung der
Parameter nicht mehr ganz so einfach.

Spätestens für n=8 lohnt sich das Verfahren nicht mehr, da man mit 17
Multiplikationen den Betrag auch klassisch (Wurzel aus der Summe der
Quadrate) wesentlich genauer berechnen kann.

: Bearbeitet durch Moderator
von Michael W. (Gast)


Lesenswert?

El Ef schrieb:
> Alternativ wäre CORDIC auch eine Möglichkeit

Cordic ist so ziemlich das Langsamste in der Reihe der genannten 
Methoden.
Ich bin eher für die Tabellenlösung, die man noch optimieren kann, wenn 
man die beiden Werte so tauscht, dass jeweils immer der größere 
berechnet wird.

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.