1subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & 2 ncand,sbase) 3 4 include 'ft4_params.f90' 5 real s(NH1,NHSYM) 6 real savg(NH1),savsm(NH1) 7 real sbase(NH1) 8 real x(NFFT1) 9 real window(NFFT1) 10 complex cx(0:NH1) 11 real candidate(2,maxcand),candidatet(2,maxcand) 12 real dd(NMAX) 13 equivalence (x,cx) 14 logical first 15 data first/.true./ 16 save first,window 17 18 if(first) then 19 first=.false. 20 pi=4.0*atan(1.) 21 window=0. 22 call nuttal_window(window,NFFT1) 23 endif 24 25! Compute symbol spectra, stepping by NSTEP steps. 26 savg=0. 27 df=12000.0/NFFT1 28 fac=1.0/300.0 29 do j=1,NHSYM 30 ia=(j-1)*NSTEP + 1 31 ib=ia+NFFT1-1 32 if(ib.gt.NMAX) exit 33 x=fac*dd(ia:ib)*window 34 call four2a(x,NFFT1,1,-1,0) !r2c FFT 35 s(1:NH1,j)=abs(cx(1:NH1))**2 36 savg=savg + s(1:NH1,j) !Average spectrum 37 enddo 38 savg=savg/NHSYM 39 savsm=0. 40 do i=8,NH1-7 41 savsm(i)=sum(savg(i-7:i+7))/15. 42 enddo 43 44 nfa=fa/df 45 if(nfa.lt.nint(200.0/df)) nfa=nint(200.0/df) 46 nfb=fb/df 47 if(nfb.gt.nint(4910.0/df)) nfb=nint(4910.0/df) 48 call ft4_baseline(savg,nfa,nfb,sbase) 49 if(any(sbase(nfa:nfb).le.0)) return 50 savsm(nfa:nfb)=savsm(nfa:nfb)/sbase(nfa:nfb) 51 f_offset = -1.5*12000.0/NSPS 52 ncand=0 53 candidatet=0 54 do i=nfa+1,nfb-1 55 if(savsm(i).ge.savsm(i-1) .and. savsm(i).ge.savsm(i+1) .and. & 56 savsm(i).ge.syncmin) then 57 den=savsm(i-1)-2*savsm(i)+savsm(i+1) 58 del=0. 59 if(den.ne.0.0) del=0.5*(savsm(i-1)-savsm(i+1))/den 60 fpeak=(i+del)*df+f_offset 61 if(fpeak.lt.200.0 .or. fpeak.gt.4910.0) cycle 62 speak=savsm(i) - 0.25*(savsm(i-1)-savsm(i+1))*del 63 ncand=ncand+1 64 candidatet(1,ncand)=fpeak 65 candidatet(2,ncand)=speak 66 if(ncand.eq.maxcand) exit 67 endif 68 enddo 69 candidate=0 70 nq=count(abs(candidatet(1,1:ncand)-nfqso).le.20.0) 71 n1=1 72 n2=nq+1 73 do i=1,ncand 74 if(abs(candidatet(1,i)-nfqso).le.20.0) then 75 candidate(1:2,n1)=candidatet(1:2,i) 76 n1=n1+1 77 else 78 candidate(1:2,n2)=candidatet(1:2,i) 79 n2=n2+1 80 endif 81 enddo 82return 83end subroutine getcandidates4 84