C++********************************************************************* C C $$ FFTC_D.FOR C C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (at your option) any later version. * C=* * C=* This program is distributed in the hope that it will be useful, * C=* but WITHOUT ANY WARRANTY; without even the implied warranty of * C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * C=* General Public License for more details. * C=* * C=* You should have received a copy of the GNU General Public License * C=* along with this program; if not, write to the * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C ********************************************************************** C C C IMAGE_PROCESSING_ROUTINE C C 1 2 3 4 5 6 7 C23456789012345678901234567890123456789012345678901234567890123456789012 C--********************************************************************* C C $$ FFTC_D.FOR C SUBROUTINE FFTC_D(BR,BI,LN,KS) DOUBLE PRECISION BR(1),BI(1) DOUBLE PRECISION RNI,SGN,TR1,TR2,TI1,TI2 DOUBLE PRECISION CC,C,SS,S,T,X2,X3,X4,X5 INTEGER B3,B4,B5,B6,B7,B56 DOUBLE PRECISION TAB1(15) #ifdef SP_MP TAB1(1)=9.58737990959775D-05 TAB1(2)=1.91747597310703D-04 TAB1(3)=3.83495187571395D-04 TAB1(4)=7.66990318742704D-04 TAB1(5)=1.53398018628476D-03 TAB1(6)=3.06795676296598D-03 TAB1(7)=6.13588464915449D-03 TAB1(8)=1.22715382857199D-02 TAB1(9)=2.45412285229123D-02 TAB1(10)=4.90676743274181D-02 TAB1(11)=9.80171403295604D-02 TAB1(12)=1.95090322016128D-01 TAB1(13)=3.82683432365090D-01 TAB1(14)=7.07106781186546D-01 TAB1(15)=1.00000000000000D+00 #else DATA TAB1/ 9.58737990959775D-05, 1.91747597310703D-04, 1 3.83495187571395D-04, 7.66990318742704D-04, 1.53398018628476D-03, 2 3.06795676296598D-03, 6.13588464915449D-03, 1.22715382857199D-02, 3 2.45412285229123D-02, 4.90676743274181D-02, 9.80171403295604D-02, 4 1.95090322016128D-01, 3.82683432365090D-01, 7.07106781186546D-01, 5 1.00000000000000D+00/ #endif N=2**LN K=IABS(KS) L=16-LN B3=N*K B6=B3 B7=K IF(KS.GT.0) THEN SGN=1.0 ELSE SGN=-1.0 RNI=1.0D0/FLOAT(N) J=1 DO I=1,N BR(J)=BR(J)*RNI BI(J)=BI(J)*RNI J=J+K ENDDO ENDIF 12 B6=B6/2 B5=B6 B4=2*B6 B56=B5-B6 14 TR1=BR(B5+1) TI1=BI(B5+1) TR2=BR(B56+1) TI2=BI(B56+1) BR(B5+1)=TR2-TR1 BI(B5+1)=TI2-TI1 BR(B56+1)=TR1+TR2 BI(B56+1)=TI1+TI2 B5=B5+B4 B56=B5-B6 IF(B5.LE.B3) GOTO 14 IF(B6.EQ.B7) GOTO 20 B4=B7 CC=2.0*TAB1(L)**2 C=1.0-CC L=L+1 SS=SGN*TAB1(L) S=SS 16 B5=B6+B4 B4=2*B6 B56=B5-B6 18 TR1=BR(B5+1) TI1=BI(B5+1) TR2=BR(B56+1) TI2=BI(B56+1) BR(B5+1)=C*(TR2-TR1)-S*(TI2-TI1) BI(B5+1)=S*(TR2-TR1)+C*(TI2-TI1) BR(B56+1)=TR1+TR2 BI(B56+1)=TI1+TI2 B5=B5+B4 B56=B5-B6 IF(B5.LE.B3) GOTO 18 B4=B5-B6 B5=B4-B3 C=-C B4=B6-B5 IF(B5.LT.B4) GOTO 16 B4=B4+B7 IF(B4.GE.B5) GOTO 12 T=C-CC*C-SS*S S=S+SS*C-CC*S C=T GOTO 16 20 IX0=B3/2 B3=B3-B7 B4=0 B5=0 B6=IX0 IX1=0 IF(B6.EQ.B7) RETURN 22 B4=B3-B4 B5=B3-B5 X2=BR(B4+1) X3=BR(B5+1) X4=BI(B4+1) X5=BI(B5+1) BR(B4+1)=X3 BR(B5+1)=X2 BI(B4+1)=X5 BI(B5+1)=X4 IF(B6.LT.B4) GOTO 22 24 B4=B4+B7 B5=B6+B5 X2=BR(B4+1) X3=BR(B5+1) X4=BI(B4+1) X5=BI(B5+1) BR(B4+1)=X3 BR(B5+1)=X2 BI(B4+1)=X5 BI(B5+1)=X4 IX0=B6 26 IX0=IX0/2 IX1=IX1-IX0 IF(IX1.GE.0) GOTO 26 IX0=2*IX0 B4=B4+B7 IX1=IX1+IX0 B5=IX1 IF(B5.GE.B4) GOTO 22 IF(B4.LT.B6) GOTO 24 END