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
This commit is contained in:
Joe Taylor 2016-02-04 16:10:55 +00:00
parent 95a3c00eda
commit 1ee6659101
4 changed files with 43 additions and 33 deletions

View File

@ -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

View File

@ -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)

View File

@ -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="<C1ALL C2ALL> 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

View File

@ -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;