2016-03-21 133 views
2

我需要在Matlab中繪製信號的2D頻譜圖。我需要它來打印作業,因此3D圖像沒有意義。但是,當使用Spectrogram繪製信號時,它會自動生成信號的3D圖。在Matlab中創建2D頻譜圖

我的代碼:

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'); 

產生,看起來像這樣的圖表:

2D Plot

但它從上面看,和圖形真正顯示是這樣的:

3D plot

T他之所以需要它專門爲2D(以及爲什麼我不解決屏幕截圖)是因爲我使用Matlab2tikz將Matlab數字轉換爲LaTex中的Tikz數字。與3D圖像我得到的數字+100 Mb和2D將減小到< 1Mb的大小。

+1

爲什麼不直接與功能,例如的輸出使2D圖S =光譜圖()。然後用S來製作你的情節。 – willpower2727

+0

這可能是可能的。我只是無法弄清楚如何處理'spectrogram'函數的輸出。軸沒有接近正確的位置,當繪製時顯示一些奇怪的情節。 –

回答

1

我不知道你用的是什麼版本的Matlab的,但在2015A你應該能夠得到一個處理與3D圖圖和改變視角,以2D:

view(0,90); 

我也得到了如何從的輸出使自己的2D圖的例子光譜圖()使用類似的方法:

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)') 

輸出看起來是這樣的:

enter image description here

希望,因爲沒有高度信息,這個數字大小可能會更小,但我無法測試,因爲我沒有Matlab2tikz。

0

一個選項是捕獲任何繪圖,然後將其繪製爲圖像。如果你這樣做

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

你會得到什麼,你會看到之前你可以做到這一點使用getframe

,但作爲一個圖像。

但是我認爲它違背了一點Matlab2Tikz的目的,爲理念的操作系統,你有Tikz代碼描述你的數據...

+0

是的,這個問題的重點是找到一個解決方案,我可以得到一個可用的Tikz輸出。 –

+1

@MikkelKroghSimonsen我的觀點是:如果你製作圖2d(與製作圖像相同),你會丟失數據。因此,無論您是TIKz的3D版本,還是製作2D版本的信息。這個答案與意志力的答案相同,只是數據將以不同的值保存。除非你要在TIKz輸出代碼中手動撥動數字,否則這應該起作用 –

0

你可以嘗試以下方法:

[~,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 

好運