diff --git a/lib/hspec.f90 b/lib/hspec.f90
index b4d66c73c..53e09f3a8 100644
--- a/lib/hspec.f90
+++ b/lib/hspec.f90
@@ -1,5 +1,5 @@
subroutine hspec(id2,k,nutc0,ntrpdepth,nrxfreq,ntol,bmsk144,bcontest, &
- brxequal,ingain,mycall,hiscall,bshmsg,bswl,green,s,jh,line1,mygrid)
+ brxequal,btrain,ingain,mycall,hiscall,bshmsg,bswl,green,s,jh,line1,mygrid)
! Input:
! k pointer to the most recent new data
@@ -9,6 +9,7 @@ subroutine hspec(id2,k,nutc0,ntrpdepth,nrxfreq,ntol,bmsk144,bcontest, &
! ntol Decoding range is +/- ntol
! bmsk144 Boolean, true if in MSK144 mode
! brxequal Boolean, turns on equalization in MSK144 mode
+! btrain Boolean, turns on training in MSK144 mode
! ingain Relative gain for spectra
! Output:
@@ -21,7 +22,7 @@ subroutine hspec(id2,k,nutc0,ntrpdepth,nrxfreq,ntol,bmsk144,bcontest, &
character*12 mycall,hiscall
character*6 mygrid
integer*2 id2(0:120*12000-1)
- logical*1 bmsk144,bcontest,bshmsg,brxequal,bswl
+ logical*1 bmsk144,bcontest,bshmsg,brxequal,btrain,bswl
real green(0:JZ-1)
real s(0:63,0:JZ-1)
real x(512)
@@ -84,7 +85,7 @@ subroutine hspec(id2,k,nutc0,ntrpdepth,nrxfreq,ntol,bmsk144,bcontest, &
tt2=sum(float(abs(id2(k0:k0+3583))))
if(tt1.ne.0.0 .and. tt2.ne.0) then
call mskrtd(id2(k-7168+1:k),nutc0,tsec,ntol,nrxfreq,ndepth, &
- mycall,mygrid,hiscall,bshmsg,bcontest,brxequal,bswl,line1)
+ mycall,mygrid,hiscall,bshmsg,bcontest,brxequal,btrain,bswl,line1)
endif
endif
endif
diff --git a/lib/msk144signalquality.f90 b/lib/msk144signalquality.f90
index 7dbae94a0..9821cfb55 100644
--- a/lib/msk144signalquality.f90
+++ b/lib/msk144signalquality.f90
@@ -1,5 +1,5 @@
subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
- brxequal,nbiterrors,eyeopening,trained,pcoeffs)
+ btrain,nbiterrors,eyeopening,trained,pcoeffs)
character*22 msg,msgsent
character*12 dxcall
@@ -23,7 +23,7 @@
integer values(8)
logical*1 bcontest
- logical*1 brxequal
+ logical*1 btrain
logical*1 first
logical*1 currently_training
logical*1 trained
@@ -77,7 +77,7 @@ write(*,*) 'reset to untrained state '
indx_dxcall=index(msg,trim(dxcall))
msg_has_dxcall = indx_dxcall .ge. 4
- if( brxequal .and. msg_has_dxcall .and. (.not. trained) .and. &
+ if( btrain .and. msg_has_dxcall .and. (.not. trained) .and. &
.not. currently_training ) then
currently_training=.true.
training_dxcall=trim(dxcall)
diff --git a/lib/mskrtd.f90 b/lib/mskrtd.f90
index 014a4cfbf..d7b2cf819 100644
--- a/lib/mskrtd.f90
+++ b/lib/mskrtd.f90
@@ -1,5 +1,5 @@
subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
- bshmsg,bcontest,brxequal,bswl,line)
+ bshmsg,bcontest,brxequal,btrain,bswl,line)
! Real-time decoder for MSK144.
! Analysis block size = NZ = 7168 samples, t_block = 0.597333 s
@@ -38,12 +38,13 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
real xmc(NPATTERNS)
real pcoeffs(3)
- logical*1 bshmsg,bcontest,brxequal,bswl
+ logical*1 bshmsg,bcontest,brxequal,btrain,bswl
logical*1 first
logical*1 trained
logical*1 bshdecode
logical*1 seenb4
logical*1 bflag
+ logical*1 bvar
data first/.true./
data iavpatterns/ &
@@ -96,7 +97,9 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
fac=1.0/rms
d(1:NZ)=fac*d(1:NZ)
d(NZ+1:NFFT1)=0.
- call analytic(d,NZ,NFFT1,cdat,pcoeffs,brxequal,.false.) ! never apply dynamic coeffs
+ bvar=brxequal
+ if( btrain ) bvar=.false. ! if training, turn off rx eq
+ call analytic(d,NZ,NFFT1,cdat,pcoeffs,bvar,.false.) ! never apply dynamic coeffs
! Calculate average power for each frame and for the entire block.
! If decode is successful, largest power will be taken as signal+noise.
@@ -186,7 +189,7 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
if(.not. bshdecode) then
call msk144signalquality(ct,snr0,fest,tdec,softbits,msgreceived,hiscall, &
- brxequal,ncorrected,eyeopening,trained,pcoeffs)
+ btrain,ncorrected,eyeopening,trained,pcoeffs)
endif
decsym=' & '
diff --git a/mainwindow.cpp b/mainwindow.cpp
index d559e761f..7268bcfe4 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -66,9 +66,10 @@ extern "C" {
int* minw, float* px, float s[], float* df3, int* nhsym, int* npts8);
void hspec_(short int d2[], int* k, int* nutc0, int* ntrperiod, int* nrxfreq, int* ntol,
- bool* bmsk144, bool* bcontest, bool* brxequalize, int* ingain, char mycall[],
- char hiscall[], bool* bshmsg, bool* bswl, float green[], float s[], int* jh,
- char line[], char mygrid[], int len1, int len2, int len3, int len4);
+ bool* bmsk144, bool* bcontest, bool* brxequalize, bool* btrain, int* ingain,
+ char mycall[], char hiscall[], bool* bshmsg, bool* bswl, float green[],
+ float s[], int* jh, char line[], char mygrid[],
+ int len1, int len2, int len3, int len4);
void gen4_(char* msg, int* ichk, char* msgsent, int itone[],
int* itext, int len1, int len2);
@@ -256,6 +257,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_bDoubleClickAfterCQnnn {false},
m_bRefSpec {false},
m_bClearRefSpec {false},
+ m_bTrain {false},
m_ihsym {0},
m_nzap {0},
m_px {0.0},
@@ -1344,11 +1346,12 @@ void MainWindow::fastSink(qint64 frames)
bool bshmsg=ui->cbShMsgs->isChecked();
bool bcontest=m_config.contestMode();
bool brxequalize=m_config.rxEqualize();
+ bool btrain=m_bTrain;
bool bswl=ui->cbSWL->isChecked();
strncpy(dec_data.params.hiscall,(hisCall + " ").toLatin1 ().constData (), 12);
strncpy(dec_data.params.mygrid, (m_config.my_grid()+" ").toLatin1(),6);
hspec_(dec_data.d2,&k,&nutc0,&nTRpDepth,&RxFreq,&m_Ftol,&bmsk144,&bcontest,&brxequalize,
- &m_inGain,&dec_data.params.mycall[0],&dec_data.params.hiscall[0],&bshmsg,&bswl,
+ &btrain,&m_inGain,&dec_data.params.mycall[0],&dec_data.params.hiscall[0],&bshmsg,&bswl,
fast_green,fast_s,&fast_jh,&line[0],&dec_data.params.mygrid[0],12,12,80,6);
float px = fast_green[fast_jh];
QString t;
@@ -1951,6 +1954,11 @@ void MainWindow::on_stopButton_clicked() //stopButton
if(m_bRefSpec) {
MessageBox::information_message (this, tr ("Reference spectrum saved"));
m_bRefSpec=false;
+ m_bTrain=false;
+ }
+ if(m_bTrain) {
+ MessageBox::information_message (this, tr ("Phase Training Disabled"));
+ m_bTrain=false;
}
}
@@ -6109,6 +6117,15 @@ void MainWindow::on_actionMeasure_reference_spectrum_triggered()
m_bRefSpec=true;
}
+void MainWindow::on_actionMeasure_phase_response_triggered()
+{
+ if(m_bTrain) {
+ m_bTrain=false;
+ } else {
+ m_bTrain=true;
+ }
+}
+
void MainWindow::on_actionErase_reference_spectrum_triggered()
{
m_bClearRefSpec=true;
diff --git a/mainwindow.h b/mainwindow.h
index 94ea96e17..a35205bd0 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -250,6 +250,7 @@ private slots:
void fast_decode_done();
void on_actionMeasure_reference_spectrum_triggered();
void on_actionErase_reference_spectrum_triggered();
+ void on_actionMeasure_phase_response_triggered();
void on_sbTR_valueChanged(int index);
void on_sbFtol_valueChanged(int index);
void on_cbFast9_clicked(bool b);
@@ -426,6 +427,7 @@ private:
bool m_bDoubleClickAfterCQnnn;
bool m_bRefSpec;
bool m_bClearRefSpec;
+ bool m_bTrain;
bool m_bUseRef;
bool m_bFastDone;
bool m_bAltV;
diff --git a/mainwindow.ui b/mainwindow.ui
index c758c5040..0c2f5f2ab 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -2461,6 +2461,7 @@ QPushButton[state="ok"] {
Tools
+
@@ -2963,6 +2964,11 @@ QPushButton[state="ok"] {
Measure reference spectrum
+
+
+ Measure phase response
+
+
Erase reference spectrum