program jt65 ! Test the JT65 decoder for WSJT-X use options use timer_module, only: timer use timer_impl, only: init_timer use jt65_test use readwav character c,mode logical :: display_help=.false.,nrobust=.false.,single_decode=.false. type(wav_header) :: wav integer*2 id2(NZMAX) real*4 dd(NZMAX) character*80 infile character(len=500) optarg character*12 mycall,hiscall character*6 hisgrid type (option) :: long_options(12) = [ & option ('aggressive',.true.,'a','aggressiveness [0-10], default AGGR=0','AGGR'), & option ('depth',.true.,'d','depth=5 hinted decoding, default DEPTH=0','DEPTH'), & option ('freq',.true.,'f','signal frequency, default FREQ=1270','FREQ'), & option ('help',.false.,'h','Display this help message',''), & option ('mode',.true.,'m','Mode A, B, C. Default is A.','MODE'), & option ('ntrials',.true.,'n','number of trials, default TRIALS=10000','TRIALS'), & option ('robust-sync',.false.,'r','robust sync',''), & option ('my-call',.true.,'c','my callsign',''), & option ('his-call',.true.,'x','his callsign',''), & option ('his-grid',.true.,'g','his grid locator',''), & option ('experience-decoding',.true.,'X' & ,'experience decoding options (1..n), default FLAGS=0','FLAGS'), & option ('single-signal-mode',.false.,'s','decode at signal frequency only','') ] naggressive=0 nfqso=1500 ntrials=10000 nexp_decode=0 ntol=1000 nsubmode=0 nlow=200 nhigh=4000 n2pass=2 ndepth=3 do call getopt('a:d:f:hm:n:rc:x:g:X:s',long_options,c,optarg,narglen,nstat,noffset,nremain,.true.) if( nstat .ne. 0 ) then exit end if select case (c) case ('a') read (optarg(:narglen), *) naggressive case ('d') read (optarg(:narglen), *) ndepth case ('f') read (optarg(:narglen), *) nfqso case ('h') display_help = .true. case ('m') read (optarg(:narglen), *) mode if( mode .eq. 'b' .or. mode .eq. 'B' ) then nsubmode=1 endif if( mode .eq. 'c' .or. mode .eq. 'C' ) then nsubmode=2 endif case ('n') read (optarg(:narglen), *) ntrials case ('r') nrobust=.true. case ('c') read (optarg(:narglen), *) mycall case ('x') read (optarg(:narglen), *) hiscall case ('g') read (optarg(:narglen), *) hisgrid case ('X') read (optarg(:narglen), *) nexp_decode case ('s') single_decode=.true. ntol=100 nlow=nfqso-ntol nhigh=nfqso+ntol n2pass=1 end select end do if(single_decode) nexp_decode=ior(nexp_decode,32) if(display_help .or. nstat.lt.0 .or. nremain.lt.1) then print *, '' print *, 'Usage: jt65 [OPTIONS] file1 [file2 ...]' print *, '' print *, ' JT65 decode pre-recorded .WAV file(s)' print *, '' print *, 'OPTIONS:' print *, '' do i = 1, size (long_options) call long_options(i) % print (6) end do go to 999 endif call init_timer ('timer.out') call timer('jt65 ',0) ndecoded=0 do ifile=noffset+1,noffset+nremain nfa=nlow nfb=nhigh minsync=0 call get_command_argument(ifile,optarg,narglen) infile=optarg(:narglen) call timer('read ',0) call wav%read (infile) i1=index(infile,'.wav') if( i1 .eq. 0 ) i1=index(infile,'.WAV') read(infile(i1-4:i1-1),*,err=998) nutc npts=52*12000 read(unit=wav%lun) id2(1:npts) close(unit=wav%lun) call timer('read ',1) dd(1:npts)=id2(1:npts) dd(npts+1:)=0. call test(dd,nutc,nfa,nfb,nfqso,ntol,nsubmode, & n2pass,nrobust,ntrials,naggressive,ndepth, & mycall,hiscall,hisgrid,nexp_decode) if(nft.gt.0) exit enddo call timer('jt65 ',1) call timer('jt65 ',101) ! call four2a(a,-1,1,1,1) !Free the memory used for plans ! call filbig(a,-1,1,0.0,0,0,0,0,0) ! (ditto) go to 999 998 print*,'Cannot read from file:' print*,infile 999 continue end program jt65