Skip to content

Commit 97d4755

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

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

447447
// Set new zoom level
448-
zoomLevel = zoom;
449-
if (spectrogramPlot != nullptr)
450-
spectrogramPlot->setZoomLevel(zoom);
448+
zoomLevel = std::max(1,zoom);
449+
nfftSkip = std::max(1,-1*zoom);
450+
if (spectrogramPlot != nullptr) {
451+
spectrogramPlot->setZoomLevel(zoomLevel);
452+
spectrogramPlot->setSkip(nfftSkip);
453+
}
451454

452455
// Update horizontal (time) scrollbar
453456
horizontalScrollBar()->setSingleStep(10);
@@ -578,7 +581,7 @@ void PlotView::resizeEvent(QResizeEvent * event)
578581

579582
size_t PlotView::samplesPerColumn()
580583
{
581-
return fftSize / zoomLevel;
584+
return fftSize * nfftSkip / zoomLevel;
582585
}
583586

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

src/plotview.h

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

8080
int fftSize = 1024;
8181
int zoomLevel = 1;
82+
int nfftSkip = 1;
8283
int powerMin;
8384
int powerMax;
8485
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);
@@ -156,7 +156,13 @@ void SpectrogramControls::setDefaults()
156156
void SpectrogramControls::fftOrZoomChanged(void)
157157
{
158158
int fftSize = pow(2, fftSizeSlider->value());
159-
int zoomLevel = std::min(fftSize, (int)pow(2, zoomLevelSlider->value()));
159+
int zoomLevel = zoomLevelSlider->value();
160+
if (zoomLevel >= 0)
161+
// zooming in by power-of-two steps
162+
zoomLevel = std::min(fftSize, (int)pow(2, zoomLevel));
163+
else
164+
// zooming out (skipping FFTs) by power-of-two steps
165+
zoomLevel = -1*std::min(fftSize, (int)pow(2, -1*zoomLevel));
160166
emit fftOrZoomChanged(fftSize, zoomLevel);
161167
}
162168

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

250251
QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
251252
{
252-
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, tile));
253+
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
253254
if (obj != 0)
254255
return obj;
255256

@@ -268,13 +269,13 @@ QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
268269
}
269270
}
270271
obj->convertFromImage(image);
271-
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, tile), obj);
272+
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), obj);
272273
return obj;
273274
}
274275

275276
float* SpectrogramPlot::getFFTTile(size_t tile)
276277
{
277-
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, tile));
278+
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
278279
if (obj != nullptr)
279280
return obj->data();
280281

@@ -286,7 +287,7 @@ float* SpectrogramPlot::getFFTTile(size_t tile)
286287
sample += getStride();
287288
ptr += fftSize;
288289
}
289-
fftCache.insert(TileCacheKey(fftSize, zoomLevel, tile), destStorage);
290+
fftCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), destStorage);
290291
return destStorage->data();
291292
}
292293

@@ -323,7 +324,7 @@ void SpectrogramPlot::getLine(float *dest, size_t sample)
323324

324325
int SpectrogramPlot::getStride()
325326
{
326-
return fftSize / zoomLevel;
327+
return fftSize * nfftSkip / zoomLevel;
327328
}
328329

329330
float SpectrogramPlot::getTunerPhaseInc()
@@ -404,6 +405,11 @@ void SpectrogramPlot::setZoomLevel(int zoom)
404405
zoomLevel = zoom;
405406
}
406407

408+
void SpectrogramPlot::setSkip(int skip)
409+
{
410+
nfftSkip = skip;
411+
}
412+
407413
void SpectrogramPlot::setSampleRate(double rate)
408414
{
409415
sampleRate = rate;

src/spectrogramplot.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public slots:
6262
void setPowerMax(int power);
6363
void setPowerMin(int power);
6464
void setZoomLevel(int zoom);
65+
void setSkip(int skip);
6566
void tunerMoved();
6667

6768
private:
@@ -78,6 +79,7 @@ public slots:
7879

7980
int fftSize;
8081
int zoomLevel;
82+
int nfftSkip;
8183
float powerMax;
8284
float powerMin;
8385
double sampleRate;
@@ -104,20 +106,23 @@ class TileCacheKey
104106
{
105107

106108
public:
107-
TileCacheKey(int fftSize, int zoomLevel, size_t sample) {
109+
TileCacheKey(int fftSize, int zoomLevel, int nfftSkip, size_t sample) {
108110
this->fftSize = fftSize;
109111
this->zoomLevel = zoomLevel;
112+
this->nfftSkip = nfftSkip;
110113
this->sample = sample;
111114
}
112115

113116
bool operator==(const TileCacheKey &k2) const {
114117
return (this->fftSize == k2.fftSize) &&
115118
(this->zoomLevel == k2.zoomLevel) &&
119+
(this->nfftSkip == k2.nfftSkip) &&
116120
(this->sample == k2.sample);
117121
}
118122

119123
int fftSize;
120124
int zoomLevel;
125+
int nfftSkip;
121126
size_t sample;
122127
};
123128

0 commit comments

Comments
 (0)