From 95ecd36cbb2f312f19aa3b25940d35e314bc31ef Mon Sep 17 00:00:00 2001 From: Jeff Long Date: Sat, 20 May 2023 08:00:49 -0400 Subject: [PATCH] dockfft: zoom slider uses log scale with max 100000x Signed-off-by: Jeff Long --- src/qtgui/dockfft.cpp | 8 +++++--- src/qtgui/dockfft.ui | 2 +- src/qtgui/plotter.cpp | 41 ++++++++--------------------------------- src/qtgui/plotter.h | 2 +- 4 files changed, 15 insertions(+), 38 deletions(-) diff --git a/src/qtgui/dockfft.cpp b/src/qtgui/dockfft.cpp index 10c8f9a5dc..4e02e4ee25 100644 --- a/src/qtgui/dockfft.cpp +++ b/src/qtgui/dockfft.cpp @@ -541,7 +541,8 @@ void DockFft::setWaterfallRange(float min, float max) void DockFft::setZoomLevel(float level) { ui->fftZoomSlider->blockSignals(true); - ui->fftZoomSlider->setValue((int) level); + float logZoom = 100.0f / 5.0f * log10f(level); + ui->fftZoomSlider->setValue(qRound(logZoom)); ui->zoomLevelLabel->setText(QString("%1x").arg((int) level)); ui->fftZoomSlider->blockSignals(false); } @@ -628,8 +629,9 @@ void DockFft::on_fftAvgSlider_valueChanged(int value) /** FFT zoom level changed */ void DockFft::on_fftZoomSlider_valueChanged(int level) { - ui->zoomLevelLabel->setText(QString("%1x").arg(level)); - emit fftZoomChanged((float)level); + float linearZoom = powf(10.0f, (float)level * 5.0f / 100.0f); + ui->zoomLevelLabel->setText(QString("%1x").arg(qRound(linearZoom))); + emit fftZoomChanged(linearZoom); } void DockFft::on_wfModeBox_currentIndexChanged(int index) diff --git a/src/qtgui/dockfft.ui b/src/qtgui/dockfft.ui index 4c9031a71e..0fe23dd0c4 100644 --- a/src/qtgui/dockfft.ui +++ b/src/qtgui/dockfft.ui @@ -298,7 +298,7 @@ Zoom level for frequency axis - 1 + 0 100 diff --git a/src/qtgui/plotter.cpp b/src/qtgui/plotter.cpp index f300432265..9aa664bb3c 100644 --- a/src/qtgui/plotter.cpp +++ b/src/qtgui/plotter.cpp @@ -910,28 +910,15 @@ void CPlotter::zoomStepX(float step, int x) } // calculate new range shown on FFT - double new_range = qBound(10.0, m_Span * (double)step, (double)m_SampleFreq * 10.0); + double new_range = (double)m_Span * (double)step; // Frequency where event occurred is kept fixed under mouse double ratio = (double)x / (qreal)m_Size.width() / m_DPR; qint64 fixed_hz = freqFromX(x); double f_max = (double)fixed_hz + (1.0 - ratio) * new_range; double f_min = f_max - new_range; - - // ensure we don't go beyond the rangelimits - bool limit_hit = false; - double lolim = (double)(m_CenterFreq) - (double)m_SampleFreq / 2.0; - double hilim = (double)m_CenterFreq + (double)m_SampleFreq / 2.0; - if (f_min < lolim) - { - f_min = lolim; - limit_hit = true; - } - if (f_max > hilim) - { - f_max = hilim; - limit_hit = true; - } + f_min = std::max(f_min, (double)m_CenterFreq - (double)m_SampleFreq / 2.0); + f_max = std::min(f_max, (double)m_CenterFreq + (double)m_SampleFreq / 2.0); // the new span quint32 new_span = qRound(f_max - f_min); @@ -940,18 +927,10 @@ void CPlotter::zoomStepX(float step, int x) new_span++; // keep span even to avoid rounding in span/2 } - // find new FFT center frequency - qint64 new_FftCenter; - if( limit_hit ) // cannot keep fixed_hz fixed - { - new_FftCenter = qRound64((f_min + f_max) / 2.0) - m_CenterFreq; - } - else // calculate new FFT center frequency that really keeps fixed_hz fixed - { - qint64 wouldbe_hz = (m_CenterFreq + m_FftCenter - new_span / 2) + ratio * new_span; - new_FftCenter = m_FftCenter + (fixed_hz - wouldbe_hz); - } + qint64 wouldbe_hz = (m_CenterFreq + m_FftCenter - new_span / 2) + ratio * new_span; + qint64 new_FftCenter = m_FftCenter + (fixed_hz - wouldbe_hz); setFftCenterFreq(new_FftCenter); + setSpanFreq(new_span); double factor = (double)m_SampleFreq / (double)m_Span; @@ -967,7 +946,7 @@ void CPlotter::zoomStepX(float step, int x) void CPlotter::zoomOnXAxis(float level) { float current_level = (float)m_SampleFreq / (float)m_Span; - zoomStepX(current_level / level, xFromFreq(m_DemodCenterFreq)); + zoomStepX(current_level / level, qRound((qreal)m_Size.width() * m_DPR / 2.0)); updateOverlay(); } @@ -1892,7 +1871,7 @@ void CPlotter::setNewFftData(const float *fftData, int size) double currentZoom = (double)m_SampleFreq / (double)m_Span; double maxZoom = (double)m_fftDataSize / 4.0; if (currentZoom > maxZoom) - zoomStepX(currentZoom / maxZoom, xFromFreq(m_CenterFreq + m_FftCenter)); + zoomStepX(currentZoom / maxZoom, qRound((qreal)m_Size.width() * m_DPR / 2.0)); } // For dBFS, define full scale as peak (not RMS). A 1.0 FS peak sine wave @@ -2351,10 +2330,6 @@ int CPlotter::xFromFreq(qint64 freq) + (double)m_FftCenter - (double)m_Span / 2.0; int x = qRound(w * ((double)freq - startFreq) / (double)m_Span); - if (x < 0) - return 0; - if (x > (int)w) - return w; return x; } diff --git a/src/qtgui/plotter.h b/src/qtgui/plotter.h index 69176821e0..ccf68d034a 100644 --- a/src/qtgui/plotter.h +++ b/src/qtgui/plotter.h @@ -113,7 +113,7 @@ class CPlotter : public QFrame } void setFftCenterFreq(qint64 f) { - qint64 limit = ((qint64)m_SampleFreq + m_Span) / 2 - 1; + qint64 limit = ((qint64)m_SampleFreq - m_Span) / 2 - 1; m_FftCenter = qBound(-limit, f, limit); }