From 53c2f619f2d9bd6ec0e5e90698b099e62be1e714 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 28 Jun 2007 15:14:35 +0000 Subject: [PATCH] Quick decode is now done with save algorithms as regular decode. Working toward on-the-fly computation of symbol spectra. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@429 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- datcom.f90 | 3 +- decode1.F90 | 3 + getfile2.F90 | 4 +- map65.py | 1 + map65a.f90 | 293 ++++++++++++++++++++++++--------------------------- spec.f90 | 2 +- symspec.f | 42 ++++---- 7 files changed, 172 insertions(+), 176 deletions(-) diff --git a/datcom.f90 b/datcom.f90 index 041b81996..c09c0f726 100644 --- a/datcom.f90 +++ b/datcom.f90 @@ -1,4 +1,5 @@ parameter (NSMAX=60*96000) !Samples per 60 s file integer*2 id !46 MB: raw data from Linrad timf2 character*80 fname80 -common/datcom/nutc,newdat2,id(4,NSMAX,2),kbuf,nlost,nlen,fname80 +common/datcom/id(4,NSMAX,2),nutc,newdat2,kbuf,kk,kkdone,nlost, & + nlen,fname80 diff --git a/decode1.F90 b/decode1.F90 index f786d8054..00a84a6f3 100644 --- a/decode1.F90 +++ b/decode1.F90 @@ -27,6 +27,9 @@ subroutine decode1(iarg) call getfile2(fname80,nlen) newdat=1 endif + + if((kk-kkdone).gt.32768) call symspec(id,kbuf,kk,kkdone,rxnoise) + if(ndecoding.gt.0 .and. mode(1:4).eq.'JT65') then ndecdone=0 call map65a(newdat) diff --git a/getfile2.F90 b/getfile2.F90 index 726e76172..22a889360 100644 --- a/getfile2.F90 +++ b/getfile2.F90 @@ -4,7 +4,6 @@ subroutine getfile2(fname,len) use dflib #endif - parameter (NDMAX=661500) ! =60*11025 character*(*) fname character infile*15 @@ -50,6 +49,9 @@ subroutine getfile2(fname,len) #endif read(filename(8:11),*) nutc + kbuf=1 + kk=NSMAX + kkdone=0 ndiskdat=1 ndecoding=4 mousebutton=0 diff --git a/map65.py b/map65.py index 53c179367..2d4b7f879 100644 --- a/map65.py +++ b/map65.py @@ -1084,6 +1084,7 @@ def update(): avetext.insert(END,lines[0]) avetext.insert(END,lines[1]) # avetext.configure(state=DISABLED) + cleartext() Audio.gcom2.ndecdone=0 if Audio.gcom2.ndecdone==2: diff --git a/map65a.f90 b/map65a.f90 index 06920bb9d..b186a355d 100644 --- a/map65a.f90 +++ b/map65a.f90 @@ -4,7 +4,6 @@ subroutine map65a(newdat) parameter (MAXMSG=1000) !Size of decoded message list parameter (NFFT=32768) !Half symbol = 17833 samples; - real savg(4,NFFT) real tavg(-50:50) !Temp for finding local base level real base(4) !Local basel level at 4 pol'ns real tmp (200) !Temp storage for pctile sorting @@ -18,7 +17,7 @@ subroutine map65a(newdat) logical even character decoded*22,blank*22 include 'datcom.f90' - common/spcom/ip0,ss(4,322,NFFT),ss5(322,NFFT) + common/spcom/ip0,ss(4,322,NFFT),ss5(322,NFFT),savg(4,NFFT) data blank/' '/ data shmsg0/'ATT','RO ','RRR','73 '/ data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/ @@ -40,195 +39,181 @@ subroutine map65a(newdat) utcdata=utcdata(1:2)//':'//utcdata(3:4) open(23,file='CALL3.TXT',status='old') - fselect=mousefqso + 1.6 + fselect=mousefqso + 1.6 + 0.001*mousedf df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz - fa=0.0 - fb=60000.0 - ia=nint((fa+23000.0)/df + 1.0) ! 23000 = 48000 - 25000 - ib=nint((fb+23000.0)/df + 1.0) ftol=0.020 !Frequency tolerance (kHz) - kk=0 - nkk=1 - - nz=n/8 - -! nfilt=2 should be faster (but doesn't work quite right?) - nfilt=1 !nfilt=2 is faster for selected freq - dphi=310/57.2957795 - do kpol=0,3 - freq=fselect + 0.001*mousedf - if(even) ip0=ip000+kpol - if(.not.even) ip0=ip001+kpol - if(ip0.gt.4) ip0=ip0-4 - dt00=2.314240 - dt=dt00 - call decode1a(id(1,1,kbuf),newdat,nfilt,freq,nflip,dphi,ip0, & - sync2,a,dt,pol,nkv,nhist,qual,decoded) - nsync1=0 - nsync2=nint(10.0*log10(sync2)) - 40 !### empirical ### - ndf=nint(a(1)) + mousedf - nw=0 - if(nkv.gt.0) go to 5 - enddo - -5 if(even) ip000=ip0 - if(.not.even) ip001=ip0 - - nkHz=nint(freq-1.600) - npol=nint(57.2957795*pol) - nqual=qual - if(nflip.eq.-1) then !Should this be in decode1a ? - do i=22,9,-1 - if(decoded(i:i).ne.' ') then - decoded(i+2:i+4)='OOO' - go to 6 - endif - enddo - endif -6 write(11,1010) nkHz,ndf,npol,nutc,nsync2,dt,nw,decoded,nkv,nqual -1010 format(i3,i5,i4,i5.4,i4,f5.1,i3,2x,a22,2i3) - call flushqqq(11) - ndecdone=1 - - if(nagain.eq.1) go to 999 -! if(newdat.eq.0) go to 999 -! newdat=0 - nfilt=1 - do i=1,NFFT - short(1,i)=0. - short(2,i)=0. - short(3,i)=0. - enddo + dphi=310/57.2957795 - call symspec(id(1,1,kbuf),nz,rxnoise,savg) - newspec=1 - - freq0=-999. - sync10=-999. - fshort0=-999. - sync20=-999. - ntry=0 - do i=ia,ib !Search over freq range - freq=0.001*((i-1)*df - 23000) + 100.0 - -! Find the local base level for each polarization; update every 10 bins. - if(mod(i-ia,10).eq.0) then - do jp=1,4 - do ii=-50,50 - tavg(ii)=savg(jp,i+ii) - enddo - call pctile(tavg,tmp,101,50,base(jp)) - enddo + do nqd=1,0,-1 + if(nqd.eq.1) then + fa=1000.0*(fselect-100.0) - dftolerance + fb=1000.0*(fselect-100.0) + dftolerance + ia=nint((fa+23000.0)/df + 1.0) ! 23000 = 48000 - 25000 + ib=nint((fb+23000.0)/df + 1.0) + print*,dftolerance,ia,ib + else + fa=0.0 + fb=60000.0 + ia=nint((fa+23000.0)/df + 1.0) ! 23000 = 48000 - 25000 + ib=nint((fb+23000.0)/df + 1.0) endif -! Find max signal at this frequency - smax=0. - do jp=1,4 - if(savg(jp,i)/base(jp).gt.smax) smax=savg(jp,i)/base(jp) + kk=0 + nkk=1 + nz=n/8 + + ndecdone=1 + + do i=1,NFFT + short(1,i)=0. + short(2,i)=0. + short(3,i)=0. enddo - if(smax.gt.1.1) then - ntry=ntry+1 -! Look for JT65 sync patterns and shorthand square-wave patterns. - call ccf65(ss(1,1,i),sync1,ipol,dt,flipk, & - syncshort,snr2,ipol2,dt2) + newspec=1 + freq0=-999. + sync10=-999. + fshort0=-999. + sync20=-999. + ntry=0 + do i=ia,ib !Search over freq range + freq=0.001*((i-1)*df - 23000) + 100.0 - shmsg=' ' +! Find the local base level for each polarization; update every 10 bins. + if(mod(i-ia,10).eq.0) then + do jp=1,4 + do ii=-50,50 + tavg(ii)=savg(jp,i+ii) + enddo + call pctile(tavg,tmp,101,50,base(jp)) + enddo + endif + +! Find max signal at this frequency + smax=0. + do jp=1,4 + if(savg(jp,i)/base(jp).gt.smax) smax=savg(jp,i)/base(jp) + enddo + + if(smax.gt.1.1) then + ntry=ntry+1 +! Look for JT65 sync patterns and shorthand square-wave patterns. + call ccf65(ss(1,1,i),sync1,ipol,dt,flipk, & + syncshort,snr2,ipol2,dt2) + + shmsg=' ' ! Is there a shorthand tone above threshold? - if(syncshort.gt.1.0) then + if(syncshort.gt.1.0) then ! ### Do shorthand AFC here (or maybe after finding a pair?) ### - short(1,i)=syncshort - short(2,i)=dt2 - short(3,i)=ipol2 + short(1,i)=syncshort + short(2,i)=dt2 + short(3,i)=ipol2 ! Check to see if lower tone of shorthand pair was found. - do j=2,4 - i0=i-nint(j*53.8330078/df) + do j=2,4 + i0=i-nint(j*53.8330078/df) ! Should this be i0 +/- 1, or just i0? ! Should we also insist that difference in DT be either 1.5 or -1.5 s? - if(short(1,i0).gt.1.0) then - fshort=0.001*((i0-1)*df - 23000) + 100.0 + if(short(1,i0).gt.1.0) then + fshort=0.001*((i0-1)*df - 23000) + 100.0 ! Keep only the best candidate within ftol. - if(fshort-fshort0.le.ftol .and. sync2.gt.sync20 & - .and. nkk.eq.2) kk=kk-1 - if(fshort-fshort0.gt.ftol .or. & - sync2.gt.sync20) then - kk=kk+1 - sig(kk,1)=nfile - sig(kk,2)=nutc - sig(kk,3)=fshort - sig(kk,4)=syncshort - sig(kk,5)=dt2 - sig(kk,6)=45*(ipol2-1)/57.2957795 - sig(kk,7)=0 - sig(kk,8)=snr2 - sig(kk,9)=0 - sig(kk,10)=0 + if(fshort-fshort0.le.ftol .and. sync2.gt.sync20 & + .and. nkk.eq.2) kk=kk-1 + if(fshort-fshort0.gt.ftol .or. & + sync2.gt.sync20) then + kk=kk+1 + sig(kk,1)=nfile + sig(kk,2)=nutc + sig(kk,3)=fshort + sig(kk,4)=syncshort + sig(kk,5)=dt2 + sig(kk,6)=45*(ipol2-1)/57.2957795 + sig(kk,7)=0 + sig(kk,8)=snr2 + sig(kk,9)=0 + sig(kk,10)=0 ! sig(kk,11)=rms0 - sig(kk,12)=savg(ipol2,i) - sig(kk,13)=0 - sig(kk,14)=0 - sig(kk,15)=0 - sig(kk,16)=0 + sig(kk,12)=savg(ipol2,i) + sig(kk,13)=0 + sig(kk,14)=0 + sig(kk,15)=0 + sig(kk,16)=0 ! sig(kk,17)=0 - sig(kk,18)=0 - msg(kk)=shmsg0(j) - fshort0=fshort - sync20=sync2 - nkk=2 + sig(kk,18)=0 + msg(kk)=shmsg0(j) + fshort0=fshort + sync20=sync2 + nkk=2 + endif endif - endif - enddo - endif + enddo + endif ! Is sync1 above threshold? - if(sync1.gt.1.0) then + if(sync1.gt.1.0) then ! Keep only the best candidate within ftol. ! (Am I deleting any good decodes by doing this? Any harm in omitting ! these statements??) - if(freq-freq0.le.ftol .and. sync1.gt.sync10 .and. & - nkk.eq.1) kk=kk-1 + if(freq-freq0.le.ftol .and. sync1.gt.sync10 .and. & + nkk.eq.1) kk=kk-1 - if(freq-freq0.gt.ftol .or. sync1.gt.sync10) then - nflip=nint(flipk) - call decode1a(id(1,1,kbuf),newdat,nfilt,freq,nflip,dphi, & - ipol,sync2,a,dt,pol,nkv,nhist,qual,decoded) + if(freq-freq0.gt.ftol .or. sync1.gt.sync10) then + nflip=nint(flipk) + call decode1a(id(1,1,kbuf),newdat,nfilt,freq,nflip,dphi, & + ipol,sync2,a,dt,pol,nkv,nhist,qual,decoded) ! i9=index(decoded,'AA1YN') ! if(i9.gt.0) print*,i,i9,fselect,freq,decoded - kk=kk+1 - sig(kk,1)=nfile - sig(kk,2)=nutc - sig(kk,3)=freq - sig(kk,4)=sync1 - sig(kk,5)=dt - sig(kk,6)=pol - sig(kk,7)=flipk - sig(kk,8)=sync2 - sig(kk,9)=nkv - sig(kk,10)=qual + kk=kk+1 + sig(kk,1)=nfile + sig(kk,2)=nutc + sig(kk,3)=freq + sig(kk,4)=sync1 + sig(kk,5)=dt + sig(kk,6)=pol + sig(kk,7)=flipk + sig(kk,8)=sync2 + sig(kk,9)=nkv + sig(kk,10)=qual ! sig(kk,11)=rms0 - sig(kk,12)=savg(ipol,i) - sig(kk,13)=a(1) - sig(kk,14)=a(2) - sig(kk,15)=a(3) - sig(kk,16)=a(4) + sig(kk,12)=savg(ipol,i) + sig(kk,13)=a(1) + sig(kk,14)=a(2) + sig(kk,15)=a(3) + sig(kk,16)=a(4) ! sig(kk,17)=a(5) - sig(kk,18)=nhist - msg(kk)=decoded - freq0=freq - sync10=sync1 - nkk=1 + sig(kk,18)=nhist + msg(kk)=decoded + freq0=freq + sync10=sync1 + nkk=1 + endif endif endif + enddo + if(nqd.eq.1) then + nkHz=nint(freq-1.600) + npol=nint(57.2957795*pol) + nqual=qual + if(nflip.eq.-1) then !Should this be in decode1a ? + do i=22,9,-1 + if(decoded(i:i).ne.' ') then + decoded(i+2:i+4)='OOO' + go to 6 + endif + enddo + endif + nw=0 +6 write(11,1010) nkHz,ndf,npol,nutc,nsync2,dt,nw,decoded,nkv,nqual +1010 format(i3,i5,i4,i5.4,i4,f5.1,i3,2x,a22,2i3) + call flushqqq(11) endif + if(nagain.eq.1) go to 999 enddo -! write(*,1010) - ! Trim the list and produce a sorted index and sizes of groups. ! (Should trimlist remove all but best SNR for given UTC and message content?) call trimlist(sig,kk,indx,nsiz,nz) diff --git a/spec.f90 b/spec.f90 index 83856c9f1..93641ebe2 100644 --- a/spec.f90 +++ b/spec.f90 @@ -16,7 +16,7 @@ subroutine spec(brightness,contrast,ngain,nspeed,a,a2) integer b0,c0 real s(NFFT,NY) ! Could save memory by doing the averaging-by-7 (or 10?) of ss5 in symspec. - common/spcom/ip0,ss(4,322,NFFT),ss5(322,NFFT) + common/spcom/ip0,ss(4,322,NFFT),ss5(322,NFFT),savg(4,NFFT) include 'gcom1.f90' include 'gcom2.f90' include 'gcom3.f90' diff --git a/symspec.f b/symspec.f index c89dc1cee..255a08151 100644 --- a/symspec.f +++ b/symspec.f @@ -1,34 +1,36 @@ - subroutine symspec(id,nz,rxnoise,savg) + subroutine symspec(id,kbuf,kk,kkdone,rxnoise) C Compute spectra at four polarizations, using half-symbol steps. parameter (NFFT=32768) parameter (NSMAX=60*96000) integer*2 id(4,NSMAX) - real savg(4,NFFT) complex cx(NFFT),cy(NFFT) ! pad to 32k with zeros complex z real*8 ts,hsym - common/spcom/ip0,ss(4,322,NFFT),ss5(322,NFFT) + common/spcom/ip0,ss(4,322,NFFT),ss5(322,NFFT),savg(4,NFFT) -! fac=1.e-4 -! fac=1.7e-4 - fac=0.0002 * 10.0**(0.05*(-rxnoise)) + fac=1.e-4 +! fac=1.7e-4 +! fac=0.0002 * 10.0**(0.05*(-rxnoise)) + hsym=2048.d0*96000.d0/11025.d0 !Samples per half symbol + npts=hsym !Integral samples per half symbol + ntot=322 !Half symbols per transmission - hsym=2048.d0*96000.d0/11025.d0 !Samples per half symbol - npts=hsym !Integral samples per half symbol - nsteps=322 !Half symbols per transmission - - do ip=1,4 - do i=1,NFFT - savg(ip,i)=0. + if(kkdone.eq.0) then + do ip=1,4 + do i=1,NFFT + savg(ip,i)=0. + enddo enddo - enddo + ts=1.d0 - hsym + n=0 + endif - ts=1.d0 - hsym - do n=1,nsteps - ts=ts+hsym !Update exact sample pointer - i0=ts !Starting sample pointer + do nn=1,ntot + i0=ts+hsym !Starting sample pointer + if((i0+npts-1).gt.kk) go to 999 !See if we have enough points + ts=ts+hsym !OK, update the exact sample pointer do i=1,npts !Copy data to FFT arrays xr=fac*id(1,i0+i) xi=fac*id(2,i0+i) @@ -46,6 +48,7 @@ C Compute spectra at four polarizations, using half-symbol steps. call four2a(cx,NFFT,1,1,1) !Do the FFTs call four2a(cy,NFFT,1,1,1) + n=n+1 do i=1,NFFT !Save and accumulate power spectra sx=real(cx(i))**2 + aimag(cx(i))**2 ss(1,n,i)=sx ! Pol = 0 @@ -81,7 +84,8 @@ C Compute spectra at four polarizations, using half-symbol steps. ss5(n,i)=0.707*sqrt(q*q + u*u) enddo + if(n.eq.ntot) go to 999 enddo - return + 999 return end