mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-03-23 04:28:36 -04:00
More work on block detection for dpsk.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8644 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
073d7d01c9
commit
8149fe24be
@ -38,6 +38,7 @@ program wsprdpskd
|
||||
integer*1,target :: idat(9)
|
||||
integer*1 decoded(68),apmask(204),cw(204)
|
||||
integer*1 hbits(232),hbits1(232),hbits3(232)
|
||||
integer*1 b(14),bbest(14)
|
||||
data ipreamble/1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1/
|
||||
data iuniqueword0/z'30C9E8AD'/
|
||||
|
||||
@ -64,12 +65,7 @@ program wsprdpskd
|
||||
isync2(113:116)=0
|
||||
isync2(117:216)=isync(101:200)
|
||||
|
||||
! data sync tone
|
||||
! 0 0 0
|
||||
! 0 1 1
|
||||
! 1 0 2
|
||||
! 1 1 3
|
||||
dphi=twopi*baud*(h/2.0)*dt*20 ! dt*10 is samp interval after downsample
|
||||
dphi=twopi*baud*(h/2.0)*dt*20 ! dt*20 is samp interval after downsample
|
||||
do j=0,1
|
||||
if(j.eq.0) then
|
||||
dphi0=-3*dphi
|
||||
@ -150,24 +146,76 @@ program wsprdpskd
|
||||
fb=10.0
|
||||
fs=12000.0/30.0
|
||||
npts=120*12000.0/30.0
|
||||
nsync=16
|
||||
call getcandidate2(c2,npts,fs,fa,fb,ncand,candidates) !First approx for freq
|
||||
! call getcandidate2(c2,npts,fs,fa,fb,ncand,candidates) !First approx for freq
|
||||
ncand=1
|
||||
candidates(1,1)=0.0
|
||||
candidates(1,2)=-28
|
||||
ndecodes=0
|
||||
do icand=1,ncand
|
||||
fc0=candidates(icand,1)
|
||||
xsnr=candidates(icand,2)
|
||||
fc0=0.0
|
||||
call dsdpsk(c2,fc0,cd)
|
||||
i0=40
|
||||
do i=0,231
|
||||
cs(i)=cd(i0+10*i)
|
||||
enddo
|
||||
cs(i)=cd(i0+10*i)/5e4
|
||||
enddo
|
||||
! 2-bit differential detection
|
||||
do i=1,231
|
||||
sbits(i)=-real(cs(i)*conjg(cs(i-1)))/5e4
|
||||
sbits(i)=-real(cs(i)*conjg(cs(i-1)))
|
||||
enddo
|
||||
|
||||
rxdata(1:100)=sbits(1:100)
|
||||
rxdata(101:200)=sbits(132:231);
|
||||
! detect a differentially encoded block of symbols using the
|
||||
! Divsalar and Simon approach, except that we estimate only
|
||||
! the central symbol of the block and then step the block forward
|
||||
! by one symbol.
|
||||
!
|
||||
sbits3=sbits
|
||||
goto 100
|
||||
nbit=13 ! number of decoded bits to be derived from nbit+1 symbols
|
||||
numseq=2**nbit
|
||||
il=(nbit+1)/2
|
||||
ih=231-nbit/2
|
||||
do isym=il,ih
|
||||
rmax=-1e32
|
||||
b=0
|
||||
do iseq=0,numseq-1
|
||||
do i=1,nbit
|
||||
b(i)=merge(1,0,iand(iseq,2**(nbit-i))>0)
|
||||
enddo
|
||||
b(1:nbit)=2*b(1:nbit)-1
|
||||
i1=isym-(nbit+1)/2
|
||||
csum=cs(i1)
|
||||
do i=1,nbit
|
||||
bb=1
|
||||
do m=1,i
|
||||
bb=bb*b(m)
|
||||
enddo
|
||||
csum=csum+bb*cs(i1+i)
|
||||
enddo
|
||||
ps(iseq)=abs(csum)**2
|
||||
if(ps(iseq).gt.rmax) then
|
||||
bbest=b
|
||||
rmax=ps(iseq)
|
||||
endif
|
||||
enddo
|
||||
if(isym.eq.il) then
|
||||
do i=1,isym-1
|
||||
call getmetric(2**(nbit-i),ps,numseq,xmet)
|
||||
sbits3(i)=-xmet
|
||||
enddo
|
||||
endif
|
||||
call getmetric(2**((nbit-1)/2),ps,numseq,xmet)
|
||||
sbits3(isym)=-xmet
|
||||
if(isym.eq.ih) then
|
||||
do i=ih+1,231
|
||||
call getmetric(2**(231-i),ps,numseq,xmet)
|
||||
sbits3(i)=-xmet
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
100 continue
|
||||
rxdata(1:100)=sbits3(1:100)
|
||||
rxdata(101:200)=sbits3(132:231);
|
||||
rxav=sum(rxdata(1:200))/200.0
|
||||
rx2av=sum(rxdata(1:200)*rxdata(1:200))/200.0
|
||||
rxsig=sqrt(rx2av-rxav*rxav)
|
||||
@ -227,6 +275,22 @@ program wsprdpskd
|
||||
|
||||
999 end program wsprdpskd
|
||||
|
||||
subroutine getmetric(ib,ps,ns,xmet)
|
||||
real ps(0:ns-1)
|
||||
xm1=-1e32
|
||||
xm0=-1e32
|
||||
do i=0,ns-1
|
||||
if( iand(i/ib,1) .eq. 1 .and. ps(i) .gt. xm1 ) then
|
||||
xm1=ps(i)
|
||||
endif
|
||||
if( iand(i/ib,1) .eq. 0 .and. ps(i) .gt. xm0 ) then
|
||||
xm0=ps(i)
|
||||
endif
|
||||
enddo
|
||||
xmet=xm1-xm0
|
||||
return
|
||||
end subroutine getmetric
|
||||
|
||||
subroutine dsdpsk(ci,f0,co)
|
||||
parameter(NI=240*200,NH=NI/2,NO=NI/20) ! downsample from 200 samples per symbol to 10
|
||||
complex ci(0:NI-1),ct(0:NI-1)
|
||||
|
Loading…
Reference in New Issue
Block a user