【问题标题】:Point-product with fft带 fft 的点积
【发布时间】:2014-02-18 21:36:12
【问题描述】:

根据卷积定理,时域中的卷积是fft域中的乘积。使用正确的零填充,它可以工作:

% convolution in time domain
a = [1 2 3];
b = [4 5 6];
c = conv(a,b);

a_padded=[a 0 0]; b_padded=[b 0 0];
c_bis=ifft(fft(a_padded).*fft(b_padded));
% we do find c_bis=c

但是,这个定理也可以反过来工作,时域中的乘积是 fft 域中的卷积。我不明白这部分:

d = a.*b;
D=conv(fft(a_padded),fft(b_padded));
d_bis=ifft(D);

这给出了 d_bis 的复向量。 如何使用频域中的卷积来逆时域中的逐点乘积?

【问题讨论】:

    标签: matlab fft convolution dft ifft


    【解决方案1】:

    有趣的问题!

    错误(虽然是一个微妙的错误)是你说的时候

    时域中的乘积是 FFT 域中的卷积

    傅里叶变换也是如此。对于Discrete Fourier transforms(DFT 或 FFT),correct formulation

    时域中的乘积是FFT域中的循环卷积,除以序列长度

    所以你必须在 d_bis 计算中改变它:

    • 使用循环卷积,而不是卷积;
    • 除以序列长度;
    • 不要应用填充。

    如果你有信号处理工具箱,你可以使用cconv 来计算循环卷积:

    N = length(a);
    D = cconv(fft(a),fft(b), N)/N;
    d_bis=ifft(D); %// now this equals d
    

    为了确保,第一种情况下的correct formulation(时域卷积得到频域乘积)还涉及循环卷积:

    时域中的循环卷积是FFT域中的乘积

    (在这种情况下不除以序列长度)

    但是由于您在时域中填充了零,因此正常卷积和循环卷积之间的差异消失了,并且您得到了正确的结果。如果没有填充,它将是:

    c = cconv(a, b, N);
    c_bis=ifft(fft(a).*fft(b)); %// this equals c
    

    【讨论】:

      猜你喜欢
      • 2012-12-10
      • 2013-08-25
      • 2016-12-31
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2016-08-18
      • 1970-01-01
      相关资源
      最近更新 更多