目录
3.1源代码
3.2仿真结果
线性卷积原理
公示(1)为两个离散非周期序列进行线性卷积
一般我们计算线性卷积时使用图解法最为常见,简单概括为“变量置换”、“翻转”、“平移”、“相乘”以及“求和”,这里就不过多陈述。
利用对位相乘法计算线性卷积
将两个离散非周期序列左端或右端对齐,对位相乘,然后按列求和,不进位,以序列x(n)=[1 2 3] 和h(n)=[1 1 1 1]并且以左端对齐为例,运算过程如下:
首先以序列h(n)为对象,将左起第一个1分别与序列x(n)的三个元素1、2、3依次相乘得到1、2、3,然后右移移位一位,相当于移到h(2)的位置上,用该位置上的元素1分别乘以x(n)的1、2、3,依旧得到1、2、3,同样的,继续移位并执行相同的操作。注意移到某个位置时相乘后的结果要与该元素的位置对齐。最后,将每一行相乘的结果按列相加即可得到卷积结果。对比图解法,此方法更为快捷,明了。
同样我们也可以以x(n)为对象,用它的元素分别乘以h(n),如下图所示:
当然,读者也可用图解法验证上述结果是否正确,并且以右端对齐为例验证上述结果。一个以右端对齐的例子:
Matlab实操
源代码
%% =========================================================================================================
% 程序说明:本程序提供一种基于对位相乘法的自定义线性卷积函数写法,替代Matlab自带conv函数,供大家参考
% 程序名称:linear convolution 线性卷积
% 作者: hill5678
% 当前版本:1.0
%% =========================================================================================================
clear all;
close all;
clc;
%% ==================================================主函数部分==============================================
X=input('enter a arbitrary discrete-time sequence here:');
H=input('enter a arbitrary discrete-time sequence here:');
Y=linear_convolution(X,H);
display(Y);
%% ================================================定义线性卷积函数============================================
function y=linear_convolution(x,h)
n=length(x);m=length(h);% 输入离散时间序列的长度
y=[];y1=[];y2=[];y3=[];y4=[];y5=[];y6=[];
a=m;
N=n+m-1;% 卷积后新序列的长度
b=N;
M=N-n;% 矩阵形成并移位后每行需要补零的个数
for i1=0:a-2
for i=0:m-1
for k=0:n-1
y1(i+1,k+1)=h(i+1)*x(k+1);% 按照对位相乘法将两个序列左端对齐,依次对位相乘
end
y2=y1;% 将结果矩阵赋给要y2
end
y3=[y2,zeros(m,M)];%将y2后面加入零矩阵
y4=circshift(y3(i1+2,:),i1+1,2);% 循环移位函数,将y4从第二行开始向右按行移位。第二行移一位,第三行移两位,按此规律依次类推
y5=[y5;y4];
end
y6=[y3(1,:);y5];% y3的第一行不变
y=sum(y6);% 将矩阵y6按列相加得到卷积结果
disp(y);
stem(y,'fill')
title('线性卷积结果:序列y(n)');
grid on;
end
仿真结果
例如输入序列x(n)=[1 2 3] 和h(n)=[1 1 1 1],Maltab命令框窗口:
Matlab仿真结果
参考文献
线性卷积、周期卷积、圆周卷积------一篇弄懂
*本人初来乍到,希望大家多多支持,如果上述内容有误,请大家留言指正,我会及时修改*