卷积是信号处理领域最为常见的运算,对于一个线性时不变系统而言,只要知道了系统的单位冲击响应,则可以由输入序列x[n]和单位冲击响应h[n]经卷积运算得到系统的输出。下面给出输入信号x = [1 2 3 4];单位冲击响应h = [2 1 1]时,系统输出的运算过程,虽然matlab自带了卷积函数conv,但是通过亲手编写代码可以加深对卷积的运算。
可以由这个例子得出,卷积之后的y[n]序列的长度等于x[n]长度值与h[n]长度值的和再减1。
clc;%清屏幕
clear all;%清除工作区间内所有变量
x = [1 2 3 4];%输入信号
h = [2 1 1];%单位脉冲响应
[m1,n1] = size(x);%获取x[n]的行数和列数
[m2,n2] = size(h);%获取h[n]的行数和列数
n3 = n1+n2-1;%输出序列的长度,即x[n]序列长度和h[n]序列长度之和,再减1
xsub = 0:n1-1;%输入序列x[n]的下标
hsub = 0:n2-1;%冲击响应h[n]的下标
ysub = 0:n3-1;%输出序列y[n]的下标
subplot(3,1,1);%选择3X1区域中的1号区
stem(xsub,x);axis([0,10,-0.2,15]);title('x[n]');
subplot(3,1,2);%选择3X1区域中的2号区
stem(hsub,h,'r');axis([0,10,-0.2,15]);title('h[n]');
A = zeros(6,6);B = zeros(6,1);%先生成一个0矩阵和0向量,x和h中维度高的作为0向量中的一部分元素;
%维度小的去填充矩阵
piec = ones(m2,n2);%piece为循环移位的非0值向量
for i = 1:n2
piec(m2,i) = h(m2,n2+1-i);%对冲击响应矩阵h[n]进行翻转,尽管matlab自带了flipfl函数可以进行翻转,但这个过程非常简单,几行程序就实现了
end
piec%
B(n3-n1+1:n3) = x'
A=[1 1 2 0 0 0 ;0 1 1 2 0 0;0 0 1 1 2 0;0 0 0 1 1 2;0 0 0 0 1 1;0 0 0 0 0 1];%循环移位,对应点相乘,通过矩阵相乘即可实现
%B=[0 0 1 2 3 4]';%行向量转置为列向量
Y=A*B;
subplot(3,1,3);%选择3X1区域中的3号区
stem(ysub,Y,'g');axis([0,10,-0.2,15]);title('y[n]');