From 1ee6659101edb592a361eeb5ac99740b4a20a6df Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 4 Feb 2016 16:10:55 +0000 Subject: [PATCH] Further improvements to decoder for short JTMSK messages. In mainwindow.cpp, return after executing call to fastSink(). ###???### git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6464 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- lib/jtmsk_decode.f90 | 35 +++++++++++++++++++++++++++-------- lib/jtmsk_short.f90 | 2 +- lib/rectify_msk.f90 | 33 +++++++++++---------------------- mainwindow.cpp | 6 ++++-- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/lib/jtmsk_decode.f90 b/lib/jtmsk_decode.f90 index 3ff5ecb81..344d08b11 100644 --- a/lib/jtmsk_decode.f90 +++ b/lib/jtmsk_decode.f90 @@ -6,6 +6,7 @@ subroutine jtmsk_decode(id2,narg,line) parameter (NFFTMAX=512*1024) parameter (NSPM=1404) !Samples per JTMSK long message integer*2 id2(0:NMAX) !Raw i*2 data, up to T/R = 30 s + integer hist(0:32868) real d(0:NMAX) !Raw r*4 data real ty(NMAX/512) !Ping times real yellow(NMAX/512) @@ -15,6 +16,7 @@ subroutine jtmsk_decode(id2,narg,line) integer narg(0:14) !Arguments passed from calling pgm character*22 msg,msg0 !Decoded message character*80 line(100) !Decodes passed back to caller + equivalence (hist,d) ! Parameters from GUI are in narg(): nutc=narg(0) !UTC @@ -36,10 +38,21 @@ subroutine jtmsk_decode(id2,narg,line) msg0=' ' msg=msg0 - d(0:npts-1)=id2(0:npts-1) - rms=sqrt(dot_product(d(0:npts-1),d(0:npts-1))/npts) + hist=0 + do i=0,npts-1 + n=abs(id2(i)) + hist(n)=hist(n)+1 + enddo + ns=0 + do n=0,32768 + ns=ns+hist(n) + if(ns.gt.npts/2) exit + enddo + fac=1.0/(1.5*n) + d(0:npts-1)=fac*id2(0:npts-1) +! rms=sqrt(dot_product(d(0:npts-1),d(0:npts-1))/npts) !### Would it be better to set median rms to 1.0 ? - d(0:npts-1)=d(0:npts-1)/rms !Normalize so that rms=1.0 +! d(0:npts-1)=d(0:npts-1)/rms !Normalize so that rms=1.0 call mskdt(d,npts,ty,yellow,nyel) nyel=min(nyel,5) @@ -70,8 +83,8 @@ subroutine jtmsk_decode(id2,narg,line) call syncmsk(cdat,iz,jpk,ipk,idf,rmax,snr,metric,msg) if(metric.eq.-9999) cycle !No output if no significant sync if(msg(1:1).eq.' ') call jtmsk_short(cdat,iz,narg,tbest,idfpk,msg) - if(index(msg,'<').eq.1 .and. naggressive.eq.0 .and. & - narg(13).ne.narg(12)) msg=' ' + if(msg(1:1).eq.'<' .and. naggressive.eq.0 .and. & + narg(13)/8.ne.narg(12)) msg=' ' if(msg(1:1).ne.' ') then if(msg.ne.msg0) then nline=nline+1 @@ -79,10 +92,14 @@ subroutine jtmsk_decode(id2,narg,line) endif freq=fpk+idf t0=(ia+jpk)/12000.0 - nsnr=nint(yellow(n)-4.0) + y=10.0**(0.1*(yellow(n)-1.5)) + nsnr=max(-5,nint(db(y))) if(nsnr.gt.nsnr0 .and. nline.gt.0) then - call rectify_msk(cdat2(jpk:jpk+NSPM-1),msg,freq2) - write(line(nline),1020) nutc,nsnr,t0,nint(freq2),msg + call rectify_msk(cdat2(jpk:jpk+NSPM-1),msg,narg(13),freq2) + freq=freq2 + if(msg(1:1).eq.'<') freq=freq2+idfpk +!### Check freq values !!! + write(line(nline),1020) nutc,nsnr,t0,nint(freq),msg 1020 format(i6.6,i4,f5.1,i5,' & ',a22) nsnr0=nsnr go to 900 @@ -91,9 +108,11 @@ subroutine jtmsk_decode(id2,narg,line) if(nline.ge.maxlines) go to 900 endif enddo +! print*,'c',nutc,n,nint(yellow(n)-4.0),freq,freq2 enddo 900 continue +! print*,'d',nutc,n,nint(yellow(n)-4.0),freq,freq2 if(line(1)(1:6).eq.' ') line(1)(1:1)=char(0) return diff --git a/lib/jtmsk_short.f90 b/lib/jtmsk_short.f90 index 1e2ba1144..56fdb93ae 100644 --- a/lib/jtmsk_short.f90 +++ b/lib/jtmsk_short.f90 @@ -142,7 +142,7 @@ subroutine jtmsk_short(cdat,npts,narg,tbest,idfpk,decoded) if(u1.gt.u1best) then irpt=iand(ibest,7) ihash=ibest/8 - narg(13)=ihash + narg(13)=ibest decoded="<...> "//rpt(irpt) tbest=t r1best=r1(j) diff --git a/lib/rectify_msk.f90 b/lib/rectify_msk.f90 index dd4fede11..ff5ee497b 100644 --- a/lib/rectify_msk.f90 +++ b/lib/rectify_msk.f90 @@ -1,4 +1,4 @@ -subroutine rectify_msk(c,msg,freq2) +subroutine rectify_msk(c,msg0,imsg,freq2) parameter (NSPM=1404) complex c(0:NSPM-1) !Received data @@ -6,11 +6,18 @@ subroutine rectify_msk(c,msg,freq2) complex c1(0:NSPM-1) !Rectified signal complex c2(0:NSPM-1) !Integral of rectified signal complex c3(0:2*NSPM-1) !FFT of rectified signal - complex cfac !,z - character*22 msg,msgsent + complex cfac + character*22 msg0,msg,msgsent integer i4tone(234) ichk=0 + msg=msg0 + nsym=234 + if(imsg.ge.0) then + ichk=10000+imsg + msg=" 73" + nsym=35 + endif call genmsk(msg,ichk,msgsent,i4tone,itype) !Get tone sequence for msg twopi=8.0*atan(1.0) @@ -21,7 +28,7 @@ subroutine rectify_msk(c,msg,freq2) dphi=0. k=-1 c2=0. - do j=1,234 !Generate Tx waveform for msg + do j=1,nsym !Generate Tx waveform for msg if(i4tone(j).eq.0) dphi=twopi*f0*dt if(i4tone(j).eq.1) dphi=twopi*f1*dt do i=1,6 @@ -37,22 +44,6 @@ subroutine rectify_msk(c,msg,freq2) cfac=cmplx(cos(pha),-sin(pha)) c1=cfac*c1 c2=cfac*c2 -! sq=0. -! do k=0,NSPM-1 -! pha=atan2(aimag(c2(k)),real(c2(k))) -! write(61,3001) k,c1(k),c2(k),pha -!3001 format(i6,7f12.3) -! sq=sq + aimag(c1(k))**2 -! enddo - -! z=c2(5) -! do j=1,234 -! k=j*6 - 1 -! if(j.ge.2) z=c2(k)-c2(k-6) -! pha=atan2(aimag(z),real(z)) -! write(62,3001) j,z,pha -! enddo - nfft=2*NSPM c3(0:NSPM-1)=c2 c3(NSPM:nfft-1)=0. @@ -67,8 +58,6 @@ subroutine rectify_msk(c,msg,freq2) smax=s freq2=1500.0 + f endif -! write(63,3002) f,s,db(s),c3(i) -!3002 format(f10.1,f12.3,f10.2,2f12.1) enddo return diff --git a/mainwindow.cpp b/mainwindow.cpp index 449f975a9..7623b0138 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -875,7 +875,7 @@ void MainWindow::dataSink(qint64 frames) if(m_mode=="ISCAT" or m_mode=="JTMSK" or m_bFast9) { fastSink(frames); -// return; + return; //### Had been commented out (2/4/2016) ### } // Get power, spectrum, and ihsym @@ -1485,7 +1485,9 @@ void MainWindow::closeEvent(QCloseEvent * e) mem_jt9->detach(); QFile quitFile {m_config.temp_dir ().absoluteFilePath (".quit")}; quitFile.open(QIODevice::ReadWrite); + qDebug() << "A"; QFile {m_config.temp_dir ().absoluteFilePath (".lock")}.remove(); // Allow jt9 to terminate + qDebug() << "B"; bool b=proc_jt9.waitForFinished(1000); if(!b) proc_jt9.kill(); quitFile.remove(); @@ -1909,7 +1911,7 @@ void::MainWindow::fast_decode_done() } if(m_msg[i][0]==0) break; QString message=QString::fromLatin1(m_msg[i]); - if(narg[13]==narg[12]) message=message.trimmed().replace("<...>",m_calls); + if(narg[13]/8==narg[12]) message=message.trimmed().replace("<...>",m_calls); //Left (Band activity) window DecodedText decodedtext;