程式碼
%先讀入聲音作圖(未來再另外說明此區)
[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
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