大学 发表于 2010-12-25 18:22:09

傅里叶变换fortran

傅里叶变换是数值计算中非常常用的程序,有专门的程序包。但对于不是特别专业的傅里叶变换,比如,简单的数据处理,那就不需要优化代码了。下面是一个傅里叶变换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

傅里叶变换是数值计算中非常常用的程序,有专门的程序包。
但对于不是特别专业的傅里叶变换,比如,简单的数据处理,那就不需要优化代码了。
下面是一个傅里叶变换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      150K = 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      100WHILE (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      200L = 1, M
      Q=0.0
      L1 =L2
      L2 =2*L1
      DO    190K = 1, L1
          U   =COS(Q)
          V   = -SIN(Q)
          Q   =Q + PI/L1
          DO180J = 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    傅里叶变换    .

leachmond 发表于 2015-6-4 21:28:18

楼主 如果已知30个点的坐标 可以通过你的程序进行傅里叶级数拟合么?

penultimate 发表于 2015-6-6 11:08:27

要2的整数次幂才行,注意:
N1 = 2**M
IF(N1.NE.N) STOP 'Indices do not match'
这两行代码
页: [1]
查看完整版本: 傅里叶变换fortran