2014年8月15日 星期五

[Matlab] GIF 動畫製作─2

上一篇動畫製作當中,每次都必須重新繪出正弦波,對電腦而言算是相當簡單,重畫也沒關係,但如果你處理的是其他資料,光畫圖就很燒電腦的話,你又要坐上百張的圖製成動畫,那可真的累了...之前好玩跑聲紋圖動畫,電腦就因此一夜沒睡,真的很燒。所以我想到一個方式,首先必須先將底圖畫好,剩下的再到圖片裡面做更改,這樣雖然對電腦而言工作量有點大,但卻遠小於每次都重新分析聲紋圖的工作量。改好圖後再製成動畫即可。這邊也以簡單的圖作範例。下圖約為8秒的聲音訊號,錄製的聲音為拍手聲。

























程式碼
%先讀入聲音作圖(未來再另外說明此區) 
[y,fs]=wavread('1.wav');
y=y(:,1);
N=length(y);
t=(0:N-1)/fs;
subplot(211),plot(t,y)
xlim([0 max(t)])
xlabel('Time, s')
ylabel('Amplitude')
subplot(212),spectrogram(y, 1024, 1000, [], fs, 'yaxis')
ylim([0 6000])
a=0:0.01:1;a=a.^3;
for q=1:1:101
    p(q)=1;
end
z=p-a;z=z';
map(:,1)=z;map(:,2)=z;map(:,3)=z;
colormap(map)  
xlabel('Time (s)')
ylabel('Frequency (Hz)')
grid off
print(figure (1),'-djpeg100','-r72','1.jpg');    %先輸出一張圖片,之後都以這張為底做動畫,下圖即為輸出的圖。-djpeg100代表品質100%的jpeg格式,-r72代表解析度,數值越大圖片越大




    

















A=imread('1.jpg'); %讀入剛才的圖片
y1=32:180; %請至小畫家找出subplot(211)的座標位置
y2=237:384; %找出subplot(212)的座標位置
%如圖所示,指標位置(上箭頭)小畫家會告訴你(下箭頭) 








%依序找到4個y值與2個x值,交織起來就可以獲得8個定位點
dt=0.1523; %秒數若非常重要再自行計算,需與下方i值做搭配
for i=76:8:520 %x值的位置,76為頭,520為尾,8為每次改變間隔,改變間隔越小動畫越連續
    A1=A; %因A為底圖,所以設另一變數作為更改顏色用
    A1(y1,i,1)=255;A1(y2,i,1)=255; %將指定位置的紅色數值填滿
    A1(y1,i,2)=0;A1(y2,i,2)=0; %將指定位置數值歸0
    A1(y1,i,3)=0;A1(y2,i,3)=0; %將指定位置數值歸0
       
    [im,map]=rgb2ind(A1,128);
   
    if i==76 %必須為x的起始值,才能先產生檔案
        imwrite(im,map,'1.gif','gif','delaytime',dt,'loopcount',inf);
    else
        imwrite(im,map,'1.gif','gif','writeMode','append','delaytime',dt);
    end
end
 如果有更好的方法還請高手指點,感覺我在土法煉鋼。哈哈!

1 則留言:

  1. colormap先前因為幾乎沒用過全一矩陣,所以白癡的寫了迴圈來完成全一矩陣。這裡有更簡單的。
    a=0:0.01:1;a=a'.^5;
    z=ones(101,1)-a;
    map(:,1)=z;map(:,2)=z;map(:,3)=z;
    clear a z

    回覆刪除

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