理解Fortran中FFTW的复FFT输出

时间:2017-05-15 19:37:11

标签: multidimensional-array fortran fft fftw

我目前正在使用 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值和范围。

0 个答案:

没有答案