1program test_q65 2 3 character*84 cmd1,cmd2,line 4 character*22 msg 5 character*8 arg 6 character*1 csubmode 7 integer naptype(0:5) 8 logical decok 9 10 nargs=iargc() 11 if(nargs.ne.12) then 12 print*,'Usage: test_q65 "msg" A-D depth freq DT fDop f1 Stp TRp Q nfiles SNR' 13 print*,'Example: test_q65 "K1ABC W9XYZ EN37" A 3 1500 0.0 5.0 0.0 1 60 3 100 -20' 14 print*,'Use SNR = 0 to loop over all relevant SNRs' 15 print*,'Use MyCall=K1ABC, HisCall=W9XYZ, HisGrid="EN37" for AP decodes' 16 print*,'Option Q sets QSOprogress (0-5) for AP decoding.' 17 print*,'Add 16 to requested depth to enable message averaging.' 18 go to 999 19 endif 20 call getarg(1,msg) 21 call getarg(2,csubmode) 22 call getarg(3,arg) 23 read(arg,*) ndepth 24 call getarg(4,arg) 25 read(arg,*) nf0 26 call getarg(5,arg) 27 read(arg,*) dt 28 call getarg(6,arg) 29 read(arg,*) fDop 30 call getarg(7,arg) 31 read(arg,*) f1 32 call getarg(8,arg) 33 read(arg,*) nstp 34 call getarg(9,arg) 35 read(arg,*) ntrperiod 36 call getarg(10,arg) 37 read(arg,*) nQSOprogress 38 call getarg(11,arg) 39 read(arg,*) nfiles 40 call getarg(12,arg) 41 read(arg,*) snr 42 43 if(ntrperiod.eq.15) then 44 nsps=1800 45 i50=-23 46 else if(ntrperiod.eq.30) then 47 nsps=3600 48 i50=-26 49 else if(ntrperiod.eq.60) then 50 nsps=7200 51 i50=-29 52 else if(ntrperiod.eq.120) then 53 nsps=16000 54 i50=-31 55 else if(ntrperiod.eq.300) then 56 nsps=41472 57 i50=-35 58 else 59 stop 'Invalid TR period' 60 endif 61 62 i50=i50 + 8.0*log(1.0+fDop)/log(240.0) 63 ia=i50 + 7 64 ib=i50 - 10 65 if(snr.ne.0.0) then 66 ia=99 67 ib=99 68 endif 69 70 baud=12000.0/nsps 71 tsym=1.0/baud 72 73! 1 2 3 4 5 6 7 74! 1234567890123456789012345678901234567890123456789012345678901234567890123456' 75 cmd1='q65sim "K1ABC W9XYZ EN37 " A 1500 5.0 0.0 0.0 1 60 100 -10.0 > junk0' 76 cmd2='jt9 -3 -p 15 -L 300 -H 3000 -d 3 -b A -Q 3 -f 1500 -X 32 *.wav > junk' 77 78 write(cmd1(10:33),'(a)') '"'//msg//'"' 79 cmd1(35:35)=csubmode 80 write(cmd1(37:40),'(i4)') nf0 81 write(cmd1(41:45),'(f5.0)') fDop 82 write(cmd1(46:50),'(f5.2)') dt 83 write(cmd1(51:56),'(i6)') nint(f1) 84 write(cmd1(57:59),'(i3)') nstp 85 write(cmd1(60:63),'(i4)') ntrperiod 86 write(cmd1(64:68),'(i5)') nfiles 87 88 write(cmd2(11:13),'(i3)') ntrperiod 89 write(cmd2(33:35),'(i3)') ndepth 90 write(cmd2(45:45),'(i1)') nQSOprogress 91 write(cmd2(50:53),'(i4)') nf0 92 cmd2(40:40)=csubmode 93 94 call system('rm -f *.wav') 95 96 write(*,1008) ntrperiod,csubmode,ndepth,fDop,f1,nstp 971008 format('Mode:',i4,a1,' Depth:',i3,' fDop:',f6.1,' Drift:',f8.1, & 98 ' Steps:',i3) 99 write(*,1010) (j,j=0,5) 100 write(12,1010) (j,j=0,5) 1011010 format(' SNR Sync Avg Dec Bad',6i4,' tdec avg rms'/64('-')) 102 103 dterr=tsym/4.0 104 nferr=max(1,nint(0.5*baud),nint(fdop/3.0)) 105 ndec1z=nfiles 106 107 do nsnr=ia,ib,-1 108 snr1=nsnr 109 if(ia.eq.99) snr1=snr 110 nsync=0 111 ndec1=0 112 nfalse=0 113 naptype=0 114 ndecn=0 115 write(cmd1(72:76),'(f5.1)') snr1 116 call system(cmd1) 117 call sec0(0,tdec) 118 call system(cmd2) 119 call sec0(1,tdec) 120 open(10,file='junk',status='unknown') 121 n=0 122 snrsum=0. 123 snrsq=0. 124 nsum=0 125 do iline=1,9999 126 read(10,'(a71)',end=10) line 127 if(index(line,'<Decode').eq.1) cycle 128 read(line,*) itime,xsnr,xdt,nf 129 decok=index(line,trim(msg)).gt.0 130 if(decok) then 131 snrsum=snrsum + xsnr 132 snrsq=snrsq + xsnr*xsnr 133 nsum=nsum+1 134 endif 135 if((abs(xdt-dt).le.dterr .and. abs(nf-nf0).le.nferr) .or. decok) then 136 nsync=nsync+1 137 endif 138 idec=-1 139 iavg=0 140 i0=23 141 if(ntrperiod.le.30) i0=25 142 if(line(i0:i0).ne.' ') then 143 i1=index(line,'q') 144 idec=-1 145 read(line(i1+1:i1+1),*) idec 146 if(line(i1+2:i1+2).eq.'*') then 147 iavg=10 148 else 149 read(line(i1+2:i1+2),*,end=100) iavg 150 endif 151 endif 152100 if(idec.lt.0) cycle 153 if(decok) then 154 ndecn=ndecn + 1 155 if(iavg.le.1) ndec1=ndec1 + 1 156 naptype(idec)=naptype(idec) + 1 157 else 158 nfalse=nfalse + 1 159 print*,'False: ',line 160 endif 161 enddo 16210 close(10) 163 snr_avg=0. 164 snr_rms=0. 165 if(nsum.ge.1) then 166 snr_avg=snrsum/nsum 167 snr_rms=sqrt(snrsq/nsum - snr_avg**2) 168 endif 169 write(*,1100) snr1,nsync,ndecn,ndec1,nfalse,naptype,tdec/nfiles, & 170 snr_avg,snr_rms 171 write(12,1100) snr1,nsync,ndecn,ndec1,nfalse,naptype,tdec/nfiles, & 172 snr_avg,snr_rms 1731100 format(f5.1,4i4,i5,5i4,f6.2,f6.1,f5.1) 174 if(ndec1.lt.nfiles/2 .and. ndec1z.ge.nfiles/2) then 175 snr_thresh=snr1 + float(nfiles/2 - ndec1)/(ndec1z-ndec1) 176 open(13,file='snr_thresh.out',status='unknown',position='append') 177 write(13,1200) ntrperiod,csubmode,ndepth,nQSOprogress,nfiles, & 178 fdop,f1,nstp,nfalse,snr_thresh,trim(msg) 1791200 format(i3,a1,2i3,i5,2f7.1,2i3,f7.1,2x,a) 180 close(13) 181 endif 182 flush(6) 183 flush(12) 184 if(ndec1.eq.0 .and. ndecn.eq.0) exit !Bail out if no decodes at this SNR 185 ndec1z=ndec1 186 enddo ! nsnr 187 188999 end program test_q65 189 190include 'sec0.f90' 191 192