WSJT-X/synct.f

70 lines
1.7 KiB
Fortran

subroutine synct(data,jz,jstart,f0,smax)
C Gets a refined value of jstart.
parameter (NMAX=30*11025)
parameter (NB3=3*512)
real data(jz)
real*8 dpha,twopi
complex*16 z,dz
complex c,c1,zz
common/hcom/c(NMAX)
ps(zz)=real(zz)**2 + imag(zz)**2 !Power spectrum function
C Convert data to baseband (complex result) using quadrature LO.
twopi=8*atan(1.d0)
dpha=twopi*f0/11025.d0
dz=cmplx(cos(dpha),-sin(dpha))
z=1.d0/dz
do i=1,jz
z=z*dz
c(i)=data(i)*z
enddo
C Detect zero-beat sync tone in 512-sample chunks, stepped by 1.
C Sums replace original values in c(i).
zz=0
do i=1,512 !Compute first sum
zz=zz+c(i)
enddo
c1=c(1)
c(1)=zz
do i=2,jz-512 !Compute the rest recursively
zz=c(i-1)+c(i+511)-c1
c1=c(i) !Save original value
c(i)=zz !Save the sum
enddo
C Iterate to find the best jstart.
jstart=jstart+NB3
nz=(jz-jstart)/NB3 -1
smax=0.
jstep=256
jbest=jstart
10 jstep=jstep/2
jstart=jbest
do j=jstart-jstep,jstart+jstep,jstep
s=0.
r=0.
do n=1,nz
k=(n-1)*NB3 + j
s=s + ps(c(k))
r=r + ps(c(k+512)) + ps(c(k+1024))
enddo
s=2*s/r !Better to use s/r or s-r?
if(s.gt.smax) then
smax=s
jbest=j
endif
enddo
if(jstep.gt.1) go to 10
jstart=jbest
if(jstart.gt.NB3) jstart=jstart-NB3
return
end