mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP wie Ergebnis der FFT interpretieren?


Autor: Chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Hallo,

ich möchte gerne die kürzlich hier

http://www.mikrocontroller.net/forum/read-1-139739...
http://elm-chan.org/t/akilcd.zip

angesprochene FFT-Routine (fft.asm und fft_math.asm) in Assembler
benutzen und mir ist dabei nicht ganz klar, wie das Ergebnis zu
interpretieren ist. Die Eingangsfolge ab dem Label "testdata" scheint
ein ansteigender Sägezahn zu sein. Welches typische Spektrum gehört denn
da dazu? Wie erkenne ich nun das zu erwartende Spektrum aus dem
SRAM-Inhalt, der sich am Ende des Programms ergibt.

Im Quelltext steht dazu folgende Angabe:
" Data-array (starts at sramstart+2)
;* contains real-part and imaginary-part as 16bit values (lo:hi)
;* arranged in pairs first real, then imaginary part.
;* special case occurs at the beginning: first real-value ist f_0
;* and first imag data point represents f(N/2) as real-value
;* NOTE: f_0 & f(N/2) are always real values & never complex data"

weiter heißt es dann noch:

";nun sind die daten für die FFT umsortiert und stehen im SRAM ab
;Adresse (sramstart+2)=$0082. Für Eigene Anwendungen sollten die Daten

;von Anfang an nach der Sortiertabelle "speicherorte_XX_werte"
geordnet
;werden. Die Werte sind im SRAM abgelegt als 16 bit signed integer!"

Das Programm habe ich im Simulator mal laufen lassen und den im
angehängten Bild ersichtlichen SRAM-Inhalt zum Schluß erhalten.
Kann mir dazu jemand beschreiben, wie die Zahlen nun zu interpretieren
sind, so daß man daraus das passende Spektrum erkennen kann ?
(Reihenfolge der Werte, Amplituden, Real- und Imaginärteil)

Gruß

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal die Routien make_bars an:
Bei den 4,7kHz Samplerate wird das Audiospektrum von 0 bis 2,35kHz in
64 Abschnitte unterteilt, also 36Hz.
Ab Adresse BflyBuf liegen die Daten:
16bit realteil
16bit imaginärteil
Werden beide Werte geometrisch addiert erhält man den Betrag, also das
was man bei einem Spektrum Analyser anzeigt, wenn einen die Phasenlage
der Frequenzen nicht interessiert.
Die ganzen Werte sind nun 64 mal vorhanden für 0Hz, 0-36Hz, 36-72Hz
usw.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,

ich meinte das hier aus der Codesammlung:

http://www.mikrocontroller.net/forum/read-4-129705.html#new
http://www.mikrocontroller.net/attachment.php/1297...

Leider habe ich mich im Link vertan, da ich mich zuletzt mit beiden
Threads befaßt habe. Darauf bezieht sich auch das angehängete Bild und
die Zitate stammen auch aus diesem Quelltext (fft.asm). Wenn ich es mit
akilcd.zip letztendlich verwenden kann, soll es mir auch recht sein.

Gruß

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier sieht des ganz genauso aus: 16bit Realteil, 16bit Imaginärteil und
das ganze 64 mal.

Autor: Chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

1. Heißt das, daß ich dann, wenn die Aufteilung der Ergebnisse in der
Tabelle nun klar ist, jeweils aus Re- und IM-Teil nur noch den Betrag
bilden müßte und mir das dann wie auch immer z.B. (per Terminal, mit
LED-Balken oder wie bei der Propeller-Uhr oder aufbereitet für's
Oszilloskop) anzeigen lassen könnte?

Zum neuen Bild:
Ramstart wurde im Quelltext mit 80 hex initialisiert. Entsprechend habe
ich mal mit Pfeilen eingetragen, wie ich nun den Ram-Inhalt
interpretieren würde. Stimmt das wie eingezeichnet? Sind auch F(0) und
F(N/2) richtig?

";* special case occurs at the beginning: first real-value ist f_0
;* and first imag data point represents f(N/2) as real-value
;* NOTE: f_0 & f(N/2) are always real values & never complex data""

Gruß

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dem Code scheint es mit dem Imaginärteil umgekehrt zu sein (Ab
Adresse 80):
16bit Real (0)
16bit Imaginär (N*(31/64))
16bit Real (N*(1/64))
16bit Imaginär (N*(30/64))
16bit Real (N*(2/64))
16bit Imaginär (N*(29/64))
16bit Real (N*(3/64))
16bit Imaginär (N*(28/64))
usw.

Eine Frequenz von 0Hz hat keine Phasenlage, daher gibt es hier keinen
Imaginärteil.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Eine Frequenz von 0Hz hat keine Phasenlage, daher gibt es hier keinen
>Imaginärteil.

Das ist eine absolut falsche Aussage !

Jede Frequenz hat eine Phasenlage. Da sie immer durch einen Vektor in
der Komplexen Ebene dargestellt werden kann.

bei niedrigen Frequenzen dreht sich der Vektor langsamer, bei
hohen Frequenzen eben schneller.
und bei f=0Hz eben gar nicht.

wenn dieser algorithmus keinen imaginärteil für F(0) berechnet fehlt im
grunde etwas. das kann unter umständen bei bestimmmten anwendungen zu
einem grossen Fehler füren.

