我目前正在使用 FFTW3 库来执行3d快速傅里叶变换 关于 3d复杂数据集(空间中轨道的复数值,在一组网格点(x,y,z))。
实际上,每个采样方向都保持M = 2 * N + 1个采样点。举个例子,x,y和z方向特征(这里是21点)[-10,-9,...,0, 1,...,9,10],在这种情况下,网格间距为dr = 1。
因此,我正在考虑一个大小数据数组(M,M,M)。数据直观地存储数据(x,y,z),即数据(1,1,1)对应于网格点(-10,-10,-10)处的复数值,而数据(21,21, 21)以空间点(10,10,10)的值为特征; (数据(11,11,11)应对应于网格点(x = 0,y = 0,z = 0))。
摘自我的 Fortran foo.f90程序(为简单起见而修改)。
integer, parameter :: dp = kind(4.0d0)
integer, parameter :: dpc = kind(8.0d0)
!library
include "fftw3.f"
integer(dpc) :: plan_forward
!Number of Data points (same for each direction x,y,z)
integer(dp),parameter :: M = 21
! Complex in- and output
complex(dpc), dimension(M,M,M) :: data
complex(dpc), dimension(M,M,M) :: FT
! Make a plan for the FFT, and forward transform the data.
call dfftw_plan_dft_3d ( plan_forward, M, M, M,data ,FT ,FFTW_FORWARD, FFTW_ESTIMATE )
call dfftw_execute ( plan_forward, data, FT )
此外,我的傅立叶变换输出FT的大小为MxMxM。 (我已经交叉检查:执行逆傅里叶变换(FFTW_BACKWARD),恢复我的初始原始数据集(x,y,z)。)
现在解决我的问题,因为我在阅读有关1d,2d和3d案例(真实和复杂)时感到困惑: 我需要弄清楚,哪个数组条目对应于哪个倒数k向量/值,或换句话说:哪个 k -vector(kx,ky,z)确实对应到FT(1,1,1),FT(11,11,11),FT(21,21,21)等。
此外,我也不确定:我的kx,ky,kz值在哪个范围内以及倒数网格间距(dk)是什么?
我对此的看法:
(ⅰ) 首先,每个方向kx,ky,kz的最大k向量(kmax)应该由最小波长定义,该最小波长由我的网格大小及其间距dr决定。
kmax = 2 * pi / dr(所有方向都相同kx,kx,kz)
(ⅱ) 另一方面,我在k空间中的间距由我框中最大波长拟合来定义:
dk = 2 * pi /((M-1)* dr)
(iii)每个k方向由该倒数空间中的M个点组成(对于每个方向kx,ky,kz)。然而,要弄清楚kx,ky,kz的范围,我必须考虑Nquist-shannon定理(我是对的吗?):因此,kx(和ky,kz分别为)在[-kmax /的范围内] 2,...,0,...,kmax / 2]具有dk的离散步骤。我非常感谢任何想法,傅里叶变换后的MxMxM的数组输入对应于哪个倒数 k 值以及如何找出正确对应的kx,ky ,kz值和范围。