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 eb1004ec76
commit 13c9938607
3 changed files with 112 additions and 11 deletions

View File

@ -286,6 +286,7 @@ set (wsjt_FSRCS
lib/encode4.f90
lib/entail.f90
lib/ephem.f90
lib/exp_decode65.f90
lib/extract.f90
lib/extract4.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 interleave63(mr2sym,-1) !from second-most-reliable symbols
call interleave63(mr2prob,-1)
write(71) mrsym,mrprob,mr2sym,mr2prob
nverbose=0
ntry=0
nverbose=0
call timer('sfrsd ',0)
call sfrsd2(mrsym,mrprob,mr2sym,mr2prob,ntrials,nverbose,correct, &
param,indx,tt,ntry)
@ -72,20 +71,27 @@ subroutine extract(s3,nadd,nqd,ntrials,naggressive,ndepth,ncount,nhist, &
ncandidates=param(0)
nhard=param(1)
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
decoded=' '
ltext=.false.
if(nhard.ge.0) then
!turn the corrected symbol array into channel symbols for subtraction
!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)
enddo
correct(1:63)=tmp(1:63)
@ -100,4 +106,3 @@ subroutine extract(s3,nadd,nqd,ntrials,naggressive,ndepth,ncount,nhist, &
return
end subroutine extract