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