第一部分 卷积
【目的】
1.加深理解卷积的重要作用,更好的利用卷积进行数字信号处理。 2.掌握循环卷积和线性卷积两者之间的关系。
【原理】
卷积的定义:g(t)?f1?t??f2?t??对于离散序列,则有:
????f1???f2?t???d?
y(n)?x(n)*h(n)?m????x(m)h(n?m)
??当h(n),x(n)是一个长度为N的序列,则有:
y?n??h?n??x?n???h?m?x?n?1?m?;
m?1n当h(k)的长度为K,x(m)长度为M,且K?M时,则为:
y?n??h?k??x?m???h?k?x?n?1?k? ;
k其中k的取值范围为:[max(1,n+1-M),min(n,K)],其中n范围为[1,K+M-1];
在高等数学中,函数f(x)的积分
????f(x)dx的图形解释就是曲线f(x)与x轴之间所
包围的面积的代数和。卷积也是积分,因此与一般积分相似,具有求曲线与横轴间所包围面积的含义。但是被积函数是f1???f2?t???,且卷积是对变量?进行积分,因此卷积的结果
g?t?是一个时间变量t的函数。两函数卷积就是把其中一个函数沿纵轴反转,然后再把反转
后的图形向右平移t,求出该时刻二图形乘积所形成的曲线下的面积,就是该时刻的卷积值。随着t值不断增大,反转后的曲线不断向右平移,就可以得到t为任意值时的卷积值。离散卷积的编程思想与此类同,将一个序列反转,然后求m不同时各采样点的乘积的和。
【示例】
鉴于卷积程序是数字处理的第一次实验,只给出卷积的一个简单示例程序,也可参考Matlab库文件中的conv.m文件。
示例程序如下:
function y=conn(x1,x2) %conn函数实现输入序列x1和x2的循环卷积,fn为输出序列 L=length(x1); %定义输入x1序列的长度
M=length(x2); %定义输入x2序列的长度 for n=1:L+M-1
y(n)=0; for m=1:M k=n-m+1;
if (k>=1&k<=L)
y(n)=y(n)+x2(m)*x1(k); %将x1反转与x2对应相乘,并求和 end end end
此程序调用格式为y=conn(x,h)
输入两个数据长度相同的数据,调用此函数即可。任意输入两个数据,如图1中(a)和(b)的两个图形所示,调用Matlab内的conv程序,得到的结果如图1中(c)所示,调用编写conn程序,得到的结果如图1中(d)所示,可以看到两个图形相同,说明编写的程序是正确的。(参考给定的conv_ph.m文件和conn.m文件)
子波x10.50-0.5-1s00.10.20.3(a)反射序列x20.40.50.620-2x0204060100120140(b)调用Matlab卷积程序结果8016018020010-1z050100200250(c)调用自编卷积程序结果15030035040010-1y050100150200(d)250300350400
图1 输入两个信号的卷积示意(离散图)
子波x10.50-0.5-1s00.10.20.3(a)反射序列x20.40.50.620-2x0204060100120140(b)调用Matlab卷积程序结果8016018020010-1z050100200250(c)调用自编卷积程序结果15030035040010-1y050100150200(d)250300350400
图2 输入两个信号的卷积示意
【作业要求】
1.了解实验原理;
2.根据给定的两个序列,或者自己定义两个信号序列,编写卷积程序; 3.记录调试运行情况及所遇问题的解决方法; 4.给出实验结果(与示例的内容相似)。
【附录】
程序conn(卷积的计算程序):
function fn=conn(x1,x2) %conn函数实现输入序列x1和x2的循环卷积,fn为输出序列 L=length(x1); %定义输入x1序列的长度 M=length(x2); %定义输入x2序列的长度 for n=1:L+M-1
fn(n)=0; for m=1:M k=n-m+1; if (k>=1&k<=L)
fn(n)=fn(n)+x2(m)*x1(k); %将x1反转与x2对应相乘,并求和 end end end
程序conv_ph(调用卷积函数实现两个序列的卷积): %%%%%%%%%%%%%%%%%%定义一个子波%%%%%%%%%%%% Nt=201; %采样数 dt=3e-3; %采样间隔
ftm=25;fsm=0.05; %子波基本参数 time_max=Nt*dt; %最大采样时间 time=dt:dt:time_max; %采样时间
ht=-(1-2*pi^2*ftm^2*((time).^2)).*exp(-pi^2*ftm^2*(time).^2); subplot(2,2,1),plot(time,ht,'g');
xlabel('图(a)');ylabel('s');title('子波x1') %%%%%%%%%%%%%%%%%反射序列%%%%%%%%%%%%%%%%% for ii=1:Nt
if ii==15|ii==18|ii==60|ii==131|ii==183 t=1.2*sin(2*pi*ii/100); else t=0; end x(ii)=t; end
subplot(2,2,2), stem(x);
xlabel('图(b)');ylabel('x');title('反射序列x2') %%%%%%%%%%%%%%%卷积结果%%%%%%%%%%%%%%%%%%% z=conv(ht,x); subplot(2,2,3), plot(z,'r');
xlabel('图(c)');ylabel('z');title('调用Matlab卷积程序结果') y=conn(ht,x); subplot(2,2,4), plot(y,'b');
xlabel('图(d)');ylabel('y');title('调用自编卷积程序结果')
function y=conn(x1,x2) %conn函数实现输入序列x1和x2的循环卷积,fn为输出序列 L=length(x1); %定义输入x1序列的长度 M=length(x2); %定义输入x2序列的长度 for m=1:M y(n)=0;
for n=1:L+M-1 k=n-m+1; if (k>=1&k<=L)
y(n)=y(n)+x2(m)*x1(k); % end end end
将x1反转与x2对应相乘,并求和
相关推荐: