186 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | subroutine synciscat(cdat,npts,nh,npct,s0,jsym,df,ntol,NFreeze,    & | ||
|  |      MouseDF,mousebutton,mode4,nafc,psavg,xsync,sig,ndf0,msglen,         & | ||
|  |      ipk,jpk,idf,df1) | ||
|  | 
 | ||
|  | ! Synchronize an ISCAT signal | ||
|  | ! cdat() is the downsampled analytic signal.   | ||
|  | ! Sample rate = fsample = BW = 11025 * (9/32) = 3100.78125 Hz | ||
|  | ! npts, nsps, etc., are all reduced by 9/32 | ||
|  | 
 | ||
|  |   parameter (NMAX=30*3101) | ||
|  |   parameter (NSZ=4*1400) | ||
|  |   complex cdat(NMAX) | ||
|  |   complex c(288) | ||
|  |   real s0(288,NSZ) | ||
|  |   real fs0(288,96)                        !108 = 96 + 3*4 | ||
|  |   real savg(288) | ||
|  |   real sref(288) | ||
|  |   real psavg(72)                          !Average spectrum of whole file | ||
|  |   integer icos(4) | ||
|  |   data icos/0,1,3,2/ | ||
|  |   data nsync/4/,nlen/2/,ndat/18/ | ||
|  | 
 | ||
|  | ! Silence compiler warnings: | ||
|  |   sigbest=-20.0 | ||
|  |   ndf0best=0 | ||
|  |   msglenbest=0 | ||
|  |   ipkbest=0 | ||
|  |   jpkbest=0 | ||
|  |   ipk2=0 | ||
|  |   idfbest=mousebutton | ||
|  | 
 | ||
|  |   fsample=3100.78125                   !New sample rate | ||
|  |   nsps=144/mode4 | ||
|  |   nsym=npts/nsps - 1 | ||
|  |   nblk=nsync+nlen+ndat | ||
|  |   nfft=2*nsps                          !FFTs at twice the symbol length, | ||
|  | 
 | ||
|  |   kstep=nsps/4                         !  stepped by 1/4 symbol | ||
|  |   df=fsample/nfft | ||
|  |   fac=1.0/1000.0                       !Somewhat arbitrary | ||
|  |   savg=0. | ||
|  |   s0=0. | ||
|  | 
 | ||
|  |   ia=1-kstep | ||
|  |   do j=1,4*nsym                                   !Compute symbol spectra | ||
|  |      ia=ia+kstep | ||
|  |      ib=ia+nsps-1 | ||
|  |      if(ib.gt.npts) exit | ||
|  |      c(1:nsps)=fac*cdat(ia:ib) | ||
|  |      c(nsps+1:nfft)=0. | ||
|  |      call four2a(c,nfft,1,-1,1) | ||
|  |      do i=1,nfft | ||
|  |         s0(i,j)=real(c(i))**2 + aimag(c(i))**2 | ||
|  |         savg(i)=savg(i) + s0(i,j)                 !Accumulate avg spectrum | ||
|  |      enddo | ||
|  |      i0=40 | ||
|  |   enddo | ||
|  | 
 | ||
|  |   jsym=4*nsym | ||
|  |   savg=savg/jsym | ||
|  | 
 | ||
|  |   do i=1,71                                   !Compute spectrum in dB, for plot | ||
|  |      if(mode4.eq.1) then | ||
|  |         psavg(i)=2*db(savg(4*i)+savg(4*i-1)+savg(4*i-2)+savg(4*i-3)) + 1.0 | ||
|  |      else | ||
|  |         psavg(i)=2*db(savg(2*i)+savg(2*i-1)) + 7.0 | ||
|  |      endif | ||
|  |   enddo | ||
|  | 
 | ||
|  |   do i=nh+1,nfft-nh | ||
|  |      call pctile(savg(i-nh),2*nh+1,npct,sref(i)) | ||
|  |   enddo | ||
|  |   sref(1:nh)=sref(nh+11) | ||
|  |   sref(nfft-nh+1:nfft)=sref(nfft-nh) | ||
|  | 
 | ||
|  |   do i=1,nfft                                 !Normalize the symbol spectra | ||
|  |      fac=1.0/sref(i) | ||
|  |      if(i.lt.11) fac=1.0/savg(11) | ||
|  |      do j=1,jsym | ||
|  |         s0(i,j)=fac*s0(i,j) | ||
|  |      enddo | ||
|  |   enddo | ||
|  | 
 | ||
|  |   nfold=jsym/96 | ||
|  |   jb=96*nfold | ||
|  | 
 | ||
