mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-07-31 21:22:27 -04:00
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:
parent
17056d926d
commit
cd6cff0865
@ -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
95
lib/exp_decode65.f90
Normal 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
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user