FFT



  • Hallo Fans der Signalverarbeitung,

    ich habe mich nach langer Zeit mal wieder mit der FFT beschäftigt, und eine Routine dafür im Netz gefunden. Diese macht aus einem real-Signal eine komplexe Folge fk von Fourier-Koeffizienten die in fk[2*j] (real-Teil) bzw. fk[2*j+1] (imaginär-Teil) gespeichert werden. Dabei gilt j>=1, und in fk[1] liegt der Real-Teildes N/2-ten Koeffizienten. So weit so klar, aber in fk[0] liegt
    der sogenannte DC term und damit kann ich irgendwie nix mehr anfangen. Also: was ist ein DC-Term und was mache ich damit? Auffälig war, das dieser Wert immer riesig groß war ... 😕



  • gleichstrom-term?
    haste ein signal zwischen mit lauter werten zwischen 0 und 60000? dann könnte der gleichstum-anteil so um 30000 liegen und die anderen teile halt je nach signal und so eher normale werte haben.
    würd ich mir so denken, aber ich hab noch nicht viel mit FFT rumgespielt.

    ist das überhaupt gesund, wenn der so groß ist? ich mein, in der berechnung drinne sind bei betragsmäßig stark unterschiedlichen doubles ja lauter rechenfehler in additionen und subtraktionen. sollte man vorher mal durch schlichte mittelwertbildung und verschiebung den dc-anteil ungefähr nullen?

    [ Dieser Beitrag wurde am 17.06.2003 um 00:37 Uhr von volkard editiert. ]



  • DC steht ursprünglich für Direct Current == Gleichstrom, und bezeichnet den Gleichanteil des Signales. Wenn du also deine Fourierreihe hast: A0 + A1*cosx + B1*sinx + A2*cos2x + ... (die Faktoren usw. sind wahrscheinlich alle falsch, ich hab davon nur noch das Grundprinzip im Kopf und bin zu faul, die Details nachzuschlagen), dann ist A0 der Gleichanteil. Stell dir z.B. eine ganz simple Funktion wie f(x) = 10sin2x - 0.8 vor. Gleichanteil = -0.8. Generell kriegt man bei einer beliebigen periodischen Funktion den Gleichanteil heraus, indem man die Funktion über eine Periode integriert und durch die Länge der Periode dividiert. Elektrotechnisch gesehen ist der Gleichanteil das was übrig bleibt, wenn man das Signal perfekt glättet. Oder auch das, was wegfällt, wenn man das Signal durch einen Hochpassfilter jagt.



  • Noch mal ein Nachtrag zum Thema DC-Anteil... da muß man unheimlich aufpassen, einige Implementation der FFT sparen sich bei der DFT die Division durch N (Länge des Vektors), dann ist der fk[0] nämlich die SUMME der Werte und nicht der Mittelwert. Die FFT in Excel z.B. arbeitet so... man muß also auf der Strecke einmal dividieren, entweder bei der DFT oder bei der iDFT!

    Original erstellt von volkard:
    sollte man vorher mal durch schlichte mittelwertbildung und verschiebung den dc-anteil ungefähr nullen?

    Kann wohl Sinn machen, schaut man sich den Signalflußplan an: http://www.baeckmann.de/dft.htm Seite 33. Da der große Wert durch ein Hinzutröpfeln aller Werte aufsummiert wird, kann man diesen Effekt dadurch verringern wenn man vorher überall eine Normierung um den Nullpunkt herum durchführt.

    Aber... bevor man dann einen Filter drüberjagt, sollte man natürlich den fk[0] wieder korrigieren. 🙂



  • Manchmal bringt ne fft auch nicht A0/2 sondern a0, dann muss man noch durch 2 dividieren. Oder aber der ist richtig und alle anderen |c(n)| müssen noch mit 2 multipliziert werden.

    Kannst du mal die Quelle des Sources posten, würde mich interesieren !!!



  • Das liegt daran, ob man sich mathematisch oder physikalisch für das Ergebnis interessiert... die mathematische Implementation kann mit allem Leben. Will man die Ergebnisse aber physikalisch interpretieren, sind nicht mehr alle Varianten erlaubt.



  • Interessant ist auf jedenfall folgendes: http://www.dspguide.com/ http://www.dspdimension.com/

    sollte man vorher mal durch schlichte mittelwertbildung und verschiebung den dc-anteil ungefähr nullen?

    Naja. Mann macht meistens keine FFT des kompletten Signals, sondern nur eines kurzen Abschnitts des signals, weil das signal noch garnicht komplett vorliegt (Betrachten des Frequenzspektrums wärend einer Aufnahme mit nem Mikro). Oder aber eine komplette Analyse des Signals sinnlos ist, da es grade um die Unterschiede zu verschiedenen Zeitpunkten geht.

    Eine der einfachsten Möglichkeiten dennoch das DC zu entfernen wäre ein HP-Filter, da jeder HP-Filter das DC entfernt.

    So weit so klar, aber in fk[0] liegt
    der sogenannte DC term und damit kann ich irgendwie nix mehr anfangen. Also: was ist ein DC-Term

    Wie du sicher weißt wandelst du Timedomain in Frequencydomain (Tut mir leit die Deutsche übersetzung klingt irgendwie zu doof). Dabei erhälst du die Amplitude der Frequenzen zwischen Null Herz und Nyquist-Frequenz. Der Wert für 0Hz ist das DC. Quasi eine Offset des Signals.



  • Original erstellt von Helium:
    Wie du sicher weißt wandelst du Timedomain in Frequencydomain (Tut mir leit die Deutsche übersetzung klingt irgendwie zu doof)

    Tut mir leid, aber Zeitbereich und Frequenzbereich sind nunmal die üblichen deutschen Begriffe. Doof klingen die auch nicht, auf jeden Fall nicht dööfer als die englischen 🙂



  • Original erstellt von Helium:
    Eine der einfachsten Möglichkeiten dennoch das DC zu entfernen wäre ein HP-Filter, da jeder HP-Filter das DC entfernt.

    Ist aber nicht ungefährlich, da ein realer HP keine ideale Flanke hat, d.h. der Frequenzgang des Spektrums wird durch den Frequenzgang des Filters schon mal verändert.

    Es spielt übrigens keine Rolle, ob man die FFT über den ganzen Vektor oder über Fenster macht, einen Gleichanteil gibt es für jeden transformierten Abschnitt, und für jeden Abschnitt wird der Wert fk[0] sich als Mittelwert darstellen. Bei Abschnitten mit 2048 Punkten wird der Wert zahlenmäßig durchaus recht groß.



  • Ist aber nicht ungefährlich, da ein realer HP keine ideale Flanke hat, d.h. der Frequenzgang des Spektrums wird durch den Frequenzgang des Filters schon mal verändert.

    Ja. Aber in vielen gebieten ist das nicht so schlimm. Wenn in einem Audiostrom die Frequenzen unterhalb von 5Hz Fehlen ist das egal.


Anmelden zum Antworten