From fd0ad33028b82828ac18390538d9f4141e41b9b5 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 7 Jul 2018 10:35:59 -0500 Subject: [PATCH] MSK144: Wholesale changeover to (128,90) code with 77-bit messages. Compiles and doesn't crash, but communication between two instances has not been tested. --- CMakeLists.txt | 4 +-- lib/encode128_90.f90 | 58 ------------------------------------- lib/ft8/ldpcsim174_91.f90 | 20 ++++++------- lib/genmsk_128_90.f90 | 2 +- lib/msk144code.f90 | 6 ++-- lib/msk144decodeframe.f90 | 19 ++++++------ lib/msk144signalquality.f90 | 4 +-- lib/msk144sim.f90 | 5 ++-- lib/mskrtd.f90 | 4 +-- mainwindow.cpp | 6 ++-- 10 files changed, 35 insertions(+), 93 deletions(-) delete mode 100644 lib/encode128_90.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index bfcd3d39b..9c018d32a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -414,7 +414,7 @@ set (wsjt_FSRCS lib/encode4.f90 lib/encode_msk40.f90 lib/encode_msk144.f90 - lib/encode128_90.f90 + lib/encode_128_90.f90 lib/fsk4hf/encode120.f90 lib/fsk4hf/encode168.f90 lib/ft8/encode174.f90 @@ -474,7 +474,7 @@ set (wsjt_FSRCS lib/fsk4hf/genfsk4hf.f90 lib/ft8/genft8.f90 lib/ft8/genft8_174_91.f90 - lib/genmsk144.f90 + lib/genmsk_128_90.f90 lib/genmsk40.f90 lib/fsk4hf/genmskhf.f90 lib/fsk4hf/genwsprlf.f90 diff --git a/lib/encode128_90.f90 b/lib/encode128_90.f90 deleted file mode 100644 index 7377370dc..000000000 --- a/lib/encode128_90.f90 +++ /dev/null @@ -1,58 +0,0 @@ -subroutine encode128_90(message77,codeword) -! -! Add a 13-bit CRC to a 77-bit message and return a 128-bit codeword -! -use, intrinsic :: iso_c_binding -use iso_c_binding, only: c_loc,c_size_t -use crc - -integer, parameter:: N=128, K=90, M=N-K -character*90 tmpchar -integer*1 codeword(N) -integer*1 gen(M,K) -integer*1 message77(77),message(K) -integer*1 pchecks(M) -integer*1, target :: i1MsgBytes(12) -include "ldpc_128_90_b_generator.f90" -logical first -data first/.true./ -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,23 - read(g(i)(j:j),"(Z1)") istr - ibmax=4 - if(j.eq.23) ibmax=2 - do jj=1, ibmax - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo -first=.false. -endif - -! Add 13 bit CRC to form 90-bit message+CRC13 -write(tmpchar,'(77i1)') message77 -tmpchar(78:80)='000' -i1MsgBytes=0 -read(tmpchar,'(10b8)') i1MsgBytes(1:10) -ncrc13 = crc13 (c_loc (i1MsgBytes), 12) -write(tmpchar(78:90),'(b13)') ncrc13 -read(tmpchar,'(90i1)') message - -do i=1,M - nsum=0 - do j=1,K - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) -enddo - -codeword(1:K)=message -codeword(K+1:N)=pchecks - -return -end subroutine encode128_90 diff --git a/lib/ft8/ldpcsim174_91.f90 b/lib/ft8/ldpcsim174_91.f90 index 7410d7363..d157cd6d1 100644 --- a/lib/ft8/ldpcsim174_91.f90 +++ b/lib/ft8/ldpcsim174_91.f90 @@ -1,10 +1,11 @@ program ldpcsim174_91 ! End to end test of the (174,91)/crc14 encoder and decoder. use crc -use packjt +use packjt77 integer, parameter:: N=174, K=91, M=N-K -character*22 msg,msgsent,msgreceived +character*37 msg,msgsent,msgreceived +character*77 c77 character*8 arg character*6 grid character*96 tmpchar @@ -12,7 +13,6 @@ integer*1, allocatable :: codeword(:), decoded(:), message(:) integer*1 msgbits(77) integer*1 message77(77) integer*1 apmask(N), cw(N) -integer*4 i4Msg6BitWords(13) integer nerrtot(0:N),nerrdec(0:N) real*8, allocatable :: rxdata(:) real, allocatable :: llr(:) @@ -48,19 +48,17 @@ allocate ( rxdata(N), llr(N) ) ! msg="K1JT K9AN EN50" msg="G4WJS K9AN EN50" - call packmsg(msg,i4Msg6BitWords,itype,.false.) !Pack into 12 6-bit bytes - call unpackmsg(i4Msg6BitWords,msgsent,.false.,grid) !Unpack to get msgsent + i3=0 + n3=1 + call pack77(msg,i3,n3,c77) !Pack into 12 6-bit bytes + call unpack77(c77,msgsent) !Unpack to get msgsent write(*,*) "message sent ",msgsent - tmpchar=' ' - write(tmpchar,'(12b6.6)') i4Msg6BitWords(1:12) - tmpchar(73:77)='00000' !i5bit - read(tmpchar,'(77i1)') msgbits(1:77) + read(c77,'(77i1)') msgbits(1:77) write(*,*) 'message' - write(*,'(28i1,1x,28i1,1x,16i1,1x,5i1)') msgbits + write(*,'(77i1)') c77 -! msgbits is the 77-bit message, codeword is 174 bits call encode174_91(msgbits,codeword) call init_random_seed() diff --git a/lib/genmsk_128_90.f90 b/lib/genmsk_128_90.f90 index 8e6e4ba20..6b0ce8305 100644 --- a/lib/genmsk_128_90.f90 +++ b/lib/genmsk_128_90.f90 @@ -77,7 +77,7 @@ subroutine genmsk_128_90(msg0,mygrid,ichk,bcontest,msgsent,i4tone,itype) call pack77(message,i3,n3,c77) call unpack77(c77,msgsent) !Unpack to get msgsent if(ichk.eq.1) go to 999 - read(c77,"77i1") msgbits + read(c77,"(77i1)") msgbits call encode_128_90(msgbits,codeword) !Create 144-bit channel vector: diff --git a/lib/msk144code.f90 b/lib/msk144code.f90 index f49bebcae..e6860edcd 100644 --- a/lib/msk144code.f90 +++ b/lib/msk144code.f90 @@ -4,7 +4,7 @@ program msk144code ! LDPC encoding, and other necessary details of the MSK144 protocol. use packjt - character msg*22,msgsent*22,decoded,bad*1,msgtype*13,mygrid*6 + character msg*37,msgsent*37,decoded,bad*1,msgtype*13,mygrid*6 integer*4 i4tone(144) logical*1 bcontest include 'testmsg.f90' @@ -43,7 +43,7 @@ program msk144code bcontest=.false. if(msg(i1:i1+1).eq.'R ') bcontest=.true. ichk=0 - call genmsk144(msg,mygrid,ichk,bcontest,msgsent,i4tone,itype) + call genmsk_128_90(msg,mygrid,ichk,bcontest,msgsent,i4tone,itype) msgtype="" if(itype.eq.1) msgtype="Std Msg" @@ -57,7 +57,7 @@ program msk144code bad=" " if(msgsent.ne.msg) bad="*" write(*,1020) imsg,msg,msgsent,bad,itype,msgtype -1020 format(i2,'.',2x,a22,2x,a22,3x,a1,i3,": ",a13) +1020 format(i2,'.',2x,a37,2x,a37,3x,a1,i3,": ",a13) enddo if(nmsg.eq.1) then diff --git a/lib/msk144decodeframe.f90 b/lib/msk144decodeframe.f90 index 5d5e15550..20a69f552 100644 --- a/lib/msk144decodeframe.f90 +++ b/lib/msk144decodeframe.f90 @@ -1,13 +1,14 @@ subroutine msk144decodeframe(c,softbits,msgreceived,nsuccess,recent_calls,nrecent) ! use timer_module, only: timer - + use packjt77 parameter (NSPM=864) - character*22 msgreceived + character*37 msgreceived character*12 recent_calls(nrecent) + character*77 c77 complex cb(42) complex cfac,cca,ccb complex c(NSPM) - integer*1 decoded(80) + integer*1 decoded77(77),apmask(128),cw(128) integer s8(8),hardbits(144) real*8 dt, fs, pi, twopi real cbi(42),cbq(42) @@ -94,13 +95,13 @@ subroutine msk144decodeframe(c,softbits,msgreceived,nsuccess,recent_calls,nrecen max_iterations=10 ! call timer('bpdec144 ',0) - call bpdecode144(llr,max_iterations,decoded,niterations) + apmask=0 + call bpdecode128_90(llr,apmask,max_iterations,decoded77,cw,nharderror,niterations) ! call timer('bpdec144 ',1) - if( niterations .ge. 0.0 ) then - call extractmessage144(decoded,msgreceived,nhashflag,recent_calls,nrecent) - if( nhashflag .gt. 0 ) then !Hash codes match, so print it - nsuccess=1 - endif + if( nharderror .ge. 0.0 ) then + nsuccess=1 + write(c77,'(77i1)') decoded77 + call unpack77(c77,msgreceived) endif return diff --git a/lib/msk144signalquality.f90 b/lib/msk144signalquality.f90 index 24a146c63..d5aa000f5 100644 --- a/lib/msk144signalquality.f90 +++ b/lib/msk144signalquality.f90 @@ -1,7 +1,7 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, & btrain,datadir,nbiterrors,eyeopening,pcoeffs) - character*22 msg,msgsent + character*37 msg,msgsent character*12 dxcall character*12 training_dxcall character*12 trained_dxcall @@ -94,7 +94,7 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, & mygrid="EN50" ichk=0 bcontest=.false. - call genmsk144(msg,mygrid,ichk,bcontest,msgsent,i4tone,itype) + call genmsk_128_90(msg,mygrid,ichk,bcontest,msgsent,i4tone,itype) ! reconstruct message bits from tones msgbits(1)=0 diff --git a/lib/msk144sim.f90 b/lib/msk144sim.f90 index 28f17e611..485de9a77 100644 --- a/lib/msk144sim.f90 +++ b/lib/msk144sim.f90 @@ -5,7 +5,8 @@ program msk144sim real pings(0:NMAX-1) real waveform(0:NMAX-1) character*6 mygrid - character arg*8,msg*22,msgsent*22,fname*40 + character arg*8,msg*37,msgsent*37,fname*40 + character*77 c77 real wave(0:NMAX-1) !Simulated received waveform real*8 twopi,freq,phi,dphi0,dphi1,dphi type(hdr) h !Header for .wav file @@ -40,7 +41,7 @@ program msk144sim bcontest=.false. if(msg(i1:i1+1).eq.'R ') bcontest=.true. ichk=0 - call genmsk144(msg,mygrid,ichk,bcontest,msgsent,itone,itype) + call genmsk_128_90(msg,mygrid,ichk,bcontest,msgsent,itone,itype) twopi=8.d0*atan(1.d0) nsym=144 diff --git a/lib/mskrtd.f90 b/lib/mskrtd.f90 index 5712c71ac..3d8db4dc4 100644 --- a/lib/mskrtd.f90 +++ b/lib/mskrtd.f90 @@ -13,8 +13,8 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, & parameter (NSHMEM=50) !Number of recent SWL messages to remember character*4 decsym !"&" for mskspd or "^" for long averages - character*22 msgreceived !Decoded message - character*22 msglast,msglastswl !Used for dupechecking + character*37 msgreceived !Decoded message + character*37 msglast,msglastswl !Used for dupechecking character*80 line !Formatted line with UTC dB T Freq Msg character*12 mycall,hiscall character*6 mygrid diff --git a/mainwindow.cpp b/mainwindow.cpp index 074581f08..6fee4c5a2 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -88,7 +88,7 @@ extern "C" { void gen9_(char* msg, int* ichk, char* msgsent, int itone[], int* itext, fortran_charlen_t, fortran_charlen_t); - void genmsk144_(char* msg, char* MyGrid, int* ichk, bool* bcontest, + void genmsk_128_90_(char* msg, char* MyGrid, int* ichk, bool* bcontest, char* msgsent, int itone[], int* itext, fortran_charlen_t, fortran_charlen_t, fortran_charlen_t); @@ -3472,8 +3472,8 @@ void MainWindow::guiUpdate() strncpy(MyCall, (m_config.my_callsign()+" ").toLatin1(),6); strncpy(MyGrid, (m_config.my_grid()+" ").toLatin1(),6); if(m_modeTx=="MSK144") { - genmsk144_(message, MyGrid, &ichk, &bcontest, msgsent, const_cast (itone), - &m_currentMessageType, 22, 6, 22); + genmsk_128_90_(message, MyGrid, &ichk, &bcontest, msgsent, const_cast (itone), + &m_currentMessageType, 37, 6, 37); if(m_restart) { int nsym=144; if(itone[40]==-40) nsym=40;