1. Clean up mskrtd to remove unused variables.
2. Re-instate Rx frequency spinbox in MSK144 mode to allow decoding of off-frequency signals with small FTol. Make changes needed to pass Rx Freq in to fortran routines. 
3. Enable realtime decoder for testing. Auto sequence does not yet work when realtime decoding is enabled. There are probably other bugs as well.




git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7109 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Steven Franke 2016-09-25 00:16:29 +00:00
parent 3df371f11b
commit f210e47cd5
6 changed files with 33 additions and 51 deletions

View File

@ -2280,7 +2280,7 @@ Right click for insert and delete options.</string>
<item row="8" column="0"> <item row="8" column="0">
<widget class="QCheckBox" name="cbRealTime"> <widget class="QCheckBox" name="cbRealTime">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Decode on-the-fly rather than at end of Rx sequence.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Decode on-the-fly rather than at end of Rx sequence.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>

View File

@ -1,4 +1,4 @@
subroutine hspec(id2,k,nutc0,ntrperiod,ntol,bmsk144,ingain,green,s,jh,line1) subroutine hspec(id2,k,nutc0,ntrperiod,nrxfreq,ntol,bmsk144,ingain,green,s,jh,line1)
! Input: ! Input:
! k pointer to the most recent new data ! k pointer to the most recent new data
@ -68,7 +68,7 @@ subroutine hspec(id2,k,nutc0,ntrperiod,ntol,bmsk144,ingain,green,s,jh,line1)
if(bmsk144) then if(bmsk144) then
if(k.ge.7168) then if(k.ge.7168) then
tsec=(k-7168)/12000.0 tsec=(k-7168)/12000.0
call mskrtd(id2(k-7168+1:k),nutc0,tsec,ntol,line1) call mskrtd(id2(k-7168+1:k),nutc0,tsec,ntol,nrxfreq,line1)
endif endif
endif endif
!### !###

View File

@ -18,9 +18,10 @@ program msk144d2
character*12 mycall,hiscall character*12 mycall,hiscall
character(len=500) optarg character(len=500) optarg
type (option) :: long_options(6) = [ & type (option) :: long_options(7) = [ &
option ('dxcall',.true.,'d','hiscall',''), & option ('dxcall',.true.,'d','hiscall',''), &
option ('evemode',.true.,'e','',''), & option ('evemode',.true.,'e','',''), &
option ('frequency',.true.,'f','rxfreq',''), &
option ('help',.false.,'h','Display this help message',''), & option ('help',.false.,'h','Display this help message',''), &
option ('mycall',.true.,'m','mycall',''), & option ('mycall',.true.,'m','mycall',''), &
option ('nftol',.true.,'n','nftol',''), & option ('nftol',.true.,'n','nftol',''), &
@ -28,12 +29,13 @@ program msk144d2
] ]
t0=0.0 t0=0.0
ntol=100 ntol=100
nrxfreq=1500
mycall='' mycall=''
hiscall='' hiscall=''
bShMsgs=.false. bShMsgs=.false.
do do
call getopt('d:ehm:n:s',long_options,c,optarg,narglen,nstat,noffset,nremain,.true.) call getopt('d:ef:hm:n:s',long_options,c,optarg,narglen,nstat,noffset,nremain,.true.)
if( nstat .ne. 0 ) then if( nstat .ne. 0 ) then
exit exit
end if end if
@ -42,6 +44,8 @@ program msk144d2
read (optarg(:narglen), *) hiscall read (optarg(:narglen), *) hiscall
case ('e') case ('e')
t0=1e-4 t0=1e-4
case ('f')
read (optarg(:narglen), *) nrxfreq
case ('h') case ('h')
display_help = .true. display_help = .true.
case ('m') case ('m')
@ -85,7 +89,7 @@ program msk144d2
do i=1,npts,7*512 do i=1,npts,7*512
ichunk=id2(i:i+7*1024-1) ichunk=id2(i:i+7*1024-1)
tsec=(i-1)/12000.0 tsec=(i-1)/12000.0
call mskrtd(ichunk,nutc,tsec,ntol,line) call mskrtd(ichunk,nutc,tsec,ntol,nrxfreq,line)
if( index(line,"^") .ne. 0 .or. index(line,"&") .ne. 0 ) then if( index(line,"^") .ne. 0 .or. index(line,"&") .ne. 0 ) then
write(*,*) line write(*,*) line
endif endif

View File

