error('出错');
end
ifL>length(A)%如果A序列长度小于L则补零到L
A=[A,zeros(1,L-length(A))];
end
ifL>length(B)%给B序列补零到L
B=[B,zeros(1,L-length(B))];
B=B';%B转置
end
E=A(1,1);
C=A(1,[2:
L]);%写循环矩阵的第一行
D=fliplr(C);
A=[E,D];
y
(1)=A(1,1).*B(1,1);
forh=2:
1:
L
y
(1)=y
(1)+A(1,h).*B(h,1);%%计算循环卷积序列的第一个值
end
fork=2:
1:
L
t=A(1,L);
fori=L:
-1:
2
A(1,i)=A(1,i-1);%得到矩阵的第二到L行并计算循环卷积的
end%另外几个值
A(1,1)=t;
y(k)=0;
form=1:
1:
L
y(k)=y(k)+A(1,m).*B(m,1);
end
end
4.主函数源程序:
A=input('请输入给定序列:
');
c=load('huang.txt');%导入数据
B=c';
n1=length(A);%记序列A的长度
n2=length(B);%记序列B的长度
i=fix(n2/n1);%算B的长度是A的几倍,向下取整
L=2*n1-1;%取循环卷积的长度,使其每小段
%循环卷积满足和线性卷积等价
y(1:
L)=Convmy4(A,B(1:
n1),L);%调用编好的循环卷积函数
r(1:
L)=y(1:
L);%计算最终结果的前n1个点的值
forp=2:
1:
i%循环
s=B((p-2)*n1+1:
(p-2)*n1+n1);%取B序列的第一小段存到s
y((p-2)*n1+1:
(p-2)*n1+L)=Convmy4(A,s,L);%计算第一小段和A序列循环卷
%积的L点结果
C(1:
L-n1)=y((p-2)*n1+n1+1:
(p-2)*n1+L);%将第一组做循环卷积得到的结果
%重叠部分先转存到临时变量C中
z=B((p-1)*n1+1:
(p-1)*n1+n1);%取B序列的第二小段存到z
y((p-1)*n1+1:
(p-1)*n1+L)=Convmy4(A,z,L);%将其和A的循环卷积的结果给y
for
n=1:
1:
n1-1%-------------------------
y((p-1)*n1+n)=C(n)+y((p-1)*n1+n);%计算重叠部分的结果
r((p-1)*n1+n)=y((p-1)*n1+n);
end%-------------------------
forn=n1:
1:
n1%-------------------------
y((p-1)*n1+n)=y((p-1)*n1+n);%计算没重叠部分的结果
r((p-1)*n1+n)=y((p-1)*n1+n);
end%-------------------------
end%循环结束
D(1:
L-n1)=y((p-1)*n1+n1+1:
(p-1)*n1+L);%*************************
forn=n1+1:
1:
L%显示末尾的一段
r((p-1)*n1+n)=D(n-n1);
end%*************************
Ifmod(n2,n1)~=0%-------------------------
h=mod(n2,n1);
E=[B(i*n1+1:
i*n1+h),zeros(1,n1-h)];
F(1:
L)=Convmy4(A,E,L);
P(1:
n1-1)=r((p-1)*n1+n1+1:
(p-1)*n1+L);%如果n2不是n1的整数倍,则应
forn=1:
1:
n1-1%将B序列多余的那几个点补零再
r(i*n1+n)=P(n)+F(n);%和A做循环卷积并显示出来
end
forn=n1:
1:
L
r(i*n1+n)=F(n);
end
end%-------------------------
q=conv(A,B);%调用系统函数做线性卷积,验证结果
r;
x1=1:
1:
n1;%-------------------------
subplot(2,2,1);
stem(x1,A);
title('给定序列A');
gridon;%画原来输入的两个序列和最终序列的图形
x2=1:
1:
n2;
subplot(2,2,3);
stem(x2,B);
title('导入序列B');
gridon;
x3=1:
1:
length(r);
subplot(2,2,2);
stem(x3,r);
title('线性卷积结果图形');
gridon;%-----------------------x4=1:
1:
n1+n2-1;%*************************
subplot(2,2,4);%画调用系统函数得到的结果图形
stem(x4,q);
title('直接调用系统函数得到的图形');
gridon;%*************************
3、结果与验证
当输入序列为rand(1,80)时,输入前后以及结果图形:
4、界面设计
在MATLAB的命令窗口中运行guide命令,即可打开GUIDE界面,选择BlankGUI,点击OK,就可以进行界面设计。
根据题目要求,逐步设计各各模块的功能,再修改所要用到的属性,全部完成后,运行,界面如下:
五、分析和总结
学习了MATLAB后,我深刻地体会到了它功能的强大,不管是数据处理,矩阵计算,频谱分析,还是图形处理,只要函数格式使用正确,一切都能快速准确的实现。
在实验的过程中培养了我的独立分析问题和解决问题的能力。
在遇到实在过不去的地方,总能在同学和老师的指点下豁然开朗,对培养我的思维方法有了很大的帮助,使我受益匪浅。
我了解到MATLAB在我们的生活中的重要地位,随着社会的不断发展,科技的不断进步,计算机的普及,它也被应用在越来越多的方面。
通过本次实验,使我掌握了MATLAB的使用,对我今后的学习之路将产生很大的帮助,使我更能发挥所长报效社会。
参考文献
【1】罗建军,杨琦.精讲多练MATLAB(第二版).西安:
西安交通大学大学出版社,2010.1
【2】高西全,丁玉美.数字信号处理(第三版).西安:
西安电子科技大学出版社,2008.8
【3】刘卫国.MATLAB程序设计与应用(第二版).高等教育出版社,2006.7
【4】邓薇.MATLAB函数速查手册(第一版).人民邮电出版社,2008.10
附录:
主要程序
1.循环卷积子函数源程序:
functiony=Convmy4(A,B,L)%创建循环卷积函数
ifLerror('出错');
end
ifL>length(A)%如果A序列长度小于L则补零到L
A=[A,zeros(1,L-length(A))];
end
ifL>length(B)%给B序列补零到L
B=[B,zeros(1,L-length(B))];
B=B';%B转置
end
E=A(1,1);
C=A(1,[2:
L]);%写循环矩阵的第一行
D=fliplr(C);
A=[E,D];
y
(1)=A(1,1).*B(1,1);
forh=2:
1:
L
y
(1)=y
(1)+A(1,h).*B(h,1);%%计算循环卷积序列的第一个值
end
fork=2:
1:
L
t=A(1,L);
fori=L:
-1:
2
A(1,i)=A(1,i-1);%得到矩阵的第二到L行并计算循环卷积的
end%另外几个值
A(1,1)=t;
y(k)=0;
form=1:
1:
L
y(k)=y(k)+A(1,m).*B(m,1);
end
end
2.主函数源程序:
A=input('请输入给定序列:
');
c=load('huang.txt');%导入数据
B=c';
n1=length(A);%记序列A的长度
n2=length(B);%记序列B的长度
i=fix(n2/n1);%算B的长度是A的几倍,向下取整
L=2*n1-1;%取循环卷积的长度,使其每小段
%循环卷积满足和线性卷积等价
y(1:
L)=Convmy4(A,B(1:
n1),L);%调用编好的循环卷积函数
r(1:
L)=y(1:
L);%计算最终结果的前n1个点的值
forp=2:
1:
i%循环
s=B((p-2)*n1+1:
(p-2)*n1+n1);%取B序列的第一小段存到s
y((p-2)*n1+1:
(p-2)*n1+L)=Convmy4(A,s,L);%计算第一小段和A序列循环卷
%积的L点结果
C(1:
L-n1)=y((p-2)*n1+n1+1:
(p-2)*n1+L);%将第一组做循环卷积得到的结果
%重叠部分先转存到临时变量C中
z=B((p-1)*n1+1:
(p-1)*n1+n1);%取B序列的第二小段存到z
y((p-1)*n1+1:
(p-1)*n1+L)=Convmy4(A,z,L);%将其和A的循环卷积的结果给y
for
n=1:
1:
n1-1%-------------------------
y((p-1)*n1+n)=C(n)+y((p-1)*n1+n);%计算重叠部分的结果
r((p-1)*n1+n)=y((p-1)*n1+n);
end%-------------------------
forn=n1:
1:
n1%-------------------------
y((p-1)*n1+n)=y((p-1)*n1+n);%计算没重叠部分的结果
r((p-1)*n1+n)=y((p-1)*n1+n);
end%-------------------------
end%循环结束
D(1:
L-n1)=y((p-1)*n1+n1+1:
(p-1)*n1+L);%*************************
forn=n1+1:
1:
L%显示末尾的一段
r((p-1)*n1+n)=D(n-n1);
end%*************************
Ifmod(n2,n1)~=0%-------------------------
h=mod(n2,n1);
E=[B(i*n1+1:
i*n1+h),zeros(1,n1-h)];
F(1:
L)=Convmy4(A,E,L);
P(1:
n1-1)=r((p-1)*n1+n1+1:
(p-1)*n1+L);%如果n2不是n1的整数倍,则应
forn=1:
1:
n1-1%将B序列多余的那几个点补零再
r(i*n1+n)=P(n)+F(n);%和A做循环卷积并显示出来
end
forn=n1:
1:
L
r(i*n1+n)=F(n);
end
end%-------------------------
q=conv(A,B);%调用系统函数做线性卷积,验证结果
r;
x1=1:
1:
n1;%-------------------------
subplot(2,2,1);
stem(x1,A);
title('给定序列A');
gridon;%画原来输入的两个序列和最终序列的图形
x2=1:
1:
n2;
subplot(2,2,3);
stem(x2,B);
title('导入序列B');
gridon;
x3=1:
1:
length(r);
subplot(2,2,2);
stem(x3,r);
title('线性卷积结果图形');
gridon;%-----------------------x4=1:
1:
n1+n2-1;%*************************
subplot(2,2,4);%画调用系统函数得到的结果图形
stem(x4,q);
title('直接调用系统函数得到的图形');
gridon;%*************************