WSJT-X/libm65/rtping.f90
Joe Taylor 8b55eb3a28 Functioning JTMSK decoder, within stand-alone program msk.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/jtms3@2519 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2012-07-17 19:31:01 +00:00

104 lines
2.7 KiB
Fortran

subroutine rtping(dat,k,cfile6,MinSigdB,MouseDF,ntol)
!subroutine rtping(dat,jz,nz,MinSigdB,MinWidth,NFreeze,DFTolerance, &
! MouseDF,istart,pick,cfile6,mycall,hiscall,mode,ps0)
! Decode Multi-Tone FSK441 mesages.
parameter (NSMAX=30*48000)
parameter (NZMAX=NSMAX/2048)
real dat(NSMAX) !Raw audio data
logical pick
character*6 cfile6
real sig(NZMAX) !Sq-law detected signal, sampled at 43 ms
real sigdb(NZMAX) !Signal in dB, sampled at 43 ms
real work(NZMAX)
real pingdat(3,100)
! character msg*40,msg3*3
character*90 line
common/ccom/nline,tping(100),line(100)
data nping0/0/
save
slim=MinSigdB
! nf1=-ntol
! nf2=ntol
dt=1.0/48000.0
kstep=2048
! pick=.false.
istart=1
jz=k
! Find signal power
j=k/kstep
sig(j)=dot_product(dat(k-kstep+1:k),dat(k-kstep+1:k))/kstep
if(j.lt.10) return
! Remove baseline, compute signal level in dB
call pctile (sig,work,j,50,base1)
do i=1,j
sigdb(i)=db(sig(i)/base1)
if(j.eq.703) write(13,3001) i,sig(i),sigdb(i)
3001 format(i5,2e12.3)
enddo
dtbuf=kstep*dt
wmin=0.040
call ping(sigdb,j,dtbuf,slim,wmin,pingdat,nping)
! If this is a "mouse pick" and no ping was found, force a pseudo-ping
! at center of data.
! if(pick.and.nping.eq.0) then
! if(nping.le.99) nping=nping+1
! pingdat(1,nping)=0.5*jz*dt
! pingdat(2,nping)=0.16
! pingdat(3,nping)=1.0
! endif
do iping=1,nping
! Find starting place and length of data to be analyzed:
tstart=pingdat(1,iping)
width=pingdat(2,iping)
peak=pingdat(3,iping)
! mswidth=10*nint(100.0*width)
jj=(tstart-0.02)/dt
if(jj.lt.1) jj=1
jjz=nint((width+0.02)/dt)+1
jjz=min(jjz,jz+1-jj)
! Compute average spectrum of this ping.
! call spec441(dat(jj),jjz,ps,f0)
! Decode the message.
! msg=' '
! call longx(dat(jj),jjz,ps,DFTolerance,noffset,msg,msglen,bauderr)
! Assemble a signal report:
nwidth=0
if(width.ge.0.04) nwidth=1 !These might depend on NSPD
if(width.ge.0.12) nwidth=2
if(width.gt.1.00) nwidth=3
nstrength=6
if(peak.ge.11.0) nstrength=7
if(peak.ge.17.0) nstrength=8
if(peak.ge.23.0) nstrength=9
! nrpt=10*nwidth + nstrength
t2=tstart + dt*(istart-1)
jjzz=min(jjz,2*48000) !Max data size 2 s
!###
jjzz=14400
jj=jj-200
!###
if(nping.gt.nping0) then
print*,'a',jj,jjzz,jj*dt,jjzz*dt,t2,width
call jtmsk(dat(jj),jjzz,cfile6,t2,mswidth,int(peak),nrpt, &
nfreeze,DFTolerance,MouseDF,pick)
nping0=nping
endif
enddo
return
end subroutine rtping