代码之家  ›  专栏  ›  技术社区  ›  Linear Algebra fans

为什么在使用FFT的乘积对1D阵列执行卷积时,值不同?

  •  1
  • Linear Algebra fans  · 技术社区  · 1 年前

    如我们所知,(FFT(A)元素乘FFT(B))的FFT逆 可以与A和B的卷积相同。

    但是,如果我在Python中这样做:

    import numpy as np
    import scipy
    
    c = scipy.fft.fft([3, 4, 1, 2])
    d = scipy.fft.fft([2, 5, 4, 9])
    print(scipy.fft.ifft((c * d)))
    # [56.+0.j 40.+0.j 52.+0.j 52.-0.j]
    
    print(np.convolve([3, 4, 1, 2], [2, 5, 4, 9]))
    # [ 6 23 34 52 50 17 18]
    

    为什么价值观不同?

    1 回复  |  直到 1 年前
        1
  •  2
  •   mkrieger1 djuarezg    1 年前

    FFT使用 circular convolution ,与线性卷积相比。

    enter image description here

    您可以在执行FFT之前使用零填充,以获得与线性卷积相同的结果:

    import numpy as np
    import scipy.fft
    
    
    def _conv(a, b):
        azero, bzero = np.pad(a, (0, len(b) - 1)), np.pad(b, (0, len(a) - 1))
        c, d = scipy.fft.fft(azero), scipy.fft.fft(bzero)
        iFFT = scipy.fft.ifft(c * d)
        return np.round(iFFT), np.convolve(a, b)
    
    
    print(_conv(np.array([3, 4, 1, 2]), np.array([2, 5, 4, 9])))
    

    打印

    (array([ 6.+0.j, 23.+0.j, 34.+0.j, 52.+0.j, 50.+0.j, 17.+0.j, 18.+0.j]), array([ 6, 23, 34, 52, 50, 17, 18]))