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">
<widget class="QCheckBox" name="cbRealTime">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<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>

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:
! 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(k.ge.7168) then
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
!###

View File

@ -18,9 +18,10 @@ program msk144d2
character*12 mycall,hiscall
character(len=500) optarg
type (option) :: long_options(6) = [ &
type (option) :: long_options(7) = [ &
option ('dxcall',.true.,'d','hiscall',''), &
option ('evemode',.true.,'e','',''), &
option ('frequency',.true.,'f','rxfreq',''), &
option ('help',.false.,'h','Display this help message',''), &
option ('mycall',.true.,'m','mycall',''), &
option ('nftol',.true.,'n','nftol',''), &
@ -28,12 +29,13 @@ program msk144d2
]
t0=0.0
ntol=100
nrxfreq=1500
mycall=''
hiscall=''
bShMsgs=.false.
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
exit
end if
@ -42,6 +44,8 @@ program msk144d2
read (optarg(:narglen), *) hiscall
case ('e')
t0=1e-4
case ('f')
read (optarg(:narglen), *) nrxfreq
case ('h')
display_help = .true.
case ('m')
@ -85,7 +89,7 @@ program msk144d2
do i=1,npts,7*512
ichunk=id2(i:i+7*1024-1)
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
write(*,*) line
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.
! 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 (NSPM=864) !Number of samples per message frame
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
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 c(NSPM) !Coherently averaged complex data
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 iavmask(8)
integer iavpatterns(8,NPATTERNS)
integer s8(8)
integer npkloc(10)
integer nav(6)
real cbi(42),cbq(42)
real d(NFFT1)
real pp(12) !Half-sine pulse shape
real pow(7)
real pow(8)
real xmc(NPATTERNS)
logical first
data first/.true./
data s8/0,1,1,1,0,0,1,0/
data nav/1,2,3,5,7,9/
data iavpatterns/ &
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/
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
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
t12=0.0
nutc00=nutc0
pnoise=-1.0
first=.false.
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
if( nutc00 .ne. nutc0 ) then ! reset dupe checker
@ -100,8 +69,11 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,line)
d(NZ+1:NFFT1)=0.
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
do i=1,7
do i=1,8
ib=(i-1)*NSPM+1
ie=ib+NSPM-1
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)
endif
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
call msk144spd(cdat,np,ntol,nsuccess,msgreceived,fc,fest,tdec)
if( nsuccess .eq. 1 ) then
tdec=tsec+tdec
decsym=' & '
goto 999
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
iavmask=iavpatterns(1:8,iavg)
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,
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,
char line[], int len1);
@ -1273,7 +1273,9 @@ void MainWindow::fastSink(qint64 frames)
bool bmsk144=((m_mode=="MSK144") and (m_monitoring or m_diskData));
bmsk144=bmsk144 && m_config.realTimeDecode();
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);
float px = fast_green[fast_jh];
QString t;
@ -4324,7 +4326,7 @@ void MainWindow::switch_mode (Mode mode)
ui->rptSpinBox->setMaximum(49);
ui->sbFtol->setMinimum(21);
ui->sbFtol->setMaximum(27);
ui->RxFreqSpinBox->setVisible(m_mode!="MSK144");
// ui->RxFreqSpinBox->setVisible(m_mode!="MSK144");
}
void MainWindow::WSPR_config(bool b)

View File

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