mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-22 04:11:16 -05:00
be8c837d85
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8639 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
68 lines
2.2 KiB
Fortran
68 lines
2.2 KiB
Fortran
subroutine decode9w(nfqso,ntol,nsubmode,ss,id2,sync,nsnr,xdt1,f0,decoded)
|
|
|
|
! Decode a weak signal in a wide/slow JT9 submode.
|
|
|
|
parameter (NSMAX=6827,NZMAX=60*12000)
|
|
real ss(184,NSMAX) !Symbol spectra at 1/2-symbol steps
|
|
real ccfred(NSMAX) !Best sync vs frequency
|
|
real ccfblue(-9:18) !Sync vs time at best frequency
|
|
real a(5) !Fitted Lorentzian params
|
|
integer*2 id2(NZMAX) !Raw 16-bit data
|
|
integer*1 i1SoftSymbols(207) !Binary soft symbols
|
|
character*22 decoded !Decoded message
|
|
|
|
df=12000.0/16384.0 !Bin spacing in ss()
|
|
nsps=6912 !Samples per 9-FSK symbol
|
|
tstep=nsps*0.5/12000.0 !Half-symbol duration
|
|
npts=52*12000
|
|
limit=10000 !Fano timeout parameter
|
|
|
|
ia=max(1,nint((nfqso-ntol)/df)) !Start frequency bin
|
|
ib=min(NSMAX,nint((nfqso+ntol)/df)) !End frequency bin
|
|
lag1=-int(2.5/tstep + 0.9999) !Start lag
|
|
lag2=int(5.0/tstep + 0.9999) !End lag
|
|
nhsym=184 !Number of half-symbols
|
|
|
|
! First sync pass finds approximate Doppler spread; second pass does a
|
|
! good Lorentzian fit to determine frequency f0.
|
|
do iter=1,2
|
|
nadd=3
|
|
if(iter.eq.2) nadd=2*nint(0.375*a(4)) + 1
|
|
call sync9w(ss,nhsym,lag1,lag2,ia,ib,ccfred,ccfblue,ipk,lagpk,nadd)
|
|
s=0.
|
|
sq=0.
|
|
ns=0
|
|
do i=-9,18
|
|
if(abs(i-lagpk).gt.3) then
|
|
s=s+ccfblue(i)
|
|
sq=sq+ccfblue(i)**2
|
|
ns=ns+1
|
|
endif
|
|
enddo
|
|
base=s/ns
|
|
rms=sqrt(sq/ns - base**2)
|
|
sync=(ccfblue(lagpk)-base)/rms
|
|
xdt0=lagpk*tstep
|
|
call lorentzian(ccfred(ia),ib-ia+1,a)
|
|
f0=(ia+a(3))*df
|
|
enddo
|
|
ccfblue=(ccfblue-base)/rms
|
|
|
|
call softsym9w(id2,npts,xdt0,f0,a(4)*df,nsubmode,xdt1-1.05,snrdb,i1softsymbols)
|
|
nsnr=nint(snrdb)
|
|
call jt9fano(i1softsymbols,limit,nlim,decoded)
|
|
|
|
!###
|
|
! do i=-9,18
|
|
! write(81,3081) i,ccfblue(i)
|
|
!3081 format(i3,f10.3)
|
|
! enddo
|
|
! do i=1,NSMAX
|
|
! write(82,3082) i*df,ccfred(i)
|
|
!3082 format(f10.1,e12.3)
|
|
! enddo
|
|
!###
|
|
|
|
return
|
|
end subroutine decode9w
|