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

2024-03-28 15:43:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但是我的x空间和k空间网格是集中的,我知道我需要fftshift和{}来正确实现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))))

Tags: 函数importasnp空间psikxlinspace
1条回答
网友
1楼 · 发布于 2024-03-28 15:43:49

不,你没有,但没关系,这会让人很困惑。在

第一件事:fft和{}要求原点在向量的开头(或者在2D的情况下,在数组的左上角)。输入psi的原点是否以KX为中心?如果是这样,它的原点必须移到以ifftshift开头。(如果没有,那就别管它了。)

第二:由于KXKY的起源都在它们的中心,所以必须取消它们的移动:需要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是输出{},为了清楚起见,重命名了它。)我总是追求清晰。如果它不起作用,你可以更容易地找出它。)

Edit修正了提问者指出的错误是的,我有个错误,在开始时保留psiOriginStart的原点;然后ifftshift的中心原点函数{}和{}。(如果要将outputOriginStart的原点取消移动到中心,则使用fftshift。)

编辑2将过滤器(函数KXKY)从数据中分离出来,使正确的括号变得明显。在


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

  • fftifft总是需要输入,并给出起源在开头的输出。这应该很容易从经验中记住。在
  • fftshiftfft需要/制造的起始原点,并将原点移到中心。再一次,我倾向于很容易地记住这一点,因为输入fftshift(fft(...))上千次的肌肉记忆。在
  • 最后,唯一剩下的事情是推断ifftshiftfftshift的逆:它取中心的原点向量/数组,并将原点移到起始位置。在

相关问题 更多 >