diff --git a/mainwindow.cpp b/mainwindow.cpp index fb61e3e..ed6ba5f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -12,8 +12,9 @@ MainWindow::MainWindow() dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); addDockWidget(Qt::LeftDockWidgetArea, dock); - connect(dock, SIGNAL(fftSizeChanged(int)), &spectrogram, SLOT(setFFTSize(int))); connect(dock->fileOpenButton, SIGNAL(clicked()), &spectrogram, SLOT(pickFile())); + connect(dock, SIGNAL(fftSizeChanged(int)), &spectrogram, SLOT(setFFTSize(int))); + connect(dock->zoomLevelSlider, SIGNAL(valueChanged(int)), &spectrogram, SLOT(setZoomLevel(int))); connect(dock->powerMaxSlider, SIGNAL(valueChanged(int)), &spectrogram, SLOT(setPowerMax(int))); connect(dock->powerMinSlider, SIGNAL(valueChanged(int)), &spectrogram, SLOT(setPowerMin(int))); } \ No newline at end of file diff --git a/spectrogram.cpp b/spectrogram.cpp index d258525..f4d3f5e 100644 --- a/spectrogram.cpp +++ b/spectrogram.cpp @@ -141,7 +141,7 @@ void Spectrogram::getLine(float *dest, int y) { if (inputSource && fft) { fftwf_complex buffer[fftSize]; - inputSource->getSamples(buffer, y * fftSize, fftSize); + inputSource->getSamples(buffer, y * getStride(), fftSize); for (int i = 0; i < fftSize; i++) { buffer[i][0] *= window[i]; @@ -187,10 +187,21 @@ void Spectrogram::setPowerMin(int power) update(); } +void Spectrogram::setZoomLevel(int zoom) +{ + zoomLevel = clamp(zoom, 0, (int)log2(fftSize)); + update(); +} + int Spectrogram::getHeight() { if (!inputSource) return 0; - return inputSource->getSampleCount() / fftSize; -} \ No newline at end of file + return inputSource->getSampleCount() / getStride(); +} + +int Spectrogram::getStride() +{ + return fftSize / pow(2, zoomLevel); +} diff --git a/spectrogram.h b/spectrogram.h index 537c607..b2a1ecc 100644 --- a/spectrogram.h +++ b/spectrogram.h @@ -19,6 +19,7 @@ public slots: void setFFTSize(int size); void setPowerMax(int power); void setPowerMin(int power); + void setZoomLevel(int zoom); protected: void paintEvent(QPaintEvent *event); @@ -37,4 +38,5 @@ private: void getLine(float *dest, int y); int getHeight(); + int getStride(); }; \ No newline at end of file diff --git a/spectrogramcontrols.cpp b/spectrogramcontrols.cpp index f9e7f13..6b7755d 100644 --- a/spectrogramcontrols.cpp +++ b/spectrogramcontrols.cpp @@ -15,6 +15,11 @@ SpectrogramControls::SpectrogramControls(const QString & title, QWidget * parent fftSizeSlider->setValue(10); layout->addRow(new QLabel(tr("FFT size:")), fftSizeSlider); + zoomLevelSlider = new QSlider(Qt::Horizontal, widget); + zoomLevelSlider->setRange(0, 5); + zoomLevelSlider->setValue(0); + layout->addRow(new QLabel(tr("Zoom:")), zoomLevelSlider); + powerMaxSlider = new QSlider(Qt::Horizontal, widget); powerMaxSlider->setRange(-100, 20); powerMaxSlider->setValue(0); diff --git a/spectrogramcontrols.h b/spectrogramcontrols.h index c675c0b..e64274e 100644 --- a/spectrogramcontrols.h +++ b/spectrogramcontrols.h @@ -23,6 +23,7 @@ private: QSlider *fftSizeSlider; public: QPushButton *fileOpenButton; + QSlider *zoomLevelSlider; QSlider *powerMaxSlider; QSlider *powerMinSlider; }; \ No newline at end of file