【发布时间】:2019-04-25 15:59:34
【问题描述】:
我正在尝试编写一个 FORTRAN 代码来评估使用 FFTW3 库的高斯函数 f(r)=exp(-(r^2)) 的快速傅里叶变换。众所周知,高斯函数的傅里叶变换是另一个高斯函数。
我考虑评估球坐标中高斯函数的傅里叶变换积分。
因此得到的积分可以简化为[r*exp(-(r^2))*sin(kr)]dr的积分。
我编写了以下 FORTRAN 代码来评估离散正弦变换 DST,它是使用纯实输入数组的离散傅里叶变换 DFT。 DST由FFTW3中存在的C_FFTW_RODFT00执行,考虑到位置空间中的离散值是r=i*delta(i=1,2,...,1024),DST的输入数组是函数r*exp(-(r^2))不是高斯函数。 [r*exp(-(r^2))*sin(kr)]dr 积分中的正弦函数由 SPHERICAL 坐标上的 INTEGRATION 得到,通常在进行解析傅里叶变换时出现的不是 exp(ik.r) 的虚部。
但是,结果不是动量空间中的高斯函数。
Module FFTW3
use, intrinsic :: iso_c_binding
include 'fftw3.f03'
end module
program sine_FFT_transform
use FFTW3
implicit none
integer, parameter :: dp=selected_real_kind(8)
real(kind=dp), parameter :: pi=acos(-1.0_dp)
integer, parameter :: n=1024
real(kind=dp) :: delta, k
real(kind=dp) :: numerical_F_transform
integer :: i
type(C_PTR) :: my_plan
real(C_DOUBLE), dimension(1024) :: y
real(C_DOUBLE), dimension(1024) :: yy, yk
integer(C_FFTW_R2R_KIND) :: C_FFTW_RODFT00
my_plan= fftw_plan_r2r_1d(1024,y,yy,FFTW_FORWARD, FFTW_ESTIMATE)
delta=0.0125_dp
do i=1, n !inserting the input one-dimension position function
y(i)= 2*(delta)*(i-1)*exp(-((i-1)*delta)**2)
! I multiplied by 2 due to the definition of C_FFTW_RODFT00 in FFTW3
end do
call fftw_execute_r2r(my_plan, y,yy)
do i=2, n
k = (i-1)*pi/n/delta
yk(i) = 4*pi*delta*yy(i)/2 !I divide by 2 due to the definition of
!C_FFTW_RODFT00
numerical_F_transform=yk(i)/k
write(11,*) i,k,numerical_F_transform
end do
call fftw_destroy_plan(my_plan)
end program
执行前面的代码会得到以下不适用于高斯函数的图。
谁能帮我理解问题是什么?我猜这个问题主要是由于FFTW3。也许我没有正确使用它,尤其是在边界条件方面。
【问题讨论】:
-
嗨,你的函数的情节丢失了,这使得它很难回答,就像坐在公共汽车上一样。但是我能看到的两件有点奇怪的事情是 roygvib 提到的,你用 yk 创建计划,但在变换中使用 yy,对于频率,虽然你的版本没有错,但更常见的是后半部分范围为负频率 - 这样,如果您正确地完成了 FFT,那么该图将看起来是一个高斯,正如您所做的那样,它不会(它将是 2 个“1/2 高斯”,一个位于范围的任一端)
-
感谢 roygvib 和 Ian Bush。你的回答很有帮助。负频率没有问题,只要正频率正确,就可以生成它们。编辑代码后,在 x 轴下方的图形中仍然存在负变换,这不会使绘图成为高斯图。问题依旧存在!!!