Pass hints to fst240sim, genfst240, and packjt77::pack77 on WSPR msgs

Due to  an ambiguity with  message encodings between 77-bit  QSO modes
and 50-bit  beacon modes with message  types 13.n3 4.0 and  0.6 a hint
needs to be  passed to ensure the right encoding  is emitted. The hint
only  effects  ambiguous messages,  others  will  be encoded  strictly
according to the message content.
This commit is contained in:
Bill Somerville 2020-07-17 19:09:21 +01:00
parent c21a60144a
commit cccb38dbef
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
4 changed files with 80 additions and 25 deletions

View File

@ -124,12 +124,14 @@ subroutine pack77(msg0,i3,n3,c77)
integer ntel(3) integer ntel(3)
msg=msg0 msg=msg0
if(i3.eq.0 .and. n3.eq.5) go to 5 i3_hint=i3
n3_hint=n3
i3=-1
n3=-1
if(i3_hint.eq.0 .and. n3_hint.eq.5) go to 5
! Convert msg to upper case; collapse multiple blanks; parse into words. ! Convert msg to upper case; collapse multiple blanks; parse into words.
call split77(msg,nwords,nw,w) call split77(msg,nwords,nw,w)
i3=-1
n3=-1
if(msg(1:3).eq.'CQ ' .or. msg(1:3).eq.'DE ' .or. msg(1:4).eq.'QRZ ') go to 100 if(msg(1:3).eq.'CQ ' .or. msg(1:3).eq.'DE ' .or. msg(1:4).eq.'QRZ ') go to 100
! Check 0.1 (DXpedition mode) ! Check 0.1 (DXpedition mode)
@ -160,7 +162,7 @@ subroutine pack77(msg0,i3,n3,c77)
go to 900 go to 900
endif endif
100 call pack77_06(nwords,w,i3,n3,c77) 100 call pack77_06(nwords,w,i3,n3,c77,i3_hint,n3_hint)
if(i3.ge.0) go to 900 if(i3.ge.0) go to 900
! Check Type 1 (Standard 77-bit message) or Type 2, with optional "/P" ! Check Type 1 (Standard 77-bit message) or Type 2, with optional "/P"
@ -414,7 +416,7 @@ subroutine unpack77(c77,nrx,msg,unpk77_success)
n28=n22+2063592 n28=n22+2063592
call unpack28(n28,call_1,unpk28_success) call unpack28(n28,call_1,unpk28_success)
if(.not.unpk28_success) unpk77_success=.false. if(.not.unpk28_success) unpk77_success=.false.
call to_grid6(igrid6,grid6) call to_grid(igrid6,grid6)
msg=trim(call_1)//' '//grid6 msg=trim(call_1)//' '//grid6
@ -938,7 +940,7 @@ subroutine pack77_03(nwords,w,i3,n3,c77)
end subroutine pack77_03 end subroutine pack77_03
subroutine pack77_06(nwords,w,i3,n3,c77) subroutine pack77_06(nwords,w,i3,n3,c77,i3_hint,n3_hint)
character*13 w(19) character*13 w(19)
character*77 c77 character*77 c77
@ -955,13 +957,14 @@ subroutine pack77_06(nwords,w,i3,n3,c77)
grid4(3:3).ge.'0' .and. grid4(3:3).le.'9' .and. & grid4(3:3).ge.'0' .and. grid4(3:3).le.'9' .and. &
grid4(4:4).ge.'0' .and. grid4(4:4).le.'9' grid4(4:4).ge.'0' .and. grid4(4:4).le.'9'
is_grid6(grid6)=len(trim(grid6)).eq.6 .and. & is_grid6(grid6)=(len(trim(grid6)).eq.6.or.len(trim(grid6)).eq.4).and. &
grid6(1:1).ge.'A' .and. grid6(1:1).le.'R' .and. & grid6(1:1).ge.'A' .and. grid6(1:1).le.'R' .and. &
grid6(2:2).ge.'A' .and. grid6(2:2).le.'R' .and. & grid6(2:2).ge.'A' .and. grid6(2:2).le.'R' .and. &
grid6(3:3).ge.'0' .and. grid6(3:3).le.'9' .and. & grid6(3:3).ge.'0' .and. grid6(3:3).le.'9' .and. &
grid6(4:4).ge.'0' .and. grid6(4:4).le.'9' .and. & grid6(4:4).ge.'0' .and. grid6(4:4).le.'9' .and. &
grid6(5:5).ge.'A' .and. grid6(5:5).le.'X' .and. & (len(trim(grid6)).eq.4.or. &
grid6(6:6).ge.'A' .and. grid6(6:6).le.'X' (grid6(5:5).ge.'A' .and. grid6(5:5).le.'X' .and. &
grid6(6:6).ge.'A' .and. grid6(6:6).le.'X'))
is_digit(c)=c.ge.'0' .and. c.le.'9' is_digit(c)=c.ge.'0' .and. c.le.'9'
@ -1033,8 +1036,13 @@ subroutine pack77_06(nwords,w,i3,n3,c77)
go to 900 go to 900
endif endif
if(nwords.eq.2 .and. m1.ge.5 .and. m1.le.12 .and. m2.le.6) then if(i3_hint.eq.0.and.n3_hint.eq.6.and.nwords.eq.2 .and. m1.ge.5 &
.and. m1.le.12 .and. m2.le.6) then
! WSPR Type 3 ! WSPR Type 3
!n3_hint=6 and i3_hint=0 is a hint that the caller wanted a
!50-bit encoding rather than the possible alternative n3=4 77-bit
!encoding
if(index(w(1),'<').lt.1 .or. index(w(1),'>').lt.1) go to 900 if(index(w(1),'<').lt.1 .or. index(w(1),'>').lt.1) go to 900
grid6=w(2)(1:6) grid6=w(2)(1:6)
if(.not.is_grid6(grid6)) go to 900 if(.not.is_grid6(grid6)) go to 900
@ -1042,13 +1050,17 @@ subroutine pack77_06(nwords,w,i3,n3,c77)
n3=6 n3=6
call pack28(w(1),n28) call pack28(w(1),n28)
n22=n28-2063592 n22=n28-2063592
k1=(ichar(grid6(1:1))-ichar('A'))*18*10*10*24*24 k1=(ichar(grid6(1:1))-ichar('A'))*18*10*10*25*25
k2=(ichar(grid6(2:2))-ichar('A'))*10*10*24*24 k2=(ichar(grid6(2:2))-ichar('A'))*10*10*25*25
k3=(ichar(grid6(3:3))-ichar('0'))*10*24*24 k3=(ichar(grid6(3:3))-ichar('0'))*10*25*25
k4=(ichar(grid6(4:4))-ichar('0'))*24*24 k4=(ichar(grid6(4:4))-ichar('0'))*25*25
k5=(ichar(grid6(5:5))-ichar('A'))*24 if (grid6(5:6).eq.' ') then
igrid6=k1+k2+k3+k4+24*25+24
else
k5=(ichar(grid6(5:5))-ichar('A'))*25
k6=(ichar(grid6(6:6))-ichar('A')) k6=(ichar(grid6(6:6))-ichar('A'))
igrid6=k1+k2+k3+k4+k5+k6 igrid6=k1+k2+k3+k4+k5+k6
endif
write(c77,1030) n22,igrid6,2,0,n3,i3 write(c77,1030) n22,igrid6,2,0,n3,i3
1030 format(b22.22,b25.25,b3.3,b21.21,2b3.3) 1030 format(b22.22,b25.25,b3.3,b21.21,2b3.3)
endif endif
@ -1523,4 +1535,31 @@ subroutine to_grid6(n,grid6)
return return
end subroutine to_grid6 end subroutine to_grid6
subroutine to_grid(n,grid6)
! 4-, or 6-character grid
character*6 grid6
j1=n/(18*10*10*25*25)
n=n-j1*18*10*10*25*25
j2=n/(10*10*25*25)
n=n-j2*10*10*25*25
j3=n/(10*25*25)
n=n-j3*10*25*25
j4=n/(25*25)
n=n-j4*25*25
j5=n/25
j6=n-j5*25
grid6=''
grid6(1:1)=char(j1+ichar('A'))
grid6(2:2)=char(j2+ichar('A'))
grid6(3:3)=char(j3+ichar('0'))
grid6(4:4)=char(j4+ichar('0'))
if (j5.ne.24.or.j6.ne.24) then
grid6(5:5)=char(j5+ichar('A'))
grid6(6:6)=char(j6+ichar('A'))
endif
return
end subroutine to_grid
end module packjt77 end module packjt77