@ -1,4 +1,4 @@
subroutine mskrtd(id2,nutc0,tsec,ntol,line) subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,line)
! Real-time decoder for MSK144. ! Real-time decoder for MSK144.
! Analysis block size = NZ = 7168 samples, t_block = 0.597333 s ! Analysis block size = NZ = 7168 samples, t_block = 0.597333 s
@ -7,8 +7,6 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,line)
parameter (NZ=7168) !Block size parameter (NZ=7168) !Block size
parameter (NSPM=864) !Number of samples per message frame parameter (NSPM=864) !Number of samples per message frame
parameter (NFFT1=8192) !FFT size for making analytic signal parameter (NFFT1=8192) !FFT size for making analytic signal
parameter (NAVGMAX=7) !Coherently average up to 7 frames
parameter (NPTSMAX=7*NSPM) !Max points analyzed at once
parameter (NPATTERNS=4) !Number of frame averaging patterns to try parameter (NPATTERNS=4) !Number of frame averaging patterns to try
character*3 decsym !"&" for mskspd or "^" for long averages character*3 decsym !"&" for mskspd or "^" for long averages
@ -19,24 +17,18 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,line)
complex cdat(NFFT1) !Analytic signal complex cdat(NFFT1) !Analytic signal
complex c(NSPM) !Coherently averaged complex data complex c(NSPM) !Coherently averaged complex data
complex ct(NSPM) complex ct(NSPM)
complex cb(42) !Complex waveform for sync word
! integer*8 count0,count1,count2,count3,clkfreq
integer*2 id2(NZ) !Raw 16-bit data integer*2 id2(NZ) !Raw 16-bit data
integer iavmask(8) integer iavmask(8)
integer iavpatterns(8,NPATTERNS) integer iavpatterns(8,NPATTERNS)
integer s8(8)
integer npkloc(10) integer npkloc(10)
integer nav(6) integer nav(6)
real cbi(42),cbq(42)
real d(NFFT1) real d(NFFT1)
real pp(12) !Half-sine pulse shape real pow(8)
real pow(7)
real xmc(NPATTERNS) real xmc(NPATTERNS)
logical first logical first
data first/.true./ data first/.true./
data s8/0,1,1,1,0,0,1,0/
data nav/1,2,3,5,7,9/ data nav/1,2,3,5,7,9/
data iavpatterns/ & data iavpatterns/ &
1,1,1,1,0,0,0,0, & 1,1,1,1,0,0,0,0, &
@ -45,40 +37,17 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,line)
1,1,1,1,1,1,1,0/ 1,1,1,1,1,1,1,0/
data xmc/2.0,4.5,2.5,3.5/ !Used to label decode with time at center of averaging mask data xmc/2.0,4.5,2.5,3.5/ !Used to label decode with time at center of averaging mask
save first,cb,fs,pi,twopi,dt,s8,pp,t03,t12,nutc00,pnoise,nsnrlast,msglast save first,t03,t12,nutc00,pnoise,nsnrlast,msglast
! call system_clock(count0,clkfreq)
if(first) then if(first) then
pi=4.0*atan(1.0)
twopi=8.0*atan(1.0)
fs=12000.0
dt=1.0/fs
do i=1,12 !Define half-sine pulse
angle=(i-1)*pi/12.0
pp(i)=sin(angle)
enddo
! Define the sync word waveforms
s8=2*s8-1
cbq(1:6)=pp(7:12)*s8(1)
cbq(7:18)=pp*s8(3)
cbq(19:30)=pp*s8(5)
cbq(31:42)=pp*s8(7)
cbi(1:12)=pp*s8(2)
cbi(13:24)=pp*s8(4)
cbi(25:36)=pp*s8(6)
cbi(37:42)=pp(1:6)*s8(8)
cb=cmplx(cbi,cbq)
first=.false.
t03=0.0 t03=0.0
t12=0.0 t12=0.0
nutc00=nutc0 nutc00=nutc0
pnoise=-1.0 pnoise=-1.0
first=.false.
endif endif
fc=1500.0 !!! This will eventually come from the Rx Freq GUI box. fc=nrxfreq
!!! Dupe checking should probaby be moved to mainwindow.cpp !!! Dupe checking should probaby be moved to mainwindow.cpp
if( nutc00 .ne. nutc0 ) then ! reset dupe checker if( nutc00 .ne. nutc0 ) then ! reset dupe checker
@ -100,8 +69,11 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,line)
d(NZ+1:NFFT1)=0. d(NZ+1:NFFT1)=0.
call analytic(d,NZ,NFFT1,cdat) !Convert to analytic signal and filter call analytic(d,NZ,NFFT1,cdat) !Convert to analytic signal and filter
! Calculate average power for each frame and for the entire block.
! If decode is successful, largest power will be taken as signal+noise.
! If no decode, entire-block average will be used to update noise estimate.
pmax=-99 pmax=-99
do i=1,7 do i=1,8
ib=(i-1)*NSPM+1 ib=(i-1)*NSPM+1
ie=ib+NSPM-1 ie=ib+NSPM-1
pow(i)=dot_product(cdat(ib:ie),cdat(ib:ie))*rms**2 pow(i)=dot_product(cdat(ib:ie),cdat(ib:ie))*rms**2
@ -109,18 +81,21 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,line)
pmax=pow(i) pmax=pow(i)
endif endif
enddo enddo
pavg=sum(pow)/7.0 pavg=sum(pow)/8.0
! Short ping decoder uses squared-signal spectrum to determine where to
! center a 3-frame analysis window and attempts to decode each of the
! 3 frames along with 2- and 3-frame averages.
np=8*NSPM np=8*NSPM
call msk144spd(cdat,np,ntol,nsuccess,msgreceived,fc,fest,tdec) call msk144spd(cdat,np,ntol,nsuccess,msgreceived,fc,fest,tdec)
if( nsuccess .eq. 1 ) then if( nsuccess .eq. 1 ) then
tdec=tsec+tdec tdec=tsec+tdec
decsym=' & ' decsym=' & '
goto 999 goto 999
endif endif
! If short ping decoder doesn't find a decode, then 4-, 5-, and 7-frame averages
! spanning the first 7 frames of the block.
do iavg=1,NPATTERNS do iavg=1,NPATTERNS
iavmask=iavpatterns(1:8,iavg) iavmask=iavpatterns(1:8,iavg)
navg=sum(iavmask) navg=sum(iavmask)

