Fortran结果中的FFTW仅包含零

问题描述 投票:2回答:1

我一直在尝试编写一个简单的程序,使用fftw3在一维输入数组上执行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()函数是一个函数,用于计算文件中的行数,并且它可以正常工作。它在名为functions的模块中定义。

这个程序几乎试图遵循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,因为在SO上有一个fftw的标签,所以我希望这个问题不是关于主题的

fortran fft gfortran fftw
1个回答
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. 您可以针对不同的数据多次执行相同的转换。然后,您必须在第一次转换之前只进行一次规划,然后重新使用该计划。只需先制定计划,然后用第一个输入数据填充数组。在每次运输之前制定计划会使计划极其缓慢。
© www.soinside.com 2019 - 2024. All rights reserved.