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

Frequenzanalyse eines Wav-Files

 

bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 15:19     Titel: Frequenzanalyse eines Wav-Files
  Antworten mit Zitat      
Hallo!

Ich habe ein kleines Problem:

Ich möchte ein .wav-File (10 Sekunden lang) mit Hilfe einer Fourier-Analyse untersuche. Prinzipiell habe ich das auch hinbekommen:

Mit wavread die Datei importieren und dann eine Analyse machen, dann bekomme ich die Frequenzen des wav-files angezeigt. Allerdings möchte ich nun folgendes machen:

Ich will den ZEITLICHEN- Verlauf des wav-Files untersuchen, damit ich erkenne welche Frequenzen wann auftauchen bzw. verschwinden. Ich hatte mir das so vorgestellt, dass immer nur ein kleiner Teilausschnitt (ca. 0,1 Sekunden) aus dem Signal herauspicke und jeweils dieses Stück einer Fourieranalyse unterziehe. Danach wird der nächste Abschnitt untersucht. Das ganze wird in Echtzeit in eine Diagramm geplottet. Leider funktioniert das nicht, da zum einen meine Wav-Files immer eine etwas andere Länge haben und ich zum anderen nicht weiß wie ich dieses abschnittsweise analysieren nicht hinbekomme.

Kann mir da jemand einen Tipp geben?

Danke!


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 09.04.2013, 15:33     Titel:
  Antworten mit Zitat      
Ich nehme mal an, dass was du suchst, ist ein Spektrogramm. Dafür gibt es sogar eine Funktion in Mtalab

Code:


Du brauchst dazu aber die Signal Processing Toolbox. In älteren Matlabversionen heißt die Funktion specgram. Das Spektrogramm stellt eine Abhängigkeit der Frequenzen zur Zeit dar, was durch Aufteilen des Signals in kleinere Segmente passiert. Je nach dem wie man Segmentlänge und den Overlap wählt, kann man die Auflösung von Frequenz- und Zeitachse in dem Diagramm steuern.
Private Nachricht senden Benutzer-Profile anzeigen
 
bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 16:50     Titel:
  Antworten mit Zitat      
ok danke. mal ne blöde Frage: wie finde ich denn raus ob ich diese Tool-Box habe? Hab Matlab hier an einem Uni-Rechner und kein plan was da installiert ist^^


angenommen ich habe diese Tool-Box nicht, was mach ich dann?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.04.2013, 17:12     Titel:
  Antworten mit Zitat      
Hallo bex,

Dann lass Dir anzeigen, was installiert ist:
Code:

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 18:05     Titel:
  Antworten mit Zitat      
ahh danke! ich hab die toolbox Smile werde ich mich morgen mal damit beschäftigen
 
bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 20:21     Titel:
  Antworten mit Zitat      
ähm... ich hab mit der Funktion jetzt ein buntes Bild bei dem die Zeit an der y-Achse aufgetragen und die Frequenz auf der x-achse. leider ohne Einheit... kann mir jemand sagen wie ich das Diagramm interpretieren soll?

Nach der Beschreibung ist das tatsächlich genau was ich brauche... nur bin ich mir in Anbetracht des Bildes nicht so sicher^^
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 09.04.2013, 20:43     Titel:
  Antworten mit Zitat      
Versuch es mal mit dem Befehl

Code:


nach dem Spectrogram. Damit sollte dir eine Legende zu den Farben dargstellt werden. Die Farben stellen die Amplitude der Frequenzen dar.
Private Nachricht senden Benutzer-Profile anzeigen
 
bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 11:34     Titel:
  Antworten mit Zitat      
hm, mit dem Befehl kann ich nur die Farben im Diagramm umschalten. Aber eine Legende bekomme ich nicht.
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.04.2013, 12:26     Titel:
  Antworten mit Zitat      
Sorry...
Code:
wäre richtig gewesen. Mit colormap passt du die Farben an, wie du nun schon selber herausgefunden hast.
Private Nachricht senden Benutzer-Profile anzeigen
 
bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 13:02     Titel:
  Antworten mit Zitat      
aha, danke!

Mein Problem ist aber nun, dass ich das Diagramm trotzdem nicht interpretieren kann:

mein Test-wav ist ca. 8 Sekunden lang.

Mit dem Befehl
Code:
[y, Fs] = wavread('C:\Users\username\Desktop\sinus.wav');


lese ich das ganze ein.

Dann folgt der Befehl:

Code:


wobei, y(:,1) den Zugriff auf den ersten der beiden Kanäle beschreibt.

Das Diagramm, das darauf erscheint, hat auf der y-Achse die Zeit von 0 - 4.5 * 10^4 angegben... aber ohne Einheit. Das passt ja irgendwie nicht mit der Länge des wav-Files zusammen. Auf der x-Achse ist eine Frequenz von 0 - 1 als "Normalized Frequency (x PI rad/sample)"... damit kann ich so gar nix anfangen. Und die Colorbar läuft von -10 bis -150 allerdings auch ohne jede Angabe was sich dahinter verbirgt...

kann da jemand Klarheit bei mir schaffen?

Danke!
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.04.2013, 14:16     Titel:
  Antworten mit Zitat      
