From c9500abcf80f6895c2dbb610427a56cb57ab620e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 19 Sep 2006 18:55:21 +0000 Subject: [PATCH] Cleaned up a number of details related to the new 5 kHz spectral range. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@299 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- flat1.f | 2 +- lpf1.f | 3 +++ short65.f | 50 ++++++++++++++++++++++++++++---------------------- specjt.py | 7 ++++--- sync65.f | 5 +++-- wsjt.py | 28 ++++++++++++++-------------- wsjt1.F | 4 ++-- wsjt65.f | 9 ++++++--- 8 files changed, 61 insertions(+), 47 deletions(-) diff --git a/flat1.f b/flat1.f index ebf15f737..9eba653e0 100644 --- a/flat1.f +++ b/flat1.f @@ -2,7 +2,7 @@ real psavg(nh) real s2(nhmax,nsmax) - real x(4096),tmp(33) + real x(8192),tmp(33) nsmo=33 ia=nsmo/2 + 1 diff --git a/lpf1.f b/lpf1.f index 2883c8d53..4a5188f8e 100644 --- a/lpf1.f +++ b/lpf1.f @@ -45,6 +45,9 @@ C Shift frequency up or down by ndf Hz: do i=nh,-i0,-1 c(i)=c(i+i0) enddo + do i=0,-i0-1 + c(i)=0. + enddo else do i=0,nh-i0 c(i)=c(i+i0) diff --git a/short65.f b/short65.f index f79c8e752..f389f6cfb 100644 --- a/short65.f +++ b/short65.f @@ -1,6 +1,6 @@ subroutine short65(data,jz,NFreeze,MouseDF,DFTolerance, + mode65,nspecialbest,nstest,dfsh,iderrbest,idriftbest, - + snrdb,ss1a,ss2a,nwsh) + + snrdb,ss1a,ss2a,nwsh,idfsh) C Checks to see if this might be a shorthand message. C This is done before zapping, downsampling, or normal decoding. @@ -8,19 +8,18 @@ C This is done before zapping, downsampling, or normal decoding. parameter (NP2=60*11025) !Size of data array parameter (NFFT=16384) !FFT length parameter (NH=NFFT/2) !Step size - parameter (NQ=NFFT/4) !Saved spectral points parameter (MAXSTEPS=60*11025/NH) !Max # of steps real data(jz) integer DFTolerance real s2(NH,MAXSTEPS) !2d spectrum - real ss(NQ,4) !Save spectra in four phase bins - real psavg(NQ) + real ss(NH,4) !Save spectra in four phase bins + real psavg(NH) real sigmax(4) !Peak of spectrum at each phase real ss1a(-224:224) !Lower magenta curve real ss2a(-224:224) !Upper magenta curve - real ss1(-473:1227) !Lower magenta curve (temp) - real ss2(-473:1227) !Upper magenta curve (temp) + real ss1(-473:1784) !Lower magenta curve (temp) + real ss2(-473:1784) !Upper magenta curve (temp) real ssavg(-10:10) integer ipk(4) !Peak bin at each phase save @@ -30,38 +29,37 @@ C This is done before zapping, downsampling, or normal decoding. df=11025.0/NFFT C Do 16 k FFTs, stepped by 8k. (*** Maybe should step by 4k? ***) - call zero(psavg,NQ) + call zero(psavg,NH) nsteps=(jz-NH)/(4*NH) nsteps=4*nsteps !Number of steps do j=1,nsteps k=(j-1)*NH + 1 call ps(data(k),NFFT,s2(1,j)) !Get power spectra if(mode65.eq.4) then - call smooth(s2(1,j),NQ) - call smooth(s2(1,j),NQ) + call smooth(s2(1,j),NH) + call smooth(s2(1,j),NH) endif - call add(psavg,s2(1,j),psavg,NQ) + call add(psavg,s2(1,j),psavg,NH) enddo - call flat1(psavg,s2,NQ,nsteps,NH,MAXSTEPS) + call flat1(psavg,s2,NH,nsteps,NH,MAXSTEPS) nfac=40*mode65 dtstep=0.5/df fac=dtstep/(60.0*df) C Define range of frequencies to be searched - fa= 670.46 - fb=1870.46 + fa=max(200.0,1270.46+MouseDF-600.0) + fb=min(4800.0,1270.46+MouseDF+600.0) ia=fa/df ib=fb/df + 4.1*nfac !Upper tone is above sync tone by 4*nfac*df Hz - if(ib.gt.NQ) ib=NQ if(NFreeze.eq.1) then - fa=max( 670.46,1270.46+MouseDF-DFTolerance) - fb=min(1870.46,1270.46+MouseDF+DFTolerance) + fa=max(200.0,1270.46+MouseDF-DFTolerance) + fb=min(4800.0,1270.46+MouseDF+DFTolerance) endif ia2=fa/df ib2=fb/df + 4.1*nfac !Upper tone is above sync tone by 4*nfac*df Hz - if(ib2.gt.NQ) ib2=NQ + if(ib2.gt.NH) ib2=NH C Find strongest line in each of the 4 phases, repeating for each drift rate. sbest=0. @@ -69,7 +67,7 @@ C Find strongest line in each of the 4 phases, repeating for each drift rate. idz=6.0/df !Is this the right drift range? do idrift=-idz,idz drift=idrift*df*60.0/49.04 - call zero(ss,4*NQ) !Clear the accumulating array + call zero(ss,4*NH) !Clear the accumulating array do j=1,nsteps n=mod(j-1,4)+1 k=nint((j-nsteps/2)*drift*fac) + ia @@ -139,8 +137,8 @@ C Find strongest line in each of the 4 phases, repeating for each drift rate. ipk2=ntmp endif - call zero(ss1,1701) - call zero(ss2,1701) + call zero(ss1,2258) + call zero(ss2,2258) do i=ia2,ib2,4 f=df*i k=nint((f-1270.46)/df4) @@ -175,9 +173,17 @@ C Find strongest line in each of the 4 phases, repeating for each drift rate. nwsh=nint(x*df4) endif +C See if orange/magenta curves need to be shifted: + idfsh=0 + if(mousedf.lt.-600) idfsh=-670 + if(mousedf.gt.600) idfsh=1000 + if(mousedf.gt.1600) idfsh=2000 + if(mousedf.gt.2600) idfsh=3000 + i0=nint(idfsh/df4) + do i=-224,224 - ss1a(i)=ss1(i) - ss2a(i)=ss2(i) + ss1a(i)=ss1(i+i0) + ss2a(i)=ss2(i+i0) enddo return diff --git a/specjt.py b/specjt.py index 946a19bdc..4a0d247fb 100644 --- a/specjt.py +++ b/specjt.py @@ -367,7 +367,8 @@ def update(): if(fmid<>fmid0 or frange<>frange0): if fmid<1000*nfr.get(): fmid=1000*nfr.get() if fmid>5000-1000*nfr.get(): fmid=5000-1000*nfr.get() - draw_axis() +# draw_axis() + df_mark() fmid0=fmid frange0=frange Audio.gcom2.nfmid=int(fmid) @@ -454,9 +455,9 @@ setupmenu.add_separator() setupmenu.add('command', label = 'Rx volume control', command = rx_volume) setupmenu.add('command', label = 'Tx volume control', command = tx_volume) setupmenu.add_separator() -setupmenu.add_radiobutton(label='Frequency axis',command=draw_axis, +setupmenu.add_radiobutton(label='Frequency axis',command=df_mark, value=0,variable=naxis) -setupmenu.add_radiobutton(label='JT65 DF axis',command=draw_axis, +setupmenu.add_radiobutton(label='JT65 DF axis',command=df_mark, value=1,variable=naxis) setupmenu.add_separator() setupmenu.palettes=Menu(setupmenu,tearoff=0) diff --git a/sync65.f b/sync65.f index d86505331..581cd063b 100644 --- a/sync65.f +++ b/sync65.f @@ -40,13 +40,14 @@ C Compute power spectrum for each step and get average C Find the best frequency channel for CCF famin= 670.46 fbmax=1870.46 -! famin=200 -! fbmax=3800 fa=famin fb=fbmax if(NFreeze.eq.1) then fa=max(famin,1270.46+MouseDF-DFTolerance) fb=min(fbmax,1270.46+MouseDF+DFTolerance) + else + fa=max(famin,1270.46+MouseDF-600) + fb=min(fbmax,1270.46+MouseDF+600) endif ia=fa/df ib=fb/df diff --git a/wsjt.py b/wsjt.py index 64d05bd6a..6a8976783 100644 --- a/wsjt.py +++ b/wsjt.py @@ -1,4 +1,4 @@ -#------------------------------------------------------------------ WSJT +#------------------------------------------------------------------- WSJT # $Date$ $Revision$ # from Tkinter import * @@ -48,8 +48,8 @@ isync6m=-10 isync65=1 isync_save=0 iclip=0 -itol=5 -ntol=(10,25,50,100,200,400) #List of available tolerances +itol=5 #Default tol=400 Hz +ntol=(10,25,50,100,200,400,600) #List of available tolerances idsec=0 #irdsec=0 lauto=0 @@ -523,7 +523,7 @@ def ModeFSK441(event=NONE): report.configure(state=NORMAL) shmsg.configure(state=NORMAL) graph2.configure(bg='black') - itol=5 + itol=4 inctol() ntx.set(1) GenStdMsgs() @@ -552,7 +552,7 @@ def ModeJT65(): report.configure(state=DISABLED) shmsg.configure(state=DISABLED) graph2.configure(bg='#66FFFF') - itol=5 + itol=4 inctol() nfreeze.set(0) ntx.set(1) @@ -857,7 +857,7 @@ def decclip(event): #------------------------------------------------------ inctol def inctol(event=NONE): global itol - if itol<5: itol=itol+1 + if itol<6: itol=itol+1 ltol.configure(text='Tol '+str(ntol[itol])) #------------------------------------------------------ dectol @@ -1011,7 +1011,7 @@ def mouse_click_g1(event): global nopen if not nopen: if mode.get()[:4]=="JT65": - Audio.gcom2.mousedf=int((event.x-250)*2.4) + Audio.gcom2.mousedf=int(Audio.gcom2.idf+(event.x-250)*2.4) else: if Audio.gcom2.ndecoding==0: #If decoder is busy, ignore Audio.gcom2.nagain=1 @@ -1168,7 +1168,7 @@ def plot_large(): else: y1=[] y2=[] - for i in range(446): #Find ymax for red curve + for i in range(446): #Find ymax for magenta/orange curves ss1=Audio.gcom2.ss1[i+1] y1.append(ss1) ss2=Audio.gcom2.ss2[i+1] @@ -1179,7 +1179,7 @@ def plot_large(): xy1=[] xy2=[] fac=500.0/446.0 - for i in range(446): #Make xy list for red curve + for i in range(446): #Make xy list for magenta/orange curves x=i*fac ss1=Audio.gcom2.ss1[i+1] n=int(90.0-yfac*ss1) @@ -1386,14 +1386,14 @@ def update(): msg1.configure(text="%6.4f %6.4f" % (samfac_in,samfac_out)) msg2.configure(text=mode.get()) - t="FreezeDF:%4d" % (int(Audio.gcom2.mousedf),) + t="Freeze DF:%4d" % (int(Audio.gcom2.mousedf),) if abs(int(Audio.gcom2.mousedf))>600: msg3.configure(text=t,fg='black',bg='red') else: msg3.configure(text=t,fg='black',bg='gray85') - bdecode.configure(bg='gray85') - if Audio.gcom2.ndecoding: #Set button bg=light_blue - bdecode.configure(bg='#66FFFF') #while decoding + bdecode.configure(bg='gray85',highlightbackground='red') + if Audio.gcom2.ndecoding: #Set button bg=light_blue while decoding + bdecode.configure(bg='#66FFFF',highlightbackground='red') if mode.get()[:2]=="CW": msg5.configure(text="TR Period: %d s" % (Audio.gcom1.trperiod,), \ bg='white') @@ -2018,7 +2018,6 @@ lauto=0 isync=1 ntx.set(1) ndepth.set(1) - import options options.defaults() ModeFSK441() @@ -2167,6 +2166,7 @@ Audio.gcom2.appdir=(appdir+' Audio.gcom2.ndepth=ndepth.get() Audio.ftn_init() GenStdMsgs() +print 'D ',itol,ntol[itol] Audio.gcom4.addpfx=(options.addpfx.get().lstrip()+' ')[:8] stopmon() first=1 diff --git a/wsjt1.F b/wsjt1.F index f0eeba1c4..94dbc8063 100644 --- a/wsjt1.F +++ b/wsjt1.F @@ -169,7 +169,7 @@ C Intentionally degrade SNR by -nclip dB. nstest=0 if(ntx2.ne.1) call short65(dat,jz,NFreeze,MouseDF, + DFTolerance,mode65,nspecial,nstest,dfsh,iderrsh, - + idriftsh,snrsh,ss1,ss2,nwsh) + + idriftsh,snrsh,ss1,ss2,nwsh,idfsh) ! Lowpass filter and decimate by 2 call lpf1(dat,jz,jz2,MouseDF,MouseDF2) idf=mousedf-mousedf2 @@ -190,7 +190,7 @@ C Intentionally degrade SNR by -nclip dB. ! Offset data by about 1 s. if(jz.ge.126*2048) call wsjt65(dat(4097),jz-4096,cfile6, + NClearAve,MinSigdB,DFTolerance,NFreeze,NAFC,mode65,Nseg, - + MouseDF2,NAgain,ndepth,neme,nsked,idf, + + MouseDF2,NAgain,ndepth,neme,nsked,idf,idfsh, + mycall,hiscall,hisgrid,lumsg,lcum,nspecial,ndf, + nstest,dfsh,snrsh, + NSyncOK,ccf,psavg,ndiag,nwsh) diff --git a/wsjt65.f b/wsjt65.f index 3a25bfa00..5f00b35fc 100644 --- a/wsjt65.f +++ b/wsjt65.f @@ -1,6 +1,6 @@ subroutine wsjt65(dat,npts,cfile6,NClearAve,MinSigdB, + DFTolerance,NFreeze,NAFC,mode65,Nseg,MouseDF,NAgain, - + ndepth,neme,nsked,idf,mycall,hiscall,hisgrid, + + ndepth,neme,nsked,idf,idfsh,mycall,hiscall,hisgrid, + lumsg,lcum,nspecial,ndf,nstest,dfsh, + snrsh,NSyncOK,ccfblue,ccfred,ndiag,nwsh) @@ -80,7 +80,7 @@ C Attempt to synchronize: look for sync tone, get DF and DT. C Good Sync takes precedence over a shorthand message: if(nsync.ge.MinSigdB .and. nsnr.ge.nsnrlim .and. - + nsync.gt.nstest) nstest=0 + + nsync.ge.nstest) nstest=0 if(nstest.gt.0) then dfx=dfsh @@ -95,6 +95,7 @@ C Good Sync takes precedence over a shorthand message: NSyncOK=1 !Mark this RX file as good (for "Save Decoded") if(NFreeze.eq.0 .or. DFTolerance.ge.200) special(5:5)='?' width=nwsh + idf=idfsh go to 200 endif @@ -127,7 +128,9 @@ C If we get here, we have achieved sync! c1=decoded(i:i) if(c1.ge.'a' .and. c1.le.'z') decoded(i:i)=char(ichar(c1)-32) enddo - write(line,1010) cfile6,nsync,nsnr,dtx-1.0,ndf+idf, + jdf=ndf+idf + if(nstest.gt.0) jdf=ndf + write(line,1010) cfile6,nsync,nsnr,dtx-1.0,jdf, + 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,i4)