1. General code cleanup. Most compiler warning messages have been silenced.

2. "/A" added to list of optional callsign suffixes.
3. Improved algorithm for measuring error in soundcard sample rates.
4. Optional 5-sec shift of input data, to catch some clock errors.


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@274 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2006-09-06 18:09:05 +00:00
parent daa2ffd27a
commit 8c9ed820c8
28 changed files with 1806 additions and 1802 deletions

View File

@ -6,6 +6,7 @@
3V8BB,JM56ER,EME,,,,,06/02 3V8BB,JM56ER,EME,,,,,06/02
3V8SS,JM55GX,EME,,Expedition,,144: 16JXX and 1kw,12/05 3V8SS,JM55GX,EME,,Expedition,,144: 16JXX and 1kw,12/05
3Y0X,EC41RE,EME,,Expedition,,144: 4x 9el 350W,02/06 3Y0X,EC41RE,EME,,Expedition,,144: 4x 9el 350W,02/06
4F2KWT,PK06,EME,,
4J1FS,KP40,,,Expedition,,,1990 4J1FS,KP40,,,Expedition,,,1990
4N7AX,KN05PC,,,,,144: 200 W 2x10el 9BVtx1500/rx3000lpm DSP,08/00 4N7AX,KN05PC,,,,,144: 200 W 2x10el 9BVtx1500/rx3000lpm DSP,08/00
4O4AR,JN94AS,,,=YU4AR,,144: TR9130 250W 10el PA0MS-ant PreampUHER 15,11/02 4O4AR,JN94AS,,,=YU4AR,,144: TR9130 250W 10el PA0MS-ant PreampUHER 15,11/02

View File

@ -107,8 +107,9 @@ wsjt6: @NEEDPORTAUDIO@ Audio.so #wsjt.spec
# ${PYTHON} c:\python23\installer\Build.py wsjt.spec # ${PYTHON} c:\python23\installer\Build.py wsjt.spec
# ${RM} wsjt6 # ${RM} wsjt6
# deep65.o: deep65.F
# $(FC) -c -O0 -Wall deep65.F
Audio.so: $(OBJS2C) $(OBJS3C) $(OBJS2F77) $(SRCS2F90) $(AUDIOSRCS) Audio.so: $(OBJS2C) $(OBJS3C) $(OBJS2F77) $(SRCS2F90) $(AUDIOSRCS)
${F2PY} -c --quiet --opt="-O ${CFLAGS} \ ${F2PY} -c --quiet --opt="-O ${CFLAGS} \
-fno-second-underscore" $(OBJS2C) $(OBJS2F77) -m Audio \ -fno-second-underscore" $(OBJS2C) $(OBJS2F77) -m Audio \

View File

@ -2,8 +2,10 @@
!include <dfinc.mak> #Some definitions for Compaq Visual Fortran !include <dfinc.mak> #Some definitions for Compaq Visual Fortran
gcc = cl gcc = cl
FC = df FC = df
#To do bounds checking (with useless reports) put "/check:all" in the
# --opt= line below (line 56, more or less ...)
#FFLAGS = /traceback /check:all #FFLAGS = /traceback /check:all
FFLAGS = /traceback /fast FFLAGS = /traceback /fast /nologo
all: JT65code.exe WSJT6.EXE all: JT65code.exe WSJT6.EXE
@ -16,7 +18,7 @@ OBJS1 = JT65code.obj nchar.obj grid2deg.obj packmsg.obj packtext.obj \
wrapkarn.obj wrapkarn.obj
JT65code.exe: $(OBJS1) JT65code.exe: $(OBJS1)
$(FC) /exe:JT65code.exe $(OBJS1) $(FC) $(FFLAGS) /exe:JT65code.exe $(OBJS1)
OBJS2C = init_rs.o encode_rs.o decode_rs.o jtaudio.o OBJS2C = init_rs.o encode_rs.o decode_rs.o jtaudio.o
@ -51,7 +53,8 @@ WSJT6.EXE: Audio.pyd wsjt.spec
Audio.pyd: $(OBJS2C) $(SRCS2F90) $(SRCS2F77) $(SRCS2C) Audio.pyd: $(OBJS2C) $(SRCS2F90) $(SRCS2F77) $(SRCS2C)
python f2py.py -c \ python f2py.py -c \
--quiet --"fcompiler=compaqv" \ --quiet --"fcompiler=compaqv" \
--opt="/traceback /fast /fpp /define:Win32 /define:USE_PORTAUDIO" \ --opt="/nologo /traceback /warn:errors /fast /fpp /define:Win32 \
/define:USE_PORTAUDIO" \
$(OBJS2C) \ $(OBJS2C) \
-lwinmm -lpa -llibsamplerate \ -lwinmm -lpa -llibsamplerate \
-m Audio \ -m Audio \
@ -63,31 +66,31 @@ wsjt.spec: wsjt.py astro.py g.py options.py palettes.py smeter.py specjt.py
--tk --onefile wsjt.py --tk --onefile wsjt.py
jtaudio.o: jtaudio.c jtaudio.o: jtaudio.c
cl /c /DWin32 /Fojtaudio.o jtaudio.c $(CC) /nologo /c /DWin32 /Fojtaudio.o jtaudio.c
init_rs.obj: init_rs.c init_rs.obj: init_rs.c
$(CC) /c /DBIGSYM=1 init_rs.c $(CC) /nologo /c /DBIGSYM=1 init_rs.c
init_rs.o: init_rs.obj init_rs.o: init_rs.obj
$(CC) /c /DBIGSYM=1 /Foinit_rs.o init_rs.c $(CC) /nologo /c /DBIGSYM=1 /Foinit_rs.o init_rs.c
encode_rs.obj: encode_rs.c encode_rs.obj: encode_rs.c
$(CC) /c /DBIGSYM=1 encode_rs.c $(CC) /nologo /c /DBIGSYM=1 encode_rs.c
encode_rs.o: encode_rs.c encode_rs.o: encode_rs.c
$(CC) /c /DBIGSYM=1 /Foencode_rs.o encode_rs.c $(CC) /nologo /c /DBIGSYM=1 /Foencode_rs.o encode_rs.c
decode_rs.obj: decode_rs.c decode_rs.obj: decode_rs.c
$(CC) /c /DBIGSYM=1 decode_rs.c $(CC) /nologo /c /DBIGSYM=1 decode_rs.c
decode_rs.o: decode_rs.c decode_rs.o: decode_rs.c
$(CC) /c /DBIGSYM=1 /Ox /Zd /Fodecode_rs.o decode_rs.c $(CC) /nologo /c /DBIGSYM=1 /Ox /Zd /Fodecode_rs.o decode_rs.c
wrapkarn.obj: wrapkarn.c wrapkarn.obj: wrapkarn.c
$(CC) /c /DWin32=1 wrapkarn.c $(CC) /nologo /c /DWin32=1 wrapkarn.c
igray.obj: igray.c igray.obj: igray.c
$(CC) /c /DWin32=1 igray.c $(CC) /nologo /c /DWin32=1 igray.c
.PHONY : clean .PHONY : clean

