Skip to content

Commit 455b034

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

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

454454
// Set new zoom level
455-
zoomLevel = zoom;
456-
if (spectrogramPlot != nullptr)
457-
spectrogramPlot->setZoomLevel(zoom);
455+
zoomLevel = std::max(1,zoom);
456+
nfftSkip = std::max(1,-1*zoom);
457+
if (spectrogramPlot != nullptr) {
458+
spectrogramPlot->setZoomLevel(zoomLevel);
459+
spectrogramPlot->setSkip(nfftSkip);
460+
}
458461

459462
// Update horizontal (time) scrollbar
460463
horizontalScrollBar()->setSingleStep(10);
@@ -585,7 +588,7 @@ void PlotView::resizeEvent(QResizeEvent * event)
585588

586589
size_t PlotView::samplesPerColumn()
587590
{
588-
return fftSize / zoomLevel;
591+
return fftSize * nfftSkip / zoomLevel;
589592
}
590593

591594
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
@@ -37,6 +37,7 @@ SpectrogramPlot::SpectrogramPlot(std::shared_ptr<SampleSource<std::complex<float
3737
{
3838
setFFTSize(fftSize);
3939
zoomLevel = 1;
40+
nfftSkip = 1;
4041
powerMax = 0.0f;
4142
powerMin = -50.0f;
4243
sampleRate = 0;
@@ -251,7 +252,7 @@ void SpectrogramPlot::paintMid(QPainter &painter, QRect &rect, range_t<size_t> s
251252

252253
QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
253254
{
254-
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, tile));
255+
QPixmap *obj = pixmapCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
255256
if (obj != 0)
256257
return obj;
257258

@@ -270,13 +271,13 @@ QPixmap* SpectrogramPlot::getPixmapTile(size_t tile)
270271
}
271272
}
272273
obj->convertFromImage(image);
273-
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, tile), obj);
274+
pixmapCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), obj);
274275
return obj;
275276
}
276277

277278
float* SpectrogramPlot::getFFTTile(size_t tile)
278279
{
279-
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, tile));
280+
std::array<float, tileSize>* obj = fftCache.object(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile));
280281
if (obj != nullptr)
281282
return obj->data();
282283

@@ -288,7 +289,7 @@ float* SpectrogramPlot::getFFTTile(size_t tile)
288289
sample += getStride();
289290
ptr += fftSize;
290291
}
291-
fftCache.insert(TileCacheKey(fftSize, zoomLevel, tile), destStorage);
292+
fftCache.insert(TileCacheKey(fftSize, zoomLevel, nfftSkip, tile), destStorage);
292293
return destStorage->data();
293294
}
294295

@@ -331,7 +332,7 @@ void SpectrogramPlot::getLine(float *dest, size_t sample)
331332

332333
int SpectrogramPlot::getStride()
333334
{
334-
return fftSize / zoomLevel;
335+
return fftSize * nfftSkip / zoomLevel;
335336
}
336337

337338
float SpectrogramPlot::getTunerPhaseInc()
@@ -412,6 +413,11 @@ void SpectrogramPlot::setZoomLevel(int zoom)
412413
zoomLevel = zoom;
413414
}
414415

416+
void SpectrogramPlot::setSkip(int skip)
417+
{
418+
nfftSkip = skip;
419+
}
420+
415421
void SpectrogramPlot::setSampleRate(double rate)
416422
{
417423
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)