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ß
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.
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ß
Hier sieht des ganz genauso aus: 16bit Realteil, 16bit Imaginärteil und das ganze 64 mal.
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ß
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.
>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ß
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?
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
Wo steht was von Betrag ? Das ist ja eine ganz neue Theorie, dass es im eindimensionalen Raum nur positive Werte gibt...
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
>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 ?
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
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 !
@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
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
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.
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?
Nein, es gibt einen Unterschied zwischen arctan und cotan! http://de.wikipedia.org/wiki/Komplexe_Zahlen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.