我想对一个函数进行傅里叶变换,乘以一个k-空间函数,然后将乘积反傅里叶变换回x-空间。
但是我的x-空间和k-空间网格是居中的,我知道我需要psi(x)exp(-kx^2-ky^2)来正确地实现我的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))))

最佳答案

不,你没有,但没关系,可能会很混乱。
第一件事:fftifft要求原点在向量的开头(或者在二维情况下,在数组的左上角)。输入psi的原点是否以KX为中心?如果是这样,它的原点必须以ifftshift开始。(如果没有,那就别管它。)
第二:由于KXKY在它们的中心有原点,所以必须取消它们的提升:您需要spfft.ifftshift(np.exp(-(KX**2 + KY**2))(注意i)。
最后:因此,您的输出psi将从一开始就有它的来源。如果你想让它的原点像KXfftshift那样居中。
总而言之:

inputOriginStart = # ...
inputOriginStartFFT = spfft.fft2(psiOriginStart)
filterOriginStartFFT = spfft.ifftshift(np.exp(-(KX**2 + KY**2)))
outputOriginStart = spfft.ifft2(filterOriginStartFFT * inputOriginStartFFT)

其中inputOriginStart是输入psi假设它的原点在开始,而outputOriginStart是输出psi为清晰起见重命名。(我总是追求清晰。如果它不起作用,你可以更容易地解决。)
编辑修正了提问者指出的错误是的,我犯了一个错误,在开始时保留psiOriginStart的原点;然后ifftshift的中心原点函数KXKY(如果要将outputOriginStart的原点取消偏移到中心,请使用fftshift
编辑2将过滤器(函数KXKY)从数据中分离出来,使正确的括号变得明显。
如何保持这些直线?要记住的几个技巧:
fftifft始终需要输入,并给出源在开头的输出。这应该很容易从经验中记住。
fftshift获取fft需要/生成的起始原点,并将原点移到中心。同样,我倾向于容易地记住这一点,因为肌肉记忆从打字fftshift(fft(...))一千次。
最后,唯一剩下的事情是推断ifftshiftfftshift的逆:它接受居中的原点向量/数组,并将原点移到起点。

10-06 09:00