gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:19:56 25 4
gpt4 key购买 nike

我想对函数 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))(注意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—为清楚起见重命名。 (我总是为了清楚起见。如果它不起作用,你可以更容易地弄清楚。)

Edit修复了提问者指出的错误——是的,我错了,把psiOriginStart的原点留在开头;然后 ifftshift KXKY 的中心原点函数。 (如果您想取消将 outputOriginStart 的原点移到中心,请使用 fftshift。)

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


如何保持这些笔直?需要记住的一些技巧:

  • fftifft 总是需要输入并给出起源于开头的输出。这应该很容易从经验中记住。
  • fftshift 采用 fft 需要/制作的开始原点并将原点移动到中心。同样,由于键入 fftshift(fft(...)) 一千次的肌肉内存,我倾向于很容易记住这一点。
  • 最后,唯一剩下的就是推断 ifftshiftfftshift 的逆函数:它采用居中原点向量/数组并将原点移动到开头。

关于python - 正确执行 fftshift 和 ifftshift 的顺序(在 python 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com