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
This commit is contained in:
Joe Taylor 2006-09-19 18:55:21 +00:00
parent 016ea0fc32
commit 6adbf82f6f
8 changed files with 61 additions and 47 deletions

View File

@ -2,7 +2,7 @@
real psavg(nh) real psavg(nh)
real s2(nhmax,nsmax) real s2(nhmax,nsmax)
real x(4096),tmp(33) real x(8192),tmp(33)
nsmo=33 nsmo=33
ia=nsmo/2 + 1 ia=nsmo/2 + 1

3
lpf1.f
View File

@ -45,6 +45,9 @@ C Shift frequency up or down by ndf Hz:
do i=nh,-i0,-1 do i=nh,-i0,-1
c(i)=c(i+i0) c(i)=c(i+i0)
enddo enddo
do i=0,-i0-1
c(i)=0.
enddo
else else
do i=0,nh-i0 do i=0,nh-i0
c(i)=c(i+i0) c(i)=c(i+i0)

View File

@ -1,6 +1,6 @@
subroutine short65(data,jz,NFreeze,MouseDF,DFTolerance, subroutine short65(data,jz,NFreeze,MouseDF,DFTolerance,
+ mode65,nspecialbest,nstest,dfsh,iderrbest,idriftbest, + 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 Checks to see if this might be a shorthand message.
C This is done before zapping, downsampling, or normal decoding. 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 (NP2=60*11025) !Size of data array
parameter (NFFT=16384) !FFT length parameter (NFFT=16384) !FFT length
parameter (NH=NFFT/2) !Step size parameter (NH=NFFT/2) !Step size
parameter (NQ=NFFT/4) !Saved spectral points
parameter (MAXSTEPS=60*11025/NH) !Max # of steps parameter (MAXSTEPS=60*11025/NH) !Max # of steps
real data(jz) real data(jz)
integer DFTolerance integer DFTolerance
real s2(NH,MAXSTEPS) !2d spectrum real s2(NH,MAXSTEPS) !2d spectrum
real ss(NQ,4) !Save spectra in four phase bins real ss(NH,4) !Save spectra in four phase bins
real psavg(NQ) real psavg(NH)
real sigmax(4) !Peak of spectrum at each phase real sigmax(4) !Peak of spectrum at each phase
real ss1a(-224:224) !Lower magenta curve real ss1a(-224:224) !Lower magenta curve
real ss2a(-224:224) !Upper magenta curve real ss2a(-224:224) !Upper magenta curve
real ss1(-473:1227) !Lower magenta curve (temp) real ss1(-473:1784) !Lower magenta curve (temp)
real ss2(-473:1227) !Upper magenta curve (temp) real ss2(-473:1784) !Upper magenta curve (temp)
real ssavg(-10:10) real ssavg(-10:10)
integer ipk(4) !Peak bin at each phase integer ipk(4) !Peak bin at each phase
save save
@ -30,38 +29,37 @@ C This is done before zapping, downsampling, or normal decoding.
df=11025.0/NFFT df=11025.0/NFFT
C Do 16 k FFTs, stepped by 8k. (*** Maybe should step by 4k? ***) 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=(jz-NH)/(4*NH)
nsteps=4*nsteps !Number of steps nsteps=4*nsteps !Number of steps
do j=1,nsteps do j=1,nsteps
k=(j-1)*NH + 1 k=(j-1)*NH + 1
call ps(data(k),NFFT,s2(1,j)) !Get power spectra call ps(data(k),NFFT,s2(1,j)) !Get power spectra
if(mode65.eq.4) then if(mode65.eq.4) then
call smooth(s2(1,j),NQ) call smooth(s2(1,j),NH)
call smooth(s2(1,j),NQ) call smooth(s2(1,j),NH)
endif endif
call add(psavg,s2(1,j),psavg,NQ) call add(psavg,s2(1,j),psavg,NH)
enddo enddo
call flat1(psavg,s2,NQ,nsteps,NH,MAXSTEPS) call flat1(psavg,s2,NH,nsteps,NH,MAXSTEPS)
nfac=40*mode65 nfac=40*mode65
dtstep=0.5/df dtstep=0.5/df
fac=dtstep/(60.0*df) fac=dtstep/(60.0*df)
C Define range of frequencies to be searched C Define range of frequencies to be searched
fa= 670.46 fa=max(200.0,1270.46+MouseDF-600.0)
fb=1870.46 fb=min(4800.0,1270.46+MouseDF+600.0)
ia=fa/df ia=fa/df
ib=fb/df + 4.1*nfac !Upper tone is above sync tone by 4*nfac*df Hz 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 if(NFreeze.eq.1) then
fa=max( 670.46,1270.46+MouseDF-DFTolerance) fa=max(200.0,1270.46+MouseDF-DFTolerance)
fb=min(1870.46,1270.46+MouseDF+DFTolerance) fb=min(4800.0,1270.46+MouseDF+DFTolerance)
endif endif
ia2=fa/df ia2=fa/df
ib2=fb/df + 4.1*nfac !Upper tone is above sync tone by 4*nfac*df Hz 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. C Find strongest line in each of the 4 phases, repeating for each drift rate.
sbest=0. 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? idz=6.0/df !Is this the right drift range?
do idrift=-idz,idz do idrift=-idz,idz
drift=idrift*df*60.0/49.04 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 do j=1,nsteps
n=mod(j-1,4)+1 n=mod(j-1,4)+1
k=nint((j-nsteps/2)*drift*fac) + ia 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 ipk2=ntmp
endif endif
call zero(ss1,1701) call zero(ss1,2258)
call zero(ss2,1701) call zero(ss2,2258)
do i=ia2,ib2,4 do i=ia2,ib2,4
f=df*i f=df*i
k=nint((f-1270.46)/df4) 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) nwsh=nint(x*df4)
endif 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 do i=-224,224
ss1a(i)=ss1(i) ss1a(i)=ss1(i+i0)
ss2a(i)=ss2(i) ss2a(i)=ss2(i+i0)
enddo enddo
return return

View File

@ -367,7 +367,8 @@ def update():
if(fmid<>fmid0 or frange<>frange0): if(fmid<>fmid0 or frange<>frange0):
if fmid<1000*nfr.get(): fmid=1000*nfr.get() if fmid<1000*nfr.get(): fmid=1000*nfr.get()
if fmid>5000-1000*nfr.get(): fmid=5000-1000*nfr.get() if fmid>5000-1000*nfr.get(): fmid=5000-1000*nfr.get()
draw_axis() # draw_axis()
df_mark()
fmid0=fmid fmid0=fmid
frange0=frange frange0=frange
Audio.gcom2.nfmid=int(fmid) 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 = 'Rx volume control', command = rx_volume)
setupmenu.add('command', label = 'Tx volume control', command = tx_volume) setupmenu.add('command', label = 'Tx volume control', command = tx_volume)
setupmenu.add_separator() 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) 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) value=1,variable=naxis)
setupmenu.add_separator() setupmenu.add_separator()
setupmenu.palettes=Menu(setupmenu,tearoff=0) setupmenu.palettes=Menu(setupmenu,tearoff=0)

