mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 13:30:52 -05:00 
			
		
		
		
	Move calculation of echo snr into a separate subroutine.
This commit is contained in:
		
							parent
							
								
									03b680dee5
								
							
						
					
					
						commit
						87dcde7564
					
				@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user