mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
| subroutine avecho(id2,ndop,nfrit,nauto,navg,nqual,f1,xlevel,snrdb,   &
 | |
|      db_err,dfreq,width,bDiskData)
 | |
| 
 | |
|   integer TXLENGTH
 | |
|   parameter (TXLENGTH=27648)           !27*1024
 | |
|   parameter (NFFT=32768,NH=NFFT/2)
 | |
|   parameter (NZ=4096)
 | |
|   integer*2 id2(34560)                 !Buffer for Rx data
 | |
|   real sa(NZ)      !Avg spectrum relative to initial Doppler echo freq
 | |
|   real sb(NZ)      !Avg spectrum with Dither and changing Doppler removed
 | |
|   real, dimension (:,:), allocatable :: sax
 | |
|   real, dimension (:,:), allocatable :: sbx
 | |
|   integer nsum       !Number of integrations
 | |
|   real dop0          !Doppler shift for initial integration (Hz)
 | |
|   real dop           !Doppler shift for current integration (Hz)
 | |
|   real s(8192)
 | |
|   real x(NFFT)
 | |
|   integer ipkv(1)
 | |
|   logical ex
 | |
|   logical*1 bDiskData
 | |
|   complex c(0:NH)
 | |
|   equivalence (x,c),(ipk,ipkv)
 | |
|   common/echocom/nclearave,nsum,blue(NZ),red(NZ)
 | |
|   common/echocom2/fspread_self,fspread_dx
 | |
|   data navg0/-1/
 | |
|   save dop0,navg0,sax,sbx
 | |
| 
 | |
|   if(navg.ne.navg0) then
 | |
|      if(allocated(sax)) deallocate(sax)
 | |
|      if(allocated(sbx)) deallocate(sbx)
 | |
|      allocate(sax(1:navg,1:NZ))
 | |
|      allocate(sbx(1:navg,1:NZ))
 | |
|      nsum=0
 | |
|      navg0=navg
 | |
|   endif
 | |
|   
 | |
|   fspread=fspread_dx                !### Use the predicted Doppler spread ###
 | |
|   if(bDiskData) fspread=width
 | |
|   if(nauto.eq.1) fspread=fspread_self
 | |
|   inquire(file='fspread.txt',exist=ex)
 | |
|   if(ex) then
 | |
|      open(39,file='fspread.txt',status='old')
 | |
|      read(39,*) fspread
 | |
|      close(39)
 | |
|   endif
 | |
|   fspread=min(max(0.04,fspread),700.0)
 | |
|   width=fspread
 | |
|   dop=ndop
 | |
|   sq=0.
 | |
|   do i=1,TXLENGTH
 | |
|      x(i)=id2(i)
 | |
|      sq=sq + x(i)*x(i)
 | |
|   enddo
 | |
|   xlevel=10.0*log10(sq/TXLENGTH)
 | |
| 
 | |
|   if(nclearave.ne.0) nsum=0
 | |
|   if(nsum.eq.0) then
 | |
|      dop0=dop                             !Remember the initial Doppler
 | |
|      sax=0.                               !Clear the average arrays
 | |
|      sbx=0.
 | |
|   endif
 | |
| 
 | |
|   x(TXLENGTH+1:)=0.
 | |
|   x=x/TXLENGTH
 | |
|   call four2a(x,NFFT,1,-1,0)
 | |
|   df=12000.0/NFFT
 | |
|   do i=1,8192                             !Get spectrum 0 - 3 kHz
 | |
|      s(i)=real(c(i))**2 + aimag(c(i))**2
 | |
|   enddo
 | |
| 
 | |
|   fnominal=1500.0           !Nominal audio frequency w/o doppler or dither
 | |
|   ia=nint((fnominal+dop0-nfrit)/df)
 | |
|   ib=nint((f1+dop-nfrit)/df)
 | |
|   if(ia.lt.2048 .or. ib.lt.2048 .or. ia.gt.6144 .or. ib.gt.6144) then
 | |
|      snrdb=0.
 | |
|      db_err=0.
 | |
|      dfreq=0.
 | |
|      go to 900
 | |
|   endif
 | |
| 
 | |
|   nsum=nsum+1
 | |
|   j=mod(nsum-1,navg)+1
 | |
|   do i=1,NZ
 | |
|      sax(j,i)=s(ia+i-2048)    !Center at initial doppler freq
 | |
|      sbx(j,i)=s(ib+i-2048)    !Center at expected echo freq
 | |
|      sa(i)=sum(sax(1:navg,i))
 | |
|      sb(i)=sum(sbx(1:navg,i))
 | |
|   enddo
 | |
|   
 | |
|   call echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,dfreq,snr_detect)
 | |
|   nqual=snr_detect-2
 | |
|   if(nqual.lt.0) nqual=0
 | |
|   if(nqual.gt.10) nqual=10
 | |
| 
 | |
| ! Scale for plotting
 | |
|   redmax=maxval(red)
 | |
|   fac=10.0/max(redmax,10.0)
 | |
|   blue=fac*blue
 | |
|   red=fac*red
 | |
|   nsmo=max(0.0,0.25*width/df)
 | |
|   do i=1,nsmo
 | |
|      call smo121(red,NZ)
 | |
|      call smo121(blue,NZ)
 | |
|   enddo
 | |
| 
 | |
|   ia=50.0/df
 | |
|   ib=250.0/df
 | |
|   call pctile(red(ia:ib),ib-ia+1,50,bred1)
 | |
|   call pctile(blue(ia:ib),ib-ia+1,50,bblue1)
 | |
|   ia=1250.0/df
 | |
|   ib=1450.0/df
 | |
|   call pctile(red(ia:ib),ib-ia+1,50,bred2)
 | |
|   call pctile(blue(ia:ib),ib-ia+1,50,bblue2)
 | |
| 
 | |
|   red=red-0.5*(bred1+bred2)
 | |
|   blue=blue-0.5*(bblue1+bblue2)
 | |
| 
 | |
| 900 call sleep_msec(10)   !Avoid the "blue Decode button" syndrome
 | |
|   return
 | |
| end subroutine avecho
 |