View File

@ -1,11 +1,8 @@
subroutine abc441(msg,nmsg,itone,ndits) subroutine abc441(msg,nmsg,itone,ndits)
character msg*28,msg2*29 character msg*28
integer itone(84) integer itone(84)
integer lookup(0:91) integer lookup(0:91)
integer codeword4(4,0:42)
integer codeword7(7,0:42)
character c*1
character cc*43 character cc*43
data cc/' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.,?/#$'/ data cc/' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.,?/#$'/
data lookup/13, 15, 17, 46, 47, 45, 44, 12, 11, 14, & data lookup/13, 15, 17, 46, 47, 45, 44, 12, 11, 14, &

View File

@ -7,10 +7,6 @@ C Computes astronomical quantities for display in JT65, CW, and EME Echo mode.
C NB: may want to smooth the Tsky map to 10 degrees or so. C NB: may want to smooth the Tsky map to 10 degrees or so.
character*80 AppDir,fname character*80 AppDir,fname
character*240 Display
character*14 d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15
character*14 d1a,d2a,d3a
character*2 crlf
character*6 MyGrid,HisGrid character*6 MyGrid,HisGrid
logical first,ltsky logical first,ltsky
real LST real LST

View File

@ -10,7 +10,6 @@ subroutine astro0(nyear,month,nday,uth8,nfreq,grid,cauxra,cauxdec, &
character grid*6 character grid*6
character*9 cauxra,cauxdec character*9 cauxra,cauxdec
real*8 utch8
real*8 AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,AzAux8,ElAux8 real*8 AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,AzAux8,ElAux8
real*8 dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,xnr8,dfdt,dfdt0 real*8 dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,xnr8,dfdt,dfdt0
real*8 sd8,poloffset8 real*8 sd8,poloffset8

View File

@ -7,7 +7,6 @@ subroutine audio_init(ndin,ndout)
external a2d,decode1 external a2d,decode1
#endif #endif
integer*2 a(225000) !Pixel values for 750 x 300 array
integer brightness,contrast integer brightness,contrast
include 'gcom1.f90' include 'gcom1.f90'
include 'gcom2.f90' include 'gcom2.f90'

View File

@ -1,5 +1,5 @@
subroutine avemsg65(mseg,mode65,ndepth,decoded,nused, subroutine avemsg65(mseg,mode65,ndepth,decoded,nused,
+ nq1,nq2,neme,nsked,flip,mycall,hiscall,hisgrid,qual, + nq1,nq2,neme,nsked,mycall,hiscall,hisgrid,qual,
+ ns,ncount) + 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).
@ -36,7 +36,7 @@ C Compute the average of all flagged spectra for this segment.
enddo enddo
nadd=nused*mode65 nadd=nused*mode65
call extract(s3,nadd,ndepth,ncount,decoded) !Extract the message call extract(s3,nadd,ncount,decoded) !Extract the message
if(ncount.lt.0) decoded=' ' if(ncount.lt.0) decoded=' '
nqual=0 nqual=0
@ -48,6 +48,9 @@ C Possibly should pass nadd=nused, also:
nqual=qual nqual=qual
if(nqual.lt.nq1) deepmsg=' ' if(nqual.lt.nq1) deepmsg=' '
if(nqual.ge.nq1 .and. nqual.lt.nq2) deepmsg(19:19)='?' if(nqual.ge.nq1 .and. nqual.lt.nq2) deepmsg(19:19)='?'
else
deepmsg=' '
qual=0.
endif endif
if(ncount.lt.0) decoded=deepmsg if(ncount.lt.0) decoded=deepmsg

View File

@ -1,4 +1,4 @@
subroutine avesp2(dat,jza,nadd,f0,mode,NFreeze,MouseDF, subroutine avesp2(dat,jza,nadd,mode,NFreeze,MouseDF,
+ DFTolerance,fzap) + DFTolerance,fzap)
real dat(jza) real dat(jza)

View File

@ -9,7 +9,7 @@ subroutine decode1(iarg)
use dflib use dflib
#endif #endif
character sending0*28,fcum*80,mode0*6,cshort*11 character sending0*28,mode0*6,cshort*11
integer sendingsh0 integer sendingsh0
include 'gcom1.f90' include 'gcom1.f90'

View File

@ -5,7 +5,6 @@ subroutine decode2
! Get data and parameters from gcom, then call the decoders ! Get data and parameters from gcom, then call the decoders
character fnamex*24 character fnamex*24
integer*2 d2d(30*11025)
include 'gcom1.f90' include 'gcom1.f90'
include 'gcom2.f90' include 'gcom2.f90'

View File

@ -5,12 +5,9 @@ subroutine decode3(d2,jz,istart,filename)
use dfport use dfport
#endif #endif
integer*2 d2(jz),d2d(60*11025) integer*2 d2(jz),d2d(65*11025)
real*8 sq
character*24 filename character*24 filename
character FileID*40 character FileID*40
character mycall0*12,hiscall0*12,hisgrid0*6
logical savefile
include 'gcom1.f90' include 'gcom1.f90'
include 'gcom2.f90' include 'gcom2.f90'
@ -51,10 +48,20 @@ subroutine decode3(d2,jz,istart,filename)
endif endif
open(23,file=appdir(:lenappdir)//'/CALL3.TXT',status='unknown') open(23,file=appdir(:lenappdir)//'/CALL3.TXT',status='unknown')
if(nadd5.eq.1) then
nzero=5*11025
do i=jz,nzero+1,-1
d2d(i)=d2d(i-nzero)
enddo
do i=1,nzero
d2d(i)=0
enddo
jz=min(60*11025,jz+nzero)
endif
call wsjt1(d2d,jz,istart,samfacin,FileID,ndepth,MinSigdB, & call wsjt1(d2d,jz,istart,samfacin,FileID,ndepth,MinSigdB, &
NQRN,DFTolerance,NSaveCum,MouseButton,NClearAve, & NQRN,DFTolerance,MouseButton,NClearAve, &
nMode,NFreeze,NAFC,NZap,AppDir,utcdate,mode441,mode65, & nMode,NFreeze,NAFC,NZap,mode65, &
MyCall,HisCall,HisGrid,neme,nsked,naggressive,ntx2,s2, & MyCall,HisCall,HisGrid,neme,nsked,ntx2,s2, &
ps0,npkept,lumsg,basevb,rmspower,nslim2,psavg,ccf,Nseg, & ps0,npkept,lumsg,basevb,rmspower,nslim2,psavg,ccf,Nseg, &
MouseDF,NAgain,LDecoded,nspecial,ndf,ss1,ss2) MouseDF,NAgain,LDecoded,nspecial,ndf,ss1,ss2)
close(23) close(23)

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,
+ nsnr,mycall,hiscall,hisgrid,mode65,nafc,decoded,ncount, + 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.
@ -31,7 +31,7 @@ C Compute spectra of the channel symbols
enddo enddo
nadd=mode65 nadd=mode65
call extract(s3,nadd,ndepth,ncount,decoded) !Extract the message call extract(s3,nadd,ncount,decoded) !Extract the message
qual=0. qual=0.
if(ndepth.ge.1) call deep65(s3,mode65,neme, if(ndepth.ge.1) call deep65(s3,mode65,neme,
+ nsked,flip,mycall,hiscall,hisgrid,deepmsg,qual) + nsked,flip,mycall,hiscall,hisgrid,deepmsg,qual)

View File

@ -13,6 +13,10 @@
integer ncode(63,2*MAXCALLS + 2 + MAXRPT) integer ncode(63,2*MAXCALLS + 2 + MAXRPT)
real pp(2*MAXCALLS + 2 + MAXRPT) real pp(2*MAXCALLS + 2 + MAXRPT)
common/tmp9/ mrs(63),mrs2(63) common/tmp9/ mrs(63),mrs2(63)
#ifdef Win32
C This prevents some optimizations that break this subroutine.
volatile p1,p2,bias
#endif
data neme0/-99/ data neme0/-99/
data rpt/'-01','-02','-03','-04','-05', data rpt/'-01','-02','-03','-04','-05',
@ -92,7 +96,8 @@ C Insert CQ message unless sync=OOO (flip=-1).
endif endif
enddo enddo
if(nsked.eq.1) go to 20 if(nsked.eq.1) go to 20
10 enddo 10 continue
enddo
20 ntot=k 20 ntot=k
neme0=neme neme0=neme
@ -129,14 +134,6 @@ C Insert CQ message unless sync=OOO (flip=-1).
if(mode65.eq.1) bias=max(1.12*p2,0.335) if(mode65.eq.1) bias=max(1.12*p2,0.335)
if(mode65.eq.2) bias=max(1.08*p2,0.405) if(mode65.eq.2) bias=max(1.08*p2,0.405)
if(mode65.ge.4) bias=max(1.04*p2,0.505) if(mode65.ge.4) bias=max(1.04*p2,0.505)
C This is really weird, but do not remove the following statements!
! write(77,*) mode65,bias,p1,p2
! rewind 77
! rewind 23
call sleepqqq(1)
qual=100.0*(p1-bias) qual=100.0*(p1-bias)
decoded=' ' decoded=' '
c=' ' c=' '

View File

@ -1,9 +1,8 @@
subroutine extract(s3,nadd,ndepth,ncount,decoded) subroutine extract(s3,nadd,ncount,decoded)
real s3(64,63) real s3(64,63)
character decoded*22 character decoded*22
integer*1 dat1(12) integer era(51),dat4(12),indx(63)
integer dat(63),era(51),dat4(12),indx(63)
integer mrsym(63),mr2sym(63),mrprob(63),mr2prob(63) integer mrsym(63),mr2sym(63),mrprob(63),mr2prob(63)
logical first logical first
data first/.true./,nsec1/0/ data first/.true./,nsec1/0/
@ -23,9 +22,6 @@
ndec=1 ndec=1
nemax=30 nemax=30
maxe=8 maxe=8
! if(ndepth.ge.2) ndec=1
! if(ndepth.eq.2) xlambda=13.0
! if(ndepth.eq.3) xlambda=15.0
xlambda=15.0 xlambda=15.0
if(ndec.eq.1) then if(ndec.eq.1) then

View File

@ -14,8 +14,10 @@ subroutine fivehz
use dfport use dfport
#endif #endif
parameter (NTRING=64)
real*8 tt1(0:NTRING-1)
real*8 tstart,tstop,t60 real*8 tstart,tstop,t60
logical first,txtime,debug logical first,txtime,debug,filled
integer ptt integer ptt
integer TxOKz integer TxOKz
real*8 fs,fsample,tt,tt0,u real*8 fs,fsample,tt,tt0,u
@ -40,23 +42,37 @@ subroutine fivehz
ibuf00=-99 ibuf00=-99
ncall=-1 ncall=-1
tt0=tt tt0=tt
u=0.1d0 u=0.05d0
fsample=11025.d0 fsample=11025.d0
maxms=0 maxms=0
mfsample=110250 mfsample=110250
filled=.false.
endif endif
if(txdelay.lt.0.2d0) txdelay=0.2d0 if(txdelay.lt.0.2d0) txdelay=0.2d0
! Measure average sampling frequency over a recent interval ! Measure average sampling frequency over a recent interval
ncall=ncall+1 ncall=ncall+1
if(ncall.eq.9) tt0=tt if(ncall.eq.9) then
if(ncall.ge.10 .and. mod(ncall,2).eq.1) then tt0=tt
fs=(ncall-9)*2048.d0/(tt-tt0) ntt0=0
ntt1=0
tt1(ntt1)=tt
endif
! if(ncall.ge.10 .and. mod(ncall,2).eq.1) then
if(ncall.ge.10) then
ntt1=iand(ntt1+1,NTRING-1)
tt1(ntt1)=tt
if(ntt1.eq.NTRING-1) filled=.true.
if(filled) ntt0=iand(ntt1+1,NTRING-1)
if(mod(ncall,2).eq.1) then
nd=ntt1-ntt0
if(nd.lt.0) nd=nd+NTRING
fs=nd*2048.d0/(tt1(ntt1)-tt1(ntt0))
fsample=u*fs + (1.d0-u)*fsample fsample=u*fs + (1.d0-u)*fsample
mfsample=nint(10.d0*fsample) mfsample=nint(10.d0*fsample)
endif endif
endif
if(trperiod.le.0) trperiod=30 if(trperiod.le.0) trperiod=30
tx1=0.0 !Time to start a TX sequence tx1=0.0 !Time to start a TX sequence
@ -180,7 +196,9 @@ subroutine fivehztx
use dfport use dfport
#endif #endif
logical first parameter (NTRING=64)
real*8 tt1(0:NTRING-1)
logical first,filled
real*8 fs,fsample,tt,tt0,u real*8 fs,fsample,tt,tt0,u
include 'gcom1.f90' include 'gcom1.f90'
data first/.true./ data first/.true./
@ -195,18 +213,34 @@ subroutine fivehztx
ncall=-1 ncall=-1
fsample=11025.d0 fsample=11025.d0
nsec0=-999 nsec0=-999
u=0.1d0 u=0.05d0
mfsample2=110250 mfsample2=110250
tt0=tt tt0=tt
filled=.false.
endif endif
! Measure average sampling frequency over a recent interval
ncall=ncall+1 ncall=ncall+1
if(ncall.eq.9) tt0=tt if(ncall.eq.9) then
if(ncall.ge.10 .and. mod(ncall,2).eq.1) then tt0=tt
fs=(ncall-9)*2048.d0/(tt-tt0) ntt0=0
ntt1=0
tt1(ntt1)=tt
endif
if(ncall.ge.10) then
ntt1=iand(ntt1+1,NTRING-1)
tt1(ntt1)=tt
if(ntt1.eq.NTRING-1) filled=.true.
if(filled) ntt0=iand(ntt1+1,NTRING-1)
if(mod(ncall,2).eq.1) then
nd=ntt1-ntt0
if(nd.lt.0) nd=nd+NTRING
fs=nd*2048.d0/(tt1(ntt1)-tt1(ntt0))
fsample=u*fs + (1.d0-u)*fsample fsample=u*fs + (1.d0-u)*fsample
mfsample2=nint(10.d0*fsample) mfsample2=nint(10.d0*fsample)
endif endif
endif
return return
end subroutine fivehztx end subroutine fivehztx

View File

@ -20,6 +20,7 @@ integer nrestart !True if transmission should restart GUI,SoundIn
integer ntr !Are we in 2nd sequence? SoundIn integer ntr !Are we in 2nd sequence? SoundIn
integer nmsg !Length of Tx message SoundIn integer nmsg !Length of Tx message SoundIn
integer nsave !Which files to save? GUI integer nsave !Which files to save? GUI
integer nadd5 !Prepend 5 sec of 0's before decoding? GUI
integer dftolerance !DF tolerance (Hz) GUI integer dftolerance !DF tolerance (Hz) GUI
logical LDecoded !Was a message decoded? Decoder logical LDecoded !Was a message decoded? Decoder
logical rxdone !Has the Rx sequence finished? SoundIn,Decoder logical rxdone !Has the Rx sequence finished? SoundIn,Decoder
@ -85,7 +86,7 @@ character*12 pttport
common/gcom2/ps0(431),psavg(450),s2(64,3100),ccf(-5:540), & common/gcom2/ps0(431),psavg(450),s2(64,3100),ccf(-5:540), &
green(500),ngreen,dgain,iter,ndecoding,ndecoding0,mousebutton, & green(500),ngreen,dgain,iter,ndecoding,ndecoding0,mousebutton, &
ndecdone,npingtime,ierr,lauto,mantx,nrestart,ntr,nmsg,nsave, & ndecdone,npingtime,ierr,lauto,mantx,nrestart,ntr,nmsg,nsave,nadd5, &
dftolerance,LDecoded,rxdone,monitoring,nzap,nsavecum,minsigdb, & dftolerance,LDecoded,rxdone,monitoring,nzap,nsavecum,minsigdb, &
nclearave,nfreeze,nafc,nmode,mode65,nclip,ndebug,nblank,nport, & nclearave,nfreeze,nafc,nmode,mode65,nclip,ndebug,nblank,nport, &
mousedf,neme,nsked,naggressive,ntx2,nslim2,nagain,nsavelast, & mousedf,neme,nsked,naggressive,ntx2,nslim2,nagain,nsavelast, &

View File

@ -5,7 +5,7 @@
integer*2 iwave(NMAX) integer*2 iwave(NMAX)
integer TRPeriod integer TRPeriod
integer*1 idat(5000),idat1(460),idat2(200),i1 integer*1 idat(5000),idat1(460),idat2(200)
real*8 dt,t,twopi,pha,dpha,tdit,samfac real*8 dt,t,twopi,pha,dpha,tdit,samfac
data twopi/6.283185307d0/ data twopi/6.283185307d0/

View File

@ -10,7 +10,7 @@
if(k.ge.1 .and. k.le.NZ) then if(k.ge.1 .and. k.le.NZ) then
iz=index(pfx(k),' ') - 1 iz=index(pfx(k),' ') - 1
callsign=pfx(k)(1:iz)//'/'//callsign callsign=pfx(k)(1:iz)//'/'//callsign
else if(k.ge.401 .and. k.le.411) then else if(k.ge.401 .and. k.le.400+NZ2) then
iz=index(callsign,' ') - 1 iz=index(callsign,' ') - 1
callsign=callsign(1:iz)//'/'//sfx(k-400) callsign=callsign(1:iz)//'/'//sfx(k-400)
else if(k.eq.449) then else if(k.eq.449) then

View File

@ -1,5 +1,10 @@
#include <stdio.h> #include <stdio.h>
#include <portaudio.h> #include <portaudio.h>
#include <string.h>
void fivehz_();
void fivehztx_();
void addnoise_(short int *n);
// Definition of structure pointing to the audio data // Definition of structure pointing to the audio data
typedef struct typedef struct
@ -66,7 +71,6 @@ static int SoundIn( void *inputBuffer, void *outputBuffer,
{ {
paTestData *data = (paTestData*)userData; paTestData *data = (paTestData*)userData;
short *in = (short*)inputBuffer; short *in = (short*)inputBuffer;
short *wptr = (short*)outputBuffer;
unsigned int i; unsigned int i;
static int n0; static int n0;
static int ia=0; static int ia=0;
@ -99,8 +103,8 @@ static int SoundIn( void *inputBuffer, void *outputBuffer,
// if((inputBuffer==NULL) & (ncall>2) & (stime>stime0)) { // if((inputBuffer==NULL) & (ncall>2) & (stime>stime0)) {
if((statusFlags!=0) & (ncall>2) & (stime>stime0)) { if((statusFlags!=0) & (ncall>2) & (stime>stime0)) {
if(*data->ndebug) if(*data->ndebug)
printf("Status flags %d at Tsec = %7.1f s, DT = %7.1f\n",stime, printf("Status flags %d at Tsec = %7.1f s, DT = %7.1f\n",
stime-stime0); statusFlags,stime,stime-stime0);
stime0=stime; stime0=stime;
} }
@ -134,7 +138,6 @@ static int SoundOut( void *inputBuffer, void *outputBuffer,
void *userData ) void *userData )
{ {
paTestData *data = (paTestData*)userData; paTestData *data = (paTestData*)userData;
short *in = (short*)inputBuffer;
short *wptr = (short*)outputBuffer; short *wptr = (short*)outputBuffer;
unsigned int i,n; unsigned int i,n;
static short int n2; static short int n2;
@ -202,9 +205,9 @@ int jtaudio_(int *ndevin, int *ndevout, short y1[], short y2[],
PaStream *outstream; PaStream *outstream;
PaStreamParameters inputParameters; PaStreamParameters inputParameters;
PaStreamParameters outputParameters; PaStreamParameters outputParameters;
PaStreamInfo *streamInfo; // PaStreamInfo *streamInfo;
int i,nfs,ndin,ndout; int nfs,ndin,ndout;
PaError err1,err2,err2a,err3,err3a; PaError err1,err2,err2a,err3,err3a;
double dnfs; double dnfs;
@ -318,11 +321,11 @@ error:
int padevsub_(int *numdev, int *ndefin, int *ndefout, int padevsub_(int *numdev, int *ndefin, int *ndefout,
int nchin[], int nchout[]) int nchin[], int nchout[])
{ {
int i,j,n; int i;
int numDevices; int numDevices;
const PaDeviceInfo *pdi; const PaDeviceInfo *pdi;
PaError err; PaError err;
PaHostApiInfo *hostapi; // PaHostApiInfo *hostapi;
Pa_Initialize(); Pa_Initialize();

View File

@ -1,5 +1,5 @@
subroutine longx(dat,npts0,ps,DFTolerance,noffset, subroutine longx(dat,npts0,ps,DFTolerance,noffset,
+ msg,msglen,bauderr,MouseButton) + msg,msglen,bauderr)
C Look for 441-baud modulation, synchronize to it, and decode message. C Look for 441-baud modulation, synchronize to it, and decode message.
C Longest allowed data analysis is 1 second. C Longest allowed data analysis is 1 second.

View File

@ -1,11 +1,9 @@
subroutine mtdecode(dat,jz,s2,nchan,nz,MinSigdB,MinWidth, subroutine mtdecode(dat,jz,nz,MinSigdB,MinWidth,
+ NQRN,DFTolerance,istart,pick,MouseButton,NSaveCum, + NQRN,DFTolerance,istart,pick,cfile6,ps0)
+ cfile6,ps0)
C Decode Multi-Tone FSK441 mesages. C Decode Multi-Tone FSK441 mesages.
real dat(jz) !Raw audio data real dat(jz) !Raw audio data
real s2(nchan,nz) !2d spectrum of data
integer NQRN integer NQRN
integer DFTolerance integer DFTolerance
logical pick logical pick
@ -101,7 +99,7 @@ C Compute average spectrum of this ping.
C Decode the message. C Decode the message.
msg=' ' msg=' '
call longx(dat(jj),jjz,ps,DFTolerance,noffset,msg, call longx(dat(jj),jjz,ps,DFTolerance,noffset,msg,
+ msglen,bauderr,MouseButton) + msglen,bauderr)
qrnlimit=4.4*1.5**(5.0-NQRN) qrnlimit=4.4*1.5**(5.0-NQRN)
if(NQRN.eq.0) qrnlimit=99. if(NQRN.eq.0) qrnlimit=99.
if(msglen.eq.0) go to 100 if(msglen.eq.0) go to 100

4
pfx.f
View File

@ -1,9 +1,9 @@
parameter (NZ=338) !Total number of prefixes parameter (NZ=338) !Total number of prefixes
parameter (NZ2=11) !Total number of suffixes parameter (NZ2=12) !Total number of suffixes
character*1 sfx(NZ2) character*1 sfx(NZ2)
character*5 pfx(NZ) character*5 pfx(NZ)
data sfx/'P','0','1','2','3','4','5','6','7','8','9'/ data sfx/'P','0','1','2','3','4','5','6','7','8','9','A'/
data pfx/ data pfx/
+ '1A ','1S ','3A ','3B6 ','3B8 ','3B9 ','3C ','3C0 ', + '1A ','1S ','3A ','3B6 ','3B8 ','3B9 ','3C ','3C0 ',
+ '3D2 ','3D2C ','3D2R ','3DA ','3V ','3W ','3X ','3Y ', + '3D2 ','3D2C ','3D2R ','3DA ','3V ','3W ','3X ','3Y ',

View File

@ -11,13 +11,7 @@ subroutine spec(brightness,contrast,logmap,ngain,nspeed,a)
! Output: ! Output:
integer*2 a(225000) !Pixel values for 750 x 300 array integer*2 a(225000) !Pixel values for 750 x 300 array
real psa(750) !Grand average spectrum
real ref(750) !Ref spect: smoothed ave of lower half
real birdie(750) !Spec (with birdies) for plot, in dB
real variance(750) !Variance in each spectral channel
real a0(225000) !Save the last 300 spectra real a0(225000) !Save the last 300 spectra
integer*2 idat(11025) !Sound data, read from file
integer nstep(5) integer nstep(5)
integer b0,c0 integer b0,c0
real x(4096) !Data for FFT real x(4096) !Data for FFT

View File

@ -1,4 +1,4 @@
subroutine sync65(dat,jz,DFTolerance,NFreeze,NAFC,MouseDF, subroutine sync65(dat,jz,DFTolerance,NFreeze,MouseDF,
+ mode65,dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width) + mode65,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.
@ -15,7 +15,6 @@ C NB: at this stage, submodes ABC are processed in the same way.
real ccfblue(-5:540) !CCF with pseudorandom sequence real ccfblue(-5:540) !CCF with pseudorandom sequence
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)
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

35
wsjt.py
View File

@ -884,22 +884,16 @@ def decdsec(event):
ldsec.configure(text='Dsec '+str(0.1*idsec),bg=bg) ldsec.configure(text='Dsec '+str(0.1*idsec),bg=bg)
Audio.gcom1.ndsec=idsec Audio.gcom1.ndsec=idsec
###------------------------------------------------------ incrdsec #------------------------------------------------------ toggle_shift
##def incrdsec(event): def toggle_shift(event):
## global irdsec Audio.gcom2.nadd5=1-Audio.gcom2.nadd5
## irdsec=irdsec+5 if Audio.gcom2.nadd5:
## bg='red' bg='red'
## if irdsec==0: bg='white' lshift.configure(text='Shift 5.0',bg=bg)
## lrdsec.configure(text='RDsec '+str(0.1*irdsec),bg=bg) else:
## bg='white'
###------------------------------------------------------ decrdsec lshift.configure(text='Shift 0.0',bg=bg)
##def decrdsec(event):
## global irdsec
## irdsec=irdsec-5
## bg='red'
## if irdsec==0: bg='white'
## lrdsec.configure(text='RDsec '+str(0.1*irdsec),bg=bg)
##
#------------------------------------------------------ inctrperiod #------------------------------------------------------ inctrperiod
def inctrperiod(event): def inctrperiod(event):
global ncwtrperiod global ncwtrperiod
@ -1874,14 +1868,11 @@ Button(f5b,text='Defaults',command=defaults,padx=1,pady=1).grid(column=0,
row=3,sticky='EW') row=3,sticky='EW')
ldsec=Label(f5b, bg='white', fg='black', text='Dsec 0.0', width=8, relief=RIDGE) ldsec=Label(f5b, bg='white', fg='black', text='Dsec 0.0', width=8, relief=RIDGE)
ldsec.grid(column=0,row=4,ipadx=3,padx=2,pady=5,sticky='EW') ldsec.grid(column=0,row=4,ipadx=3,padx=2,pady=5,sticky='EW')
#lrdsec=Label(f5b, bg='white', fg='black', text='RDsec 0.0', width=8, relief=RIDGE) lshift=Label(f5b, bg='white', fg='black', text='Shift 0.0', width=8, relief=RIDGE)
#lrdsec.grid(column=1,row=4,ipadx=3,padx=2,pady=5,sticky='EW') lshift.grid(column=1,row=4,ipadx=3,padx=2,pady=5,sticky='EW')
Widget.bind(ldsec,'<Button-1>',incdsec) Widget.bind(ldsec,'<Button-1>',incdsec)
Widget.bind(ldsec,'<Button-3>',decdsec) Widget.bind(ldsec,'<Button-3>',decdsec)
#Widget.bind(lrdsec,'<Button-1>',incrdsec) Widget.bind(lshift,'<Button-1>',toggle_shift)
#Widget.bind(lrdsec,'<Button-3>',decrdsec)
#Widget.bind(lrdsec,'<Button-1>',stub)
#Widget.bind(lrdsec,'<Button-3>',stub)
f5b.pack(side=LEFT,expand=0,fill=BOTH) f5b.pack(side=LEFT,expand=0,fill=BOTH)

26
wsjt1.F
View File

@ -1,7 +1,7 @@
subroutine wsjt1(d,jz0,istart,samfacin,FileID,ndepth,MinSigdB, subroutine wsjt1(d,jz0,istart,samfacin,FileID,ndepth,MinSigdB,
+ NQRN,DFTolerance,NSaveCum,MouseButton,NClearAve, + NQRN,DFTolerance,MouseButton,NClearAve,
+ Mode,NFreeze,NAFC,NZap,AppDir,utcdate,mode441,mode65, + Mode,NFreeze,NAFC,NZap,mode65,
+ MyCall,HisCall,HisGrid,neme,nsked,naggressive,ntx2,s2, + MyCall,HisCall,HisGrid,neme,nsked,ntx2,s2,
+ ps0,npkept,lumsg,basevb,rmspower,nslim2,psavg,ccf,Nseg, + ps0,npkept,lumsg,basevb,rmspower,nslim2,psavg,ccf,Nseg,
+ MouseDF,NAgain,LDecoded,nspecial,ndf,ss1,ss2) + MouseDF,NAgain,LDecoded,nspecial,ndf,ss1,ss2)
@ -13,10 +13,7 @@
integer MinSigdB !Minimum ping strength, dB integer MinSigdB !Minimum ping strength, dB
integer NQRN !QRN rejection parameter integer NQRN !QRN rejection parameter
integer DFTolerance !Defines DF search range integer DFTolerance !Defines DF search range
integer NSaveCum !Set to 1 if cumulative file is to be saved
integer NSyncOK !Set to 1 if JT65 file synchronized OK integer NSyncOK !Set to 1 if JT65 file synchronized OK
character AppDir*80 !Installation directory for WSJT
character*12 utcdate
character*12 mycall character*12 mycall
character*12 hiscall character*12 hiscall
character*6 hisgrid character*6 hisgrid
@ -48,14 +45,11 @@
integer*1 dtmp integer*1 dtmp
character msg3*3 character msg3*3
character cfile6*6 character cfile6*6
character fname*99,fcum*99
logical lcum logical lcum
integer indx(100) integer indx(100)
character*90 line character*90 line
character*24 today
common/avecom/dat(NP2),labdat,jza,modea common/avecom/dat(NP2),labdat,jza,modea
common/avecom2/f0a
common/ccom/nline,tping(100),line(100) common/ccom/nline,tping(100),line(100)
common/limcom/ nslim2a common/limcom/ nslim2a
common/clipcom/ nclip common/clipcom/ nclip
@ -130,7 +124,7 @@ C Intentionally degrade SNR by -nclip dB.
if(mode.ne.2 .and. nzap.ne.0) then if(mode.ne.2 .and. nzap.ne.0) then
nfrz=NFreeze nfrz=NFreeze
if(mode.eq.1) nfrz=0 if(mode.eq.1) nfrz=0
if(jz.gt.100000) call avesp2(dat,jz,2,f0a,mode,nfrz,MouseDF, if(jz.gt.100000) call avesp2(dat,jz,2,mode,nfrz,MouseDF,
+ DFTolerance,fzap) + DFTolerance,fzap)
nadd=1 nadd=1
call bzap(dat,jz,nadd,mode,fzap) call bzap(dat,jz,nadd,mode,fzap)
@ -186,7 +180,7 @@ C Intentionally degrade SNR by -nclip dB.
jz=jz2 jz=jz2
nadd=1 nadd=1
fzap(1)=0. fzap(1)=0.
if(nzap.eq.1) call avesp2(dat,jz,nadd,f0a,mode,NFreeze,MouseDF, if(nzap.eq.1) call avesp2(dat,jz,nadd,mode,NFreeze,MouseDF,
+ DFTolerance,fzap) + DFTolerance,fzap)
if(nzap.eq.1.and.nstest.eq.0) call bzap(dat,jz,nadd,mode,fzap) if(nzap.eq.1.and.nstest.eq.0) call bzap(dat,jz,nadd,mode,fzap)
@ -202,7 +196,7 @@ C Intentionally degrade SNR by -nclip dB.
+ NClearAve,MinSigdB,DFTolerance,NFreeze,NAFC,mode65,Nseg, + NClearAve,MinSigdB,DFTolerance,NFreeze,NAFC,mode65,Nseg,
+ MouseDF,NAgain,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,snrsh,
+ NSyncOK,ccf,psavg,ndiag,nwsh) + NSyncOK,ccf,psavg,ndiag,nwsh)
goto 900 goto 900
endif endif
@ -224,7 +218,6 @@ C Intentionally degrade SNR by -nclip dB.
call synct(dat,jz,jstart,f0,smax) call synct(dat,jz,jstart,f0,smax)
call syncf1(dat,jz,jstart,f0,NFreeze,DFTolerance,smax,red) call syncf1(dat,jz,jstart,f0,NFreeze,DFTolerance,smax,red)
f0a=f0
do i=1,512 do i=1,512
ccf(i-6)=dB(red(i)) ccf(i-6)=dB(red(i))
enddo enddo
@ -253,8 +246,6 @@ C Call the decoder if DF is in range or Freeze is off.
+ NFixLen,lcum,f0,lumsg,npkept,yellow) + NFixLen,lcum,f0,lumsg,npkept,yellow)
endif endif
if(npkept.eq.0) f0a=0.
if(pick) then if(pick) then
do i=1,216 do i=1,216
ps0(i)=yellow0(i) ps0(i)=yellow0(i)
@ -289,9 +280,8 @@ C Look for single-tone messages
if(nline.gt.nline0) STfound=.true. !ST message(s) found if(nline.gt.nline0) STfound=.true. !ST message(s) found
C Now the multi-tone decoding C Now the multi-tone decoding
call mtdecode(dat,jz,s2,nchan,nz,MinSigdB,MinWidth, call mtdecode(dat,jz,nz,MinSigdB,MinWidth,
+ NQRN,DFTolerance,istart,pick,MouseButton,NSaveCum, + NQRN,DFTolerance,istart,pick,cfile6,ps0)
+ cfile6,ps0)
npkept=nline !Number of pings that were kept npkept=nline !Number of pings that were kept
smax=0. smax=0.

View File

@ -1,7 +1,7 @@
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,mycall,hiscall,hisgrid, + ndepth,neme,nsked,mycall,hiscall,hisgrid,
+ lumsg,lcum,nspecial,ndf,nstest,dfsh,iderrsh,idriftsh, + lumsg,lcum,nspecial,ndf,nstest,dfsh,
+ snrsh,NSyncOK,ccfblue,ccfred,ndiag,nwsh) + snrsh,NSyncOK,ccfblue,ccfred,ndiag,nwsh)
C Orchestrates the process of decoding JT65 messages, using data that C Orchestrates the process of decoding JT65 messages, using data that
@ -13,18 +13,15 @@ C already been done.
logical first logical first
logical lcum logical lcum
character decoded*22,cfile6*6,special*5,cooo*3 character decoded*22,cfile6*6,special*5,cooo*3
character*22 avemsg1,avemsg2,deepmsg,deepbest character*22 avemsg1,avemsg2,deepmsg
character*67 line,ave1,ave2 character*67 line,ave1,ave2
character*1 csync,c1 character*1 csync,c1
character*12 mycall character*12 mycall
character*12 hiscall character*12 hiscall
character*6 hisgrid character*6 hisgrid
real ccfblue(-5:540),ccfred(-224:224) real ccfblue(-5:540),ccfred(-224:224)
real ftrack(126)
logical lmid
integer itf(2,9) integer itf(2,9)
include 'avecom.h' include 'avecom.h'
common/avecom2/f0a
data first/.true./,ns10/0/,ns20/0/ data first/.true./,ns10/0/,ns20/0/
data itf/0,0, 1,0, -1,0, 0,-1, 0,1, 1,-1, 1,1, -1,-1, -1,1/ data itf/0,0, 1,0, -1,0, 0,-1, 0,1, 1,-1, 1,1, -1,-1, -1,1/
save save
@ -56,7 +53,7 @@ C already been done.
endif endif
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,MouseDF,
+ mode65,dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width) + mode65,dtx,dfx,snrx,snrsync,ccfblue,ccfred,flip,width)
f0=1270.46 + dfx f0=1270.46 + dfx
csync=' ' csync=' '
@ -115,7 +112,7 @@ C If we get here, we have achieved sync!
endif endif
call decode65(dat,npts,dtx,dfx,flip,ndepth,neme,nsked, call decode65(dat,npts,dtx,dfx,flip,ndepth,neme,nsked,
+ nsnr,mycall,hiscall,hisgrid,mode65,nafc,decoded, + mycall,hiscall,hisgrid,mode65,nafc,decoded,
+ ncount,deepmsg,qual) + ncount,deepmsg,qual)
if(ncount.eq.-999) qual=0 !Bad data if(ncount.eq.-999) qual=0 !Bad data
200 kvqual=0 200 kvqual=0
@ -156,10 +153,10 @@ 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, + nq1,nq2,neme,nsked,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, + nq1,nq2,neme,nsked,mycall,hiscall,hisgrid,qual2,
+ ns2,ncount2) + ns2,ncount2)
nqual1=qual1 nqual1=qual1
nqual2=qual2 nqual2=qual2
@ -208,7 +205,6 @@ C If Monitor segment #2 is available, write that line also
call flushqqq(12) call flushqqq(12)
800 if(lumsg.ne.6) end file 11 800 if(lumsg.ne.6) end file 11
f0a=f0
900 continue 900 continue