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


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte gerne die kürzlich hier

http://www.mikrocontroller.net/forum/read-1-139739.html#140384
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ß

von Benedikt (Gast)


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.

von Chris (Gast)


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/129705/fft-asm.zip

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ß

von Benedikt (Gast)


Lesenswert?

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

von Chris (Gast)


Angehängte Dateien:

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ß

von Benedikt (Gast)


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.

von Christian (Gast)


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ß

von Michael (ein anderer) (Gast)


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?

von Werner (Gast)


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

von Benedikt (Gast)


Lesenswert?

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

von Werner (Gast)


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

von Benedikt (Gast)


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 ?

von Werner (Gast)


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

von a. mittelfinger (Gast)


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 !

von Björn (Gast)


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

von a. mittelfinger (Gast)


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

von a. mittelfinger (Gast)


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.

von S.Pfleiderer (Gast)


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?

von Alex (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Danke für den Hinweis - ist natürlich richtig

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.