mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	Sort out some stuff having to do with multiple decodes in Q65 mode.
This commit is contained in:
		
							parent
							
								
									3b0e2edb75
								
							
						
					
					
						commit
						fc040d435a
					
				@ -70,6 +70,7 @@ contains
 | 
			
		||||
    character*80 fmt
 | 
			
		||||
    integer*2 iwave(NMAX)                 !Raw data
 | 
			
		||||
    real, allocatable :: dd(:)            !Raw data
 | 
			
		||||
    real f0decodes(100)
 | 
			
		||||
    integer dat4(13)                      !Decoded message as 12 6-bit integers
 | 
			
		||||
    integer dgen(13)
 | 
			
		||||
    logical lclearave,lnewdat0,lapcqonly,unpk77_success
 | 
			
		||||
@ -83,8 +84,13 @@ contains
 | 
			
		||||
    call sec0(0,tdecode)
 | 
			
		||||
    ndecodes=0
 | 
			
		||||
    decodes=' '
 | 
			
		||||
    f0decodes=0.
 | 
			
		||||
    nfa=nfa0
 | 
			
		||||
    nfb=nfb0
 | 
			
		||||
    if(single_decode) then
 | 
			
		||||
       nfa=nfqso-ntol
 | 
			
		||||
       nfb=nfqso+ntol
 | 
			
		||||
    endif
 | 
			
		||||
    nqd=nqd0
 | 
			
		||||
    lnewdat=lnewdat0
 | 
			
		||||
    max_drift=max_drift0
 | 
			
		||||
@ -169,8 +175,6 @@ contains
 | 
			
		||||
    call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave,  &
 | 
			
		||||
         emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno)
 | 
			
		||||
    call timer('q65_dec0',1)
 | 
			
		||||
!    write(*,3001) '=a',nfqso,ntol,ndepth,xdt,f0,idec
 | 
			
		||||
!3001 format(a2,3i5,f7.2,f7.1,i5)
 | 
			
		||||
 | 
			
		||||
    if(idec.ge.0) then
 | 
			
		||||
       dtdec=xdt                    !We have a q3 or q0 decode at nfqso
 | 
			
		||||
@ -280,6 +284,7 @@ contains
 | 
			
		||||
       if(idupe.eq.0) then
 | 
			
		||||
          ndecodes=min(ndecodes+1,100)
 | 
			
		||||
          decodes(ndecodes)=decoded
 | 
			
		||||
          f0decodes(ndecodes)=f0dec
 | 
			
		||||
          call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
 | 
			
		||||
          nsnr=nint(snr2)
 | 
			
		||||
          call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded,    &
 | 
			
		||||
@ -317,6 +322,10 @@ contains
 | 
			
		||||
       snr1=candidates(icand,1)
 | 
			
		||||
       xdt= candidates(icand,2)
 | 
			
		||||
       f0 = candidates(icand,3)
 | 
			
		||||
       do i=1,ndecodes
 | 
			
		||||
          fdiff=f0-f0decodes(i)
 | 
			
		||||
          if(fdiff.gt.-baud*mode_q65 .and. fdiff.lt.65*baud*mode_q65) go to 800
 | 
			
		||||
       enddo
 | 
			
		||||
       jpk0=(xdt+1.0)*6000                   !Index of nominal start of signal
 | 
			
		||||
       if(ntrperiod.le.30) jpk0=(xdt+0.5)*6000  !For shortest sequences
 | 
			
		||||
       if(jpk0.lt.0) jpk0=0
 | 
			
		||||
@ -365,6 +374,7 @@ contains
 | 
			
		||||
          if(idupe.eq.0) then
 | 
			
		||||
             ndecodes=min(ndecodes+1,100)
 | 
			
		||||
             decodes(ndecodes)=decoded
 | 
			
		||||
             f0decodes(ndecodes)=f0dec
 | 
			
		||||
             call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
 | 
			
		||||
             nsnr=nint(snr2)
 | 
			
		||||
             call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded,    &
 | 
			
		||||
