题目所说根据定义自己编写卷积函数,虽然matlab已经提供了强大的conv,但为了加强对卷积定义的理解,所以我们自己动手编写一个卷积函数。(相信你肯定是个学生党~)
function[s] = my_conv(a,b) %输入为两个有限长序列,输出s为卷积结果
s = [];
al = length(a);
bl = length(b);
if al < bl %这里我们将长的序列幅值给a,短的序列为b
c = a;
a = b;
b = c;
al = length(a);
bl = length(b);
end
b = fliplr(b); %根据定义,b序列先翻转在右移,此处进行的是反转操作。
for i = 1:bl %第一个大For循环,此处右移1个到bl个,是因为当右移bl+1个时a(1)就不再加入到求和运算了
sum1 = 0;
for n = 0:i-1 %此处是对重合部分求和,理解此循环范围可以将i取个定值
sum1 = sum1 + a(i-n)*b(bl-n);
end
s(i) = sum1;
end
sl = length(s);
for x = 1:al-bl %第二个大for循环
sum2 = 0;
for y = 1:bl
sum2 = sum2 + a(x+y)*b(y);
end
s(sl+x) = sum2;
end
sl = length(s);
for z = 1:bl-1 %第三个大for循环
sum3 = 0;
for w = 1:bl-z
sum3 = sum3 +a(al-bl+z+w)*b(w);
end
s(sl+z) = sum3;
end
%因为matlab索引第一个值是a(1)是1开头的,python和其他一些语言中用a[0]来索引第一个值,书上索引序列第一个也是0来索引,所以可以好好理解一下代码中各个索引值的含义。