WSJT-X/wsjt65.f

233 lines
7.1 KiB
Fortran

subroutine wsjt65(dat,npts,cfile6,NClearAve,MinSigdB,
+ DFTolerance,NFreeze,NAFC,mode65,Nseg,MouseDF,NAgain,
+ naggressive,ndepth,neme,nsked,mycall,hiscall,hisgrid,
+ lumsg,lcum,nspecial,ndf,nstest,dfsh,iderrsh,idriftsh,
+ snrsh,NSyncOK,ccfblue,ccfred,ndiag,nwsh)
C Orchestrates the process of decoding JT65 messages, using data that
C have been 2x downsampled. The search for shorthand messages has
C already been done.
real dat(npts) !Raw data
integer DFTolerance
logical first
logical lcum
character decoded*22,cfile6*6,special*5,cooo*3
character*22 avemsg1,avemsg2,deepmsg,deepbest
character*67 line,ave1,ave2
character*1 csync
character*12 mycall
character*12 hiscall
character*6 hisgrid
real ccfblue(-5:28),ccfred(-224:224)
real ftrack(126)
logical lmid
integer itf(2,9)
include 'avecom.h'
common/avecom2/f0a
common/tmp3/nsync2,nsnr2,nstest2,line,ave1,ave2
data first/.true./,ns10/0/,ns20/0/
data itf/0,0, 1,0, -1,0, 0,-1, 0,1, 1,-1, 1,1, -1,-1, -1,1/
save
if(first) then
call setup65 !Initialize pseudo-random arrays
nsave=0
first=.false.
ave1=' '
ave2=' '
endif
nq1=3
nq2=6
if(naggressive.eq.1) nq1=1
if(NClearAve.ne.0) then
nsave=0 !Clear the averaging accumulators
ns10=0
ns20=0
ave1=' '
ave2=' '
endif
if(MinSigdB.eq.99 .or. MinSigdB.eq.-99) then
ns10=0 !For Include/Exclude ?
ns20=0
endif
C Attempt to synchronize: look for sync tone, get DF and DT.
call sync65(dat,npts,DFTolerance,NFreeze,NAFC,MouseDF,
+ dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width,ftrack)
f0=1270.46 + dfx
csync=' '
decoded=' '
special=' '
cooo=' '
itry=0
ncount=-1 !Flag for RS decode of current record
ncount1=-1 !Flag for RS Decode of ave1
ncount2=-1 !Flag for RS Decode of ave2
NSyncOK=0
qbest=0.
if(nsave.lt.MAXAVE .and. (NAgain.eq.0 .or. NClearAve.eq.1))
+ nsave=nsave+1
if(nsave.le.0) go to 900 !Prevent bounds error
nflag(nsave)=0 !Clear the "good sync" flag
iseg(nsave)=Nseg !Set the RX segment to 1 or 2
nsync=nint(snrsync-3.0)
nsnr=nint(snrx)
if(nsnr.lt.-30 .or. nsync.lt.0) nsync=0
nsnrlim=-32
C Good Sync takes precedence over a shorthand message:
if(nsync.ge.MinSigdB .and. nsnr.ge.nsnrlim .and.
+ nsync.gt.nstest) nstest=0
if(nstest.gt.0) then
dfx=dfsh
nsync=nstest
nsnr=snrsh
dtx=1.
ccfblue(-5)=-999.0
if(nspecial.eq.1) special='ATT '
if(nspecial.eq.2) special='RO '
if(nspecial.eq.3) special='RRR '
if(nspecial.eq.4) special='73 '
NSyncOK=1 !Mark this RX file as good (for "Save Decoded")
if(NFreeze.eq.0 .or. DFTolerance.ge.200) special(5:5)='?'
width=nwsh
go to 200
endif
if(nsync.lt.MinSigdB .or. nsnr.lt.nsnrlim) go to 200
C If we get here, we have achieved sync!
NSyncOK=1
nflag(nsave)=1 !Mark this RX file as good
csync='*'
if(flip.lt.0.0) then
csync='#'
cooo='O ?'
endif
C Do a "peakup search" over DT, looking for successful
C result from the Reed-Solomon decoder.
itrymax=1
if(ndepth.eq.2) itrymax=1
if(ndepth.eq.3) itrymax=5
do itry=1,itrymax
idt=itf(1,itry)
idf=itf(2,itry)
dtxx=dtx + idt*0.036 !### Was 0.012 ###
dfxx=dfx + mode65*idf*1.346
lmid=.false.
if(itry.eq.1) lmid=.true.
call decode65(dat,npts,dtxx,dfxx,flip,ndepth,neme,nsked,
+ mycall,hiscall,hisgrid,mode65,lmid,ftrack,decoded,
+ ncount,deepmsg,qual)
if(qual.gt.qbest) then
qbest=qual
dtbest=dtxx
dfbest=dfxx
deepbest=deepmsg
itrybest=itry
endif
if(ncount.ge.0) then
dtx=dtxx !Successful decode
dfx=dfxx
go to 200
endif
enddo
itry=itrybest
ncount=-1
200 continue
kvqual=0
if(ncount.ge.0) kvqual=1
nqual=qbest
if(nqual.ge.nq1 .and.kvqual.eq.0) then
dtx=dtbest
dfx=dfbest
decoded=deepbest
endif
ndf=nint(dfx)
if(flip.lt.0.0 .and. (kvqual.eq.1 .or. nqual.ge.nq2)) cooo='OOO'
if(kvqual.eq.0.and.nqual.ge.nq1.and.nqual.lt.nq2) cooo(2:3)=' ?'
if(decoded.eq.' ') cooo=' '
write(line,1010) cfile6,nsync,nsnr,dtx-1.0,ndf,
+ nint(width),csync,special,decoded(1:18),cooo,kvqual,nqual,itry
1010 format(a6,i3,i5,f5.1,i5,i3,1x,a1,1x,a5,a18,1x,a3,i5,i3,i2)
C Blank DT if shorthand message (### wrong logic? ###)
if(special.ne.' ') then
line(15:19)=' '
ccfblue(-5)=-9999.0
if(ndiag.gt.0) write(line(51:57),1012) iderrsh,idriftsh
1012 format(i3,i4)
else
nspecial=0
endif
C Blank the end-of-line numbers
if(naggressive.eq.0) line(58:67)=' '
if(ndiag.eq.0) line(66:67)=' '
if(lcum) write(21,1011) line
1011 format(a67)
C Write decoded msg unless this is an "Exclude" request:
if(MinSigdB.lt.99) write(lumsg,1011) line
if(nsave.ge.1) call avemsg65(1,mode65,ndepth,avemsg1,nused1,
+ ns1,ncount1)
if(nsave.ge.1) call avemsg65(2,mode65,ndepth,avemsg2,nused2,
+ ns2,ncount2)
C Write the average line
if(ns1.ge.1 .and. ns1.ne.ns10) then
if(ns1.lt.10) write(ave1,1021) cfile6,1,nused1,ns1,avemsg1
1021 format(a6,i3,i4,'/',i1,20x,a18)
if(ns1.ge.10 .and. nsave.le.99) write(ave1,1022) cfile6,
+ 1,nused1,ns1,avemsg1
1022 format(a6,i3,i4,'/',i2,19x,a18)
if(ns1.ge.100) write(ave1,1023) cfile6,1,nused1,ns1,
+ avemsg1
1023 format(a6,i3,i4,'/',i3,18x,a18)
if(lcum .and. (avemsg1.ne.' '))
+ write(21,1011) ave1(1:57)//' '
ns10=ns1
endif
C If Monitor segment #2 is available, write that line also
if(ns2.ge.1 .and. ns2.ne.ns20) then
if(ns2.lt.10) write(ave2,1021) cfile6,2,nused2,ns2,avemsg2
if(ns2.ge.10 .and. nsave.le.99) write(ave2,1022) cfile6,
+ 2,nused2,ns2,avemsg2
if(ns2.ge.100) write(ave2,1023) cfile6,2,nused2,ns2,avemsg2
if(lcum .and. (avemsg2.ne.' '))
+ write(21,1011) ave2(1:57)//' '
ns20=ns2
endif
if(ndiag.eq.0) then
ave1(58:67)=' '
ave2(58:67)=' '
endif
write(12,1011) ave1
write(12,1011) ave2
800 if(lumsg.ne.6) end file 11
f0a=f0
900 continue
C### test only
nsync2=nsync
nsnr2=nsnr
nstest2=nstest
return
end