Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT Ergebnisinterpretation


von Mark (Gast)


Angehängte Dateien:

Lesenswert?

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

von Mark (Gast)


Lesenswert?

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

von wikki (Gast)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

Oder einfach abs()

von Andreas L. (andi84)


Lesenswert?

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)

von Mark (Gast)


Lesenswert?

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

von Andreas L. (andi84)


Lesenswert?

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.

von Mark (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.