@ -373,6 +383,7 @@ contains
 | 
			
		||||
             if(iand(ndepth,128).ne.0 .and. .not.lagain .and.      &
 | 
			
		||||
                  int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg    !AutoClrAvg
 | 
			
		||||
             call sec0(1,tdecode)
 | 
			
		||||
             ios=1
 | 
			
		||||
!             open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown',&
 | 
			
		||||
!                  position='append',iostat=ios)
 | 
			
		||||
             if(ios.eq.0) then
 | 
			
		||||
@ -394,6 +405,7 @@ contains
 | 
			
		||||
             endif
 | 
			
		||||
          endif
 | 
			
		||||
       endif
 | 
			
		||||
800    continue
 | 
			
		||||
    enddo  ! icand
 | 
			
		||||
    if(iavg.eq.0 .and.navg(iseq).ge.2 .and. iand(ndepth,16).ne.0) go to 50
 | 
			
		||||
900 return
 | 
			
		||||
 | 
			
		||||
@ -148,15 +148,15 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave,  &
 | 
			
		||||
  ii1=max(1,i0-64)
 | 
			
		||||
  ii2=i0-65+LL
 | 
			
		||||
  call pctile(s1(ii1:ii2,1:jz),ii2-ii1+1*jz,45,base)
 | 
			
		||||
  s1=s1/base
 | 
			
		||||
!  s1=s1/base
 | 
			
		||||
  s1raw=s1
 | 
			
		||||
 | 
			
		||||
! Apply fast AGC to the symbol spectra
 | 
			
		||||
  s1max=20.0                                  !Empirical choice
 | 
			
		||||
  do j=1,jz                                   !### Maybe wrong way? ###
 | 
			
		||||
     smax=maxval(s1(ii1:ii2,j))
 | 
			
		||||
     if(smax.gt.s1max) s1(ii1:ii2,j)=s1(ii1:ii2,j)*s1max/smax
 | 
			
		||||
  enddo
 | 
			
		||||
!  s1max=20.0                                  !Empirical choice
 | 
			
		||||
!  do j=1,jz                                   !### Maybe wrong way? ###
 | 
			
		||||
!     smax=maxval(s1(ii1:ii2,j))
 | 
			
		||||
!     if(smax.gt.s1max) s1(ii1:ii2,j)=s1(ii1:ii2,j)*s1max/smax
 | 
			
		||||
!  enddo
 | 
			
		||||
 | 
			
		||||
  dat4=0
 | 
			
		||||
  if(ncw.gt.0 .and. iavg.le.1) then
 | 
			
		||||
@ -489,11 +489,14 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk,  &
 | 
			
		||||
  real ccf2(iz)                               !Orange sync curve
 | 
			
		||||
  real, allocatable :: xdt2(:)
 | 
			
		||||
  real, allocatable :: s1avg(:)
 | 
			
		||||
  real, allocatable :: ccf_lag(:)
 | 
			
		||||
  integer, allocatable :: indx(:)
 | 
			
		||||
  integer ipk1(1)
 | 
			
		||||
 | 
			
		||||
  allocate(xdt2(iz))
 | 
			
		||||
  allocate(s1avg(iz))
 | 
			
		||||
  allocate(indx(iz))
 | 
			
		||||
  allocate(ccf_lag(lag1:lag2))
 | 
			
		||||
 | 
			
		||||
  ia=max(nfa,100)/df
 | 
			
		||||
  ib=min(nfb,4900)/df
 | 
			
		||||
@ -507,12 +510,15 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk,  &
 | 
			
		||||
     s1avg(i)=sum(s1(i,1:jz))
 | 
			
		||||
  enddo
 | 
			
		||||
 | 
			
		||||
  call pctile(s1avg(ia:ib),ib-ia+1,40,base0)
 | 
			
		||||
  ccfbest=0.
 | 
			
		||||
  ibest=0
 | 
			
		||||
  lagpk=0
 | 
			
		||||
  lagbest=0
 | 
			
		||||
  idrift_best=0
 | 
			
		||||
  do i=ia,ib
 | 
			
		||||
     stest=s1avg(i)/(1.015*base0)
 | 
			
		||||
     if(stest.lt.1.4) cycle
 | 
			
		||||
     ccfmax=0.
 | 
			
		||||
     do lag=lag1,lag2
 | 
			
		||||
        do idrift=-max_drift,max_drift
 | 
			
		||||
