WSJT-X/lib/superfox/sfox_demod.f90

80 lines
1.8 KiB
Fortran

subroutine sfox_demod(crcvd,f,t,isync,s2,s3)
use sfox_mod
complex crcvd(NMAX) !Signal as received
complex c(0:NSPS-1) !Work array, one symbol long
real s2(0:NQ-1,0:151) !Symbol spectra, including sync
real s3(0:NQ-1,0:NN) !Synchronized symbol spectra
integer isync(24)
integer ipk(1)
integer hist1(0:NQ-1),hist2(0:NQ-1)
j0=nint(12000.0*(t+0.5))
df=12000.0/NSPS
i0=nint(f/df)-NQ/2
k2=0
s2(:,0)=0. !The punctured symbol
s3(:,0)=0. !The punctured symbol
do n=1,NDS !Loop over all symbols
jb=n*NSPS + j0
ja=jb-NSPS+1
k2=k2+1
if(ja.lt.1 .or. jb.gt.NMAX) cycle
c=crcvd(ja:jb)
call four2a(c,NSPS,1,-1,1) !Compute symbol spectrum
do i=0,NQ-1
s2(i,k2)=real(c(i0+i))**2 + aimag(c(i0+i))**2
enddo
enddo
call pctile(s2,NQ*151,50,base2)
s2=s2/base2
hist1=0
hist2=0
do j=0,151
ipk=maxloc(s2(1:NQ-1,j)) !Find the spectral peak
i=ipk(1)-1
hist1(i)=hist1(i)+1
enddo
hist1(0)=0 !Don't treat sync tone as a birdie
do i=0,123
hist2(i)=sum(hist1(i:i+3))
enddo
ipk=maxloc(hist1)
i1=ipk(1)-1
m1=maxval(hist1)
ipk=maxloc(hist2)
i2=ipk(1)-1
m2=maxval(hist2)
if(m1.gt.12) then
do i=0,127
if(hist1(i).gt.12) then
s2(i,:)=1.0
endif
enddo
endif
if(m2.gt.20) then
if(i2.ge.1) i2=i2-1
if(i2.gt.120) i2=120
s2(i2:i2+7,:)=1.0
endif
k3=0
do n=1,NDS !Copy symbol spectra from s2 into s3
if(any(isync(1:NS).eq.n)) cycle !Skip the sync symbols
k3=k3+1
s3(:,k3)=s2(:,n)
enddo
call pctile(s3,NQ*NN,50,base3)
s3=s3/base3
return
end subroutine sfox_demod