mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-02-03 09:44:24 -05:00
FT4: Imrovements to sync.
Divide DT search range into 3 segments. Search central segment (near DT=0) first and try to decode the largest peak. Then find the largest peak in each of the surrounding segments and try to decode those only if the peak is larger than the one found in the central segment. Also re-indent ft4_decode.f90 and some other minor tweaks.
This commit is contained in:
parent
b4a318e5a9
commit
c26d0b4f29
@ -8,7 +8,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, &
|
||||
real x(NFFT1)
|
||||
real window(NFFT1)
|
||||
complex cx(0:NH1)
|
||||
real candidate(3,maxcand)
|
||||
real candidate(2,maxcand)
|
||||
real dd(NMAX)
|
||||
integer ipk(1)
|
||||
equivalence (x,cx)
|
||||
@ -64,8 +64,7 @@ subroutine getcandidates4(dd,fa,fb,syncmin,nfqso,maxcand,savg,candidate, &
|
||||
speak=savsm(i) - 0.25*(savsm(i-1)-savsm(i+1))*del
|
||||
ncand=ncand+1
|
||||
candidate(1,ncand)=fpeak
|
||||
candidate(2,ncand)=-99.99
|
||||
candidate(3,ncand)=speak
|
||||
candidate(2,ncand)=speak
|
||||
if(ncand.eq.maxcand) exit
|
||||
endif
|
||||
enddo
|
||||
|
@ -18,7 +18,7 @@ subroutine sync4d(cd0,i0,ctwk,itwk,sync)
|
||||
data first/.true./
|
||||
save first,twopi,csynca,csyncb,csyncc,csyncd,fac
|
||||
|
||||
p(z1)=sqrt(real(z1*fac)**2 + aimag(z1*fac)**2) !Statement function for power
|
||||
p(z1)=(real(z1*fac)**2 + aimag(z1*fac)**2)**0.5 !Statement function for power
|
||||
|
||||
if( first ) then
|
||||
twopi=8.0*atan(1.0)
|
||||
|
@ -50,7 +50,7 @@ contains
|
||||
real bitmetrics(2*NN,3)
|
||||
real dd(NMAX)
|
||||
real llr(2*ND),llra(2*ND),llrb(2*ND),llrc(2*ND),llrd(2*ND)
|
||||
real candidate(3,100)
|
||||
real candidate(2,100)
|
||||
real savg(NH1),sbase(NH1)
|
||||
|
||||
integer apbits(2*ND)
|
||||
@ -229,7 +229,7 @@ contains
|
||||
dobigfft=.true.
|
||||
do icand=1,ncand
|
||||
f0=candidate(1,icand)
|
||||
snr=candidate(3,icand)-1.0
|
||||
snr=candidate(2,icand)-1.0
|
||||
call timer('ft4_down',0)
|
||||
call ft4_downsample(dd,dobigfft,f0,cd2) !Downsample to 32 Sam/Sym
|
||||
call timer('ft4_down',1)
|
||||
@ -237,6 +237,7 @@ contains
|
||||
sum2=sum(cd2*conjg(cd2))/(real(NMAX)/real(NDOWN))
|
||||
if(sum2.gt.0.0) cd2=cd2/sqrt(sum2)
|
||||
! Sample rate is now 12000/18 = 666.67 samples/second
|
||||
do iseg=1,3 ! DT search is done over 3 segments
|
||||
do isync=1,2
|
||||
if(isync.eq.1) then
|
||||
idfmin=-12
|
||||
@ -244,6 +245,17 @@ contains
|
||||
idfstp=3
|
||||
ibmin=-344
|
||||
ibmax=1012
|
||||
if(iseg.eq.1) then
|
||||
ibmin=108
|
||||
ibmax=560
|
||||
elseif(iseg.eq.2) then
|
||||
smax1=smax
|
||||
ibmin=560
|
||||
ibmax=1012
|
||||
elseif(iseg.eq.3) then
|
||||
ibmin=-344
|
||||
ibmax=108
|
||||
endif
|
||||
ibstp=4
|
||||
else
|
||||
idfmin=idfbest-4
|
||||
@ -254,8 +266,8 @@ contains
|
||||
ibstp=1
|
||||
endif
|
||||
ibest=-1
|
||||
smax=-99.
|
||||
idfbest=0
|
||||
smax=-99.
|
||||
call timer('sync4d ',0)
|
||||
do idf=idfmin,idfmax,idfstp
|
||||
do istart=ibmin,ibmax,ibstp
|
||||
@ -269,11 +281,13 @@ contains
|
||||
enddo
|
||||
call timer('sync4d ',1)
|
||||
enddo
|
||||
if(iseg.eq.1) smax1=smax
|
||||
if(smax.lt.0.7) cycle
|
||||
f0=f0+real(idfbest)
|
||||
if( f0.le.10.0 .or. f0.ge.4990.0 ) cycle
|
||||
if(iseg.gt.1 .and. smax.lt.smax1) cycle
|
||||
f1=f0+real(idfbest)
|
||||
if( f1.le.10.0 .or. f1.ge.4990.0 ) cycle
|
||||
call timer('ft4down ',0)
|
||||
call ft4_downsample(dd,dobigfft,f0,cb) !Final downsample, corrected f0
|
||||
call ft4_downsample(dd,dobigfft,f1,cb) !Final downsample, corrected f0
|
||||
call timer('ft4down ',1)
|
||||
sum2=sum(abs(cb)**2)/(real(NSS)*NN)
|
||||
if(sum2.gt.0.0) cb=cb/sqrt(sum2)
|
||||
@ -341,7 +355,7 @@ contains
|
||||
!
|
||||
! Conditions that cause us to bail out of AP decoding
|
||||
napwid=50
|
||||
if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f0-nfqso).gt.napwid) ) cycle
|
||||
if(ncontest.le.4 .and. iaptype.ge.3 .and. (abs(f1-nfqso).gt.napwid) ) cycle
|
||||
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
|
||||
if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall
|
||||
|
||||
@ -403,9 +417,9 @@ contains
|
||||
|
||||
if(doosd .and. nharderror.lt.0) then
|
||||
ndeep=3
|
||||
if(abs(nfqso-f0).le.napwid) then
|
||||
ndeep=4
|
||||
endif
|
||||
! if(abs(nfqso-f1).le.napwid) then
|
||||
! ndeep=4
|
||||
! endif
|
||||
call timer('osd174_91 ',0)
|
||||
call osd174_91(llr,apmask,ndeep,message77,cw,nharderror,dmin)
|
||||
call timer('osd174_91 ',1)
|
||||
@ -420,7 +434,7 @@ contains
|
||||
call get_ft4_tones_from_77bits(message77,i4tone)
|
||||
dt=real(ibest)/666.67
|
||||
call timer('subtract',0)
|
||||
call subtractft4(dd,i4tone,f0,dt)
|
||||
call subtractft4(dd,i4tone,f1,dt)
|
||||
call timer('subtract',1)
|
||||
endif
|
||||
idupe=0
|
||||
@ -437,12 +451,14 @@ contains
|
||||
endif
|
||||
nsnr=nint(max(-21.0,xsnr))
|
||||
xdt=ibest/666.67 - 0.5
|
||||
!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3,f5.1,i4,i4)') &
|
||||
! nutc,nsnr,xdt,nint(f0),message,sync,iaptype,ipass,isp,dmin,nsync_qual,nharderror
|
||||
call this%callback(sync,nsnr,xdt,f0,message,iaptype,qual)
|
||||
!write(21,'(i6.6,i5,2x,f4.1,i6,2x,a37,2x,f4.1,3i3,f5.1,i4,i4,i4)') &
|
||||
! nutc,nsnr,xdt,nint(f1),message,smax,iaptype,ipass,isp,dmin,nsync_qual,nharderror,iseg
|
||||
call this%callback(smax,nsnr,xdt,f1,message,iaptype,qual)
|
||||
exit
|
||||
endif
|
||||
enddo !Sequence estimation
|
||||
if(nharderror.ge.0) exit
|
||||
enddo !3 DT segments
|
||||
enddo !Candidate list
|
||||
enddo !Subtraction loop
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user