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

Spektrogramm, Frequenzanalyse Audio-Datai

 

Croloc_123
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2014, 15:16     Titel: Spektrogramm, Frequenzanalyse Audio-Datai
  Antworten mit Zitat      
Hallo Leute!

ich kenn mich mit Matlab leider nicht gut aus, muss aber für meine Bachelorarbeit die Frequenz eines gemessenen Audiosignals bestimmen.
Die Frequenz wird sich im laufe des Signals verändern, daher ist eine einfache fft analyse (mit dem Befehl fft) nicht das richtige glaube ich.

Deshalb habe ich den Befehl spectrogram benutzt:

% Audiodatei einlesen
[y, fs] = audioread('doppler.wav');

% Spektrogram anzeigen
% S = spectrogram(x,window,noverlap,nfft,fs)
% -> window ist das Hamming Fenster der Länge nfft
% -> noverlap ist die anzahl der Abstaungen, die jedes segment überlappt.
% Der vorgabewert ist die anzahl, die 50% überlappungen zwischen den
% Segmenten erzeugen.
% -> nfft ist die FFT-Lände
% -> fs ist die Abtastfrequenz
% -> 'yaxis' vertauscht Achsen

x = y;
window = 1024;
noverlap = 512;
nfft = 1024;
fs = fs;

figure; spectrogram(x,window,noverlap,nfft,fs, 'yaxis');

das ist meine Funktion.
Sie gibt mir auch gut sichtbar als 2D-Plot den Frequenzverlauf über die Zeit aus.
Ich bräuchte jetzt allerdings noch eine konkrete Auswertung der vorherrschenden Frequenz. Dabei kann ich recht genau sagen, in welchem Bereich sich diese Frequenz befinden muss.
Weiß jemand von euch, wie ich den Zahlenwert der Frequenz auslesen kann?
Ich brauch diesen, um eine Rechnung bezüglich des Dopplereffekts durchzuführen.

Liebe Grüße
Lukas
Private Nachricht senden Benutzer-Profile anzeigen


Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2014, 19:23     Titel:
  Antworten mit Zitat      
du kannst natürlich die Funktion spectrogram dafür benutzen, lass dir das Spektrogram als Matrix von der Funktion zurückgeben.

Die Spalten enthalten dabei die Kurzzeitspektren, daraus suchst du dir jeweils das Maximum bzw. den Index und suchst dir die entsprechende Frequenz aus dem Frequenzvektor des Spektrograms heraus (kannst du dir ebenfalls zurückgeben lassen). Anschließend kannst du Frequenzen gegen die Zeit plotten.

Ohne es ausprobiert zu haben müsste das ungefähr so aussehen:

Code:

[S, F, T] = spectrogram(...);
[dummy idx] = max(S);
frequency = F(idx);
plot(T,frequency)
 



Dieser Ansatz ist allerdings nicht echtzeitfähig, da die Funktion spectrogram immer das komplette Signal benötigt. Ist die Berechnung In Echtzeit das Ziel, so müssen die Daten blockweise verarbeitet werden. Beispielsweise mittels fft (also das was spectrogram im Grunde macht) oder als Grundfrequenzschätzung über Autokorrelation oder Cepstrum. Sicherlich gibts dazu noch einige andere Möglichkeiten, Quellen dazu sollten sich reichlich finden lassen.

Schönes Wochenende
 
Croloc_123
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2014, 13:31     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort Smile

Habe jetzt mal folgendes probiert:

[y, fs] = audioread('doppler.wav');


[S,F,T] = spectrogram(y);
[dummy idx] = max(S);
frequency = F(idx);
plot(T,frequency)

hast du das so gemeint?
Ich bekomme auch ein Schaubild raus, das einen Knick in der Frequenz hat, wie er auch sein sollte, die Zahlen stimmen aber überhaupt nicht.

Ich versteh die Matrix S noch nicht so richtig. Vorallem ist mein T nur ein Zeilenvektor der Länge 7. Sollte der nicht länger sein?
T gibt doch die Zeiten aus, bei denen das spektrogramm ausgerechnet wurde oder?
Und mein Vektor F ist ein Spaltenvektor der Länge 32769, bei einer Samplingrate von fs=16000 im Zeitbereich.
Welche Frequenzen habe ich dann überhaupt, also vorallem welche Abstände zwischen des einzelnen Punkten (delta f)?

tut mir Leid, ich steig noch nicht so durch bei dem ganzen Thema.

Würde mich freuen du kannst mir nochmal helfen Smile

Liebe Grüße
Lukas
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2014, 22:52     Titel:
  Antworten mit Zitat      
Die Zahlen stimmen nicht, weil du das Spektrogram mit den Standart optionen berechnet hast.

Standartgemäß wird das Signal in nur sehr wenige Blöcke zerlegt (7 oder 8 ? irgendwie sowas in der Art). Außerdem werden die Frequenzen normalisiert berechnet.

Schau dir einfach mal die Dokumentation zu spectrogram an.

Bei deinem Signal würde ich es mal mit folgenden Optionen versuchen:

Code:

...
nfft = 512;
window = hann(nfft);
overlap = 0.5;
[s, f, t ] = spectrogram(y,window, round(overlap*nfft), nfft,fs)
...
 



Dabei gilt: Umso größer nfft, desto besser ist die Frequenzauflösung aber umso schlechter ist die zeitliche Auflösung.
Durch die Angabe der Abtastrate wird der Frequenzvektor in Hz zurückgegeben.

Welche fft-Länge (nfft) und welche Fensterfunktion du am besten verwendest, kann dir niemand genau sagen, da musst du einfach mal ein bisschen rumprobieren.


Viel Erfolg
 
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 - 2024 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.