diff --git a/sdrgui/gui/glspectrum.cpp b/sdrgui/gui/glspectrum.cpp index 112bed8bd..43239d058 100644 --- a/sdrgui/gui/glspectrum.cpp +++ b/sdrgui/gui/glspectrum.cpp @@ -250,6 +250,15 @@ void GLSpectrum::setTimingRate(qint32 timingRate) update(); } +void GLSpectrum::setFFTOverlap(int overlap) +{ + m_mutex.lock(); + m_fftOverlap = overlap; + m_changesPending = true; + m_mutex.unlock(); + update(); +} + void GLSpectrum::setDisplayWaterfall(bool display) { m_mutex.lock(); @@ -1292,6 +1301,8 @@ void GLSpectrum::applyChanges() if (m_sampleRate > 0) { float scaleDiv = ((float)m_sampleRate / (float)m_timingRate) * (m_ssbSpectrum ? 2 : 1); + float halfFFTSize = m_fftSize / 2; + scaleDiv *= halfFFTSize / (halfFFTSize - m_fftOverlap); if (!m_invertedWaterfall) { m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, (m_waterfallHeight * m_fftSize) / scaleDiv, 0); @@ -1393,6 +1404,8 @@ void GLSpectrum::applyChanges() if (m_sampleRate > 0) { float scaleDiv = ((float)m_sampleRate / (float)m_timingRate) * (m_ssbSpectrum ? 2 : 1); + float halfFFTSize = m_fftSize / 2; + scaleDiv *= halfFFTSize / (halfFFTSize - m_fftOverlap); if (!m_invertedWaterfall) { m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, (m_waterfallHeight * m_fftSize) / scaleDiv, 0); diff --git a/sdrgui/gui/glspectrum.h b/sdrgui/gui/glspectrum.h index d9e31ce67..63613e3c7 100644 --- a/sdrgui/gui/glspectrum.h +++ b/sdrgui/gui/glspectrum.h @@ -80,6 +80,7 @@ public: void setCenterFrequency(qint64 frequency); void setSampleRate(qint32 sampleRate); void setTimingRate(qint32 timingRate); + void setFFTOverlap(int overlap); void setReferenceLevel(Real referenceLevel); void setPowerRange(Real powerRange); void setDecay(int decay); @@ -248,6 +249,7 @@ private: int m_decay; quint32 m_sampleRate; quint32 m_timingRate; + int m_fftOverlap; int m_fftSize; diff --git a/sdrgui/gui/glspectrumgui.cpp b/sdrgui/gui/glspectrumgui.cpp index 2b07d1542..7090de2be 100644 --- a/sdrgui/gui/glspectrumgui.cpp +++ b/sdrgui/gui/glspectrumgui.cpp @@ -522,6 +522,10 @@ void GLSpectrumGUI::setMaximumOverlap() ui->fftOverlap->setMaximum((m_settings.m_fftSize/2)-1); int value = ui->fftOverlap->value(); ui->fftOverlapText->setText(tr("%1").arg(value)); + + if (m_glSpectrum) { + m_glSpectrum->setFFTOverlap(value); + } } bool GLSpectrumGUI::handleMessage(const Message& message)