Skip to content

Commit c478c2a

Browse files
author
Jacob Gilbert
committed
adding fft skip / zoom out
Signed-off-by: Jacob Gilbert <jacob.gilbert@protonmail.com>
1 parent a4e4ad2 commit c478c2a

File tree

5 files changed

+33
-12
lines changed

5 files changed

+33
-12
lines changed

src/plotview.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -395,9 +395,12 @@ void PlotView::setFFTAndZoom(int size, int zoom)
395395
spectrogramPlot->setFFTSize(size);
396396

397397
// Set new zoom level
398-
zoomLevel = zoom;
399-
if (spectrogramPlot != nullptr)
400-
spectrogramPlot->setZoomLevel(zoom);
398+
zoomLevel = std::max(1,zoom);
399+
nfftSkip = std::max(1,-1*zoom);
400+
if (spectrogramPlot != nullptr) {
401+
spectrogramPlot->setZoomLevel(zoomLevel);
402+
spectrogramPlot->setSkip(nfftSkip);
403+
}
401404

402405
// Update horizontal (time) scrollbar
403406
horizontalScrollBar()->setSingleStep(10);
@@ -524,7 +527,7 @@ void PlotView::resizeEvent(QResizeEvent * event)
524527

525528
size_t PlotView::samplesPerColumn()
526529
{
527-
return fftSize / zoomLevel;
530+
return fftSize * nfftSkip / zoomLevel;
528531
}
529532

530533
void PlotView::scrollContentsBy(int dx, int dy)

src/plotview.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public slots:
7373

7474
int fftSize = 1024;
7575
int zoomLevel = 1;
76+
int nfftSkip = 1;
7677
int powerMin;
7778
int powerMax;
7879
bool cursorsEnabled;

src/spectrogramcontrols.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ SpectrogramControls::SpectrogramControls(const QString & title, QWidget * parent
5252
layout->addRow(new QLabel(tr("FFT size:")), fftSizeSlider);
5353

5454
zoomLevelSlider = new QSlider(Qt::Horizontal, widget);
55-
zoomLevelSlider->setRange(0, 10);
55+
zoomLevelSlider->setRange(-6, 10);
5656
zoomLevelSlider->setPageStep(1);
5757

5858
layout->addRow(new QLabel(tr("Zoom:")), zoomLevelSlider);
@@ -139,7 +139,13 @@ void SpectrogramControls::setDefaults()
139139
void SpectrogramControls::fftOrZoomChanged(void)
140140
{
141141
int fftSize = pow(2, fftSizeSlider->value());
142-
int zoomLevel = std::min(fftSize, (int)pow(2, zoomLevelSlider->value()));
142+
int zoomLevel = zoomLevelSlider->value();
143+
if (zoomLevel >= 0)
144+
// zooming in by power-of-two steps
145+
zoomLevel = std::min(fftSize, (int)pow(2, zoomLevel));
146+
else
147+
// zooming out (skipping FFTs) by power-of-two steps
148+
zoomLevel = -1*std::min(fftSize, (int)pow(2, -1*zoomLevel));
143149
emit fftOrZoomChanged(fftSize, zoomLevel);
144150
}
145151

src/spectrogramplot.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ SpectrogramPlot::SpectrogramPlot(std::shared_ptr<SampleSource<std::complex<float
3535
{
3636
setFFTSize(fftSize);
3737
zoomLevel = 1;
38+
nfftSkip = 1;
3839
powerMax = 0.0f;
3940
powerMin = -50.0f;
4041
sampleRate = 0;
@@ -222,7 +223,7 @@ void SpectrogramPlot::paintMid(QPainter &painter, QRect &rect, range_t<size_t> s
222223

223224
QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
224225
{
225-
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, tile));
226+
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
226227
if (obj != 0)
227228
return obj;
228229

@@ -241,13 +242,13 @@ QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
241242
}
242243
}
243244
obj->convertFromImage(image);
244-
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, tile), obj);
245+
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), obj);
245246
return obj;
246247
}
247248

248249
float* SpectrogramPlot::getFFTTile(size_t tile)
249250
{
250-
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, tile));
251+
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
251252
if (obj != nullptr)
252253
return obj->data();
253254

@@ -259,7 +260,7 @@ float* SpectrogramPlot::getFFTTile(size_t tile)
259260
sample += getStride();
260261
ptr += fftSize;
261262
}
262-
fftCache.insert(TileCacheKey(fftSize, zoomLevel, tile), destStorage);
263+
fftCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), destStorage);
263264
return destStorage->data();
264265
}
265266

@@ -296,7 +297,7 @@ void SpectrogramPlot::getLine(float *dest, size_t sample)
296297

297298
int SpectrogramPlot::getStride()
298299
{
299-
return fftSize / zoomLevel;
300+
return fftSize * nfftSkip / zoomLevel;
300301
}
301302

302303
float SpectrogramPlot::getTunerPhaseInc()
@@ -377,6 +378,11 @@ void SpectrogramPlot::setZoomLevel(int zoom)
377378
zoomLevel = zoom;
378379
}
379380

381+
void SpectrogramPlot::setSkip(int skip)
382+
{
383+
nfftSkip = skip;
384+
}
385+
380386
void SpectrogramPlot::setSampleRate(double rate)
381387
{
382388
sampleRate = rate;

src/spectrogramplot.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public slots:
5454
void setPowerMax(int power);
5555
void setPowerMin(int power);
5656
void setZoomLevel(int zoom);
57+
void setSkip(int skip);
5758
void tunerMoved();
5859

5960
private:
@@ -69,6 +70,7 @@ public slots:
6970

7071
int fftSize;
7172
int zoomLevel;
73+
int nfftSkip;
7274
float powerMax;
7375
float powerMin;
7476
double sampleRate;
@@ -92,19 +94,22 @@ class TileCacheKey
9294
{
9395

9496
public:
95-
TileCacheKey(int fftSize, int zoomLevel, size_t sample) {
97+
TileCacheKey(int fftSize, int zoomLevel, int nfftSkip, size_t sample) {
9698
this->fftSize = fftSize;
9799
this->zoomLevel = zoomLevel;
100+
this->nfftSkip = nfftSkip;
98101
this->sample = sample;
99102
}
100103

101104
bool operator==(const TileCacheKey &k2) const {
102105
return (this->fftSize == k2.fftSize) &&
103106
(this->zoomLevel == k2.zoomLevel) &&
107+
(this->nfftSkip == k2.nfftSkip) &&
104108
(this->sample == k2.sample);
105109
}
106110

107111
int fftSize;
108112
int zoomLevel;
113+
int nfftSkip;
109114
size_t sample;
110115
};

0 commit comments

Comments
 (0)