mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-05-28 04:12:32 -04:00
80 lines
1.8 KiB
Fortran
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
|