diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e24f521c..fe32cc8f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -577,7 +577,7 @@ set (wsjt_FSRCS lib/symspec65.f90 lib/sync4.f90 lib/sync64.f90 - lib/sync66.f90 + lib/sync66a.f90 lib/sync65.f90 lib/ft4/getcandidates4.f90 lib/ft4/get_ft4_bitmetrics.f90 @@ -1327,6 +1327,9 @@ target_link_libraries (qra64sim wsjt_fort wsjt_cxx) add_executable (qra66sim lib/qra/qra66/qra66sim.f90 wsjtx.rc) target_link_libraries (qra66sim wsjt_fort wsjt_cxx) +#add_executable (test_sync66 lib/test_sync66.f90 wsjtx.rc) +#target_link_libraries (test_sync66 wsjt_fort wsjt_cxx) + add_executable (jt49sim lib/jt49sim.f90 wsjtx.rc) target_link_libraries (jt49sim wsjt_fort wsjt_cxx) diff --git a/lib/qra66_decode.f90 b/lib/qra66_decode.f90 index c605d0694..fc907c73f 100644 --- a/lib/qra66_decode.f90 +++ b/lib/qra66_decode.f90 @@ -119,30 +119,30 @@ contains c0(NFFT2/2+1:NFFT2)=0. !Zero the top half c0(0)=0.5*c0(0) call four2a(c0,nfft2,1,1,1) !Inverse c2c FFT - call sync66(c0,f0,jpk,sync) !c0 is analytic signal at 6000 S/s - xdt=jpk/6000.0 - 0.5 +! call sync66(c0,f0,jpk,sync) !c0 is analytic signal at 6000 S/s -! write(*,3003) jpk,f0,sync -!3003 format('A',i6,f8.2,f12.1) + ntol=100 + call sync66a(iwave,15*12000,nsps,nfqso,ntol,xdt,f0) + jpk=(xdt+0.5)*6000 + if(jpk.lt.0) jpk=0 + +! Genie sync: +! jpk=3600 +! xdt=jpk/6000.0 - 0.5 +! f0=1510 +! f0=1490 a=0. - a(1)=-(f0 + 1.5*baud) - call twkfreq(c0,c0,85*NSPS,6000.0,a) +! a(1)=-(f0 + 1.5*baud) !For sync66 + a(1)=-(f0 + 2.0*baud) !For sync66a + + + call twkfreq(c0,c0,15*6000,6000.0,a) call spec66(c0(jpk:jpk+85*NSPS-1),s3) s3a=s3/maxval(s3) -! do j=1,63 -! ipk=maxloc(s3a(-64:127,j)) -! write(54,3054) j,ipk(1)-65 -!3054 format(2i8) -! do i=-64,127 -! write(53,3053) i,2*s3a(i,j)+j-1 -!3053 format(i8,f12.6) -! enddo -! enddo call pctile(s3a,192*63,40,base) s3a=s3a/base -! print*,'A',maxval(s3a),ndepth,maxaptype,naptype s3lim=10. where(s3a(-64:127,1:63)>s3lim) s3a(-64:127,1:63)=s3lim @@ -170,8 +170,6 @@ contains irc,qual,ntrperiod,fmid,w50) !### endif -! write(*,3001) snr2,xdt,f0,decoded(1:22) -!3001 format('B',f5.1,f6.2,f7.1,2x,a22) return end subroutine decode diff --git a/lib/sync66a.f90 b/lib/sync66a.f90 new file mode 100644 index 000000000..ba88616cb --- /dev/null +++ b/lib/sync66a.f90 @@ -0,0 +1,94 @@ +subroutine sync66a(iwave,nmax,nsps,nfqso,ntol,xdt,f0) + + parameter (NSTEP=4) !Quarter-symbol steps + parameter (IZ=1600,JZ=352,NSPSMAX=1920) + integer*2 iwave(0:nmax-1) !Raw data + integer b11(11) !Barker 11 code + integer ijpk(2) !Indices i and j at peak of sync_sig + real s1(IZ,JZ) !Symbol spectra + real x(JZ) !Work array; 2FSK sync modulation + real sync(4*85) !sync vector + real sync_sig(-64:64,-15:15) + complex c0(0:NSPSMAX) !Complex spectrum of symbol + data b11/1,1,1,0,0,0,1,0,0,1,0/ !Barker 11 code + data sync(1)/99.0/ + save sync + + if(sync(1).eq.99.0) then + sync=0. + do k=1,22 + kk=k + if(kk.gt.11) kk=k-11 + sync(16*k-15)=2.0*b11(kk) - 1.0 + enddo + endif + + nfft=2*NSPS + df=12000.0/nfft !3.125 Hz + istep=nsps/NSTEP + fac=1/32767.0 + do j=1,JZ !Compute symbol spectra + ia=(j-1)*istep + ib=ia+nsps-1 + k=-1 + do i=ia,ib,2 + xx=iwave(i) + yy=iwave(i+1) + k=k+1 + c0(k)=fac*cmplx(xx,yy) + enddo + c0(k+1:nfft/2)=0. + call four2a(c0,nfft,1,-1,0) !r2c FFT + do i=1,IZ + s1(i,j)=real(c0(i))**2 + aimag(c0(i))**2 + enddo + enddo + + i0=nint(nfqso/df) + call pctile(s1(i0-64:i0+192,1:JZ),129*JZ,40,base) + s1=s1/base + s1max=20.0 + +! Make this simpler: just add the 22 nonzero values. + do j=1,JZ + x(j)=maxval(s1(i0-64:i0+192,j)) + if(x(j).gt.s1max) s1(i0-64:i0+192,j)=s1(i0-64:i0+192,j)*s1max/x(j) + enddo + + dt4=nsps/(NSTEP*12000.0) + j0=0.5/dt4 + + sync_sig=0. + ia=min(64,nint(ntol/df)) + do i=-ia,ia + x=s1(i0+2+i,:)-s1(i0+i,:) + do lag=-15,15 + do n=1,4*85 + j=n+lag+11 + if(j.ge.1 .and. j.le.JZ) sync_sig(i,lag)=sync_sig(i,lag) + sync(n)*x(j) + enddo + enddo + enddo + + ijpk=maxloc(sync_sig) + ii=ijpk(1)-65 + jj=ijpk(2)-16 + +! Use peakup() here? + f0=nfqso + ii*df + jdt=jj + tsym=nsps/12000.0 + xdt=jdt*tsym/4.0 + +! do i=-64,64 +! write(13,3013) nfqso+i*df,sync_sig(i,jj) +!3013 format(2f12.3) +! enddo + +! do j=-15,15 +! write(14,3014) j,j*dt4,sync_sig(ii,j) +!3014 format(i5,2f12.3) +! enddo + + return +end subroutine sync66a