mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-23 12:48:40 -05:00
3fae9c607c
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2966 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
95 lines
2.7 KiB
Fortran
95 lines
2.7 KiB
Fortran
subroutine xcor24(s2,ipk,nsteps,nsym,lag1,lag2,mode4,ccf,ccf0,lagpk,flip)
|
|
|
|
! Computes ccf of a row of s2 and the pseudo-random array pr2. Returns
|
|
! peak of the CCF and the lag at which peak occurs. For JT65, the
|
|
! CCF peak may be either positive or negative, with negative implying
|
|
! the "OOO" message.
|
|
|
|
parameter (NHMAX=1260) !Max length of power spectra
|
|
parameter (NSMAX=525) !Max number of half-symbol steps
|
|
real s2(NHMAX,NSMAX) !2d spectrum, stepped by half-symbols
|
|
real a(NSMAX)
|
|
real ccf(-5:540)
|
|
integer npr2(207)
|
|
real pr2(207)
|
|
logical first
|
|
data lagmin/0/ !Silence g77 warning
|
|
data first/.true./
|
|
data npr2/ &
|
|
0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0, &
|
|
0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,0,0, &
|
|
1,0,0,1,0,0,1,1,1,1,1,0,0,0,1,0,1,0,0,0,1,1,1,1,0,1,1,0,0,1, &
|
|
0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1, &
|
|
0,1,1,1,0,0,1,0,1,1,0,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,1,1, &
|
|
0,1,1,1,0,1,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,1,0,0,0,1,1,1,1,1, &
|
|
1,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,0,1/
|
|
save
|
|
|
|
if(first) then
|
|
do i=1,207
|
|
pr2(i)=2*npr2(i)-1
|
|
enddo
|
|
first=.false.
|
|
endif
|
|
|
|
do j=1,nsteps
|
|
n=2*mode4
|
|
if(mode4.eq.1) then
|
|
a(j)=max(s2(ipk+n,j),s2(ipk+3*n,j)) - max(s2(ipk ,j),s2(ipk+2*n,j))
|
|
else
|
|
kz=mode4/2
|
|
ss0=0.
|
|
ss1=0.
|
|
ss2=0.
|
|
ss3=0.
|
|
wsum=0.
|
|
do k=-kz+1,kz-1
|
|
w=float(kz-iabs(k))/mode4
|
|
wsum=wsum+w
|
|
if(ipk+k.lt.1 .or. ipk+3*n+k.gt.1260) then
|
|
print*,'xcor24:',ipk,n,k
|
|
else
|
|
ss0=ss0 + w*s2(ipk +k,j)
|
|
ss1=ss1 + w*s2(ipk+ n+k,j)
|
|
ss2=ss2 + w*s2(ipk+2*n+k,j)
|
|
ss3=ss3 + w*s2(ipk+3*n+k,j)
|
|
endif
|
|
enddo
|
|
a(j)=(max(ss1,ss3) - max(ss0,ss2))/sqrt(wsum)
|
|
endif
|
|
enddo
|
|
|
|
ccfmax=0.
|
|
ccfmin=0.
|
|
do lag=lag1,lag2
|
|
x=0.
|
|
do i=1,nsym
|
|
j=2*i-1+lag
|
|
if(j.ge.1 .and. j.le.nsteps) x=x+a(j)*pr2(i)
|
|
enddo
|
|
ccf(lag)=2*x !The 2 is for plotting scale
|
|
if(ccf(lag).gt.ccfmax) then
|
|
ccfmax=ccf(lag)
|
|
lagpk=lag
|
|
endif
|
|
|
|
if(ccf(lag).lt.ccfmin) then
|
|
ccfmin=ccf(lag)
|
|
lagmin=lag
|
|
endif
|
|
enddo
|
|
|
|
ccf0=ccfmax
|
|
flip=1.0
|
|
if(-ccfmin.gt.ccfmax) then
|
|
do lag=lag1,lag2
|
|
ccf(lag)=-ccf(lag)
|
|
enddo
|
|
lagpk=lagmin
|
|
ccf0=-ccfmin
|
|
flip=-1.0
|
|
endif
|
|
|
|
return
|
|
end subroutine xcor24
|