WSJT-X/lib/decode65a.f90

155 lines
4.2 KiB
Fortran

subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, &
naggressive,ndepth,ntol,mycall,hiscall,hisgrid,nQSOProgress, &
ljt65apon,bVHF,sync2,a,dt,nft,nspecial,qual,nhist,nsmo,decoded)
! Apply AFC corrections to a candidate JT65 signal, then decode it.
use jt65_mod
use timer_module, only: timer
parameter (NMAX=60*12000) !Samples per 60 s
real*4 dd(NMAX) !92 MB: raw data from Linrad timf2
complex cx(NMAX/8) !Data at 1378.125 sps
complex cx1(NMAX/8) !Data at 1378.125 sps, offset by 355.3 Hz
complex c5x(NMAX/32) !Data at 344.53125 Hz
complex c5a(512)
real s2(66,126)
real a(5)
logical bVHF,first,ljt65apon
character decoded*22,decoded_best*22
character mycall*12,hiscall*12,hisgrid*6
character*27 cr
data first/.true./,jjjmin/1000/,jjjmax/-1000/,cr/'(C) 2016, Joe Taylor - K1JT'/
save
! Mix sync tone to baseband, low-pass filter, downsample to 1378.125 Hz
call timer('filbig ',0)
call filbig(dd,npts,f0,newdat,cx,n5,sq0)
if(mode65.eq.4) call filbig(dd,npts,f0+355.297852,newdat,cx1,n5,sq0)
call timer('filbig ',1)
! NB: cx has sample rate 12000*77125/672000 = 1378.125 Hz
! Check for a shorthand message
if(bVHF .and. mode65.ne.101) then
call sh65(cx,n5,mode65,ntol,xdf,nspecial,sync2)
if(nspecial.gt.0) then
a=0.
a(1)=xdf
nflip=0
endif
endif
if(nflip.eq.0) go to 900
! Find best DF, drift, curvature, and DT. Start by downsampling to 344.53125 Hz
call fil6521(cx,n5,c5x,n6)
fsample=1378.125/4.
call timer('afc65b ',0)
! Best fit for DF, drift, and dt. fsample = 344.53125 S/s
dtbest=dt
call afc65b(c5x,n6,fsample,nflip,mode65,a,ccfbest,dtbest)
call timer('afc65b ',1)
dtbest=dtbest+0.003628 !Remove decimation filter and coh. integrator delay
dt=dtbest !Return new, improved estimate of dt
sync2=3.7e-4*ccfbest/sq0 !Constant is empirical
if(mode65.eq.4) cx=cx1
! Apply AFC corrections to the time-domain signal
! Now we are back to using the 1378.125 Hz sample rate, enough to
! accommodate the full JT65C bandwidth.
a(3)=0
call twkfreq65(cx,n5,a)
! Compute spectrum for each symbol.
nsym=126
nfft=512
df=1378.125/nfft
j=int(dtbest*1378.125)
c5a=cmplx(0.0,0.0)
do k=1,nsym
do i=1,nfft
j=j+1
if(j.ge.1 .and. j.le.NMAX/8) then
c5a(i)=cx(j)
else
c5a(i)=0.
endif
enddo
call four2a(c5a,nfft,1,1,1)
do i=1,512
jj=i
if(i.gt.256) jj=i-512
s1(jj,k)=real(c5a(i))**2 + aimag(c5a(i))**2
enddo
enddo
call timer('dec65b ',0)
qualbest=0.
nftbest=0
qual0=-1.e30
minsmo=0
maxsmo=0
if(mode65.ge.2 .and. mode65.ne.101) then
minsmo=nint(width/df)-1
maxsmo=2*nint(width/df)
endif
nn=0
do ismo=minsmo,maxsmo
if(ismo.gt.0) then
do j=1,126
call smo121(s1(-255,j),512)
if(j.eq.1) nn=nn+1
if(nn.ge.4) then
call smo121(s1(-255,j),512)
if(j.eq.1) nn=nn+1
endif
enddo
endif
do i=1,66
jj=i
if(mode65.eq.2) jj=2*i-1
if(mode65.eq.4) then
ff=4*(i-1)*df - 355.297852
jj=nint(ff/df)+1
endif
s2(i,1:126)=s1(jj,1:126)
enddo
nadd=ismo !### ??? ###
call decode65b(s2,nflip,nadd,mode65,ntrials,naggressive,ndepth, &
mycall,hiscall,hisgrid,nQSOProgress,ljt65apon,nqd,nft,qual, &
nhist,decoded)
if(nft.eq.1) then
nsmo=ismo
param(9)=nsmo
nsum=1
exit
else if(nft.eq.2) then
if(qual.gt.qualbest) then
decoded_best=decoded
qualbest=qual
nnbest=nn
nsmobest=ismo
nftbest=nft
endif
endif
if(qual.lt.qual0) exit
qual0=qual
enddo
if(nftbest.eq.2) then
decoded=decoded_best
qual=qualbest
nsmo=nsmobest
param(9)=nsmo
nn=nnbest
nft=nftbest
endif
call timer('dec65b ',1)
900 return
end subroutine decode65a