2016-03-21 23 views
2

Ich brauche ein 2D-Spektrogramm eines Signals in Matlab. Ich brauche es für eine gedruckte Aufgabe, daher macht das 3D-Bild keinen Sinn. Wenn das Signal jedoch mit Spectrogram geplottet wird, wird automatisch eine 3D-Darstellung des Signals erstellt.2D-Spektrogramm in Matlab erstellen

Mein Code:

Dataset  = 1;   % Dataset to be analysed 
N   = 1024;   % Window size 
Beta  = 12;   % Kaiser window beta value (small = narrow main lope) 
Overlap  = 800;   % Window overlap 
Threshold = -150;   % Minimum magnitude before threshold 

spectrogram(Enclosure{Dataset}(1:end),kaiser(N,Beta),Overlap,2048,fs,'MinThreshold',Threshold,'yaxis'); 

, die eine graphische Darstellung erzeugt, die wie folgt aussieht:

2D Plot

Aber es ist von oben gesehen, und der Graph das wirklich zeigt:

T Der Grund, warum ich es speziell für 2D brauche (und warum ich mich nicht mit einem Screenshot begnüge) ist, weil ich Matlab2tikz verwende, um Matlab-Figuren in Tikz-Figuren in LaTex zu konvertieren. mit den 3D Bildern bekomme ich Figuren von +100 Mb und 2D verkleinert die Größe auf < 1Mb.

+1

warum nicht ein 2D-Plot direkt mit den Ausgängen der Funktion machen, z.B. S = Spektrogramm(). Dann benutze S, um deine Handlung zu machen. – willpower2727

+0

Es könnte möglich sein. Ich kann einfach nicht herausfinden, wie ich mit der Ausgabe der "Spektrogramm" -Funktion umgehen soll. Die Achse ist nicht in der Nähe der richtigen und wenn es gezeichnet wird, zeigt es eine seltsame Handlung. –

Antwort

1

Ich weiß nicht, welche Version von Matlab Sie verwenden, aber in 2015a haben Sie sollten einen Griff in die Figur mit dem 3D-Plot bekommen können, und den Betrachtungswinkel zu 2D ändern:

view(0,90); 

ich habe auch ein Beispiel bekam, wie Sie Ihre eigenen 2D-Plot aus den Ausgaben machen kann Spektrogramm() unter Verwendung einer ähnlichen Methode:

x = [0:0.01:100]; 
y = sin(5*x); 
y = awgn(y,0.1); 

[S,F,T,P] = spectrogram(y,200,0,length(y)*5,100); 

[m,n] = size(P); 

figure(2) 
surf(F,T,zeros(n,m),P','EdgeColor','none') 
view(0,90) 
xlabel('Frequency') 
ylabel('Time (s)') 

Die Ausgabe sieht wie folgt aus:

enter image description here

Hoffentlich da es keine Höheninformation ist, kann die Abbildung Größe kleiner sein, aber das kann ich nicht testen, da ich Matlab2tikz nicht haben.

0

Eine Option besteht darin, alles, was geplottet wurde, zu erfassen und es dann als Bild darzustellen. Sie können diese getframe

mit tun, wenn Sie

F=getframe(gca); 
cla; 
imshow(F.cdata); 

tun werde Sie bekommen genau das, was Sie, bevor Sie sehen werden, sondern als ein Bild.

Aber ich denke, es ein bisschen der Zweck Matlab2Tikz besiegt, als die Idee os, die Sie tikz Kode Ihre Daten ...

+0

Ja, und der ganze Punkt dieser Frage war, eine Lösung zu finden, wo ich eine brauchbare Tikz-Ausgabe bekommen konnte. –

+1

@MikkelKroghSimonsen Mein Punkt ist: Wenn Sie die Handlung 2d machen (das gleiche wie ein Bild), verlieren Sie die Daten.Entweder haben Sie die 3D-Version in TIKz oder Sie erstellen eine 2D-Version ohne Informationen. Diese Antwort macht dasselbe wie die Antwort der Willenskraft, nur die Daten werden mit anderen Werten gespeichert. Wenn Sie nicht manuell mit den Zahlen im TIKz-Ausgabecode herumspielen, sollte das funktionieren –

0

Sie können versuchen, die folgenden:

[~,F,T,ps]=spectrogram(Enclosure{Dataset}(1:end),kaiser(N,Beta),Overlap,2048,fs,'MinThreshold',Threshold,'yaxis'). 
% Output the spectrum in ps 

imagesc(T,F,10*log10(ps)) 
% Generate a 2d image 

view(270,90) 
xlabel('Time [s]') 
ylabel('Frequency [Hz]') 
c=colorbar; 
c.Label.String='Power [dB]'; 
% Extra setting to make the plot look like the spectrogram 

Viel Glück