diff --git a/plugins/channelrx/demodssb/ssbdemodgui.cpp b/plugins/channelrx/demodssb/ssbdemodgui.cpp index 9b12529f4..f7985a950 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.cpp +++ b/plugins/channelrx/demodssb/ssbdemodgui.cpp @@ -236,6 +236,12 @@ void SSBDemodGUI::on_flipSidebands_clicked(bool checked) ui->lowCut->setValue(-lcValue); } +void SSBDemodGUI::on_fftWindow_currentIndexChanged(int index) +{ + m_settings.m_fftWindow = (FFTWindow::Function) index; + applySettings(); +} + void SSBDemodGUI::onMenuDialogCalled(const QPoint &p) { if (m_contextMenuType == ContextMenuChannelSettings) @@ -565,6 +571,7 @@ void SSBDemodGUI::displaySettings() ui->audioFlipChannels->setChecked(m_settings.m_audioFlipChannels); ui->audioMute->setChecked(m_settings.m_audioMute); ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); + ui->fftWindow->setCurrentIndex((int) m_settings.m_fftWindow); // Prevent uncontrolled triggering of applyBandwidths ui->spanLog2->blockSignals(true); @@ -719,6 +726,7 @@ void SSBDemodGUI::makeUIConnections() QObject::connect(ui->audioMute, &QToolButton::toggled, this, &SSBDemodGUI::on_audioMute_toggled); QObject::connect(ui->spanLog2, &QSlider::valueChanged, this, &SSBDemodGUI::on_spanLog2_valueChanged); QObject::connect(ui->flipSidebands, &QPushButton::clicked, this, &SSBDemodGUI::on_flipSidebands_clicked); + QObject::connect(ui->fftWindow, QOverload::of(&QComboBox::currentIndexChanged), this, &SSBDemodGUI::on_fftWindow_currentIndexChanged); } void SSBDemodGUI::updateAbsoluteCenterFrequency() diff --git a/plugins/channelrx/demodssb/ssbdemodgui.h b/plugins/channelrx/demodssb/ssbdemodgui.h index 6a193f09e..c9943ac9f 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.h +++ b/plugins/channelrx/demodssb/ssbdemodgui.h @@ -107,6 +107,7 @@ private slots: void on_audioMute_toggled(bool checked); void on_spanLog2_valueChanged(int value); void on_flipSidebands_clicked(bool checked); + void on_fftWindow_currentIndexChanged(int index); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); void handleInputMessages(); diff --git a/plugins/channelrx/demodssb/ssbdemodgui.ui b/plugins/channelrx/demodssb/ssbdemodgui.ui index 6896c617b..391c7aa3d 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.ui +++ b/plugins/channelrx/demodssb/ssbdemodgui.ui @@ -349,6 +349,74 @@ + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 60 + 16777215 + + + + FFT window function + + + QComboBox::AdjustToContents + + + + Bart + + + + + B-H + + + + + FT + + + + + Ham + + + + + Han + + + + + Rec + + + + + Kai + + + + + Black + + + + @@ -988,27 +1056,15 @@ - - RollupContents - QWidget -
gui/rollupcontents.h
- 1 -
ButtonSwitch QToolButton
gui/buttonswitch.h
- LevelMeterSignalDB + RollupContents QWidget -
gui/levelmeter.h
- 1 -
- - ValueDialZ - QWidget -
gui/valuedialz.h
+
gui/rollupcontents.h
1
@@ -1023,6 +1079,18 @@
gui/glspectrumgui.h
1
+ + ValueDialZ + QWidget +
gui/valuedialz.h
+ 1 +
+ + LevelMeterSignalDB + QWidget +
gui/levelmeter.h
+ 1 +
TickedSlider QSlider diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.cpp b/plugins/channelrx/demodssb/ssbdemodsettings.cpp index 3eb35e735..08d6faf8c 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsettings.cpp @@ -65,6 +65,7 @@ void SSBDemodSettings::resetToDefaults() m_reverseAPIChannelIndex = 0; m_workspaceIndex = 0; m_hidden = false; + m_fftWindow = FFTWindow::Blackman; } QByteArray SSBDemodSettings::serialize() const @@ -105,6 +106,7 @@ QByteArray SSBDemodSettings::serialize() const s.writeS32(25, m_workspaceIndex); s.writeBlob(26, m_geometryBytes); s.writeBool(27, m_hidden); + s.writeS32(28, (int) m_fftWindow); return s.final(); } @@ -177,6 +179,8 @@ bool SSBDemodSettings::deserialize(const QByteArray& data) d.readS32(25, &m_workspaceIndex, 0); d.readBlob(26, &m_geometryBytes); d.readBool(27, &m_hidden, false); + d.readS32(28, &tmp, (int) FFTWindow::Blackman); + m_fftWindow = (FFTWindow::Function) (tmp < 0 ? 0 : tmp > (int) FFTWindow::Blackman ? (int) FFTWindow::Blackman : tmp); return true; } diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.h b/plugins/channelrx/demodssb/ssbdemodsettings.h index d1c51695b..a9029c3c5 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.h +++ b/plugins/channelrx/demodssb/ssbdemodsettings.h @@ -20,6 +20,8 @@ #include +#include "dsp/fftwindow.h" + class Serializable; struct SSBDemodSettings @@ -50,6 +52,7 @@ struct SSBDemodSettings int m_workspaceIndex; QByteArray m_geometryBytes; bool m_hidden; + FFTWindow::Function m_fftWindow; Serializable *m_channelMarker; Serializable *m_spectrumGUI; diff --git a/plugins/channelrx/demodssb/ssbdemodsink.cpp b/plugins/channelrx/demodssb/ssbdemodsink.cpp index f65db7eaa..45c060ea1 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsink.cpp @@ -291,8 +291,8 @@ void SSBDemodSink::applyAudioSampleRate(int sampleRate) m_interpolatorDistanceRemain = 0; m_interpolatorDistance = (Real) m_channelSampleRate / (Real) sampleRate; - SSBFilter->create_filter(m_LowCutoff / (float) sampleRate, m_Bandwidth / (float) sampleRate); - DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) sampleRate); + SSBFilter->create_filter(m_LowCutoff / (float) sampleRate, m_Bandwidth / (float) sampleRate, m_settings.m_fftWindow); + DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) sampleRate, m_settings.m_fftWindow); int agcNbSamples = (sampleRate / 1000) * (1<create_filter(m_LowCutoff / (float) m_audioSampleRate, m_Bandwidth / (float) m_audioSampleRate); - DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) m_audioSampleRate); + SSBFilter->create_filter(m_LowCutoff / (float) m_audioSampleRate, m_Bandwidth / (float) m_audioSampleRate, settings.m_fftWindow); + DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) m_audioSampleRate, settings.m_fftWindow); } if ((m_settings.m_volume != settings.m_volume) || force)