53 lines
1.3 KiB
Fortran
53 lines
1.3 KiB
Fortran
SUBROUTINE drealft(data,n,isign)
|
|
INTEGER isign,n
|
|
DOUBLE PRECISION data(n)
|
|
CU USES dfour1
|
|
INTEGER i,i1,i2,i3,i4,n2p3
|
|
DOUBLE PRECISION c1,c2,h1i,h1r,h2i,h2r,wis,wrs
|
|
DOUBLE PRECISION theta,wi,wpi,wpr,wr,wtemp
|
|
theta=3.141592653589793d0/dble(n/2)
|
|
c1=0.5d0
|
|
if (isign.eq.1) then
|
|
c2=-0.5d0
|
|
call dfour1(data,n/2,+1)
|
|
else
|
|
c2=0.5d0
|
|
theta=-theta
|
|
endif
|
|
wpr=-2.0d0*sin(0.5d0*theta)**2
|
|
wpi=sin(theta)
|
|
wr=1.0d0+wpr
|
|
wi=wpi
|
|
n2p3=n+3
|
|
do 11 i=2,n/4
|
|
i1=2*i-1
|
|
i2=i1+1
|
|
i3=n2p3-i2
|
|
i4=i3+1
|
|
wrs=wr
|
|
wis=wi
|
|
h1r=c1*(data(i1)+data(i3))
|
|
h1i=c1*(data(i2)-data(i4))
|
|
h2r=-c2*(data(i2)+data(i4))
|
|
h2i=c2*(data(i1)-data(i3))
|
|
data(i1)=h1r+wrs*h2r-wis*h2i
|
|
data(i2)=h1i+wrs*h2i+wis*h2r
|
|
data(i3)=h1r-wrs*h2r+wis*h2i
|
|
data(i4)=-h1i+wrs*h2i+wis*h2r
|
|
wtemp=wr
|
|
wr=wr*wpr-wi*wpi+wr
|
|
wi=wi*wpr+wtemp*wpi+wi
|
|
11 continue
|
|
if (isign.eq.1) then
|
|
h1r=data(1)
|
|
data(1)=h1r+data(2)
|
|
data(2)=h1r-data(2)
|
|
else
|
|
h1r=data(1)
|
|
data(1)=c1*(h1r+data(2))
|
|
data(2)=c1*(h1r-data(2))
|
|
call dfour1(data,n/2,-1)
|
|
endif
|
|
return
|
|
END
|