WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Frequenzauflösung bei FFT

 

voice
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.05.2010, 13:22     Titel: Frequenzauflösung bei FFT
  Antworten mit Zitat      
Hallo,

mich verwirrt ein wenig die Frequenzauflösung bei der spektralen Darstellung im Frequenzbereich. Vokal_a ist eine .wav Datei mit einer Abtastrate von 8000 Hz.

Code:

sound = wavread('vokal_a');
spec = fft(sound);
abs_spec = abs(spec);
leng = length(spec);
freq = (1:length(spec)).*8000/length(spec);
plot(freq,abs_spec)
 


Meine Verständnisprobleme treten bei
Code:
freq = (1:length(spec)).*8000/length(spec);
auf.

Ich möchte ja damit mein Frequenzenarray auf meine Abtastfrequenz von 8kHz normieren. Das heißt, auf meiner X-Achse eine Skala von 1-8000 Hz darstellen, wobei bei 4000 Hz das Signal sich anfängt zu spiegeln, was vom Abtasttheorem her rührt. Das aber erst einmal bei Seite.

Wie muss ich anfangen, das Verhältnis zwischen Abtastrate und Anzahl der Samples zu verstehen, die dann noch elementarweise mit einem Vektor (1:Anzahl der Abtastwerte) multipliziert werden?

Lieben Gruß und Dank

voice
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 18.05.2010, 20:20     Titel:
  Antworten mit Zitat      
Hi,

du benutzt fft() ohne eine Angabe der FFT Länge, d.h. es wird die Länge des gesamten Vektors genommen. Die Frequenzauflösung ist abhängig von der FFT Länge, das heißt im deinem Beispiel auch Abhängig von der Länge des Signals. Zum Nachfolziehen der Berechnung von freq. führe mal die teilschritte, die da berechnet werden nacheinander durch. Es wir ein vektor mit den Einträgen 1 bis Länge des Spektrums gebildet, dieser wird dann mal der Maximalfrequenz Multipliziert und durch die Länge des Spectrumvektors geteilt, damit erhälst du als Label nicht mehr die FFT Punkte, sondern die Frequenzen.

Hier ein Beispiel mit einem Testsignal,

Code:

spec = randn(16000,1);
abs_spec = abs(spec);
leng = length(spec);
freq = (1:length(spec)).*8000/length(spec);
plot(freq,abs_spec)
 


Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 09:08     Titel:
  Antworten mit Zitat      
Hi,

dank Dir schon mal für die Antwort. Eines verwirrt mich jedoch noch ein wenig. Die 8000 Hz ist doch jetzt die Abtastfrequenz, oder? (da die Auflösung ja das Verhältnis von Abtastfrequenz und Anzahl der Abtastwerte ist)? Weil Du geschrieben hast, das die 8000 Herz die höchst vorkommende Frequenz ist. Wäre nicht 4000 Herz die höchste Frequenz aufgrund von Nyquist? Und müsste dann das Spektrum in deinem Bsp. nicht bis 4000 Herz gehen?

Viel Grüße und Dank

voice
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 09:11     Titel:
  Antworten mit Zitat      
@ derOli

Hast du meinen Foreneintrag von der Grundfrequenz gelesen? Hast Du evtl. noch ein paar Tips oder kannst mir sagen, ob ich mit meiner Theorie richtig liege?

Gruß

voice
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 10:02     Titel:
  Antworten mit Zitat      
Dann hätte ich direkt noch eine Frage:

Wenn ich nun nur einen bestimmten Bereich in Form von Werten haben möchte, zum Beispiel die ersten 600
Code:

short=abs_spec(1:600);
freq_short = (1:length(short)).*8000/length(short);
figure(2)
plot(freq_short,short)
 



Wie passe ich dann für meinen Signalausschnitt die Frequenzauflösung an? Sodass ich nur den Bereich der Frequenzen habe, den ich auch ausgeschnitten habe? Bei der obigen freq_short Zeile wird die Frequenzachse falsch dargestellt.

Gruß und Dank

voice
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 10:07     Titel:
  Antworten mit Zitat      
Ich glaube, die Lösung selbst gefunden zu haben.

Code:

short=abs_spec(1:600);
freq_short = (1:length(short)).*8000/length(spec);
figure(2)
plot(freq_short,short)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 20.05.2010, 12:59     Titel:
  Antworten mit Zitat      
Hi,

mit der Maximalfrequenz, meinte ich die Maximalfrequenz, die du darstellen möchtest. Natürlich ist die reelle Maximalfrequenz 4000 Hz. Deswegen nimmt man ja normalerweise die Hälfte des Spektrumvektors, was du ja ersteinmal nicht machen wolltest.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.