首页 >

快速傅里叶变换FFT

作者:魔啸天龙  日期:05-23
来源:魔啸天龙
如下代码及示范数据,输出为:

(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
常规|工具|专业|读物|
代码|教学|算法|
首页 >
FortranCoder手机版-导航