代码之家  ›  专栏  ›  技术社区  ›  Yuki.kuroshita

Fortran结果中的FFTW只包含零

  •  2
  • Yuki.kuroshita  · 技术社区  · 6 年前

    我一直在尝试编写一个简单的程序,使用fftw3在一维输入阵列上执行fft。这里我用地震记录作为输入。然而,输出数组只包含零。

    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的,因为在SO上有fftw的标签,所以我希望这个问题不是离题

    1 回复  |  直到 6 年前
        1
  •  4
  •   Community TTT    4 年前

    正如@roygvib和@Ross在注释中首先解释的,plan子例程覆盖了输入数组,因为它们使用不同的参数多次尝试转换。我将补充一些实际使用方面的考虑。

    你声称你很在乎表现。那么有两种可能:

    1. 你做这个转变 只有一次 FFTW_MEASURE . 规划子程序是 比实际计划执行子程序。使用 FFTW_ESTIMATE

    FFTW\u MEASURE告诉FFTW找到一个优化的计划 实际上 计算多个FFT 花点时间 (通常是几秒钟)。 FFTW\U度量是默认的计划选项。

    不同的算法,一个简单的启发式是用来选择一个(可能是 次优)计划 迅速地 输入/输出数组 在计划过程中。

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

    1. 你做同样的变换 对于不同的数据。那你必须做计划 只有一次 在第一次改造和再利用之前的计划。先制定计划,然后用第一个输入数据填充数组。在每次运输前制定计划会使程序极其缓慢。