Add submode to argument list of JT9 subroutine decode().

Add test program fersum; several tweaks to fer65.
Code cleanup in lorentzian, and return chisqr in a(5).


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6567 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2016-04-01 17:57:08 +00:00
parent 71db4c2051
commit cb8eeba835
6 changed files with 100 additions and 27 deletions

View File

@ -93,9 +93,10 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
else if(params%nmode.eq.9 .or. (params%nmode.eq.(65+9) .and. params%ntxmode.eq.9)) then else if(params%nmode.eq.9 .or. (params%nmode.eq.(65+9) .and. params%ntxmode.eq.9)) then
! We're in JT9 mode, or should do JT9 first ! We're in JT9 mode, or should do JT9 first
call timer('decjt9 ',0) call timer('decjt9 ',0)
call my_jt9%decode(jt9_decoded,ss,id2,params%nutc,params%nfqso,newdat9,params%npts8, & call my_jt9%decode(jt9_decoded,ss,id2,params%nutc,params%nfqso, &
params%nfa,params%nfsplit,params%nfb,params%ntol,params%nzhsym, & newdat9,params%npts8,params%nfa,params%nfsplit,params%nfb, &
logical(params%nagain),params%ndepth,params%nmode) params%ntol,params%nzhsym,logical(params%nagain),params%ndepth, &
params%nmode,params%nsubmode)
call timer('decjt9 ',1) call timer('decjt9 ',1)
endif endif
@ -114,9 +115,10 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
call timer('jt65a ',1) call timer('jt65a ',1)
else else
call timer('decjt9 ',0) call timer('decjt9 ',0)
call my_jt9%decode(jt9_decoded,ss,id2,params%nutc,params%nfqso,newdat9,params%npts8,& call my_jt9%decode(jt9_decoded,ss,id2,params%nutc,params%nfqso, &
params%nfa,params%nfsplit,params%nfb,params%ntol,params%nzhsym, & newdat9,params%npts8,params%nfa,params%nfsplit,params%nfb, &
logical(params%nagain),params%ndepth,params%nmode) params%ntol,params%nzhsym,logical(params%nagain), &
params%ndepth,params%nmode,params%nsubmode)
call timer('decjt9 ',1) call timer('decjt9 ',1)
end if end if
endif endif

View File

@ -2,7 +2,7 @@ real function fchisq0(y,npts,a)
real y(npts),a(4) real y(npts),a(4)
rewind 51 ! rewind 51
chisq = 0. chisq = 0.
do i=1,npts do i=1,npts
x=i x=i

View File

