Я пытался написать простую программу для выполнения fft на входном массиве 1D с использованием fftw3. Здесь я использую сейсмограмму в качестве входных данных. Выходной массив, однако, будет содержать только нули.
Я знаю, что ввод правильный, так как я пытался сделать fft того же самого входного файла в MATLAB, что дает правильные результаты. Там нет ошибки компиляции. Я использую 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, поскольку на SO есть тег для fftw, поэтому я надеюсь, что этот вопрос не по теме