gruß

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, also FFT usw. ist schon eine Weile her, aber so weit ich mich
erinnere, ist der Real-Teil bei 0Hz die DC-Spannung im Signal? Und dann
wäre die Aussage, dass der Imaginär-Teil bei 0Hz nicht relevant ist,
bzw. immer 0 ist, schon richtig, weil eine DC-Spannung ja keine Phase
haben kann.

Oder habe ich da etwas falsch in Erinnerung?

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

> weil eine DC-Spannung ja keine Phase haben kann.

Kann der Betrag negativ werden?
Wenn nicht, wie stellst Du eine negative DC-Spannung da?

Ciao,
Werner

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo steht was von Betrag ?
Das ist ja eine ganz neue Theorie, dass es im eindimensionalen Raum nur
positive Werte gibt...

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

> Wo steht was von Betrag ?
Ich muß abbitte leisten. Das Ergebnis der FFT für f=0 ist immer reell.


Das kommt davon wenn man dauernd mit Amplituden- und Phasen-Spektren
arbeitet. {Re,Im} = {Ampl,Phase} aber Re <> Ampl und Im <> Phase

Ciao,
Werner

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich muß abbitte leisten. Das Ergebnis der FFT für f=0 ist immer reell.
Das war ja klar, denn der Imaginärteil ist Null.

>Das kommt davon wenn man dauernd mit Amplituden- und Phasen-Spektren
>arbeitet. {Re,Im} = {Ampl,Phase} aber Re <> Ampl und Im <> Phase

Ja, das habe ich ja auch nie bezweifelt.
Re=Amplitude vom Signal mit 0° (bzw. 180° wenn das Signal negativ
ist).
Im=Amplitude vom Signal mit 90° (bzw. 270° wenn das Signal negativ
ist).
Oder sehe ich da was falsch ?

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

> Oder sehe ich da was falsch ?
wenn Dein Signal rein reell bzw. rein imaginär ist, stimmt das.
Ansonsten ist es der (vektorielle) Anteil der Amplitude mit 0°/180°
bzw. 90°/270°.

Ciao,
Werner

Autor: a. mittelfinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles ziemlich durcheinander !

also: 0 hz hat keine phasenlage und ist dc , der imaginärteil ist die
halbe samplefrequenz, die nur negagtiv sein kann, aber nicht imaginär.
d.h. das es keinen sinn macht hier die amplitude zu berechnen. die
amplituden sind vielmehr schon in der rechteckform, der komplexen zahl
ablesbar. eine diskrete fouriertransformation teilt sich klassich in 4
bereiche auf:

1. dc (realteil con 0 hz)
2. halbe samplefrquenz (imaginärteil von 0 hz)
3. positive frequenzen ( e ^ (+i 2 pi (n / N))
4. negative frequenzen ( e ^ (-i 2 pi (n / N))

das ergebnis einer fft liegt immer in rechteckform vor !

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@a. mittelfinger

ich glaube, du solltest mal deine Gedanken etwas ordnen, bevor du
Leuten  unterstellst, sie würde etwas durcheinander bringen.

Sätze wie:
"...der imaginärteil ist die
halbe samplefrequenz, die nur negagtiv sein kann, aber nicht
imaginär..."

...muss man sich mal auf der Zunge zergehen lassen. Ein Imaginärteil
der negativ aber nicht imaginär ist...praktisch ein imaginärer
Realteil...

Nichts für ungut.
Björn

Autor: a. mittelfinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, meinte dich nicht persönlich, sondern die große anzahl von
antworten.

aber ein realer imaginarteil ist im grunde genommen schon richtig.
die komplexe zahl des 0 hz bandes besteht in der rechteckform aus real-
und imaginärteil, von denen der realteil die amplitude des
signal-offsets beschreibt, während der imaginärteil die amplitude der
halben samplefrequenz beschreibt.

beide amplituden können bei einem realen signal nur positiv oder
negativ sein, aber keinen imaginären teil haben. deswegen wird bei
einer realen dft das 0 hz - band verwendet um dort neben dc die
amplitude der halben samplefrequenz (e^i pi) abzuspeichern. sonst hätte
die analyse nämlich nicht N bänder sondern N+1 bänder, von denen das
erste und letzte band jeweils real wären.

bei einer komplexen dft wäre das zugegebenermaßen anders.

so, ich hoffe, ich habe alle klarheiten beseitigt!

ciao

Autor: a. mittelfinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
p.s.

muss nach ordnung meiner gedanken allerdings noch anmerken, dass im
gegensatz zu meinem obigen beitrag, eine reale dft keine negativen
frequenzen enthält. habe da tatsächlich reale und komplexe dft
miteinander vermengt.

Autor: S.Pfleiderer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

zusammengefasst - für mich als Laie mit Aufgabe in der Signalanalyse -

nach der FFT ist:

- die Amplitude die Vektorsumme aus Re und IM bzw. wurzel (Re^2 +
im^2)
- die Phase die Vektorwinkel zw. X-Achse und dem Summenvektor von
Re+IM
  phi := cot(im/re) bzw  tan(re/im)

Stimmt das so?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, es gibt einen Unterschied zwischen arctan und cotan!
http://de.wikipedia.org/wiki/Komplexe_Zahlen

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis - ist natürlich richtig

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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