mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-21 19:55:20 -05:00
Fix several flaws in the loop-over-NB logic in the FST4 decoder.
This commit is contained in:
parent
2af01ebaa1
commit
0ab3e5116f
@ -229,7 +229,6 @@ contains
|
|||||||
npct=0
|
npct=0
|
||||||
nb=nexp_decode/256 - 2
|
nb=nexp_decode/256 - 2
|
||||||
if(nb.ge.0) npct=nb
|
if(nb.ge.0) npct=nb
|
||||||
inb0=0
|
|
||||||
inb1=20
|
inb1=20
|
||||||
inb2=5
|
inb2=5
|
||||||
if(nb.eq.-1) then
|
if(nb.eq.-1) then
|
||||||
@ -240,42 +239,44 @@ contains
|
|||||||
inb1=0 !Fixed NB value, 0 to 25%
|
inb1=0 !Fixed NB value, 0 to 25%
|
||||||
ipct(0)=npct
|
ipct(0)=npct
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if(iwspr.eq.1) then !FST4W
|
||||||
|
!300 Hz wide noise-fit window
|
||||||
|
nfa=max(100,nint(nfqso+1.5*baud-150))
|
||||||
|
nfb=min(4800,nint(nfqso+1.5*baud+150))
|
||||||
|
fa=max(100,nint(nfqso+1.5*baud-ntol)) ! signal search window
|
||||||
|
fb=min(4800,nint(nfqso+1.5*baud+ntol))
|
||||||
|
else if(single_decode) then
|
||||||
|
fa=max(100,nint(nfa+1.5*baud))
|
||||||
|
fb=min(4800,nint(nfb+1.5*baud))
|
||||||
|
! extend noise fit 100 Hz outside of search window
|
||||||
|
nfa=max(100,nfa-100)
|
||||||
|
nfb=min(4800,nfb+100)
|
||||||
|
else
|
||||||
|
fa=max(100,nint(nfa+1.5*baud))
|
||||||
|
fb=min(4800,nint(nfb+1.5*baud))
|
||||||
|
! extend noise fit 100 Hz outside of search window
|
||||||
|
nfa=max(100,nfa-100)
|
||||||
|
nfb=min(4800,nfb+100)
|
||||||
|
endif
|
||||||
|
|
||||||
ndecodes=0
|
ndecodes=0
|
||||||
decodes=' '
|
decodes=' '
|
||||||
|
do inb=0,inb1,inb2
|
||||||
do inb=inb0,inb1,inb2
|
|
||||||
if(nb.lt.0) npct=inb
|
if(nb.lt.0) npct=inb
|
||||||
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
|
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
|
||||||
|
|
||||||
! The big fft is done once and is used for calculating the smoothed spectrum
|
! The big fft is done once and is used for calculating the smoothed spectrum
|
||||||
! and also for downconverting/downsampling each candidate.
|
! and also for downconverting/downsampling each candidate.
|
||||||
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
||||||
|
|
||||||
nhicoh=1
|
nhicoh=1
|
||||||
nsyncoh=8
|
nsyncoh=8
|
||||||
if(iwspr.eq.1) then !FST4W
|
|
||||||
nfa=max(100,nint(nfqso+1.5*baud-150)) !300 Hz wide noise-fit window
|
|
||||||
nfb=min(4800,nint(nfqso+1.5*baud+150))
|
|
||||||
fa=max(100,nint(nfqso+1.5*baud-ntol)) ! signal search window
|
|
||||||
fb=min(4800,nint(nfqso+1.5*baud+ntol))
|
|
||||||
else if(single_decode) then
|
|
||||||
fa=max(100,nint(nfa+1.5*baud))
|
|
||||||
fb=min(4800,nint(nfb+1.5*baud))
|
|
||||||
nfa=max(100,nfa-100) ! extend noise fit 100 Hz outside of search window
|
|
||||||
nfb=min(4800,nfb+100)
|
|
||||||
else
|
|
||||||
fa=max(100,nint(nfa+1.5*baud))
|
|
||||||
fb=min(4800,nint(nfb+1.5*baud))
|
|
||||||
nfa=max(100,nfa-100) ! extend noise fit 100 Hz outside of search window
|
|
||||||
nfb=min(4800,nfb+100)
|
|
||||||
endif
|
|
||||||
minsync=1.20
|
minsync=1.20
|
||||||
if(ntrperiod.eq.15) minsync=1.15
|
if(ntrperiod.eq.15) minsync=1.15
|
||||||
|
|
||||||
! Get first approximation of candidate frequencies
|
! Get first approximation of candidate frequencies
|
||||||
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
||||||
minsync,ncand,candidates0)
|
minsync,ncand,candidates0)
|
||||||
|
|
||||||
isbest=0
|
isbest=0
|
||||||
fc2=0.
|
fc2=0.
|
||||||
do icand=1,ncand
|
do icand=1,ncand
|
||||||
@ -307,10 +308,10 @@ contains
|
|||||||
do icand=1,ncand
|
do icand=1,ncand
|
||||||
fc=candidates0(icand,3)
|
fc=candidates0(icand,3)
|
||||||
isbest=nint(candidates0(icand,4))
|
isbest=nint(candidates0(icand,4))
|
||||||
do ic2=1,ncand
|
do ic2=icand+1,ncand
|
||||||
fc2=candidates0(ic2,3)
|
fc2=candidates0(ic2,3)
|
||||||
isbest2=nint(candidates0(ic2,4))
|
isbest2=nint(candidates0(ic2,4))
|
||||||
if(ic2.ne.icand .and. fc2.gt.0.0) then
|
if(fc2.gt.0.0) then
|
||||||
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
|
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
|
||||||
if(abs(isbest2-isbest).le.2) then
|
if(abs(isbest2-isbest).le.2) then
|
||||||
candidates0(ic2,3)=-1
|
candidates0(ic2,3)=-1
|
||||||
@ -327,7 +328,7 @@ contains
|
|||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
ncand=ic
|
ncand=ic
|
||||||
|
|
||||||
! If FST4 and Single Decode is not checked, then find candidates within
|
! If FST4 and Single Decode is not checked, then find candidates within
|
||||||
! 20 Hz of nfqso and put them at the top of the list
|
! 20 Hz of nfqso and put them at the top of the list
|
||||||
if(iwspr.eq.0 .and. .not.single_decode) then
|
if(iwspr.eq.0 .and. .not.single_decode) then
|
||||||
@ -475,7 +476,7 @@ contains
|
|||||||
do i=1,ndecodes
|
do i=1,ndecodes
|
||||||
if(decodes(i).eq.msg) idupe=1
|
if(decodes(i).eq.msg) idupe=1
|
||||||
enddo
|
enddo
|
||||||
if(idupe.eq.1) goto 2002
|
if(idupe.eq.1) goto 800
|
||||||
ndecodes=ndecodes+1
|
ndecodes=ndecodes+1
|
||||||
decodes(ndecodes)=msg
|
decodes(ndecodes)=msg
|
||||||
|
|
||||||
@ -522,14 +523,15 @@ contains
|
|||||||
endif
|
endif
|
||||||
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
|
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
|
||||||
iaptype,qual,ntrperiod,lwspr,fmid,w50)
|
iaptype,qual,ntrperiod,lwspr,fmid,w50)
|
||||||
goto 2002
|
if(iwspr.eq.0 .and. nb.lt.0) go to 900
|
||||||
|
goto 800
|
||||||
endif
|
endif
|
||||||
enddo ! metrics
|
enddo ! metrics
|
||||||
enddo ! istart jitter
|
enddo ! istart jitter
|
||||||
2002 enddo !candidate list
|
800 enddo !candidate list
|
||||||
enddo
|
enddo ! noise blanker loop
|
||||||
|
|
||||||
return
|
900 return
|
||||||
end subroutine decode
|
end subroutine decode
|
||||||
|
|
||||||
subroutine sync_fst4(cd0,i0,f0,hmod,ncoh,np,nss,ntr,fs,sync)
|
subroutine sync_fst4(cd0,i0,f0,hmod,ncoh,np,nss,ntr,fs,sync)
|
||||||
|
Loading…
Reference in New Issue
Block a user