From 037805ca8f9959fce846067d687c19b43de22fc7 Mon Sep 17 00:00:00 2001 From: Steven Franke Date: Sat, 29 Feb 2020 13:46:59 -0600 Subject: [PATCH] Improve dt estimation in ft8b so that dt refinement procedure in subtractft8.f90 can be done with 4 calls to sqf instead of 7. --- lib/ft8/ft8b.f90 | 27 ++++++++++++++++++++------- lib/ft8/subtractft8.f90 | 23 ++++++++++++++--------- lib/ft8/sync8.f90 | 3 ++- lib/ft8/sync8d.f90 | 8 ++------ 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index ec575426c..2adb5336f 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -17,6 +17,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & real bmeta(174),bmetb(174),bmetc(174),bmetd(174) real llra(174),llrb(174),llrc(174),llrd(174),llrz(174) !Soft symbols real dd0(15*12000) + real ss(9) integer*1 message77(77),apmask(174),cw(174) integer apsym(58),aph10(10) integer mcq(29),mcqru(29),mcqfd(29),mcqtest(29),mcqww(29) @@ -28,6 +29,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & integer ncontest,ncontest0 logical one(0:511,0:8) integer graymap(0:7) + integer iloc(1) complex cd0(0:3199) complex ctwk(32) complex csymb(32) @@ -106,17 +108,15 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal smax=0.0 - do idt=i0-8,i0+8 !Search over +/- one quarter symbol + do idt=i0-10,i0+10 !Search over +/- one quarter symbol call sync8d(cd0,idt,ctwk,0,sync) if(sync.gt.smax) then smax=sync ibest=idt endif enddo - xdt2=ibest*dt2 !Improved estimate for DT ! Now peak up in frequency - i0=nint(xdt2*fs2) smax=0.0 do ifr=-5,5 !Search over +/- 2.5 Hz delf=ifr*0.5 @@ -126,7 +126,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & ctwk(i)=cmplx(cos(phi),sin(phi)) phi=mod(phi+dphi,twopi) enddo - call sync8d(cd0,i0,ctwk,1,sync) + call sync8d(cd0,ibest,ctwk,1,sync) if( sync .gt. smax ) then smax=sync delfbest=delf @@ -135,9 +135,22 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & a=0.0 a(1)=-delfbest call twkfreq1(cd0,NP2,fs2,a,cd0) - xdt=xdt2 f1=f1+delfbest !Improved estimate of DF - call sync8d(cd0,i0,ctwk,0,sync) + + call timer('ft8_down',0) + call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample + call timer('ft8_down',1) + + smax=0.0 + do idt=-4,4 !Search over +/- one quarter symbol + call sync8d(cd0,ibest+idt,ctwk,0,sync) + ss(idt+5)=sync + enddo + smax=maxval(ss) + iloc=maxloc(ss) + ibest=iloc(1)-5+ibest + xdt=(ibest-1)*dt2 + sync=smax do k=1,NN i1=ibest+(k-1)*32 @@ -421,7 +434,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & if(lsubtract) call subtractft8(dd0,itone,f1,xdt,.false.) ! write(21,3001) nzhsym,npasses,nqsoprogress,ipass,iaptype,lsubtract, & ! f1,xdt,msg37(1:22); flush(21) -!3001 format(5i3,L3,f7.1,f7.2,2x,a22) +!3001 format(5i3,L3,f7.1,f9.4,2x,a22) xsig=0.0 xnoi=0.0 do i=1,79 diff --git a/lib/ft8/subtractft8.f90 b/lib/ft8/subtractft8.f90 index 04c8a6bb0..088cef9c7 100644 --- a/lib/ft8/subtractft8.f90 +++ b/lib/ft8/subtractft8.f90 @@ -41,19 +41,24 @@ subroutine subtractft8(dd0,itone,f0,dt,ldt) call gen_ft8wave(itone,79,1920,2.0,12000.0,f0,cref,xjunk,1,NFRAME) if(ldt) then !Are we refining DT ? - sqa=sqf(-300) - sqb=sqf(300) - sq0=sqf(0) !Do the subtraction with idt=0 - call peakup(sqa,sq0,sqb,dx) - if(abs(dx).gt.1.0) return !No acceptable minimum: do not subtract - i1=nint(300.0*dx) !First approximation of best idt - sqa=sqf(i1-60) - sqb=sqf(i1+60) +! sqa=sqf(-300) +! sqb=sqf(300) +! sq0=sqf(0) !Do the subtraction with idt=0 +! call peakup(sqa,sq0,sqb,dx) +! if(abs(dx).gt.1.0) return !No acceptable minimum: do not subtract +! i1=nint(300.0*dx) !First approximation of best idt +i1=0 +! sqa=sqf(i1-60) +! sqb=sqf(i1+60) + sqa=sqf(i1-90) + sqb=sqf(i1+90) sq0=sqf(i1) call peakup(sqa,sq0,sqb,dx) if(abs(dx).gt.1.0) return !No acceptable minimum: do not subtract - i2=nint(60.0*dx) + i1 !Best estimate of idt +! i2=nint(60.0*dx) + i1 !Best estimate of idt + i2=nint(90.0*dx) + i1 !Best estimate of idt sq0=sqf(i2) !Do the subtraction with idt=i2 +!write(*,*) 'subtract - i2= ',i2,dt else sq0=sqf(0) !Do the subtraction with idt=0 endif diff --git a/lib/ft8/sync8.f90 b/lib/ft8/sync8.f90 index 3d2141c02..0aa787629 100644 --- a/lib/ft8/sync8.f90 +++ b/lib/ft8/sync8.f90 @@ -106,7 +106,7 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, & if(red(n).lt.syncmin.or.isnan(red(n)).or.k.eq.maxcand) exit k=k+1 candidate0(1,k)=n*df - candidate0(2,k)=(jpeak(n)-1)*tstep + candidate0(2,k)=(jpeak(n)-0.5)*tstep candidate0(3,k)=red(n) enddo ncand=k @@ -144,5 +144,6 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, & endif enddo ncand=k-1 + return end subroutine sync8 diff --git a/lib/ft8/sync8d.f90 b/lib/ft8/sync8d.f90 index 798f2831b..556acead4 100644 --- a/lib/ft8/sync8d.f90 +++ b/lib/ft8/sync8d.f90 @@ -12,20 +12,16 @@ subroutine sync8d(cd0,i0,ctwk,itwk,sync) integer icos7(0:6) data icos7/3,1,4,0,6,5,2/ data first/.true./ - save first,twopi,fs2,dt2,taus,baud,csync + save first,twopi,csync p(z1)=real(z1)**2 + aimag(z1)**2 !Statement function for power ! Set some constants and compute the csync array. if( first ) then twopi=8.0*atan(1.0) - fs2=12000.0/NDOWN !Sample rate after downsampling - dt2=1/fs2 !Corresponding sample interval - taus=32*dt2 !Symbol duration - baud=1.0/taus !Keying rate do i=0,6 phi=0.0 - dphi=twopi*icos7(i)*baud*dt2 + dphi=twopi*icos7(i)/32.0 do j=1,32 csync(i,j)=cmplx(cos(phi),sin(phi)) !Waveform for 7x7 Costas array phi=mod(phi+dphi,twopi)