SUBROUTINE FFT(DATA,ISIZ) C C THIS SUBROUTINE CALCULATES THE FAST FOURIER TRANSFORM OF THE C COMPLEX ARRAY. PASSED IS THE ARRAY AND THE SIZE OF THE C TRANSFORM (MUST BE A POWER OF TWO.) IT USES A DECIMATION IN TIME C ALGORITHM. THE INVERSE FFT IS ADJUSTED TO YIELD NORMALIZED VALUES. C COMPLEX DATA, TEMP, FACT, DELT REAL*8 ANORM, VALUE LOGICAL*1 INVRS INTEGER*2 ISIZ, ILIM, IK, J, INCR, JUMP, LIM, IOTH DIMENSION DATA(0:ISIZ-1) PARAMETER (PI=3.14159265358) C INVRS = .FALSE. GOTO 20 ENTRY INVFFT(DATA,ISIZ) INVRS= .TRUE. DO 10 I=0,ISIZ-1 DATA(I) = CONJG(DATA(I)) 10 CONTINUE 20 CONTINUE ILIM = ISIZ - 1 IK = INT(LOG(FLOAT(ISIZ)) / LOG(2.0) + .4) DO 30 I=0,ISIZ-1 J = IBITR(I, IK) IF (I .LT. J) THEN TEMP = DATA(I) DATA(I) = DATA(J) DATA(J) = TEMP END IF 30 CONTINUE JUMP = 1 DO 80 I0=1,IK INCR = JUMP VALUE = PI / INCR JUMP = JUMP * 2 FACT = (1.0,0.0) DELT = CMPLX( COS( VALUE ), SIN( VALUE )) LIM = INCR - 1 DO 70 I1=0,LIM DO 60 I2=I1,ILIM,JUMP IOTH = I2 + INCR TEMP = DATA(IOTH) * FACT DATA(IOTH) = DATA(I2) - TEMP DATA(I2) = DATA(I2) + TEMP 60 CONTINUE FACT = FACT * DELT 70 CONTINUE 80 CONTINUE IF (INVRS) THEN ANORM = 1.0 / ISIZ DO 90 I=0,ILIM DATA(I) = CONJG(DATA(I)) * ANORM 90 CONTINUE ENDIF RETURN END