diff --git a/mainwindow.cpp b/mainwindow.cpp index 88800f4..131e33b 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -46,6 +46,8 @@ MainWindow::MainWindow() connect(dock, SIGNAL(fftOrZoomChanged(int, int)), plots, SLOT(setFFTAndZoom(int, int))); connect(dock->powerMaxSlider, SIGNAL(valueChanged(int)), plots, SLOT(setPowerMax(int))); connect(dock->powerMinSlider, SIGNAL(valueChanged(int)), plots, SLOT(setPowerMin(int))); + connect(dock->timeResolutionSlider, SIGNAL(valueChanged(int)), plots, SLOT(setTimeResolution(int))); + connect(dock->betaSlider, SIGNAL(valueChanged(int)), plots, SLOT(setBeta(int))); connect(dock->cursorsCheckBox, &QCheckBox::stateChanged, plots, &PlotView::enableCursors); connect(dock->scalesCheckBox, &QCheckBox::stateChanged, plots, &PlotView::enableScales); connect(dock->cursorSymbolsSpinBox, static_cast(&QSpinBox::valueChanged), plots, &PlotView::setCursorSegments); diff --git a/plotview.cpp b/plotview.cpp index c8aa80c..2fc1fe1 100644 --- a/plotview.cpp +++ b/plotview.cpp @@ -382,7 +382,7 @@ void PlotView::setFFTAndZoom(int size, int zoom) void PlotView::setPowerMin(int power) { - powerMin = power; + powerMin = power; if (spectrogramPlot != nullptr) spectrogramPlot->setPowerMin(power); updateView(); @@ -396,6 +396,18 @@ void PlotView::setPowerMax(int power) updateView(); } +void PlotView::setTimeResolution(int resolution) +{ + if (spectrogramPlot != nullptr) + spectrogramPlot->setTimeResolution(resolution); +} + +void PlotView::setBeta(int beta) +{ + if (spectrogramPlot != nullptr) + spectrogramPlot->setBeta(beta); +} + void PlotView::paintEvent(QPaintEvent *event) { if (mainSampleSource == nullptr) return; diff --git a/plotview.h b/plotview.h index 5cce114..98cc901 100644 --- a/plotview.h +++ b/plotview.h @@ -52,6 +52,8 @@ public slots: void setFFTAndZoom(int fftSize, int zoomLevel); void setPowerMin(int power); void setPowerMax(int power); + void setTimeResolution(int resolution); + void setBeta(int beta); protected: void contextMenuEvent(QContextMenuEvent * event) override; diff --git a/spectrogramcontrols.cpp b/spectrogramcontrols.cpp index 9db76eb..f0396cf 100644 --- a/spectrogramcontrols.cpp +++ b/spectrogramcontrols.cpp @@ -55,6 +55,14 @@ SpectrogramControls::SpectrogramControls(const QString & title, QWidget * parent layout->addRow(new QLabel(tr("Zoom:")), zoomLevelSlider); + timeResolutionSlider = new QSlider(Qt::Horizontal, widget); + timeResolutionSlider->setRange(0, 99); + layout->addRow(new QLabel(tr("Time resolution:")), timeResolutionSlider); + + betaSlider = new QSlider(Qt::Horizontal, widget); + betaSlider->setRange(0, 15); + layout->addRow(new QLabel(tr("Beta:")), betaSlider); + powerMaxSlider = new QSlider(Qt::Horizontal, widget); powerMaxSlider->setRange(-140, 10); layout->addRow(new QLabel(tr("Power max:")), powerMaxSlider); diff --git a/spectrogramcontrols.h b/spectrogramcontrols.h index abe06d6..1372bfe 100644 --- a/spectrogramcontrols.h +++ b/spectrogramcontrols.h @@ -66,6 +66,8 @@ private slots: QSlider *zoomLevelSlider; QSlider *powerMaxSlider; QSlider *powerMinSlider; + QSlider *timeResolutionSlider; + QSlider *betaSlider; QCheckBox *cursorsCheckBox; QSpinBox *cursorSymbolsSpinBox; QLabel *rateLabel; diff --git a/spectrogramplot.cpp b/spectrogramplot.cpp index 31487b6..f22d296 100644 --- a/spectrogramplot.cpp +++ b/spectrogramplot.cpp @@ -33,12 +33,14 @@ SpectrogramPlot::SpectrogramPlot(std::shared_ptr>> src) : Plot(src), inputSource(src), fftSize(512), tuner(fftSize, this) { - setFFTSize(fftSize); zoomLevel = 1; powerMax = 0.0f; powerMin = -50.0f; + timeResolution = 0.0; sampleRate = 0; + beta = 4.0; frequencyScaleEnabled = false; + setFFTSize(fftSize); for (int i = 0; i < 256; i++) { float p = (float)i / 256; @@ -274,12 +276,29 @@ std::shared_ptr SpectrogramPlot::output() void SpectrogramPlot::setFFTSize(int size) { float sizeScale = float(size) / float(fftSize); + fftSize = size; fft.reset(new FFT(fftSize)); window.reset(new float[fftSize]); - for (int i = 0; i < fftSize; i++) { - window[i] = 0.5f * (1.0f - cos(Tau * i / (fftSize - 1))); + int zeroCount = (fftSize * timeResolution) / 100; + if ((zeroCount >= 0) && (zeroCount <= fftSize)) { + int windowSize = fftSize - zeroCount; + int leadingZeroCount = zeroCount/2; + + for (int i = 0; i < leadingZeroCount; i++) { + window[i] = 0; + } + for (int i = 0; i < windowSize; i++) { + window[i + leadingZeroCount] = kaiser(i, windowSize, beta, 0.0); + } + for (int i = windowSize + leadingZeroCount; i < fftSize; i++) { + window[i] = 0; + } + } else { + for(int i = 0; i < fftSize; i++) { + window[i] = 0; + } } setHeight(fftSize); @@ -303,6 +322,19 @@ void SpectrogramPlot::setPowerMin(int power) pixmapCache.clear(); } +void SpectrogramPlot::setTimeResolution(int resolution) +{ + timeResolution = resolution; + setFFTSize(fftSize); + invalidateEvent(); +} + +void SpectrogramPlot::setBeta(float beta) +{ + this->beta = beta; + setFFTSize(fftSize); + invalidateEvent(); +} void SpectrogramPlot::setZoomLevel(int zoom) { zoomLevel = zoom; diff --git a/spectrogramplot.h b/spectrogramplot.h index 7c496ef..cace493 100644 --- a/spectrogramplot.h +++ b/spectrogramplot.h @@ -54,6 +54,8 @@ public slots: void setPowerMax(int power); void setPowerMin(int power); void setZoomLevel(int zoom); + void setTimeResolution(int res); + void setBeta(float beta); void tunerMoved(); private: @@ -71,6 +73,8 @@ public slots: int zoomLevel; float powerMax; float powerMin; + int timeResolution; + float beta; off_t sampleRate; bool frequencyScaleEnabled;