WSJT-X/sync.f

85 lines
2.2 KiB
Fortran

subroutine sync(y1,y2,y3,y4,npts,jpk,baud,bauderr)
C Input data are in the y# arrays: detected sigs in four tone-channels,
C before decimation by NSPD.
parameter (NSPDMAX=200)
real y1(npts)
real y2(npts)
real y3(npts)
real y4(npts)
real zf(NSPDMAX)
complex csum
integer nsum(NSPDMAX)
real z(65538) !Ready for FSK110
complex cz(0:32768)
equivalence (z,cz)
data twopi/6.283185307/
NSPD=25
do i=1,NSPD
zf(i)=0.0
nsum(i)=0
enddo
do i=1,npts
a1=max(y1(i),y2(i),y3(i),y4(i)) !Find the largest one
if(a1.eq.y1(i)) then !Now find 2nd largest
a2=max(y2(i),y3(i),y4(i))
else if(a1.eq.y2(i)) then
a2=max(y1(i),y3(i),y4(i))
else if(a1.eq.y3(i)) then
a2=max(y1(i),y2(i),y4(i))
else
a2=max(y1(i),y2(i),y3(i))
endif
z(i)=1.e-6*(a1-a2) !Subtract 2nd from 1st
j=mod(i-1,NSPD)+1
zf(j)=zf(j)+z(i)
nsum(j)=nsum(j)+1
enddo
n=log(float(npts))/log(2.0)
nfft=2**(n+1)
call zero(z(npts+1),nfft-npts)
call xfft(z,nfft)
C Now find the apparent baud rate.
df=11025.0/nfft
zmax=0.
ia=391.0/df !Was 341/df
ib=491.0/df !Was 541/df
do i=ia,ib
z(i)=real(cz(i))**2 + imag(cz(i))**2
if(z(i).gt.zmax) then
zmax=z(i)
baud=df*i
endif
enddo
C Find phase of signal at 441 Hz.
csum=0.
do j=1,NSPD
pha=j*twopi/NSPD
csum=csum+zf(j)*cmplx(cos(pha),-sin(pha))
enddo
pha=-atan2(imag(csum),real(csum))
jpk=nint(NSPD*pha/twopi)
if(jpk.lt.1) jpk=jpk+NSPD
C The following is nearly equivalent to the above. I don't know which
C (if either) is better.
c zfmax=-1.e30
c do j=1,NSPD
c if(zf(j).gt.zfmax) then
c zfmax=zf(j)
c jpk2=j
c endif
c enddo
bauderr=(baud-11025.0/NSPD)/df !Baud rate error, in bins
return
end