mirror of https://github.com/saitohirga/WSJT-X.git
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:
parent
cb70ef3864
commit
a0d471cb0b
|
@ -487,6 +487,7 @@ set (wsjt_FSRCS
|
||||||
lib/geodist.f90
|
lib/geodist.f90
|
||||||
lib/getlags.f90
|
lib/getlags.f90
|
||||||
lib/getmet4.f90
|
lib/getmet4.f90
|
||||||
|
lib/ft8/get_spectrum_baseline.f90
|
||||||
lib/ft2/gfsk_pulse.f90
|
lib/ft2/gfsk_pulse.f90
|
||||||
lib/graycode.f90
|
lib/graycode.f90
|
||||||
lib/graycode65.f90
|
lib/graycode65.f90
|
||||||
|
|
|
@ -37,6 +37,7 @@ subroutine baseline(s,nfa,nfb,sbase)
|
||||||
kz=k
|
kz=k
|
||||||
a=0.
|
a=0.
|
||||||
call polyfit(x,y,y,kz,nterms,0,a,chisqr) !Fit a low-order polynomial
|
call polyfit(x,y,y,kz,nterms,0,a,chisqr) !Fit a low-order polynomial
|
||||||
|
sbase=0.0
|
||||||
do i=ia,ib
|
do i=ia,ib
|
||||||
t=i-i0
|
t=i-i0
|
||||||
sbase(i)=a(1)+t*(a(2)+t*(a(3)+t*(a(4)+t*(a(5))))) + 0.65
|
sbase(i)=a(1)+t*(a(2)+t*(a(3)+t*(a(4)+t*(a(5))))) + 0.65
|
||||||
|
|
|
@ -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
|
|
@ -37,7 +37,8 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, &
|
||||||
enddo
|
enddo
|
||||||
savg=savg + s(1:NH1,j) !Average spectrum
|
savg=savg + s(1:NH1,j) !Average spectrum
|
||||||
enddo
|
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))
|
ia=max(1,nint(nfa/df))
|
||||||
ib=nint(nfb/df)
|
ib=nint(nfb/df)
|
||||||
|
|
Loading…
Reference in New Issue