diff --git a/lib/qra/q65/q65_sync.f90 b/lib/qra/q65/q65_sync.f90
index 48ca0a727..57e5fb7c6 100644
--- a/lib/qra/q65/q65_sync.f90
+++ b/lib/qra/q65/q65_sync.f90
@@ -30,6 +30,7 @@ subroutine q65_sync(nutc,iwave,ntrperiod,mode_q65,codewords,ncw,nsps, &
real, allocatable :: s3(:,:) !Data-symbol energies s3(LL,63)
real, allocatable :: ccf(:,:) !CCF(freq,lag)
real, allocatable :: ccf1(:) !CCF(freq) at best lag
+ real, allocatable :: ccf2(:) !CCF(freq) at any lag
real sync(85) !sync vector
complex, allocatable :: c0(:) !Complex spectrum of symbol
data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/
@@ -57,6 +58,7 @@ subroutine q65_sync(nutc,iwave,ntrperiod,mode_q65,codewords,ncw,nsps, &
allocate(c0(0:nfft-1))
allocate(ccf(-ia2:ia2,-53:214))
allocate(ccf1(-ia2:ia2))
+ allocate(ccf2(-ia2:ia2))
if(sync(1).eq.99.0) then !Generate the sync vector
sync=-22.0/63.0 !Sync tone OFF
@@ -156,6 +158,10 @@ subroutine q65_sync(nutc,iwave,ntrperiod,mode_q65,codewords,ncw,nsps, &
endif
enddo ! imsg
+ do i=-ia2,ia2
+ ccf2(i)=maxval(ccf(i,:))
+ enddo
+
i1=i0+ipk-64
i2=i1+LL-1
j=j0+jpk-7
@@ -197,6 +203,10 @@ subroutine q65_sync(nutc,iwave,ntrperiod,mode_q65,codewords,ncw,nsps, &
ccf1=ccf1-base
smax=maxval(ccf1)
if(smax.gt.10.0) ccf1=10.0*ccf1/smax
+ base=(sum(ccf2(-ia2:-ia2+ic)) + sum(ccf2(ia2-ic:ia2)))/(2.0+2.0*ic);
+ ccf2=ccf2-base
+ smax=maxval(ccf2)
+ if(smax.gt.10.0) ccf2=10.0*ccf2/smax
go to 200
endif
enddo
@@ -223,6 +233,11 @@ subroutine q65_sync(nutc,iwave,ntrperiod,mode_q65,codewords,ncw,nsps, &
jpk=ijpk(2)-53-1
f0=nfqso + ipk*df
xdt=jpk*dtstep
+
+ do i=-ia2,ia2
+ ccf2(i)=maxval(ccf(i,:))
+ enddo
+
sq=0.
nsq=0
jd=(lag2-lag1)/4
@@ -239,6 +254,8 @@ subroutine q65_sync(nutc,iwave,ntrperiod,mode_q65,codewords,ncw,nsps, &
snr1=smax/rms
ccf1=ccf(:,jpk)/rms
if(snr1.gt.10.0) ccf1=(10.0/snr1)*ccf1
+ ccf2=ccf2/rms
+ if(snr1.gt.10.0) ccf2=(10.0/snr1)*ccf2
if(iand(ndepth,16).eq.16) then
! Fill s3() from s1() here, then call q65_avg().
@@ -270,8 +287,8 @@ subroutine q65_sync(nutc,iwave,ntrperiod,mode_q65,codewords,ncw,nsps, &
enddo
do i=-ia2,ia2
freq=nfqso + i*df
- write(17,1100) freq,ccf1(i),xdt
-1100 format(3f10.3)
+ write(17,1100) freq,ccf1(i),xdt,ccf2(i)
+1100 format(4f10.3)
enddo
close(17)
width=df*(i2-i1)
diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp
index 9b6b3856b..fd7cb173c 100644
--- a/widgets/plotter.cpp
+++ b/widgets/plotter.cpp
@@ -141,7 +141,7 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
//move current data down one line (must do this before attaching a QPainter object)
if(bScroll and !m_bReplot) m_WaterfallPixmap.scroll(0,1,0,0,m_w,m_h1);
QPainter painter1(&m_WaterfallPixmap);
- if(m_bFirst or bRed or !m_bQ65_Sync or m_mode!=m_mode0 or m_bResized) {
+ if(m_bFirst or bRed or (!m_bQ65_Sync and !m_bQ65_MultiSync) or m_mode!=m_mode0 or m_bResized) {
m_2DPixmap = m_OverlayPixmap.copy(0,0,m_w,m_h2);
m_bFirst=false;
m_bResized=false;
@@ -227,7 +227,7 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
}
- if(i==iz-1 and !m_bQ65_Sync) {
+ if(i==iz-1 and !m_bQ65_Sync and !m_bQ65_MultiSync) {
painter2D.drawPolyline(LineBuf,j);
}
LineBuf[j].setX(i);
@@ -271,25 +271,26 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
painter2D.drawText(x1-4,y,"73");
}
- if(bRed and m_bQ65_Sync) {
+ if(bRed and (m_bQ65_Sync or m_bQ65_MultiSync)) { //Plot the Q65 red or orange sync curve
int k=0;
std::ifstream f;
f.open(m_redFile.toLatin1());
if(f) {
int x,y;
- float freq,sync,xdt;
+ float freq,sync,xdt,sync2;
for(int i=0; i<99999; i++) {
- f >> freq >> sync >> xdt;
+ f >> freq >> sync >> xdt >> sync2;
if(f.eof()) break;
x=XfromFreq(freq);
+ if(m_bQ65_MultiSync) sync=sync2;
y=m_h2*(0.9 - 0.09*gain2d*sync) - m_plot2dZero;
LineBuf2[k].setX(x);
LineBuf2[k].setY(y);
-
k++;
}
f.close();
- QPen pen0(Qt::red,2);
+ QPen pen0(Qt::red,2);
+ if(m_bQ65_MultiSync) pen0.setColor("orange");
painter2D.setPen(pen0);
painter2D.drawPolyline(LineBuf2,k);
QString t;
diff --git a/widgets/plotter.h b/widgets/plotter.h
index 3f8f00574..c3627eb00 100644
--- a/widgets/plotter.h
+++ b/widgets/plotter.h
@@ -82,7 +82,8 @@ public:
bool Reference() const {return m_bReference;}
void setQ65_Sync(bool b) {m_bQ65_Sync = b;}
bool Q65_Sync() const {return m_bQ65_Sync;}
- void drawRed(int ia, int ib, float swide[]);
+ void setQ65_MultiSync(bool b) {m_bQ65_MultiSync = b;}
+ bool Q65_MultiSync() const {return m_bQ65_MultiSync;} void drawRed(int ia, int ib, float swide[]);
void setVHF(bool bVHF);
void setRedFile(QString fRed);
void setFST4_FreqRange(int fLow,int fHigh);
@@ -116,6 +117,7 @@ private:
bool m_bReference;
bool m_bReference0;
bool m_bQ65_Sync;
+ bool m_bQ65_MultiSync;
bool m_bVHF;
bool m_bSingleDecode;
bool m_bFirst=true;
diff --git a/widgets/widegraph.cpp b/widgets/widegraph.cpp
index 2bcb5936a..6f6736029 100644
--- a/widgets/widegraph.cpp
+++ b/widgets/widegraph.cpp
@@ -71,11 +71,13 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
ui->widePlot->setLinearAvg(m_settings->value("LinearAvg",false).toBool());
ui->widePlot->setReference(m_settings->value("Reference",false).toBool());
ui->widePlot->setQ65_Sync(m_settings->value("Q65_Sync",false).toBool());
+ ui->widePlot->setQ65_MultiSync(m_settings->value("Q65_MultiSync",false).toBool());
if(ui->widePlot->current()) ui->spec2dComboBox->setCurrentIndex(0);
if(ui->widePlot->cumulative()) ui->spec2dComboBox->setCurrentIndex(1);
if(ui->widePlot->linearAvg()) ui->spec2dComboBox->setCurrentIndex(2);
if(ui->widePlot->Reference()) ui->spec2dComboBox->setCurrentIndex(3);
if(ui->widePlot->Q65_Sync()) ui->spec2dComboBox->setCurrentIndex(4);
+ if(ui->widePlot->Q65_MultiSync()) ui->spec2dComboBox->setCurrentIndex(5);
int nbpp=m_settings->value("BinsPerPixel",2).toInt();
ui->widePlot->setBinsPerPixel(nbpp);
ui->sbPercent2dPlot->setValue(m_Percent2DScreen);
@@ -133,6 +135,7 @@ void WideGraph::saveSettings() //saveS
m_settings->setValue ("LinearAvg", ui->widePlot->linearAvg());
m_settings->setValue ("Reference", ui->widePlot->Reference());
m_settings->setValue ("Q65_Sync", ui->widePlot->Q65_Sync());
+ m_settings->setValue ("Q65_MultiSync", ui->widePlot->Q65_MultiSync());
m_settings->setValue ("BinsPerPixel", ui->widePlot->binsPerPixel ());
m_settings->setValue ("StartFreq", ui->widePlot->startFreq ());
m_settings->setValue ("WaterfallPalette", m_waterfallPalette);
@@ -320,6 +323,7 @@ void WideGraph::on_spec2dComboBox_currentIndexChanged(int index)
ui->widePlot->setLinearAvg(false);
ui->widePlot->setReference(false);
ui->widePlot->setQ65_Sync(false);
+ ui->widePlot->setQ65_MultiSync(false);
ui->smoSpinBox->setEnabled(false);
switch (index)
{
@@ -339,7 +343,10 @@ void WideGraph::on_spec2dComboBox_currentIndexChanged(int index)
case 4:
ui->widePlot->setQ65_Sync(true);
break;
- }
+ case 5:
+ ui->widePlot->setQ65_MultiSync(true);
+ break;
+ }
replot();
}
diff --git a/widgets/widegraph.ui b/widgets/widegraph.ui
index d78757444..84fbf7f5b 100644
--- a/widgets/widegraph.ui
+++ b/widgets/widegraph.ui
@@ -340,6 +340,11 @@
Q65_Sync
+ -
+
+ Q65_MultiSync
+
+
-