Main Page   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

powerspectrum.f

Go to the documentation of this file.
00001 
00002 c
00003 c       Copyright (c) 1986,1987,1988,1989,1990,1991,1992,1993,
00004 c       by Steve McMillan, Drexel University, Philadelphia, PA.
00005 c
00006 c       All rights reserved.
00007 c
00008 c       Redistribution and use in source and binary forms are permitted
00009 c       provided that the above copyright notice and this paragraph are
00010 c       duplicated in all such forms and that any documentation,
00011 c       advertising materials, and other materials related to such
00012 c       distribution and use acknowledge that the software was developed
00013 c       by the author named above.
00014 c
00015 c       THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
00016 c       IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
00017 c       WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00018 c
00019 
00020         subroutine powerspectrum(t,x,n,iout)
00021 c
00022 c       Replace x by its power spectrum, t by frequency.
00023 c       Note that it is assumed that t is uniformly spaced.
00024 c
00025 c       Since we will usually want to take the logarithm on return,
00026 c       SUPPRESS the zero-frequency component.
00027 c
00028         real t(n),x(n)
00029 c
00030         if (n.le.1) return
00031 c
00032 c       Discard data to get to a power of 2.
00033 c
00034         i2 = log(float(n))/log(2.)
00035         n = nint(2.**float(i2))
00036         if (iout.ne.0) write(6,*)'Array length truncated to ',n,
00037      &          ' for FFT'
00038 c
00039 c       Determine the frequency (note storage convention):
00040 c
00041         dti = 1./(t(n) - t(1))
00042         do i=1,n/2
00043             t(i) = i*dti
00044         end do
00045 c
00046 c       Take out the mean signal.
00047 c
00048         sum = 0.
00049         do i=1,n
00050             sum = sum + x(i)
00051         end do
00052 c
00053         sum = sum/n
00054         do i = 1,n
00055             x(i) = x(i) - sum
00056         end do
00057 c
00058 c       Fourier transform (note packing of result).
00059 c
00060 c       Initial data are x(i), i = 1,...,n
00061 c       Results are x(1) = F(0), x(2) = F(n/2), x(3) + i x(4) = F(1), etc.
00062 c
00063         call realft(x,n/2,1)
00064 c
00065 c       Replace x by the power spectrum.
00066 c
00067 c       Zero-frequency component is x(1), note, but suppressed here:
00068 c
00069 c        x(1) = x(1)**2
00070 c
00071         x2 = x(2)**2
00072 c
00073         do 50 k=2,n/2
00074             x(k-1) = x(2*k-1)**2 + x(2*k)**2
00075 50      continue
00076 c
00077         x(n/2) = x2
00078         n = n/2
00079 c       
00080 99999   end
00081         
00082         
00083         subroutine realft(data,n,isign)
00084 c
00085 c       Routine from Numerical Recipes.
00086 c
00087         real*8 wr,wi,wpr,wpi,wtemp,theta
00088         dimension data(2*n)
00089 c
00090         theta=6.28318530717959d0/2.0d0/dfloat(n)
00091         c1=0.5
00092         if (isign.eq.1) then
00093             c2=-0.5
00094             call four1(data,n,+1)
00095         else
00096             c2=0.5
00097             theta=-theta
00098         endif
00099         wpr=-2.0d0*dsin(0.5d0*theta)**2
00100         wpi=dsin(theta)
00101         wr=1.0d0+wpr
00102         wi=wpi
00103         n2p3=2*n+3
00104         do 95000 i=2,n/2+1
00105             i1=2*i-1
00106             i2=i1+1
00107             i3=n2p3-i2
00108             i4=i3+1
00109             wrs=sngl(wr)
00110             wis=sngl(wi)
00111             h1r=c1*(data(i1)+data(i3))
00112             h1i=c1*(data(i2)-data(i4))
00113             h2r=-c2*(data(i2)+data(i4))
00114             h2i=c2*(data(i1)-data(i3))
00115             data(i1)=h1r+wrs*h2r-wis*h2i
00116             data(i2)=h1i+wrs*h2i+wis*h2r
00117             data(i3)=h1r-wrs*h2r+wis*h2i
00118             data(i4)=-h1i+wrs*h2i+wis*h2r
00119             wtemp=wr
00120             wr=wr*wpr-wi*wpi+wr
00121             wi=wi*wpr+wtemp*wpi+wi
00122 95000   continue
00123         if (isign.eq.1) then
00124             h1r=data(1)
00125             data(1)=h1r+data(2)
00126             data(2)=h1r-data(2)
00127         else
00128             h1r=data(1)
00129             data(1)=c1*(h1r+data(2))
00130             data(2)=c1*(h1r-data(2))
00131             call four1(data,n,-1)
00132         endif
00133 c
00134         end
00135 
00136         
00137         subroutine four1(data,nn,isign)
00138 c
00139 c       Routine from Numerical Recipes.
00140 c
00141         real*8 wr,wi,wpr,wpi,wtemp,theta
00142         dimension data(2*nn)
00143 c
00144         n=2*nn
00145         j=1
00146         do 95000 i=1,n,2
00147             if(j.gt.i)then
00148                 tempr=data(j)
00149                 tempi=data(j+1)
00150                 data(j)=data(i)
00151                 data(j+1)=data(i+1)
00152                 data(i)=tempr
00153                 data(i+1)=tempi
00154             endif
00155             m=n/2
00156 1           if ((m.ge.2).and.(j.gt.m)) then
00157                 j=j-m
00158                 m=m/2
00159                 go to 1
00160             endif
00161             j=j+m
00162 95000   continue
00163         mmax=2
00164 2       if (n.gt.mmax) then
00165             istep=2*mmax
00166             theta=6.28318530717959d0/(isign*mmax)
00167             wpr=-2.d0*dsin(0.5d0*theta)**2
00168             wpi=dsin(theta)
00169             wr=1.d0
00170             wi=0.d0
00171             do 95001 m=1,mmax,2
00172                 do 95002 i=m,n,istep
00173                     j=i+mmax
00174                     tempr=sngl(wr)*data(j)-sngl(wi)*data(j+1)
00175                     tempi=sngl(wr)*data(j+1)+sngl(wi)*data(j)
00176                     data(j)=data(i)-tempr
00177                     data(j+1)=data(i+1)-tempi
00178                     data(i)=data(i)+tempr
00179                     data(i+1)=data(i+1)+tempi
00180 95002           continue
00181                 wtemp=wr
00182                 wr=wr*wpr-wi*wpi+wr
00183                 wi=wi*wpr+wtemp*wpi+wi
00184 95001       continue
00185             mmax=istep
00186             go to 2
00187         endif
00188 c
00189         end
00190 

Generated at Sun Feb 24 09:57:11 2002 for STARLAB by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001