From b27f51bbe330322bf347d29fd7b8ca3bdb91629e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 12 Jan 2018 20:40:15 +0000 Subject: [PATCH] Improve sensitivity of waterfall for detecting weak narrowband signals. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8403 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- CMakeLists.txt | 1 + lib/plotsave.f90 | 38 ++++++++++++++++++++++++++++++++++++++ plotter.cpp | 20 +++++++++++++++----- plotter.h | 2 ++ widegraph.cpp | 39 +++++++++++++++++++++++++++++++++++---- widegraph.h | 23 ++++++++++++++++------- 6 files changed, 107 insertions(+), 16 deletions(-) create mode 100644 lib/plotsave.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index cd74059f2..fbffa2a2a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -523,6 +523,7 @@ set (wsjt_FSRCS lib/pctile.f90 lib/peakdt9.f90 lib/peakup.f90 + lib/plotsave.f90 lib/polyfit.f90 lib/fsk4hf/polyfit4.f90 lib/prog_args.f90 diff --git a/lib/plotsave.f90 b/lib/plotsave.f90 new file mode 100644 index 000000000..9da8a7d33 --- /dev/null +++ b/lib/plotsave.f90 @@ -0,0 +1,38 @@ +subroutine plotsave(splot,ka,nbpp,irow,jz,swide) + + parameter (NSMAX=6827,NYMAX=64) + real splot(NSMAX) + real spsave(NSMAX,NYMAX) + real swide(jz) + real s(NSMAX),tmp(NSMAX) + data ncall/0/ + save ncall,spsave + + if(irow.lt.0) then +! Save a new row of data + ncall=ncall+1 + k=mod(ncall-1,NYMAX) + 1 + spsave(1:NSMAX,k)=splot + else +! Process and return the saved "irow" as swide(), for a waterfall replot. + k=mod(NYMAX+ncall-1-irow,NYMAX) + 1 + if(nbpp.eq.1) then + swide=spsave(1:jz,k) + else + s=spsave(1:NSMAX,k) + call smo(s,NSMAX,tmp,nbpp) + k=ka + do j=1,jz + smax=0. + do i=1,nbpp + k=k+1 + if(k.lt.1 .or. k.gt.NSMAX) exit + smax=max(smax,s(k)) + enddo + swide(j)=smax + enddo + endif + endif + + return +end subroutine plotsave diff --git a/plotter.cpp b/plotter.cpp index 1c60d0277..54a9e9b97 100644 --- a/plotter.cpp +++ b/plotter.cpp @@ -116,12 +116,13 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed) double fac = sqrt(m_binsPerPixel*m_waterfallAvg/15.0); double gain = fac*pow(10.0,0.02*m_plotGain); double gain2d = pow(10.0,0.02*(m_plot2dGain)); + bool bReplot=swide[MAX_SCREENSIZE-1] == -99.0; if(m_bReference != m_bReference0) resizeEvent(NULL); m_bReference0=m_bReference; //move current data down one line (must do this before attaching a QPainter object) - if(bScroll) m_WaterfallPixmap.scroll(0,1,0,0,m_w,m_h1); + if(bScroll and !bReplot) m_WaterfallPixmap.scroll(0,1,0,0,m_w,m_h1); QPainter painter1(&m_WaterfallPixmap); m_2DPixmap = m_OverlayPixmap.copy(0,0,m_w,m_h2); QPainter painter2D(&m_2DPixmap); @@ -146,15 +147,15 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed) int jz=iz*m_binsPerPixel; m_fMax=FreqfromX(iz); - m_line++; - if(bScroll) { + if(bScroll and swide[0]<1.e29) { flat4_(swide,&iz,&m_Flatten); - flat4_(&dec_data.savg[j0],&jz,&m_Flatten); + if(!bReplot) flat4_(&dec_data.savg[j0],&jz,&m_Flatten); } ymin=1.e30; if(swide[0]>1.e29 and swide[0]< 1.5e30) painter1.setPen(Qt::green); if(swide[0]>1.4e30) painter1.setPen(Qt::yellow); + if(!bReplot) m_j=0; for(int i=0; i254) y1=254; if (swide[i]<1.e29) painter1.setPen(g_ColorTbl[y1]); - painter1.drawPoint(i,0); + painter1.drawPoint(i,m_j); } + if(bReplot) return; + m_line++; float y2min=1.e30; float y2max=-1.e30; for(int i=0; iwidePlot->startFreq()/df3 + 0.5); int jz=5000.0/(nbpp*df3); if(jz>MAX_SCREENSIZE) jz=MAX_SCREENSIZE; + m_jz=jz; for (int j=0; jss) ss=splot[i]; - i++; + float sp=splot[i++]; + ss += sp; + smax=qMax(smax,sp); } +// swide[j]=nbpp*smax; swide[j]=nbpp*ss; } @@ -184,25 +188,33 @@ void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dat if((ndiskdata && ihsym <= m_waterfallAvg) || (!ndiskdata && ntrwidePlot->draw(swide,true,false); + int irow=-1; + int ka=0; + plotsave_(splot,&ka,&nbpp,&irow,&jz,swide); } } void WideGraph::on_bppSpinBox_valueChanged(int n) //bpp { ui->widePlot->setBinsPerPixel(n); + replot(); } void WideGraph::on_waterfallAvgSpinBox_valueChanged(int n) //Navg { m_waterfallAvg = n; ui->widePlot->setWaterfallAvg(n); + replot(); } void WideGraph::keyPressEvent(QKeyEvent *e) //F11, F12 @@ -362,6 +374,7 @@ void WideGraph::setRxBand (QString const& band) void WideGraph::on_fStartSpinBox_valueChanged(int n) //fStart { ui->widePlot->setStartFreq(n); + replot(); } void WideGraph::readPalette () //readPalette @@ -387,6 +400,7 @@ void WideGraph::on_paletteComboBox_activated (QString const& palette) //palet { m_waterfallPalette = palette; readPalette(); + replot(); } void WideGraph::on_cbFlatten_toggled(bool b) //Flatten On/Off @@ -397,6 +411,7 @@ void WideGraph::on_cbFlatten_toggled(bool b) //Flatten ui->cbRef->setChecked(false); } ui->widePlot->setFlatten(m_bFlatten,m_bRef); + replot(); } void WideGraph::on_cbRef_toggled(bool b) @@ -407,6 +422,7 @@ void WideGraph::on_cbRef_toggled(bool b) ui->cbFlatten->setChecked(false); } ui->widePlot->setFlatten(m_bFlatten,m_bRef); + replot(); } void WideGraph::on_cbControls_toggled(bool b) @@ -444,11 +460,26 @@ bool WideGraph::useRef() //Flatten void WideGraph::on_gainSlider_valueChanged(int value) //Gain { ui->widePlot->setPlotGain(value); + replot(); +} + +void WideGraph::replot() +{ + if(!ui->widePlot->scaleOK()) return; + int nbpp = ui->widePlot->binsPerPixel(); + float splot=0.0; + int ka=int(ui->widePlot->startFreq()/0.732422 + 0.5) - 1; + for(int irow=0; irow<64; irow++) { + plotsave_(&splot,&ka,&nbpp,&irow,&m_jz,swide); + swide[MAX_SCREENSIZE-1]=-99.0; + ui->widePlot->replot(swide,true,false,irow); + } } void WideGraph::on_zeroSlider_valueChanged(int value) //Zero { ui->widePlot->setPlotZero(value); + replot(); } void WideGraph::on_gain2dSlider_valueChanged(int value) //Gain2 diff --git a/widegraph.h b/widegraph.h index 1ec7a5f0e..4533df1fc 100644 --- a/widegraph.h +++ b/widegraph.h @@ -84,32 +84,41 @@ private slots: void on_sbPercent2dPlot_valueChanged(int n); private: - void readPalette (); - void setRxRange (); + void readPalette (); + void setRxRange (); + void replot(); QScopedPointer ui; QSettings * m_settings; QDir m_palettes_path; WFPalette m_userPalette; + QHash m_fMinPerBand; qint32 m_waterfallAvg; qint32 m_TRperiod; qint32 m_nsps; qint32 m_ntr0; - QHash m_fMinPerBand; qint32 m_fMax; - QString m_rxBand; qint32 m_nSubMode; qint32 m_nsmo; - qint32 m_Percent2DScreen; + qint32 m_Percent2DScreen; + qint32 m_jz=MAX_SCREENSIZE; + qint32 m_n; + bool m_bFlatten; bool m_bRef; bool m_bHaveTransmitted; //Set true at end of a WSPR transmission + + QString m_rxBand; QString m_mode; QString m_modeTx; - QString m_waterfallPalette; - int m_n; + QString m_waterfallPalette; }; +extern "C" { + void plotsave_(float splot[], int* ka, int* nbpp, int* irow, int* jz, float swide[]); +} + + #endif // WIDEGRAPH_H