FFTW:从真实到复杂和复杂到真实的2D转换的麻烦

时间:2011-09-22 18:14:26

标签: fortran fft fortran90 fftw ifft

正如标题所述,我正在使用带有Fortran 90/95的FFTW(版本3.2.2)来执行实际数据的2D FFT(实际上是随机数字段)。我认为前进步骤正在发挥作用(至少我得到了一些产出)。但是我想通过IFFT来检查所有内容,看看我是否可以重新构建原始输入。不幸的是,当我将复杂程序称为实际例程时,没有任何反应,我没有获得错误输出,所以我有点困惑。以下是一些代码段:

implicit none

include "fftw3.f"

! - im=501, jm=401, and lm=60

real*8    :: u(im,jm,lm),recov(im,jm,lm)
complex*8 :: cu(1+im/2,jm)
integer*8 :: planf,planb    
real*8    :: dv

! - Generate array of random numbers
dv=4.0
call random_number(u)
u=u*dv
recov=0.0

k=30

! - Forward step (FFT)

call dfftw_plan_dft_r2c_2d(planf,im,jm,u(:,:,k),cu,FFTW_ESTIMATE)
call dfftw_execute_dft_r2c(planf,u(:,:,k),cu)
call dfftw_destroy_plan(planf)

! - Backward step (IFFT)

call dfftw_plan_dft_c2r_2d(planb,im,jm,cu,recov(:,:,k),FFTW_ESTIMATE)
call dfftw_execute_dft_c2r(planb,cu,recov(:,:,k))
call dfftw_destroy_plan(planb)

上面的前进步骤似乎有效(r2c),但后退步骤似乎不起作用。我通过差分u和recov数组检查了这一点 - 结果不是零。另外,recov数组的max和min值都是零,这似乎表明没有任何改变。

我查看了FFTW文档,并在下一页http://www.fftw.org/fftw3_doc/Fortran-Examples.html#Fortran-Examples上基于我的实现。我想知道问题是否与索引有关,至少这是我倾向的方向。无论如何,如果有人能提供一些帮助,那就太好了!

谢谢!

1 个答案:

答案 0 :(得分:1)

不确定这是否是这里所有问题的根源,但你声明变量的方式可能是罪魁祸首。

对于大多数编译器(这显然不是标准),Complex*8是单精度的旧语法:复杂变量占用总共8个字节,在实部和虚部之间共享(4+) 4个字节)。

[编辑1跟随Vladimir F评论我的回答,详见他的链接:]根据我的经验(即我曾经使用的系统/编译器),Complex(Kind=8)对应于双精度复数的声明(一个实部和一个虚部,两者都占据8个字节)。

在任何系统/编译器上,Complex(Kind=Kind(0.d0))都应该声明一个双精度复合体。

简而言之,您的复杂数组的大小不正确。将Real*8Complex*8的出现次序分别替换为Real(kind=8)Complex(Kind=8)(或Complex(Kind=kind(0.d0))以获得更好的可移植性)。