我们以一个例子来看这个问题:
附线性卷积代码:
n=-5:1:50;
N=56;
x=uCT(n)-uCT(n-10);
h=0.9.^n.*uCT(n);
[y,yn]=conv_m(x,n,h,n);
figure(1);
stem(yn,y);
function [y,ny]=circonv(xa,na,xb,nb,N)
y=ones(1,N);
x1=ones(1,N);
x2=ones(1,N);
ny=min(na)+min(nb):min(na)+min(nb)+N-1
for i=1:N
if(i<=length(xa))
x1(i)=xa(i);
else
x1(i)=0;
end
end
for i=1:N
if(i<=length(xb))
x2(i)=xb(i);
else
x2(i)=0;
end
end
for i=1:N
y(i)=0;
for j=1:N
if j<=i
y(i)=y(i)+x1(j)*x2(i+1-j);
else
y(i)=y(i)+x1(j)*x2(N+i+1-j);
end
end
end
附N点圆周卷积代码:
[y1,ny1]=circonv(x,n,h,n,N);
figure(2);
stem(ny1,y1);
其实正常来讲,我们计算的圆周卷积都是从0开始的序列,比如(0~N1和0~N2的两个序列圆周卷积),而上面这一题则要考虑起始点不为0的情况。
所以这样我们就要考虑基底(na和nb分别相当于x1和x2的自变量)的位置了,如果不考虑基底(即定义函数为function [y,ny]=circonv(xa,xb,N))会导致算得的圆周卷积出现错位,即不是从0开始的。
上图为正常的线性卷积后的图,而下图是不考虑起始点从-5开始的圆周卷积的图,可以发现第二个图是从10开始才有值。
所以做圆周卷积时要考虑起始点的位置,以及我定义的函数是否对所有的情况都满足这里我用了一种很巧妙的方法:ny=min(na)+min(nb):min(na)+min(nb)+N-1
就是直接人为的定义了y的基底ny,导致上面10的偏移量被消除了。
————————————————————————————————————————
但是还有一点问题,就是我直接用FFT做也会出现10的偏移量,这一点的怀疑是MATLAB自己定义fft函数的时候是不是不能完全匹配求卷积。
附fft代码:
X1=fft(x,128);
H1=fft(h,128);
Y5=X1.*H1;
y5=ifft(Y5);
figure(5);
stem(y5);
(10的偏移量如图)