97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
|   | subroutine sync9(ss,nzhsym,lag1,lag2,ia,ib,ccfred,red2,ipkbest)
 | ||
|  | 
 | ||
|  |   include 'constants.f90'
 | ||
|  |   real ss(184,NSMAX)
 | ||
|  |   real ss1(184)
 | ||
|  |   real ccfred(NSMAX)
 | ||
|  |   real savg(NSMAX)
 | ||
|  |   real savg2(NSMAX)
 | ||
|  |   real smo(-5:25)
 | ||
|  |   real sq(NSMAX)
 | ||
|  |   real red2(NSMAX)
 | ||
|  |   character*27 cr
 | ||
|  |   data cr/'(C) 2016, Joe Taylor - K1JT'/
 | ||
|  |   include 'jt9sync.f90'
 | ||
|  | 
 | ||
|  |   ipk=0
 | ||
|  |   ipkbest=0
 | ||
|  |   sbest=0.
 | ||
|  |   ccfred=0.
 | ||
|  | 
 | ||
|  |   do i=ia,ib                         !Loop over freq range
 | ||
|  |      ss1=ss(1:184,i)
 | ||
|  |      call pctile(ss1,nzhsym,40,xmed)
 | ||
|  | 
 | ||
|  |      ss1=ss1/xmed - 1.0
 | ||
|  |      do j=1,nzhsym
 | ||
|  |         if(ss1(j).gt.3.0) ss1(j)=3.0
 | ||
|  |      enddo
 | ||
|  | 
 | ||
|  |      call pctile(ss1,nzhsym,45,sbase)
 | ||
|  |      ss1=ss1-sbase
 | ||
|  |      sq0=dot_product(ss1(1:nzhsym),ss1(1:nzhsym))
 | ||
|  |      rms=sqrt(sq0/(nzhsym-1))
 | ||
|  | 
 | ||
|  |      smax=0.
 | ||
|  |      do lag=lag1,lag2                !DT = 2.5 to 5.0 s
 | ||
|  |         sum1=0.
 | ||
|  |         sq2=sq0
 | ||
|  |         nsum=nzhsym
 | ||
|  |         do j=1,16                    !Sum over 16 sync symbols
 | ||
|  |            k=ii2(j) + lag
 | ||
|  |            if(k.ge.1 .and. k.le.nzhsym) then
 | ||
|  |               sum1=sum1 + ss1(k)
 | ||
|  |               sq2=sq2 - ss1(k)*ss1(k)
 | ||
|  |               nsum=nsum-1
 | ||
|  |            endif
 | ||
|  |         enddo
 | ||
|  |         if(sum1.gt.smax) then
 | ||
|  |            smax=sum1
 | ||
|  |            ipk=i 
 | ||
|  |         endif
 | ||
|  |         rms=sqrt(sq2/(nsum-1))
 | ||
|  |      enddo
 | ||
|  |      ccfred(i)=smax                        !Best at this freq, over all lags
 | ||
|  |      if(smax.gt.sbest) then
 | ||
|  |         sbest=smax
 | ||
|  |         ipkbest=ipk
 | ||
|  |      endif
 | ||
|  |   enddo
 | ||
|  | 
 | ||
|  |   call pctile(ccfred(ia),ib-ia+1,50,xmed)
 | ||
|  |   if(xmed.le.0.0) xmed=1.0
 | ||
|  |   ccfred=2.0*ccfred/xmed 
 | ||
|  | 
 | ||
|  |   savg=0.
 | ||
|  |   do j=1,nzhsym
 | ||
|  |      savg(ia:ib)=savg(ia:ib) + ss(j,ia:ib)
 | ||
|  |   enddo
 | ||
|  |   savg(ia:ib)=savg(ia:ib)/nzhsym
 | ||
|  |   smo(0:20)=1.0/21.0
 | ||
|  |   smo(-5:-1)=-(1.0/21.0)*(21.0/10.0)
 | ||
|  |   smo(21:25)=smo(-5)
 | ||
|  | 
 | ||
|  |   do i=ia,ib
 | ||
|  |      sm=0.
 | ||
|  |      do j=-5,25
 | ||
|  |         if(i+j.ge.1 .and. i+j.lt.NSMAX) sm=sm + smo(j)*savg(i+j)
 | ||
|  |      enddo
 | ||
|  |      savg2(i)=sm
 | ||
|  |      sq(i)=sm*sm
 | ||
|  |   enddo
 | ||
|  | 
 | ||
|  |   call pctile(sq(ia:ib),ib-ia+1,20,sq0)
 | ||
|  |   rms=sqrt(sq0)
 | ||
|  |   savg2(ia:ib)=savg2(ia:ib)/(5.0*rms)
 | ||
|  | 
 | ||
|  |   red2=0.
 | ||
|  |   do i=ia+11,ib-10
 | ||
|  |      ref=max(savg2(i-10),savg2(i+10))
 | ||
|  |      red2(i)=savg2(i)-ref
 | ||
|  |      if(red2(i).lt.-99.0) red2(i)=-99.0
 | ||
|  |      if(red2(i).gt.99.0) red2(i)=99.0
 | ||
|  |   enddo
 | ||
|  | 
 | ||
|  |   return
 | ||
|  | end subroutine sync9
 |