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

Spectrogram eines Audiosignals mit Pegel in Pascal

 

Patzekal
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2015, 20:49     Titel: Spectrogram eines Audiosignals mit Pegel in Pascal
  Antworten mit Zitat      
Hallo liebe Profis,
ich habe ein, hoffentlich für euch triviales, Problem. Entschuldigt bitte, dass ich nicht die Zeit hatte, um in den Threads viel zu suchen...

Ich habe ein Audiosignal (wav), welches als Spektrogramm dargestellt werden soll. Die Colorbar sollte eigentlich Werte zwischen 0 und 6,... Pascal anzeigen, wie sie es bei der fft auch tut. Macht sie aber nicht. Der Wertebereich liegt zwischen -20 und -140 (db?). Surf hatte ich schon ausprobiert, verstehe ich aber auch nicht ganz.

Code:

a=audioread...
a=a.*faktor %[Pa]
left=a(:,1); % linker Kanal
Fs=44100;
x=left;
nfft = 512;
window = hann(nfft);
overlap = 0.5;

figure(1)
[S,F,T,P]=spectrogram(x,window,round(overlap*nfft),nfft,Fs);

% surf(T,F,abs(S),'EdgeColor','none')
view(2)
xlim([0 t])
ylim([0 Fs/2])
title('Spektrogramm Mono')
ylabel('Frequenz [Hz]')
xlabel('Zeit [s]')
 


Was ist denn genau S,F,T,P? Und gibt es eine Möglichkeit, dass ich die Colorbar mit gescheiten Werten hinkriege???

Entschuldigt nochmals, falls ihr das schon 10e3 Mal gehört habt...

Danke im Voraus!
Pascal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.03.2015, 23:04     Titel: Re: Spectrogram eines Audiosignals mit Pegel in Pascal
  Antworten mit Zitat      
Hallo Patzekal,

Hast Du schon die Dokumentation des Befehls durchgelesen? http://www.mathworks.com/help/signal/ref/spectrogram.html
Dies sollte die Outputs hinreichend gut erklären. Es wäre nicht effizient, wenn hier im Forum die Hilfe-Texte nacherzählt werden.
Ist nach dem Lesen des Hilfe-Textes noch etwas unklar? Was genau?

Was genau ist denn eine "gescheite" colorbar? In den Beispielen findest Du eines, bei dem die ColorBar manuell definiert wird - mit dem Befehl "colorbar" naheliegenderweise. Hilft das?

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Patzekal
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2015, 09:50     Titel:
  Antworten mit Zitat      
Gude Jan,
danke für die Anteilnahme! Ich kenne die Hilfe. Das Problem besteht immer noch, dass ich meinen Audiovektor in das spectrogram einsetze und die Colorbar mir nur negative Werte anzeigt.
Wenn ich surf benutzen möchte, gibt er mir die Colorbar mit bis zu 700 aus (bei Werten zwischen 0 und 6,3 Pa)...
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 14.03.2015, 11:03     Titel:
  Antworten mit Zitat      
Die Magnitude S ist in dB/Hz skaliert.

Umrechnung von S zu linear müsste wie glaube ich so sein:

Code:

Mag_lin = 10^(S / 20) % für Feldgröße
Mag_lin = 10^(S / 10) % für Energiegröße
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Patzekal
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2015, 11:43     Titel:
  Antworten mit Zitat      
Ok, das wusste ich nicht... Danke! Dennoch funktioniert die EInbindung nicht. Weiß einer, was zu tun ist?
Code:

figure(1), colorbar
%F=0:1:2500; % Anzeigebereich Hz
[S,F,T,P]=spectrogram(x,window,round(overlap*nfft),nfft,Fs);

S=10.^(S/20);
surf(T,F,abs(S),'EdgeColor','none')
%view(2)
%xlim([0 t])
%ylim([0 Fs/2])
title('Spektrogramm Mono')
ylabel('Frequenz [Hz]')
xlabel('Zeit [s]')
 

Ich bekomme folgenden Fehler:

Warning: Axis limits outside float precision, use
ZBuffer or Painters instead. Not rendering
> In Loadwave at 96
Warning: Axis limits outside float precision, use
ZBuffer or Painters instead. Not rendering
> In Loadwave at 96
>>
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.03.2015, 01:47     Titel: Re: Spectrogram eines Audiosignals mit Pegel in Pascal
  Antworten mit Zitat      
Hallo Patzekal,

Zitat:
Surf hatte ich schon ausprobiert, verstehe ich aber auch nicht ganz.