View File

@ -6,6 +6,7 @@ program fst240sim
use packjt77 use packjt77
include 'fst240_params.f90' !Set various constants include 'fst240_params.f90' !Set various constants
type(hdr) h !Header for .wav file type(hdr) h !Header for .wav file
logical*1 wspr_hint
character arg*12,fname*17 character arg*12,fname*17
character msg37*37,msgsent37*37,c77*77 character msg37*37,msgsent37*37,c77*77
complex, allocatable :: c0(:) complex, allocatable :: c0(:)
@ -18,10 +19,11 @@ program fst240sim
! Get command-line argument(s) ! Get command-line argument(s)
nargs=iargc() nargs=iargc()
if(nargs.ne.9) then if(nargs.ne.10) then
print*,'Need 9 arguments, got ',nargs print*,'Need 10 arguments, got ',nargs
print*,'Usage: fst240sim "message" TRsec f0 DT h fdop del nfiles snr' print*,'Usage: fst240sim "message" TRsec f0 DT h fdop del nfiles snr W'
print*,'Examples: fst240sim "K1JT K9AN EN50" 60 1500 0.0 1 0.1 1.0 10 -15' print*,'Examples: fst240sim "K1JT K9AN EN50" 60 1500 0.0 1 0.1 1.0 10 -15 F'
print*,'W (T or F) argument is hint to encoder to use WSPR message when there is abiguity'
go to 999 go to 999
endif endif
call getarg(1,msg37) !Message to be transmitted call getarg(1,msg37) !Message to be transmitted
@ -41,6 +43,8 @@ program fst240sim
read(arg,*) nfiles !Number of files read(arg,*) nfiles !Number of files
call getarg(9,arg) call getarg(9,arg)
read(arg,*) snrdb !SNR_2500 read(arg,*) snrdb !SNR_2500
call getarg(10,arg)
read(arg,*) wspr_hint !0:break ties as 77-bit 1:break ties as 50-bit
nfiles=abs(nfiles) nfiles=abs(nfiles)
twopi=8.0*atan(1.0) twopi=8.0*atan(1.0)
@ -72,12 +76,18 @@ program fst240sim
sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb)
if(snrdb.gt.90.0) sig=1.0 if(snrdb.gt.90.0) sig=1.0
if(wspr_hint) then
i3=0
n3=6
else
i3=-1 i3=-1
n3=-1 n3=-1
endif
call pack77(msg37,i3,n3,c77) call pack77(msg37,i3,n3,c77)
if(i3.eq.0.and.n3.eq.6) iwspr=1
call genfst240(msg37,0,msgsent37,msgbits,itone,iwspr) call genfst240(msg37,0,msgsent37,msgbits,itone,iwspr)
write(*,*) write(*,*)
write(*,'(a9,a37,a7,i2)') 'Message: ',msgsent37,' iwspr:',iwspr write(*,'(a9,a37,a3,L2,a7,i2)') 'Message: ',msgsent37,'W:',wspr_hint,' iwspr:',iwspr
write(*,1000) f00,xdt,hmod,txt,snrdb write(*,1000) f00,xdt,hmod,txt,snrdb
1000 format('f0:',f9.3,' DT:',f6.2,' hmod:',i6,' TxT:',f6.1,' SNR:',f6.1) 1000 format('f0:',f9.3,' DT:',f6.2,' hmod:',i6,' TxT:',f6.1,' SNR:',f6.1)
write(*,*) write(*,*)

