实现 fftshift 和 ifftshift 的正确顺序(在 python 中)

ap2*_*p21 8 python fft scipy

我想对一个函数进行傅里叶变换psi(x),将其乘以 k 空间函数exp(-kx^2-ky^2),然后将乘积逆傅里叶变换回 x 空间。

但是我的 x 空间和 k 空间网格位于中心,并且我知道我需要fftshiftifftshift正确实现我的 k 空间乘法。但我不明白它们是如何工作的,所以我不知道按照什么顺序来实现它们。有人可以告诉我我在这里做得是否正确吗?

import scipy.fftpack as spfft
import numpy as np

#Create a centred k-space grid]

kxmax, kymax = 10,10
kxgrid = np.linspace(-kxmax/2, kxmax/2, NX)
kygrid = np.linspace(-kymax/2, kymax/2, NY)
KX, KY = np.meshgrid(kxgrid, kygrid, indexing='xy')

psi = spfft.ifft2(spfft.fftshift(np.exp(-(KX**2 + KY**2)) * spfft.fftshift(spfft.fft2(psi))))
Run Code Online (Sandbox Code Playgroud)

Ahm*_*sih 10

不,你没有 \xe2\x80\x99t,但是 \xe2\x80\x99s 好吧,它可能会非常混乱。

\n\n

第一件事:fftifft要求原点位于向量的开头(或者在 2D 情况下,位于数组的左上角)。输入psi\xe2\x80\x99s 原点是否像 一样居中KX?如果是这样,它的原点必须移到以 开头ifftshift。(如果没有,那就别管它。)

\n\n

第二:因为KXKY起源于它们的中心,所以你必须取消它们的移动:你需要spfft.ifftshift(np.exp(-(KX**2 + KY**2))(注意i)。

\n\n

最后:因此,您的输出psi将从一开始就有其起源。如果你希望它的原点像 那样居中KXfftshift那么它。

\n\n

总之:

\n\n
inputOriginStart = # ...\ninputOriginStartFFT = spfft.fft2(psiOriginStart)\nfilterOriginStartFFT = spfft.ifftshift(np.exp(-(KX**2 + KY**2)))\noutputOriginStart = spfft.ifft2(filterOriginStartFFT * inputOriginStartFFT)\n
Run Code Online (Sandbox Code Playgroud)\n\n

假设inputOriginStartpsi\xe2\x80\x99s 的原点位于开头,那么输入在哪里,为了清晰起见,outputOriginStart输出psi\xe2\x80\x94 重命名在哪里。(我总是力求清晰。如果它不起作用,你可以更容易地弄清楚。)

\n\n

编辑修复了提问者\xe2\x80\x94指出的错误是的,我犯了一个错误,psiOriginStart在开始时留下\xe2\x80\x99s原点;然后是和ifftshift的中心原点函数。(如果您想将\xe2\x80\x99s 原点取消移动到中心,请使用。)KXKYoutputOriginStartfftshift

\n\n

编辑 2将过滤器(KX和 的函数KY)与数据分开,以使正确的括号显而易见。

\n\n
\n\n

如何保持这些直线?需要记住的一些技巧:

\n\n
    \n
  • fft并且ifft总是需要输入并给出起源于一开始的输出。根据经验,这应该很容易记住。
  • \n
  • fftshift取需要/制作的起始原点fft并将原点移至中心。再说一次,我很容易记住这一点,因为打字时的肌肉记忆fftshift(fft(...))一千次后产生了肌肉记忆。
  • \n
  • 最后,唯一剩下的事情是推断出ifftshift是 的逆fftshift:它采用居中原点向量/数组并将原点移至开头。
  • \n
\n