@ -20,7 +20,7 @@ program fer65
implicit real*8 (a-h,o-z) implicit real*8 (a-h,o-z)
real*8 s(7),sq(7) real*8 s(7),sq(7)
character arg*12,cmnd*100,decoded*22,submode*1,csync*1,f1*15,f2*15 character arg*12,cmnd*100,decoded*22,submode*1,csync*1,f1*15,f2*15
character*10 outfile character*12 outfile
logical syncok logical syncok
nargs=iargc() nargs=iargc()
@ -44,19 +44,18 @@ program fer65
call getarg(7,arg) call getarg(7,arg)
read(arg,*) iters read(arg,*) iters
write(outfile,1001) submode,d,navg,nds write(outfile,1001) submode,d,navg,nds
1001 format(a1,f4.1,'_',i2.2,'_',i1) 1001 format(a1,f6.2,'_',i2.2,'_',i1)
if(outfile(2:2).eq.' ') outfile(2:2)='0' if(outfile(2:2).eq.' ') outfile(2:2)='0'
if(outfile(3:3).eq.' ') outfile(3:3)='0'
ndepth=3 ndepth=3
if(navg.gt.1) ndepth=ndepth+16 if(navg.gt.1) ndepth=ndepth+16
if(nds.ne.0) ndepth=ndepth+32 if(nds.ne.0) ndepth=ndepth+32
dfmax=min(d,0.5*2.69) dfmax=3
if(submode.eq.'b' .or. submode.eq.'B') dfmax=min(d,2.69) if(submode.eq.'b' .or. submode.eq.'B') dfmax=6
if(submode.eq.'c' .or. submode.eq.'C') dfmax=min(d,2.0*2.69) if(submode.eq.'c' .or. submode.eq.'C') dfmax=11
if(dfmax.lt.0.5*2.69) dfmax=0.5*2.69
ntrials=1000 ntrials=1000
naggressive=10 naggressive=10
@ -64,9 +63,9 @@ program fer65
open(20,file=outfile,status='unknown') open(20,file=outfile,status='unknown')
open(21,file='fer65.21',status='unknown') open(21,file='fer65.21',status='unknown')
write(20,1000) submode,iters,ntrials,naggressive,d,iand(ndepth,3),navg,nds write(20,1000) submode,iters,ntrials,naggressive,d,ndepth,navg,nds
1000 format(/'JT65',a1,' Iters:',i5,' T:',i6,' Aggr:',i3, & 1000 format(/'JT65',a1,' Iters:',i5,' T:',i6,' Aggr:',i3, &
' Dop:',f5.1,' Depth:',i2,' Navg:',i3,' DS:',i2) ' Dop:',f6.2,' Depth:',i2,' Navg:',i3,' DS:',i2)
write(20,1002) write(20,1002)
1002 format(/' dB nsync ngood nbad sync dsnr ', & 1002 format(/' dB nsync ngood nbad sync dsnr ', &
'DT Freq Nsum Width'/85('-')) 'DT Freq Nsum Width'/85('-'))
@ -75,7 +74,6 @@ program fer65
do isnr=0,20 do isnr=0,20
snr=snr1+isnr snr=snr1+isnr
if(snr.gt.snr2) exit if(snr.gt.snr2) exit
nsync=0 nsync=0
ngood=0 ngood=0
nbad=0 nbad=0
@ -83,7 +81,7 @@ program fer65
sq=0. sq=0.
do iter=1,iters do iter=1,iters
write(cmnd,1010) submode,d,snr,navg write(cmnd,1010) submode,d,snr,navg
1010 format('./jt65sim -n 1 -m ',a1,' -d',f6.1,' -s \\',f5.1,' -f',i3,' >devnull') 1010 format('./jt65sim -n 1 -m ',a1,' -d',f7.2,' -s \\',f5.1,' -f',i3,' >devnull')
call unlink('000000_????.wav') call unlink('000000_????.wav')
call system(cmnd) call system(cmnd)
if(navg.gt.1) then if(navg.gt.1) then

72
lib/fersum.f90 Normal file
View File

@ -0,0 +1,72 @@
program fersum
character mode*5
character infile*40
real dop(0:9)
real thresh(0:9,12),threshsync(0:9,12)
data dop/0.25,0.5,1.0,2.0,4.0,8.0,16.0,32.0,64.0,128.0/
nargs=iargc()
if(nargs.ne.1) then
print*,'Usage: fersum <infile>'
go to 999
endif
call getarg(1,infile)
open(10,file=infile,status='old')
thresh=0.
threshsync=0.
do iblk=1,999
1 read(10,1002,end=100) mode,iters,ntot,naggr,d,navg,nds
1002 format(a5,8x,i5,4x,i6,7x,i3,6x,f6.2,17x,i3,5x,i2)
write(33,*) iblk,mode
if(mode.eq.' ') go to 1
read(10,1002)
read(10,1002)
read(10,1002)
nsync0=0
ngood0=0
xsum0=0.
do n=1,99
read(10,1010,end=100) snr,nsync,ngood,nbad,xsync,esync,dsnr,esnr, &
xdt,edt,dfreq,efreq,xsum,esum,xwidth,ewidth
1010 format(f5.1,2i6i4,2f6.1,f6.1,f5.1,f6.2,f5.2,6f5.1)
if(snr.eq.0.0) exit
if(mode(5:5).eq.'A') nmode=1
if(mode(5:5).eq.'B') nmode=2
if(mode(5:5).eq.'C') nmode=3
j=nint(log(d)/log(2.0) + 2.0)
if(navg.eq.1 .and. nds.eq.0) k=nmode
if(navg.eq.1 .and. nds.eq.1) k=nmode+3
if(navg.gt.1 .and. nds.eq.0) k=nmode+6
if(navg.gt.1 .and. nds.eq.1) k=nmode+9
if(nsync0.le.iters/2 .and. nsync.ge.iters/2) then
threshsync(j,k)=snr-float(nsync-iters/2)/(nsync-nsync0)
endif
if(ngood0.le.iters/2 .and. ngood.ge.iters/2) then
threshold=snr-float(ngood-iters/2)/(ngood-ngood0)
xsumavg=max(1.0,0.5*(xsum0+xsum))
! write(*,1020) mode,iters,ntot,naggr,d,navg,nds,threshold,xsumavg
!1020 format(a5,i7,i7,i3,f7.2,i3,i3,f7.1,f6.1)
thresh(j,k)=threshold
endif
nsync0=nsync
ngood0=ngood
xsum0=xsum
enddo
enddo
100 write(12,1100)
1100 format(' ')
do i=0,9
write(12,1110) dop(i),thresh(i,1:12)
1110 format(f6.2,13f6.1)
enddo
write(12,1110)
do i=0,9
write(12,1110) dop(i),threshsync(i,1:12)
enddo
999 end program fersum