View File

@ -67,7 +67,7 @@ extern "C" {
void symspec_(struct dec_data *, int* k, int* ntrperiod, int* nsps, int* ingain, int* minw, void symspec_(struct dec_data *, int* k, int* ntrperiod, int* nsps, int* ingain, int* minw,
float* px, float s[], float* df3, int* nhsym, int* npts8); float* px, float s[], float* df3, int* nhsym, int* npts8);
void hspec_(short int d2[], int* k, int* nutc0, int* ntrperiod, int* ntol, void hspec_(short int d2[], int* k, int* nutc0, int* ntrperiod, int* nrxfreq, int* ntol,
bool* bmsk144, int* ingain, float green[], float s[], int* jh, bool* bmsk144, int* ingain, float green[], float s[], int* jh,
char line[], int len1); char line[], int len1);
@ -1273,7 +1273,9 @@ void MainWindow::fastSink(qint64 frames)
bool bmsk144=((m_mode=="MSK144") and (m_monitoring or m_diskData)); bool bmsk144=((m_mode=="MSK144") and (m_monitoring or m_diskData));
bmsk144=bmsk144 && m_config.realTimeDecode(); bmsk144=bmsk144 && m_config.realTimeDecode();
line[0]=0; line[0]=0;
hspec_(dec_data.d2,&k,&nutc0,&m_TRperiod, &m_Ftol, &bmsk144,&m_inGain,fast_green, //### Is this OK?
m_RxFreq=ui->RxFreqSpinBox->value ();
hspec_(dec_data.d2,&k,&nutc0,&m_TRperiod,&m_RxFreq,&m_Ftol,&bmsk144,&m_inGain,fast_green,
fast_s,&fast_jh, &line[0],80); fast_s,&fast_jh, &line[0],80);
float px = fast_green[fast_jh]; float px = fast_green[fast_jh];
QString t; QString t;
@ -4324,7 +4326,7 @@ void MainWindow::switch_mode (Mode mode)
ui->rptSpinBox->setMaximum(49); ui->rptSpinBox->setMaximum(49);
ui->sbFtol->setMinimum(21); ui->sbFtol->setMinimum(21);
ui->sbFtol->setMaximum(27); ui->sbFtol->setMaximum(27);
ui->RxFreqSpinBox->setVisible(m_mode!="MSK144"); // ui->RxFreqSpinBox->setVisible(m_mode!="MSK144");
} }
void MainWindow::WSPR_config(bool b) void MainWindow::WSPR_config(bool b)

View File

@ -367,6 +367,7 @@ private:
qint32 m_TRindex; qint32 m_TRindex;
qint32 m_FtolIndex; qint32 m_FtolIndex;
qint32 m_Ftol; qint32 m_Ftol;
qint32 m_RxFreq;
qint32 m_TRperiodFast; qint32 m_TRperiodFast;
qint32 m_nTx73; qint32 m_nTx73;
qint32 m_freqCQ; qint32 m_freqCQ;