www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP FFT Ergebnisinterpretation


Autor: Mark (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: wikki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder einfach abs()

Autor: Andreas Lang (andi84)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Lang (andi84)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.