mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-05-24 10:22:26 -04:00
Improve sensitivity of msk32 decoder.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6885 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
ea3ec805ab
commit
b9a6d346b5
@ -319,98 +319,103 @@ subroutine detectmsk32(cbig,n,lines,nmessages,nutc)
|
|||||||
cca=sum(c(1:1+41)*conjg(cb))
|
cca=sum(c(1:1+41)*conjg(cb))
|
||||||
phase0=atan2(imag(cca),real(cca))
|
phase0=atan2(imag(cca),real(cca))
|
||||||
|
|
||||||
! Remove phase error - want constellation rotated so that sample points lie on I/Q axes
|
do ipha=1,3
|
||||||
cfac=cmplx(cos(phase0),sin(phase0))
|
if( ipha.eq.2 ) phase0=phase0-20*pi/180.0
|
||||||
c=c*conjg(cfac)
|
if( ipha.eq.3 ) phase0=phase0+20*pi/180.0
|
||||||
|
|
||||||
if( nmatchedfilter .eq. 0 ) then
|
! Remove phase error - want constellation rotated so that sample points lie on I/Q axes
|
||||||
|
cfac=cmplx(cos(phase0),sin(phase0))
|
||||||
|
c=c*conjg(cfac)
|
||||||
|
|
||||||
|
if( nmatchedfilter .eq. 0 ) then
|
||||||
! sample to get softsamples
|
! sample to get softsamples
|
||||||
do i=1, 16
|
do i=1, 16
|
||||||
softbits(2*i-1)=imag(c(1+(i-1)*12))
|
softbits(2*i-1)=imag(c(1+(i-1)*12))
|
||||||
softbits(2*i)=real(c(7+(i-1)*12))
|
softbits(2*i)=real(c(7+(i-1)*12))
|
||||||
enddo
|
enddo
|
||||||
else
|
else
|
||||||
! matched filter -
|
! matched filter -
|
||||||
softbits(1)=sum(imag(c(1:6))*pp(7:12))+sum(imag(c(NSPM-5:NSPM))*pp(1:6))
|
softbits(1)=sum(imag(c(1:6))*pp(7:12))+sum(imag(c(NSPM-5:NSPM))*pp(1:6))
|
||||||
softbits(2)=sum(real(c(1:12))*pp)
|
softbits(2)=sum(real(c(1:12))*pp)
|
||||||
do i=2,16
|
do i=2,16
|
||||||
softbits(2*i-1)=sum(imag(c(1+(i-1)*12-6:1+(i-1)*12+5))*pp)
|
softbits(2*i-1)=sum(imag(c(1+(i-1)*12-6:1+(i-1)*12+5))*pp)
|
||||||
softbits(2*i)=sum(real(c(7+(i-1)*12-6:7+(i-1)*12+5))*pp)
|
softbits(2*i)=sum(real(c(7+(i-1)*12-6:7+(i-1)*12+5))*pp)
|
||||||
enddo
|
enddo
|
||||||
endif
|
endif
|
||||||
|
|
||||||
! sync word hard error weight is a good discriminator for
|
! sync word hard error weight is a good discriminator for
|
||||||
! frames that have reasonable probability of decoding
|
! frames that have reasonable probability of decoding
|
||||||
hardbits=0
|
hardbits=0
|
||||||
do i=1, 32
|
do i=1, 32
|
||||||
if( softbits(i) .ge. 0.0 ) then
|
if( softbits(i) .ge. 0.0 ) then
|
||||||
hardbits(i)=1
|
hardbits(i)=1
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
nbadsync1=(8-sum( (2*hardbits(1:8)-1)*s8r ) )/2
|
nbadsync1=(8-sum( (2*hardbits(1:8)-1)*s8r ) )/2
|
||||||
nbadsync=nbadsync1
|
nbadsync=nbadsync1
|
||||||
if( nbadsync .gt. 3 ) cycle
|
if( nbadsync .gt. 3 ) cycle
|
||||||
|
|
||||||
! normalize the softsymbols before submitting to decoder
|
! normalize the softsymbols before submitting to decoder
|
||||||
sav=sum(softbits)/32
|
sav=sum(softbits)/32
|
||||||
s2av=sum(softbits*softbits)/32
|
s2av=sum(softbits*softbits)/32
|
||||||
ssig=sqrt(s2av-sav*sav)
|
ssig=sqrt(s2av-sav*sav)
|
||||||
softbits=softbits/ssig
|
softbits=softbits/ssig
|
||||||
|
|
||||||
if( qsocontext ) then
|
if( qsocontext ) then
|
||||||
! search 32 likely messages only, using correlation discrepancy
|
! search 32 likely messages only, using correlation discrepancy
|
||||||
cd=1e6
|
cd=1e6
|
||||||
ihammd=99
|
ihammd=99
|
||||||
do i=0,31
|
do i=0,31
|
||||||
ncw=ig24(likelymessages(i))
|
ncw=ig24(likelymessages(i))
|
||||||
cd(i)=0.0
|
cd(i)=0.0
|
||||||
ihammd(i)=0
|
ihammd(i)=0
|
||||||
do ii=1,24
|
do ii=1,24
|
||||||
ib=iand(1,ishft(ncw,1-ii))
|
ib=iand(1,ishft(ncw,1-ii))
|
||||||
ib=2*ib-1
|
ib=2*ib-1
|
||||||
if( ib*softbits(ii+8) .lt. 0 ) cd(i)=cd(i)+abs(softbits(ii+8))
|
if( ib*softbits(ii+8) .lt. 0 ) cd(i)=cd(i)+abs(softbits(ii+8))
|
||||||
if( ib*(2*hardbits(ii+8)-1) .lt. 0 ) ihammd(i)=ihammd(i)+1
|
if( ib*(2*hardbits(ii+8)-1) .lt. 0 ) ihammd(i)=ihammd(i)+1
|
||||||
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
else
|
||||||
else
|
|
||||||
! exhaustive search decoder, using correlation discrepancy
|
! exhaustive search decoder, using correlation discrepancy
|
||||||
cd=1e6
|
cd=1e6
|
||||||
ihammd=99
|
ihammd=99
|
||||||
do i=0,4096-1
|
do i=0,4096-1
|
||||||
ncw=ig24(i)
|
ncw=ig24(i)
|
||||||
cd(i)=0.0
|
cd(i)=0.0
|
||||||
ihammd(i)=0
|
ihammd(i)=0
|
||||||
do ii=1,24
|
do ii=1,24
|
||||||
ib=iand(1,ishft(ncw,1-ii))
|
ib=iand(1,ishft(ncw,1-ii))
|
||||||
ib=2*ib-1
|
ib=2*ib-1
|
||||||
if( ib*softbits(ii+8) .lt. 0 ) cd(i)=cd(i)+abs(softbits(ii+8))
|
if( ib*softbits(ii+8) .lt. 0 ) cd(i)=cd(i)+abs(softbits(ii+8))
|
||||||
if( ib*(2*hardbits(ii+8)-1) .lt. 0 ) ihammd(i)=ihammd(i)+1
|
if( ib*(2*hardbits(ii+8)-1) .lt. 0 ) ihammd(i)=ihammd(i)+1
|
||||||
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
cdm=minval(cd)
|
|
||||||
iloc=minloc(cd)
|
|
||||||
imsg=iloc(1)-1
|
|
||||||
cd(imsg)=1e6
|
|
||||||
cdm2=minval(cd)
|
|
||||||
iloc=minloc(cd)
|
|
||||||
imsg2=iloc(1)-1
|
|
||||||
cdrat=cdm2/(cdm+0.001)
|
|
||||||
! if( cdrat .gt. cdratbest ) then
|
|
||||||
if( cdm .lt. cdbest ) then
|
|
||||||
cdratbest = cdrat
|
|
||||||
cdbest = cdm
|
|
||||||
imsgbest = imsg
|
|
||||||
iavbest = iav
|
|
||||||
ipbest = ip
|
|
||||||
ipkbest = ipk
|
|
||||||
idfbest = idf
|
|
||||||
idbest = id
|
|
||||||
nbadsyncbest = nbadsync
|
|
||||||
if( ( ihammd(imsgbest)+nbadsyncbest .le. 4 ) .and. ( (cdratbest .gt. 100.0) .and. (cdbest .le. 0.05) ) ) goto 999
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
cdm=minval(cd)
|
||||||
|
iloc=minloc(cd)
|
||||||
|
imsg=iloc(1)-1
|
||||||
|
cd(imsg)=1e6
|
||||||
|
cdm2=minval(cd)
|
||||||
|
iloc=minloc(cd)
|
||||||
|
imsg2=iloc(1)-1
|
||||||
|
cdrat=cdm2/(cdm+0.001)
|
||||||
|
! if( cdrat .gt. cdratbest ) then
|
||||||
|
if( cdm .lt. cdbest ) then
|
||||||
|
cdratbest = cdrat
|
||||||
|
cdbest = cdm
|
||||||
|
imsgbest = imsg
|
||||||
|
iavbest = iav
|
||||||
|
ipbest = ip
|
||||||
|
ipkbest = ipk
|
||||||
|
idfbest = idf
|
||||||
|
idbest = id
|
||||||
|
iphabest = ipha
|
||||||
|
nbadsyncbest = nbadsync
|
||||||
|
if( ( ihammd(imsgbest)+nbadsyncbest .le. 4 ) .and. ( (cdratbest .gt. 100.0) .and. (cdbest .le. 0.05) ) ) goto 999
|
||||||
|
endif
|
||||||
|
enddo ! phase loop
|
||||||
enddo ! frame averaging loop
|
enddo ! frame averaging loop
|
||||||
enddo ! frequency dithering loop
|
enddo ! frequency dithering loop
|
||||||
enddo ! sample-time dither loop
|
enddo ! sample-time dither loop
|
||||||
@ -441,9 +446,9 @@ subroutine detectmsk32(cbig,n,lines,nmessages,nutc)
|
|||||||
|
|
||||||
! write(*,1022) nutc,ipbest,times(ipbest),snrs(ipbest),fest,nrxrpt,nrxhash, &
|
! write(*,1022) nutc,ipbest,times(ipbest),snrs(ipbest),fest,nrxrpt,nrxhash, &
|
||||||
! rpt(nrxrpt),imessage,ig24(imessage),ihammd(imsgbest), &
|
! rpt(nrxrpt),imessage,ig24(imessage),ihammd(imsgbest), &
|
||||||
! cdbest,cdratbest,nbadsyncbest,ipkbest,idbest,idfbest,iavbest
|
! cdbest,cdratbest,nbadsyncbest,ipkbest,idbest,idfbest,iavbest,iphabest
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
!1022 format(i4.4,2x,i4,f8.3,f8.2,f8.2,i6,i6,a6,i8,i10,i4,f8.2,f8.2,i5,i5,i5,i5,i5)
|
!1022 format(i4.4,2x,i4,f8.3,f8.2,f8.2,i6,i6,a6,i8,i10,i4,f8.2,f8.2,i5,i5,i5,i5,i5,i5)
|
||||||
return
|
return
|
||||||
end subroutine detectmsk32
|
end subroutine detectmsk32
|
||||||
|
Loading…
x
Reference in New Issue
Block a user