回 帖 发 新 帖 刷新版面

主题:[讨论]FFT源代码

      PROGRAM MAIN
      integer*2  X(512)
      COMPLEX C1(128,512),C(512),ZERO
      character*30 in,out
      write(*,*)'input  filename:'
      read(*,'(a)')in
      write(*,*)'output filename:'
      read(*,'(a)')out
      write(*,*)'chose 1 for up 2 for down wave:'
      read(*,*)iflag
      open(1,file=in,form='binary',status='UNKNOWN')
      OPEN(2,FILE=out,FORM='BINARY',STATUS='UNKNOWN')
      read(1)(x(i),i=1,40)
      nt=x(2)
      np=x(12)
      ZERO=CMPLX(0.0,0.0)
      do  i=1,128
        do  j=1,512
        c1(i,j)=ZERO
        ENDDO
        ENDDO
        write(2)(X(J),J=1,40)
      DO 10 I=1,nt
      read(1)(X(J),J=1,np)
      DO 11  J=1,np
      C(J)=CMPLX(X(J),0.0)
11    CONTINUE
      DO J=np+1,512
      C(J)=ZERO
      ENDDO
      CALL  FORK(512,C,1.0)
      DO 12 J=1,512
      C1(I,J)=C(J)
12    continue
10    CONTINUE

      DO 13  I=1,512
      DO J=nt+1,128
         C(J)=ZERO
      ENDDO
        DO 14 J=1,nt
        C(J)=C1(J,I)
14      CONTINUE
        CALL FORK(128,C,1.0)
        DO 15 J=1,128
15      C1(J,I)=C(J)
13    CONTINUE
      if(iflag.eq.1)then
        DO 16 I=1,64
          DO 16 J=257,512
          C1(I,J)=ZERO
16      CONTINUE
        do i=65,128
           do j=1,256
             c1(i,j)=zero
           enddo
         enddo
      elseif(iflag.eq.2)then
        do i=1,64
          do j=1,256
            c1(i,j)=zero
          enddo
        enddo
        do i=65,128
          do j=257,512
            c1(i,J)=zero
          enddo
        enddo
      endif
      DO 100 I=1,128
        DO 111  J=1,512
          C(j)=C1(I,J)
111     CONTINUE
      CALL  FORK(512,C,-1.0)
      DO 112 J=1,512
112    C1(I,J)=C(J)
100    CONTINUE
      DO 113  I=1,512
        DO 114 J=1,128
        C(J)=C1(J,I)
114     continue
        CALL FORK(128,C,-1.0)
        DO 115 J=1,128
115      C1(J,I)=C(J)
113    CONTINUE
       DO 17 I=1,nt
         DO 18 J=1,np
           X(J)=REAL(C1(I,J))
18       CONTINUE
        WRITE(2)(X(J),J=1,np)
17      CONTINUE
        END

      SUBROUTINE FORK(LX,CX,SIGNI)
!      fast fourier                        2/15/69
!                LX
!         CX(K)=SQRT(1/LX) SUM (CX(J)*EXP(2*PI*SIGNI*I*(J-1)*(K-1)/LX))
!                  J=1              FOR K= 1,2,...,(LX=2**INTEGER)
      COMPLEX CX(LX),CARG,CEXP,CW,CTEMP
      J=1
      SC=SQRT(1./LX)
      DO 30 I=1,LX
        IF(I.GT.J) GO TO 10
        CTEMP=CX(J)*SC
        CX(J)=CX(I)*SC
        CX(I)=CTEMP
10      M=LX/2
20      IF(J.LE.M) GO TO 30
        J=J-M
        M=M/2
        IF(M.GE.1) GO TO 20
30    J=J+M
      L=1
40    ISTEP=2*L
      DO 50 M=1,L
      CARG=(0.,1.)*(3.14159265*SIGNI*(M-1))/L
      CW=CEXP(CARG)
      DO 50 I=M,LX,ISTEP
      CTEMP=CW*CX(I+L)
      CX(I+L)=CX(I)-CTEMP
50    CX(I)=CX(I)+CTEMP
      L=ISTEP
      IF(L.LT.LX)GO TO 40
      RETURN
      END
这是我从网上下的一个Fortran下的FFT的源代码,但是看不太懂,哪位介绍一下该怎么调用的?
input file中应该是什么内容?iflag是什么?

回复列表 (共4个回复)

沙发

下别人的源码顺便下别人的介绍文件吧. 看源码猜意图吃力不讨好.

板凳

就是没有找到相关的介绍啊,所以才问的啊~~

3 楼

FFT有不少函数库都有提供. 如果你只是用的话可以考虑.

4 楼


我只是要在Fortran中调用,可是看这个代码,不懂它里面需要输入的是什么

我来回复

您尚未登录,请登录后再回复。点此登录或注册