102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
subroutine msk144sync(cdat,nframes,ntol,delf,navmask,npeaks,fc,fest,   &
 | 
						|
     npklocs,nsuccess,xmax,c)
 | 
						|
 | 
						|
!$ use omp_lib
 | 
						|
 | 
						|
  parameter (NSPM=864)
 | 
						|
  complex cdat(NSPM*nframes)
 | 
						|
  complex cdat2(NSPM*nframes,8)
 | 
						|
  complex c(NSPM)                    !Coherently averaged complex data
 | 
						|
  complex cs(NSPM,8)
 | 
						|
  complex cb(42)                     !Complex waveform for sync word 
 | 
						|
 | 
						|
  integer s8(8)
 | 
						|
  integer iloc(1)
 | 
						|
  integer npklocs(npeaks)
 | 
						|
  integer navmask(nframes)                 ! defines which frames to average
 | 
						|
 | 
						|
  real cbi(42),cbq(42)
 | 
						|
  real pkamps(npeaks)
 | 
						|
  real xcc(0:NSPM-1)
 | 
						|
  real xccs(0:NSPM-1,8)
 | 
						|
  real xm(8)
 | 
						|
  real bf(8)
 | 
						|
  real pp(12)                        !Half-sine pulse shape
 | 
						|
  logical first
 | 
						|
  data first/.true./
 | 
						|
  data s8/0,1,1,1,0,0,1,0/
 | 
						|
  save first,cb,fs,pi,twopi,dt,s8,pp
 | 
						|
 | 
						|
  if(first) then
 | 
						|
     pi=4.0*atan(1.0)
 | 
						|
     twopi=8.0*atan(1.0)
 | 
						|
     fs=12000.0
 | 
						|
     dt=1.0/fs
 | 
						|
 | 
						|
     do i=1,12                       !Define half-sine pulse
 | 
						|
       angle=(i-1)*pi/12.0
 | 
						|
       pp(i)=sin(angle)
 | 
						|
     enddo
 | 
						|
 | 
						|
! Define the sync word waveforms
 | 
						|
     s8=2*s8-1  
 | 
						|
     cbq(1:6)=pp(7:12)*s8(1)
 | 
						|
     cbq(7:18)=pp*s8(3)
 | 
						|
     cbq(19:30)=pp*s8(5)
 | 
						|
     cbq(31:42)=pp*s8(7)
 | 
						|
     cbi(1:12)=pp*s8(2)
 | 
						|
     cbi(13:24)=pp*s8(4)
 | 
						|
     cbi(25:36)=pp*s8(6)
 | 
						|
     cbi(37:42)=pp(1:6)*s8(8)
 | 
						|
     cb=cmplx(cbi,cbq)
 | 
						|
 | 
						|
     first=.false.
 | 
						|
  endif
 | 
						|
 | 
						|
  nfreqs=2*nint(ntol/delf) + 1
 | 
						|
  xm=0.0
 | 
						|
  bf=0.0
 | 
						|
  nthreads=1
 | 
						|
!$ nthreads=min(8,int(OMP_GET_MAX_THREADS(),4))
 | 
						|
  nstep=nfreqs/nthreads
 | 
						|
 | 
						|
!$OMP PARALLEL NUM_THREADS(nthreads) PRIVATE(id,if1,if2)
 | 
						|
  id=1
 | 
						|
!$ id=OMP_GET_THREAD_NUM() + 1            !Thread id = 1,2,...
 | 
						|
  if1=-nint(ntol/delf) + (id-1)*nstep
 | 
						|
  if2=if1+nstep-1
 | 
						|
  if(id.eq.nthreads) if2=nint(ntol/delf)
 | 
						|
  call msk144_freq_search(cdat,fc,if1,if2,delf,nframes,navmask,cb,    &
 | 
						|
       cdat2(1,id),xm(id),bf(id),cs(1,id),xccs(1,id))
 | 
						|
!$OMP END PARALLEL
 | 
						|
 | 
						|
  xmax=xm(1)
 | 
						|
  fest=fc+bf(1)
 | 
						|
  c=cs(1:NSPM,1)
 | 
						|
  xcc=xccs(0:NSPM-1,1)
 | 
						|
  if(nthreads.gt.1) then
 | 
						|
     do i=2,nthreads
 | 
						|
        if(xm(i).gt.xmax) then
 | 
						|
           xmax=xm(i)
 | 
						|
           fest=fc+bf(i)
 | 
						|
           c=cs(1:NSPM,i)
 | 
						|
           xcc=xccs(0:NSPM-1,i)
 | 
						|
        endif
 | 
						|
     enddo
 | 
						|
  endif
 | 
						|
 | 
						|
! Find npeaks largest peaks
 | 
						|
  do ipk=1,npeaks
 | 
						|
     iloc=maxloc(xcc)
 | 
						|
     ic2=iloc(1)
 | 
						|
     npklocs(ipk)=ic2
 | 
						|
     pkamps(ipk)=xcc(ic2-1)
 | 
						|
     xcc(max(0,ic2-7):min(NSPM-1,ic2+7))=0.0
 | 
						|
  enddo
 | 
						|
 | 
						|
  nsuccess=0
 | 
						|
  if(xmax.ge.1.3) nsuccess=1
 | 
						|
 | 
						|
  return
 | 
						|
end subroutine msk144sync
 |