fortran编写适用于长度为任意数的一维数组的快速傅里叶变换
时间: 2024-04-11 19:26:54 浏览: 110
下面是一个适用于长度为任意数的一维数组的快速傅里叶变换(FFT)的Fortran示例代码:
```fortran
program fft_example
implicit none
integer, parameter :: N = 8 ! 数组长度
complex(kind=8) :: data(N) ! 输入数组
integer :: i
! 初始化输入数组
do i = 1, N
data(i) = cmplx(i, 0.0)
end do
! 调用FFT函数进行变换
call fft(data, N)
! 打印结果
print *, "FFT结果:"
do i = 1, N
print *, i, data(i)
end do
contains
subroutine fft(data, n)
complex(kind=8), intent(inout) :: data(:)
integer, intent(in) :: n
integer :: m, i, j, k
complex(kind=8) :: w, wp, temp
m = log2(n)
w = cmplx(0.0, -2.0 * acos(-1.0) / real(n))
do i = 0, n-1
j = i
k = 0
do m = 0, log2(n)-1
k = 2 * k + mod(j, 2)
j = j / 2
end do
if (k > i) then
temp = data(i+1)
data(i+1) = data(k+1)
data(k+1) = temp
end if
end do
do m = 1, log2(n)
wp = cmplx(cos(m*w), sin(m*w))
do k = 0, n-1, 2**m
do j = 0, 2**(m-1)-1
temp = wp * data(k+j+2**(m-1))
data(k+j+2**(m-1)) = data(k+j+1) - temp
data(k+j+1) = data(k+j+1) + temp
end do
end do
end do
end subroutine fft
end program fft_example
```
该示例程序使用了与之前的示例相同的快速傅里叶变换算法,但通过将数组长度N作为参数传递给FFT子例程,使其适应任意长度的数组。您可以根据需要修改N的值。
请注意,该示例程序仅适用于长度为2的幂的数组。如果您需要处理其他长度的数组,您可能需要对代码进行适当的修改。
希望这个示例对您有帮助!如果您有任何问题,请随时提问。
阅读全文