1. New routine "ftpeak65" for peaking up in frequency and time, and for AFC.

2. Removed the "itry" loop in wsjt65, speeding up JT65 decodes.
3. A dded Deep Search to avemsg65.
4. Changed "Decoding" menu accordingly.  Karn RS decoder used only if KV
   decoder not present.
5. Removed sort from deep65; find 1st and 2nd largest values directly.
6. Fixed Makefile.win.  (Still need to fix *nix Makefile.)


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@212 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2006-07-29 16:00:59 +00:00
parent 47d59acb8f
commit 5993b3952d
14 changed files with 433 additions and 128 deletions

View File

@ -38,7 +38,8 @@ SRCS2F77 = wsjt1.f avesp2.f bzap.f spec441.f spec2d.f mtdecode.f \
sync65.f unpackcall.f unpackgrid.f unpackmsg.f unpacktext.f \ sync65.f unpackcall.f unpackgrid.f unpackmsg.f unpacktext.f \
xcor.f xfft.f xfft2.f wsjt65.f astro.f azdist.f coord.f dcoord.f \ xcor.f xfft.f xfft2.f wsjt65.f astro.f azdist.f coord.f dcoord.f \
deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \ deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \
moon2.f MoonDop.f sun.f toxyz.f pfxdump.f moon2.f MoonDop.f sun.f toxyz.f pfxdump.f \
ftpeak65.f fil651.f fil652.f fil653.f symsync65.f
SRCS2C = resample.c ptt.c igray.c wrapkarn.c SRCS2C = resample.c ptt.c igray.c wrapkarn.c

View File

@ -1,9 +1,12 @@
subroutine avemsg65(mseg,mode65,ndepth,decoded,nused,ns,ncount) subroutine avemsg65(mseg,mode65,ndepth,decoded,nused,
+ nq1,nq2,neme,nsked,flip,mycall,hiscall,hisgrid,qual,
+ ns,ncount)
C Decodes averaged JT65 data for the specified segment (mseg=1 or 2). C Decodes averaged JT65 data for the specified segment (mseg=1 or 2).
parameter (MAXAVE=120) !Max avg count is 120 parameter (MAXAVE=120) !Max avg count is 120
character decoded*22 character decoded*22,deepmsg*22
character mycall*12,hiscall*12,hisgrid*6
real s3(64,63) real s3(64,63)
common/ave/ppsave(64,63,MAXAVE),nflag(MAXAVE),nsave,iseg(MAXAVE) common/ave/ppsave(64,63,MAXAVE),nflag(MAXAVE),nsave,iseg(MAXAVE)
@ -12,6 +15,8 @@ C and the number of spectra flagged as good.
nused=0 nused=0
ns=0 ns=0
nqual=0
deepmsg=' '
do i=1,nsave do i=1,nsave
if(iseg(i).eq.mseg) then if(iseg(i).eq.mseg) then
ns=ns+1 ns=ns+1
@ -32,13 +37,24 @@ C Compute the average of all flagged spectra for this segment.
nadd=nused*mode65 nadd=nused*mode65
call extract(s3,nadd,ndepth,ncount,decoded) !Extract the message call extract(s3,nadd,ndepth,ncount,decoded) !Extract the message
100 if(nused.lt.1.or.ncount.lt.0) decoded=' ' if(ncount.lt.0) decoded=' '
nqual=0
C Possibly should pass nadd=nused, also:
if(ndepth.ge.3) then
call deep65(s3,mode65,neme,nsked,flip,
+ mycall,hiscall,hisgrid,deepmsg,qual)
nqual=qual
if(nqual.lt.nq1) deepmsg=' '
if(nqual.ge.nq1 .and. nqual.lt.nq2) deepmsg(19:19)='?'
endif
if(ncount.lt.0) decoded=deepmsg
C Suppress "birdie messages": C Suppress "birdie messages":
if(decoded(1:7).eq.'000AAA ') decoded=' ' if(decoded(1:7).eq.'000AAA ') decoded=' '
if(decoded(1:7).eq.'0L6MWK ') decoded=' ' if(decoded(1:7).eq.'0L6MWK ') decoded=' '
! print*,mseg,nused,' ',decoded 100 if(nused.lt.1) decoded=' '
return return
end end

View File

