Forum: Digitale Signalverarbeitung / DSP / Machine Learning Frequenzskalierung der Ergebnisse der FFT


von Skywalker (Gast)


Lesenswert?

Es ist wahrscheinlich eine recht triviale Verständnisfrage, aber das 
bereitet mir etwas Kopfzerbrechen.

- Ich nehme in MatLab eine viersekündige Mikrofonaufnahme (normale 
Sprache) auf mit einer Samplerate von 44,1kHz.
- Diese wird als wave-Datei gespeichert und dann wieder eingelesen.
- Vor der FFT liegen somit 176400 Samples vor.
- Diese teile ich in eine Framegröße von 441 Samples ein.
- Das ganze noch mit einem Hammingfenster multipliziert und dann in eine 
512-FFT eingelesen.
- Daraus erhalte ich 512 komplexe Werte, wobei ich nur die ersten 257 
Werte benutze und aus denen die Amplituden und Phasen berechne.

(Nicht wundern wegen den vielleicht komischen Werten, das ist so 
gewollt.)

Nun möchte ich das Amplitudenspektrum darstellen. Das funktioniert nun 
(übrigends für alle Frames) problemlos. Kopfzerbrechen bereitet mir nun 
die Einteilung der Frequenzachse. Die scheint nicht richtig zu sein, da 
bei einem normalen Satz (männlich) sehr viele Werte um 10kHz liegen.

Wie genau berechne ich die Abstände dieser Frequenzwerte im 
Amplitudenspektrum?

Bisher verwende ich als Frequenzbereich beim plot:
0:44100/512:44100/2 (diese Bereich wird in einem Array freq gespeichert)
Der Hauptanteil liegt dann bei 10kHz. Problem ist auch, dass die Anzahl 
der Frequenzwerte den Anzahl der FFT entsprechen muss.
plot(freq,amp)   (amp enthält die 256 Amplitudenwerte)

Wie krieg ich den Frequenzbereich so hin, dass er passt?

von Georg A. (Gast)


Lesenswert?

Bei einer komplexen 512er-FFT steckst du 512 komplexe Werte rein und 512 
komplexe kommen raus. Du schreibst nicht, ob du den img-Teil des 
Eingangssignals auf 0 setzt oder links und rechts als komplexen Wert 
reinsteckst. Ist aber egal, bei beiden Varianten kommt etwas raus, was 
du wahrscheinlich nicht erwartest, nämlich die Aufteilung der 
Ergebniskoeffizienten in positive (0-255) und negative Frequenzen 
(511-256) und das "vermischt" für beide Eingangskanäle. Beide Bereiche 
können aber zwangsläufig nur von 0 bis fs/2 gehen. D.h. Koeffizient 1 
und 511 liegen auf 22050/256=~86Hz usw.

Wenn du nur einen Monokanal verarbeiten willst, solltest du eine FFT mit 
nicht komplexen Eingangsdaten suchen (kenn mich jetzt mit Matlab nicht 
aus, wirds aber wohl auch da geben :) ). Bei Stereo kann man die 
komplexe FFT schon auch nutzen, allerdings muss man die 
Ergebniskoeffizienten noch nachbearbeiten, um tatsächlich getrennte 
Spektren für L+R zu bekommen.

Hint: Steck mal einen synthetischen Sinus bzw. Cosinus mit 172.xxxHz auf 
einem Kanal in die FFT und schau das Spektrum an... Dann sollte der 
Zusammenhang klar werden, ist nur + und -...

von Skywalker (Gast)


Lesenswert?

Danke für die Hinweise. Es hat sich herausgestellt, dass meine 
ursprünglichen Annahmen korrekt waren. Ich hab deinen Tipp befolgt und 
tatsächlich mit Testsignalen getestet. Das Spektrum war korrekt skaliert 
und beinhaltete die richtigen Frequenzen.

Man sollte sich eben nicht dazu verleiten lassen solche Dinge mit 
menschlicher Sprache zu testen. Die enthält mehr Frequenzanteile als man 
denken mag. ;)

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.