Skip to content

Commit d5c8e8a

Browse files
Jacob Gilbertjacobagilbert
authored andcommitted
adding fft skip / zoom out
Signed-off-by: Jacob Gilbert <jacob.gilbert@protonmail.com>
1 parent 290572e commit d5c8e8a

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
@@ -439,9 +439,12 @@ void PlotView::setFFTAndZoom(int size, int zoom)
439439
spectrogramPlot->setFFTSize(size);
440440

441441
// Set new zoom level
442-
zoomLevel = zoom;
443-
if (spectrogramPlot != nullptr)
444-
spectrogramPlot->setZoomLevel(zoom);
442+
zoomLevel = std::max(1,zoom);
443+
nfftSkip = std::max(1,-1*zoom);
444+
if (spectrogramPlot != nullptr) {
445+
spectrogramPlot->setZoomLevel(zoomLevel);
446+
spectrogramPlot->setSkip(nfftSkip);
447+
}
445448

446449
// Update horizontal (time) scrollbar
447450
horizontalScrollBar()->setSingleStep(10);
@@ -568,7 +571,7 @@ void PlotView::resizeEvent(QResizeEvent * event)
568571

569572
size_t PlotView::samplesPerColumn()
570573
{
571-
return fftSize / zoomLevel;
574+
return fftSize * nfftSkip / zoomLevel;
572575
}
573576

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

src/plotview.h

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

7878
int fftSize = 1024;
7979
int zoomLevel = 1;
80+
int nfftSkip = 1;
8081
int powerMin;
8182
int powerMax;
8283
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);
@@ -151,7 +151,13 @@ void SpectrogramControls::setDefaults()
151151
void SpectrogramControls::fftOrZoomChanged(void)
152152
{
153153
int fftSize = pow(2, fftSizeSlider->value());
154-
int zoomLevel = std::min(fftSize, (int)pow(2, zoomLevelSlider->value()));
154+
int zoomLevel = zoomLevelSlider->value();
155+
if (zoomLevel >= 0)
156+
// zooming in by power-of-two steps
157+
zoomLevel = std::min(fftSize, (int)pow(2, zoomLevel));
158+
else
159+
// zooming out (skipping FFTs) by power-of-two steps
160+
zoomLevel = -1*std::min(fftSize, (int)pow(2, -1*zoomLevel));
155161
emit fftOrZoomChanged(fftSize, zoomLevel);
156162
}
157163

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;
@@ -242,7 +243,7 @@ void SpectrogramPlot::paintMid(QPainter &painter, QRect &rect, range_t<size_t> s
242243

243244
QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
244245
{
245-
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, tile));
246+
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
246247
if (obj != 0)
247248
return obj;
248249

@@ -261,13 +262,13 @@ QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
261262
}
262263
}
263264
obj->convertFromImage(image);
264-
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, tile), obj);
265+
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), obj);
265266
return obj;
266267
}
267268

268269
float* SpectrogramPlot::getFFTTile(size_t tile)
269270
{
270-
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, tile));
271+
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
271272
if (obj != nullptr)
272273
return obj->data();
273274

@@ -279,7 +280,7 @@ float* SpectrogramPlot::getFFTTile(size_t tile)
279280
sample += getStride();
280281
ptr += fftSize;
281282
}
282-
fftCache.insert(TileCacheKey(fftSize, zoomLevel, tile), destStorage);
283+
fftCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), destStorage);
283284
return destStorage->data();
284285
}
285286

@@ -316,7 +317,7 @@ void SpectrogramPlot::getLine(float *dest, size_t sample)
316317

317318
int SpectrogramPlot::getStride()
318319
{
319-
return fftSize / zoomLevel;
320+
return fftSize * nfftSkip / zoomLevel;
320321
}
321322

322323
float SpectrogramPlot::getTunerPhaseInc()
@@ -397,6 +398,11 @@ void SpectrogramPlot::setZoomLevel(int zoom)
397398
zoomLevel = zoom;
398399
}
399400

401+
void SpectrogramPlot::setSkip(int skip)
402+
{
403+
nfftSkip = skip;
404+
}
405+
400406
void SpectrogramPlot::setSampleRate(double rate)
401407
{
402408
sampleRate = rate;

src/spectrogramplot.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public slots:
6060
void setPowerMax(int power);
6161
void setPowerMin(int power);
6262
void setZoomLevel(int zoom);
63+
void setSkip(int skip);
6364
void tunerMoved();
6465

6566
private:
@@ -76,6 +77,7 @@ public slots:
7677

7778
int fftSize;
7879
int zoomLevel;
80+
int nfftSkip;
7981
float powerMax;
8082
float powerMin;
8183
double sampleRate;
@@ -100,20 +102,23 @@ class TileCacheKey
100102
{
101103

102104
public:
103-
TileCacheKey(int fftSize, int zoomLevel, size_t sample) {
105+
TileCacheKey(int fftSize, int zoomLevel, int nfftSkip, size_t sample) {
104106
this->fftSize = fftSize;
105107
this->zoomLevel = zoomLevel;
108+
this->nfftSkip = nfftSkip;
106109
this->sample = sample;
107110
}
108111

109112
bool operator==(const TileCacheKey &k2) const {
110113
return (this->fftSize == k2.fftSize) &&
111114
(this->zoomLevel == k2.zoomLevel) &&
115+
(this->nfftSkip == k2.nfftSkip) &&
112116
(this->sample == k2.sample);
113117
}
114118

115119
int fftSize;
116120
int zoomLevel;
121+
int nfftSkip;
117122
size_t sample;
118123
};
119124

0 commit comments

Comments
 (0)