|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
本代码实现 Cooley-Tukey 蝶形算法计算复数域的一维快速傅里叶变换。非迭代方式,节约内存,执行速度快。要求数据个数为2的整幂次方,符合语法规范,可直接使用。
如下代码及示范数据,输出为:
(363.000000000000,0.000000000000000E+000)
(-52.9411231676211,-65.4558436870575)
(-15.0000000874228,2.00000000000000)
(14.9411242803314,14.5441577965562)
(31.0000000000000,0.000000000000000E+000)
(14.9411266645322,-14.5441563129425)
(-14.9999999125772,-2.00000000000000)
(-52.9411277772425,65.4558422034438)
(36.0000000000000,0.000000000000000E+000)
(21.0000007843665,-4.589695601353583E-007)
(33.0000000000000,0.000000000000000E+000)
(44.0000003562839,-6.556710155648600E-008)
(55.0000000000000,0.000000000000000E+000)
(62.9999992156335,4.589695601353583E-007)
(73.0000000000000,0.000000000000000E+000)
(37.9999996437161,6.556710155648600E-008)
- Module FFT_Mod
- Implicit None
- Integer , parameter :: DP = Selected_Real_Kind( 15 )
- Integer , parameter :: FFT_Forward = 1
- Integer , parameter :: FFT_Inverse = -1
- contains
- Subroutine fcFFT( x , forback )
- !//Subroutine FFT , Cooley-Tukey , radix-2
- !// www.fcode.cn
- Real(Kind=DP) , parameter :: PI = 3.141592654_DP
- Complex(Kind=DP) , Intent(INOUT) :: x(:)
- Integer , Intent(IN) :: forback
- Integer :: n
- integer :: i , j , k , ncur , ntmp , itmp
- real(Kind=DP) :: e
- complex(Kind=DP) :: ctmp
- n = size(x)
- ncur = n
- Do
- ntmp = ncur
- e = 2.0_DP * PI / ncur
- ncur = ncur / 2
- if ( ncur < 1 ) exit
- Do j = 1 , ncur
- Do i = j , n , ntmp
- itmp = i + ncur
- ctmp = x(i) - x(itmp)
- x(i) = x(i) + x(itmp)
- x(itmp) = ctmp * exp( forback * cmplx( 0.0_DP , e*(j-1) ) )
- End Do
- End Do
- End Do
- j = 1
- Do i = 1, n - 1
- If ( i < j ) then
- ctmp = x(j)
- x(j) = x(i)
- x(i) = ctmp
- End If
- k = n/2
- Do while( k < j )
- j = j - k
- k = k / 2
- End Do
- j = j + k
- End Do
- Return
- End Subroutine fcFFT
- End Module FFT_Mod
-
- Program www_fcode_cn
- use FFT_Mod
- Implicit None
- integer :: i
- integer , parameter :: N = 8
- complex(Kind=DP) :: x(N) = [36.d0,21.d0,33.d0,44.d0,55.d0,63.d0,73.d0,38.d0 ]
- Call fcFFT( x , FFT_Forward )
- Do i = 1 , N
- Write (*, *) x(i)
- End Do
- Call fcFFT( x , FFT_Inverse )
- Do i = 1 , N
- Write (*, *) x(i)/N
- End Do
- End Program www_fcode_cn
复制代码 |
|