Skip to content

Commit

Permalink
dockfft: zoom slider uses log scale with max 100000x
Browse files Browse the repository at this point in the history
Signed-off-by: Jeff Long <[email protected]>
  • Loading branch information
willcode committed Jun 19, 2023
1 parent 09a8de5 commit 0597b35
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 37 deletions.
8 changes: 5 additions & 3 deletions src/qtgui/dockfft.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/qtgui/dockfft.ui
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@
<string>Zoom level for frequency axis</string>
</property>
<property name="minimum">
<number>1</number>
<number>0</number>
</property>
<property name="maximum">
<number>100</number>
Expand Down
41 changes: 8 additions & 33 deletions src/qtgui/plotter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -907,48 +907,25 @@ 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 = 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;
}

// the new span
quint32 new_span = qRound(f_max - f_min);
if( new_span & 1 )
{
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;
Expand All @@ -964,7 +941,7 @@ void CPlotter::zoomStepX(float step, int x)
void CPlotter::zoomOnXAxis(float level)
{
double current_level = (double)m_SampleFreq / (double)m_Span;
zoomStepX(current_level / level, xFromFreq(m_DemodCenterFreq));
zoomStepX(current_level / level, qRound((qreal)m_Size.width() * m_DPR / 2.0));
updateOverlay();
}

Expand Down Expand Up @@ -1525,6 +1502,7 @@ void CPlotter::draw(bool newData)
{
m_2DPixmap.fill(PLOTTER_BGD_COLOR);
QPainter painter2(&m_2DPixmap);
painter2.translate(QPointF(0.5, 0.5));

// Update histogram IIR
const double frameTime = 1.0 / (double)fft_rate;
Expand Down Expand Up @@ -1882,7 +1860,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
Expand Down Expand Up @@ -1996,6 +1974,7 @@ void CPlotter::drawOverlay()

m_OverlayPixmap.fill(Qt::transparent);
QPainter painter(&m_OverlayPixmap);
painter.translate(QPointF(-0.5, -0.5));
// painter.setRenderHint(QPainter::Antialiasing);
painter.setFont(m_Font);

Expand Down Expand Up @@ -2343,10 +2322,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;
}

Expand Down

0 comments on commit 0597b35

Please sign in to comment.