View File

@ -40,13 +40,14 @@ C Compute power spectrum for each step and get average
C Find the best frequency channel for CCF C Find the best frequency channel for CCF
famin= 670.46 famin= 670.46
fbmax=1870.46 fbmax=1870.46
! famin=200
! fbmax=3800
fa=famin fa=famin
fb=fbmax fb=fbmax
if(NFreeze.eq.1) then if(NFreeze.eq.1) then
fa=max(famin,1270.46+MouseDF-DFTolerance) fa=max(famin,1270.46+MouseDF-DFTolerance)
fb=min(fbmax,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 endif
ia=fa/df ia=fa/df
ib=fb/df ib=fb/df

28
wsjt.py
View File

@ -1,4 +1,4 @@
#------------------------------------------------------------------ WSJT #------------------------------------------------------------------- WSJT
# $Date$ $Revision$ # $Date$ $Revision$
# #
from Tkinter import * from Tkinter import *
@ -48,8 +48,8 @@ isync6m=-10
isync65=1 isync65=1
isync_save=0 isync_save=0
iclip=0 iclip=0
itol=5 itol=5 #Default tol=400 Hz
ntol=(10,25,50,100,200,400) #List of available tolerances ntol=(10,25,50,100,200,400,600) #List of available tolerances
idsec=0 idsec=0
#irdsec=0 #irdsec=0
lauto=0 lauto=0
@ -523,7 +523,7 @@ def ModeFSK441(event=NONE):
report.configure(state=NORMAL) report.configure(state=NORMAL)
shmsg.configure(state=NORMAL) shmsg.configure(state=NORMAL)
graph2.configure(bg='black') graph2.configure(bg='black')
itol=5 itol=4
inctol() inctol()
ntx.set(1) ntx.set(1)
GenStdMsgs() GenStdMsgs()
@ -552,7 +552,7 @@ def ModeJT65():
report.configure(state=DISABLED) report.configure(state=DISABLED)
shmsg.configure(state=DISABLED) shmsg.configure(state=DISABLED)
graph2.configure(bg='#66FFFF') graph2.configure(bg='#66FFFF')
itol=5 itol=4
inctol() inctol()
nfreeze.set(0) nfreeze.set(0)
ntx.set(1) ntx.set(1)
@ -857,7 +857,7 @@ def decclip(event):
#------------------------------------------------------ inctol #------------------------------------------------------ inctol
def inctol(event=NONE): def inctol(event=NONE):
global itol global itol
if itol<5: itol=itol+1 if itol<6: itol=itol+1
ltol.configure(text='Tol '+str(ntol[itol])) ltol.configure(text='Tol '+str(ntol[itol]))
#------------------------------------------------------ dectol #------------------------------------------------------ dectol
@ -1011,7 +1011,7 @@ def mouse_click_g1(event):
global nopen global nopen
if not nopen: if not nopen:
if mode.get()[:4]=="JT65": 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: else:
if Audio.gcom2.ndecoding==0: #If decoder is busy, ignore if Audio.gcom2.ndecoding==0: #If decoder is busy, ignore
Audio.gcom2.nagain=1 Audio.gcom2.nagain=1
@ -1168,7 +1168,7 @@ def plot_large():
else: else:
y1=[] y1=[]
y2=[] 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] ss1=Audio.gcom2.ss1[i+1]
y1.append(ss1) y1.append(ss1)
ss2=Audio.gcom2.ss2[i+1] ss2=Audio.gcom2.ss2[i+1]
@ -1179,7 +1179,7 @@ def plot_large():
xy1=[] xy1=[]
xy2=[] xy2=[]
fac=500.0/446.0 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 x=i*fac
ss1=Audio.gcom2.ss1[i+1] ss1=Audio.gcom2.ss1[i+1]
n=int(90.0-yfac*ss1) n=int(90.0-yfac*ss1)
@ -1386,14 +1386,14 @@ def update():
msg1.configure(text="%6.4f %6.4f" % (samfac_in,samfac_out)) msg1.configure(text="%6.4f %6.4f" % (samfac_in,samfac_out))
msg2.configure(text=mode.get()) 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: if abs(int(Audio.gcom2.mousedf))>600:
msg3.configure(text=t,fg='black',bg='red') msg3.configure(text=t,fg='black',bg='red')
else: else:
msg3.configure(text=t,fg='black',bg='gray85') msg3.configure(text=t,fg='black',bg='gray85')
bdecode.configure(bg='gray85') bdecode.configure(bg='gray85',highlightbackground='red')
if Audio.gcom2.ndecoding: #Set button bg=light_blue if Audio.gcom2.ndecoding: #Set button bg=light_blue while decoding
bdecode.configure(bg='#66FFFF') #while decoding bdecode.configure(bg='#66FFFF',highlightbackground='red')
if mode.get()[:2]=="CW": if mode.get()[:2]=="CW":
msg5.configure(text="TR Period: %d s" % (Audio.gcom1.trperiod,), \ msg5.configure(text="TR Period: %d s" % (Audio.gcom1.trperiod,), \
bg='white') bg='white')
@ -2018,7 +2018,6 @@ lauto=0
isync=1 isync=1
ntx.set(1) ntx.set(1)
ndepth.set(1) ndepth.set(1)
import options import options
options.defaults() options.defaults()
ModeFSK441() ModeFSK441()
@ -2167,6 +2166,7 @@ Audio.gcom2.appdir=(appdir+'
Audio.gcom2.ndepth=ndepth.get() Audio.gcom2.ndepth=ndepth.get()
Audio.ftn_init() Audio.ftn_init()
GenStdMsgs() GenStdMsgs()
print 'D ',itol,ntol[itol]
Audio.gcom4.addpfx=(options.addpfx.get().lstrip()+' ')[:8] Audio.gcom4.addpfx=(options.addpfx.get().lstrip()+' ')[:8]
stopmon() stopmon()
first=1 first=1

View File

@ -169,7 +169,7 @@ C Intentionally degrade SNR by -nclip dB.
nstest=0 nstest=0
if(ntx2.ne.1) call short65(dat,jz,NFreeze,MouseDF, if(ntx2.ne.1) call short65(dat,jz,NFreeze,MouseDF,
+ DFTolerance,mode65,nspecial,nstest,dfsh,iderrsh, + DFTolerance,mode65,nspecial,nstest,dfsh,iderrsh,
+ idriftsh,snrsh,ss1,ss2,nwsh) + idriftsh,snrsh,ss1,ss2,nwsh,idfsh)
! Lowpass filter and decimate by 2 ! Lowpass filter and decimate by 2
call lpf1(dat,jz,jz2,MouseDF,MouseDF2) call lpf1(dat,jz,jz2,MouseDF,MouseDF2)
idf=mousedf-mousedf2 idf=mousedf-mousedf2
@ -190,7 +190,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,
+ MouseDF2,NAgain,ndepth,neme,nsked,idf, + MouseDF2,NAgain,ndepth,neme,nsked,idf,idfsh,
+ mycall,hiscall,hisgrid,lumsg,lcum,nspecial,ndf, + mycall,hiscall,hisgrid,lumsg,lcum,nspecial,ndf,
+ nstest,dfsh,snrsh, + nstest,dfsh,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,
+ ndepth,neme,nsked,idf,mycall,hiscall,hisgrid, + ndepth,neme,nsked,idf,idfsh,mycall,hiscall,hisgrid,
+ lumsg,lcum,nspecial,ndf,nstest,dfsh, + lumsg,lcum,nspecial,ndf,nstest,dfsh,
+ snrsh,NSyncOK,ccfblue,ccfred,ndiag,nwsh) + 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: C Good Sync takes precedence over a shorthand message:
if(nsync.ge.MinSigdB .and. nsnr.ge.nsnrlim .and. if(nsync.ge.MinSigdB .and. nsnr.ge.nsnrlim .and.
+ nsync.gt.nstest) nstest=0 + nsync.ge.nstest) nstest=0
if(nstest.gt.0) then if(nstest.gt.0) then
dfx=dfsh 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") NSyncOK=1 !Mark this RX file as good (for "Save Decoded")
if(NFreeze.eq.0 .or. DFTolerance.ge.200) special(5:5)='?' if(NFreeze.eq.0 .or. DFTolerance.ge.200) special(5:5)='?'
width=nwsh width=nwsh
idf=idfsh
go to 200 go to 200
endif endif
@ -127,7 +128,9 @@ C If we get here, we have achieved sync!
c1=decoded(i:i) c1=decoded(i:i)
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+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 + 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) 1010 format(a6,i3,i5,f5.1,i5,i3,1x,a1,1x,a5,a19,1x,a3,i4,i4)