【发布时间】:2015-03-28 20:10:03
【问题描述】:
我目前正在做一个需要实现傅立叶变换和逆变换的项目。我正在测试从在线示例修改的程序;打印或写入命令通常用于调试目的:
program testit
INCLUDE 'fftw3.f'
double complex out!, in
real in
parameter (N=100)
dimension in(N), out(N)
integer*8 p,p2
integer i,j
real x
real fact
write(*,*)"stuff in data"
OPEN(UNIT=12, FILE="input.txt", ACTION="write", STATUS="replace")
OPEN(UNIT=20, FILE="dftoutput.txt", ACTION="write", STATUS="replace")
x=0
in = 0
do i=1,N/2
in(i)=1
enddo
do i=1,N
write(*,"(f10.2,1x,f10.2)")in(i)
WRITE(12,*)real(in(i))
enddo
write(*,*)"create plans"
call dfftw_plan_dft_r2c_1d(p ,N,in,out,FFTW_ESTIMATE)
call dfftw_plan_dft_c2r_1d(p2,N,in,out,FFTW_ESTIMATE)
write(*,*)"do it"
call dfftw_execute_dft_r2c(p,in,out)
do i=1,N
write(*,"(f12.4,1x,f12.4)")out(i)
WRITE(20,*)abs(out(i))
enddo
write(*,*)"undo it"
call dfftw_execute_dft_c2r(p2,in,out)
fact=1.0/N
do i=1,N
write(*,)in(i)
write(*,)out(i)
enddo
write(*,*)"clean up"
call dfftw_destroy_plan(p,in,out)
call dfftw_destroy_plan(p2,in,out)
end program
真实到复杂的转换效果很好。逆变换给出了错误的值,并以某种方式修改了输入和输出变量。我不知道问题是什么,我无法在网上找到任何答案。感谢您的帮助。
提前致谢!
乍得·W·弗里尔
编辑:我还想知道在 fftw 包中是否有与 matlab 中的 fftshift() 和 ifftshift() 类似的功能。
【问题讨论】:
-
你必须描述你是如何得到错误值的,它们的样子以及你期望的值。
-
根据 FFTW 关于planner flags 的文档,>
FFTW_PRESERVE_INPUT指定异地转换不得更改其输入数组。这通常是默认值,除了 c2r 和 hc2r(即复数到实数)转换,FFTW_DESTROY_INPUT是默认值...