From e9e319da1eddadc14f0346c306c3684e2e5ddebd Mon Sep 17 00:00:00 2001
From: Joe Taylor <k1jt@arrl.org>
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