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
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
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)
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.
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!
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.