Skip to content

Commit

Permalink
feat: make viridis the default spectrogram color map
Browse files Browse the repository at this point in the history
  • Loading branch information
hello-adam committed Sep 8, 2020
1 parent ca80c21 commit 30f5e90
Show file tree
Hide file tree
Showing 10 changed files with 341 additions and 18 deletions.
3 changes: 2 additions & 1 deletion src/hobbits-plugins/displays/Spectrogram/Spectrogram.pro
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ SOURCES += spectrogram.cpp spectrogramwidget.cpp spectro
spectrogramrenderer.cpp

HEADERS += spectrogram.h spectrogramwidget.h spectrogramcontrols.h \
spectrogramrenderer.h
spectrogramrenderer.h \
viridis.h

FORMS += spectrogramcontrols.ui

Expand Down
2 changes: 2 additions & 0 deletions src/hobbits-plugins/displays/Spectrogram/spectrogram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ void Spectrogram::initialize(QSharedPointer<DisplayHandle> displayHandle)
m_displayWidget, &SpectrogramWidget::setShowHeaders);
connect(m_controlsWidget, &SpectrogramControls::sliceShowSet,
m_displayWidget, &SpectrogramWidget::setShowHoverSlices);
connect(m_controlsWidget, &SpectrogramControls::logarithmicSet,
m_displayWidget, &SpectrogramWidget::setLogarithmic);

m_controlsWidget->sendCurrentValues();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ SpectrogramControls::SpectrogramControls() :
connect(ui->sb_overlap, SIGNAL(valueChanged(int)), this, SIGNAL(overlapSet(int)));
connect(ui->ck_showHeaders, SIGNAL(toggled(bool)), this, SIGNAL(headersShowSet(bool)));
connect(ui->ck_hoverSlices, SIGNAL(toggled(bool)), this, SIGNAL(sliceShowSet(bool)));
connect(ui->ck_logarithmic, SIGNAL(toggled(bool)), this, SIGNAL(logarithmicSet(bool)));
}

void SpectrogramControls::sendCurrentValues()
Expand All @@ -41,6 +42,7 @@ void SpectrogramControls::sendCurrentValues()
emit sampleRateSet(ui->sb_sampleRate->value() * ui->cb_rateUnits->currentData().toDouble());
emit headersShowSet(ui->ck_showHeaders->isChecked());
emit sliceShowSet(ui->ck_hoverSlices->isChecked());
emit logarithmicSet(ui->ck_logarithmic->isChecked());
}

void SpectrogramControls::on_cb_wordFormat_currentIndexChanged(int index)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class SpectrogramControls : public QWidget
void sampleRateSet(double);
void headersShowSet(bool);
void sliceShowSet(bool);
void logarithmicSet(bool);

private slots:
void on_cb_wordFormat_currentIndexChanged(int index);
Expand Down
10 changes: 10 additions & 0 deletions src/hobbits-plugins/displays/Spectrogram/spectrogramcontrols.ui
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,16 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ck_logarithmic">
<property name="text">
<string>Logarithmic</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ck_showHeaders">
<property name="text">
Expand Down
35 changes: 26 additions & 9 deletions src/hobbits-plugins/displays/Spectrogram/spectrogramrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <QtConcurrent/QtConcurrentRun>
#include <QTime>
#include <QTimer>
#include "viridis.h"

