mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-27 14:48:46 -05:00
c4a1997191
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@2464 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
70 lines
1.5 KiB
Fortran
70 lines
1.5 KiB
Fortran
subroutine ffft(d,npts,isign,ireal)
|
|
|
|
C Fourier transform of length npts=2**k, performed in place.
|
|
C Input data in array d, treated as complex if ireal=0, and as real if ireal=1.
|
|
C In either case the transform values are returned in array d, treated as
|
|
C complex. The DC term is d(1), and d(npts/2+1) is the term at the Nyquist
|
|
C frequency. The basic algorithm is the same as Norm Brenner's FOUR1, and
|
|
C uses radix-2 transforms.
|
|
|
|
C J. H. Taylor, Princeton University.
|
|
|
|
complex d(npts),t,w,wstep,tt,uu
|
|
data pi/3.14159265359/
|
|
|
|
C Shuffle the data to bit-reversed order.
|
|
|
|
imax=npts/(ireal+1)
|
|
irev=1
|
|
do 5 i=1,imax
|
|
if(i.ge.irev) go to 2
|
|
t=d(i)
|
|
d(i)=d(irev)
|
|
d(irev)=t
|
|
2 mmax=imax/2
|
|
3 if(irev.le.mmax) go to 5
|
|
irev=irev-mmax
|
|
mmax=mmax/2
|
|
if(mmax.ge.1) go to 3
|
|
5 irev=irev+mmax
|
|
|
|
C The radix-2 transform begins here.
|
|
|
|
api=isign*pi/2.
|
|
mmax=1
|
|
6 istep=2*mmax
|
|
wstep=cmplx(-2.*sin(api/mmax)**2,sin(2.*api/mmax))
|
|
w=1.
|
|
do 9 m=1,mmax
|
|
|
|
C This in the inner-most loop -- optimization here is important!
|
|
do 8 i=m,imax,istep
|
|
t=w*d(i+mmax)
|
|
d(i+mmax)=d(i)-t
|
|
8 d(i)=d(i)+t
|
|
|
|
9 w=w*(1.+wstep)
|
|
mmax=istep
|
|
if(mmax.lt.imax) go to 6
|
|
|
|
if(ireal.eq.0) return
|
|
|
|
C Now complete the last stage of a doubled-up real transform.
|
|
|
|
jmax=imax/2 + 1
|
|
wstep=cmplx(-2.*sin(isign*pi/npts)**2,sin(isign*pi/imax))
|
|
w=1.0
|
|
d(imax+1)=d(1)
|
|
|
|
do 10 j=1,jmax
|
|
uu=cmplx(real(d(j))+real(d(2+imax-j)),aimag(d(j)) -
|
|
+ aimag(d(2+imax-j)))
|
|
tt=w*cmplx(aimag(d(j))+aimag(d(2+imax-j)),-real(d(j)) +
|
|
+ real(d(2+imax-j)))
|
|
d(j)=uu+tt
|
|
d(2+imax-j)=conjg(uu-tt)
|
|
10 w=w*(1.+wstep)
|
|
|
|
return
|
|
end
|