Fortran中的FFTW结果仅包含零

时间:2018-09-07 13:52:04

标签: fortran fft gfortran fftw

我一直在尝试编写一个简单的程序,使用fftw3在1D输入数组上执行fft。在这里,我使用地震图作为输入。但是,输出数组只包含零。

我知道输入是正确的,因为我也尝试在MATLAB中对同一输入文件进行fft,这将给出正确的结果。没有编译错误。我正在使用f95进行编译,但是gfortran也给出了几乎相同的结果。这是我写的代码:-

program fft

    use functions
    implicit none
    include 'fftw3.f90'
    integer nl,row,col
    double precision, allocatable :: data(:,:),time(:),amplitude(:)
    double complex, allocatable :: out(:)
    integer*8 plan


    open(1,file='test-seismogram.xy')
    nl=nlines(1,'test-seismogram.xy')
    allocate(data(nl,2))
    allocate(time(nl))
    allocate(amplitude(nl))
    allocate(out(nl/2+1))
    do row = 1,nl
        read(1,*,end=101) data(row,1),data(row,2)
        amplitude(row)=data(row,2)
    end do
    101 close(1)


    call dfftw_plan_dft_r2c_1d(plan,nl,amplitude,out,FFTW_R2HC,FFTW_PATIENT)
    call dfftw_execute_dft_r2c(plan, amplitude, out)
    call dfftw_destroy_plan(plan)


    do row=1,(nl/2+1)
        print *,out(row)
    end do


    deallocate(data)
    deallocate(amplitude)
    deallocate(time)
    deallocate(out)
end program fft

nlines()函数是用于计算文件中的行数的函数,它可以正常工作。它在称为函数的模块中定义。

该程序几乎尝试遵循http://www.fftw.org/fftw3_doc/Fortran-Examples.html

上的示例

我可能犯了一个非常简单的逻辑错误,但是我严重无法弄清楚这里出了什么问题。任何指针都将非常有帮助。

这几乎就是整个输出的样子:-

           .
           .
           .
           (0.0000000000000000,0.0000000000000000)
           (0.0000000000000000,0.0000000000000000)
           (0.0000000000000000,0.0000000000000000)
           (0.0000000000000000,0.0000000000000000)
           (0.0000000000000000,0.0000000000000000)
           .
           .
           .

我的疑问直接与fftw有关,因为在fftw上有一个标记,所以我希望这个问题不会成为话题

1 个答案:

答案 0 :(得分:4)

正如@roygvib和@Ross首先在评论中所解释的那样,由于计划子例程使用不同的参数尝试多次转换,因此它们会覆盖输入数组。我将添加一些实际使用注意事项。

您声称自己确实在乎性能。然后有两种可能性:

  1. 您只需执行一次代码转换 即可。这样就没有必要使用FFTW_MEASURE。与实际的计划执行子例程相比,计划子例程要慢许多。使用FFTW_ESTIMATE,它将更快。
  

FFTW_MEASURE告诉FFTW通过实际找到优化的计划   计算多个FFT ,并测量其执行时间。取决于   在您的计算机上,这可能需要一些时间(通常是几秒钟)。   FFTW_MEASURE是默认的计划选项。

     

FFTW_ESTIMATE指定代替实际测量   不同的算法,使用简单的启发式方法来选择   次优)计划迅速。使用此标志,输入/输出数组为   在计划期间不会覆盖

http://www.fftw.org/fftw3_doc/Planner-Flags.html

  1. 您对许多不同的数据进行了多次 相同的转换。然后,您必须在第一次转换之前仅一次进行计划,然后重新使用该计划。只需先制定计划,然后再使用第一个输入数据填充阵列。每次运输前都要制定计划会使程序非常缓慢。