From cb3d3146793d9b85bf7fe13df17f84f20380cce3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 29 Jun 2007 14:45:15 +0000 Subject: [PATCH] All is in place for double-buffering of ss(), ss5(), savg(). git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@438 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- Makefile.in | 4 +- Makefile.win | 9 +++-- ccf65.f | 10 ++--- map65.py | 2 - map65a.f90 | 9 ++--- spec.f90 | 7 ++-- symspec.f | 104 -------------------------------------------------- symspec.f90 | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 126 insertions(+), 124 deletions(-) delete mode 100644 symspec.f create mode 100644 symspec.f90 diff --git a/Makefile.in b/Makefile.in index 3e736646e..7ca9f7ccb 100644 --- a/Makefile.in +++ b/Makefile.in @@ -47,7 +47,7 @@ SRCS2F90 = astro0.F90 audio_init.F90 azdist0.f90 \ decode1.F90 ftn_init.F90 ftn_quit.f90 wsjtgen.F90 \ runqqq.F90 fivehz.F90 flushqqq.F90 map65a0.f90 \ rfile.f90 rfile3a.f90 spec.f90 map65a.f90 display.F90 \ - getfile.F90 getfile2.F90 recvpkt.F90 + getfile.F90 getfile2.F90 recvpkt.F90 symspec.f90 SRCS2F77 = indexx.f gen65.f chkmsg.f \ gentone.f gencwid.f set.f db.f pctile.f sort.f ssort.f \ @@ -58,7 +58,7 @@ SRCS2F77 = indexx.f gen65.f chkmsg.f \ unpackmsg.f unpacktext.f astro.f azdist.f coord.f dcoord.f \ deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \ moon2.f MoonDop.f sun.f toxyz.f pfxdump.f \ - symspec.f ccf65.f trimlist.f chkhist.f decode1a.f \ + ccf65.f trimlist.f chkhist.f decode1a.f \ filbig.f fil659.f fil658.f fil6521.f twkfreq.f decode65b.f \ afc65b.f fchisq.f ccf2.f rfile2.f diff --git a/Makefile.win b/Makefile.win index 42f0285da..acdb7f301 100644 --- a/Makefile.win +++ b/Makefile.win @@ -18,7 +18,10 @@ SRCS2F90 = a2d.f90 astro0.f90 audio_init.f90 azdist0.f90 \ decode1.f90 ftn_init.f90 ftn_quit.f90 wsjtgen.f90 \ runqqq.f90 fivehz.f90 flushqqq.f90 map65a0.f90 \ rfile.f90 rfile3a.f90 spec.f90 map65a.f90 display.F90 \ - getfile.f90 getfile2.f90 recvpkt.f90 savetf2.f90 + getfile.f90 getfile2.f90 recvpkt.f90 savetf2.f90 \ + symspec.f90 + +SRCSCOM = datcom.f90 gcom1.f90 gcom2.f90 gcom3.f90 gcom4.f90 spcom.f90 SRCS2F77 = indexx.f gen65.f chkmsg.f \ gentone.f gencwid.f set.f db.f pctile.f sort.f ssort.f \ @@ -29,7 +32,7 @@ SRCS2F77 = indexx.f gen65.f chkmsg.f \ unpackmsg.f unpacktext.f astro.f azdist.f coord.f dcoord.f \ deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \ moon2.f MoonDop.f sun.f toxyz.f pfxdump.f \ - symspec.f ccf65.f trimlist.f chkhist.f decode1a.f \ + ccf65.f trimlist.f chkhist.f decode1a.f \ filbig.f fil659.f fil658.f fil6521.f twkfreq.f decode65b.f \ afc65b.f fchisq.f ccf2.f @@ -38,7 +41,7 @@ SRCS2C = resample.c ptt.c igray.c wrapkarn.c rfile3.c wfile3.c MAP65.EXE: Audio.pyd map65.spec python c:\python23\installer\Build.py map65.spec -Audio.pyd: $(OBJS2C) $(SRCS2F90) $(SRCS2F77) $(SRCS2C) +Audio.pyd: $(OBJS2C) $(SRCS2F90) $(SRCS2F77) $(SRCS2C) $(SRCSCOM) python f2py.py -c \ --quiet --"fcompiler=compaqv" \ --opt="/nologo /traceback /warn:errors /fast /fpp /define:Win32 \ diff --git a/ccf65.f b/ccf65.f index 6c09c58ec..f49e255e4 100644 --- a/ccf65.f +++ b/ccf65.f @@ -1,4 +1,4 @@ - subroutine ccf65(ss,sync1,ipol1,dt1,flipk,syncshort, + subroutine ccf65(ss,nhsym,sync1,ipol1,dt1,flipk,syncshort, + snr2,ipol2,dt2) parameter (NFFT=512,NH=NFFT/2) @@ -52,10 +52,10 @@ C Look for JT65 sync pattern and shorthand square-wave pattern. ccfbest=0. ccfbest2=0. do ip=1,4 !Do all four pol'ns - do i=1,321 + do i=1,nhsym ! ?? nhsym-1 ?? s(i)=min(4.0,ss(ip,i)+ss(ip,i+1)) enddo - do i=322,NFFT + do i=nhsym+1,NFFT ! ?? nhsym ?? s(i)=0. enddo call four2a(s,NFFT,1,-1,0) !Real-to-complex FFT @@ -103,10 +103,10 @@ C Find rms level on baseline of "ccfblue", for normalization. dt1=2.5 + lagpk*(2048.0/11025.0) C Find base level for normalizing snr2. - do i=1,322 + do i=1,nhsym tmp1(i)=ss(ipol2,i) enddo - call pctile(tmp1,tmp2,322,40,base) + call pctile(tmp1,tmp2,nhsym,40,base) snr2=0.398107*ccfbest2/base !### empirical syncshort=0.5*ccfbest2/rms - 4.0 !### better normalizer than rms? dt2=2.5 + lagpk2*(2048.0/11025.0) diff --git a/map65.py b/map65.py index 27999a463..252f8c74f 100644 --- a/map65.py +++ b/map65.py @@ -317,8 +317,6 @@ def openfile(event=NONE): Audio.getfile(fname,len(fname)) if Audio.gcom2.ierr: print 'Error ',Audio.gcom2.ierr, \ 'when trying to read file',fname - bdecode.configure(bg='#66FFFF',activebackground='#66FFFF', \ - state=DISABLED) mrudir=os.path.dirname(fname) fileopened=os.path.basename(fname) os.chdir(appdir) diff --git a/map65a.f90 b/map65a.f90 index b20d8628f..0c9c634c0 100644 --- a/map65a.f90 +++ b/map65a.f90 @@ -3,11 +3,9 @@ subroutine map65a(newdat) ! Processes timf2 data from Linrad to find and decode JT65 signals. parameter (MAXMSG=1000) !Size of decoded message list - parameter (NFFT=32768) !Half symbol = 17833 samples; 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 - real short(3,NFFT) !SNR dt ipol for potential shorthands real sig(MAXMSG,30) !Parameters of detected signals real a(5) character*22 msg(MAXMSG) @@ -16,9 +14,10 @@ subroutine map65a(newdat) logical done(MAXMSG) logical even character decoded*22,blank*22 - include 'datcom.f90' + include 'spcom.f90' + real short(3,NFFT) !SNR dt ipol for potential shorthands include 'gcom2.f90' - common/spcom/ip0,ss(4,322,NFFT),ss5(322,NFFT),savg(4,NFFT) + include 'datcom.f90' data blank/' '/ data shmsg0/'ATT','RO ','RRR','73 '/ data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/ @@ -96,7 +95,7 @@ subroutine map65a(newdat) 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, & + call ccf65(ss(1,1,i),nhsym,sync1,ipol,dt,flipk, & syncshort,snr2,ipol2,dt2) shmsg=' ' diff --git a/spec.f90 b/spec.f90 index 93641ebe2..fd3afccb7 100644 --- a/spec.f90 +++ b/spec.f90 @@ -1,6 +1,6 @@ subroutine spec(brightness,contrast,ngain,nspeed,a,a2) - parameter (NX=750,NY=130,NTOT=NX*NY,NFFT=32768) + parameter (NX=750,NY=130,NTOT=NX*NY) ! Input: integer brightness,contrast !Display parameters @@ -14,9 +14,10 @@ subroutine spec(brightness,contrast,ngain,nspeed,a,a2) logical first integer nstep(5) 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),savg(4,NFFT) + include 'spcom.f90' + real s(NFFT,NY) include 'gcom1.f90' include 'gcom2.f90' include 'gcom3.f90' diff --git a/symspec.f b/symspec.f deleted file mode 100644 index 089c933a6..000000000 --- a/symspec.f +++ /dev/null @@ -1,104 +0,0 @@ - subroutine symspec(id,kbuf,kk,kkdone,rxnoise,newspec,newdat, - + ndecoding) - -C Compute spectra at four polarizations, using half-symbol steps. - - parameter (NFFT=32768) - parameter (NSMAX=60*96000) - integer*2 id(4,NSMAX) - 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),savg(4,NFFT) - -! 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 - - if(kkdone.eq.0) then - do ip=1,4 - do i=1,NFFT - savg(ip,i)=0. - enddo - enddo - ts=1.d0 - hsym - n=0 - endif - - 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 - i1=ts+2*hsym !Next starting sample pointer - 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) - cx(i)=cmplx(xr,xi) - yr=fac*id(3,i0+i) - yi=fac*id(4,i0+i) - cy(i)=cmplx(yr,yi) - enddo - - do i=npts+1,NFFT !Pad to 32k with zeros - cx(i)=0. - cy(i)=0. - enddo - - 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 - savg(1,i)=savg(1,i) + sx - - z=cx(i) + cy(i) - s45=0.5*(real(z)**2 + aimag(z)**2) - ss(2,n,i)=s45 ! Pol = 45 - savg(2,i)=savg(2,i) + s45 - - sy=real(cy(i))**2 + aimag(cy(i))**2 - ss(3,n,i)=sy ! Pol = 90 - savg(3,i)=savg(3,i) + sy - - z=cx(i) - cy(i) - s135=0.5*(real(z)**2 + aimag(z)**2) - ss(4,n,i)=s135 ! Pol = 135 - savg(4,i)=savg(4,i) + s135 - - z=cx(i)*conjg(cy(i)) - -! Leif's formula: -! ss5(n,i)=0.5*(sx+sy) + (real(z)**2 + aimag(z)**2 - -! + sx*sy)/(sx+sy) - -! Leif's suggestion: -! ss5(n,i)=max(sx,s45,sy,s135) - -! Linearly polarized component, from the Stokes parameters: - q=sx - sy - u=2.0*real(z) -! v=2.0*aimag(z) - ss5(n,i)=0.707*sqrt(q*q + u*u) - - enddo -! if(n.eq.ntot) then - if(n.ge.279) then - newspec=1 - newdat=1 - ndecoding=1 - go to 999 - endif - kkdone=i1-1 - call sleep_msec(0) - write(81,3001) n,kbuf,kk,kkdone - 3001 format(4i10) - enddo - - 999 kkdone=i1-1 - return - end diff --git a/symspec.f90 b/symspec.f90 new file mode 100644 index 000000000..812e0eec4 --- /dev/null +++ b/symspec.f90 @@ -0,0 +1,105 @@ +subroutine symspec(id,kbuf,kk,kkdone,rxnoise,newspec,newdat,ndecoding) + +! Compute spectra at four polarizations, using half-symbol steps. + + parameter (NSMAX=60*96000) + integer*2 id(4,NSMAX) + complex z + real*8 ts,hsym + include 'spcom.f90' + complex cx(NFFT),cy(NFFT) ! pad to 32k with zeros + + 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 +! ntot=279 !Half symbols in 51.8 sec + + if(kkdone.eq.0) then + do ip=1,4 + do i=1,NFFT + szavg(ip,i)=0. + enddo + enddo + ts=1.d0 - hsym + n=0 + endif + + 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 + i1=ts+2*hsym !Next starting sample pointer + 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) + cx(i)=cmplx(xr,xi) + yr=fac*id(3,i0+i) + yi=fac*id(4,i0+i) + cy(i)=cmplx(yr,yi) + enddo + + do i=npts+1,NFFT !Pad to 32k with zeros + cx(i)=0. + cy(i)=0. + enddo + + 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 + ssz(1,n,i)=sx ! Pol = 0 + szavg(1,i)=szavg(1,i) + sx + + z=cx(i) + cy(i) + s45=0.5*(real(z)**2 + aimag(z)**2) + ssz(2,n,i)=s45 ! Pol = 45 + szavg(2,i)=szavg(2,i) + s45 + + sy=real(cy(i))**2 + aimag(cy(i))**2 + ssz(3,n,i)=sy ! Pol = 90 + szavg(3,i)=szavg(3,i) + sy + + z=cx(i) - cy(i) + s135=0.5*(real(z)**2 + aimag(z)**2) + ssz(4,n,i)=s135 ! Pol = 135 + szavg(4,i)=szavg(4,i) + s135 + + z=cx(i)*conjg(cy(i)) + +! Leif's formula: +! ss5(n,i)=0.5*(sx+sy) + (real(z)**2 + aimag(z)**2 - +! + sx*sy)/(sx+sy) + +! Leif's suggestion: +! ss5(n,i)=max(sx,s45,sy,s135) + +! Linearly polarized component, from the Stokes parameters: + q=sx - sy + u=2.0*real(z) +! v=2.0*aimag(z) + ssz5(n,i)=0.707*sqrt(q*q + u*u) + + enddo +! if(n.eq.ntot) then + if(n.ge.279) then + call move(ssz5,ss5,322*NFFT) + newspec=1 + call move(ssz,ss,4*322*NFFT) + call move(szavg,savg,4*NFFT) + newdat=1 + ndecoding=1 + go to 999 + endif + kkdone=i1-1 + nhsym=n + call sleep_msec(0) + write(81,3001) n,kbuf,kk,kkdone +3001 format(4i10) + enddo + +999 kkdone=i1-1 + return +end subroutine symspec