我要对一个函数psi(x)
进行傅立叶变换,乘以k空间函数exp(-kx^2-ky^2)
,然后将乘积反傅立叶变换回x空间。在
但是我的x空间和k空间网格是集中的,我知道我需要fftshift
和{
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))))
不,你没有,但没关系,这会让人很困惑。在
第一件事:}要求原点在向量的开头(或者在2D的情况下,在数组的左上角)。输入
fft
和{psi
的原点是否以KX
为中心?如果是这样,它的原点必须移到以ifftshift
开头。(如果没有,那就别管它了。)第二:由于
KX
和KY
的起源都在它们的中心,所以必须取消它们的移动:需要spfft.ifftshift(np.exp(-(KX**2 + KY**2))
(注意i
)。在最后:您的输出
psi
将因此在开头有它的起源。如果你想让它的原点像KX
那样居中,fftshift
它。在总而言之:
其中},为了清楚起见,重命名了它。)我总是追求清晰。如果它不起作用,你可以更容易地找出它。)
inputOriginStart
是输入psi
,假设它的起源在开头,其中outputOriginStart
是输出{Edit修正了提问者指出的错误是的,我有个错误,在开始时保留}和{}。(如果要将
psiOriginStart
的原点;然后ifftshift
的中心原点函数{outputOriginStart
的原点取消移动到中心,则使用fftshift
。)编辑2将过滤器(函数
KX
和KY
)从数据中分离出来,使正确的括号变得明显。在如何保持这些直线?需要记住的几个技巧:
fft
和ifft
总是需要输入,并给出起源在开头的输出。这应该很容易从经验中记住。在fftshift
取fft
需要/制造的起始原点,并将原点移到中心。再一次,我倾向于很容易地记住这一点,因为输入fftshift(fft(...))
上千次的肌肉记忆。在ifftshift
是fftshift
的逆:它取中心的原点向量/数组,并将原点移到起始位置。在相关问题 更多 >
编程相关推荐