|
|
Spektrogramm, Frequenzanalyse Audio-Datai |
|
Croloc_123 |
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 14.05.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.05.2014, 15:16
Titel: Spektrogramm, Frequenzanalyse Audio-Datai
|
|
|
|
|
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
|
|
|
|
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.05.2014, 19:23
Titel:
|
|
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:
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
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 14.05.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.05.2014, 13:31
Titel:
|
|
Vielen Dank für die Antwort
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
Liebe Grüße
Lukas
|
|
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 25.05.2014, 22:52
Titel:
|
|
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:
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
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|