View File

@ -5,7 +5,8 @@ subroutine genfst240(msg0,ichk,msgsent,msgbits,i4tone,iwspr)
! - ichk if ichk=1, return only msgsent ! - ichk if ichk=1, return only msgsent
! - msgsent message as it will be decoded ! - msgsent message as it will be decoded
! - i4tone array of audio tone values, {0,1,2,3} ! - i4tone array of audio tone values, {0,1,2,3}
! - iwspr 0: (240,101)/crc24, 1: (240,74)/crc24 ! - iwspr in: 0: FST240 1: FST240W
! out 0: (240,101)/crc24, 1: (240,74)/crc24
! !
! Frame structure: ! Frame structure:
! s8 d30 s8 d30 s8 d30 s8 d30 s8 ! s8 d30 s8 d30 s8 d30 s8 d30 s8
@ -43,6 +44,10 @@ subroutine genfst240(msg0,ichk,msgsent,msgbits,i4tone,iwspr)
i3=-1 i3=-1
n3=-1 n3=-1
if(iwspr.eq.1) then
i3=0
n3=6
endif
call pack77(message,i3,n3,c77) call pack77(message,i3,n3,c77)
call unpack77(c77,0,msgsent,unpk77_success) !Unpack to get msgsent call unpack77(c77,0,msgsent,unpk77_success) !Unpack to get msgsent
msgbits=0 msgbits=0

View File

@ -3875,6 +3875,7 @@ void MainWindow::guiUpdate()
char fst240msgbits[101]; char fst240msgbits[101];
QString wmsg; QString wmsg;
if(m_mode=="FST240W") { if(m_mode=="FST240W") {
iwspr = 1;
wmsg=WSPR_message(); wmsg=WSPR_message();
ba=wmsg.toLatin1(); ba=wmsg.toLatin1();
ba2msg(ba,message); ba2msg(ba,message);