mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-18 10:01:57 -05:00
193 lines
4.9 KiB
Fortran
193 lines
4.9 KiB
Fortran
|
subroutine synciscat(cdat,npts,nh,npct,s0,jsym,df,ntol,NFreeze, &
|
||
|
MouseDF,mousebutton,mode4,nafc,psavg,xsync,sig,ndf0,msglen, &
|
||
|
ipk,jpk,idf,df1)
|
||
|
|
||
|
! Synchronize an ISCAT signal
|
||
|
! cdat() is the downsampled analytic signal.
|
||
|
! Sample rate = fsample = BW = 11025 * (9/32) = 3100.78125 Hz
|
||
|
! npts, nsps, etc., are all reduced by 9/32
|
||
|
|
||
|
parameter (NMAX=30*3101)
|
||
|
parameter (NSZ=4*1400)
|
||
|
complex cdat(NMAX)
|
||
|
complex c(288)
|
||
|
real s0(288,NSZ)
|
||
|
real fs0(288,96) !108 = 96 + 3*4
|
||
|
real savg(288)
|
||
|
real sref(288)
|
||
|
real psavg(72) !Average spectrum of whole file
|
||
|
integer icos(4)
|
||
|
data icos/0,1,3,2/
|
||
|
data nsync/4/,nlen/2/,ndat/18/
|
||
|
|
||
|
! Silence compiler warnings:
|
||
|
sigbest=-20.0
|
||
|
ndf0best=0
|
||
|
msglenbest=0
|
||
|
ipkbest=0
|
||
|
jpkbest=0
|
||
|
ipk2=0
|
||
|
idfbest=mousebutton
|
||
|
|
||
|
fsample=3100.78125 !New sample rate
|
||
|
nsps=144/mode4
|
||
|
nsym=npts/nsps - 1
|
||
|
nblk=nsync+nlen+ndat
|
||
|
nfft=2*nsps !FFTs at twice the symbol length,
|
||
|
|
||
|
kstep=nsps/4 ! stepped by 1/4 symbol
|
||
|
df=fsample/nfft
|
||
|
fac=1.0/1000.0 !Somewhat arbitrary
|
||
|
savg=0.
|
||
|
|
||
|
ia=1-kstep
|
||
|
do j=1,4*nsym !Compute symbol spectra
|
||
|
ia=ia+kstep
|
||
|
ib=ia+nsps-1
|
||
|
if(ib.gt.npts) exit
|
||
|
c(1:nsps)=fac*cdat(ia:ib)
|
||
|
c(nsps+1:nfft)=0.
|
||
|
call four2a(c,nfft,1,-1,1)
|
||
|
do i=1,nfft
|
||
|
s0(i,j)=real(c(i))**2 + aimag(c(i))**2
|
||
|
savg(i)=savg(i) + s0(i,j) !Accumulate avg spectrum
|
||
|
enddo
|
||
|
i0=40
|
||
|
enddo
|
||
|
|
||
|
jsym=4*nsym
|
||
|
savg=savg/jsym
|
||
|
|
||
|
do i=1,71 !Compute spectrum in dB, for plot
|
||
|
if(mode4.eq.1) then
|
||
|
psavg(i)=2*db(savg(4*i)+savg(4*i-1)+savg(4*i-2)+savg(4*i-3)) + 1.0
|
||
|
else
|
||
|
psavg(i)=2*db(savg(2*i)+savg(2*i-1)) + 7.0
|
||
|
endif
|
||
|
enddo
|
||
|
|
||
|
do i=nh+1,nfft-nh
|
||
|
call pctile(savg(i-nh),2*nh+1,npct,sref(i))
|
||
|
enddo
|
||
|
sref(1:nh)=sref(nh+11)
|
||
|
sref(nfft-nh+1:nfft)=sref(nfft-nh)
|
||
|
|
||
|
do i=1,nfft !Normalize the symbol spectra
|
||
|
fac=1.0/sref(i)
|
||
|
if(i.lt.11) fac=1.0/savg(11)
|
||
|
do j=1,jsym
|
||
|
s0(i,j)=fac*s0(i,j)
|
||
|
enddo
|
||
|
enddo
|
||
|
|
||
|
nfold=jsym/96
|
||
|
jb=96*nfold
|
||
|
|
||
|
ttot=npts/fsample !Length of record (s)
|
||
|
df1=df/ttot !Step size for f1=fdot
|
||
|
idf1=-25.0/df1
|
||
|
idf2=5.0/df1
|
||
|
if(nafc.eq.0) then
|
||
|
idf1=0
|
||
|
idf2=0
|
||
|
else if(mod(-idf1,2).eq.1) then
|
||
|
idf1=idf1-1
|
||
|
endif
|
||
|
|
||
|
xsyncbest=0.
|
||
|
do idf=idf1,idf2 !Loop over fdot
|
||
|
fs0=0.
|
||
|
do j=1,jb !Fold s0 into fs0, modulo 4*nblk
|
||
|
k=mod(j-1,4*nblk)+1
|
||
|
ii=nint(idf*float(j-jb/2)/float(jb))
|
||
|
ia=max(1-ii,1)
|
||
|
ib=min(nfft-ii,nfft)
|
||
|
do i=ia,ib
|
||
|
fs0(i,k)=fs0(i,k) + s0(i+ii,j)
|
||
|
enddo
|
||
|
enddo
|
||
|
ref=nfold*4
|
||
|
|
||
|
i0=27
|
||
|
ia=i0-400/df !Set search range in frequency...
|
||
|
ib=i0+400/df
|
||
|
if(mode4.eq.1) then
|
||
|
i0=95
|
||
|
ia=i0-600/df !Set search range in frequency...
|
||
|
ib=i0+600/df
|
||
|
endif
|
||
|
if(nfreeze.eq.1) then
|
||
|
ia=i0+(mousedf-ntol)/df
|
||
|
ib=i0+(mousedf+ntol)/df
|
||
|
endif
|
||
|
if(ia.lt.1) ia=1
|
||
|
if(ib.gt.nfft-3) ib=nfft-3
|
||
|
|
||
|
smax=0.
|
||
|
ipk=1
|
||
|
jpk=1
|
||
|
do j=0,4*nblk-1 !Find sync pattern: lags 0-95
|
||
|
do i=ia,ib !Search specified freq range
|
||
|
ss=0.
|
||
|
do n=1,4 !Sum over 4 sync tones
|
||
|
k=j+4*n-3
|
||
|
if(k.gt.96) k=k-96
|
||
|
ss=ss + fs0(i+2*icos(n),k)
|
||
|
enddo
|
||
|
if(ss.gt.smax) then
|
||
|
smax=ss
|
||
|
ipk=i !Frequency offset, DF
|
||
|
jpk=j+1 !Time offset, DT
|
||
|
endif
|
||
|
enddo
|
||
|
enddo
|
||
|
|
||
|
xsync=smax/ref - 1.0
|
||
|
if(nfold.lt.26) xsync=xsync * sqrt(nfold/26.0)
|
||
|
xsync=xsync-0.5 !Empirical
|
||
|
|
||
|
sig=db(smax/ref - 1.0) - 15.0
|
||
|
if(mode4.eq.1) sig=sig-5.0
|
||
|
! if(sig.lt.-20 .or. xsync.lt.1.0) sig=-20.0
|
||
|
! if(sig.lt.-20) sig=-20.0
|
||
|
ndf0=nint(df*(ipk-i0))
|
||
|
|
||
|
smax=0.
|
||
|
ja=jpk+16
|
||
|
if(ja.gt.4*nblk) ja=ja-4*nblk
|
||
|
jj=jpk+20
|
||
|
if(jj.gt.4*nblk) jj=jj-4*nblk
|
||
|
do i=ipk,ipk+60,2 !Find User's message length
|
||
|
ss=fs0(i,ja) + fs0(i+10,jj)
|
||
|
if(ss.gt.smax) then
|
||
|
smax=ss
|
||
|
ipk2=i
|
||
|
endif
|
||
|
enddo
|
||
|
|
||
|
msglen=(ipk2-ipk)/2
|
||
|
if(msglen.lt.2 .or. msglen.gt.29) msglen=3
|
||
|
|
||
|
if(xsync.ge.xsyncbest) then
|
||
|
xsyncbest=xsync
|
||
|
sigbest=sig
|
||
|
ndf0best=ndf0
|
||
|
msglenbest=msglen
|
||
|
ipkbest=ipk
|
||
|
jpkbest=jpk
|
||
|
idfbest=idf
|
||
|
endif
|
||
|
enddo
|
||
|
|
||
|
xsync=xsyncbest
|
||
|
sig=sigbest
|
||
|
ndf0=ndf0best
|
||
|
msglen=msglenbest
|
||
|
ipk=ipkbest
|
||
|
jpk=jpkbest
|
||
|
idf=idfbest
|
||
|
if(nafc.eq.0) idf=0
|
||
|
|
||
|
return
|
||
|
end subroutine synciscat
|