C++********************************************************************* C C $$ FFTR_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 C IMAGE_PROCESSING_ROUTINE C C 1 2 3 4 5 6 7 C23456789012345678901234567890123456789012345678901234567890123456789012 C--********************************************************************* C C $$ FFTR_D.FOR C SUBROUTINE FFTR_D(X,NV) DOUBLE PRECISION X(2,1) DOUBLE PRECISION RNI,TR1,TR2,TI1,TI2,TR,TI DOUBLE PRECISION CC,C,SS,S,T 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 C NU=IABS(NV) INV=NV/NU NU1=NU-1 N=2**NU1 ISUB=16-NU1 SS=-TAB1(ISUB) CC=-2.0*TAB1(ISUB-1)**2 C=1.0 S=0.0 N2=N/2 IF(INV.GT.0) THEN CALL FFTC_D(X(1,1),X(2,1),NU1,2) TR=X(1,1) TI=X(2,1) X(1,1)=TR+TI X(2,1)=TR-TI DO I=1,N2 I1=I+1 I2=N-I+1 TR1=X(1,I1) TR2=X(1,I2) TI1=X(2,I1) TI2=X(2,I2) T=(CC*C-SS*S)+C S=(CC*S+SS*C)+S C=T X(1,I1)=0.5*((TR1+TR2)+(TI1+TI2)*C-(TR1-TR2)*S) X(1,I2)=0.5*((TR1+TR2)-(TI1+TI2)*C+(TR1-TR2)*S) X(2,I1)=0.5*((TI1-TI2)-(TI1+TI2)*S-(TR1-TR2)*C) X(2,I2)=0.5*(-(TI1-TI2)-(TI1+TI2)*S-(TR1-TR2)*C) ENDDO ELSE TR=X(1,1) TI=X(2,1) X(1,1)=0.5*(TR+TI) X(2,1)=0.5*(TR-TI) DO I=1,N2 I1=I+1 I2=N-I+1 TR1=X(1,I1) TR2=X(1,I2) TI1=X(2,I1) TI2=X(2,I2) T=(CC*C-SS*S)+C S=(CC*S+SS*C)+S C=T X(1,I1)=0.5*((TR1+TR2)-(TR1-TR2)*S-(TI1+TI2)*C) X(1,I2)=0.5*((TR1+TR2)+(TR1-TR2)*S+(TI1+TI2)*C) X(2,I1)=0.5*((TI1-TI2)+(TR1-TR2)*C-(TI1+TI2)*S) X(2,I2)=0.5*(-(TI1-TI2)+(TR1-TR2)*C-(TI1+TI2)*S) ENDDO CALL FFTC_D(X(1,1),X(2,1),NU1,-2) ENDIF END