Implement (still in very basic form) experience-based decoding for JT65.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6174 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2015-11-24 19:49:04 +00:00
parent 17056d926d
commit cd6cff0865
3 changed files with 112 additions and 11 deletions

View File

@ -286,6 +286,7 @@ set (wsjt_FSRCS
lib/encode4.f90 lib/encode4.f90
lib/entail.f90 lib/entail.f90
lib/ephem.f90 lib/ephem.f90
lib/exp_decode65.f90
lib/extract.f90 lib/extract.f90
lib/extract4.f90 lib/extract4.f90
lib/fano232.f90 lib/fano232.f90

95
lib/exp_decode65.f90 Normal file
View File

@ -0,0 +1,95 @@
subroutine exp_decode65(mrsym,mrprob,mr2sym,nhard,nsoft,nbest,correct)
use packjt
use prog_args
parameter (NMAX=10000)
integer*1 sym1(0:62,NMAX)
integer mrsym(0:62),mr2sym(0:62),mrprob(0:62)
integer dgen(12),sym(0:62),sym_rev(0:62)
integer test(0:62)
integer correct(0:62)
character*6 mycall,hiscall(NMAX)
character*4 hisgrid(NMAX)
character callsign*12,grid*4
character*180 line
character ceme*3,msg*22
logical*1 eme(NMAX)
logical first
data first/.true./
save first,sym1,nused
!###
mycall='VK7MO' !### TEMPORARY ###
if(first) then
neme=1
open(23,file=trim(data_dir)//'/CALL3.TXT',status='unknown')
icall=0
j=0
do i=1,NMAX
read(23,1002,end=10) line
1002 format(a80)
if(line(1:4).eq.'ZZZZ') cycle
if(line(1:2).eq.'//') cycle
i1=index(line,',')
if(i1.lt.4) cycle
i2=index(line(i1+1:),',')
if(i2.lt.5) cycle
i2=i2+i1
i3=index(line(i2+1:),',')
if(i3.lt.1) i3=index(line(i2+1:),' ')
i3=i2+i3
callsign=line(1:i1-1)
grid=line(i1+1:i2-1)
ceme=line(i2+1:i3-1)
eme(i)=ceme.eq.'EME'
if(neme.eq.1 .and. (.not.eme(i))) cycle
j=j+1
hiscall(j)=callsign(1:6) !### Fix for compound callsigns!
hisgrid(j)=grid
enddo
10 ncalls=j
close(23)
j=0
do i=1,ncalls
if(neme.eq.1 .and. (.not.eme(i))) cycle
j=j+1
msg=mycall//' '//hiscall(i)//' '//hisgrid(i)
call fmtmsg(msg,iz)
call packmsg(msg,dgen,itype) !Pack message into 72 bits
call rs_encode(dgen,sym_rev) !RS encode
sym(0:62)=sym_rev(62:0:-1)
sym1(0:62,j)=sym
enddo
nused=j
first=.false.
endif
!###
nbest=999999
do j=1,nused
test=sym1(0:62,j)
nh=0
ns=0
do i=0,62
k=62-i
if(mrsym(k).ne.test(i)) then
nh=nh+1
if(mr2sym(k).ne.test(i)) ns=ns+mrprob(k)
endif
enddo
ns=63*ns/sum(mrprob)
if(nh+ns.lt.nbest) then
nhard=nh
nsoft=ns
nbest=nhard+nsoft
ncandidates=0
ntry=0
correct=test
endif
enddo
return
end subroutine exp_decode65

View File

@ -61,10 +61,9 @@ subroutine extract(s3,nadd,nqd,ntrials,naggressive,ndepth,ncount,nhist, &
call graycode65(mr2sym,63,-1) !Remove gray code and interleaving call graycode65(mr2sym,63,-1) !Remove gray code and interleaving
call interleave63(mr2sym,-1) !from second-most-reliable symbols call interleave63(mr2sym,-1) !from second-most-reliable symbols
call interleave63(mr2prob,-1) call interleave63(mr2prob,-1)
write(71) mrsym,mrprob,mr2sym,mr2prob
nverbose=0
ntry=0 ntry=0
nverbose=0
call timer('sfrsd ',0) call timer('sfrsd ',0)
call sfrsd2(mrsym,mrprob,mr2sym,mr2prob,ntrials,nverbose,correct, & call sfrsd2(mrsym,mrprob,mr2sym,mr2prob,ntrials,nverbose,correct, &
param,indx,tt,ntry) param,indx,tt,ntry)
@ -72,20 +71,27 @@ subroutine extract(s3,nadd,nqd,ntrials,naggressive,ndepth,ncount,nhist, &
ncandidates=param(0) ncandidates=param(0)
nhard=param(1) nhard=param(1)
nsoft=param(2) nsoft=param(2)
nera=param(3)
ngmd=param(4)
ndone=ndone+1
do i=1,12
dat4(i)=correct(13-i)
enddo
if(nhard.lt.0 .and. ndepth.ge.5) then
call timer('exp_deco',0)
call exp_decode65(mrsym,mrprob,mr2sym,nhard,nsoft,nbest,correct)
if(nbest.gt.72+2*naggressive) then
nhard=-1
endif
call timer('exp_deco',1)
endif
ndone=ndone+1
ncount=-1 ncount=-1
decoded=' ' decoded=' '
ltext=.false. ltext=.false.
if(nhard.ge.0) then if(nhard.ge.0) then
!turn the corrected symbol array into channel symbols for subtraction !turn the corrected symbol array into channel symbols for subtraction
!pass it back to jt65a via common block "chansyms65" !pass it back to jt65a via common block "chansyms65"
do i=1,63 do i=1,12
dat4(i)=correct(13-i)
enddo
do i=1,63
tmp(i)=correct(64-i) tmp(i)=correct(64-i)
enddo enddo
correct(1:63)=tmp(1:63) correct(1:63)=tmp(1:63)
@ -100,4 +106,3 @@ subroutine extract(s3,nadd,nqd,ntrials,naggressive,ndepth,ncount,nhist, &
return return
end subroutine extract end subroutine extract