#ifdef Q_OS_UNIX
#define bswap32(X) __builtin_bswap32((X))
Expand All @@ -27,6 +28,7 @@ SpectrogramRenderer::SpectrogramRenderer(QObject *parent) :
m_dataType(DataType::Real),
m_sensitivity(1.0),
m_sampleRate(16000),
m_logarithmic(true),
m_renderDirty(true),
m_rendering(false)
{
Expand Down Expand Up @@ -363,10 +365,6 @@ void SpectrogramRenderer::computeStft(SpectrogramRenderer *renderer)

qint64 currOffset = renderer->bitOffset();

QColor c = SettingsManager::getInstance().getUiSetting(SettingsData::BYTE_HUE_SAT_KEY).value<QColor>();
qreal hue = c.hueF();
qreal saturation = c.saturationF();

QTime lastTime = QTime::currentTime();
for (int i = 0; i < renderer->maxSpectrums(); i++) {
renderer->m_mutex.lock();
Expand Down Expand Up @@ -399,14 +397,19 @@ void SpectrogramRenderer::computeStft(SpectrogramRenderer *renderer)
fftw_execute_dft(plan, fftIn, fftOut);

QVector<double> spectrum(renderer->fftSize()/2);
for (int n = 0; n < renderer->fftSize()/2; n++) {
spectrum[n] = 0.4 * renderer->sensitivity() * log((fftOut[n][0] * fftOut[n][0] * outputFactor) + (fftOut[n][1] * fftOut[n][1] * outputFactor)) / log(10);
if (renderer->logarithmic()) {
for (int n = 0; n < renderer->fftSize()/2; n++) {
spectrum[n] = 0.4 * renderer->sensitivity() * log((fftOut[n][0] * fftOut[n][0] * outputFactor) + (fftOut[n][1] * fftOut[n][1] * outputFactor)) / log(10);
}
}
else {
for (int n = 0; n < renderer->fftSize()/2; n++) {
spectrum[n] = renderer->sensitivity() * (fftOut[n][0] * fftOut[n][0] * outputFactor) + (fftOut[n][1] * fftOut[n][1] * outputFactor);
}
}
spectrums.append(spectrum);
for (int x = 0; x < img.width() && x < spectrum.size(); x++) {
qreal lightness = qBound(0.0, spectrum.at(x), 1.0);
c.setHslF(hue, saturation, lightness);
img.setPixel(x, i, c.rgba());
img.setPixel(x, i, VIRIDIS_MAP[qBound(0, qFloor(spectrum.at(x) * 256.0), 255)].rgb());
}

renderer->m_mutex.unlock();
Expand Down Expand Up @@ -436,6 +439,20 @@ void SpectrogramRenderer::computeStft(SpectrogramRenderer *renderer)
}
}

bool SpectrogramRenderer::logarithmic() const
{
return m_logarithmic;
}

void SpectrogramRenderer::setLogarithmic(bool logarithmic)
{
if (!m_logarithmic == logarithmic) {
QMutexLocker lock(&m_mutex);
m_logarithmic = logarithmic;
setDirty();
}
}

void SpectrogramRenderer::sendSpectrums(const QList<QVector<double> > &s, const QImage &img)
{
emit spectrumsChanged(s, img);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ class SpectrogramRenderer : public QObject

void setDirty();

bool logarithmic() const;
void setLogarithmic(bool logarithmic);

signals:
void spectrumsChanged(const QList<QVector<double>>&, const QImage&);

Expand All @@ -84,6 +87,7 @@ private slots:
double m_sensitivity;
double m_sampleRate;
QSharedPointer<BitContainer> m_container;
bool m_logarithmic;

QFutureWatcher<void> m_watcher;

Expand Down
38 changes: 30 additions & 8 deletions src/hobbits-plugins/displays/Spectrogram/spectrogramwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -214,25 +214,42 @@ void SpectrogramWidget::paintEvent(QPaintEvent*) {

painter.translate(m_displayOffset);

int borderSize = 4;


QRect rBorder;
rBorder.setTopLeft(QPoint(m_displayCenterSize.width(), 0));
rBorder.setWidth(borderSize);
rBorder.setHeight(this->height() - m_displayOffset.y());

QRect bBorder;
bBorder.setTopLeft(QPoint(0, m_displayCenterSize.height()));
bBorder.setWidth(this->width() - m_displayOffset.x());
bBorder.setHeight(borderSize);

QRect rPanel;
rPanel.setTopLeft(QPoint(m_displayCenterSize.width(), 0));
rPanel.setTopLeft(QPoint(m_displayCenterSize.width() + borderSize, 0));
rPanel.setBottomRight(QPoint(this->width() - m_displayOffset.x(), this->height() - m_displayOffset.y()));
QRect bPanel;
bPanel.setTopLeft(QPoint(0, m_displayCenterSize.height()));
bPanel.setTopLeft(QPoint(0, m_displayCenterSize.height() + borderSize));
bPanel.setBottomRight(rPanel.bottomRight());

painter.fillRect(rPanel, QColor(0x33, 0x33, 0x33));
painter.fillRect(bPanel, QColor(0x33, 0x33, 0x33));
painter.fillRect(rPanel, Qt::black);
painter.fillRect(bPanel, Qt::black);
painter.fillRect(rBorder, Qt::darkGray);
painter.fillRect(bBorder, Qt::darkGray);

int graphPad = 8;

if (m_hoverX >= 0 && m_hoverY >= 0) {
if (m_hoverY < m_spectrums.size() && m_spectrums.size() > 0) {
painter.save();
painter.translate(bPanel.bottomLeft() + QPoint(0, -4));
painter.translate(bPanel.bottomLeft() + QPoint(0, -1*graphPad));
painter.scale(1, -1.0);
auto spectrum = m_spectrums.at(m_hoverY);


double yFactor = bPanel.height() - 8;
double yFactor = bPanel.height() - (2 * graphPad);
double xFactor = double(m_displayCenterSize.width()) / (double(m_renderer->fftSize()) / 2.0);
QPainterPath path;
path.moveTo(0, qBound(0.0, spectrum.at(0)*m_renderer->sensitivity(), 1.0)*yFactor);
Expand All @@ -250,15 +267,15 @@ void SpectrogramWidget::paintEvent(QPaintEvent*) {

if (m_spectrums.size() > 0) {
painter.save();
painter.translate(rPanel.topLeft() + QPoint(4, 0));
painter.translate(rPanel.topLeft() + QPoint(graphPad, 0));
painter.rotate(90);
painter.scale(1.0, -1.0);

int pos = qFloor(double(m_hoverX) / double(m_displayCenterSize.width()) * (double(m_renderer->fftSize()) / 2.0));


double xFactor = m_scale;
double yFactor = rPanel.width() - 8;
double yFactor = rPanel.width() - (2 * graphPad);
QPainterPath path;
path.moveTo(0, qBound(0.0, m_spectrums.at(0).at(pos)*m_renderer->sensitivity(), 1.0)*yFactor);
double xVal = xFactor;
Expand Down Expand Up @@ -396,6 +413,11 @@ void SpectrogramWidget::setShowHoverSlices(bool val)
repaint();
}

void SpectrogramWidget::setLogarithmic(bool val)
{
m_renderer->setLogarithmic(val);
}

void SpectrogramWidget::prepareHeaders()
{
if (m_displayHandle->getContainer().isNull()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public slots:
void setSampleRate(double);
void setShowHeaders(bool);
void setShowHoverSlices(bool);
void setLogarithmic(bool);

private:
void prepareHeaders();
Expand Down
Loading

0 comments on commit 30f5e90

Please sign in to comment.