From 4369b52d5d3a83b209b1911ad5ace4101ba6b1db Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 23 Jan 2013 19:54:54 +0000 Subject: [PATCH] Message averaging and DS now fully integrated in wsjt24d. Code cleanup and optimization still to be done! git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2970 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- lib/decode24.f90 | 64 +++++++++++++++--------------------- lib/extract4.f90 | 61 ++++++++++++++++++++++++++++++++++ lib/getmet24.f90 | 17 ++++------ lib/wsjt24.f90 | 85 +++++++++++++++++++----------------------------- 4 files changed, 128 insertions(+), 99 deletions(-) create mode 100644 lib/extract4.f90 diff --git a/lib/decode24.f90 b/lib/decode24.f90 index 73cb79828..77ab76475 100644 --- a/lib/decode24.f90 +++ b/lib/decode24.f90 @@ -1,11 +1,11 @@ subroutine decode24(dat,npts,dtx,dfx,flip,mode,mode4,decoded,ncount, & - deepmsg,qual,submode) + deepbest,qbest,submode) ! Decodes JT65 data, assuming that DT and DF have already been determined. parameter (MAXAVE=120) real dat(npts) !Raw data - character decoded*22,deepmsg*22 + character decoded*22,deepmsg*22,deepbest*22 character*12 mycall,hiscall character*6 hisgrid character*72 c72 @@ -23,7 +23,7 @@ subroutine decode24(dat,npts,dtx,dfx,flip,mode,mode4,decoded,ncount, & integer mettab(0:255,0:1) !Metric table integer nch(7) integer npr2(207) -! common/ave/ppsave(64,63,MAXAVE),nflag(MAXAVE),nsave,iseg(MAXAVE) + common/ave/ppsave(207,7,MAXAVE),nflag(MAXAVE),nsave,iseg(MAXAVE) data mode0/-999/ data nsum/7*0/,rsymbol/1449*0.0/ data npr2/ & @@ -128,59 +128,49 @@ subroutine decode24(dat,npts,dtx,dfx,flip,mode,mode4,decoded,ncount, & ! enddo !### - nbits=72+31 - delta=50 - limit=100000 - ncycles=0 - ncount=-1 - call interleave24(symbol(2),-1) !Remove the interleaving + call extract4(sym,nadd,ncount,decoded) !Do the KV decode - call fano232(symbol(2),nbits,mettab,delta,limit,data1,ncycles,metric,ncount) - nlim=ncycles/nbits - -!### Try deep search - qual=0. + qual=0. !Now try deep search neme=1 mycall='VK7MO' hiscall='W5LUA' hisgrid='EM13' - call deep24(sym(2),neme,flip,mycall,hiscall,hisgrid,decoded,qual) + call deep24(sym(2),neme,flip,mycall,hiscall,hisgrid,deepmsg,qual) if(qual.gt.qbest) then qbest=qual - deepmsg=decoded + deepbest=deepmsg ichbest=ich endif -!### if(ncount.ge.0) go to 100 if(mode.eq.7 .and. nchips.lt.mode4) go to 40 -100 do i=1,9 - i4=data1(i) - if(i4.lt.0) i4=i4+256 - data4a(i)=i4 - enddo - write(c72,1100) (data4a(i),i=1,9) -1100 format(9b8.8) - read(c72,1102) data4 -1102 format(12b6) +100 continue +!100 do i=1,9 +! i4=data1(i) +! if(i4.lt.0) i4=i4+256 +! data4a(i)=i4 +! enddo +! write(c72,1100) (data4a(i),i=1,9) +!1100 format(9b8.8) +! read(c72,1102) data4 +!1102 format(12b6) - decoded=' ' - submode=' ' - if(ncount.ge.0) then - call unpackmsg(data4,decoded) - submode=char(ichar('A')+ich-1) - else - decoded=deepmsg +! decoded=' ' +! submode=' ' + + if(ncount.lt.0) then + decoded=deepbest submode=char(ichar('A')+ichbest-1) qual=qbest endif - if(decoded(1:6).eq.'000AAA') then - decoded='***WRONG MODE?***' - ncount=-1 - endif +! if(decoded(1:6).eq.'000AAA') then +! decoded='***WRONG MODE?***' +! ncount=-1 +! endif ! Save symbol spectra for possible decoding of average. + ppsave(1:207,1:7,nsave)=rsymbol(1:207,1:7) return end subroutine decode24 diff --git a/lib/extract4.f90 b/lib/extract4.f90 new file mode 100644 index 000000000..062294601 --- /dev/null +++ b/lib/extract4.f90 @@ -0,0 +1,61 @@ +subroutine extract4(sym,nadd,ncount,decoded) + + real sym(207) + character decoded*22, submode*1 + character*72 c72 + integer*1 symbol(207) + integer*1 data1(13) !Decoded data (8-bit bytes) + integer data4a(9) !Decoded data (8-bit bytes) + integer data4(12) !Decoded data (6-bit bytes) + integer mettab(0:255,0:1) !Metric table + logical first + data first/.true./ + save first,mettab + + if(first) then + call getmet24(mode,mettab) + first=.false. + endif + + do j=1,207 + r=sym(j) + 128. + if(r.gt.255.0) r=255.0 + if(r.lt.0.0) r=0.0 + i4=nint(r) + if(i4.gt.127) i4=i4-256 + symbol(j)=i4 + enddo + + nbits=72+31 + ndelta=50 + limit=100000 + ncycles=0 + ncount=-1 + decoded=' ' + submode=' ' + + call interleave24(symbol(2),-1) !Remove the interleaving + call fano232(symbol(2),nbits,mettab,ndelta,limit,data1,ncycles,metric,ncount) + nlim=ncycles/nbits + + if(ncount.ge.0) then + do i=1,9 + i4=data1(i) + if(i4.lt.0) i4=i4+256 + data4a(i)=i4 + enddo + write(c72,1100) (data4a(i),i=1,9) +1100 format(9b8.8) + read(c72,1102) data4 +1102 format(12b6) + + call unpackmsg(data4,decoded) + submode=char(ichar('A')+ich-1) + if(decoded(1:6).eq.'000AAA') then + decoded='***WRONG MODE?***' + ncount=-1 + endif + endif + + return +end subroutine extract4 diff --git a/lib/getmet24.f90 b/lib/getmet24.f90 index 898118324..f35a90ae2 100644 --- a/lib/getmet24.f90 +++ b/lib/getmet24.f90 @@ -5,8 +5,6 @@ subroutine getmet24(mode,mettab) ! Metric table (RxSymbol,TxSymbol) integer mettab(0:255,0:1) real*4 xx0(0:255) - logical first - data first/.true./ data xx0/ & 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & @@ -42,15 +40,12 @@ subroutine getmet24(mode,mettab) -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966/ save - if(first) then - bias=0.5 - scale=10.0 - do i=0,255 - mettab(i,0)=nint(scale*(xx0(i)-bias)) - if(i.ge.1) mettab(256-i,1)=mettab(i,0) - enddo - first=.false. - endif + bias=0.5 + scale=10.0 + do i=0,255 + mettab(i,0)=nint(scale*(xx0(i)-bias)) + if(i.ge.1) mettab(256-i,1)=mettab(i,0) + enddo return end subroutine getmet24 diff --git a/lib/wsjt24.f90 b/lib/wsjt24.f90 index 4ecd85d9e..574f1dd9f 100644 --- a/lib/wsjt24.f90 +++ b/lib/wsjt24.f90 @@ -22,8 +22,7 @@ subroutine wsjt24(dat,npts,cfile6,NClearAve,MinSigdB, & character*6 hisgrid character submode*1 real*4 ccfbluesum(-5:540),ccfredsum(-224:224) -! common/ave/ppsave(64,63,MAXAVE),nflag(MAXAVE),nsave,iseg(MAXAVE) !For msg avg - integer nflag(MAXAVE),iseg(MAXAVE) + common/ave/ppsave(207,7,MAXAVE),nflag(MAXAVE),nsave,iseg(MAXAVE) data first/.true./,ns10/0/,ns20/0/ save @@ -37,6 +36,7 @@ subroutine wsjt24(dat,npts,cfile6,NClearAve,MinSigdB, & if(nspecial.eq.999) go to 900 !Silence compiler warning endif + ndepth=3 !### naggressive=0 if(ndepth.ge.2) naggressive=1 nq1=3 @@ -118,18 +118,18 @@ subroutine wsjt24(dat,npts,cfile6,NClearAve,MinSigdB, & ! Blank all end-of-line stuff if no decode if(line(31:40).eq.' ') line=line(:30) -! if(lcum) write(21,1011) line + if(lcum) write(21,1011) line ! Write decoded msg unless this is an "Exclude" request: if(MinSigdB.lt.99) write(*,1011) line 1011 format(a77) -! if(nsave.ge.1) call avemsg65(1,mode65,ndepth, & -! avemsg1,nused1,nq1,nq2,neme,mycall,hiscall,hisgrid,qual1, & -! ns1,ncount1) -! if(nsave.ge.1) call avemsg65(2,mode65,ndepth, & -! avemsg2,nused2,nq1,nq2,neme,mycall,hiscall,hisgrid,qual2, & -! ns2,ncount2) + if(nsave.ge.1) call avemsg4(1,mode4,ndepth, & + avemsg1,nused1,nq1,nq2,neme,mycall,hiscall,hisgrid,qual1, & + ns1,ncount1) + if(nsave.ge.1) call avemsg4(2,mode4,ndepth, & + avemsg2,nused2,nq1,nq2,neme,mycall,hiscall,hisgrid,qual2, & + ns2,ncount2) nqual1=qual1 nqual2=qual2 if(ndiag.eq.0 .and. nqual1.gt.10) nqual1=10 @@ -140,39 +140,36 @@ subroutine wsjt24(dat,npts,cfile6,NClearAve,MinSigdB, & if(ncount2.ge.0) nc2=1 ! Write the average line -! if(ns1.ge.1 .and. ns1.ne.ns10) then - -! if(ns1.ge.1) then -! if(ns1.lt.10) write(ave1,1021) cfile6,1,nused1,ns1,avemsg1,nc1,nqual1 -!1021 format(a6,i3,i4,'/',i1,20x,a19,i8,i4) -! if(ns1.ge.10 .and. nsave.le.99) write(ave1,1022) cfile6, & -! 1,nused1,ns1,avemsg1,nc1,nqual1 -!1022 format(a6,i3,i4,'/',i2,19x,a19,i8,i4) -! if(ns1.ge.100) write(ave1,1023) cfile6,1,nused1,ns1, & -! avemsg1,nc1,nqual1 -!1023 format(a6,i3,i4,'/',i3,18x,a19,i8,i4) -! if(lcum .and. (avemsg1.ne.' ')) & -! write(21,1011) ave1 -! ns10=ns1 -! endif + if(ns1.ge.1) then + if(ns1.lt.10) write(ave1,1021) cfile6,1,nused1,ns1,avemsg1,nc1,nqual1 +1021 format(a6,i3,i4,'/',i1,20x,a19,i7,i5) + if(ns1.ge.10 .and. nsave.le.99) write(ave1,1022) cfile6, & + 1,nused1,ns1,avemsg1,nc1,nqual1 +1022 format(a6,i3,i4,'/',i2,19x,a19,i7,i5) + if(ns1.ge.100) write(ave1,1023) cfile6,1,nused1,ns1, & + avemsg1,nc1,nqual1 +1023 format(a6,i3,i4,'/',i3,18x,a19,i7,i5) + if(lcum .and. (avemsg1.ne.' ')) & + write(21,1011) ave1 + ns10=ns1 + endif ! If Monitor segment #2 is available, write that line also -! if(ns2.ge.1 .and. ns2.ne.ns20) then !***Why the 2nd part?? *** -! if(ns2.ge.1) then -! if(ns2.lt.10) write(ave2,1021) cfile6,2,nused2,ns2,avemsg2,nc2,nqual2 -! if(ns2.ge.10 .and. nsave.le.99) write(ave2,1022) cfile6, & -! 2,nused2,ns2,avemsg2,nc2,nqual2 -! if(ns2.ge.100) write(ave2,1023) cfile6,2,nused2,ns2,avemsg2,nc2,nqual2 -! if(lcum .and. (avemsg2.ne.' ')) & -! write(21,1011) ave2 -! ns20=ns2 -! endif + if(ns2.ge.1) then + if(ns2.lt.10) write(ave2,1021) cfile6,2,nused2,ns2,avemsg2,nc2,nqual2 + if(ns2.ge.10 .and. nsave.le.99) write(ave2,1022) cfile6, & + 2,nused2,ns2,avemsg2,nc2,nqual2 + if(ns2.ge.100) write(ave2,1023) cfile6,2,nused2,ns2,avemsg2,nc2,nqual2 + if(lcum .and. (avemsg2.ne.' ')) & + write(21,1011) ave2 + ns20=ns2 + endif if(ave1(31:40).eq.' ') ave1=ave1(:30) if(ave2(31:40).eq.' ') ave2=ave2(:30) -! write(12,1011) ave1 -! write(12,1011) ave2 -! call flush(12) + write(12,1011) ave1 + write(12,1011) ave2 + call flush(12) ! call cs_unlock 900 continue @@ -180,19 +177,5 @@ subroutine wsjt24(dat,npts,cfile6,NClearAve,MinSigdB, & ccfbluesum=ccfbluesum + ccfblue ccfredsum=ccfredsum + ccfred -! This was for testing message averaging: - -! rewind 71 -! rewind 72 -! do i=-5,540 -! write(71,3001) 0.2 + i*0.057143,ccfbluesum(i) -!3001 format(2f12.3) -! enddo -! do i=-224,224 -! write(72,3001) i*2.1875,ccfredsum(i) -! enddo -! call flush(71) -! call flush(72) - return end subroutine wsjt24