找回密码
 注册
Simdroid-非首页
查看: 156|回复: 3

[3. Fortran] 傅里叶变换fortran

[复制链接]
发表于 2010-12-25 18:22:09 | 显示全部楼层 |阅读模式 来自 上海闵行区
傅里叶变换是数值计算中非常常用的程序,有专门的程序包。但对于不是特别专业的傅里叶变换,比如,简单的数据处理,那就不需要优化代码了。下面是一个傅里叶变换FFT的Fortran程序,当然你也可以改成C语言程序,只要改成C语言的格式就行了。 SUBROUTINE FFT (AR,AI,N,M) C C An example of the fast Fourier transform subroutine with C N = 2**M. AR and AI are the real and imaginary part of C data in the input and corresponding Fourier coefficients C in the output. C DIMENSION AR(N),AI(N) C PI = 4.0*ATAN(1.0) N2 = N/2 C N1 = 2**M IF(N1.NE.N) STOP 'Indices do not match' C C Rearrange the data to the bit reversed order C L = 1 DO 150 K = 1, N-1 IF(K.LT.L) THEN A1 = AR(L) A2 = AI(L) AR(L) = AR(K) AR(K) = A1 AI(L) = AI(K) AI(K) = A2 ENDIF J = N2 DO 100 WHILE (J.LT.L) L = L - J J = J/2 100 END DO L = L + J 150 CONTINUE C C Perform additions at all levels with reordered data C L2 = 1 DO 200 L = 1, M Q = 0.0 L1 = L2 L2 = 2*L1 DO 190 K = 1, L1 U = COS(Q) V = -SIN(Q) Q = Q + PI/L1 DO 180 J = K, N, L2 I = J + L1 A1 = AR(I)*U - AI(I)*V A2 = AR(I)*V + AI(I)*U AR(I) = AR(J) - A1 AR(J) = AR(J) + A1 AI(I) = AI(J) - A2 AI(J) = AI(J) + A2 180 CONTINUE 190 CONTINUE 200 CONTINUE RETURN END 标签: C 程序 FFT Fortran 傅里叶变换 .
 楼主| 发表于 2010-12-25 18:22:27 | 显示全部楼层 来自 上海闵行区
Simdroid开发平台
傅里叶变换是数值计算中非常常用的程序,有专门的程序包。
但对于不是特别专业的傅里叶变换,比如,简单的数据处理,那就不需要优化代码了。
下面是一个傅里叶变换FFT的Fortran程序,当然你也可以改成C语言程序,只要改成C语言的格式就行了。
SUBROUTINE FFT (AR,AI,N,M)
C
C An example of the fast Fourier transform subroutine with
C N = 2**M. AR and AI are the real and imaginary part of
C data in the input and corresponding Fourier coefficients
C in the output.
C
      DIMENSION AR(N),AI(N)
C
      PI = 4.0*ATAN(1.0)
      N2 = N/2
C
      N1 = 2**M
      IF(N1.NE.N) STOP 'Indices do not match'
C
C Rearrange the data to the bit reversed order
C
      L = 1
      DO      150  K = 1, N-1
        IF(K.LT.L) THEN
          A1    = AR(L)
          A2    = AI(L)
          AR(L) = AR(K)
          AR(K) = A1
          AI(L) = AI(K)
          AI(K) = A2
        ENDIF
        J   = N2
        DO      100  WHILE (J.LT.L)
          L = L - J
          J = J/2
  100   END DO
        L = L + J
  150 CONTINUE
C
C Perform additions at all levels with reordered data
C
      L2 = 1
      DO      200  L = 1, M
        Q  =  0.0
        L1 =  L2
        L2 =  2*L1
        DO    190  K = 1, L1
          U   =  COS(Q)
          V   = -SIN(Q)
          Q   =  Q + PI/L1
          DO  180  J = K, N, L2
            I     =  J + L1
            A1    =  AR(I)*U - AI(I)*V
            A2    =  AR(I)*V + AI(I)*U
            AR(I) =  AR(J) - A1
            AR(J) =  AR(J) + A1
            AI(I) =  AI(J) - A2
            AI(J) =  AI(J) + A2
  180     CONTINUE
  190   CONTINUE
  200   CONTINUE
        RETURN
        END
标签: C    程序    FFT    Fortran    傅里叶变换    .
回复 不支持

使用道具 举报

发表于 2015-6-4 21:28:18 | 显示全部楼层 来自 山东
楼主 如果已知30个点的坐标 可以通过你的程序进行傅里叶级数拟合么?
回复 不支持

使用道具 举报

发表于 2015-6-6 11:08:27 | 显示全部楼层 来自 北京朝阳
要2的整数次幂才行,注意:
N1 = 2**M
IF(N1.NE.N) STOP 'Indices do not match'
这两行代码
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 13:19 , Processed in 0.031828 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表