View File

@ -7,7 +7,8 @@ module jt9_decode
end type jt9_decoder end type jt9_decoder
abstract interface abstract interface
subroutine jt9_decode_callback (this, utc, sync, snr, dt, freq, drift, decoded) subroutine jt9_decode_callback (this, utc, sync, snr, dt, freq, drift, &
decoded)
import jt9_decoder import jt9_decoder
implicit none implicit none
class(jt9_decoder), intent(inout) :: this class(jt9_decoder), intent(inout) :: this
@ -23,8 +24,8 @@ module jt9_decode
contains contains
subroutine decode(this,callback,ss,id2,nutc,nfqso,newdat,npts8,nfa,nfsplit,nfb,ntol, & subroutine decode(this,callback,ss,id2,nutc,nfqso,newdat,npts8,nfa, &
nzhsym,nagain,ndepth,nmode) nfsplit,nfb,ntol,nzhsym,nagain,ndepth,nmode,nsubmode)
use timer_module, only: timer use timer_module, only: timer
include 'constants.f90' include 'constants.f90'
@ -42,6 +43,8 @@ contains
common/decstats/ntry65a,ntry65b,n65a,n65b,num9,numfano common/decstats/ntry65a,ntry65b,n65a,n65b,num9,numfano
save ccfred,red2 save ccfred,red2
write(60) nutc,nfqso,ntol,ndepth,nmode,nsubmode,nzhsym,ss,id2(1:60*12000)
this%callback => callback this%callback => callback
nsynced=0 nsynced=0
ndecoded=0 ndecoded=0

View File

@ -8,15 +8,15 @@ subroutine lorentzian(y,npts,a)
! a(4) = width ! a(4) = width
real y(npts) real y(npts)
real a(4) real a(5)
real deltaa(4) real deltaa(4)
real x(2000)
if(npts.gt.2000) stop 'Error in lorentzian' if(npts.gt.2000) stop 'Error in lorentzian'
a=0. a=0.
df=12000.0/8192.0 !df = 1.465 Hz df=12000.0/8192.0 !df = 1.465 Hz
width=0. width=0.
ipk=0
ymax=-1.e30 ymax=-1.e30
do i=1,npts do i=1,npts
if(y(i).gt.ymax) then if(y(i).gt.ymax) then
@ -93,12 +93,10 @@ subroutine lorentzian(y,npts,a)
enddo enddo
chisqr=fchisq0(y,npts,a) chisqr=fchisq0(y,npts,a)
! write(*,4000) 0,0,a,chisqr ! write(*,4000) 0,0,a,chisqr
if(chisqr/chisqr0.gt.0.99) go to 30 if(chisqr/chisqr0.gt.0.99) exit
chisqr0=chisqr chisqr0=chisqr
enddo enddo
a(5)=chisqr
30 ccfbest=ccfmax * (1378.125/fsample)**2
dtbest=dtmax
return return
end subroutine lorentzian end subroutine lorentzian