主题:[讨论]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是什么?
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是什么?