用pyfftw替换numpy.fft例程,没有按预期工作

时间:2013-09-04 14:14:14

标签: python numpy fft fftw pyfftw

我有一些使用numpy.fft包的python代码,这里有一个片段:

for i in range(steps):
    print i
    psixvec = Ux * psixvec
    psikvec = Uk * np.fft.fftn(psixvec)
    psixvec = np.fft.ifftn(psikvec)

return psixvec

我尝试重写此代码以使用pyfftw包。我想出的是以下代码,应该工作:

fft = fftw.builders.fftn(psix_align, auto_align_input = True, auto_contiguous = True,
                      overwrite_input = False, threads = 1, avoid_copy = False)

ifft = fftw.builders.ifftn(psik_align, auto_align_input = True, auto_contiguous = True,
                      overwrite_input = False, threads = 1, avoid_copy = False) 


for i in range(steps):
    psix_align[:] = Ux * psix_align
    psik_align[:] = Uk * fft()
    psix_align[:] = ifft()

return psix_align

问题是,此代码与使用numpy.fft包的结果不同。见附图。

numpy fft package pyfftw package

1 个答案:

答案 0 :(得分:2)

解决。对于我正在使用的初始化

psix_align = fftw.n_byte_align(psi0, fftw.simd_alignment, dtype='complex64')
psik_align = fftw.n_byte_align(np.zeros_like(psi0), fftw.simd_alignment, dtype='complex64')

我需要将complex64替换为complex128。现在我得到了相同的结果。这可能是因为所涉及的数字非常小(参见z轴上的1e-11)。

修改:也许有人可以将pyfftw添加到问题的代码中?