www.pudn.com > Fortran.zip > KKFFT.FOR, change:1995-03-31,size:1436b


 
 
	SUBROUTINE KKFFT(PR,PI,N,K,FR,FI,L,IL) 
	DIMENSION PR(N),PI(N),FR(N),FI(N) 
	DOUBLE PRECISION PR,PI,FR,FI,P,Q,S,VR,VI,PODDR,PODDI 
	DO 20 IT=0,N-1 
	  M=IT 
	  IS=0 
	  DO 10 I=0,K-1 
	    J=M/2 
	    IS=2*IS+(M-2*J) 
	    M=J 
10	  CONTINUE 
	  FR(IT+1)=PR(IS+1) 
	  FI(IT+1)=PI(IS+1) 
20	CONTINUE 
	PR(1)=1.0 
	PI(1)=0.0 
	PR(2)=COS(6.283185306/N) 
	PI(2)=-SIN(6.283185306/N) 
	IF (L.NE.0) PI(2)=-PI(2) 
	DO 30 I=3,N 
	  P=PR(I-1)*PR(2) 
	  Q=PI(I-1)*PI(2) 
	  S=(PR(I-1)+PI(I-1))*(PR(2)+PI(2)) 
	  PR(I)=P-Q 
	  PI(I)=S-P-Q 
30	CONTINUE 
	DO 40 IT=0,N-2,2 
	  VR=FR(IT+1) 
	  VI=FI(IT+1) 
	  FR(IT+1)=VR+FR(IT+2) 
	  FI(IT+1)=VI+FI(IT+2) 
	  FR(IT+2)=VR-FR(IT+2) 
	  FI(IT+2)=VI-FI(IT+2) 
40	CONTINUE 
	M=N/2 
	NV=2 
	DO 70 L0=K-2,0,-1 
	  M=M/2 
	  NV=2*NV 
	  DO 60 IT=0,(M-1)*NV,NV 
	  DO 60 J=0,(NV/2)-1 
	    P=PR(M*J+1)*FR(IT+J+1+NV/2) 
	    Q=PI(M*J+1)*FI(IT+J+1+NV/2) 
	    S=PR(M*J+1)+PI(M*J+1) 
	    S=S*(FR(IT+J+1+NV/2)+FI(IT+J+1+NV/2)) 
	    PODDR=P-Q 
	    PODDI=S-P-Q 
	    FR(IT+J+1+NV/2)=FR(IT+J+1)-PODDR 
	    FI(IT+J+1+NV/2)=FI(IT+J+1)-PODDI 
	    FR(IT+J+1)=FR(IT+J+1)+PODDR 
	    FI(IT+J+1)=FI(IT+J+1)+PODDI 
60	  CONTINUE 
70	CONTINUE 
 
 
	IF (L.NE.0) THEN 
	  DO 80 I=1,N 
	    FR(I)=FR(I)/N 
	    FI(I)=FI(I)/N 
80	  CONTINUE 
	END IF 
	IF (IL.NE.0) THEN 
	  DO 90 I=1,N 
	    PR(I)=SQRT(FR(I)*FR(I)+FI(I)*FI(I)) 
	    PI(I)=ATAN(FI(I)/FR(I))*360.0/6.283185306 
90	  CONTINUE 
	END IF 
	RETURN 
	END