我想对一个函数进行傅里叶变换psi(x),将其乘以 k 空间函数exp(-kx^2-ky^2),然后将乘积逆傅里叶变换回 x 空间。
但是我的 x 空间和 k 空间网格位于中心,并且我知道我需要fftshift并ifftshift正确实现我的 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))))
Run Code Online (Sandbox Code Playgroud)
Ahm*_*sih 10
不,你没有 \xe2\x80\x99t,但是 \xe2\x80\x99s 好吧,它可能会非常混乱。
\n\n第一件事:fft并ifft要求原点位于向量的开头(或者在 2D 情况下,位于数组的左上角)。输入psi\xe2\x80\x99s 原点是否像 一样居中KX?如果是这样,它的原点必须移到以 开头ifftshift。(如果没有,那就别管它。)
第二:因为KX和KY起源于它们的中心,所以你必须取消它们的移动:你需要spfft.ifftshift(np.exp(-(KX**2 + KY**2))(注意i)。
最后:因此,您的输出psi将从一开始就有其起源。如果你希望它的原点像 那样居中KX,fftshift那么它。
总之:
\n\ninputOriginStart = # ...\ninputOriginStartFFT = spfft.fft2(psiOriginStart)\nfilterOriginStartFFT = spfft.ifftshift(np.exp(-(KX**2 + KY**2)))\noutputOriginStart = spfft.ifft2(filterOriginStartFFT * inputOriginStartFFT)\nRun Code Online (Sandbox Code Playgroud)\n\n假设inputOriginStart它psi\xe2\x80\x99s 的原点位于开头,那么输入在哪里,为了清晰起见,outputOriginStart输出psi\xe2\x80\x94 重命名在哪里。(我总是力求清晰。如果它不起作用,你可以更容易地弄清楚。)
编辑修复了提问者\xe2\x80\x94指出的错误是的,我犯了一个错误,psiOriginStart在开始时留下\xe2\x80\x99s原点;然后是和ifftshift的中心原点函数。(如果您想将\xe2\x80\x99s 原点取消移动到中心,请使用。)KXKYoutputOriginStartfftshift
编辑 2将过滤器(KX和 的函数KY)与数据分开,以使正确的括号显而易见。
如何保持这些直线?需要记住的一些技巧:
\n\nfft并且ifft总是需要输入并给出起源于一开始的输出。根据经验,这应该很容易记住。fftshift取需要/制作的起始原点fft并将原点移至中心。再说一次,我很容易记住这一点,因为打字时的肌肉记忆fftshift(fft(...))一千次后产生了肌肉记忆。ifftshift是 的逆fftshift:它采用居中原点向量/数组并将原点移至开头。| 归档时间: |
|
| 查看次数: |
7903 次 |
| 最近记录: |