subroutine getfc2(c,csync,fc1,fc2,fc3) parameter (KK=84) !Information bits (72 + CRC12) parameter (ND=168) !Data symbols: LDPC (168,84), r=1/2 parameter (NS=65) !Sync symbols (2 x 26 + Barker 13) parameter (NR=3) !Ramp up/down parameter (NN=NR+NS+ND) !Total symbols (236) parameter (NSPS=16) !Samples per MSK symbol (16) parameter (N2=2*NSPS) !Samples per OQPSK symbol (32) parameter (N13=13*N2) !Samples in central sync vector (416) parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) parameter (NFFT1=4*NSPS,NH1=NFFT1/2) complex c(0:NZ-1) !Complex waveform complex cs(0:NZ-1) !For computing spectrum complex csync(0:NZ-1) !Sync symbols only, from cbb real a(5) fs=12000.0/72.0 df=fs/NZ baud=fs/NSPS a(1)=-fc1 a(2:5)=0. call twkfreq1(c,NZ,fs,a,cs) !Mix down by fc1 ! Filter, square, then FFT to get refined carrier frequency fc2. call four2a(cs,NZ,1,-1,1) !To freq domain ia=nint(0.75*baud/df) cs(ia:NZ-1-ia)=0. !Save only freqs around fc1 call four2a(cs,NZ,1,1,1) !Back to time domain cs=cs/NZ cs=cs*cs !Square the data call four2a(cs,NZ,1,-1,1) !Compute squared spectrum ! Find two peaks separated by baud pmax=0. fc2=0. ic=nint(baud/df) ja=nint(0.5*baud/df) do j=-ja,ja f2=j*df ia=nint((f2-0.5*baud)/df) if(ia.lt.0) ia=ia+NZ ib=nint((f2+0.5*baud)/df) p=real(cs(ia))**2 + aimag(cs(ia))**2 + & real(cs(ib))**2 + aimag(cs(ib))**2 if(p.gt.pmax) then pmax=p fc2=0.5*f2 endif ! write(52,1200) f2,p,db(p) !1200 format(f10.3,2f15.3) enddo a(1)=-fc1 a(2:5)=0. call twkfreq1(c,NZ,fs,a,cs) !Mix down by fc1 cs=cs*conjg(csync) call four2a(cs,NZ,1,-1,1) !To freq domain pmax=0. do i=0,NZ-1 f=i*df if(i.gt.NZ/2) f=(i-NZ)*df p=real(cs(i))**2 + aimag(cs(i))**2 ! write(51,3001) f,p,db(p) !3001 format(f10.3,e12.3,f10.3) if(p.gt.pmax) then pmax=p fc3=f endif enddo return end subroutine getfc2