C PROGRAMA spectra1.for *************************************
C Tabare Gallardo, abril/98, gallardo@fisica.edu.uy
C Facultad de Ciencias - Obs. Astr. Los Molinos
C Calcula espectro de frecuencias en un cierto intervalo
C FUNCION MODELO Y = C1 + C2*COS(2PIwt) + C3*SIN(2PIwt)
C Pesos en forma Hanning para eliminar lobulos secundarios
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION T(10000),X(10000),P(10000),xp(10000)
COMMON T,XP,P,N,TWOPI,F1X
TWOPI=DATAN(1.D0)*8.D0
write(*,*) 'ESPECTRO DE LA SERIE TEMPORAL datos.dat ',
*'(equiespaciada o no)'
write(*,*) 'AJUSTANDO AL MODELO Y = C1 + C2*COS(2PI*f*t) + ',
*'C3*SIN(2PI*f*t)'
write(*,*) 'Refs: Astronomical Journal (1981) vol.86(4), pp 619.'
write(*,*) ' Astronomical Journal (1996) vol.111(1), pp 541.'
write(*,*) ' Astronomical Journal (1997) vol.113(2), pp 863.'
write(*,*)
write(*,*)'El espectro estara en spectra1.dat y el orden sera:'
write(*,*) 'frecuencia, Coef.Corr.Espec., C1, C2, C3'
write(*,*)
write(*,*) 'Nota: unidad de frecuencia = ciclos por ',
*'unidad de tiempo'
write(*,*)
OPEN(1,FILE='datos.dat',STATUS='OLD')
do 50 i=1,10000
read(1,*,end=52) t(i),x(i)
50 continue
52 close(1)
n=i-1
write(*,*) 'son ',n,' datos en la serie temporal'
zn=t(n)-t(1)
ancho=2.d0/zn
write(*,*) 'ancho de cada linea espectral =',ancho
write(*,*)
write(*,*) 'Definicion de los limites del espectro:'
write(*,*) 'frecuencia inicial?'
read(*,*) frecini
write(*,*) 'frecuencia final?'
read(*,*) frecfin
write(*,*) 'Numero de puntos que tendra el espectro?'
read(*,*) nwf
dnwf1=dfloat(nwf-1)
FFFF=(frecfin-frecini)/dnwf1
tau=t(1)+zn/2.d0
C DEFINO PESOS CENTRADO EN TAU
sumapeso=0.d0
DO 10 I=1,N
ttau=t(i)-tau
c hanning window
p(i)=1.d0+dcos(twopi*ttau/zn)
sumapeso=sumapeso+p(i)
10 CONTINUE
c normalizo pesos y defino XP, F1X y varianza
F1X=0.d0
xcuad=0.d0
do 13 i=1,n
p(i)=p(i)/sumapeso
xp(i)=x(i)*p(i)
f1x=f1x+xp(i)
xcuad=xcuad+x(i)*xp(i)
13 continue
varianza=xcuad-f1x*f1x
write(*,*) 'estoy calculando el espectro....'
ancho100=ancho/1.d2
open(2,file='spectra1.dat',status='unknown')
do 41 nw=1,nwf
W=frecini+FFFF*dfloat(nw-1)
c evito calculo de frec proxima a cero
if(dabs(w).lt.ancho100) then
goto 41
end if
call fosyl(W,C1,C2,C3,YY)
C AMPLITUD TEORICA de la sinusoide = DSQRT(C2*C2+C3*C3)
C CENTRO O NIVEL CERO = C1
C coeficiente de correlacion espectral (Sylvio-Foster) = CCE
CCE=(YY-F1X*F1X)/varianza
write(2,11) W,CCE,C1,C2,C3
41 continue
11 FORMAT(e14.7,e16.9,3e14.7)
close(2)
END
C SUBRUTINA FOSYL (FOSTER-SYLVIO)********************************
C FUNCION MODELO Y = C1 + C2*COS(2PIwt) + C3*SIN(2PIwt)
SUBROUTINE FOSYL(W,C1,C2,C3,YY)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION XP(10000),T(10000),P(10000)
DIMENSION CA(10000),SA(10000)
COMMON T,XP,P,N,TWOPI,F1X
F11=1.D0
F12=0.D0
F13=0.D0
F22=0.D0
F23=0.D0
F33=0.D0
F2X=0.D0
F3X=0.D0
DO 20 I=1,N
ALFA=TWOPI*T(I)*W
AL=DMOD(ALFA,TWOPI)
CA(I)=DCOS(AL)
SA(I)=DSIN(AL)
CAP=CA(I)*P(I)
SAP=SA(I)*P(I)
F12=F12+CAP
F13=F13+SAP
F22=F22+CA(I)*CAP
F23=F23+CA(I)*SAP
F33=F33+SA(I)*SAP
C F1X=F1X+XP(I)
C F1X es igual al valor medio ponderado de X y de Y
F2X=F2X+XP(I)*CA(I)
F3X=F3X+XP(I)*SA(I)
20 CONTINUE
DET=F11*(F22*F33-F23*F23)
DET=DET-F12*(F12*F33-F23*F13)
DET=DET+F13*(F12*F23-F22*F13)
C1=-F12*(F2X*F33-F23*F3X)+F13*(F2X*F23-F22*F3X)
C1=(C1+F1X*(F22*F33-F23*F23))/DET
C2=F11*(F2X*F33-F23*F3X)+F13*(F12*F3X-F2X*F13)
C2=(C2-F1X*(F12*F33-F23*F13))/DET
C3=F11*(F22*F3X-F2X*F23)-F12*(F12*F3X-F2X*F13)
C3=(C3+F1X*(F12*F23-F22*F13))/DET
C CALCULO YY
YY=0.D0
DO 21 I=1,N
Y=C1+C2*CA(I)+C3*SA(I)
YY=YY+Y*Y*P(I)
21 CONTINUE
RETURN
END
C *********************************************************