FFT Ergebnisinterpretation

Gast #809562
Schönen guten Morgen,
ich arbeite seid einigen Tagen an einer Implementierung der FFT zur 
analyse der Frequenzen der Menschlichen Stimme. Ich habe jetzt das 
Problem das ich nicht genau weiß wie ich mit den imaginär und realwerten 
des FFT-Ergebnises umgehen soll.

In der Angehängten Grafik seht ihr oben den Plot der Eingabefunktion. Es 
ist eine 16bit, 50hz mono wave file mit einer sampling Rate von 44khz. 
Ich übergebe die PCM Daten der wave file an die fft Funktion und 
betrachte dabei 2048 punkte. Der untere Plot sind die 2048 punkte des 
Realteils nach der FFT.

Wie kann ich daraus nun wieder auf die Frequenz schließen? Es müsste 
doch nun möglich sein mit Hilfe des Realteils wieder auf die Frequenz zu 
kommen. Habe ich irgend eine Formel übersehen die das beschreibt, oder 
habe ich da ein grundlegendes Verständnisproblem??

Schonmal danke für Eure Antworten
Viele Grüße
Mark
Angehängte Dateien:
Gast
Nun gut... Ich hatte tatsächlich ein Verständnisproblem ;)

Ich berechne die Frequenz nun indem ich den Index des maximalwertes des 
Realwerte-arrays mit der Gesamtfrequenz in Beziehung setze. Bei einer 
Analyse von 256 Points klappt das ganze auch ganz gut (22050 * maxPoint 
/ 128). Das ergebnis ist allerdings nicht besonders genau. Ich hatte 
versucht die anzahl der Points zu erhöhen, allerdings bekomme ich ab 
einer gewissen Größe falsche Werte für die Frequenz.

Wenn ich z.B. eine wave-Datei mit 50hz bei einer samling rate von 
44100hz mit 2048 Points betrachte liegt nach der FFT der Maximalwert im 
realwerte array auf dem index 1.
Daraus ergibt sich dann 22050*1 / 1024 = 21,5hz

Umso größer ich nun die Points wähle, umso ungenauer wird das Ergebnis. 
Wie kann ich ein genaueres ergebnis erziehlen als das was ich mit 256 
Points erhalte?

- Mark
Gast
Für Deine Anwendung musst Du den Betrag der komplexen Zahl bilden, d.h. 
sqrt( Re(x)^2 + Im(x)^2). Dies ist dann proportional zu der Amplitude 
einer Sinusschwingung der entsprechenden Frequenz.
Dachte doch, das wäre so:
Somit entspricht die höchste in der FFT enthaltene Frequenz gerade der 
halben Samplingfrequenz - nach Nyquist ergibt das auch durchaus Sinn. 
(Man möge mich korrigieren, sofern ich gerade falsch liege)
Gast
Danke für Eure Antworten!

@wikki
Wenn ich diese Formel anwende bekomme ich auch einen Wert der mir etwas 
seltsam vorkommt ;)
Wende ich diese Formel auf meine test wave-datei an, bekomme ich 
folgende Werte:
maxPos = 2
realFFTData[maxPos] = 4004452.25
imFFTData[maxPos] = -1.8143095076084137e-005

Als Ergebnis der Berechnung bekomme ich dann 4004452.3 als Wert raus. 
Wie kann ich nun daraus auf meine Eingangsfrequenz schließen?

@Andreas Lang
Ich benutze bei meiner Berechnung nur die halbe Samplingfrequenz (also 
22050hz), also sollte ich das (hoffe ich) schon berücksichtigt haben...

Viele Grüße
Mark
es gilt weiterhin:
Damit ist phi die Phase der Frequenzkomponente.
Dann kmommt noch dazu, dass, sofern das Signal nicht ein ganzzahliges 
Vielfaches der Frequenzaufklösung der FFT ist (Bedingung wäre
), der sog. Leckeffekt auftritt und das Spektrum des Signals 
"verschiert" -> statt einem einzelnen Peak verteilt sich die 
Signalenergie im Ergebnis der FFT auf mehrere benachbarte Frequenzen.
--
EDIT: dass ich in der Formel oben die möglichkeit, dass das Signal 
imaginär sein könnte, schändlicherweise nicht berücksichtigt habe, möge 
man mir verzeihen.
Gast
Wie kann man denn diese Phasenverschiebung feststellen bzw. beseitigen? 
Es wäre ja durchaus unvorteilhaft wenn eine Frequenz von 1200hz 
verschoben wird und eine andere frequenz dadurch bestärkt wird, die 
eigentlich garnicht so eine starke Amplitude hat oder?

Mein Frequenz-Rückberechnungsproblem konnte ich mitlerweile lösen :) 
Danke nochmal für Eure Hilfe!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.