Tweaks to jt9code.

Fix reports generated by double-click on callsign.
Collapse consecutive spaces in message to a single space.
Look at best element in ccfred first; then zap nearby ones; then repeat.
Display sqrt(red(i)) in waterfall.
Step by 4 (or 2) in peakdt9, then zero in on the peak.


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2733 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2012-11-15 16:34:14 +00:00
parent b6758df910
commit b1da27a080
6 changed files with 97 additions and 34 deletions

View File

@ -11,6 +11,7 @@ subroutine decoder(ntrSeconds,ndepth,nRxLog,c00)
real*4 ccfred(NSMAX)
integer*1 i1SoftSymbols(207)
integer*2 id2
integer ii(1)
complex c0(NDMAX),c00(NDMAX)
common/jt9com/ss0(184,NSMAX),savg(NSMAX),id2(NMAX),nutc0,ndiskdat, &
ntr,nfqso,newdat,npts80,nfb,ntol,kin,nsynced,ndecoded
@ -86,38 +87,43 @@ subroutine decoder(ntrSeconds,ndepth,nRxLog,c00)
fgood=0.
df8=1500.0/(nsps/8)
sbest=0.
do i=ia,ib
f=(i-1)*df3
if((i.eq.ipk .or. ccfred(i).ge.3.0) .and. f.gt.fgood+10.0*df8) then
call timer('spec9 ',0)
call spec9(c0,npts8,nsps,f,fpk,xdt,snr,i1SoftSymbols)
call timer('spec9 ',1)
call timer('decode9 ',0)
call decode9(i1SoftSymbols,limit,nlim,msg)
call timer('decode9 ',1)
sync=ccfred(i) - 2.0
if(sync.lt.0.0) sync=0.0
nsync=sync
if(nsync.gt.10) nsync=10
nsnr=nint(snr)
drift=0.0
10 continue
ii=maxloc(ccfred(ia:ib))
i=ii(1) + ia - 1
f=(i-1)*df3
if(ccfred(i).gt.sbest .and. fgood.eq.0.0) then
sbest=ccfred(i)
write(line,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift
if(nsync.gt.0) nsynced=1
endif
if((i.eq.ipk .or. ccfred(i).ge.3.0) .and. abs(f-fgood).gt.10.0*df8) then
call timer('spec9 ',0)
call spec9(c0,npts8,nsps,f,fpk,xdt,snr,i1SoftSymbols)
call timer('spec9 ',1)
if(msg.ne.' ') then
write(13,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,msg
write(14,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,msg
fgood=f
nsynced=1
ndecoded=1
endif
call timer('decode9 ',0)
call decode9(i1SoftSymbols,limit,nlim,msg)
call timer('decode9 ',1)
sync=ccfred(i) - 2.0
if(sync.lt.0.0) sync=0.0
nsync=sync
if(nsync.gt.10) nsync=10
nsnr=nint(snr)
drift=0.0
if(ccfred(i).gt.sbest .and. fgood.eq.0.0) then
sbest=ccfred(i)
write(line,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift
if(nsync.gt.0) nsynced=1
endif
enddo
if(msg.ne.' ') then
write(13,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,msg
write(14,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,msg
fgood=f
nsynced=1
ndecoded=1
endif
endif
ccfred(i-10:i+10)=0.
if(maxval(ccfred(ia:ib)).gt.3.0) go to 10
if(fgood.eq.0.0) then
write(13,1020) line

35
lib/jt9code.f90 Normal file
View File

@ -0,0 +1,35 @@
program jt9code
! Generate simulated data for testing of WSJT-X
parameter (NMAX=1800*12000)
character msg*22,msg0*22,decoded*22
integer*4 i4tone(85) !Channel symbols (values 0-8)
integer*4 i4data(69)
integer*4 i4DataSymNoGray(69) !Data Symbols, values 0-7
integer*1 i1ScrambledBits(207) !Unpacked bits, scrambled order
integer*1 i1Bits(207) !Encoded information-carrying bits
integer*1 i1SoftSymbols(207)
integer*1 i1
equivalence (i1,i4)
include 'jt9sync.f90'
common/acom/dat(NMAX),iwave(NMAX)
nargs=iargc()
if(nargs.ne.1) then
print*,'Usage: jt9code "message"'
go to 999
endif
call getarg(1,msg0)
write(*,1000) msg0
1000 format('Message:',3x,a22)
msg=msg0
call genjt9(msg,decoded,i4tone) !Encode message into tone #s
write(*,1002) i4tone
1002 format('Channel symbols:'/(30i2))
write(*,1004) decoded
1004 format('Decoded message:',1x,a22)
999 end program jt9code

View File

@ -7,17 +7,23 @@
character*12 c1,c2
character*4 c3
character*6 grid6
c character*3 dxcc !Where is DXCC implemented?
logical text1,text2,text3
C Convert all letters to upper case
do i=1,22
if(msg(i:i).ge.'a' .and. msg(i:i).le.'z')
+ msg(i:i)= char(ichar(msg(i:i))+ichar('A')-ichar('a'))
if(msg(i:i).ne.' ') iz=i
enddo
do iter=1,5 !Collapse multiple blanks into one
ib2=index(msg(1:iz),' ')
if(ib2.lt.1) go to 5
msg=msg(1:ib2)//msg(ib2+2:)
iz=iz-1
enddo
C See if it's a CQ message
if(msg(1:3).eq.'CQ ') then
5 if(msg(1:3).eq.'CQ ') then
i=3
C ... and if so, does it have a reply frequency?
if(msg(4:4).ge.'0' .and. msg(4:4).le.'9' .and.

View File

@ -11,7 +11,14 @@ subroutine peakdt9(c0,npts8,nsps8,istart,foffset,idtpk)
f0=foffset
dphi=twopi*f0/1500.0
do idt=-idtmax,idtmax
idtstep=4
if(idtmax.lt.30) idtstep=2
if(idtmax.lt.15) idtstep=1
idt1=-idtmax
idt2=idtmax
10 do idt=idt1,idt2,idtstep
i0=istart + 0.0625*nsps8*idt
sum=0.
do j=1,16
@ -32,5 +39,12 @@ subroutine peakdt9(c0,npts8,nsps8,istart,foffset,idtpk)
endif
enddo
if(idtstep.gt.1) then
idtstep=1
idt1=idtpk-1
idt2=idtpk+1
go to 10
endif
return
end subroutine peakdt9

View File

@ -31,6 +31,7 @@ subroutine redsync(ss,ntrperiod,ihsym,iz,red)
smax=0.
do i=1,iz
! red(i)=0.3*db(red(i))
red(i)=sqrt(red(i))
smax=max(smax,red(i))
enddo
h=10.

View File

@ -1133,16 +1133,17 @@ void MainWindow::doubleClickOnCall(QString hiscall, bool ctrl)
ui->dxCallEntry->setText(hiscall);
QString t = ui->decodedTextBrowser->toPlainText(); //Full contents
int i2=ui->decodedTextBrowser->textCursor().position();
int i3=t.mid(i2,99).indexOf("\n")-1; //points to last char of line
QString t1 = t.mid(0,i3); //contents up to \n on selected line
QString t1 = t.mid(0,i2); //contents up to \n on selected line
int i1=t1.lastIndexOf("\n") + 1; //points to first char of line
QString t2 = t1.mid(i1,i3-i1); //selected line
QString t2 = t1.mid(i1,i2-i1); //selected line
int n = 60*t2.mid(0,2).toInt() + t2.mid(2,2).toInt();
int nmod=n%(m_TRperiod/30);
m_txFirst=(nmod!=0);
ui->txFirstCheckBox->setChecked(m_txFirst);
QString rpt=t2.mid(10,3);
if(rpt.indexOf(" ")==0) rpt=rpt.mid(1,2);
if(rpt.toInt()>-1) rpt="-01";
if(rpt.toInt()<-50) rpt="-50";
if(ctrl) {
int i4=t.mid(i2,20).indexOf(" ");
QString hisgrid=t.mid(i2,20).mid(i4+1,4);