mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-06-24 14:15:16 -04:00
Implement Nico's "deep likelihood" to replace iaptype=4 and 75-bit APmask.
This commit is contained in:
parent
de468e071a
commit
9c51e93f06
@ -58,6 +58,8 @@ contains
|
|||||||
integer apsym0(58),aph10(10)
|
integer apsym0(58),aph10(10)
|
||||||
integer apmask1(78),apsymbols1(78)
|
integer apmask1(78),apsymbols1(78)
|
||||||
integer apmask(13),apsymbols(13)
|
integer apmask(13),apsymbols(13)
|
||||||
|
integer dgen(13)
|
||||||
|
integer codewords(63,64)
|
||||||
logical lapcqonly,unpk77_success
|
logical lapcqonly,unpk77_success
|
||||||
complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s
|
complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s
|
||||||
complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s
|
complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s
|
||||||
@ -88,7 +90,6 @@ contains
|
|||||||
this%callback => callback
|
this%callback => callback
|
||||||
if(nutc.eq.-999) print*,lapdx,nfa,nfb,nfqso !Silence warning
|
if(nutc.eq.-999) print*,lapdx,nfa,nfb,nfqso !Silence warning
|
||||||
nFadingModel=1
|
nFadingModel=1
|
||||||
! call qra_params(ndepth,maxaptype,idfmax,idtmax,ibwmin,ibwmax,maxdist)
|
|
||||||
call timer('sync_q65',0)
|
call timer('sync_q65',0)
|
||||||
call sync_q65(iwave,ntrperiod*12000,mode65,nsps,nfqso,ntol,xdt,f0, &
|
call sync_q65(iwave,ntrperiod*12000,mode65,nsps,nfqso,ntol,xdt,f0, &
|
||||||
snr1,width)
|
snr1,width)
|
||||||
@ -135,17 +136,26 @@ contains
|
|||||||
1060 format(13b6.6)
|
1060 format(13b6.6)
|
||||||
write(c78,1050) apsymbols1
|
write(c78,1050) apsymbols1
|
||||||
read(c78,1060) apsymbols
|
read(c78,1060) apsymbols
|
||||||
|
if(iaptype.eq.4) then
|
||||||
|
do j=1,3
|
||||||
|
ng15=32401+j
|
||||||
|
write(c78(60:74),'(b15.15)') ng15
|
||||||
|
read(c78,1060) dgen
|
||||||
|
call q65_enc(dgen,codewords(1,j))
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
call timer('q65loops',0)
|
call timer('q65loops',0)
|
||||||
call q65_loops(c00,nutc,npts/2,nsps/2,nmode,mode65,nsubmode, &
|
call q65_loops(c00,nutc,npts/2,nsps/2,nmode,mode65,nsubmode, &
|
||||||
nFadingModel,ndepth,jpk0,xdt,f0,width,iaptype,apmask,apsymbols, &
|
nFadingModel,ndepth,jpk0,xdt,f0,width,iaptype,apmask,apsymbols, &
|
||||||
snr1,xdt1,f1,snr2,irc,dat4)
|
codewords,snr1,xdt1,f1,snr2,irc,dat4)
|
||||||
call timer('q65loops',1)
|
call timer('q65loops',1)
|
||||||
snr2=snr2 + db(6912.0/nsps)
|
snr2=snr2 + db(6912.0/nsps)
|
||||||
if(irc.ge.0) exit
|
if(irc.ge.0) exit
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
100 decoded=' '
|
100 decoded=' '
|
||||||
|
! if(irc.lt.0 .and.iaptype.eq.4) print*,'AAA',irc,iaptype
|
||||||
if(irc.ge.0) then
|
if(irc.ge.0) then
|
||||||
!###
|
!###
|
||||||
navg=irc/100
|
navg=irc/100
|
||||||
|
@ -149,8 +149,8 @@ subroutine q65_ap(nQSOprogress,ipass,ncontest,lapcqonly,iaptype, &
|
|||||||
apmask(1:78)=1 !MyCall, HisCall, RRR|73|RR73
|
apmask(1:78)=1 !MyCall, HisCall, RRR|73|RR73
|
||||||
apmask(72:74)=0 !Check for <blank>, RRR, RR73, 73
|
apmask(72:74)=0 !Check for <blank>, RRR, RR73, 73
|
||||||
apsymbols(1:58)=apsym0
|
apsymbols(1:58)=apsym0
|
||||||
if(iaptype.eq.4) apsymbols(59:77)=mrrr
|
if(iaptype.eq.4) apsymbols(59:77)=mrrr
|
||||||
if(iaptype.eq.5) apsymbols(59:77)=m73
|
if(iaptype.eq.5) apsymbols(59:77)=m73
|
||||||
if(iaptype.eq.6) apsymbols(59:77)=mrr73
|
if(iaptype.eq.6) apsymbols(59:77)=mrr73
|
||||||
else if(ncontest.eq.7.and.iaptype.eq.4) then ! Hound listens for MyCall RR73;...
|
else if(ncontest.eq.7.and.iaptype.eq.4) then ! Hound listens for MyCall RR73;...
|
||||||
apmask(1:28)=1
|
apmask(1:28)=1
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
subroutine q65_loops(c00,nutc,npts2,nsps,mode,mode64,nsubmode,nFadingModel, &
|
subroutine q65_loops(c00,nutc,npts2,nsps,mode,mode64,nsubmode,nFadingModel, &
|
||||||
ndepth,jpk0,xdt0,f0,width,iaptype,APmask,APsymbols,snr1,xdt1,f1, &
|
ndepth,jpk0,xdt0,f0,width,iaptype,APmask,APsymbols,codewords,snr1, &
|
||||||
snr2,irc,dat4)
|
xdt1,f1,snr2,irc,dat4)
|
||||||
|
|
||||||
use packjt77
|
use packjt77
|
||||||
use timer_module, only: timer
|
use timer_module, only: timer
|
||||||
@ -16,6 +16,7 @@ subroutine q65_loops(c00,nutc,npts2,nsps,mode,mode64,nsubmode,nFadingModel, &
|
|||||||
logical unpk77_success
|
logical unpk77_success
|
||||||
integer APmask(13)
|
integer APmask(13)
|
||||||
integer APsymbols(13)
|
integer APsymbols(13)
|
||||||
|
integer codewords(63,64)
|
||||||
integer dat4(13) !Decoded message (as 13 six-bit integers)
|
integer dat4(13) !Decoded message (as 13 six-bit integers)
|
||||||
integer nap(0:11) !AP return codes
|
integer nap(0:11) !AP return codes
|
||||||
data nap/0,2,3,2,3,4,2,3,6,4,6,6/,nsave/0/
|
data nap/0,2,3,2,3,4,2,3,6,4,6,6/,nsave/0/
|
||||||
@ -86,10 +87,15 @@ subroutine q65_loops(c00,nutc,npts2,nsps,mode,mode64,nsubmode,nFadingModel, &
|
|||||||
call timer('q65_intr',0)
|
call timer('q65_intr',0)
|
||||||
call q65_intrinsics_ff(s3,nsubmode,b90,nFadingModel,s3prob)
|
call q65_intrinsics_ff(s3,nsubmode,b90,nFadingModel,s3prob)
|
||||||
call timer('q65_intr',1)
|
call timer('q65_intr',1)
|
||||||
|
if(iaptype.eq.4) then
|
||||||
call timer('q65_dec ',0)
|
call timer('q65_apli',0)
|
||||||
call q65_dec(s3,s3prob,APmask,APsymbols,esnodb,dat4,irc)
|
call q65_dec_fullaplist(s3,s3prob,codewords,3,esnodb,dat4,irc)
|
||||||
call timer('q65_dec ',1)
|
call timer('q65_apli',1)
|
||||||
|
else
|
||||||
|
call timer('q65_dec ',0)
|
||||||
|
call q65_dec(s3,s3prob,APmask,APsymbols,esnodb,dat4,irc)
|
||||||
|
call timer('q65_dec ',1)
|
||||||
|
endif
|
||||||
if(irc.ge.0) go to 100
|
if(irc.ge.0) go to 100
|
||||||
! irc > 0 ==> number of iterations required to decode
|
! irc > 0 ==> number of iterations required to decode
|
||||||
! -1 = invalid params
|
! -1 = invalid params
|
||||||
|
@ -80,11 +80,12 @@ void q65_dec_(float s3[], float s3prob[], int APmask[], int APsymbols[],
|
|||||||
float* esnodb0, int xdec[], int* rc0)
|
float* esnodb0, int xdec[], int* rc0)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Input: s3prob[LL,NN] Symbol-value intrinsic probabilities
|
/* Input: s3[LL,NN] Symbol spectra
|
||||||
|
* s3prob[LL,NN] Symbol-value intrinsic probabilities
|
||||||
* APmask[13] AP information to be used in decoding
|
* APmask[13] AP information to be used in decoding
|
||||||
* APsymbols[13] Available AP informtion
|
* APsymbols[13] Available AP informtion
|
||||||
* Output:
|
* Output:
|
||||||
* esnodb0 Estimated Es/No in dB
|
* esnodb0 Estimated Es/No (dB)
|
||||||
* xdec[13] Decoded 78-bit message as 13 six-bit integers
|
* xdec[13] Decoded 78-bit message as 13 six-bit integers
|
||||||
* rc0 Return code from q65_decode()
|
* rc0 Return code from q65_decode()
|
||||||
*/
|
*/
|
||||||
@ -108,3 +109,37 @@ void q65_dec_(float s3[], float s3prob[], int APmask[], int APsymbols[],
|
|||||||
}
|
}
|
||||||
*esnodb0 = esnodb;
|
*esnodb0 = esnodb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void q65_dec_fullaplist_(float s3[], float s3prob[], int codewords[],
|
||||||
|
int* ncw, float* esnodb0, int xdec[], int* rc0)
|
||||||
|
{
|
||||||
|
/* Input: s3[LL,NN] Symbol spectra
|
||||||
|
* s3prob[LL,NN] Symbol-value intrinsic probabilities
|
||||||
|
* codewords[63,ncw] Full codewords to search for
|
||||||
|
* ncw Number of codewords
|
||||||
|
* Output:
|
||||||
|
* esnodb0 Estimated Es/No (dB)
|
||||||
|
* xdec[13] Decoded 78-bit message as 13 six-bit integers
|
||||||
|
* rc0 Return code from q65_decode()
|
||||||
|
*/
|
||||||
|
|
||||||
|
int rc;
|
||||||
|
int ydec[63];
|
||||||
|
float esnodb;
|
||||||
|
|
||||||
|
rc = q65_decode_fullaplist(&codec,ydec,xdec,s3prob,codewords,*ncw);
|
||||||
|
*rc0=rc;
|
||||||
|
|
||||||
|
// rc = -1: Invalid params
|
||||||
|
// rc = -2: Decode failed
|
||||||
|
// rc = -3: CRC mismatch
|
||||||
|
*esnodb0 = 0.0; //Default Es/No for a failed decode
|
||||||
|
if(rc<0) return;
|
||||||
|
|
||||||
|
rc = q65_esnodb_fastfading(&codec,&esnodb,ydec,s3);
|
||||||
|
if(rc<0) {
|
||||||
|
printf("error in q65_esnodb_fastfading()\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
*esnodb0 = esnodb;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user