1subroutine ccf65(ss,nhsym,ssmax,sync1,dt1,flipk,syncshort,snr2,dt2) 2 3 parameter (NFFT=512,NH=NFFT/2) 4 real ss(322) !Input: half-symbol normalized powers 5 real s(NFFT) !CCF = ss*pr 6 complex cs(0:NH) !Complex FT of s 7 real s2(NFFT) !CCF = ss*pr2 8 complex cs2(0:NH) !Complex FT of s2 9 real pr(NFFT) !JT65 pseudo-random sync pattern 10 complex cpr(0:NH) !Complex FT of pr 11 real pr2(NFFT) !JT65 shorthand pattern 12 complex cpr2(0:NH) !Complex FT of pr2 13 real tmp1(322) 14 real ccf(-11:54) 15 logical first 16 integer npr(126) 17 data first/.true./ 18 equivalence (s,cs),(pr,cpr),(s2,cs2),(pr2,cpr2) 19 save 20 21! The JT65 pseudo-random sync pattern: 22 data npr/ & 23 1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & 24 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & 25 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & 26 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & 27 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & 28 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & 29 1,1,1,1,1,1/ 30 31 if(first) then 32! Initialize pr, pr2; compute cpr, cpr2. 33 fac=1.0/NFFT 34 do i=1,NFFT 35 pr(i)=0. 36 pr2(i)=0. 37 k=2*mod((i-1)/8,2)-1 38 if(i.le.NH) pr2(i)=fac*k 39 enddo 40 do i=1,126 41 j=2*i 42 pr(j)=fac*(2*npr(i)-1) 43! Not sure why, but it works significantly better without the following line: 44! pr(j-1)=pr(j) 45 enddo 46 call four2a(cpr,NFFT,1,-1,0) 47 call four2a(cpr2,NFFT,1,-1,0) 48 first=.false. 49 endif 50 51! Look for JT65 sync pattern and shorthand square-wave pattern. 52 ccfbest=0. 53 ccfbest2=0. 54 do i=1,nhsym-1 55 s(i)=min(ssmax,ss(i)+ss(i+1)) 56! s(i)=ss(i)+ss(i+1) 57 enddo 58 59 call pctile(s,nhsym-1,50,base) 60 s(1:nhsym-1)=s(1:nhsym-1)-base 61 s(nhsym:NFFT)=0. 62 call four2a(cs,NFFT,1,-1,0) !Real-to-complex FFT 63 do i=0,NH 64! cs2(i)=cs(i)*conjg(cpr2(i)) !Mult by complex FFT of pr2 65 cs(i)=cs(i)*conjg(cpr(i)) !Mult by complex FFT of pr 66 enddo 67 call four2a(cs,NFFT,1,1,-1) !Complex-to-real inv-FFT 68! call four2a(cs2,NFFT,1,1,-1) !Complex-to-real inv-FFT 69 70 do lag=-11,54 !Check for best JT65 sync 71 j=lag 72 if(j.lt.1) j=j+NFFT 73 ccf(lag)=s(j) 74! if(abs(ccf(lag)).gt.ccfbest) then 75 if(ccf(lag).gt.ccfbest) then !No inverted sync for use at HF 76! ccfbest=abs(ccf(lag)) 77 ccfbest=ccf(lag) 78 lagpk=lag 79 flipk=1.0 80! if(ccf(lag).lt.0.0) flipk=-1.0 81 endif 82 enddo 83 84! do lag=-11,54 !Check for best shorthand 85! ccf2=s2(lag+28) 86! if(ccf2.gt.ccfbest2) then 87! ccfbest2=ccf2 88! lagpk2=lag 89! endif 90! enddo 91 92! Find rms level on baseline of "ccfblue", for normalization. 93 sum=0. 94 do lag=-11,54 95 if(abs(lag-lagpk).gt.1) sum=sum + ccf(lag) 96 enddo 97 base=sum/50.0 98 sq=0. 99 do lag=-11,54 100 if(abs(lag-lagpk).gt.1) sq=sq + (ccf(lag)-base)**2 101 enddo 102 rms=sqrt(sq/49.0) 103 sync1=ccfbest/rms - 4.0 104 dt1=lagpk*(2048.0/11025.0) - 2.5 105 106! Find base level for normalizing snr2. 107 do i=1,nhsym 108 tmp1(i)=ss(i) 109 enddo 110 call pctile(tmp1,nhsym,40,base) 111 snr2=0.398107*ccfbest2/base !### empirical 112 syncshort=0.5*ccfbest2/rms - 4.0 !### better normalizer than rms? 113! dt2=(2.5 + lagpk2*(2048.0/11025.0)) 114 dt2=0. 115 116 return 117end subroutine ccf65 118