一、实验目的
1.了解熟悉MATLAB中conv、filter函数的使用;
2.回忆卷积,深入了解conv原理,从差分方程和矩阵两个角度重构conv函数。
二、实验原理
卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列和x[n]和h[n],则卷积的结果
其中星号*表示卷积。当时序n=0时,序列h[-i]是h[i]的时序i取反的结果;时序取反使得h[i]以纵轴为中心翻转180度,所以这种相乘后求和的计算法称为卷积和,简称卷积。另外,n是使h[-i]位移的量,不同的对应不同的卷积结果。
三、实验设计及操作
1、使用conv函数求卷积;
2、使用filter函数求卷积;
3、使用差分方程求卷积;
4、使用循环差分方程求卷积;
5、利用循环差分方程构造myconv1函数求卷积;
6、利用矩阵构造myconv2函数求卷积。
四、实验结果及分析
除了由filter函数求解的y2外,其他结果一致,说明各段代码编写正确。
相比于其他结果的5个结果,fliter取的是前三个结果而非后三个,这是出于实际工程中需要实时低延时输入输出的需要而设计的。
五、实验总结和提升
了解了MATLAB中卷积的实现,为日后的其他信号处理打下基础。
六、源代码
1. clear
2. clc
3. close all
4. y1=conv([1,2,3],[4,5,6]);
5. y2=filter([4,5,6],1,[1,2,3]);
6.
7.
8. x(1:8)=[0,0,1,2,3,0,0,0];
9. y3(1:5)=[0,0,0,0,0];
10. for n=3:7
11. y3(n-2)=4*x(n)+5*x(n-1)+6*x(n-2);
12. end
13.
14. x=[0,0,0,4,5,6,0,0,0];
15. h=[1,2,3];
16. y4=zeros(1,5);
17. for n = 1:5
18. for m = 1:3
19. y4(n)= y4(n)+x(n+m)*h(4-m);
20. end
21. end
22.
23. %%%%%%%%%%%%%%%%%%%%%
24. y5=myconv1([4,5,6],[1,2,3]);
25. y6=myconv2([4,5,6],[1,2,3]);
26. function y=myconv1(x,h)
27. hl=length(h);
28. xl=length(x);
29. x=[zeros(1,hl),x,zeros(1,hl)];
30. y=zeros(1,xl+hl-1);
31. for n=1:xl+hl-1
32. for m=1:hl
33. y(n)=y(n)+x(n+m)*h(hl+1-m);
34. end
35. end
36. end
37.
38. function y=myconv2(x,h)
39. hL=length(h);
40. if size(x,2)==1,x=x';end
41. x=[zeros(1,hL-1),x,zeros(1,hL-1)];
42.
43. if size(h,2)==1,h=h';end
44. X=buffer(x,hL,hL-1,'nodelay');
45. h=flip(h);
46. y=h*X;
47. end