我想对一个函数进行傅里叶变换,乘以一个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))))
最佳答案
不,你没有,但没关系,可能会很混乱。
第一件事:fft
和ifft
要求原点在向量的开头(或者在二维情况下,在数组的左上角)。输入psi
的原点是否以KX
为中心?如果是这样,它的原点必须以ifftshift
开始。(如果没有,那就别管它。)
第二:由于KX
和KY
在它们的中心有原点,所以必须取消它们的提升:您需要spfft.ifftshift(np.exp(-(KX**2 + KY**2))
(注意i
)。
最后:因此,您的输出psi
将从一开始就有它的来源。如果你想让它的原点像KX
,fftshift
那样居中。
总而言之:
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
的中心原点函数KX
和KY
(如果要将outputOriginStart
的原点取消偏移到中心,请使用fftshift
)编辑2将过滤器(函数
KX
和KY
)从数据中分离出来,使正确的括号变得明显。如何保持这些直线?要记住的几个技巧:
fft
和ifft
始终需要输入,并给出源在开头的输出。这应该很容易从经验中记住。fftshift
获取fft
需要/生成的起始原点,并将原点移到中心。同样,我倾向于容易地记住这一点,因为肌肉记忆从打字fftshift(fft(...))
一千次。最后,唯一剩下的事情是推断
ifftshift
是fftshift
的逆:它接受居中的原点向量/数组,并将原点移到起点。