From 57cf69e6ad7b37a297931d6e7024c883a776e471 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sun, 27 Jan 2019 19:19:47 -0600 Subject: [PATCH] First cut at identifying multiple candidates for decoding. Needs work. --- lib/ft4/ft4_decode.f90 | 66 +++++++++++++++++++++++++------------- lib/ft4/getcandidates4.f90 | 37 ++++++++++----------- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/lib/ft4/ft4_decode.f90 b/lib/ft4/ft4_decode.f90 index 9e2f6d177..27b9922b7 100644 --- a/lib/ft4/ft4_decode.f90 +++ b/lib/ft4/ft4_decode.f90 @@ -64,16 +64,16 @@ subroutine ft4_decode(cdatetime0,nfqso,iwave,ndecodes,mycall,hiscall,nrx,line) candidate=0.0 ncand=0 - nfa=375 - nfb=3000 - syncmin=1.0 + fa=375.0 + fb=3000.0 + syncmin=1.2 maxcand=100 ! call syncft4(iwave,nfa,nfb,syncmin,nfqso,maxcand,s,candidate,ncand,sbase) - call getcandidates4(iwave,375.0,3000.0,0.2,2200.0,100,savg,candidate,ncand,sbase) + call getcandidates4(iwave,fa,fb,syncmin,nfqso,100,savg,candidate,ncand,sbase) ndecodes=0 do icand=1,ncand - f0=candidate(1,icand)-35.0 + f0=candidate(1,icand) xsnr=10*log10(candidate(3,icand))-15.0 if( f0.le.375.0 .or. f0.ge.(5000.0-375.0) ) cycle call ft4_downsample(iwave,f0,cd2) ! downsample from 320 Sa/Symbol to 20 Sa/Symbol @@ -81,26 +81,43 @@ subroutine ft4_decode(cdatetime0,nfqso,iwave,ndecodes,mycall,hiscall,nrx,line) if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) ! 750 samples/second here - ibest=-1 - smax=-99. - dfbest=-1. - do idf=-30,+30,2 - df=idf - a=0. - a(1)=df - ctwk=1. - call twkfreq1(ctwk,4*NSS,fs,a,ctwk2) - do istart=0,374 - call sync4d(cd2,istart,ctwk2,1,sync) - if(sync.gt.smax) then - smax=sync - ibest=istart - dfbest=df - endif + + do isync=1,2 + if(isync.eq.1) then + idfmin=-50 + idfmax=50 + idfstp=3 + ibmin=0 + ibmax=374 + ibstp=4 + else + idfmin=idfbest-5 + idfmax=idfbest+5 + idfstp=1 + ibmin=max(0,ibest-5) + ibmax=min(ibest+5,NMAX/NDOWN-1) + ibstp=1 + endif + ibest=-1 + smax=-99. + idfbest=0 + do idf=idfmin,idfmax,idfstp + a=0. + a(1)=real(idf) + ctwk=1. + call twkfreq1(ctwk,4*NSS,fs,a,ctwk2) + do istart=ibmin,ibmax,ibstp + call sync4d(cd2,istart,ctwk2,1,sync) + if(sync.gt.smax) then + smax=sync + ibest=istart + idfbest=idf + endif + enddo enddo enddo - f0=f0+dfbest + f0=f0+real(idfbest) call ft4_downsample(iwave,f0,cb) ! downsample from 320s/Symbol to 20s/Symbol sum2=sum(abs(cb)**2)/(real(NSS)*NN) if(sum2.gt.0.0) cb=cb/sqrt(sum2) @@ -111,7 +128,6 @@ subroutine ft4_decode(cdatetime0,nfqso,iwave,ndecodes,mycall,hiscall,nrx,line) call four2a(csymb,NSS,1,-1,1) cs(0:3,k)=csymb(1:4) s4(0:3,k)=abs(csymb(1:4)) -!write(*,'(i4,4f8.1)') k, s4(0:3,k) enddo ! sync quality check @@ -189,6 +205,10 @@ subroutine ft4_decode(cdatetime0,nfqso,iwave,ndecodes,mycall,hiscall,nrx,line) ns4=count(hbits(199:206).eq.(/0,0,0,1,1,0,1,1/)) nsync_qual=ns1+ns2+ns3+ns4 + if(nsync.lt.8 .or. nsync_qual.lt. 20) then + cycle + endif + scalefac=2.83 llra( 1: 58)=bmeta( 9: 66) llra( 59:116)=bmeta( 75:132) diff --git a/lib/ft4/getcandidates4.f90 b/lib/ft4/getcandidates4.f90 index 9d75187fe..276625942 100644 --- a/lib/ft4/getcandidates4.f90 +++ b/lib/ft4/getcandidates4.f90 @@ -10,6 +10,7 @@ subroutine getcandidates4(id,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & real candidate(3,maxcand) integer*2 id(NMAX) integer indx(NH1) + integer ipk(1) equivalence (x,cx) ! Compute symbol spectra, stepping by NSTEP steps. @@ -29,8 +30,8 @@ subroutine getcandidates4(id,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & savg=savg + s(1:NH1,j) !Average spectrum enddo savsm=0. - do i=6,NH1-5 - savsm(i)=sum(savg(i-5:i+5))/11. + do i=8,NH1-7 + savsm(i)=sum(savg(i-7:i+7))/15. enddo nfa=fa/df nfb=fb/df @@ -39,22 +40,22 @@ subroutine getcandidates4(id,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & call indexx(savsm(nfa:nfb),np,indx) xn=savsm(nfa+indx(nint(0.3*np))) savsm=savsm/xn - imax=-1 - xmax=-99. - do i=2,NH1-1 - if(savsm(i).gt.savsm(i-1).and. & - savsm(i).gt.savsm(i+1).and. & - savsm(i).gt.xmax) then - xmax=savsm(i) - imax=i - endif + + ncand=0 + f_offset = -1.5*12000/512 + do i=1,maxcand + ipk=maxloc(savsm(nfa:nfb)) + ip=nfa-1+ipk(1) + xmax=savsm(ip) + savsm(max(1,ip-8):min(NH1,ip+8))=0.0 + if(xmax.ge.syncmin) then + ncand=ncand+1 + candidate(1,ncand)=ip*df+f_offset + candidate(2,ncand)=-99.9 + candidate(3,ncand)=xmax + else + exit + endif enddo - f0=imax*df - if(xmax.gt.1.2) then - ncand=ncand+1 - candidate(1,ncand)=f0 - candidate(2,ncand)=-99.9 - candidate(3,ncand)=xmax - endif return end subroutine getcandidates4