Improve FT8 SNR estimates in two ways:

(i) SNR no longer saturates at +20 dB
(ii) a large signal in the passband no longer causes the
SNR of weaker signals to be biased low.
This commit is contained in:
Steve Franke 2019-11-27 15:58:52 -06:00
parent cb70ef3864
commit a0d471cb0b
4 changed files with 47 additions and 1 deletions

View File

@ -487,6 +487,7 @@ set (wsjt_FSRCS
lib/geodist.f90
lib/getlags.f90
lib/getmet4.f90
lib/ft8/get_spectrum_baseline.f90
lib/ft2/gfsk_pulse.f90
lib/graycode.f90
lib/graycode65.f90

View File

@ -37,6 +37,7 @@ subroutine baseline(s,nfa,nfb,sbase)
kz=k
a=0.
call polyfit(x,y,y,kz,nterms,0,a,chisqr) !Fit a low-order polynomial
sbase=0.0
do i=ia,ib
t=i-i0
sbase(i)=a(1)+t*(a(2)+t*(a(3)+t*(a(4)+t*(a(5))))) + 0.65

View File

@ -0,0 +1,43 @@
subroutine get_spectrum_baseline(dd,nfa,nfb,sbase)
include 'ft8_params.f90'
parameter(NST=NFFT1/2,NF=NMAX/NST-1)
real s(NH1,NF)
real savg(NH1)
real sbase(NH1)
real x(NFFT1)
real window(NFFT1)
complex cx(0:NH1)
real dd(NMAX)
equivalence (x,cx)
logical first
data first/.true./
save first,window
if(first) then
first=.false.
pi=4.0*atan(1.)
window=0.
call nuttal_window(window,NFFT1)
window=window/sum(window)*NSPS*2/300.0
endif
! Compute symbol spectra, stepping by NSTEP steps.
savg=0.
df=12000.0/NFFT1
do j=1,NF
ia=(j-1)*NST + 1
ib=ia+NFFT1-1
if(ib.gt.NMAX) exit
x=dd(ia:ib)*window
call four2a(x,NFFT1,1,-1,0) !r2c FFT
s(1:NH1,j)=abs(cx(1:NH1))**2
savg=savg + s(1:NH1,j) !Average spectrum
enddo
if(nfa.lt.nint(200.0)) nfa=nint(200.0)
if(nfb.gt.nint(4910.0)) nfb=nint(4910.0)
call baseline(savg,nfa,nfb,sbase)
return
end subroutine get_spectrum_baseline

View File

@ -37,7 +37,8 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, &
enddo
savg=savg + s(1:NH1,j) !Average spectrum
enddo
call baseline(savg,nfa,nfb,sbase)
! call baseline(savg,nfa,nfb,sbase)
call get_spectrum_baseline(dd,nfa,nfb,sbase)
ia=max(1,nint(nfa/df))
ib=nint(nfb/df)