From 26de3219d3a90c97852fef47a9bce4bac9d2e79e Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 30 Jun 2018 14:56:19 -0500 Subject: [PATCH] Fix an off-by-one problem. --- lib/ft8/ft8b_1.f90 | 4 ++-- lib/ft8/ft8b_2.f90 | 51 ++++++++++------------------------------ lib/ft8/ft8sim.f90 | 8 +++---- lib/ft8/genft8refsig.f90 | 3 ++- lib/ft8/sync8d.f90 | 8 +++---- 5 files changed, 25 insertions(+), 49 deletions(-) diff --git a/lib/ft8/ft8b_1.f90 b/lib/ft8/ft8b_1.f90 index 784329374..5e1fbf772 100644 --- a/lib/ft8/ft8b_1.f90 +++ b/lib/ft8/ft8b_1.f90 @@ -28,7 +28,7 @@ subroutine ft8b_1(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & integer nappasses(0:5) !Number of decoding passes to use for each QSO state integer naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now integer*1, target:: i1hiscall(12) - complex cd0(3200) + complex cd0(0:3199) complex ctwk(32) complex csymb(32) logical first,newdat,lsubtract,lapon,lapcqonly,nagain @@ -126,7 +126,7 @@ subroutine ft8b_1(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & do k=1,NN i1=ibest+(k-1)*32 csymb=cmplx(0.0,0.0) - if( i1.ge.1 .and. i1+31 .le. NP2 ) csymb=cd0(i1:i1+31) + if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31) call four2a(csymb,32,1,-1,1) s2(0:7,k)=abs(csymb(1:8))/1e3 enddo diff --git a/lib/ft8/ft8b_2.f90 b/lib/ft8/ft8b_2.f90 index 05ac6b6b3..e45ce4f62 100644 --- a/lib/ft8/ft8b_2.f90 +++ b/lib/ft8/ft8b_2.f90 @@ -31,7 +31,7 @@ subroutine ft8b_2(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & integer*1, target:: i1hiscall(12) logical one(0:511,0:8) integer graymap(0:7) - complex cd0(3200) + complex cd0(0:3199) complex ctwk(32) complex csymb(32) complex cs(0:7,NN) @@ -132,12 +132,12 @@ subroutine ft8b_2(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & xdt=xdt2 f1=f1+delfbest !Improved estimate of DF - call sync8d(cd0,i0,ctwk,2,2,sync) + call sync8d(cd0,i0,ctwk,0,2,sync) do k=1,NN i1=ibest+(k-1)*32 csymb=cmplx(0.0,0.0) - if( i1.ge.1 .and. i1+31 .le. NP2 ) csymb=cd0(i1:i1+31) + if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31) call four2a(csymb,32,1,-1,1) cs(0:7,k)=csymb(1:8)/1e3 s8(0:7,k)=abs(csymb(1:8)) @@ -323,7 +323,14 @@ subroutine ft8b_2(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & call extractmessage77(message77,message) ! This needs fixing for messages with i5bit=1 call genft8_174_91(message,mygrid6,bcontest,i5bit,msgsent,msgbits,itone) - if(lsubtract) call subtractft8(dd0,itone,f1,xdt2) + if(lsubtract) then + call sync8d(cd0,i0-1,ctwk,0,2,sm1) + call sync8d(cd0,i0,ctwk,0,2,sp0) + call sync8d(cd0,i0+1,ctwk,0,2,sp1) + pk=0.5*(sm1-sp1)/(sp1-2*sp0+sm1) + xdti=(i0+pk)*dt2 + call subtractft8(dd0,itone,f1,xdti) + endif xsig=0.0 xnoi=0.0 do i=1,79 @@ -331,6 +338,7 @@ subroutine ft8b_2(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & ios=mod(itone(i)+4,7) xnoi=xnoi+s8(ios,i)**2 enddo + xsnr=0.001 if(xnoi.gt.0 .and. xnoi.lt.xsig) xsnr=xsig/xnoi-1.0 xsnr=10.0*log10(xsnr)-27.0 @@ -338,40 +346,7 @@ subroutine ft8b_2(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & if(.not.nagain) xsnr=xsnr2 if(xsnr .lt. -24.0) xsnr=-24.0 - if(i5bit.eq.1) then - do i=1,12 - i1hiscall(i)=ichar(hiscall12(i:i)) - enddo - icrc10=crc10(c_loc(i1hiscall),12) - write(cbits,1001) decoded -1001 format(87i1) - read(cbits,1002) ncrc10,nrpt -1002 format(56x,b10,b6) - irpt=nrpt-30 - i1=index(message,' ') - i2=index(message(i1+1:),' ') + i1 - c1=message(1:i1)//' ' - c2=message(i1+1:i2)//' ' - - if(ncrc10.eq.icrc10) msg37=c1//' RR73; '//c2//' <'// & - trim(hiscall12)//'> ' - if(ncrc10.ne.icrc10) msg37=c1//' RR73; '//c2//' <...> ' - - msg37=c1//' RR73; '//c2//' <...> ' - write(msg37(35:37),1010) irpt -1010 format(i3.2) - if(msg37(35:35).ne.'-') msg37(35:35)='+' - - iz=len(trim(msg37)) - do iter=1,10 !Collapse multiple blanks - ib2=index(msg37(1:iz),' ') - if(ib2.lt.1) exit - msg37=msg37(1:ib2)//msg37(ib2+2:) - iz=iz-1 - enddo - else - msg37=message//' ' - endif + msg37=message//' ' return enddo return diff --git a/lib/ft8/ft8sim.f90 b/lib/ft8/ft8sim.f90 index 8fdacf734..a7d651fb6 100644 --- a/lib/ft8/ft8sim.f90 +++ b/lib/ft8/ft8sim.f90 @@ -142,16 +142,16 @@ program ft8sim call genft8_174_91(msg,mygrid6,bcontest,i3bit,msgsent,msgbits,itone) endif endif - k=-1 + nint((xdt+0.5+0.01*gran())/dt) -! k=-1 + nint((xdt+0.5)/dt) +! k=-1 + nint((xdt+0.5+0.01*gran())/dt) + k=-1 + nint((xdt+0.5)/dt) ia=k+1 phi=0.0 do j=1,NN !Generate complex waveform - dphi=twopi*(f0+itone(j)*baud)*dt + dphi=twopi*(f0*dt+itone(j)/real(NSPS)) do i=1,NSPS k=k+1 - phi=mod(phi+dphi,twopi) if(k.ge.0 .and. k.lt.NMAX) c0(k)=cmplx(cos(phi),sin(phi)) + phi=mod(phi+dphi,twopi) enddo enddo if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c0,NMAX,fs,delay,fspread) diff --git a/lib/ft8/genft8refsig.f90 b/lib/ft8/genft8refsig.f90 index 5bf4885c2..cd1468c13 100644 --- a/lib/ft8/genft8refsig.f90 +++ b/lib/ft8/genft8refsig.f90 @@ -1,7 +1,8 @@ subroutine genft8refsig(itone,cref,f0) complex cref(79*1920) integer itone(79) - real*8 twopi,phi,dphi,dt,xnsps +! real*8 twopi,phi,dphi,dt,xnsps + real twopi,phi,dphi,dt,xnsps data twopi/0.d0/ save twopi if( twopi .lt. 0.1 ) twopi=8.d0*atan(1.d0) diff --git a/lib/ft8/sync8d.f90 b/lib/ft8/sync8d.f90 index 4c0c30b23..1fad12b4d 100644 --- a/lib/ft8/sync8d.f90 +++ b/lib/ft8/sync8d.f90 @@ -4,7 +4,7 @@ subroutine sync8d(cd0,i0,ctwk,itwk,itype,sync) ! itype specifies which Costas array to use parameter(NP2=2812,NDOWN=60) - complex cd0(3125) + complex cd0(0:3199) complex csync_1(0:6,32),csync_2(0:6,32) complex csync2(32) complex ctwk(32) @@ -54,9 +54,9 @@ subroutine sync8d(cd0,i0,ctwk,itwk,itype,sync) z1=0. z2=0. z3=0. - if(i1.ge.1 .and. i1+31.le.NP2) z1=sum(cd0(i1:i1+31)*conjg(csync2)) - if(i2.ge.1 .and. i2+31.le.NP2) z2=sum(cd0(i2:i2+31)*conjg(csync2)) - if(i3.ge.1 .and. i3+31.le.NP2) z3=sum(cd0(i3:i3+31)*conjg(csync2)) + if(i1.ge.0 .and. i1+31.le.NP2-1) z1=sum(cd0(i1:i1+31)*conjg(csync2)) + if(i2.ge.0 .and. i2+31.le.NP2-1) z2=sum(cd0(i2:i2+31)*conjg(csync2)) + if(i3.ge.0 .and. i3+31.le.NP2-1) z3=sum(cd0(i3:i3+31)*conjg(csync2)) sync = sync + p(z1) + p(z2) + p(z3) enddo