2022-04-22 15:34:12 -04:00
|
|
|
subroutine echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,fpeak,snr_detect)
|
2022-04-22 13:07:23 -04:00
|
|
|
|
|
|
|
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
|
2022-04-22 15:34:12 -04:00
|
|
|
wh=0.5*fspread+10.0
|
2022-04-22 13:07:23 -04:00
|
|
|
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
|
|
|
|
|
2022-04-22 15:34:12 -04:00
|
|
|
! call pctile(sb(i1),i2-i1,50,r0)
|
|
|
|
! call pctile(sb(i3+1),i4-i3,50,r1)
|
|
|
|
! ave=0.5*(r0+r1)
|
|
|
|
! blue=sa/ave
|
|
|
|
! red=sb/ave
|
2022-04-22 13:07:23 -04:00
|
|
|
|
2022-04-22 15:34:12 -04:00
|
|
|
baseline=(sum(sb(i1:i2-1)) + sum(sb(i3+1:i4)))/(i2+i4-i1-i3)
|
|
|
|
blue=sa/baseline
|
|
|
|
red=sb/baseline
|
2022-04-22 13:07:23 -04:00
|
|
|
psig=sum(red(i2:i3)-1.0)
|
|
|
|
pnoise_2500 = 2500.0/df
|
|
|
|
snrdb=db(psig/pnoise_2500)
|
|
|
|
|
|
|
|
smax=0.
|
2022-04-22 15:34:12 -04:00
|
|
|
mh=max(1,nint(0.2*fspread/df))
|
2022-04-22 13:07:23 -04:00
|
|
|
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)
|
2022-04-22 15:34:12 -04:00
|
|
|
if(db_err.lt.0.5) db_err=0.5
|
2022-04-22 13:07:23 -04:00
|
|
|
|
|
|
|
return
|
|
|
|
end subroutine echo_snr
|