Scipy ifft 使用看似相同的输入给出不同的结果

Scipy ifft gives different results with seemingly identical input

为什么这里的 xcorr 和 xcorr2 会有很大不同? M1 和 M2 是 numpy 矩阵。 M1.shape[0] = M2.shape[0]。 xcorr 是我对这个操作的期望,但是 xcorr2 是完全不同的东西并且有虚数。 xcorr 没有虚数。

from scipy.fft import fft, ifft

xcorr = np.zeros((M1.shape[0],M1.shape[1],M2.shape[1]))  
xcorr2 = xcorr.copy()

N = M1.shape[1]
for i in range(N):
    V = M1[:,i][:,None]
    xcorr[:,:,i] = ifft(fft(M2,axis = 0) * fft(np.flipud(V), axis = 0) ,axis = 0)

for i in range(N):
    V = M1[:,i][:,None]
    xcorr2[:,:,i] = fft(M2,axis = 0) * fft(np.flipud(V), axis = 0)        
xcorr2 = ifft(xcorr2, axis = 0)

尝试给出 xcorrxcorr2 dtype=complex

xcorr = np.zeros((M1.shape[0],M1.shape[1],M2.shape[1]), dtype=complex)  
xcorr2 = xcorr.copy()

根据 scipy 文档,fft 和 ifft 的输出都是一个复杂的 ndarray。

您使用 np.zeros() 创建 xcorrxcorr2,因此它的默认 dtype 为 float64

将 fft 的输出放入 xcorr2 将导致 complexfloat64 的转换,从而导致虚部被丢弃。

当您将 xcorr2 输入 ifft() 时,它没有虚部,因此您会得到不同的结果。

强制转换也是您在 xcorr 中看不到虚部的原因。