@ -1,5 +1,5 @@
subroutine decode65(dat,npts,dtx,dfx,flip,ndepth,neme,nsked, subroutine decode65(dat,npts,dtx,dfx,flip,ndepth,neme,nsked,
+ mycall,hiscall,hisgrid,mode65,lsave,ftrack,decoded,ncount, + nsnr,mycall,hiscall,hisgrid,mode65,nafc,decoded,ncount,
+ deepmsg,qual) + deepmsg,qual)
C Decodes JT65 data, assuming that DT and DF have already been determined. C Decodes JT65 data, assuming that DT and DF have already been determined.
@ -8,7 +8,6 @@ C Decodes JT65 data, assuming that DT and DF have already been determined.
real s2(77,126) real s2(77,126)
real s3(64,63) real s3(64,63)
real ftrack(126) real ftrack(126)
logical lsave
character decoded*22,deepmsg*22 character decoded*22,deepmsg*22
character mycall*12,hiscall*12,hisgrid*6 character mycall*12,hiscall*12,hisgrid*6
include 'avecom.h' include 'avecom.h'
@ -19,9 +18,9 @@ C Decodes JT65 data, assuming that DT and DF have already been determined.
istart=nint(dtx/dt) !Start index for synced FFTs istart=nint(dtx/dt) !Start index for synced FFTs
nsym=126 nsym=126
C Compute FFTs of symbols C Compute spectra of the channel symbols
f0=1270.46 + dfx f0=1270.46 + dfx
call spec2d65(dat,npts,nsym,flip,istart,f0,ftrack,mode65,s2) call spec2d65(dat,npts,nsym,flip,istart,f0,ftrack,nafc,mode65,s2)
do j=1,63 do j=1,63
k=mdat(j) !Points to data symbol k=mdat(j) !Points to data symbol
@ -33,9 +32,9 @@ C Compute FFTs of symbols
nadd=mode65 nadd=mode65
call extract(s3,nadd,ndepth,ncount,decoded) !Extract the message call extract(s3,nadd,ndepth,ncount,decoded) !Extract the message
c if(lsave) call deep65(s3,mode65,neme,nsked,flip,mycall,hiscall,hisgrid, qual=0.
call deep65(s3,mode65,neme,nsked,flip,mycall,hiscall,hisgrid, if(ndepth.ge.1) call deep65(s3,mode65,neme,
+ deepmsg,qual) + nsked,flip,mycall,hiscall,hisgrid,deepmsg,qual)
if(ncount.lt.0) decoded=' ' if(ncount.lt.0) decoded=' '
@ -43,15 +42,12 @@ C Suppress "birdie messages":
if(decoded(1:7).eq.'000AAA ') decoded=' ' if(decoded(1:7).eq.'000AAA ') decoded=' '
if(decoded(1:7).eq.'0L6MWK ') decoded=' ' if(decoded(1:7).eq.'0L6MWK ') decoded=' '
C If ncount>=0 or if this is the "0,0" run, save spectrum in ppsave: C Save symbol spectra for possible decoding of average.
C Q: should ftrack be used here?
100 if((ncount.ge.0 .or. lsave)) then
do j=1,63 do j=1,63
k=mdat(j) k=mdat(j)
if(flip.lt.0.0) k=mdat2(j) if(flip.lt.0.0) k=mdat2(j)
call move(s2(8,k),ppsave(1,j,nsave),64) call move(s2(8,k),ppsave(1,j,nsave),64)
enddo enddo
endif
return return
end end

View File

@ -3,7 +3,6 @@
parameter (MAXCALLS=7000,MAXRPT=63) parameter (MAXCALLS=7000,MAXRPT=63)
real s3(64,63) real s3(64,63)
real pp(2*MAXCALLS + 2 + MAXRPT)
character callsign*12,grid*4,message*22,hisgrid*6,c*1,ceme*3 character callsign*12,grid*4,message*22,hisgrid*6,c*1,ceme*3
character*12 mycall,hiscall character*12 mycall,hiscall
character*22 decoded,deepmsg character*22 decoded,deepmsg
@ -75,6 +74,7 @@
mz=1 mz=1
if(n.eq.1 .and. j3.lt.1 .and. j4.lt.1 .and. if(n.eq.1 .and. j3.lt.1 .and. j4.lt.1 .and.
+ flip.gt.0.0) mz=MAXRPT+1 + flip.gt.0.0) mz=MAXRPT+1
C Test for messages with MyCall + HisCall + report
do m=1,mz do m=1,mz
if(m.gt.1) grid=rpt(m-1) if(m.gt.1) grid=rpt(m-1)
if(j3.lt.1 .and.j4.lt.1) if(j3.lt.1 .and.j4.lt.1)
@ -101,44 +101,41 @@
enddo enddo
p1=-1.e30 p1=-1.e30
ip1=0 p2=-1.e30
n=0 n=0
do k=1,ntot do k=1,ntot
C If sync=OOO, no CQ messages C If sync=OOO, no CQ messages
if(flip.lt.0.0 .and. testmsg(k)(1:3).eq.'CQ ') go to 30 if(flip.lt.0.0 .and. testmsg(k)(1:3).eq.'CQ ') go to 30
sum=0. sum=0.
ref=ref0 ref=ref0
nhard=0
do j=1,63 do j=1,63
i=ncode(j,k)+1 i=ncode(j,k)+1
sum=sum + s3(i,j) sum=sum + s3(i,j)
if(i.eq.mrs(j)) then if(i.eq.mrs(j)) then
ref=ref - s3(i,j) + s3(mrs2(j),j) ref=ref - s3(i,j) + s3(mrs2(j),j)
nhard=nhard+1
endif endif
enddo enddo
p=sum/ref p=sum/ref
! p=sum/ref0
n=n+1 n=n+1
pp(n)=p
if(p.gt.p1) then if(p.gt.p1) then
if(p1.gt.p2) then
p2=p1
ip2=ip1
endif
p1=p p1=p
ip1=k ip1=k
sum1=sum else if(p.gt.p2 .and. p.lt.p1) then
ref1=ref p2=p
nhard1=nhard ip2=k
endif endif
30 enddo 30 enddo
ntot=n ntot=n
call sort(ntot,pp)
do i=1,100
if(pp(ntot-i).ne.pp(ntot)) go to 40
enddo
40 if(mode65.eq.1) bias=max(1.12*pp(ntot-i),0.335) 40 if(mode65.eq.1) bias=max(1.12*p2,0.335)
if(mode65.eq.2) bias=max(1.08*pp(ntot-i),0.405) if(mode65.eq.2) bias=max(1.08*p2,0.405)
if(mode65.eq.4) bias=max(1.04*pp(ntot-i),0.505) if(mode65.ge.4) bias=max(1.04*p2,0.505)
qual=100.0*(p1-bias) qual=100.0*(p1-bias)
decoded=' ' decoded=' '
c=' ' c=' '

View File

@ -20,12 +20,13 @@
call interleave63(mrsym,-1) call interleave63(mrsym,-1)
call interleave63(mrprob,-1) call interleave63(mrprob,-1)
ndec=0 ndec=1
nemax=30 nemax=30
maxe=8 maxe=8
if(ndepth.ge.2) ndec=1 ! if(ndepth.ge.2) ndec=1
if(ndepth.eq.2) xlambda=13.0 ! if(ndepth.eq.2) xlambda=13.0
if(ndepth.eq.3) xlambda=15.0 ! if(ndepth.eq.3) xlambda=15.0
xlambda=15.0
if(ndec.eq.1) then if(ndec.eq.1) then
call graycode(mr2sym,63,-1) call graycode(mr2sym,63,-1)

67
fil651.f Normal file
View File

@ -0,0 +1,67 @@
subroutine fil651(d,n1,c,n2)
C FIR lowpass mixing filter designed with ScopeFIR. Real in, complex out.
C fsample = 5512.5 Hz
C Ntaps = 31
C fc = 1000 Hz
C fstop = 1378.125 Hz
C Ripple = 0.5 dB
C Stop Atten = 50 dB
C fmix = 1378.125 Hz
C fout = 2706.25 Hz
parameter (NTAPS=31)
parameter (NH=NTAPS/2)
parameter (NDOWN=2) !Downsample ratio
real d(n1)
complex c(*)
complex ck(-NH:NH)
data ck/
+ (-0.000000073578,-0.000859869243),
+ ( 0.008518289457,-0.000000680308),
+ ( 0.000000834309, 0.011250152594),
+ (-0.001061705254, 0.000000072679),
+ ( 0.000000875897, 0.013958392128),
+ (-0.010047338711, 0.000000573160),
+ ( 0.000000770320, 0.015003869984),
+ (-0.025027880956, 0.000001142192),
+ ( 0.000000285583, 0.007151700551),
+ (-0.043634723888, 0.000001493512),
+ (-0.000000478847,-0.016788108005),
+ (-0.061886192046, 0.000001412144),
+ (-0.000001258694,-0.073548459509),
+ (-0.075261027462, 0.000000858668),
+ (-0.000001749252,-0.306638863572),
+ ( 0.419826269508, 0.000000000000),
+ (-0.000001749252, 0.306638863572),
+ (-0.075261027462,-0.000000858668),
+ (-0.000001258694, 0.073548459509),
+ (-0.061886192046,-0.000001412144),
+ (-0.000000478847, 0.016788108005),
+ (-0.043634723888,-0.000001493512),
+ ( 0.000000285583,-0.007151700551),
+ (-0.025027880956,-0.000001142192),
+ ( 0.000000770320,-0.015003869984),
+ (-0.010047338711,-0.000000573160),
+ ( 0.000000875897,-0.013958392128),
+ (-0.001061705254,-0.000000072679),
+ ( 0.000000834309,-0.011250152594),
+ ( 0.008518289457, 0.000000680308),
+ (-0.000000073578, 0.000859869243)/
n2=(n1-NTAPS+NDOWN)/NDOWN
k0=NH-NDOWN+1
do i=1,n2
c(i)=0.
k=k0 + NDOWN*i
do j=-NH,NH
c(i)=c(i) + d(j+k)*conjg(ck(j))
enddo
enddo
return
end

44
fil652.f Normal file
View File

@ -0,0 +1,44 @@
subroutine fil652(c1,n1,c2,n2)
C FIR lowpass filter designed using ScopeFIR
C fsample = 2756.25 Hz
C Ntaps = 31
C fc = 500 Hz
C fstop = 689.0625 Hz
C Ripple = 0.5 dB
C Stop Atten = 50 dB
C fout = 1378.125 Hz
parameter (NTAPS=31)
parameter (NH=NTAPS/2)
parameter (NDOWN=2) !Downsample ratio
complex c1(n1)
complex c2(*)
C Filter coefficients:
real a(-NH:NH)
data a/
+ -0.000859869246,-0.008518289484,-0.011250152625,-0.001061705256,
+ 0.013958392156, 0.010047338728,-0.015003870003,-0.025027880982,
+ 0.007151700557, 0.043634723913, 0.016788108012,-0.061886192062,
+ -0.073548459520, 0.075261027466, 0.306638863577, 0.419826269508,
+ 0.306638863577, 0.075261027466,-0.073548459520,-0.061886192062,
+ 0.016788108012, 0.043634723913, 0.007151700557,-0.025027880982,
+ -0.015003870003, 0.010047338728, 0.013958392156,-0.001061705256,
+ -0.011250152625,-0.008518289484,-0.000859869246/
n2=(n1-NTAPS+NDOWN)/NDOWN
k0=NH-NDOWN+1
C Loop over all output samples
do i=1,n2
c2(i)=0.
k=k0 + NDOWN*i
do j=-NH,NH
c2(i)=c2(i) + c1(j+k)*a(j)
enddo
enddo
return
end

49
fil653.f Normal file
View File

@ -0,0 +1,49 @@
subroutine fil653(c1,n1,c2,n2)
C FIR lowpass filter designed using ScopeFIR
C fsample = 1378.125 Hz
C Ntaps = 45
C fc = 100 Hz
C fstop = 172.265625 Hz
C Ripple = 0.5 dB
C Stop Atten = 50 dB
C fout = 172.265625 Hz
C BW = 200 Hz
parameter (NTAPS=45)
parameter (NH=NTAPS/2)
parameter (NDOWN=4) !Downsample ratio
complex c1(n1)
complex c2(*)
C Filter coefficients:
real a(-NH:NH)
data a/
+ -0.000005569862,-0.002503777832,-0.004040335617,-0.005717910288,
+ -0.006153385485,-0.004446125293,-0.000305215272, 0.005557289511,
+ 0.011329120672, 0.014496551280, 0.012703875898, 0.004837591829,
+ -0.008060363689,-0.022474422302,-0.032964876083,-0.033575486327,
+ -0.019743889907, 0.009895672340, 0.052467109908, 0.101031155027,
+ 0.146073001698, 0.177927966814, 0.189427119395, 0.177927966814,
+ 0.146073001698, 0.101031155027, 0.052467109908, 0.009895672340,
+ -0.019743889907,-0.033575486327,-0.032964876083,-0.022474422302,
+ -0.008060363689, 0.004837591829, 0.012703875898, 0.014496551280,
+ 0.011329120672, 0.005557289511,-0.000305215272,-0.004446125293,
+ -0.006153385485,-0.005717910288,-0.004040335617,-0.002503777832,
+ -0.000005569862/
n2=(n1-NTAPS+NDOWN)/NDOWN
k0=NH-NDOWN+1
C Loop over all output samples
do i=1,n2
c2(i)=0.
k=k0 + NDOWN*i
do j=-NH,NH
c2(i)=c2(i) + c1(j+k)*a(j)
enddo
enddo
return
end

157
ftpeak65.f Normal file
View File

@ -0,0 +1,157 @@
subroutine ftpeak65(dat,jz,istart,f0,flip,pr,nafc,ftrack)
C Do the the JT65 "peakup" procedure in frequency and time; then
C compute ftrack.
parameter (NMAX=30*11025)
parameter (NS=1024)
real dat(jz)
real pr(126)
real ftrack(126)
complex c2(NMAX/2)
complex c3(NMAX/4)
complex c4(NMAX/16)
complex c5(NMAX/64)
complex c6(NMAX/64)
complex z
real s(NMAX/64)
real ccf(-128:128)
real c(-50:50,8)
real*8 pha,dpha,twopi,dt,fsyncset
twopi=8*datan(1.d0)
fsyncset=-300.d0
dt=2.d0/11025.d0 !Input dt (WSJT has downsampled by 2)
call fil651(dat,jz,c2,n2) !Filter and complex mix; rate 1/2
dt=2.d0*dt !We're now downsampled by 4
dpha=twopi*dt*(f0-fsyncset) !Put sync tone at fsyncset
pha=0.
do i=1,n2
pha=pha+dpha
c2(i)=c2(i) * cmplx(cos(pha),-sin(pha))
enddo
call fil652(c2,n2,c3,n3) !Low-pass at +/- 500 Hz; rate 1/2
dt=2.d0*dt !Down by 8
dpha=twopi*dt*fsyncset !Mix sync tone to f=0
pha=0.
do i=1,n3
pha=pha+dpha
c3(i)=c3(i) * cmplx(cos(pha),-sin(pha))
enddo
call fil653(c3,n3,c4,n4) !Low-pass at +/- 100 Hz; rate 1/4
dt=4.d0*dt !Down by 32
call fil653(c4,n4,c5,n5) !Low-pass at +/- 25 Hz; rate 1/4
dt=4.d0*dt !Down by 128
C Use f0 and istart (as found by sync65) and do CCFs against the
C pr(126) array to get improved symbol synchronization.
C NB: if istart is increased by 64, kpk will decrease by 1.
k0=nint(istart/64.0 - 7.0)
call symsync65(c5,n5,k0,s,flip,pr,16,kpk,ccf,smax)
C Fix up the value of istart. (The -1 is empirical.)
istart=istart + 64.0*(kpk-1.0)
C OK, we have symbol synchronization. Now find peak ccf value as a
C function of DF, for each group of 16 symbols.
C What about using filter fil657?
df=0.25*11025.0/4096.0 !Oversample to get accurate peak
idfmax=50
iz=n5-31
do idf=-idfmax,idfmax
dpha=twopi*idf*df*dt
pha=0.
do i=1,iz
pha=pha+dpha
c6(i)=c5(i) * cmplx(cos(pha),-sin(pha))
enddo
z=0.
do i=1,32
z=z + c6(i)
enddo
s(1)=real(z)*real(z) + aimag(z)*aimag(z)
do i=33,n5
z=z + c6(i) - c6(i-32)
s(i-31)=real(z)*real(z) + aimag(z)*aimag(z)
enddo
do n=1,8
ia=nint((n-1)*126.0/8.0 + 1.0)
ib=ia+15
sum=0.
do i=ia,ib
j=32*(i-1) + k0 + kpk
if(j.ge.1 .and. j.le.iz) sum=sum + flip*pr(i)*s(j)
enddo
c(idf,n)=sum/smax
enddo
enddo
C Get drift rate and compute ftrack.
! call getfdot(c,nafc,ftrack)
jmax=0
if(nafc.eq.1) jmax=25
ssmax=0.
do j=-jmax,jmax
do i=-25,25
ss=0.
xj=j/7.0
do n=1,8
k=nint(i+(n-4.5)*xj)
ss=ss + c(k,n)
enddo
if(ss.gt.ssmax) then
ssmax=ss
ipk=i
jpk=j
endif
enddo
enddo
df=0.25*11025.0/4096.0
dfreq=ipk*df
fdot=jpk*df*60.0/(0.875*46.8)
do i=1,126
ftrack(i)=dfreq + fdot*(46.8/60.0)*(i-63.5)/126.0
enddo
pha=0.
i0=k0 + kpk + 2000
do i=1,iz
k=nint(63.5 + (i-i0)/32.0)
if(k.lt.1) k=1
if(k.gt.126) k=126
dpha=twopi*dt*ftrack(k)
pha=pha+dpha
c6(i)=c5(i) * cmplx(cos(pha),-sin(pha))
enddo
z=0.
do i=1,32
z=z + c6(i)
enddo
s(1)=real(z)*real(z) + aimag(z)*aimag(z)
do i=33,n5
z=z + c6(i) - c6(i-32)
s(i-31)=real(z)*real(z) + aimag(z)*aimag(z)
enddo
sum=0.
do i=1,126
j=32*(i-1)+k0+kpk
if(j.ge.1 .and. j.le.iz) sum=sum + flip*pr(i)*s(j)
enddo
return
end

View File

@ -1,5 +1,5 @@
subroutine spec2d65(dat,jz,nsym,flip,istart,f0, subroutine spec2d65(dat,jz,nsym,flip,istart,f0,
+ ftrack,mode65,s2) + ftrack,nafc,mode65,s2)
C Computes the spectrum for each of 126 symbols. C Computes the spectrum for each of 126 symbols.
C NB: At this point, istart, f0, and ftrack are supposedly known. C NB: At this point, istart, f0, and ftrack are supposedly known.
@ -22,12 +22,19 @@ c complex work(NMAX)
data twopi/6.28318530718d0/ data twopi/6.28318530718d0/
save save
C Peak up in frequency and time, and compute ftrack.
call ftpeak65(dat,jz,istart,f0,flip,pr,nafc,ftrack)
nfft=2048/mode65 !Size of FFTs nfft=2048/mode65 !Size of FFTs
nh=nfft/2 nh=nfft/2
dt=2.0/11025.0 dt=2.0/11025.0
df=0.5*11025.0/nfft df=0.5*11025.0/nfft
call zero(ps,77) call zero(ps,77)
k=istart-nfft k=istart-nfft
C NB: this could be done starting with array c3, in ftpeak65, instead
C of the dat() array. Would save some time this way ...
do j=1,nsym do j=1,nsym
call zero(s,77) call zero(s,77)
do m=1,mode65 do m=1,mode65

View File

@ -1,5 +1,5 @@
subroutine sync65(dat,jz,DFTolerance,NFreeze,NAFC,MouseDF, subroutine sync65(dat,jz,DFTolerance,NFreeze,NAFC,MouseDF,
+ dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width,ftrack) + dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width)
C Synchronizes JT65 data, finding the best-fit DT and DF. C Synchronizes JT65 data, finding the best-fit DT and DF.
C NB: at this stage, submodes ABC are processed in the same way. C NB: at this stage, submodes ABC are processed in the same way.
@ -16,7 +16,6 @@ C NB: at this stage, submodes ABC are processed in the same way.
real ccfred(-224:224) !Peak of ccfblue, as function of freq real ccfred(-224:224) !Peak of ccfblue, as function of freq
real tmp(450) real tmp(450)
integer itry(100) integer itry(100)
real ftrack(126)
save save
C Do FFTs of symbol length, stepped by half symbols. Note that we have C Do FFTs of symbol length, stepped by half symbols. Note that we have
@ -95,15 +94,6 @@ C If we found nothing with snrx > -30 dB, take the best sync that *was* found.
flippk=flippk2 flippk=flippk2
endif endif
C Generate frequency-tracking information
if(NAFC.eq.1) then
call afc65(s2,ipk,lagpk,flippk,ftrack)
else
do j=1,126
ftrack(j)=0.
enddo
endif
C Peak up in frequency to fraction of channel C Peak up in frequency to fraction of channel
base=0.25*(psavg(ipk-3)+psavg(ipk-2)+psavg(ipk+2)+psavg(ipk+3)) base=0.25*(psavg(ipk-3)+psavg(ipk-2)+psavg(ipk+2)+psavg(ipk+3))
! call peakup(psavg(ipk-1),psavg(ipk),psavg(ipk+1),dx) ! call peakup(psavg(ipk-1),psavg(ipk),psavg(ipk+1),dx)
@ -177,4 +167,3 @@ C Compute width of sync tone to outermost -3 dB points
return return
end end
include 'afc65.f'

20
wsjt.py
View File

@ -1,4 +1,4 @@
#------------------------------------------------------------------ WSJT #------------------------------------------------------------------- WSJT
from Tkinter import * from Tkinter import *
from tkFileDialog import * from tkFileDialog import *
import Pmw import Pmw
@ -64,7 +64,6 @@ mode=StringVar()
mode.set("") mode.set("")
mrudir=os.getcwd() mrudir=os.getcwd()
nafc=IntVar() nafc=IntVar()
naggressive=IntVar()
naz=0 naz=0
ndepth=IntVar() ndepth=IntVar()
nel=0 nel=0
@ -1500,7 +1499,6 @@ def update():
Audio.gcom2.neme=neme.get() Audio.gcom2.neme=neme.get()
Audio.gcom2.ndepth=ndepth.get() Audio.gcom2.ndepth=ndepth.get()
Audio.gcom2.nsked=nsked.get() Audio.gcom2.nsked=nsked.get()
Audio.gcom2.naggressive=naggressive.get()
try: try:
Audio.gcom2.idinterval=options.IDinterval.get() Audio.gcom2.idinterval=options.IDinterval.get()
except: except:
@ -1602,12 +1600,16 @@ decodemenu.FSK441=Menu(decodemenu,tearoff=0)
decodemenu.FSK441.add_checkbutton(label='No shorthands',variable=nosh441) decodemenu.FSK441.add_checkbutton(label='No shorthands',variable=nosh441)
decodemenu.JT65=Menu(decodemenu,tearoff=0) decodemenu.JT65=Menu(decodemenu,tearoff=0)
decodemenu.JT65.add_checkbutton(label='Only EME calls',variable=neme) decodemenu.JT65.add_checkbutton(label='Only EME calls',variable=neme)
decodemenu.JT65.add_checkbutton(label='Aggressive',variable=naggressive)
decodemenu.JT65.add_checkbutton(label='No Shorthands if Tx 1',variable=noshjt65) decodemenu.JT65.add_checkbutton(label='No Shorthands if Tx 1',variable=noshjt65)
decodemenu.JT65.add_separator() decodemenu.JT65.add_separator()
decodemenu.JT65.add_radiobutton(label = 'Fast', variable=ndepth, value=1) decodemenu.JT65.add_radiobutton(label = 'No Deep Search',
decodemenu.JT65.add_radiobutton(label = 'Normal', variable=ndepth, value=2) variable=ndepth, value=0)
decodemenu.JT65.add_radiobutton(label = 'Exhaustive', variable=ndepth, value=3) decodemenu.JT65.add_radiobutton(label = 'Normal Deep Search',
variable=ndepth, value=1)
decodemenu.JT65.add_radiobutton(label = 'Aggressive Deep Search',
variable=ndepth, value=2)
decodemenu.JT65.add_radiobutton(label ='Include Average in Aggressive Deep Search',
variable=ndepth, value=3)
decodemenu.add_cascade(label = 'FSK441',menu=decodemenu.FSK441) decodemenu.add_cascade(label = 'FSK441',menu=decodemenu.FSK441)
decodemenu.add_cascade(label = 'JT65',menu=decodemenu.JT65) decodemenu.add_cascade(label = 'JT65',menu=decodemenu.JT65)
@ -1965,7 +1967,7 @@ ldate.after(100,update)
lauto=0 lauto=0
isync=1 isync=1
ntx.set(1) ntx.set(1)
ndepth.set(2) ndepth.set(1)
import options import options
options.defaults() options.defaults()
@ -2079,7 +2081,6 @@ try:
elif key == 'Sked': nsked.set(value) elif key == 'Sked': nsked.set(value)
elif key == 'NoSh441': nosh441.set(value) elif key == 'NoSh441': nosh441.set(value)
elif key == 'NoShJT65': noshjt65.set(value) elif key == 'NoShJT65': noshjt65.set(value)
elif key == 'Aggressive': naggressive.set(value)
elif key == 'NEME': neme.set(value) elif key == 'NEME': neme.set(value)
elif key == 'NDepth': ndepth.set(value) elif key == 'NDepth': ndepth.set(value)
elif key == 'Debug': ndebug.set(value) elif key == 'Debug': ndebug.set(value)
@ -2174,7 +2175,6 @@ f.write("NAFC " + str(nafc.get()) + "\n")
f.write("Sked " + str(nsked.get()) + "\n") f.write("Sked " + str(nsked.get()) + "\n")
f.write("NoSh441 " + str(nosh441.get()) + "\n") f.write("NoSh441 " + str(nosh441.get()) + "\n")
f.write("NoShJT65 " + str(noshjt65.get()) + "\n") f.write("NoShJT65 " + str(noshjt65.get()) + "\n")
f.write("Aggressive " + str(naggressive.get()) + "\n")
f.write("NEME " + str(neme.get()) + "\n") f.write("NEME " + str(neme.get()) + "\n")
f.write("NDepth " + str(ndepth.get()) + "\n") f.write("NDepth " + str(ndepth.get()) + "\n")
f.write("Debug " + str(ndebug.get()) + "\n") f.write("Debug " + str(ndebug.get()) + "\n")

View File

@ -198,7 +198,7 @@ C Intentionally degrade SNR by -nclip dB.
! Offset data by about 1 s. ! Offset data by about 1 s.
if(jz.ge.126*2048) call wsjt65(dat(4097),jz-4096,cfile6, if(jz.ge.126*2048) call wsjt65(dat(4097),jz-4096,cfile6,
+ NClearAve,MinSigdB,DFTolerance,NFreeze,NAFC,mode65,Nseg, + NClearAve,MinSigdB,DFTolerance,NFreeze,NAFC,mode65,Nseg,
+ MouseDF,NAgain,naggressive,ndepth,neme,nsked, + MouseDF,NAgain,ndepth,neme,nsked,
+ mycall,hiscall,hisgrid,lumsg,lcum,nspecial,ndf, + mycall,hiscall,hisgrid,lumsg,lcum,nspecial,ndf,
+ nstest,dfsh,iderrsh,idriftsh,snrsh, + nstest,dfsh,iderrsh,idriftsh,snrsh,
+ NSyncOK,ccf,psavg,ndiag,nwsh) + NSyncOK,ccf,psavg,ndiag,nwsh)

View File

@ -1,6 +1,6 @@
subroutine wsjt65(dat,npts,cfile6,NClearAve,MinSigdB, subroutine wsjt65(dat,npts,cfile6,NClearAve,MinSigdB,
+ DFTolerance,NFreeze,NAFC,mode65,Nseg,MouseDF,NAgain, + DFTolerance,NFreeze,NAFC,mode65,Nseg,MouseDF,NAgain,
+ naggressive,ndepth,neme,nsked,mycall,hiscall,hisgrid, + ndepth,neme,nsked,mycall,hiscall,hisgrid,
+ lumsg,lcum,nspecial,ndf,nstest,dfsh,iderrsh,idriftsh, + lumsg,lcum,nspecial,ndf,nstest,dfsh,iderrsh,idriftsh,
+ snrsh,NSyncOK,ccfblue,ccfred,ndiag,nwsh) + snrsh,NSyncOK,ccfblue,ccfred,ndiag,nwsh)
@ -37,6 +37,8 @@ C already been done.
ave2=' ' ave2=' '
endif endif
naggressive=0
if(ndepth.ge.2) naggressive=1
nq1=3 nq1=3
nq2=6 nq2=6
if(naggressive.eq.1) nq1=1 if(naggressive.eq.1) nq1=1
@ -55,10 +57,11 @@ C already been done.
C Attempt to synchronize: look for sync tone, get DF and DT. C Attempt to synchronize: look for sync tone, get DF and DT.
call sync65(dat,npts,DFTolerance,NFreeze,NAFC,MouseDF, call sync65(dat,npts,DFTolerance,NFreeze,NAFC,MouseDF,
+ dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width,ftrack) + dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width)
f0=1270.46 + dfx f0=1270.46 + dfx
csync=' ' csync=' '
decoded=' ' decoded=' '
deepmsg=' '
special=' ' special=' '
cooo=' ' cooo=' '
itry=0 itry=0
@ -66,7 +69,6 @@ C Attempt to synchronize: look for sync tone, get DF and DT.
ncount1=-1 !Flag for RS Decode of ave1 ncount1=-1 !Flag for RS Decode of ave1
ncount2=-1 !Flag for RS Decode of ave2 ncount2=-1 !Flag for RS Decode of ave2
NSyncOK=0 NSyncOK=0
qbest=0.
if(nsave.lt.MAXAVE .and. (NAgain.eq.0 .or. NClearAve.eq.1)) if(nsave.lt.MAXAVE .and. (NAgain.eq.0 .or. NClearAve.eq.1))
+ nsave=nsave+1 + nsave=nsave+1
@ -110,51 +112,15 @@ C If we get here, we have achieved sync!
cooo='O ?' cooo='O ?'
endif endif
C Do a "peakup search" over DT, looking for successful call decode65(dat,npts,dtx,dfx,flip,ndepth,neme,nsked,
C result from the Reed-Solomon decoder. + nsnr,mycall,hiscall,hisgrid,mode65,nafc,decoded,
itrymax=1
if(ndepth.eq.2) itrymax=1
if(ndepth.eq.3) itrymax=5
do itry=1,itrymax
idt=itf(1,itry)
idf=itf(2,itry)
dtxx=dtx + idt*0.036 !### Was 0.012 ###
dfxx=dfx + mode65*idf*1.346
lmid=.false.
if(itry.eq.1) lmid=.true.
call decode65(dat,npts,dtxx,dfxx,flip,ndepth,neme,nsked,
+ mycall,hiscall,hisgrid,mode65,lmid,ftrack,decoded,
+ ncount,deepmsg,qual) + ncount,deepmsg,qual)
if(ncount.eq.-999) then if(ncount.eq.-999) qual=0 !Bad data
qbest=0 !Bad data 200 kvqual=0
go to 200
endif
if(qual.gt.qbest) then
qbest=qual
dtbest=dtxx
dfbest=dfxx
deepbest=deepmsg
itrybest=itry
endif
if(ncount.ge.0) then
dtx=dtxx !Successful decode
dfx=dfxx
go to 200
endif
enddo
itry=itrybest
ncount=-1
200 continue
kvqual=0
if(ncount.ge.0) kvqual=1 if(ncount.ge.0) kvqual=1
nqual=min(qbest,10.0) nqual=qual
if(nqual.ge.nq1 .and.kvqual.eq.0) then if(ndiag.eq.0 .and. nqual.gt.10) nqual=10
dtx=dtbest if(nqual.ge.nq1 .and.kvqual.eq.0) decoded=deepmsg
dfx=dfbest
decoded=deepbest
endif
ndf=nint(dfx) ndf=nint(dfx)
if(flip.lt.0.0 .and. (kvqual.eq.1 .or. nqual.ge.nq2)) cooo='OOO' if(flip.lt.0.0 .and. (kvqual.eq.1 .or. nqual.ge.nq2)) cooo='OOO'
@ -165,8 +131,8 @@ C result from the Reed-Solomon decoder.
if(c1.ge.'a' .and. c1.le.'z') decoded(i:i)=char(ichar(c1)-32) if(c1.ge.'a' .and. c1.le.'z') decoded(i:i)=char(ichar(c1)-32)
enddo enddo
write(line,1010) cfile6,nsync,nsnr,dtx-1.0,ndf, write(line,1010) cfile6,nsync,nsnr,dtx-1.0,ndf,
+ nint(width),csync,special,decoded(1:19),cooo,kvqual,nqual,itry + nint(width),csync,special,decoded(1:19),cooo,kvqual,nqual
1010 format(a6,i3,i5,f5.1,i5,i3,1x,a1,1x,a5,a19,1x,a3,i4,i3,i2) 1010 format(a6,i3,i5,f5.1,i5,i3,1x,a1,1x,a5,a19,1x,a3,i4,i4)
C Blank DT if shorthand message (### wrong logic? ###) C Blank DT if shorthand message (### wrong logic? ###)
if(special.ne.' ') then if(special.ne.' ') then
@ -188,31 +154,46 @@ C Write decoded msg unless this is an "Exclude" request:
if(MinSigdB.lt.99) write(lumsg,1011) line if(MinSigdB.lt.99) write(lumsg,1011) line
if(nsave.ge.1) call avemsg65(1,mode65,ndepth,avemsg1,nused1, if(nsave.ge.1) call avemsg65(1,mode65,ndepth,avemsg1,nused1,
+ nq1,nq2,neme,nsked,flip,mycall,hiscall,hisgrid,qual1,
+ ns1,ncount1) + ns1,ncount1)
if(nsave.ge.1) call avemsg65(2,mode65,ndepth,avemsg2,nused2, if(nsave.ge.1) call avemsg65(2,mode65,ndepth,avemsg2,nused2,
+ nq1,nq2,neme,nsked,flip,mycall,hiscall,hisgrid,qual2,
+ ns2,ncount2) + ns2,ncount2)
nqual1=qual1
nqual2=qual2
if(ndiag.eq.0 .and. nqual1.gt.10) nqual1=10
if(ndiag.eq.0 .and. nqual2.gt.10) nqual2=10
nc1=0
nc2=0
if(ncount1.ge.0) nc1=1
if(ncount2.ge.0) nc2=1
C Write the average line C Write the average line
if(ns1.ge.1 .and. ns1.ne.ns10) then ! if(ns1.ge.1 .and. ns1.ne.ns10) then
if(ns1.lt.10) write(ave1,1021) cfile6,1,nused1,ns1,avemsg1 if(ns1.ge.1) then
1021 format(a6,i3,i4,'/',i1,20x,a19) 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, if(ns1.ge.10 .and. nsave.le.99) write(ave1,1022) cfile6,
+ 1,nused1,ns1,avemsg1 + 1,nused1,ns1,avemsg1,nc1,nqual1
1022 format(a6,i3,i4,'/',i2,19x,a19) 1022 format(a6,i3,i4,'/',i2,19x,a19,i8,i4)
if(ns1.ge.100) write(ave1,1023) cfile6,1,nused1,ns1, if(ns1.ge.100) write(ave1,1023) cfile6,1,nused1,ns1,
+ avemsg1 + avemsg1,nc1,nqual1
1023 format(a6,i3,i4,'/',i3,18x,a19) 1023 format(a6,i3,i4,'/',i3,18x,a19,i8,i4)
if(lcum .and. (avemsg1.ne.' ')) if(lcum .and. (avemsg1.ne.' '))
+ write(21,1011) ave1(1:57)//' ' + write(21,1011) ave1(1:57)//' '
ns10=ns1 ns10=ns1
endif endif
C If Monitor segment #2 is available, write that line also C If Monitor segment #2 is available, write that line also
if(ns2.ge.1 .and. ns2.ne.ns20) then ! if(ns2.ge.1 .and. ns2.ne.ns20) then !***Why the 2nd part?? ***
if(ns2.lt.10) write(ave2,1021) cfile6,2,nused2,ns2,avemsg2 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, if(ns2.ge.10 .and. nsave.le.99) write(ave2,1022) cfile6,
+ 2,nused2,ns2,avemsg2 + 2,nused2,ns2,avemsg2,nc2,nqual2
if(ns2.ge.100) write(ave2,1023) cfile6,2,nused2,ns2,avemsg2 if(ns2.ge.100) write(ave2,1023) cfile6,2,nused2,ns2,avemsg2,
+ nc2,nqual2
if(lcum .and. (avemsg2.ne.' ')) if(lcum .and. (avemsg2.ne.' '))
+ write(21,1011) ave2(1:57)//' ' + write(21,1011) ave2(1:57)//' '
ns20=ns2 ns20=ns2