conv 卷积函数的一般用法
首先直接上手试一下:
%# 复制下面的代码,粘贴在命令行中运行;或者复制到m文件中,按F9运行。
x = [1]; %# 序列x,可理解为代表离散的输入信号
h = [1 2 3]; %# 序列h,可理解为系统的冲激信号
y = conv(x,h) %# 对x,h进行卷积
stem(y,'fill') %# 绘制离散序列数据
axis([0 5 -4 8]) %# 设置图像的横坐标区间为[0,5],纵坐标区间为[-4,8]
%# 输出如下
>> y =
1 2 3
上面的例子就是单一脉冲信号x经过h后的响应序列。如果x序列包含多个脉冲信号,就如下面的例子:
h = [1 2 3]; %# 序列h,系统的冲激响应
%# 分别观察离散输入信号为 x1,x2,x3时,系统的响应
x1 = [1 0];
y1 = conv(x1,h)
subplot(4,1,1);
stem(y1)
title('x1的响应序列')
x2 = [0 1];
y2 = conv(x2,h)
subplot(4,1,2);
stem(y2)
title('x2的响应序列')
x3 = [1 1];
y3 = conv(x3,h)
subplot(4,1,3);
stem(y3)
title('x3的响应序列')
%# 将x1,x2两个信号的响应相加,得到的响应和x3的响应一致。
subplot(4,1,4);
y4 = y1+y2
stem(y4,'fill')
title('x1与x2响应序列的叠加')
%# 输出如下
>>y1 =
1 2 3 0
y2 =
0 1 2 3
y3 =
1 3 5 3
y4 =
1 3 5 3
对于序列x[n]和h[n]卷积时,我们还要关心响应序列的起始位置和序列长度。例如,如果n不是从0开始的,而是从-1开始,以 x[n] = {3,1,2}, h[n] = {3,7} ,n从-1开始举例,即:
x[-1] = 3;
x[ 0] = 1;
x[ 1] = 2;
h[-1] = 3;
h[ 0] = 7;
那么求卷积:
n = -1;
x = [3,1,2];
nx = [n:n+length(x)-1];
h = [3,7];
nh = [n:n+length(h)-1];
y = conv(x,h) %#对x和h进行卷积
ny = [(nx(1)+nh(1)):(nx(length(nx))+nh(length(nh)))]
stem(ny,y,'fill')
axis([-3 2 0 25]);
%# 输出如下
>> y =
9 24 13 14
ny =
-2 -1 0 1 %# 响应序列的起始位置为-2,即 y[-2]=9
另外说明一下:
conv() 函数用于多项式乘法和离散序列的卷积;
conv2() 函数用于矩阵卷积,可用于图像处理。