mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Christoph M. (mchris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennt jemand einen schnellen, effizienten Algortihmus zur Berechnung des 
Betrags einer komplexen Zahl?

Autor: Nils (Gast)
Datum:

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

Autor: Christoph M. (mchris)
Datum:

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

Autor: El Ef (Gast)
Datum:

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

Autor: Christoph M. (mchris)
Datum:
Angehängte Dateien:

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

Autor: Yalu X. (yalu) (Moderator)
Datum:

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


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

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

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.

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