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
This commit is contained in:
Joe Taylor 2007-06-28 15:14:35 +00:00
parent 26524d0528
commit 53c2f619f2
7 changed files with 172 additions and 176 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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'

View File

@ -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