一、卷积的定义
在数字信号处理中,当一个系统是线性时不变系统时,引出了卷积;卷积是线性和时不变性的一个直接结果。
卷积的公式为:
即如果已知所有的x[n]和h[n]就可由卷积公式求出输出序列y[n]。
二、卷积的计算
在使用该公式进行计算时,由h[k]求出h[n-k]需要分两步进行:
首先,将h[k]关于k=0反转;
然后,将反转后的信号延迟n个样本。
例:考虑一个系统,单位脉冲响应为
,
输入是
,求出y[n]。
有一点需注意,卷积运算后,序列的长度变为
。
三、Matlab实现
使用Matlab做出以上动图真的是费了我九牛二虎之力。
hk = ones(1,8);
hk = flip(hk);%序列反转
Nhk = length(hk);
n = 0:Nhk-1;
subplot(4,1,1);stem(n,hk);grid on;title('h[k]');axis([-20,20,0,1]);
a = 0.8;
n = 1:6;
xn = a.^n;
xk = [zeros(1,10),xn,zeros(1,10-length(n)+1)];
t = (0:length(xk)-1)-10;
subplot(4,1,2);stem(t,xk);grid on;title('x[k]');axis([-20,20,0,1]);
gifname = 'mycov.gif';
yn = [];
index = 1;
for N = -11:19
% pause(0.1);
n = (0:Nhk-1)+N-Nhk+1;
subplot(4,1,3);cla;stem(n,hk);grid on;title(['h[n-k], ','n=',num2str(N)]);axis([-20,20,0,1]);
if -10<=N && N <=17
if N+11 <=8
y0 = sum(xk(1:N+11));
elseif N+11 <=21
y0 = sum(xk(N+11-7:N+11));
elseif N+11 <=28
y0 = sum(xk(end-N+17:end));
end
yn = [yn,y0];
t = (0:length(yn)-1)-10;
subplot(4,1,4);cla;stem(t,yn,'r');grid on;title(['yn, ','n=',num2str(N)]);axis([-20,20,0,3]);
end
f=getframe(gcf);
[A,map] = rgb2ind(f.cdata,256);
if N==-11
imwrite(A,map,gifname,'gif','LoopCount',Inf,'DelayTime',0.3);
else
imwrite(A,map,gifname,'gif','WriteMode','append','DelayTime',0.3);
end
index = index+1;
end
四、总结
1.自己手动又编辑一遍卷积实现后,对卷积如何计算又加深理解。
2.Matlab代码实现动图需要clf掉图像,再显示。
3.Matlab保存动图需要先读取Figure里的图片,再存入到gif中。