关于圆周卷积和fft求卷积的一些看法

我们以一个例子来看这个问题:


附线性卷积代码:

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);

其中圆周卷积是用的我定义好的函数:circonv


     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的偏移量如图)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值