mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	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 | ||||||
|  | |||||||
							
								
								
									
										43
									
								
								lib/ft8/get_spectrum_baseline.f90
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								lib/ft8/get_spectrum_baseline.f90
									
									
									
									
									
										Normal 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 | ||||||
| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user