69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | real function fchisq65(cx,npts,fsample,nflip,a,ccfmax,dtmax) | ||
|  | 
 | ||
|  |   use timer_module, only: timer | ||
|  | 
 | ||
|  |   parameter (NMAX=60*12000)          !Samples per 60 s | ||
|  |   complex cx(npts) | ||
|  |   real a(5) | ||
|  |   complex w,wstep,z | ||
|  |   real ss(3000) | ||
|  |   complex csx(0:NMAX/8) | ||
|  |   data twopi/6.283185307/a1,a2,a3/99.,99.,99./ | ||
|  |   save | ||
|  | 
 | ||
|  |   call timer('fchisq65',0) | ||
|  |   baud=11025.0/4096.0 | ||
|  |   nsps=nint(fsample/baud)                  !Samples per symbol | ||
|  |   nsph=nsps/2                              !Samples per half-symbol | ||
|  |   ndiv=16                                  !Output ss() steps per symbol | ||
|  |   nout=ndiv*npts/nsps | ||
|  |   dtstep=1.0/(ndiv*baud)                   !Time per output step | ||
|  | 
 | ||
|  |  if(a(1).ne.a1 .or. a(2).ne.a2 .or. a(3).ne.a3) then | ||
|  |      a1=a(1) | ||
|  |      a2=a(2) | ||
|  |      a3=a(3) | ||
|  | 
 | ||
|  | ! Mix and integrate the complex signal | ||
|  |      csx(0)=0. | ||
|  |      w=1.0 | ||
|  |      x0=0.5*(npts+1) | ||
|  |      s=2.0/npts | ||
|  |      do i=1,npts | ||
|  |         x=s*(i-x0) | ||
|  |         if(mod(i,100).eq.1) then | ||
|  |            p2=1.5*x*x - 0.5 | ||
|  |            dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/fsample) | ||
|  |           wstep=cmplx(cos(dphi),sin(dphi)) | ||
|  |         endif | ||
|  |         w=w*wstep | ||
|  |         csx(i)=csx(i-1) + w*cx(i) | ||
|  |      enddo | ||
|  |   endif | ||
|  | 
 | ||
|  | ! Compute whole-symbol powers at 1/16-symbol steps. | ||
|  |   fac=1.e-4 | ||
|  |   do i=1,nout | ||
|  |      j=nsps+(i-1)*nsps/16 !steps by 8 samples (1/16 of a symbol) | ||
|  |      k=j-nsps | ||
|  |      ss(i)=0. | ||
|  |      if(k.ge.0 .and. j.le.npts) then | ||
|  |         z=csx(j)-csx(k) ! difference over span of 128 pts | ||
|  |         ss(i)=fac*(real(z)**2 + aimag(z)**2) | ||
|  |      endif | ||
|  |   enddo | ||
|  | 
 | ||
|  |   ccfmax=0. | ||
|  |   call timer('ccf2    ',0) | ||
|  |   call ccf2(ss,nout,nflip,ccf,xlagpk) | ||
|  |   call timer('ccf2    ',1) | ||
|  |   if(ccf.gt.ccfmax) then | ||
|  |      ccfmax=ccf | ||
|  |      dtmax=xlagpk*dtstep | ||
|  |   endif | ||
|  |   fchisq65=-ccfmax | ||
|  |   call timer('fchisq65',1) | ||
|  | 
 | ||
|  |   return | ||
|  | end function fchisq65 |