第一部分 卷积
【目的】
1.加深理解卷积的重要作用,更好的利用卷积进行数字信号处理。 2.掌握循环卷积和线性卷积两者之间的关系。
【原理】
卷积的定义:g (t ) =f 1(t )*f 2(t )=对于离散序列,则有:
⎰
∞
-∞
f 1(τ)f 2(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 =1
n
当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 轴之间所
包围的面积的代数和。卷积也是积分,因此与一般积分相似,具有求曲线与横轴间所包围面积的含义。但是被积函数是f 1(τ)f 2(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
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 文件)
子波x1
0.50
-0.5-1s
00.10.2
0.3(a )反射序列x2
0.40.50.6
20
-2
x
0204060
100120140(b )
调用Matlab 卷积程序结果
[1**********]
10
-1
z
050100
200250(c )
调用自编卷积程序结果
[1**********]0
10
-1
y
050100150
200(d )
[1**********]0
图1 输入两个信号的卷积示意(离散图)
子波x1
0.50
-0.5-1s
00.10.2
0.3(a )反射序列x2
0.40.50.6
20
-2
x
0204060
100120140(b )
调用Matlab 卷积程序结果
[1**********]
10
-1
z
050100
200250(c )
调用自编卷积程序结果
[1**********]0
10
-1
y
050100150
200(d )
[1**********]0
图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
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('调用自编卷积程序结果')