Um das genauer erklären zu können, müsstest du mal Anzahl Messwerte von y und auch FS angeben.

Die Frequenzachse zeigt dir die normierte Frequenzan w/wn in rad/s wobei wn = ws/2 ist. Die Amplitude wird hier wohl in dB angegeben. 0 dB = 1,
-20 dB = 0.1 bei Lestungssignalen.

Sonst versuch mal folgendes, in dem du das Bild

Code:

[y, Fs] = wavread('C:\Users\username\Desktop\sinus.wav');
N = length(y(:,1)); % Anzahlmesswerte

% FFT Segmentlänge und Fensterlänge
% kleine Sgementlänge nfft -> feinere Frequenz- aber schlechte
% Zeitauflösung
nfft = N/8; % Segmentlänge (8 ist glaube ich der Standardwert bei spectrogram)
% Overlap = window_size/2
numoverlap = nfft/2; % Anzahl der Messwerte, die sich zwei benachbarte Segmente überlappen

[S,F,T]=spectrogram(x,window,numoverlap,nfft,Fs);

% Spektrogramm nun selber erzeugen
surf(T,F,20*log10(abs(S+eps)));
view(0,90); % Darstellung in 2D
colormap(jet)
colorbar
zlabel('Magnitude [dB]')
ylabel('Frequenz [Hz]');
xlabel('Zeit [s]');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 15:20     Titel:
  Antworten mit Zitat      
hm, so richtig steige ich da nicht durch.

Die Erklärungen in der Matlab-Hilfe sind da nicht richtig zu gebrauche, da mir wohl das Hintergrundwissen fehlt.

Die Anzahl der Messwerte hängt ja von der Länge meiner Datei ab, meine Samplingrate liegt bei 44100 1/s, damit kann man sich die Anzahl der Punkte ja ausrechnen.
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.04.2013, 17:30     Titel:
  Antworten mit Zitat      
Bei den Grundlagen kann ich dir ohne gezielte Fragen nicht helfen. Ich habe dir mal ein kleines Testprogramm geschrieben (ich habe ja deine Daten nicht). Evtl. wird dir hier der Zusammenhang des Spektrogramms aus der Darstellung im Zeitbereich und des Betragsspektrums im Frequenzbereich klar.

Code:

% Testsignal aus Matlab
load('mtlb');
y = mtlb(1:2048);
N = length(y); % Anzahlmesswerte



subplot(2,2,2)
plot(0:1/Fs:(N-1)/Fs,y);
grid on;
title('Darstellung Zeitbereich');
ylabel('Amplitude');
xlabel('Zeit [s]');

subplot(2,2,4)
fn = Fs/2; % Nyquistfreq.
df = Fs/N; % Frequenzauflösung des Spektrums
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;

% Signal transformieren
Fy = fft(y,N);

k = N/2 + 1;
%   Betrag - nur positives Freq.spektrum  
Fy_pos0 = abs(Fy(1:k));
 
%   Skalierung  
mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];

% Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)

plot(fv,mag_dB);
grid on;
title('Darstellung Betragsspektrum mittels FFT');
ylabel('Magnitude [dB]')
xlabel('Frequenz [Hz]');


subplot(2,2,[1 3])
% FFT Segmentlänge und Fensterlänge
% kleine Sgementlänge nfft -> feinere Frequenz- aber schlechte
% Zeitauflösung
nfft = N/8; % Segmentlänge (8 ist glaube ich der Standardwert bei spectrogram)
% Overlap = window_size/2
numoverlap = nfft/4; % Anzahl der Messwerte, die sich zwei benachbarte Segmente überlappen
% alte Matlab Funktion
% [S,F,T]=specgram(y,nfft,Fs,nfft,numoverlap);
% neue Matlab Funktion
[S,F,T]=spectrogram(y,nfft,numoverlap,nfft,Fs);

% Spektrogramm nun selber erzeugen
surf(T,F,20*log10(abs(S+eps)));
view(0,90); % Darstellung in 2D
colormap(jet)
colorbar
%set(gca,'ytick',[0:200:Fs/2]);
title('Darstellung Spektrogramm');
zlabel('Magnitude [dB]')
ylabel('Frequenz [Hz]');
xlabel('Zeit [s]');
 


Ich hoffe das funktioniert so, denn ich kann es mit der spectrogram Version nicht testen, da ich bei meinem Matlab hier nur die alte specgram Funktion nutzen kann. Das Ergebnis sollte aber bei beiden Funktionen gleich sein. Lediglich die Übergabeparameter sind in einer anderen Reihenfolge.
Private Nachricht senden Benutzer-Profile anzeigen
 
bex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 19:28     Titel:
  Antworten mit Zitat      
danke, das ist sehr nett von dir!

leider sagt mein matlab, dass unter %Skalierung das nfft undefiniert ist...
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.04.2013, 19:35     Titel:
  Antworten mit Zitat      
Ja...Sorry, copy and paste Wink

Ersetz mal die Zeile durch:
Code:

%   Skalierung  
mag = [Fy_pos0(1)/N ;Fy_pos0(2:k-1)/(N/2);Fy_pos0(k)/N];
 
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.