@ -533,6 +539,40 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk,  &
 | 
			
		||||
           endif
 | 
			
		||||
        enddo  ! idrift
 | 
			
		||||
     enddo  ! lag
 | 
			
		||||
 | 
			
		||||
! Look at SNR on the "blue curve"
 | 
			
		||||
     idrift=idrift_max
 | 
			
		||||
     do lag=lag1,lag2
 | 
			
		||||
        ccft=0.
 | 
			
		||||
        do kk=1,22
 | 
			
		||||
           k=isync(kk)
 | 
			
		||||
           ii=i + nint(idrift*(k-43)/85.0)
 | 
			
		||||
           if(ii.lt.1 .or. ii.gt.iz) cycle
 | 
			
		||||
           n=NSTEP*(k-1) + 1
 | 
			
		||||
           j=n+lag+j0
 | 
			
		||||
           if(j.ge.1 .and. j.le.jz) ccft=ccft + s1(ii,j)
 | 
			
		||||
        enddo  ! kk
 | 
			
		||||
        ccf_lag(lag)=ccft - (22.0/jz)*s1avg(i)
 | 
			
		||||
     enddo
 | 
			
		||||
 | 
			
		||||
     pk=maxval(ccf_lag)
 | 
			
		||||
     ipk1=maxloc(ccf_lag)
 | 
			
		||||
     lag0=ipk1(1)-1+lag1
 | 
			
		||||
     xsum=0.
 | 
			
		||||
     sq=0.
 | 
			
		||||
     nsum=0
 | 
			
		||||
     do j=lag1,lag2
 | 
			
		||||
        if(abs(j-lag0).gt.7) then
 | 
			
		||||
           xsum=xsum+ccf_lag(j)
 | 
			
		||||
           sq=sq+ccf_lag(j)**2
 | 
			
		||||
           nsum=nsum+1
 | 
			
		||||
        endif
 | 
			
		||||
     enddo
 | 
			
		||||
     ave=xsum/nsum
 | 
			
		||||
     rms=sqrt(sq/nsum - ave*ave)
 | 
			
		||||
     snr=(pk-ave)/rms
 | 
			
		||||
     if(snr.lt.5.0) cycle              !Blue SNR must be at least 5
 | 
			
		||||
 | 
			
		||||
     ccf2(i)=ccfmax
 | 
			
		||||
     xdt2(i)=lagpk*dtstep
 | 
			
		||||
     if(ccfmax.gt.ccfbest .and. abs(i*df-nfqso).le.ftol) then
 | 
			
		||||
@ -554,8 +594,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk,  &
 | 
			
		||||
 | 
			
		||||
! Save parameters for best candidates
 | 
			
		||||
  jzz=ib-ia+1
 | 
			
		||||
  call pctile(ccf2(ia:ib),jzz,40,base)
 | 
			
		||||
  ccf2=ccf2/base
 | 
			
		||||
  call indexx(ccf2(ia:ib),jzz,indx)
 | 
			
		||||
  ncand=0
 | 
			
		||||
  maxcand=20
 | 
			
		||||
@ -563,7 +601,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk,  &
 | 
			
		||||
     k=jzz-j+1
 | 
			
		||||
     if(k.lt.1 .or. k.gt.iz) cycle
 | 
			
		||||
     i=indx(k)+ia-1
 | 
			
		||||
     if(ccf2(i).lt.3.3) exit                !Candidate limit
 | 
			
		||||
     f=i*df
 | 
			
		||||
     i3=max(1, i-mode_q65)
 | 
			
		||||
     i4=min(iz,i+mode_q65)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user