|  |   ttot=npts/fsample                         !Length of record (s) | ||
|  |   df1=df/ttot                               !Step size for f1=fdot | ||
|  |   idf1=-25.0/df1 | ||
|  |   idf2=5.0/df1 | ||
|  |   if(nafc.eq.0) then | ||
|  |      idf1=0 | ||
|  |      idf2=0 | ||
|  |   else if(mod(-idf1,2).eq.1) then | ||
|  |      idf1=idf1-1 | ||
|  |   endif | ||
|  | 
 | ||
|  |   xsyncbest=0. | ||
|  |   do idf=idf1,idf2                         !Loop over fdot | ||
|  |      fs0=0. | ||
|  |      do j=1,jb                             !Fold s0 into fs0, modulo 4*nblk  | ||
|  |         k=mod(j-1,4*nblk)+1 | ||
|  |         ii=nint(idf*float(j-jb/2)/float(jb)) | ||
|  |         ia=max(1-ii,1) | ||
|  |         ib=min(nfft-ii,nfft) | ||
|  |         do i=ia,ib | ||
|  |            fs0(i,k)=fs0(i,k) + s0(i+ii,j) | ||
|  |         enddo | ||
|  |      enddo | ||
|  |      ref=nfold*4 | ||
|  | 
 | ||
|  |      i0=27 | ||
|  |      if(mode4.eq.1) i0=95 | ||
|  |      ia=i0-nint(ntol/df) | ||
|  |      ib=i0+nint(ntol/df) | ||
|  |      if(ia.lt.1) ia=1 | ||
|  |      if(ib.gt.nfft-3) ib=nfft-3 | ||
|  | 
 | ||
|  |      smax=0. | ||
|  |      ipk=1 | ||
|  |      jpk=1 | ||
|  |      do j=0,4*nblk-1                            !Find sync pattern: lags 0-95 | ||
|  |         do i=ia,ib                              !Search specified freq range | ||
|  |            ss=0. | ||
|  |            do n=1,4                             !Sum over 4 sync tones | ||
|  |               k=j+4*n-3 | ||
|  |               if(k.gt.96) k=k-96 | ||
|  |               ss=ss + fs0(i+2*icos(n),k) | ||
|  |            enddo | ||
|  |            if(ss.gt.smax) then | ||
|  |               smax=ss | ||
|  |               ipk=i                             !Frequency offset, DF | ||
|  |               jpk=j+1                           !Time offset, DT | ||
|  |            endif | ||
|  |         enddo | ||
|  |      enddo | ||
|  | 
 | ||
|  |      xsync=smax/ref - 1.0 | ||
|  |      if(nfold.lt.26) xsync=xsync * sqrt(nfold/26.0) | ||
|  |      xsync=xsync-0.5                           !Empirical | ||
|  | 
 | ||
|  |      sig=db(smax/ref - 1.0) - 15.0 | ||
|  |      if(mode4.eq.1) sig=sig-5.0 | ||
|  | !     if(sig.lt.-20 .or. xsync.lt.1.0) sig=-20.0 | ||
|  | !     if(sig.lt.-20) sig=-20.0 | ||
|  |      ndf0=nint(df*(ipk-i0)) | ||
|  | 
 | ||
|  |      smax=0. | ||
|  |      ja=jpk+16 | ||
|  |      if(ja.gt.4*nblk) ja=ja-4*nblk | ||
|  |      jj=jpk+20 | ||
|  |      if(jj.gt.4*nblk) jj=jj-4*nblk | ||
|  |      do i=ipk,ipk+60,2                         !Find User's message length | ||
|  |         ss=fs0(i,ja) + fs0(i+10,jj) | ||
|  |         if(ss.gt.smax) then | ||
|  |            smax=ss | ||
|  |            ipk2=i | ||
|  |         endif | ||
|  |      enddo | ||
|  | 
 | ||
|  |      msglen=(ipk2-ipk)/2 | ||
|  |      if(msglen.lt.2 .or. msglen.gt.29) cycle | ||
|  | 
 | ||
|  |      if(xsync.ge.xsyncbest) then | ||
|  |         xsyncbest=xsync | ||
|  |         sigbest=sig | ||
|  |         ndf0best=ndf0 | ||
|  |         msglenbest=msglen | ||
|  |         ipkbest=ipk | ||
|  |         jpkbest=jpk | ||
|  |         idfbest=idf | ||
|  |      endif | ||
|  |   enddo | ||
|  | 
 | ||
|  |   xsync=xsyncbest | ||
|  |   sig=sigbest | ||
|  |   ndf0=ndf0best | ||
|  |   msglen=msglenbest | ||
|  |   ipk=ipkbest | ||
|  |   jpk=jpkbest | ||
|  |   idf=idfbest | ||
|  |   if(nafc.eq.0) idf=0 | ||
|  | 
 | ||
|  |   return | ||
|  | end subroutine synciscat |