2021-10-26 16:40:14 -04:00
|
|
|
subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr)
|
2021-10-26 12:14:32 -04:00
|
|
|
|
2021-10-26 16:40:14 -04:00
|
|
|
! Get q3-style decodes for FT8.
|
2021-10-26 12:14:32 -04:00
|
|
|
|
|
|
|
use packjt77
|
|
|
|
parameter(NN=79,NSPS=32)
|
|
|
|
parameter(NWAVE=NN*NSPS) !2528
|
|
|
|
parameter(NZ=3200,NLAGS=NZ-NWAVE)
|
2021-10-26 16:40:14 -04:00
|
|
|
character*12 call_1,call_2
|
|
|
|
character*4 grid4
|
|
|
|
character*37 msg,msgbest,msgsent
|
2021-10-26 12:14:32 -04:00
|
|
|
character c77*77
|
|
|
|
complex cwave(0:NWAVE-1)
|
|
|
|
complex cd(0:NZ-1)
|
|
|
|
complex z
|
|
|
|
real xjunk(NWAVE)
|
|
|
|
real ccf(0:NLAGS-1)
|
2021-11-11 12:28:24 -05:00
|
|
|
real ccfmsg(206)
|
2021-10-26 12:14:32 -04:00
|
|
|
integer itone(NN)
|
|
|
|
integer*1 msgbits(77)
|
2021-10-26 16:40:14 -04:00
|
|
|
logical std_1,std_2
|
2021-10-26 12:14:32 -04:00
|
|
|
|
2021-10-26 16:40:14 -04:00
|
|
|
if(xdt.eq.-99.0) return !Silence compiler warning
|
|
|
|
call stdcall(call_1,std_1)
|
|
|
|
call stdcall(call_2,std_2)
|
2021-10-26 12:14:32 -04:00
|
|
|
|
|
|
|
fs=200.0 !Sample rate (Hz)
|
|
|
|
dt=1.0/fs !Sample interval (s)
|
2021-10-26 16:40:14 -04:00
|
|
|
bt=2.0
|
|
|
|
ccfbest=0.
|
|
|
|
lagbest=-1
|
|
|
|
|
2021-11-11 12:28:24 -05:00
|
|
|
do imsg=1,206
|
2021-10-26 16:40:14 -04:00
|
|
|
msg=trim(call_1)//' '//trim(call_2)
|
|
|
|
i=imsg
|
|
|
|
if(.not.std_1) then
|
|
|
|
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
|
|
|
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
|
|
|
else if(.not.std_2) then
|
|
|
|
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
|
|
|
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
|
|
|
endif
|
|
|
|
j0=len(trim(msg))+2
|
|
|
|
if(i.eq.2) msg(j0:j0+2)='RRR'
|
|
|
|
if(i.eq.3) msg(j0:j0+3)='RR73'
|
|
|
|
if(i.eq.4) msg(j0:j0+1)='73'
|
|
|
|
if(i.eq.5) then
|
|
|
|
if(std_2) msg='CQ '//trim(call_2)//' '//grid4
|
|
|
|
if(.not.std_2) msg='CQ '//trim(call_2)
|
|
|
|
endif
|
|
|
|
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
|
|
|
|
if(i.ge.7 .and. i.le.206) then
|
|
|
|
isnr = -50 + (i-7)/2
|
|
|
|
if(iand(i,1).eq.1) then
|
|
|
|
write(msg(j0:j0+2),'(i3.2)') isnr
|
|
|
|
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
|
|
|
|
else
|
|
|
|
write(msg(j0:j0+3),'("R",i3.2)') isnr
|
|
|
|
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
|
|
|
|
endif
|
|
|
|
endif
|
2021-10-26 12:14:32 -04:00
|
|
|
|
|
|
|
! Source-encode, then get itone()
|
2021-10-26 16:40:14 -04:00
|
|
|
i3=-1
|
|
|
|
n3=-1
|
|
|
|
call pack77(msg,i3,n3,c77)
|
|
|
|
call genft8(msg,i3,n3,msgsent,msgbits,itone)
|
2021-10-26 12:14:32 -04:00
|
|
|
! Generate complex cwave
|
2021-10-26 16:40:14 -04:00
|
|
|
call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE)
|
2021-10-26 12:14:32 -04:00
|
|
|
|
2021-10-26 16:40:14 -04:00
|
|
|
lagmax=-1
|
|
|
|
ccfmax=0.
|
|
|
|
nsum=32*2
|
|
|
|
do lag=0,nlags-1
|
|
|
|
z=0.
|
|
|
|
s=0.
|
|
|
|
do i=0,NWAVE-1
|
|
|
|
z=z + cd(i+lag)*conjg(cwave(i))
|
|
|
|
if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then
|
|
|
|
s=s + abs(z)
|
|
|
|
z=0.
|
|
|
|
endif
|
|
|
|
enddo
|
|
|
|
ccf(lag)=s
|
|
|
|
if(ccf(lag).gt.ccfmax) then
|
|
|
|
ccfmax=ccf(lag)
|
|
|
|
lagmax=lag
|
2021-10-26 12:14:32 -04:00
|
|
|
endif
|
2021-10-26 16:40:14 -04:00
|
|
|
enddo ! lag
|
|
|
|
ccfmsg(imsg)=ccfmax
|
|
|
|
if(ccfmax.gt.ccfbest) then
|
|
|
|
ccfbest=ccfmax
|
|
|
|
lagbest=lagmax
|
|
|
|
msgbest=msg
|
2021-10-26 12:14:32 -04:00
|
|
|
endif
|
2021-10-26 16:40:14 -04:00
|
|
|
enddo ! imsg
|
2021-10-26 12:14:32 -04:00
|
|
|
|
2021-10-26 16:40:14 -04:00
|
|
|
call pctile(ccfmsg,207,50,base)
|
|
|
|
call pctile(ccfmsg,207,67,sigma)
|
|
|
|
sigma=sigma-base
|
2021-11-11 12:28:24 -05:00
|
|
|
ccfmsg=(ccfmsg-base)/sigma
|
2021-11-04 11:55:15 -04:00
|
|
|
! do imsg=1,207
|
|
|
|
! write(44,3044) imsg,ccfmsg(imsg)
|
|
|
|
!3044 format(i5,f10.3)
|
|
|
|
! enddo
|
2021-10-26 16:40:14 -04:00
|
|
|
snr=maxval(ccfmsg)
|
2021-10-26 12:14:32 -04:00
|
|
|
|
2021-10-26 16:40:14 -04:00
|
|
|
return
|
|
|
|
end subroutine ft8q3
|