Was hast Du genau ausprobiert und was verstehst Du nicht?

Um heraus zu finden, wieso die Axis-Limits jenseits der Floating-Point-Precision sind, müsste wir ein Programm und die Input-Daten haben, die das Problem reproduzieren. Mir fällt bisher zumindest noch nichts ein, was ich antworten könnte.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Patzekal
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.03.2015, 13:10     Titel:
  Antworten mit Zitat      
Hey Jan und danke nochmals!

Mit der Umrechnung des Faktors müsste die maximale Laustärke max. 6.32 Pa groß sein. Das Probelm ist, dass ich nicht ganz nachvollziehen kann, was die Outputs S und P (PSD) zu bedeuten haben und ob ich surf richtig bedatet hab. Leider ist es meine Vorgabe das spectrogram zu verwenden und es eine STFT machen zu lassen, was ja laut Hilfe nur über die Outputs [S,F,T,P] geht. Es sieht sonst auch i.O. aus, nur die Colorbar ist daneben und zeigt seltsame Werte an.
Schön wäre natürlich eine Lösung dazu, falls es ganz andere Ideen bezüglich eines 3d-Plots gibt, die nachvollziehbar (für den Ottonormalverbraucher) sind, wäre ich aber auch nicht abgeneigt =)

Code:

clear all
close all
clc


% Voreinstellungen
Fs=44100;


% Laden eines Tonsignals
a=audioread('c:\eig440Hz.wav');
p=audioplayer(a,Fs);
N=length(a);
t=N/Fs;
Ts=(t/Fs);

% X: Zeit-Achse
xt=(0:(t/((Fs*t)-1)):t);

% X: Bins-Achse
N=length(a);
xbin=0:(N-1);

% X: Frequenzachse
xHz=(xbin*Fs/N);

% Y-Achsen als Pa
faktor=6.710615645;
a=a.*faktor;

p0=2*10^(-5);
window = hamming(N);
aw=a(:,1).*window;

%Frequenzspektrum
ff=fft(aw)/N;
ff1=abs(ff);
m=floor(N/2);

% Spektrogramm
% 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

left=a(:,1); % linker Kanal
x=left;
nfft = 1024;
window = hamming(nfft);
overlap = 0.5;

figure(1), colorbar

F=0:1:2500; % Anzeigebereich Hz
[S,F,T,P]=spectrogram(x,window,round(overlap*nfft),F,Fs);
surf(T,F,abs(S),'edgecolor','none')
view(2)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.03.2015, 13:33     Titel:
  Antworten mit Zitat      
Hallo Patzekal,

Wie genau können wir Dir weiter helfen?

Zitat:
Das Probelm ist, dass ich nicht ganz nachvollziehen kann, was die Outputs S und P (PSD) zu bedeuten haben

Die Documentation sagt dazu:
S: the short-time Fourier transform of the input signal, x. Each column of s contains an estimate of the short-term, time-localized frequency content of x.
P: matrix, containing a power spectral density (PSD) estimate of each section.

Was bedeutet "surf richtig bedatet"? Was ist denn "richtig"? Dazu müsstest Du noch erklären, was Du genau erreichen möchtest. Man kann zu einem Stück Code ja nicht entscheiden, ob es richtig oder falsch ist, zumindest so lange die Syntax korrekt ist.

Zitat:
Es sieht sonst auch i.O. aus, nur die Colorbar ist daneben und zeigt seltsame Werte an.

Ich bezweifele wirklich, dass die Colorbar "seltsame" Werte anzeigt. Das wäre doch sehr verblüffend für ein Tool, dass 1000fach getestet wurde. Ich vermute eher, dass sie nur nicht das anzeigt, was Du vermutest, aber dann treffen einfach die Vermutungen nicht zu.
Hast Du schonmal den Vorschlag aus den Beispielen in der Dokumentation verfolgt und einfach eine eigene Colorbar mit dem Befehl COLORBAR erzeugt?

Gruß, Jan

PS. "clear all, close all, clc" ist brutal. Einerseits werden alle Breakpoints des Debuggers gelöscht, und der Debugger ist ein wertvolles Werkzeug. Außerdem einfach mal alle anderen Fenster zu schließen kann sehr unpraktisch sein. Wieso sich dieser massive Mache-Alles-Platt-Header in so vielen Programmen findet, bleibt mir ein Rätsel. In produktiv eingesetztem Code sollte dies niemals auftauchen.
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.