当前位置: 代码迷 >> python >> 执行fftshift和ifftshift的正确顺序(在python中)
  详细解决方案

执行fftshift和ifftshift的正确顺序(在python中)

热度:39   发布时间:2023-06-13 13:57:49.0

我想傅立叶变换函数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))))

不,你没有,但没关系,它可能非常令人困惑。

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

第二:由于KXKY起源于他们的中心,你必须spfft.ifftshift(np.exp(-(KX**2 + KY**2))它们:你需要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 KXKY的中心原点功能。 (如果你想将outputOriginStart的原点outputOriginStart到中心,那么使用fftshift 。)

编辑2将数据库中的过滤器( KXKY功能)分开,以使正确的括号显而易见。


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

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