For Q65, plot a red "Sync curve" in the Wide Graph.

This commit is contained in:
Joe Taylor 2020-12-18 13:31:14 -05:00
parent 5a9a2c8279
commit b3769bb6c8
7 changed files with 80 additions and 47 deletions

View File

@ -200,6 +200,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
if(params%nmode.eq.66) then !NB: JT65 = 65, Q65 = 66.
! We're in Q65 mode
open(17,file=trim(temp_dir)//'/red.dat',status='unknown')
call timer('dec_q65 ',0)
call my_q65%decode(q65_decoded,id2,params%nutc,params%ntr, &
params%nsubmode,params%nfqso,params%ntol,params%ndepth, &

View File

@ -151,11 +151,12 @@ subroutine q65_sync(nutc,iwave,nmax,mode_q65,codewords,ncw,nsps,nfqso,ntol, &
f0=nfqso + (ipk-1)*df
xdt=jpk*dtstep
imsg_best=imsg
ccf1=ccf(-ia:ia,jpk)
endif
enddo ! imsg
ia=i0+ipk-64
ib=ia+LL-1
i1=i0+ipk-64
i2=i1+LL-1
j=j0+jpk-7
n=0
do k=1,85
@ -164,7 +165,7 @@ subroutine q65_sync(nutc,iwave,nmax,mode_q65,codewords,ncw,nsps,nfqso,ntol, &
cycle
endif
n=n+1
if(j.ge.1 .and. j.le.jz) s3(-64:LL-65,n)=s1(ia:ib,j)
if(j.ge.1 .and. j.le.jz) s3(-64:LL-65,n)=s1(i1:i2,j)
enddo
nsubmode=0
@ -191,7 +192,12 @@ subroutine q65_sync(nutc,iwave,nmax,mode_q65,codewords,ncw,nsps,nfqso,ntol, &
! irc,trim(decoded)
!3055 format(i6,i3,6f8.2,i5,2x,a)
! close(55)
go to 900
base=(sum(ccf1(-ia:-ia+9)) + sum(ccf1(ia-9:ia)))/20.0
ccf1=ccf1-base
smax=maxval(ccf1)
if(smax.gt.10.0) ccf1=10.0*ccf1/smax
go to 200
! go to 900
endif
enddo
@ -214,31 +220,44 @@ subroutine q65_sync(nutc,iwave,nmax,mode_q65,codewords,ncw,nsps,nfqso,ntol, &
ijpk=maxloc(ccf)
ipk=ijpk(1)-ia-1
jpk=ijpk(2)-53-1
f0=nfqso + ipk*df
xdt=jpk*dtstep
sq=0.
nsq=0
do j=lag1,lag2
if(abs(j-jpk).gt.6) then
sq=sq + ccf(ipk,j)**2
nsq=nsq+1
endif
do i=-ia,ia
do j=lag1,lag2
if(abs(j-jpk).gt.8 .and. abs(i-ipk).gt.ia/2) then
sq=sq + ccf(i,j)**2
nsq=nsq+1
endif
enddo
enddo
rms=sqrt(sq/nsq)
smax=ccf(ipk,jpk)
snr1=smax/rms
call zplot_q65(ccf(-ia:ia,lag1:lag2),ia,lag1,lag2,rms,dtstep,ntol,emedelay)
ccf1=ccf(-ia:ia,jpk)/rms
if(snr1.gt.10.0) ccf1=(10.0/snr1)*ccf1
200 do i=-ia,ia
freq=nfqso + i*df
write(17,1100) freq,ccf1(i)
1100 format(2f10.3)
enddo
close(17)
if(ia.le.60) call zplot_q65(ccf(-ia:ia,lag1:lag2),ia,lag1,lag2, &
rms,dtstep,ntol,smax,emedelay)
900 return
end subroutine q65_sync
subroutine zplot_q65(ccf,ia,lag1,lag2,rms,dtstep,ntol,emedelay)
subroutine zplot_q65(ccf,ia,lag1,lag2,rms,dtstep,ntol,smax,emedelay)
real ccf(-ia:ia,lag1:lag2)
character*1 line(70),mark(0:6)
character*35 blanks
character*1 line(130),mark(0:6)
character*60 blanks
data mark/' ',' ','.','-','+','X','#'/
data blanks/' '/
data blanks/' '/
! open(35,file='ccf.dat',status='unknown',access='stream')
! write(35) ia,lag1,lag2,rms,dtstep
@ -246,14 +265,16 @@ subroutine zplot_q65(ccf,ia,lag1,lag2,rms,dtstep,ntol,emedelay)
! close(35)
open(34,file='ccf.txt',status='unknown')
write(34,1000) -ntol,blanks(1:ia-2),0,blanks(1:ia-2),ntol
1000 format(5x,i3,a,i1,a,i3)
1000 format(4x,i4,a,i1,a,i3)
fac=1.0
if(smax/rms.gt.7.0) fac=7.0*rms/smax
k=0
do j=lag2,lag1,-1
t=j*dtstep
if(emedelay.eq.0.0 .and. abs(t).gt.1.0) cycle
do i=-ia,ia
k=i+ia+2
n=ccf(i,j)/rms
n=fac*ccf(i,j)/rms
if(n.lt.0) n=0
if(n.gt.6) n=6
line(k)=mark(n)
@ -261,7 +282,7 @@ subroutine zplot_q65(ccf,ia,lag1,lag2,rms,dtstep,ntol,emedelay)
line(1)='|'
line(k+1)='|'
write(34,1010) t,line(1:k+1)
1010 format(f5.2,1x,72a1)
1010 format(f5.2,1x,132a1)
enddo
close(34)

View File

@ -3305,7 +3305,7 @@ void MainWindow::to_jt9(qint32 n, qint32 istart, qint32 idone)
void MainWindow::decodeDone ()
{
if(m_mode!="FT8" or dec_data.params.nzhsym==50) m_nDecodes=0;
if(m_mode=="QRA64") m_wideGraph->drawRed(0,0);
if(m_mode=="QRA64" or m_mode=="Q65") m_wideGraph->drawRed(0,0);
if(m_mode=="Q65" and m_msgAvgWidget!=NULL) {
if(m_msgAvgWidget->isVisible()) {
@ -6442,7 +6442,8 @@ void MainWindow::on_actionQ65_triggered()
//### ui->sbSubmode->setMaximum(4);
ui->sbSubmode->setMaximum(7);
ui->sbSubmode->setValue(m_nSubMode);
m_wideGraph->setMode(m_mode);
QString fname {QDir::toNativeSeparators(m_config.temp_dir().absoluteFilePath ("red.dat"))};
m_wideGraph->setRedFile(fname);
m_wideGraph->setMode(m_mode);
m_wideGraph->setModeTx(m_modeTx);
m_wideGraph->setPeriod(m_TRperiod,6912);

View File

@ -224,7 +224,7 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
if(i==iz-1) {
painter2D.drawPolyline(LineBuf,j);
if(m_mode=="QRA64") {
if(m_mode=="QRA64" or m_mode=="Q65") {
painter2D.setPen(Qt::red);
painter2D.drawPolyline(LineBuf2,ktop);
}
@ -269,33 +269,28 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
painter2D.drawText(x1-4,y,"73");
}
if(bRed) {
std::ifstream f;
f.open(m_redFile.toLatin1());
if(f) {
int x,y;
float freq,sync;
float slimit=6.0;
QPen pen0(Qt::red,1);
painter1.setPen(pen0);
for(int i=0; i<99999; i++) {
f >> freq >> sync;
if(f.eof()) break;
x=XfromFreq(freq);
y=(sync-slimit)*3.0;
if(y>0) {
if(y>15.0) y=15.0;
if(x>=0 and x<=m_w) {
painter1.setPen(pen0);
painter1.drawLine(x,0,x,y);
}
}
}
f.close();
if(bRed and m_bQ65_Sync) {
int k=0;
std::ifstream f;
f.open(m_redFile.toLatin1());
if(f) {
int x,y;
float freq,sync;
for(int i=0; i<99999; i++) {
f >> freq >> sync;
if(f.eof()) break;
x=XfromFreq(freq);
y=m_h2*(0.9 - 0.09*gain2d*sync) - m_plot2dZero;
LineBuf2[k].setX(x);
LineBuf2[k].setY(y);
k++;
}
// m_bDecodeFinished=false;
f.close();
QPen pen0(Qt::red,2);
painter2D.setPen(pen0);
painter2D.drawPolyline(LineBuf2,k);
}
}
update(); //trigger a new paintEvent
m_bScaleOK=true;
}

View File

@ -80,6 +80,8 @@ public:
void setRxBand(QString band);
void setReference(bool b) {m_bReference = b;}
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 setVHF(bool bVHF);
void setRedFile(QString fRed);
@ -113,6 +115,7 @@ private:
bool m_bLinearAvg;
bool m_bReference;
bool m_bReference0;
bool m_bQ65_Sync;
bool m_bVHF;
bool m_bSingleDecode;

View File

@ -75,10 +75,12 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
ui->widePlot->setCumulative(m_settings->value("Cumulative",true).toBool());
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());
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);
int nbpp=m_settings->value("BinsPerPixel",2).toInt();
ui->widePlot->setBinsPerPixel(nbpp);
ui->sbPercent2dPlot->setValue(m_Percent2DScreen);
@ -135,6 +137,7 @@ void WideGraph::saveSettings() //saveS
m_settings->setValue ("Cumulative", ui->widePlot->cumulative());
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 ("BinsPerPixel", ui->widePlot->binsPerPixel ());
m_settings->setValue ("StartFreq", ui->widePlot->startFreq ());
m_settings->setValue ("WaterfallPalette", m_waterfallPalette);
@ -321,6 +324,7 @@ void WideGraph::on_spec2dComboBox_currentIndexChanged(int index)
ui->widePlot->setCumulative(false);
ui->widePlot->setLinearAvg(false);
ui->widePlot->setReference(false);
ui->widePlot->setQ65_Sync(false);
ui->smoSpinBox->setEnabled(false);
switch (index)
{
@ -337,6 +341,9 @@ void WideGraph::on_spec2dComboBox_currentIndexChanged(int index)
case 3: // Reference
ui->widePlot->setReference(true);
break;
case 4:
ui->widePlot->setQ65_Sync(true);
break;
}
replot();
}
@ -480,7 +487,7 @@ void WideGraph::on_gain2dSlider_valueChanged(int value) //Gain2
ui->widePlot->setPlot2dGain(value);
if(ui->widePlot->scaleOK ()) {
ui->widePlot->draw(swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
if(m_mode=="QRA64" or m_mode=="Q65") ui->widePlot->draw(swide,false,true);
}
}
@ -489,7 +496,7 @@ void WideGraph::on_zero2dSlider_valueChanged(int value) //Zero2
ui->widePlot->setPlot2dZero(value);
if(ui->widePlot->scaleOK ()) {
ui->widePlot->draw(swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
if(m_mode=="QRA64" or m_mode=="Q65") ui->widePlot->draw(swide,false,true);
}
}

View File

@ -335,6 +335,11 @@
<string>Reference</string>
</property>
</item>
<item>
<property name="text">
<string>Q65_Sync</string>
</property>
</item>
</widget>
</item>
<item row="0" column="2">