Move calculation of echo snr into a separate subroutine.

This commit is contained in:
Joe Taylor 2022-04-22 11:43:28 -04:00
parent 03b680dee5
commit 87dcde7564

View File

@ -12,9 +12,12 @@ program test_snr
complex c(0:NH) complex c(0:NH)
real x(NFFT) real x(NFFT)
real s(8192) real s(8192)
real sa(4096)
real sb(4096)
real red(4096)
real blue(4096)
character*80 infile character*80 infile
integer ipkv(1) equivalence (x,c)
equivalence (x,c),(ipk,ipkv)
nargs=iargc() nargs=iargc()
if(nargs.lt.1) then if(nargs.lt.1) then
@ -45,35 +48,10 @@ program test_snr
enddo enddo
enddo enddo
wh=0.5*fspread0+10.0 sa=s(2049:6144)
i1=nint((1500.0 - 2.0*wh)/df) sb=s(2049:6144)
i2=nint((1500.0 - wh)/df)
i3=nint((1500.0 + wh)/df)
i4=nint((1500.0 + 2.0*wh)/df)
baseline=(sum(s(i1:i2-1)) + sum(s(i3+1:i4)))/(i2+i4-i1-i3) call echo_snr(sa,sb,fspread0,blue,red,snrdb,db_err,fpeak,snr_detect)
s=s/baseline
psig=sum(s(i2:i3)-1.0)
pnoise_2500 = 2500.0/df
snrdb=db(psig/pnoise_2500)
smax=0.
mh=max(1,nint(0.2*fspread0/df))
do i=i2,i3
ssum=sum(s(i-mh:i+mh))
if(ssum.gt.smax) then
smax=ssum
ipk=i
endif
enddo
fpeak=ipk*df - 1500.0
call averms(s(i1:i2-1),i2-i1,-1,ave1,rms1)
call averms(s(i3+1:i4),i4-i3,-1,ave2,rms2)
perr=0.707*(rms1+rms2)*sqrt(float(i2-i1+i4-i3))
snr_detect=psig/perr
db_err=99.0
if(psig.gt.perr) db_err=snrdb - db((psig-perr)/pnoise_2500)
nsum=npings nsum=npings
nqual=0 nqual=0
@ -84,10 +62,10 @@ program test_snr
if(nqual.lt.0) nqual=0 if(nqual.lt.0) nqual=0
if(nqual.gt.10) nqual=10 if(nqual.gt.10) nqual=10
write(*,1010) fspread0,wh,snrdb0,snrdb,snrdb-snrdb0,db_err,fpeak, & write(*,1010) fspread0,snrdb0,snrdb,snrdb-snrdb0,db_err,fpeak, &
snr_detect,nqual snr_detect,nqual
1010 format(6f6.1,2f7.1,i3) 1010 format(5f6.1,2f7.1,i4)
do i=1,8192 do i=1,8192
write(12,1100) i*df,s(i) write(12,1100) i*df,s(i)
@ -95,3 +73,48 @@ program test_snr
enddo enddo
999 end program test_snr 999 end program test_snr
subroutine echo_snr(sa,sb,fspread0,blue,red,snrdb,db_err,fpeak,snr_detect)
parameter (NZ=4096)
real sa(NZ)
real sb(NZ)
real blue(NZ)
real red(NZ)
integer ipkv(1)
equivalence (ipk,ipkv)
df=12000.0/32768.0
wh=0.5*fspread0+10.0
i1=nint((1500.0 - 2.0*wh)/df) - 2048
i2=nint((1500.0 - wh)/df) - 2048
i3=nint((1500.0 + wh)/df) - 2048
i4=nint((1500.0 + 2.0*wh)/df) - 2048
baseline=(sum(sb(i1:i2-1)) + sum(sb(i3+1:i4)))/(i2+i4-i1-i3)
blue=sa/baseline
red=sb/baseline
psig=sum(red(i2:i3)-1.0)
pnoise_2500 = 2500.0/df
snrdb=db(psig/pnoise_2500)
smax=0.
mh=max(1,nint(0.2*fspread0/df))
do i=i2,i3
ssum=sum(red(i-mh:i+mh))
if(ssum.gt.smax) then
smax=ssum
ipk=i
endif
enddo
fpeak=ipk*df - 750.0
call averms(red(i1:i2-1),i2-i1,-1,ave1,rms1)
call averms(red(i3+1:i4),i4-i3,-1,ave2,rms2)
perr=0.707*(rms1+rms2)*sqrt(float(i2-i1+i4-i3))
snr_detect=psig/perr
db_err=99.0
if(psig.gt.perr) db_err=snrdb - db((psig-perr)/pnoise_2500)
return
end subroutine echo_snr