2015年2月17日 星期二

[Matlab] 存圖又出錯?!

作圖時,我們有時會重新設定大小,設定後圖會很乖的跑出來,可是存檔就不是這一回事了。有時出現破圖;有時出現圖消失;又有時舊圖蓋上新圖,好煩阿,可是存圖又是必要時,永遠都解決不了這樣的問題,最後還用print screen來存,甚至再裁圖,根本瘋了!!

來看看出現的一些例子

下方的子圖沒出現
broken1

放大後還出現黑框,子圖一樣不出現
broken2

更嚴重的是舊圖又蓋過新圖,子圖出現了也沒有用,還很誇張地跑出了windows工具列
broken4

這樣的狀況在以前繪圖時屢見不鮮,真的好累阿,找了很多資料,最後才發現其實這很好解決。只需要在剛開始繪圖時,先設定繪圖區的renderer屬性,之後就會正常了。

程式碼

set(figure(1),'position',[1 1 960 640],'renderer','painters') %紅色部分是設定繪圖方式
subplot(211),plot(t,x)
subplot(212),spectrogram(x,1024,1000,[],fs,'yaxis')
frame=getframe(gcf);
im=frame2im(frame);
imwrite(im,'new.jpg','jpg')

使用這樣的繪圖方式圖似乎看起來較有質感一些,但也需要付出一些相對應的代價,繪圖所花的時間會較久。可是不管怎樣,你一定要存出圖片卻又總是破圖,那也只能用這樣的方式繪圖了。

正常存檔的圖片
broken5

後來我還發現當使用print指令時,spectrogram會產生的白色雜點,用這種方式也可以解決,也不需要再去了解spectrogram的SFT了(參考[Matlab] Spectrogram長白色痘痘? 教您如何除痘)。如下方比較圖:
broken
ok

我想使用這個屬性應該會使很多人叫開心吧,至少我以前曾經被他煩到不知所措,有時甚至是在使用批次存圖時中間的圖片出錯,都快氣死了!!快把這個指令學走吧~

5 則留言:

  1. 您好,我看到您使用spectrogram的頻譜圖中似乎有跟我目前遇到的狀況類似(如圖 http://ppt.cc/YQlE0 )。想請問您是否在頻譜上有做了一些運算使得圖上有出現縱向的線條?我是把特定的點都變成零後會出現這個狀況,我的window size是512,且對整段音訊都有做處理。不知道是不是在頻譜上運算後都會出現這樣的情況?

    回覆刪除
    回覆
    1. 您好,我除了會用除噪音處理外(http://learning-sky.blogspot.tw/2014/10/matlab.html),沒有對音訊檔做特別的處理,也沒有特定點歸零處理。你說的現象我不是很確定,因為我的沒處理就出現了現象。但如果歸零會出現縱線,會不會是因為瞬間能量改變太多使震幅斜率過陡,進而影響聲紋圖?另外,如果是特定一段歸零那會變成靜音才對,聲紋不會有任何訊號。

      刪除
    2. 您好,感謝您的回覆。目前我正在研究如何除噪,我針對的點歸零是window 裡面的幾個點,並非全部。若是全部歸零的話就會是完全靜音的狀態沒錯。我也是傾向於解釋振幅改變太大而造成的不連續,不過讓我困惑的是,我是在頻域做處理,但是最後的頻譜圖有縱線感覺是在同一個時間點上所有的頻段都受影響了。

      刪除
    3. 很抱歉,這方面的疑問我沒辦法給予幫助。若您有機會了解原因,歡迎再回覆貼文。

      刪除
  2. 您好,在此非常感謝您所給予的幫助。我研究了您給的連結"[Matlab] 去除雜訊"裡面的程式碼,最後終於發現我的與他的差異。
    在對音訊做處理的時候,傅立葉轉換通常會搭配window function,但是他連逆轉換回去時也會乘上window function!!因此我將我的程式做了同樣的動作後發現我的問題的得到明顯的改善。不過實際上問題的原因我就不清楚是為什麼了...

    回覆刪除

有任何問題可以詢問,我們會盡量回答