From 6483e80c351fc53b1024bf62070c4aec013c0b77 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 19 Oct 2018 19:42:31 -0500 Subject: [PATCH 1/3] Make msk144code work. Rename msk144d2 to msk144d and make it work too. --- CMakeLists.txt | 6 ++-- lib/msk144_testmsg.f90 | 47 +++++++++++++++++++++++++++ lib/msk144code.f90 | 73 +++++++++++++++++++++++++----------------- lib/msk144d2.f90 | 4 +-- 4 files changed, 94 insertions(+), 36 deletions(-) create mode 100644 lib/msk144_testmsg.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 33d59e642..29e90a2fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -496,7 +496,7 @@ set (wsjt_FSRCS lib/moondopjpl.f90 lib/morse.f90 lib/move.f90 - lib/msk144d2.f90 + lib/msk144d.f90 lib/msk40decodeframe.f90 lib/msk144decodeframe.f90 lib/msk144sd.f90 @@ -1255,8 +1255,8 @@ target_link_libraries (msk144sd wsjt_fort wsjt_cxx) add_executable (msk144sim lib/msk144sim.f90 wsjtx.rc) target_link_libraries (msk144sim wsjt_fort wsjt_cxx) -add_executable (msk144d2 lib/msk144d2.f90 wsjtx.rc) -target_link_libraries (msk144d2 wsjt_fort wsjt_cxx) +add_executable (msk144d lib/msk144d.f90 wsjtx.rc) +target_link_libraries (msk144d wsjt_fort wsjt_cxx) endif(WSJT_BUILD_UTILS) # build the main application diff --git a/lib/msk144_testmsg.f90 b/lib/msk144_testmsg.f90 new file mode 100644 index 000000000..e1cff1314 --- /dev/null +++ b/lib/msk144_testmsg.f90 @@ -0,0 +1,47 @@ + parameter (MAXTEST=75,NTEST=43) + character*37 testmsg(MAXTEST) + data testmsg(1:NTEST)/ & + "CQ K1ABC FN42", & + "K1ABC W9XYZ EN37", & + "W9XYZ K1ABC -11", & + "K1ABC W9XYZ R-09", & + "W9XYZ K1ABC RRR", & + "K1ABC W9XYZ 73", & + "K1ABC W9XYZ RR73", & + "CQ KH1/KH7Z", & + "CQ TEST K1ABC/R FN42", & + "K1ABC/R W9XYZ EN37", & + "W9XYZ K1ABC/R R FN42", & + "K1ABC/R W9XYZ RR73", & + "CQ TEST K1ABC FN42", & + "K1ABC/R W9XYZ/R R FN42", & + "CQ G4ABC/P IO91", & + "G4ABC/P PA9XYZ JO22", & + "PA9XYZ 590003 IO91NP", & + "G4ABC/P R 570007 JO22DB", & + "PA9XYZ G4ABC/P RR73", & + "CQ PJ4/K1ABC", & + "PJ4/K1ABC ", & + "W9XYZ -11", & + " W9XYZ R-09", & + " PJ4/K1ABC RRR", & + "PJ4/K1ABC 73", & + "CQ W9XYZ EN37", & + " YW18FIFA", & + " W9XYZ -11", & + "W9XYZ R-09", & + "YW18FIFA RRR", & + " YW18FIFA 73", & + "TNX BOB 73 GL", & + "CQ YW18FIFA", & + " KA1ABC", & + "KA1ABC -11", & + " KA1ABC R-17", & + " YW18FIFA RR73", & + " KA1ABC 73", & + "123456789ABCDEF012", & + " -03", & + " R+03", & + " RRR", & + " 73"/ + diff --git a/lib/msk144code.f90 b/lib/msk144code.f90 index d92fee082..6c8963d01 100644 --- a/lib/msk144code.f90 +++ b/lib/msk144code.f90 @@ -3,11 +3,11 @@ program msk144code ! Provides examples of message packing, bit and symbol ordering, ! LDPC encoding, and other necessary details of the MSK144 protocol. - use packjt - character msg*37,msgsent*37,decoded,bad*1,msgtype*13 + use packjt77 + character*77 c77 + character msg*37,msgsent*37,decoded,bad*1,msgtype*16 integer*4 i4tone(144) - logical*1 bcontest - include 'testmsg.f90' + include 'msk144_testmsg.f90' nargs=iargc() if(nargs.ne.1) then @@ -24,44 +24,57 @@ program msk144code call getarg(1,msg) nmsg=1 if(msg(1:2).eq."-t") then - testmsg(NTEST+1)=" -03" - testmsg(NTEST+2)=" R+03" - testmsg(NTEST+3)=" RRR" - testmsg(NTEST+4)=" 73" - testmsg(NTEST+5)="KA1ABC WB9XYZ R EN37" - nmsg=NTEST+5 + nmsg=NTEST endif write(*,1010) -1010 format(" Message Decoded Err? Type"/ & - 74("-")) +1010 format(4x,"Message",31x,"Decoded",29x,"Err i3.n3"/100("-")) + do imsg=1,nmsg if(nmsg.gt.1) msg=testmsg(imsg) call fmtmsg(msg,iz) !To upper case, collapse multiple blanks - i1=len(trim(msg))-5 - bcontest=.false. - if(msg(i1:i1+1).eq.'R ') bcontest=.true. - ichk=0 - call genmsk_128_90(msg,ichk,bcontest,msgsent,i4tone,itype) - + call genmsk_128_90(msg,ichk,msgsent,i4tone,itype) + i3=-1 + n3=-1 + call pack77(msg,i3,n3,c77) msgtype="" - if(itype.eq.1) msgtype="Std Msg" - if(itype.eq.2) msgtype="Type 1 prefix" - if(itype.eq.3) msgtype="Type 1 suffix" - if(itype.eq.4) msgtype="Type 2 prefix" - if(itype.eq.5) msgtype="Type 2 suffix" - if(itype.eq.6) msgtype="Free text" - if(itype.eq.7) msgtype="Hashed calls" - + if(i3.eq.0) then + if(n3.eq.0) msgtype="Free text" + if(n3.eq.1) msgtype="DXpedition mode" + if(n3.eq.2) msgtype="EU VHF Contest" + if(n3.eq.3) msgtype="ARRL Field Day" + if(n3.eq.4) msgtype="ARRL Field Day" + if(n3.eq.5) msgtype="Telemetry" + if(n3.ge.6) msgtype="Undefined type" + endif + if(i3.eq.1) msgtype="Standard msg" + if(i3.eq.2) msgtype="EU VHF Contest" + if(i3.eq.3) msgtype="ARRL RTTY Roundup" + if(i3.eq.4) msgtype="Nonstandard calls" + if(i3.ge.5) msgtype="Undefined msg type" + if(i3.ge.1) n3=-1 + if(i4tone(41).lt.0) then + msgtype="Sh msg" + i3=-1 + endif bad=" " - if(msgsent.ne.msg) bad="*" - write(*,1020) imsg,msg,msgsent,bad,itype,msgtype -1020 format(i2,'.',2x,a37,2x,a37,3x,a1,i3,": ",a13) + if(msg.ne.msgsent) bad="*" + if(i3.eq.0.and.n3.ge.0) then + write(*,1020) imsg,msg,msgsent,bad,i3,n3,msgtype +1020 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',i1,1x,a16) + elseif(i3.ge.1) then + write(*,1022) imsg,msg,msgsent,bad,i3,msgtype +1022 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',1x,1x,a16) + elseif(i3.lt.0) then + write(*,1024) imsg,msg,msgsent,bad,msgtype +1024 format(i2,'.',1x,a37,1x,a37,1x,a1,6x,a16) + endif + enddo if(nmsg.eq.1) then n=144 - if(msg(1:1).eq."<") n=40 + if(i4tone(41).lt.0) n=40 write(*,1030) i4tone(1:n) 1030 format(/'Channel symbols'/(72i1)) endif diff --git a/lib/msk144d2.f90 b/lib/msk144d2.f90 index 47eb43b68..ab8ae97f6 100644 --- a/lib/msk144d2.f90 +++ b/lib/msk144d2.f90 @@ -17,7 +17,6 @@ program msk144d2 logical :: display_help=.false. logical*1 bShMsgs - logical*1 bcontest logical*1 btrain logical*1 bswl @@ -47,7 +46,6 @@ program msk144d2 mygrid='EN50WC' hiscall='' bShMsgs=.false. - bcontest=.false. btrain=.false. bswl=.false. datadir='.' @@ -116,7 +114,7 @@ program msk144d2 tt=sum(float(abs(id2(i:i+7*512-1)))) if( tt .ne. 0.0 ) then call mskrtd(ichunk,nutc,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall,bShMsgs, & - bcontest,btrain,pcoeffs,bswl,datadir,line) + btrain,pcoeffs,bswl,datadir,line) if( index(line,"&") .ne. 0 .or. & index(line,"^") .ne. 0 .or. & index(line,"!") .ne. 0 .or. & From 17ed2428787d062794f06ad1251a5cda3c455ebf Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 19 Oct 2018 19:45:38 -0500 Subject: [PATCH 2/3] Minor tweak - make program name the same as file name. --- lib/ft8/ft8sim.f90 | 12 ++-- lib/msk144d2.f90 | 136 --------------------------------------------- 2 files changed, 6 insertions(+), 142 deletions(-) delete mode 100644 lib/msk144d2.f90 diff --git a/lib/ft8/ft8sim.f90 b/lib/ft8/ft8sim.f90 index b06a5ff75..84884c5e2 100644 --- a/lib/ft8/ft8sim.f90 +++ b/lib/ft8/ft8sim.f90 @@ -1,4 +1,4 @@ -program ft8sim2 +program ft8sim ! Generate simulated "type 2" ft8 files ! Output is saved to a *.wav file. @@ -21,10 +21,10 @@ program ft8sim2 ! Get command-line argument(s) nargs=iargc() if(nargs.ne.8) then - print*,'Usage: ft8sim2 "message" f0 DT fdop del width nfiles snr' - print*,'Examples: ft8sim2 "K1ABC W9XYZ EN37" 1500.0 0.0 0.1 1.0 0 10 -18' - print*,' ft8sim2 "WA9XYZ/R KA1ABC/R FN42" 1500.0 0.0 0.1 1.0 0 10 -18' - print*,' ft8sim2 "K1ABC RR73; W9XYZ -11" 300 0 0 0 25 1 -10' + print*,'Usage: ft8sim "message" f0 DT fdop del width nfiles snr' + print*,'Examples: ft8sim "K1ABC W9XYZ EN37" 1500.0 0.0 0.1 1.0 0 10 -18' + print*,' ft8sim "WA9XYZ/R KA1ABC/R FN42" 1500.0 0.0 0.1 1.0 0 10 -18' + print*,' ft8sim "K1ABC RR73; W9XYZ -11" 300 0 0 0 25 1 -10' go to 999 endif call getarg(1,msg37) !Message to be transmitted @@ -133,4 +133,4 @@ program ft8sim2 write(*,1110) ifile,xdt,f0,snrdb,fname 1110 format(i4,f7.2,f8.2,f7.1,2x,a17) enddo -999 end program ft8sim2 +999 end program ft8sim diff --git a/lib/msk144d2.f90 b/lib/msk144d2.f90 deleted file mode 100644 index ab8ae97f6..000000000 --- a/lib/msk144d2.f90 +++ /dev/null @@ -1,136 +0,0 @@ -program msk144d2 - - ! Test the msk144 decoder for WSJT-X - - use options - use timer_module, only: timer - use timer_impl, only: init_timer - use readwav - - character c - character*80 line - character*512 datadir - character*500 infile - character*12 mycall,hiscall - character*6 mygrid - character(len=500) optarg - - logical :: display_help=.false. - logical*1 bShMsgs - logical*1 btrain - logical*1 bswl - - type(wav_header) :: wav - - integer*2 id2(30*12000) - integer*2 ichunk(7*1024) - - real*8 pcoeffs(5) - - type (option) :: long_options(9) = [ & - option ('ndepth',.true.,'c','ndepth',''), & - option ('dxcall',.true.,'d','hiscall',''), & - option ('evemode',.true.,'e','Must be used with -s.',''), & - option ('frequency',.true.,'f','rxfreq',''), & - option ('help',.false.,'h','Display this help message',''), & - option ('mycall',.true.,'m','mycall',''), & - option ('nftol',.true.,'n','nftol',''), & - option ('rxequalize',.false.,'r','Rx Equalize',''), & - option ('short',.false.,'s','enable Sh','') & - ] - t0=0.0 - ndepth=3 - ntol=100 - nrxfreq=1500 - mycall='' - mygrid='EN50WC' - hiscall='' - bShMsgs=.false. - btrain=.false. - bswl=.false. - datadir='.' - pcoeffs=0.d0 - - do - call getopt('c:d:ef:hm:n:rs',long_options,c,optarg,narglen,nstat,noffset,nremain,.true.) - if( nstat .ne. 0 ) then - exit - end if - select case (c) - case ('c') - read (optarg(:narglen), *) ndepth - case ('d') - read (optarg(:narglen), *) hiscall - case ('e') - bswl=.true. - case ('f') - read (optarg(:narglen), *) nrxfreq - case ('h') - display_help = .true. - case ('m') - read (optarg(:narglen), *) mycall - case ('n') - read (optarg(:narglen), *) ntol - case ('r') - btrain=.true. - case ('s') - bShMsgs=.true. - end select - end do - - if(display_help .or. nstat.lt.0 .or. nremain.lt.1) then - print *, '' - print *, 'Usage: msk144d [OPTIONS] file1 [file2 ...]' - print *, '' - print *, ' msk144 decode pre-recorded .WAV file(s)' - print *, '' - print *, 'OPTIONS:' - do i = 1, size (long_options) - call long_options(i) % print (6) - end do - go to 999 - endif - - call init_timer ('timer.out') - call timer('msk144 ',0) - ndecoded=0 - do ifile=noffset+1,noffset+nremain - call get_command_argument(ifile,optarg,narglen) - infile=optarg(:narglen) - call timer('read ',0) - call wav%read (infile) - i1=index(infile,'.wav') - if( i1 .eq. 0 ) i1=index(infile,'.WAV') - read(infile(i1-6:i1-1),*,err=998) nutc - inquire(FILE=infile,SIZE=isize) - npts=min((isize-216)/2,360000) - read(unit=wav%lun) id2(1:npts) - close(unit=wav%lun) - call timer('read ',1) - - do i=1,npts-7*1024+1,7*512 - ichunk=id2(i:i+7*1024-1) - tsec=(i-1)/12000.0 - tt=sum(float(abs(id2(i:i+7*512-1)))) - if( tt .ne. 0.0 ) then - call mskrtd(ichunk,nutc,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall,bShMsgs, & - btrain,pcoeffs,bswl,datadir,line) - if( index(line,"&") .ne. 0 .or. & - index(line,"^") .ne. 0 .or. & - index(line,"!") .ne. 0 .or. & - index(line,"@") .ne. 0 ) then - write(*,*) line - endif - endif - enddo - enddo - - call timer('msk144 ',1) - call timer('msk144 ',101) - go to 999 - -998 print*,'Cannot read from file:' - print*,infile - -999 continue -end program msk144d2 From a69e765a0738e31cf005b5cca8b1e81e47756d04 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 19 Oct 2018 19:48:20 -0500 Subject: [PATCH 3/3] Forgot to add msk144d.f90. --- lib/msk144d.f90 | 136 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 lib/msk144d.f90 diff --git a/lib/msk144d.f90 b/lib/msk144d.f90 new file mode 100644 index 000000000..60c8b0c1d --- /dev/null +++ b/lib/msk144d.f90 @@ -0,0 +1,136 @@ +program msk144d + + ! Test the msk144 decoder for WSJT-X + + use options + use timer_module, only: timer + use timer_impl, only: init_timer + use readwav + + character c + character*80 line + character*512 datadir + character*500 infile + character*12 mycall,hiscall + character*6 mygrid + character(len=500) optarg + + logical :: display_help=.false. + logical*1 bShMsgs + logical*1 btrain + logical*1 bswl + + type(wav_header) :: wav + + integer*2 id2(30*12000) + integer*2 ichunk(7*1024) + + real*8 pcoeffs(5) + + type (option) :: long_options(9) = [ & + option ('ndepth',.true.,'c','ndepth',''), & + option ('dxcall',.true.,'d','hiscall',''), & + option ('evemode',.true.,'e','Must be used with -s.',''), & + option ('frequency',.true.,'f','rxfreq',''), & + option ('help',.false.,'h','Display this help message',''), & + option ('mycall',.true.,'m','mycall',''), & + option ('nftol',.true.,'n','nftol',''), & + option ('rxequalize',.false.,'r','Rx Equalize',''), & + option ('short',.false.,'s','enable Sh','') & + ] + t0=0.0 + ndepth=3 + ntol=100 + nrxfreq=1500 + mycall='' + mygrid='EN50WC' + hiscall='' + bShMsgs=.false. + btrain=.false. + bswl=.false. + datadir='.' + pcoeffs=0.d0 + + do + call getopt('c:d:ef:hm:n:rs',long_options,c,optarg,narglen,nstat,noffset,nremain,.true.) + if( nstat .ne. 0 ) then + exit + end if + select case (c) + case ('c') + read (optarg(:narglen), *) ndepth + case ('d') + read (optarg(:narglen), *) hiscall + case ('e') + bswl=.true. + case ('f') + read (optarg(:narglen), *) nrxfreq + case ('h') + display_help = .true. + case ('m') + read (optarg(:narglen), *) mycall + case ('n') + read (optarg(:narglen), *) ntol + case ('r') + btrain=.true. + case ('s') + bShMsgs=.true. + end select + end do + + if(display_help .or. nstat.lt.0 .or. nremain.lt.1) then + print *, '' + print *, 'Usage: msk144d [OPTIONS] file1 [file2 ...]' + print *, '' + print *, ' msk144 decode pre-recorded .WAV file(s)' + print *, '' + print *, 'OPTIONS:' + do i = 1, size (long_options) + call long_options(i) % print (6) + end do + go to 999 + endif + + call init_timer ('timer.out') + call timer('msk144 ',0) + ndecoded=0 + do ifile=noffset+1,noffset+nremain + call get_command_argument(ifile,optarg,narglen) + infile=optarg(:narglen) + call timer('read ',0) + call wav%read (infile) + i1=index(infile,'.wav') + if( i1 .eq. 0 ) i1=index(infile,'.WAV') + read(infile(i1-6:i1-1),*,err=998) nutc + inquire(FILE=infile,SIZE=isize) + npts=min((isize-216)/2,360000) + read(unit=wav%lun) id2(1:npts) + close(unit=wav%lun) + call timer('read ',1) + + do i=1,npts-7*1024+1,7*512 + ichunk=id2(i:i+7*1024-1) + tsec=(i-1)/12000.0 + tt=sum(float(abs(id2(i:i+7*512-1)))) + if( tt .ne. 0.0 ) then + call mskrtd(ichunk,nutc,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall,bShMsgs, & + btrain,pcoeffs,bswl,datadir,line) + if( index(line,"&") .ne. 0 .or. & + index(line,"^") .ne. 0 .or. & + index(line,"!") .ne. 0 .or. & + index(line,"@") .ne. 0 ) then + write(*,*) line + endif + endif + enddo + enddo + + call timer('msk144 ',1) + call timer('msk144 ',101) + go to 999 + +998 print*,'Cannot read from file:' + print*,infile + +999 continue +end program msk144d