1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-06-21 11:05:18 -04:00

WDSP Receiver: GUI updates

This commit is contained in:
f4exb 2024-06-27 03:39:25 +02:00
parent dc626ea9bb
commit 74cc488383
18 changed files with 1816 additions and 227 deletions

View File

@ -26,12 +26,21 @@ include_directories(
if(NOT SERVER_MODE)
set(wdsprx_SOURCES
${wdsprx_SOURCES}
wdsprxagcdialog.cpp
wdsprxagcdialog.ui
wdsprxdnbdialog.cpp
wdsprxdnbdialog.ui
wdsprxdnrdialog.cpp
wdsprxdnrdialog.ui
wdsprxgui.cpp
wdsprxgui.ui
)
set(wdsprx_HEADERS
${wdsprx_HEADERS}
wdsprxgui.h
wdsprxagcdialog.h
wdsprxdnbdialog.h
wdsprxdnrdialog.h
)
set(TARGET_NAME wdsprx)
set(TARGET_LIB "Qt::Widgets")

View File

@ -249,11 +249,11 @@ void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force)
{
qDebug() << "WDSPRx::applySettings:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_filterIndex: " << settings.m_filterIndex
<< " [m_spanLog2: " << settings.m_filterBank[settings.m_filterIndex].m_spanLog2
<< " m_highCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_highCutoff
<< " m_lowCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_lowCutoff
<< " m_fftWindow: " << settings.m_filterBank[settings.m_filterIndex].m_fftWindow << "]"
<< " m_profileIndex: " << settings.m_profileIndex
<< " [m_spanLog2: " << settings.m_profiles[settings.m_profileIndex].m_spanLog2
<< " m_highCutoff: " << settings.m_profiles[settings.m_profileIndex].m_highCutoff
<< " m_lowCutoff: " << settings.m_profiles[settings.m_profileIndex].m_lowCutoff
<< " m_fftWindow: " << settings.m_profiles[settings.m_profileIndex].m_fftWindow << "]"
<< " m_volume: " << settings.m_volume
<< " m_audioBinaual: " << settings.m_audioBinaural
<< " m_audioFlipChannels: " << settings.m_audioFlipChannels
@ -278,19 +278,19 @@ void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force)
if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((m_settings.m_filterIndex != settings.m_filterIndex) || force) {
if ((m_settings.m_profileIndex != settings.m_profileIndex) || force) {
reverseAPIKeys.append("filterIndex");
}
if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2 != settings.m_filterBank[settings.m_filterIndex].m_spanLog2) || force) {
if ((m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2 != settings.m_profiles[settings.m_profileIndex].m_spanLog2) || force) {
reverseAPIKeys.append("spanLog2");
}
if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff != settings.m_filterBank[settings.m_filterIndex].m_highCutoff) || force) {
if ((m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff != settings.m_profiles[settings.m_profileIndex].m_highCutoff) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff != settings.m_filterBank[settings.m_filterIndex].m_lowCutoff) || force) {
if ((m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff != settings.m_profiles[settings.m_profileIndex].m_lowCutoff) || force) {
reverseAPIKeys.append("lowCutoff");
}
if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow != settings.m_filterBank[settings.m_filterIndex].m_fftWindow) || force) {
if ((m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow != settings.m_profiles[settings.m_profileIndex].m_fftWindow) || force) {
reverseAPIKeys.append("fftWindow");
}
if ((m_settings.m_volume != settings.m_volume) || force) {
@ -331,12 +331,12 @@ void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force)
}
if ((settings.m_dsb != m_settings.m_dsb)
|| (settings.m_filterBank[settings.m_filterIndex].m_highCutoff != m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff)
|| (settings.m_filterBank[settings.m_filterIndex].m_lowCutoff != m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff) || force)
|| (settings.m_profiles[settings.m_profileIndex].m_highCutoff != m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff)
|| (settings.m_profiles[settings.m_profileIndex].m_lowCutoff != m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff) || force)
{
SpectrumSettings spectrumSettings = m_spectrumVis.getSettings();
spectrumSettings.m_ssb = !settings.m_dsb;
spectrumSettings.m_usb = (settings.m_filterBank[settings.m_filterIndex].m_lowCutoff < settings.m_filterBank[settings.m_filterIndex].m_highCutoff);
spectrumSettings.m_usb = (settings.m_profiles[settings.m_profileIndex].m_lowCutoff < settings.m_profiles[settings.m_profileIndex].m_highCutoff);
SpectrumVis::MsgConfigureSpectrumVis *msg = SpectrumVis::MsgConfigureSpectrumVis::create(spectrumSettings, false);
m_spectrumVis.getInputMessageQueue()->push(msg);
}
@ -466,19 +466,19 @@ void WDSPRx::webapiUpdateChannelSettings(
settings.m_inputFrequencyOffset = response.getSsbDemodSettings()->getInputFrequencyOffset();
}
if (channelSettingsKeys.contains("filterIndex")) {
settings.m_filterIndex = response.getSsbDemodSettings()->getFilterIndex();
settings.m_profileIndex = response.getSsbDemodSettings()->getFilterIndex();
}
if (channelSettingsKeys.contains("spanLog2")) {
settings.m_filterBank[settings.m_filterIndex].m_spanLog2 = response.getSsbDemodSettings()->getSpanLog2();
settings.m_profiles[settings.m_profileIndex].m_spanLog2 = response.getSsbDemodSettings()->getSpanLog2();
}
if (channelSettingsKeys.contains("rfBandwidth")) {
settings.m_filterBank[settings.m_filterIndex].m_highCutoff = response.getSsbDemodSettings()->getRfBandwidth();
settings.m_profiles[settings.m_profileIndex].m_highCutoff = response.getSsbDemodSettings()->getRfBandwidth();
}
if (channelSettingsKeys.contains("lowCutoff")) {
settings.m_filterBank[settings.m_filterIndex].m_lowCutoff = response.getSsbDemodSettings()->getLowCutoff();
settings.m_profiles[settings.m_profileIndex].m_lowCutoff = response.getSsbDemodSettings()->getLowCutoff();
}
if (channelSettingsKeys.contains("fftWimdow")) {
settings.m_filterBank[settings.m_filterIndex].m_fftWindow = (FFTWindow::Function) response.getSsbDemodSettings()->getFftWindow();
settings.m_profiles[settings.m_profileIndex].m_fftWindow = (FFTWindow::Function) response.getSsbDemodSettings()->getFftWindow();
}
if (channelSettingsKeys.contains("volume")) {
settings.m_volume = response.getSsbDemodSettings()->getVolume();
@ -551,11 +551,11 @@ void WDSPRx::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
{
response.getSsbDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0);
response.getSsbDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
response.getSsbDemodSettings()->setFilterIndex(settings.m_filterIndex);
response.getSsbDemodSettings()->setSpanLog2(settings.m_filterBank[settings.m_filterIndex].m_spanLog2);
response.getSsbDemodSettings()->setRfBandwidth(settings.m_filterBank[settings.m_filterIndex].m_highCutoff);
response.getSsbDemodSettings()->setLowCutoff(settings.m_filterBank[settings.m_filterIndex].m_lowCutoff);
response.getSsbDemodSettings()->setFftWindow((int) settings.m_filterBank[settings.m_filterIndex].m_fftWindow);
response.getSsbDemodSettings()->setFilterIndex(settings.m_profileIndex);
response.getSsbDemodSettings()->setSpanLog2(settings.m_profiles[settings.m_profileIndex].m_spanLog2);
response.getSsbDemodSettings()->setRfBandwidth(settings.m_profiles[settings.m_profileIndex].m_highCutoff);
response.getSsbDemodSettings()->setLowCutoff(settings.m_profiles[settings.m_profileIndex].m_lowCutoff);
response.getSsbDemodSettings()->setFftWindow((int) settings.m_profiles[settings.m_profileIndex].m_fftWindow);
response.getSsbDemodSettings()->setVolume(settings.m_volume);
response.getSsbDemodSettings()->setAudioBinaural(settings.m_audioBinaural ? 1 : 0);
response.getSsbDemodSettings()->setAudioFlipChannels(settings.m_audioFlipChannels ? 1 : 0);
@ -720,19 +720,19 @@ void WDSPRx::webapiFormatChannelSettings(
swgSSBDemodSettings->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
}
if (channelSettingsKeys.contains("filteIndex") || force) {
swgSSBDemodSettings->setFilterIndex(settings.m_filterIndex);
swgSSBDemodSettings->setFilterIndex(settings.m_profileIndex);
}
if (channelSettingsKeys.contains("spanLog2") || force) {
swgSSBDemodSettings->setSpanLog2(settings.m_filterBank[settings.m_filterIndex].m_spanLog2);
swgSSBDemodSettings->setSpanLog2(settings.m_profiles[settings.m_profileIndex].m_spanLog2);
}
if (channelSettingsKeys.contains("rfBandwidth") || force) {
swgSSBDemodSettings->setRfBandwidth(settings.m_filterBank[settings.m_filterIndex].m_highCutoff);
swgSSBDemodSettings->setRfBandwidth(settings.m_profiles[settings.m_profileIndex].m_highCutoff);
}
if (channelSettingsKeys.contains("lowCutoff") || force) {
swgSSBDemodSettings->setLowCutoff(settings.m_filterBank[settings.m_filterIndex].m_lowCutoff);
swgSSBDemodSettings->setLowCutoff(settings.m_profiles[settings.m_profileIndex].m_lowCutoff);
}
if (channelSettingsKeys.contains("fftWindow") || force) {
swgSSBDemodSettings->setLowCutoff(settings.m_filterBank[settings.m_filterIndex].m_fftWindow);
swgSSBDemodSettings->setLowCutoff(settings.m_profiles[settings.m_profileIndex].m_fftWindow);
}
if (channelSettingsKeys.contains("volume") || force) {
swgSSBDemodSettings->setVolume(settings.m_volume);

View File

@ -0,0 +1,76 @@
///////////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////////
#include "wdsprxagcdialog.h"
#include "ui_wdsprxagcdialog.h"
WDSPRxAGCDialog::WDSPRxAGCDialog(QWidget* parent) :
QDialog(parent),
ui(new Ui::WDSPRxAGCDialog)
{
ui->setupUi(this);
}
WDSPRxAGCDialog::~WDSPRxAGCDialog()
{
delete ui;
}
void WDSPRxAGCDialog::setAGCMode(WDSPRxProfile::WDSPRxAGCMode mode)
{
ui->agcMode->blockSignals(true);
ui->agcMode->setCurrentIndex((int) mode);
ui->agcMode->blockSignals(false);
m_agcMode = mode;
}
void WDSPRxAGCDialog::setAGCSlope(int slope)
{
ui->agcSlope->blockSignals(true);
ui->agcSlope->setValue(slope);
ui->agcSlopeText->setText(tr("%1 dB").arg(slope/10.0, 0, 'f', 1));
ui->agcSlope->blockSignals(false);
m_agcSlope = slope;
}
void WDSPRxAGCDialog::setAGCHangThreshold(int hangThreshold)
{
ui->agcHangThreshold->blockSignals(true);
ui->agcHangThreshold->setValue(hangThreshold);
ui->agcHangThresholdText->setText(tr("%1").arg(hangThreshold));
ui->agcHangThreshold->blockSignals(false);
}
void WDSPRxAGCDialog::on_agcMode_currentIndexChanged(int index)
{
m_agcMode = (WDSPRxProfile::WDSPRxAGCMode) index;
emit valueChanged(ChangedMode);
}
void WDSPRxAGCDialog::on_agcSlope_valueChanged(int value)
{
m_agcSlope = value;
ui->agcSlopeText->setText(tr("%1 dB").arg(value/10.0, 0, 'f', 1));
emit valueChanged(ChangedSlope);
}
void WDSPRxAGCDialog::on_agcHangThreshold_valueChanged(int value)
{
m_agcHangThreshold = value;
ui->agcHangThresholdText->setText(tr("%1").arg(value));
emit valueChanged(ChangedHangThreshold);
}

View File

@ -0,0 +1,65 @@
///////////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_WDSPRXAGCDIALOG_H
#define INCLUDE_WDSPRXAGCDIALOG_H
#include <QDialog>
#include "export.h"
#include "wdsprxsettings.h"
namespace Ui {
class WDSPRxAGCDialog;
}
class SDRGUI_API WDSPRxAGCDialog : public QDialog {
Q_OBJECT
public:
enum ValueChanged {
ChangedMode,
ChangedSlope,
ChangedHangThreshold,
};
explicit WDSPRxAGCDialog(QWidget* parent = nullptr);
~WDSPRxAGCDialog();
void setAGCMode(WDSPRxProfile::WDSPRxAGCMode mode);
void setAGCSlope(int slope);
void setAGCHangThreshold(int hangThreshold);
WDSPRxProfile::WDSPRxAGCMode getAGCMode() const { return m_agcMode; }
int getAGCSlope() const { return m_agcSlope; }
int getAGCHangThreshold() const { return m_agcHangThreshold; }
signals:
void valueChanged(int valueChanged);
private:
Ui::WDSPRxAGCDialog *ui;
WDSPRxProfile::WDSPRxAGCMode m_agcMode;
int m_agcSlope; // centi-Bels 0 - 200
int m_agcHangThreshold; // 0 - 100
private slots:
void on_agcMode_currentIndexChanged(int index);
void on_agcSlope_valueChanged(int value);
void on_agcHangThreshold_valueChanged(int value);
};
#endif // INCLUDE_WDSPRXAGCDIALOG_H

View File

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WDSPRxAGCDialog</class>
<widget class="QDialog" name="WDSPRxAGCDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>116</height>
</rect>
</property>
<property name="windowTitle">
<string>AGC</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="agcModeSetup">
<item>
<widget class="QLabel" name="agcModeLabel">
<property name="text">
<string>AGC Mode</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="agcMode">
<property name="toolTip">
<string>AGC Mode</string>
</property>
<item>
<property name="text">
<string>Long</string>
</property>
</item>
<item>
<property name="text">
<string>Slow</string>
</property>
</item>
<item>
<property name="text">
<string>Medium</string>
</property>
</item>
<item>
<property name="text">
<string>Fast</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="agcSettings1">
<item>
<widget class="QLabel" name="agcSlopeLabel">
<property name="text">
<string>Slope</string>
</property>
</widget>
</item>
<item>
<widget class="QDial" name="agcSlope">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>AGC Slope</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>200</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>35</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="agcSlopeText">
<property name="toolTip">
<string>AGC Slope value</string>
</property>
<property name="text">
<string>20.0 dB</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="agcHangThresholdLabel">
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>Hang Threshold</string>
</property>
</widget>
</item>
<item>
<widget class="QDial" name="agcHangThreshold">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>Hang Threshold </string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="agcHangThresholdText">
<property name="toolTip">
<string>Hang Threshold value</string>
</property>
<property name="text">
<string>100</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>WDSPRxAGCDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>WDSPRxAGCDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -163,7 +163,7 @@ bool WDSPRxBaseband::handleMessage(const Message& cmd)
if (m_spectrumVis)
{
DSPSignalNotification *msg = new DSPSignalNotification(m_audioSampleRate/(1<<m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2), 0);
DSPSignalNotification *msg = new DSPSignalNotification(m_audioSampleRate/(1<<m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2), 0);
m_spectrumVis->getInputMessageQueue()->push(msg);
}
}
@ -190,11 +190,11 @@ void WDSPRxBaseband::applySettings(const WDSPRxSettings& settings, bool force)
}
}
if ((settings.m_filterBank[settings.m_filterIndex].m_spanLog2 != m_settings.m_filterBank[settings.m_filterIndex].m_spanLog2) || force)
if ((settings.m_profiles[settings.m_profileIndex].m_spanLog2 != m_settings.m_profiles[settings.m_profileIndex].m_spanLog2) || force)
{
if (m_spectrumVis)
{
DSPSignalNotification *msg = new DSPSignalNotification(m_audioSampleRate/(1<<settings.m_filterBank[settings.m_filterIndex].m_spanLog2), 0);
DSPSignalNotification *msg = new DSPSignalNotification(m_audioSampleRate/(1<<settings.m_profiles[settings.m_profileIndex].m_spanLog2), 0);
m_spectrumVis->getInputMessageQueue()->push(msg);
}
}
@ -221,7 +221,7 @@ void WDSPRxBaseband::applySettings(const WDSPRxSettings& settings, bool force)
if (m_spectrumVis)
{
DSPSignalNotification *msg = new DSPSignalNotification(m_audioSampleRate/(1<<m_settings.m_filterBank[settings.m_filterIndex].m_spanLog2), 0);
DSPSignalNotification *msg = new DSPSignalNotification(m_audioSampleRate/(1<<m_settings.m_profiles[settings.m_profileIndex].m_spanLog2), 0);
m_spectrumVis->getInputMessageQueue()->push(msg);
}
}

View File

@ -0,0 +1,114 @@
///////////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////////
#include "wdsprxdnbdialog.h"
#include "ui_wdsprxdnbdialog.h"
WDSPRxDNBDialog::WDSPRxDNBDialog(QWidget* parent) :
QDialog(parent),
ui(new Ui::WDSPRxDNBDialog)
{
ui->setupUi(this);
}
WDSPRxDNBDialog::~WDSPRxDNBDialog()
{
delete ui;
}
void WDSPRxDNBDialog::setNBScheme(WDSPRxProfile::WDSPRxNBScheme scheme)
{
ui->nb->blockSignals(true);
ui->nb->setCurrentIndex((int) scheme);
ui->nb->blockSignals(false);
m_nbScheme = scheme;
}
void WDSPRxDNBDialog::setNB2Mode(WDSPRxProfile::WDSPRxNB2Mode mode)
{
ui->nb2Mode->blockSignals(true);
ui->nb2Mode->setCurrentIndex((int) mode);
ui->nb2Mode->blockSignals(false);
m_nb2Mode = mode;
}
void WDSPRxDNBDialog::setNBSlewTime(double time)
{
ui->nbSlewTime->blockSignals(true);
ui->nbSlewTime->setValue(time);
ui->nbSlewTime->blockSignals(false);
m_nbSlewTime = time;
}
void WDSPRxDNBDialog::setNBLeadTime(double time)
{
ui->nbLeadTime->blockSignals(true);
ui->nbLeadTime->setValue(time);
ui->nbLeadTime->blockSignals(false);
m_nbLeadTime = time;
}
void WDSPRxDNBDialog::setNBLagTime(double time)
{
ui->nbLagTime->blockSignals(true);
ui->nbLagTime->setValue(time);
ui->nbLagTime->blockSignals(false);
m_nbLagTime = time;
}
void WDSPRxDNBDialog::setNBThreshold(int threshold)
{
ui->nbThreshold->blockSignals(true);
ui->nbThreshold->setValue(threshold);
ui->nbThreshold->blockSignals(false);
m_nbThreshold = threshold;
}
void WDSPRxDNBDialog::on_nb_currentIndexChanged(int index)
{
m_nbScheme = (WDSPRxProfile::WDSPRxNBScheme) index;
emit valueChanged(ChangedNB);
}
void WDSPRxDNBDialog::on_nb2Mode_currentIndexChanged(int index)
{
m_nb2Mode = (WDSPRxProfile::WDSPRxNB2Mode) index;
emit valueChanged(ChangedNB2Mode);
}
void WDSPRxDNBDialog::on_nbSlewTime_valueChanged(double value)
{
m_nbSlewTime = value;
emit valueChanged(ChangedNBSlewTime);
}
void WDSPRxDNBDialog::on_nbLeadTime_valueChanged(double value)
{
m_nbLeadTime = value;
emit valueChanged(ChangedNBLeadTime);
}
void WDSPRxDNBDialog::on_nbLagTime_valueChanged(double value)
{
m_nbLagTime = value;
emit valueChanged(ChangedNBLagTime);
}
void WDSPRxDNBDialog::on_nbThreshold_valueChanged(int value)
{
m_nbThreshold = value;
emit valueChanged(ChangedNBThreshold);
}

View File

@ -0,0 +1,79 @@
///////////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_WDSPRXDNBDIALOG_H
#define INCLUDE_WDSPRXDNBDIALOG_H
#include <QDialog>
#include "export.h"
#include "wdsprxsettings.h"
namespace Ui {
class WDSPRxDNBDialog;
}
class SDRGUI_API WDSPRxDNBDialog : public QDialog {
Q_OBJECT
public:
enum ValueChanged {
ChangedNB,
ChangedNB2Mode,
ChangedNBSlewTime,
ChangedNBLeadTime,
ChangedNBLagTime,
ChangedNBThreshold,
};
explicit WDSPRxDNBDialog(QWidget* parent = nullptr);
~WDSPRxDNBDialog();
void setNBScheme(WDSPRxProfile::WDSPRxNBScheme scheme);
void setNB2Mode(WDSPRxProfile::WDSPRxNB2Mode mode);
void setNBSlewTime(double time);
void setNBLeadTime(double time);
void setNBLagTime(double time);
void setNBThreshold(int threshold);
WDSPRxProfile::WDSPRxNBScheme getNBScheme() const { return m_nbScheme; }
WDSPRxProfile::WDSPRxNB2Mode getNB2Mode() const { return m_nb2Mode; }
double getNBSlewTime() const { return m_nbSlewTime; }
double getNBLeadTime() const { return m_nbLeadTime; }
double getNBLagTime() const { return m_nbLagTime; }
int getNBThreshold() const { return m_nbThreshold; }
signals:
void valueChanged(int valueChanged);
private:
Ui::WDSPRxDNBDialog *ui;
WDSPRxProfile::WDSPRxNBScheme m_nbScheme;
WDSPRxProfile::WDSPRxNB2Mode m_nb2Mode;
double m_nbSlewTime;
double m_nbLeadTime;
double m_nbLagTime;
int m_nbThreshold;
private slots:
void on_nb_currentIndexChanged(int index);
void on_nb2Mode_currentIndexChanged(int index);
void on_nbSlewTime_valueChanged(double value);
void on_nbLeadTime_valueChanged(double value);
void on_nbLagTime_valueChanged(double value);
void on_nbThreshold_valueChanged(int value);
};
#endif // INCLUDE_WDSPRXDNBDIALOG_H

View File

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WDSPRxDNBDialog</class>
<widget class="QDialog" name="WDSPRxDNBDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>445</width>
<height>197</height>
</rect>
</property>
<property name="windowTitle">
<string>Noise Blanker</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="activeLayout">
<item>
<widget class="QLabel" name="nbLabel">
<property name="text">
<string>Scheme</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="nb">
<item>
<property name="text">
<string>NB</string>
</property>
</item>
<item>
<property name="text">
<string>NB2</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="nbLayout">
<item row="0" column="0">
<widget class="QLabel" name="nb2ModeLabel">
<property name="text">
<string>NB2 mode</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="nbLeadTimeLabel">
<property name="text">
<string>Lead time (ms)</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="nbSlewTimeLabel">
<property name="text">
<string>Slew time (ms)</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QDoubleSpinBox" name="nbLeadTime">
<property name="toolTip">
<string>Noise blanking lead time (ms)</string>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000100000000000</double>
</property>
<property name="value">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="nb2Mode">
<property name="toolTip">
<string>Noise blanking #2 mode</string>
</property>
<item>
<property name="text">
<string>Zero</string>
</property>
</item>
<item>
<property name="text">
<string>Sample&amp;Hold</string>
</property>
</item>
<item>
<property name="text">
<string>Mean Hold</string>
</property>
</item>
<item>
<property name="text">
<string>Hold Sample</string>
</property>
</item>
<item>
<property name="text">
<string>Interpolate</string>
</property>
</item>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="nbSlewTime">
<property name="toolTip">
<string>Noise blanking slew time (ms)</string>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000100000000000</double>
</property>
<property name="stepType">
<enum>QAbstractSpinBox::DefaultStepType</enum>
</property>
<property name="value">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lagTimeLabel">
<property name="text">
<string>Lag time (ms)</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="nbLagTime">
<property name="toolTip">
<string>Noise blanking lag time (ms)</string>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000100000000000</double>
</property>
<property name="value">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="nbThresholdLabel">
<property name="text">
<string>Threshold</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QSpinBox" name="nbThreshold">
<property name="toolTip">
<string>Noise blanking threshold</string>
</property>
<property name="minimum">
<number>15</number>
</property>
<property name="maximum">
<number>500</number>
</property>
<property name="value">
<number>30</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>WDSPRxDNBDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>WDSPRxDNBDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,128 @@
///////////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////////
#include "wdsprxdnrdialog.h"
#include "ui_wdsprxdnrdialog.h"
WDSPRxDNRDialog::WDSPRxDNRDialog(QWidget* parent) :
QDialog(parent),
ui(new Ui::WDSPRxDNRDialog)
{
ui->setupUi(this);
}
WDSPRxDNRDialog::~WDSPRxDNRDialog()
{
delete ui;
}
void WDSPRxDNRDialog::setSNB(bool snb)
{
ui->snb->blockSignals(true);
ui->snb->setChecked(snb);
ui->snb->blockSignals(false);
m_snb = snb;
}
void WDSPRxDNRDialog::setANF(bool anf)
{
ui->anf->blockSignals(true);
ui->anf->setChecked(anf);
ui->anf->blockSignals(false);
m_anf = anf;
}
void WDSPRxDNRDialog::setNRScheme(WDSPRxProfile::WDSPRxNRScheme scheme)
{
ui->nr->blockSignals(true);
ui->nr->setCurrentIndex((int) scheme);
ui->nr->blockSignals(false);
m_nrScheme = scheme;
}
void WDSPRxDNRDialog::setNR2Gain(WDSPRxProfile::WDSPRxNR2Gain gain)
{
ui->nr2Gain->blockSignals(true);
ui->nr2Gain->setCurrentIndex((int) gain);
ui->nr2Gain->blockSignals(false);
m_nr2Gain = gain;
}
void WDSPRxDNRDialog::setNR2NPE(WDSPRxProfile::WDSPRxNR2NPE nr2NPE)
{
ui->nr2NPE->blockSignals(true);
ui->nr2NPE->setCurrentIndex((int) nr2NPE);
ui->nr2NPE->blockSignals(false);
m_nr2NPE = nr2NPE;
}
void WDSPRxDNRDialog::setNRPosition(WDSPRxProfile::WDSPRxNRPosition position)
{
ui->nrPosition->blockSignals(true);
ui->nrPosition->setCurrentIndex((int) position);
ui->nrPosition->blockSignals(false);
m_nrPosition = position;
}
void WDSPRxDNRDialog::setNR2ArtifactReduction(bool nr2ArtifactReducion)
{
ui->nr2ArtifactReduction->blockSignals(true);
ui->nr2ArtifactReduction->setChecked(nr2ArtifactReducion);
ui->nr2ArtifactReduction->blockSignals(false);
m_nr2ArtifactReduction = nr2ArtifactReducion;
}
void WDSPRxDNRDialog::on_snb_clicked(bool checked)
{
m_snb = checked;
emit valueChanged(ChangedSNB);
}
void WDSPRxDNRDialog::on_anf_clicked(bool checked)
{
m_anf = checked;
emit valueChanged(ChangedANF);
}
void WDSPRxDNRDialog::on_nr_currentIndexChanged(int index)
{
m_nrScheme = (WDSPRxProfile::WDSPRxNRScheme) index;
emit valueChanged(ChangedNR);
}
void WDSPRxDNRDialog::on_nr2Gain_currentIndexChanged(int index)
{
m_nr2Gain = (WDSPRxProfile::WDSPRxNR2Gain) index;
emit valueChanged(ChangedNR2Gain);
}
void WDSPRxDNRDialog::on_nr2NPE_currentIndexChanged(int index)
{
m_nr2NPE = (WDSPRxProfile::WDSPRxNR2NPE) index;
emit valueChanged(ChangedNR2NPE);
}
void WDSPRxDNRDialog::on_nrPosition_currentIndexChanged(int index)
{
m_nrPosition = (WDSPRxProfile::WDSPRxNRPosition) index;
emit valueChanged(ChangedNRPosition);
}
void WDSPRxDNRDialog::on_nr2ArtifactReduction_clicked(bool checked)
{
m_nr2ArtifactReduction = checked;
emit valueChanged(ChangedNR2Artifacts);
}

View File

@ -0,0 +1,84 @@
///////////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_WDSPRXDNRDIALOG_H
#define INCLUDE_WDSPRXDNRDIALOG_H
#include <QDialog>
#include "export.h"
#include "wdsprxsettings.h"
namespace Ui {
class WDSPRxDNRDialog;
}
class SDRGUI_API WDSPRxDNRDialog : public QDialog {
Q_OBJECT
public:
enum ValueChanged {
ChangedSNB,
ChangedANF,
ChangedNR,
ChangedNR2Gain,
ChangedNR2NPE,
ChangedNRPosition,
ChangedNR2Artifacts,
};
explicit WDSPRxDNRDialog(QWidget* parent = nullptr);
~WDSPRxDNRDialog();
void setSNB(bool snb);
void setANF(bool anf);
void setNRScheme(WDSPRxProfile::WDSPRxNRScheme scheme);
void setNR2Gain(WDSPRxProfile::WDSPRxNR2Gain gain);
void setNR2NPE(WDSPRxProfile::WDSPRxNR2NPE nr2NPE);
void setNRPosition(WDSPRxProfile::WDSPRxNRPosition position);
void setNR2ArtifactReduction(bool nr2ArtifactReducion);
bool getSNB() const { return m_snb; }
bool getANF() const { return m_anf; }
WDSPRxProfile::WDSPRxNRScheme getNRScheme() const { return m_nrScheme; }
WDSPRxProfile::WDSPRxNR2Gain getNR2Gain() const { return m_nr2Gain; }
WDSPRxProfile::WDSPRxNR2NPE getNR2NPE() const { return m_nr2NPE; }
WDSPRxProfile::WDSPRxNRPosition getNRPosition() const { return m_nrPosition; }
bool getNR2ArtifactReduction() const { return m_nr2ArtifactReduction; }
signals:
void valueChanged(int valueChanged);
private:
Ui::WDSPRxDNRDialog *ui;
bool m_snb;
bool m_anf;
WDSPRxProfile::WDSPRxNRScheme m_nrScheme;
WDSPRxProfile::WDSPRxNR2Gain m_nr2Gain;
WDSPRxProfile::WDSPRxNR2NPE m_nr2NPE;
WDSPRxProfile::WDSPRxNRPosition m_nrPosition;
bool m_nr2ArtifactReduction;
private slots:
void on_snb_clicked(bool checked);
void on_anf_clicked(bool checked);
void on_nr_currentIndexChanged(int index);
void on_nr2Gain_currentIndexChanged(int index);
void on_nr2NPE_currentIndexChanged(int index);
void on_nrPosition_currentIndexChanged(int index);
void on_nr2ArtifactReduction_clicked(bool checked);
};
#endif // INCLUDE_WDSPRXDNRDIALOG_H

View File

@ -0,0 +1,210 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WDSPRxDNRDialog</class>
<widget class="QDialog" name="WDSPRxDNRDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>365</width>
<height>160</height>
</rect>
</property>
<property name="windowTitle">
<string>Noise Reduction</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="activeLayout">
<item>
<widget class="QLabel" name="nrLabel">
<property name="text">
<string>Scheme</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="nr">
<property name="toolTip">
<string>Noise reduction scheme</string>
</property>
<item>
<property name="text">
<string>NR</string>
</property>
</item>
<item>
<property name="text">
<string>NR2</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QCheckBox" name="snb">
<property name="toolTip">
<string>Spectral Noise Blanker</string>
</property>
<property name="text">
<string>SNB</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="anf">
<property name="toolTip">
<string>Automatic Notch Filter</string>
</property>
<property name="text">
<string>ANF</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="nrLayout">
<item row="1" column="0">
<widget class="QLabel" name="nr2GainLabel">
<property name="text">
<string>NR2 Gain</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QCheckBox" name="nr2ArtifactReduction">
<property name="toolTip">
<string>Noise reduction 2 artifact reduction</string>
</property>
<property name="text">
<string>NR2 Art</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="positionLabel">
<property name="text">
<string>Position</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="nr2NPELabel">
<property name="text">
<string>NR2 NPE</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="nrPosition">
<property name="toolTip">
<string>Noise reduction position</string>
</property>
<item>
<property name="text">
<string>Pre AGC</string>
</property>
</item>
<item>
<property name="text">
<string>Post AGC</string>
</property>
</item>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="nr2Gain">
<item>
<property name="text">
<string>Linear</string>
</property>
</item>
<item>
<property name="text">
<string>Log</string>
</property>
</item>
<item>
<property name="text">
<string>Gamma</string>
</property>
</item>
</widget>
</item>
<item row="1" column="3">
<widget class="QComboBox" name="nr2NPE">
<item>
<property name="text">
<string>OSMS</string>
</property>
</item>
<item>
<property name="text">
<string>MMSE</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>WDSPRxDNRDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>WDSPRxDNRDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -37,6 +37,9 @@
#include "gui/dialogpositioner.h"
#include "maincore.h"
#include "wdsprx.h"
#include "wdsprxagcdialog.h"
#include "wdsprxdnbdialog.h"
#include "wdsprxdnrdialog.h"
WDSPRxGUI* WDSPRxGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel)
{
@ -68,7 +71,7 @@ bool WDSPRxGUI::deserialize(const QByteArray& data)
ui->lowCut->setMaximum(480);
ui->lowCut->setMinimum(-480);
displaySettings();
applyBandwidths(m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2, true); // does applySettings(true)
applyBandwidths(m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2, true); // does applySettings(true)
return true;
}
else
@ -79,7 +82,7 @@ bool WDSPRxGUI::deserialize(const QByteArray& data)
ui->lowCut->setMaximum(480);
ui->lowCut->setMinimum(-480);
displaySettings();
applyBandwidths(m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2, true); // does applySettings(true)
applyBandwidths(m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2, true); // does applySettings(true)
return false;
}
}
@ -201,12 +204,15 @@ void WDSPRxGUI::on_volume_valueChanged(int value)
void WDSPRxGUI::on_agc_toggled(bool checked)
{
m_settings.m_agc = checked;
m_settings.m_profiles[m_settings.m_profileIndex].m_agc = m_settings.m_agc;
applySettings();
}
void WDSPRxGUI::on_dnr_toggled(bool)
void WDSPRxGUI::on_dnr_toggled(bool checked)
{
// TBD
m_settings.m_dnr = checked;
m_settings.m_profiles[m_settings.m_profileIndex].m_dnr = m_settings.m_dnr;
applySettings();
}
void WDSPRxGUI::on_agcGain_valueChanged(int value)
@ -214,6 +220,7 @@ void WDSPRxGUI::on_agcGain_valueChanged(int value)
QString s = QString::number(value, 'f', 0);
ui->agcGainText->setText(s);
m_settings.m_agcGain = value;
m_settings.m_profiles[m_settings.m_profileIndex].m_agcGain = m_settings.m_agcGain;
applySettings();
}
@ -246,30 +253,45 @@ void WDSPRxGUI::on_flipSidebands_clicked(bool checked)
void WDSPRxGUI::on_fftWindow_currentIndexChanged(int index)
{
m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow = index;
m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow = index;
applySettings();
}
void WDSPRxGUI::on_filterIndex_valueChanged(int value)
void WDSPRxGUI::on_profileIndex_valueChanged(int value)
{
if ((value < 0) || (value >= 10)) {
return;
}
ui->filterIndexText->setText(tr("%1").arg(value));
m_settings.m_filterIndex = value;
m_settings.m_profileIndex = value;
// Bandwidth setup
ui->BW->setMaximum(480);
ui->BW->setMinimum(-480);
ui->lowCut->setMaximum(480);
ui->lowCut->setMinimum(-480);
m_settings.m_dnr = m_settings.m_filterBank[m_settings.m_filterIndex].m_dnr;
m_settings.m_dnrScheme = m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrScheme;
m_settings.m_dnrAboveAvgFactor = m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrAboveAvgFactor;
m_settings.m_dnrSigmaFactor = m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrSigmaFactor;
m_settings.m_dnrNbPeaks = m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrNbPeaks;
m_settings.m_dnrAlpha = m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrAlpha;
// AGC setup
m_settings.m_agc = m_settings.m_profiles[m_settings.m_profileIndex].m_agc;
m_settings.m_agcGain = m_settings.m_profiles[m_settings.m_profileIndex].m_agcGain;
// Noise blanking
m_settings.m_dnb = m_settings.m_profiles[m_settings.m_profileIndex].m_dnb;
m_settings.m_nbScheme = m_settings.m_profiles[m_settings.m_profileIndex].m_nbScheme;
m_settings.m_nb2Mode = m_settings.m_profiles[m_settings.m_profileIndex].m_nb2Mode;
m_settings.m_nbSlewTime = m_settings.m_profiles[m_settings.m_profileIndex].m_nbSlewTime;
m_settings.m_nbLeadTime = m_settings.m_profiles[m_settings.m_profileIndex].m_nbLeadTime;
m_settings.m_nbLagTime = m_settings.m_profiles[m_settings.m_profileIndex].m_nbLagTime;
m_settings.m_nbThreshold = m_settings.m_profiles[m_settings.m_profileIndex].m_nbThreshold;
// Noise reduction
m_settings.m_dnr = m_settings.m_profiles[m_settings.m_profileIndex].m_dnr;
m_settings.m_snb = m_settings.m_profiles[m_settings.m_profileIndex].m_snb;
m_settings.m_anf = m_settings.m_profiles[m_settings.m_profileIndex].m_anf;
m_settings.m_nrScheme = m_settings.m_profiles[m_settings.m_profileIndex].m_nrScheme;
m_settings.m_nr2Gain = m_settings.m_profiles[m_settings.m_profileIndex].m_nr2Gain;
m_settings.m_nr2NPE = m_settings.m_profiles[m_settings.m_profileIndex].m_nr2NPE;
m_settings.m_nrPosition = m_settings.m_profiles[m_settings.m_profileIndex].m_nrPosition;
m_settings.m_nr2ArtifactReduction = m_settings.m_profiles[m_settings.m_profileIndex].m_nr2ArtifactReduction;
displaySettings();
applyBandwidths(m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2, true); // does applySettings(true)
applyBandwidths(m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2, true); // does applySettings(true)
}
void WDSPRxGUI::onMenuDialogCalled(const QPoint &p)
@ -344,7 +366,9 @@ WDSPRxGUI::WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
m_audioMute(false),
m_squelchOpen(false),
m_audioSampleRate(-1),
m_fftNRDialog(nullptr)
m_agcDialog(nullptr),
m_dnbDialog(nullptr),
m_dnrDialog(nullptr)
{
setAttribute(Qt::WA_DeleteOnClose, true);
m_helpURL = "plugins/channelrx/demodssb/readme.md";
@ -363,6 +387,12 @@ WDSPRxGUI::WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute);
connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect(const QPoint &)));
CRightClickEnabler *agcRightClickEnabler = new CRightClickEnabler(ui->agc);
connect(agcRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(agcSetupDialog(const QPoint &)));
CRightClickEnabler *dnbRightClickEnabler = new CRightClickEnabler(ui->dnb);
connect(dnbRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(dnbSetupDialog(const QPoint &)));
CRightClickEnabler *dnrRightClickEnabler = new CRightClickEnabler(ui->dnr);
connect(dnrRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(dnrSetupDialog(const QPoint &)));
@ -416,7 +446,7 @@ WDSPRxGUI::WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
displaySettings();
makeUIConnections();
applyBandwidths(m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2, true); // does applySettings(true)
applyBandwidths(m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2, true); // does applySettings(true)
DialPopup::addPopupsToChildDials(this);
m_resizer.enableChildMouseTracking();
}
@ -568,9 +598,9 @@ void WDSPRxGUI::applyBandwidths(unsigned int spanLog2, bool force)
ui->channelPowerMeter->setRange(WDSPRxSettings::m_minPowerThresholdDB, 0);
m_settings.m_dsb = dsb;
m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2 = spanLog2;
m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff = bw * 100;
m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff = lw * 100;
m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2 = spanLog2;
m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff = bw * 100;
m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff = lw * 100;
applySettings(force);
@ -586,9 +616,9 @@ void WDSPRxGUI::displaySettings()
{
m_channelMarker.blockSignals(true);
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
m_channelMarker.setBandwidth(m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff * 2);
m_channelMarker.setBandwidth(m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff * 2);
m_channelMarker.setTitle(m_settings.m_title);
m_channelMarker.setLowCutoff(m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff);
m_channelMarker.setLowCutoff(m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff);
if (m_deviceUISet->m_deviceMIMOEngine)
{
@ -604,7 +634,7 @@ void WDSPRxGUI::displaySettings()
}
else
{
if (m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff < 0)
if (m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff < 0)
{
m_channelMarker.setSidebands(ChannelMarker::lsb);
ui->dsb->setIcon(m_iconDSBLSB);
@ -636,7 +666,7 @@ void WDSPRxGUI::displaySettings()
ui->audioFlipChannels->setChecked(m_settings.m_audioFlipChannels);
ui->audioMute->setChecked(m_settings.m_audioMute);
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
ui->fftWindow->setCurrentIndex(m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow);
ui->fftWindow->setCurrentIndex(m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow);
// Prevent uncontrolled triggering of applyBandwidths
ui->spanLog2->blockSignals(true);
@ -644,14 +674,14 @@ void WDSPRxGUI::displaySettings()
ui->BW->blockSignals(true);
ui->filterIndex->blockSignals(true);
ui->filterIndex->setValue(m_settings.m_filterIndex);
ui->filterIndexText->setText(tr("%1").arg(m_settings.m_filterIndex));
ui->filterIndex->setValue(m_settings.m_profileIndex);
ui->filterIndexText->setText(tr("%1").arg(m_settings.m_profileIndex));
ui->dsb->setChecked(m_settings.m_dsb);
ui->spanLog2->setValue(1 + ui->spanLog2->maximum() - m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2);
ui->spanLog2->setValue(1 + ui->spanLog2->maximum() - m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2);
ui->BW->setValue(m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff / 100.0);
s = QString::number(m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff/1000.0, 'f', 1);
ui->BW->setValue(m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff / 100.0);
s = QString::number(m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff/1000.0, 'f', 1);
if (m_settings.m_dsb) {
ui->BWText->setText(tr("%1%2k").arg(QChar(0xB1, 0x00)).arg(s));
@ -666,8 +696,8 @@ void WDSPRxGUI::displaySettings()
// The only one of the four signals triggering applyBandwidths will trigger it once only with all other values
// set correctly and therefore validate the settings and apply them to dependent widgets
ui->lowCut->setValue(m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff / 100.0);
ui->lowCutText->setText(tr("%1k").arg(m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff / 1000.0));
ui->lowCut->setValue(m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff / 100.0);
ui->lowCutText->setText(tr("%1k").arg(m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff / 1000.0));
int volume = CalcDb::dbPower(m_settings.m_volume);
ui->volume->setValue(volume);
@ -680,11 +710,6 @@ void WDSPRxGUI::displaySettings()
blockApplySettings(false);
}
void WDSPRxGUI::agcSetupDialog()
{
// TODO
}
void WDSPRxGUI::leaveEvent(QEvent* event)
{
m_channelMarker.setHighlighted(false);
@ -711,55 +736,172 @@ void WDSPRxGUI::audioSelect(const QPoint& p)
}
}
void WDSPRxGUI::agcSetupDialog(const QPoint& p)
{
m_agcDialog = new WDSPRxAGCDialog();
m_agcDialog->move(p);
m_agcDialog->setAGCMode(m_settings.m_agcMode);
m_agcDialog->setAGCSlope(m_settings.m_agcSlope);
m_agcDialog->setAGCHangThreshold(m_settings.m_agcHangThreshold);
QObject::connect(m_agcDialog, &WDSPRxAGCDialog::valueChanged, this, &WDSPRxGUI::agcSetup);
m_agcDialog->exec();
QObject::disconnect(m_agcDialog, &WDSPRxAGCDialog::valueChanged, this, &WDSPRxGUI::agcSetup);
m_agcDialog->deleteLater();
m_agcDialog = nullptr;
}
void WDSPRxGUI::agcSetup(int iValueChanged)
{
if (!m_agcDialog) {
return;
}
WDSPRxAGCDialog::ValueChanged valueChanged = (WDSPRxAGCDialog::ValueChanged) iValueChanged;
switch (valueChanged)
{
case WDSPRxAGCDialog::ValueChanged::ChangedMode:
m_settings.m_agcMode = m_agcDialog->getAGCMode();
m_settings.m_profiles[m_settings.m_profileIndex].m_agcMode = m_settings.m_agcMode;
applySettings();
break;
case WDSPRxAGCDialog::ValueChanged::ChangedSlope:
m_settings.m_agcSlope = m_agcDialog->getAGCSlope();
m_settings.m_profiles[m_settings.m_profileIndex].m_agcSlope = m_settings.m_agcSlope;
applySettings();
break;
case WDSPRxAGCDialog::ValueChanged::ChangedHangThreshold:
m_settings.m_agcHangThreshold = m_agcDialog->getAGCHangThreshold();
m_settings.m_profiles[m_settings.m_profileIndex].m_agcHangThreshold = m_settings.m_agcHangThreshold;
applySettings();
break;
default:
break;
}
}
void WDSPRxGUI::dnbSetupDialog(const QPoint& p)
{
m_dnbDialog = new WDSPRxDNBDialog();
m_dnbDialog->move(p);
m_dnbDialog->setNBScheme(m_settings.m_nbScheme);
m_dnbDialog->setNB2Mode(m_settings.m_nb2Mode);
m_dnbDialog->setNBSlewTime(m_settings.m_nbSlewTime);
m_dnbDialog->setNBLeadTime(m_settings.m_nbLagTime);
m_dnbDialog->setNBThreshold(m_settings.m_nbThreshold);
QObject::connect(m_dnbDialog, &WDSPRxDNBDialog::valueChanged, this, &WDSPRxGUI::dnbSetup);
m_dnbDialog->exec();
QObject::disconnect(m_dnbDialog, &WDSPRxDNBDialog::valueChanged, this, &WDSPRxGUI::dnbSetup);
m_dnbDialog->deleteLater();
m_dnbDialog = nullptr;
}
void WDSPRxGUI::dnbSetup(int32_t iValueChanged)
{
if (!m_dnbDialog) {
return;
}
WDSPRxDNBDialog::ValueChanged valueChanged = (WDSPRxDNBDialog::ValueChanged) iValueChanged;
switch (valueChanged)
{
case WDSPRxDNBDialog::ValueChanged::ChangedNB:
m_settings.m_nbScheme = m_dnbDialog->getNBScheme();
m_settings.m_profiles[m_settings.m_profileIndex].m_nbScheme = m_settings.m_nbScheme;
applySettings();
break;
case WDSPRxDNBDialog::ValueChanged::ChangedNB2Mode:
m_settings.m_nb2Mode = m_dnbDialog->getNB2Mode();
m_settings.m_profiles[m_settings.m_profileIndex].m_nb2Mode = m_settings.m_nb2Mode;
applySettings();
break;
case WDSPRxDNBDialog::ValueChanged::ChangedNBSlewTime:
m_settings.m_nbSlewTime = m_dnbDialog->getNBSlewTime();
m_settings.m_profiles[m_settings.m_profileIndex].m_nbSlewTime = m_settings.m_nbSlewTime;
applySettings();
break;
case WDSPRxDNBDialog::ValueChanged::ChangedNBLeadTime:
m_settings.m_nbLeadTime = m_dnbDialog->getNBLeadTime();
m_settings.m_profiles[m_settings.m_profileIndex].m_nbLeadTime = m_settings.m_nbLeadTime;
applySettings();
break;
case WDSPRxDNBDialog::ValueChanged::ChangedNBLagTime:
m_settings.m_nbLagTime = m_dnbDialog->getNBLagTime();
m_settings.m_profiles[m_settings.m_profileIndex].m_nbLagTime = m_settings.m_nbLagTime;
applySettings();
break;
case WDSPRxDNBDialog::ValueChanged::ChangedNBThreshold:
m_settings.m_nbThreshold = m_dnbDialog->getNBThreshold();
m_settings.m_profiles[m_settings.m_profileIndex].m_nbThreshold = m_settings.m_nbThreshold;
applySettings();
break;
default:
break;
}
}
void WDSPRxGUI::dnrSetupDialog(const QPoint& p)
{
m_fftNRDialog = new FFTNRDialog();
m_fftNRDialog->move(p);
QObject::connect(m_fftNRDialog, &FFTNRDialog::valueChanged, this, &WDSPRxGUI::dnrSetup);
m_fftNRDialog->setScheme((FFTNoiseReduction::Scheme) m_settings.m_dnrScheme);
m_fftNRDialog->setAboveAvgFactor(m_settings.m_dnrAboveAvgFactor);
m_fftNRDialog->setSigmaFactor(m_settings.m_dnrSigmaFactor);
m_fftNRDialog->setNbPeaks(m_settings.m_dnrNbPeaks);
m_fftNRDialog->setAlpha(m_settings.m_dnrAlpha, 2048, m_audioSampleRate);
m_fftNRDialog->exec();
QObject::disconnect(m_fftNRDialog, &FFTNRDialog::valueChanged, this, &WDSPRxGUI::dnrSetup);
m_fftNRDialog->deleteLater();
m_fftNRDialog = nullptr;
m_dnrDialog = new WDSPRxDNRDialog();
m_dnrDialog->move(p);
m_dnrDialog->setSNB(m_settings.m_snb);
m_dnrDialog->setANF(m_settings.m_anf);
m_dnrDialog->setNRScheme(m_settings.m_nrScheme);
m_dnrDialog->setNR2Gain(m_settings.m_nr2Gain);
m_dnrDialog->setNR2NPE(m_settings.m_nr2NPE);
m_dnrDialog->setNRPosition(m_settings.m_nrPosition);
m_dnrDialog->setNR2ArtifactReduction(m_settings.m_nr2ArtifactReduction);
QObject::connect(m_dnrDialog, &WDSPRxDNRDialog::valueChanged, this, &WDSPRxGUI::dnrSetup);
m_dnrDialog->exec();
QObject::disconnect(m_dnrDialog, &WDSPRxDNRDialog::valueChanged, this, &WDSPRxGUI::dnrSetup);
m_dnrDialog->deleteLater();
m_dnrDialog = nullptr;
}
void WDSPRxGUI::dnrSetup(int32_t iValueChanged)
{
if (!m_fftNRDialog) {
if (!m_dnrDialog) {
return;
}
FFTNRDialog::ValueChanged valueChanged = (FFTNRDialog::ValueChanged) iValueChanged;
WDSPRxDNRDialog::ValueChanged valueChanged = (WDSPRxDNRDialog::ValueChanged) iValueChanged;
switch (valueChanged)
{
case FFTNRDialog::ValueChanged::ChangedScheme:
m_settings.m_dnrScheme = m_fftNRDialog->getScheme();
m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrScheme = m_settings.m_dnrScheme;
case WDSPRxDNRDialog::ValueChanged::ChangedSNB:
m_settings.m_snb = m_dnrDialog->getSNB();
m_settings.m_profiles[m_settings.m_profileIndex].m_snb = m_settings.m_snb;
applySettings();
break;
case FFTNRDialog::ValueChanged::ChangedAboveAvgFactor:
m_settings.m_dnrAboveAvgFactor = m_fftNRDialog->getAboveAvgFactor();
m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrAboveAvgFactor = m_settings.m_dnrAboveAvgFactor;
case WDSPRxDNRDialog::ValueChanged::ChangedANF:
m_settings.m_anf = m_dnrDialog->getANF();
m_settings.m_profiles[m_settings.m_profileIndex].m_anf = m_settings.m_anf;
applySettings();
break;
case FFTNRDialog::ValueChanged::ChangedSigmaFactor:
m_settings.m_dnrSigmaFactor = m_fftNRDialog->getSigmaFactor();
m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrSigmaFactor = m_settings.m_dnrSigmaFactor;
case WDSPRxDNRDialog::ValueChanged::ChangedNR:
m_settings.m_nrScheme = m_dnrDialog->getNRScheme();
m_settings.m_profiles[m_settings.m_profileIndex].m_nrScheme = m_settings.m_nrScheme;
applySettings();
break;
case FFTNRDialog::ValueChanged::ChangedNbPeaks:
m_settings.m_dnrNbPeaks = m_fftNRDialog->getNbPeaks();
m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrNbPeaks = m_settings.m_dnrNbPeaks;
case WDSPRxDNRDialog::ValueChanged::ChangedNR2Gain:
m_settings.m_nr2Gain = m_dnrDialog->getNR2Gain();
m_settings.m_profiles[m_settings.m_profileIndex].m_nr2Gain = m_settings.m_nr2Gain;
applySettings();
break;
case FFTNRDialog::ValueChanged::ChangedAlpha:
m_settings.m_dnrAlpha = m_fftNRDialog->getAlpha();
m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrAlpha = m_settings.m_dnrAlpha;
case WDSPRxDNRDialog::ValueChanged::ChangedNR2NPE:
m_settings.m_nr2NPE = m_dnrDialog->getNR2NPE();
m_settings.m_profiles[m_settings.m_profileIndex].m_nr2NPE = m_settings.m_nr2NPE;
applySettings();
break;
case WDSPRxDNRDialog::ValueChanged::ChangedNRPosition:
m_settings.m_nrPosition = m_dnrDialog->getNRPosition();
m_settings.m_profiles[m_settings.m_profileIndex].m_nrPosition = m_settings.m_nrPosition;
applySettings();
break;
case WDSPRxDNRDialog::ValueChanged::ChangedNR2Artifacts:
m_settings.m_nr2ArtifactReduction = m_dnrDialog->getNR2ArtifactReduction();
m_settings.m_profiles[m_settings.m_profileIndex].m_nr2ArtifactReduction = m_settings.m_nr2ArtifactReduction;
applySettings();
break;
default:
@ -818,7 +960,7 @@ void WDSPRxGUI::makeUIConnections()
QObject::connect(ui->spanLog2, &QSlider::valueChanged, this, &WDSPRxGUI::on_spanLog2_valueChanged);
QObject::connect(ui->flipSidebands, &QPushButton::clicked, this, &WDSPRxGUI::on_flipSidebands_clicked);
QObject::connect(ui->fftWindow, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &WDSPRxGUI::on_fftWindow_currentIndexChanged);
QObject::connect(ui->filterIndex, &QDial::valueChanged, this, &WDSPRxGUI::on_filterIndex_valueChanged);
QObject::connect(ui->filterIndex, &QDial::valueChanged, this, &WDSPRxGUI::on_profileIndex_valueChanged);
}
void WDSPRxGUI::updateAbsoluteCenterFrequency()

View File

@ -34,6 +34,9 @@ class DeviceUISet;
class AudioFifo;
class WDSPRx;
class WDSPRxAGCDialog;
class WDSPRxDNBDialog;
class WDSPRxDNRDialog;
class SpectrumVis;
class BasebandSampleSink;
@ -89,7 +92,9 @@ private:
WDSPRx* m_wdspRx;
SpectrumVis* m_spectrumVis;
MessageQueue m_inputMessageQueue;
FFTNRDialog* m_fftNRDialog;
WDSPRxAGCDialog* m_agcDialog;
WDSPRxDNBDialog* m_dnbDialog;
WDSPRxDNRDialog* m_dnrDialog;
QIcon m_iconDSBUSB;
QIcon m_iconDSBLSB;
@ -120,19 +125,23 @@ private slots:
void on_volume_valueChanged(int value);
void on_agc_toggled(bool checked);
void on_dnr_toggled(bool checked);
// void on_dnb_toggled(bool checked);
void on_agcGain_valueChanged(int value);
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 on_filterIndex_valueChanged(int value);
void on_profileIndex_valueChanged(int value);
void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void handleInputMessages();
void audioSelect(const QPoint& p);
void agcSetupDialog(const QPoint& p);
void agcSetup(int valueChanged);
void dnbSetupDialog(const QPoint& p);
void dnbSetup(int valueChanged);
void dnrSetupDialog(const QPoint& p);
void dnrSetup(int valueChanged);
void agcSetupDialog();
void tick();
};

View File

@ -877,6 +877,19 @@
</property>
</widget>
</item>
<item>
<widget class="ButtonSwitch" name="dnb">
<property name="toolTip">
<string>Toggle Digital Noise Blanker</string>
</property>
<property name="text">
<string>NB</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">

View File

@ -35,7 +35,7 @@ WDSPRxSettings::WDSPRxSettings() :
m_spectrumGUI(nullptr),
m_rollupState(nullptr)
{
m_filterBank.resize(10);
m_profiles.resize(10);
resetToDefaults();
}
@ -45,11 +45,30 @@ void WDSPRxSettings::resetToDefaults()
m_audioFlipChannels = false;
m_dsb = false;
m_audioMute = false;
m_agc = true;
m_agcMode = AGCMedium;
// AGC
m_agc = false;
m_agcMode = WDSPRxProfile::AGCMedium;
m_agcGain = 80;
m_agcSlope = 35; // 3.5 dB
m_agcHangThreshold = 0;
// Noise blanker
m_dnb = false;
m_nbScheme = WDSPRxProfile::WDSPRxNBScheme::NBSchemeNB;
m_nb2Mode = WDSPRxProfile::WDSPRxNB2Mode::NB2ModeZero;
m_nbSlewTime = 0.01;
m_nbLeadTime = 0.01;
m_nbLagTime = 0.01;
m_nbThreshold = 30;
// Noise reduction
m_dnr = false;
m_snb = false;
m_anf = false;
m_nrScheme = WDSPRxProfile::NRSchemeNR;
m_nr2Gain = WDSPRxProfile::NR2GainGamma;
m_nr2NPE = WDSPRxProfile::NR2NPEOSMS;
m_nrPosition = WDSPRxProfile::NRPositionPreAGC;
m_nr2ArtifactReduction = true;
//
m_volume = 1.0;
m_inputFrequencyOffset = 0;
m_rgbColor = QColor(0, 255, 0).rgb();
@ -63,58 +82,95 @@ void WDSPRxSettings::resetToDefaults()
m_reverseAPIChannelIndex = 0;
m_workspaceIndex = 0;
m_hidden = false;
m_filterIndex = 0;
m_profileIndex = 0;
}
QByteArray WDSPRxSettings::serialize() const
{
SimpleSerializer s(1);
s.writeS32(1, m_inputFrequencyOffset);
s.writeS32(3, m_volume * 10.0);
s.writeS32( 1, m_inputFrequencyOffset);
s.writeS32( 3, m_volume * 10.0);
if (m_spectrumGUI) {
s.writeBlob(4, m_spectrumGUI->serialize());
}
s.writeU32(5, m_rgbColor);
s.writeBool(8, m_audioBinaural);
s.writeBool(9, m_audioFlipChannels);
s.writeBool(10, m_dsb);
s.writeBool(11, m_agc);
s.writeS32(12, (int) m_agcMode);
s.writeS32(13, m_agcGain);
s.writeS32(14, m_agcSlope);
s.writeS32(15, m_agcHangThreshold);
s.writeString(16, m_title);
s.writeString(17, m_audioDeviceName);
s.writeBool(18, m_useReverseAPI);
s.writeString(19, m_reverseAPIAddress);
s.writeU32(20, m_reverseAPIPort);
s.writeU32(21, m_reverseAPIDeviceIndex);
s.writeU32(22, m_reverseAPIChannelIndex);
s.writeS32(23, m_streamIndex);
s.writeU32( 5, m_rgbColor);
s.writeBool( 8, m_audioBinaural);
s.writeBool( 9, m_audioFlipChannels);
s.writeBool( 10, m_dsb);
// AGC
s.writeBool( 11, m_agc);
s.writeS32( 12, (int) m_agcMode);
s.writeS32( 13, m_agcGain);
s.writeS32( 14, m_agcSlope);
s.writeS32( 15, m_agcHangThreshold);
// Noise blanker
s.writeBool( 20, m_dnb);
s.writeS32( 21, (int) m_nbScheme);
s.writeS32( 22, (int) m_nb2Mode);
s.writeDouble(23, m_nbSlewTime);
s.writeDouble(24, m_nbLeadTime);
s.writeDouble(25, m_nbLagTime);
s.writeS32( 26, m_nbThreshold);
// Noise reduction
s.writeBool( 30, m_dnr);
s.writeBool( 31, m_snb);
s.writeBool( 32, m_anf);
s.writeS32( 33, (int) m_nrScheme);
s.writeS32( 34, (int) m_nr2Gain);
s.writeS32( 35, (int) m_nr2NPE);
s.writeS32( 36, (int) m_nrPosition);
s.writeBool( 37, m_nr2ArtifactReduction);
//
s.writeString(70, m_title);
s.writeString(71, m_audioDeviceName);
s.writeBool( 72, m_useReverseAPI);
s.writeString(73, m_reverseAPIAddress);
s.writeU32( 74, m_reverseAPIPort);
s.writeU32( 75, m_reverseAPIDeviceIndex);
s.writeU32( 76, m_reverseAPIChannelIndex);
s.writeS32( 77, m_streamIndex);
if (m_rollupState) {
s.writeBlob(24, m_rollupState->serialize());
s.writeBlob(78, m_rollupState->serialize());
}
s.writeS32(25, m_workspaceIndex);
s.writeBlob(26, m_geometryBytes);
s.writeBool(27, m_hidden);
s.writeU32(29, m_filterIndex);
s.writeS32( 79, m_workspaceIndex);
s.writeBlob( 80, m_geometryBytes);
s.writeBool( 81, m_hidden);
s.writeU32( 82, m_profileIndex);
for (unsigned int i = 0; i < 10; i++)
for (unsigned int i = 0; i < 10; i++)
{
s.writeS32(100 + 10*i, m_filterBank[i].m_spanLog2);
s.writeS32(101 + 10*i, m_filterBank[i].m_highCutoff / 100.0);
s.writeS32(102 + 10*i, m_filterBank[i].m_lowCutoff / 100.0);
s.writeS32(103 + 10*i, (int) m_filterBank[i].m_fftWindow);
s.writeBool(104 + 10*i, m_filterBank[i].m_dnr);
s.writeS32(105 + 10*i, m_filterBank[i].m_dnrScheme);
s.writeFloat(106 + 10*i, m_filterBank[i].m_dnrAboveAvgFactor);
s.writeFloat(107 + 10*i, m_filterBank[i].m_dnrSigmaFactor);
s.writeS32(108 + 10*i, m_filterBank[i].m_dnrNbPeaks);
s.writeFloat(109 + 10*i, m_filterBank[i].m_dnrAlpha);
// Filter
s.writeS32 (100 + 50*i, m_profiles[i].m_spanLog2);
s.writeS32 (101 + 50*i, m_profiles[i].m_highCutoff / 100.0);
s.writeS32 (102 + 50*i, m_profiles[i].m_lowCutoff / 100.0);
s.writeS32 (103 + 50*i, m_profiles[i].m_fftWindow);
// AGC
s.writeBool (110 + 50*i, m_profiles[i].m_agc);
s.writeS32 (111 + 50*i, (int) m_profiles[i].m_agcMode);
s.writeS32 (112 + 50*i, m_profiles[i].m_agcGain);
s.writeS32 (113 + 50*i, m_profiles[i].m_agcSlope);
s.writeS32 (114 + 50*i, m_profiles[i].m_agcHangThreshold);
// Noise blanjer
s.writeBool (120 + 50*i, m_profiles[i].m_dnb);
s.writeS32 (121 + 50*i, (int) m_profiles[i].m_nbScheme);
s.writeS32 (122 + 50*i, (int) m_profiles[i].m_nb2Mode);
s.writeDouble(123 + 50*i, m_profiles[i].m_nbSlewTime);
s.writeDouble(124 + 50*i, m_profiles[i].m_nbLeadTime);
s.writeDouble(125 + 50*i, m_profiles[i].m_nbLagTime);
s.writeS32 (126 + 50*i, m_profiles[i].m_nbThreshold);
// Noise reduction
s.writeBool (130 + 50*i, m_profiles[i].m_dnr);
s.writeBool (131 + 50*i, m_profiles[i].m_snb);
s.writeBool (132 + 50*i, m_profiles[i].m_anf);
s.writeS32 (133 + 50*i, (int) m_profiles[i].m_nrScheme);
s.writeS32 (134 + 50*i, (int) m_profiles[i].m_nr2Gain);
s.writeS32 (135 + 50*i, (int) m_profiles[i].m_nr2NPE);
s.writeS32 (136 + 50*i, (int) m_profiles[i].m_nrPosition);
s.writeBool (137 + 50*i, m_profiles[i].m_nr2ArtifactReduction);
}
return s.final();
@ -137,8 +193,8 @@ bool WDSPRxSettings::deserialize(const QByteArray& data)
uint32_t utmp;
QString strtmp;
d.readS32(1, &m_inputFrequencyOffset, 0);
d.readS32(3, &tmp, 30);
d.readS32( 1, &m_inputFrequencyOffset, 0);
d.readS32( 3, &tmp, 30);
m_volume = tmp / 10.0;
if (m_spectrumGUI)
@ -147,21 +203,46 @@ bool WDSPRxSettings::deserialize(const QByteArray& data)
m_spectrumGUI->deserialize(bytetmp);
}
d.readU32(5, &m_rgbColor);
d.readBool(8, &m_audioBinaural, false);
d.readBool(9, &m_audioFlipChannels, false);
d.readBool(10, &m_dsb, false);
d.readBool(11, &m_agc, true);
d.readS32(12, &tmp, 2);
m_agcMode = (AGCMode) tmp;
d.readS32(13, &m_agcGain, 80);
d.readS32(14, &m_agcSlope, 35);
d.readS32(15, &m_agcHangThreshold, 0);
d.readString(16, &m_title, "WDSP Receiver");
d.readString(17, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName);
d.readBool(18, &m_useReverseAPI, false);
d.readString(19, &m_reverseAPIAddress, "127.0.0.1");
d.readU32(20, &utmp, 0);
d.readU32( 5, &m_rgbColor);
d.readBool( 8, &m_audioBinaural, false);
d.readBool( 9, &m_audioFlipChannels, false);
d.readBool( 10, &m_dsb, false);
// AGC
d.readBool( 11, &m_agc, true);
d.readS32( 12, &tmp, 2);
m_agcMode = (WDSPRxProfile::WDSPRxAGCMode) tmp;
d.readS32( 13, &m_agcGain, 80);
d.readS32( 14, &m_agcSlope, 35);
d.readS32( 15, &m_agcHangThreshold, 0);
// Noise blanker
d.readBool( 29, &m_dnb, false);
d.readS32( 24, &tmp, 2);
m_nbScheme = (WDSPRxProfile::WDSPRxNBScheme) tmp;
d.readS32( 29, &tmp, 2);
m_nb2Mode = (WDSPRxProfile::WDSPRxNB2Mode) tmp;
d.readDouble(30, &m_nbSlewTime, 0.01);
d.readDouble(31, &m_nbLeadTime, 0.01);
d.readDouble(32, &m_nbLagTime, 0.01);
d.readS32( 33, &m_nbThreshold, 30);
// Nosie reduction
d.readBool( 29, &m_dnr, false);
d.readBool( 21, &m_snb, false);
d.readBool( 22, &m_anf, false);
d.readS32( 23, &tmp, 2);
m_nrScheme = (WDSPRxProfile::WDSPRxNRScheme) tmp;
d.readS32( 25, &tmp, 2);
m_nr2Gain = (WDSPRxProfile::WDSPRxNR2Gain) tmp;
d.readS32( 26, &tmp, 2);
m_nr2NPE = (WDSPRxProfile::WDSPRxNR2NPE) tmp;
d.readS32( 27, &tmp, 2);
m_nrPosition = (WDSPRxProfile::WDSPRxNRPosition) tmp;
d.readBool( 28, &m_nr2ArtifactReduction, true);
//
d.readString(70, &m_title, "WDSP Receiver");
d.readString(71, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName);
d.readBool( 72, &m_useReverseAPI, false);
d.readString(73, &m_reverseAPIAddress, "127.0.0.1");
d.readU32( 74, &utmp, 0);
if ((utmp > 1023) && (utmp < 65535)) {
m_reverseAPIPort = utmp;
@ -169,40 +250,63 @@ bool WDSPRxSettings::deserialize(const QByteArray& data)
m_reverseAPIPort = 8888;
}
d.readU32(21, &utmp, 0);
d.readU32( 75, &utmp, 0);
m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp;
d.readU32(22, &utmp, 0);
d.readU32( 76, &utmp, 0);
m_reverseAPIChannelIndex = utmp > 99 ? 99 : utmp;
d.readS32(23, &m_streamIndex, 0);
d.readS32( 77, &m_streamIndex, 0);
if (m_rollupState)
{
d.readBlob(24, &bytetmp);
d.readBlob(78, &bytetmp);
m_rollupState->deserialize(bytetmp);
}
d.readS32(25, &m_workspaceIndex, 0);
d.readBlob(26, &m_geometryBytes);
d.readBool(27, &m_hidden, false);
d.readU32(29, &utmp, 0);
m_filterIndex = utmp < 10 ? utmp : 0;
d.readS32( 79, &m_workspaceIndex, 0);
d.readBlob( 80, &m_geometryBytes);
d.readBool( 81, &m_hidden, false);
d.readU32( 82, &utmp, 0);
m_profileIndex = utmp < 10 ? utmp : 0;
for (unsigned int i = 0; (i < 10); i++)
{
d.readS32(100 + 10*i, &m_filterBank[i].m_spanLog2, 3);
d.readS32(101 + 10*i, &tmp, 30);
m_filterBank[i].m_highCutoff = tmp * 100.0;
d.readS32(102+ 10*i, &tmp, 3);
m_filterBank[i].m_lowCutoff = tmp * 100.0;
d.readS32(103 + 10*i, &tmp, (int) FFTWindow::Blackman);
m_filterBank[i].m_fftWindow =
(FFTWindow::Function) (tmp < 0 ? 0 : tmp > (int) FFTWindow::BlackmanHarris7 ? (int) FFTWindow::BlackmanHarris7 : tmp);
d.readBool(104 + 10*i, &m_filterBank[i].m_dnr, false);
d.readS32(105 + 10*i, &m_filterBank[i].m_dnrScheme, 0);
d.readFloat(106 + 10*i, &m_filterBank[i].m_dnrAboveAvgFactor, 20.0f);
d.readFloat(107 + 10*i, &m_filterBank[i].m_dnrSigmaFactor, 4.0f);
d.readS32(108 + 10*i, &m_filterBank[i].m_dnrNbPeaks, 10);
d.readFloat(109 + 10*i, &m_filterBank[i].m_dnrAlpha, 0.95f);
// Filter
d.readS32 (100 + 50*i, &m_profiles[i].m_spanLog2, 3);
d.readS32 (101 + 50*i, &tmp, 30);
m_profiles[i].m_highCutoff = tmp * 100.0;
d.readS32 (102 + 50*i, &tmp, 3);
m_profiles[i].m_lowCutoff = tmp * 100.0;
d.readS32 (103 + 50*i, &m_profiles[i].m_fftWindow, 0);
// AGC
d.readBool( 110, &m_profiles[i].m_agc, true);
d.readS32( 111, &tmp, 2);
m_profiles[i].m_agcMode = (WDSPRxProfile::WDSPRxAGCMode) tmp;
d.readS32( 112, &m_profiles[i].m_agcGain, 80);
d.readS32( 113, &m_profiles[i].m_agcSlope, 35);
d.readS32( 114, &m_profiles[i].m_agcHangThreshold, 0);
// Noise blanker
d.readBool (120 + 50*i, &m_profiles[i].m_dnb, false);
d.readS32 (121 + 50*i, &tmp);
m_profiles[i].m_nbScheme = (WDSPRxProfile::WDSPRxNBScheme) tmp;
d.readS32 (122 + 50*i, &tmp);
m_profiles[i].m_nb2Mode = (WDSPRxProfile::WDSPRxNB2Mode) tmp;
d.readDouble(123 + 50*i, &m_profiles[i].m_nbSlewTime, 0.01);
d.readDouble(124 + 50*i, &m_profiles[i].m_nbLeadTime, 0.01);
d.readDouble(125 + 50*i, &m_profiles[i].m_nbLagTime, 0.01);
d.readS32 (126 + 50*i, &m_profiles[i].m_nbThreshold, 40);
// Noise reduction
d.readBool (130 + 50*i, &m_profiles[i].m_dnr, false);
d.readBool (131 + 50*i, &m_profiles[i].m_snb, false);
d.readBool (132 + 50*i, &m_profiles[i].m_anf, false);
d.readS32 (133 + 50*i, &tmp);
m_profiles[i].m_nrScheme = (WDSPRxProfile::WDSPRxNRScheme) tmp;
d.readS32 (134 + 50*i, &tmp);
m_profiles[i].m_nr2Gain = (WDSPRxProfile::WDSPRxNR2Gain) tmp;
d.readS32 (135 + 50*i, &tmp);
m_profiles[i].m_nr2NPE = (WDSPRxProfile::WDSPRxNR2NPE) tmp;
d.readS32 (136 + 50*i, &tmp);
m_profiles[i].m_nrPosition = (WDSPRxProfile::WDSPRxNRPosition) tmp;
d.readBool (137 + 50*i, &m_profiles[i].m_nr2ArtifactReduction);
}
return true;

View File

@ -25,37 +25,110 @@
class Serializable;
struct WDSPRxFilterSettings
{
int m_spanLog2;
Real m_highCutoff;
Real m_lowCutoff;
int m_fftWindow; // 0: 4-term Blackman-Harris, 1: 7-term Blackman-Harris
bool m_dnr;
int m_dnrScheme;
float m_dnrAboveAvgFactor;
float m_dnrSigmaFactor;
int m_dnrNbPeaks;
float m_dnrAlpha;
WDSPRxFilterSettings() :
m_spanLog2(3),
m_highCutoff(3000),
m_lowCutoff(300),
m_fftWindow(0)
{}
};
struct WDSPRxSettings
struct WDSPRxProfile
{
enum AGCMode
enum WDSPRxAGCMode
{
AGCLong,
AGCSlow,
AGCMedium,
AGCFast,
};
enum WDSPRxNRScheme
{
NRSchemeNR,
NRSchemeNR2,
};
enum WDSPRxNBScheme
{
NBSchemeNB,
NBSchemeNB2,
};
enum WDSPRxNR2Gain
{
NR2GainLinear,
NR2GainLog,
NR2GainGamma,
};
enum WDSPRxNR2NPE
{
NR2NPEOSMS,
NR2NPEMMSE,
};
enum WDSPRxNRPosition
{
NRPositionPreAGC,
NRPositionPostAGC,
};
enum WDSPRxNB2Mode
{
NB2ModeZero,
NB2ModeSampleAndHold,
NB2ModeMeanHold,
NB2ModeHoldSample,
NB2ModeInterpolate,
};
// Filter
int m_spanLog2;
Real m_highCutoff;
Real m_lowCutoff;
int m_fftWindow; // 0: 4-term Blackman-Harris, 1: 7-term Blackman-Harris
// AGC
bool m_agc;
WDSPRxAGCMode m_agcMode;
int m_agcGain; //!< Fixed gain if AGC is off else top gain
int m_agcSlope;
int m_agcHangThreshold;
// Noise blanker
bool m_dnb;
WDSPRxNBScheme m_nbScheme;
WDSPRxNB2Mode m_nb2Mode;
double m_nbSlewTime;
double m_nbLeadTime;
double m_nbLagTime;
int m_nbThreshold;
// Noise rediction
bool m_dnr;
bool m_snb;
bool m_anf;
WDSPRxNRScheme m_nrScheme;
WDSPRxNR2Gain m_nr2Gain;
WDSPRxNR2NPE m_nr2NPE;
WDSPRxNRPosition m_nrPosition;
bool m_nr2ArtifactReduction;
WDSPRxProfile() :
m_spanLog2(3),
m_highCutoff(3000),
m_lowCutoff(300),
m_fftWindow(0),
m_agc(false),
m_agcMode(AGCMedium),
m_agcGain(80),
m_agcSlope(35),
m_agcHangThreshold(0),
m_dnb(false),
m_nbScheme(NBSchemeNB),
m_nb2Mode(NB2ModeZero),
m_nbSlewTime(0.01),
m_nbLeadTime(0.01),
m_nbLagTime(0.01),
m_nbThreshold(30),
m_dnr(false),
m_snb(false),
m_anf(false),
m_nrScheme(NRSchemeNR),
m_nr2Gain(NR2GainGamma),
m_nr2NPE(NR2NPEOSMS),
m_nrPosition(NRPositionPreAGC),
m_nr2ArtifactReduction(true)
{}
};
struct WDSPRxSettings
{
qint32 m_inputFrequencyOffset;
// Real m_highCutoff;
// Real m_lowCutoff;
@ -65,17 +138,30 @@ struct WDSPRxSettings
bool m_audioFlipChannels;
bool m_dsb;
bool m_audioMute;
// AGC
bool m_agc;
AGCMode m_agcMode;
WDSPRxProfile::WDSPRxAGCMode m_agcMode;
int m_agcGain; //!< Fixed gain if AGC is off else top gain
int m_agcSlope;
int m_agcHangThreshold;
// Noise blanker
bool m_dnb;
WDSPRxProfile::WDSPRxNBScheme m_nbScheme;
WDSPRxProfile::WDSPRxNB2Mode m_nb2Mode;
double m_nbSlewTime;
double m_nbLeadTime;
double m_nbLagTime;
int m_nbThreshold;
// Noise reduction
bool m_dnr;
int m_dnrScheme;
float m_dnrAboveAvgFactor;
float m_dnrSigmaFactor;
int m_dnrNbPeaks;
float m_dnrAlpha;
bool m_snb;
bool m_anf;
WDSPRxProfile::WDSPRxNRScheme m_nrScheme;
WDSPRxProfile::WDSPRxNR2Gain m_nr2Gain;
WDSPRxProfile::WDSPRxNR2NPE m_nr2NPE;
WDSPRxProfile::WDSPRxNRPosition m_nrPosition;
bool m_nr2ArtifactReduction;
quint32 m_rgbColor;
QString m_title;
QString m_audioDeviceName;
@ -88,9 +174,8 @@ struct WDSPRxSettings
int m_workspaceIndex;
QByteArray m_geometryBytes;
bool m_hidden;
// FFTWindow::Function m_fftWindow;
std::vector<WDSPRxFilterSettings> m_filterBank;
unsigned int m_filterIndex;
std::vector<WDSPRxProfile> m_profiles;
unsigned int m_profileIndex;
Serializable *m_channelMarker;
Serializable *m_spectrumGUI;

View File

@ -322,11 +322,11 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
{
qDebug() << "WDSPRxSink::applySettings:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_filterIndex: " << settings.m_filterIndex
<< " m_spanLog2: " << settings.m_filterBank[settings.m_filterIndex].m_spanLog2
<< " m_highCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_highCutoff
<< " m_lowCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_lowCutoff
<< " m_fftWindow: " << settings.m_filterBank[settings.m_filterIndex].m_fftWindow << "]"
<< " m_profileIndex: " << settings.m_profileIndex
<< " m_spanLog2: " << settings.m_profiles[settings.m_profileIndex].m_spanLog2
<< " m_highCutoff: " << settings.m_profiles[settings.m_profileIndex].m_highCutoff
<< " m_lowCutoff: " << settings.m_profiles[settings.m_profileIndex].m_lowCutoff
<< " m_fftWindow: " << settings.m_profiles[settings.m_profileIndex].m_fftWindow << "]"
<< " m_volume: " << settings.m_volume
<< " m_audioBinaural: " << settings.m_audioBinaural
<< " m_audioFlipChannels: " << settings.m_audioFlipChannels
@ -346,16 +346,16 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< " force: " << force;
if((m_settings.m_filterBank[m_settings.m_filterIndex].m_highCutoff != settings.m_filterBank[settings.m_filterIndex].m_highCutoff) ||
(m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff != settings.m_filterBank[settings.m_filterIndex].m_lowCutoff) ||
(m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow != settings.m_filterBank[settings.m_filterIndex].m_fftWindow) ||
if((m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff != settings.m_profiles[settings.m_profileIndex].m_highCutoff) ||
(m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff != settings.m_profiles[settings.m_profileIndex].m_lowCutoff) ||
(m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow != settings.m_profiles[settings.m_profileIndex].m_fftWindow) ||
(m_settings.m_dsb != settings.m_dsb) || force)
{
float band, low, high, fLow, fHigh;
band = settings.m_filterBank[settings.m_filterIndex].m_highCutoff;
band = settings.m_profiles[settings.m_profileIndex].m_highCutoff;
high = band;
low = settings.m_filterBank[settings.m_filterIndex].m_lowCutoff;
low = settings.m_profiles[settings.m_profileIndex].m_lowCutoff;
if (band < 0)
{
@ -406,11 +406,11 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) m_audioSampleRate;
WDSP::RXA::SetPassband(*m_rxa, fLow, fHigh);
WDSP::NBP::NBPSetWindow(*m_rxa, m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow);
WDSP::NBP::NBPSetWindow(*m_rxa, m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow);
}
if ((m_settings.m_filterBank[settings.m_filterIndex].m_spanLog2 != settings.m_filterBank[settings.m_filterIndex].m_spanLog2) || force) {
m_spectrumProbe.setSpanLog2(settings.m_filterBank[settings.m_filterIndex].m_spanLog2);
if ((m_settings.m_profiles[settings.m_profileIndex].m_spanLog2 != settings.m_profiles[settings.m_profileIndex].m_spanLog2) || force) {
m_spectrumProbe.setSpanLog2(settings.m_profiles[settings.m_profileIndex].m_spanLog2);
}
if ((m_settings.m_agc != settings.m_agc)
@ -427,25 +427,25 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
{
switch (settings.m_agcMode)
{
case WDSPRxSettings::AGCMode::AGCLong:
case WDSPRxProfile::WDSPRxAGCMode::AGCLong:
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 2000); // SetRXAAGCHang(id, 2000);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 2000); // SetRXAAGCDecay(id, 2000);
WDSP::WCPAGC::SetAGCHangThreshold(*m_rxa, settings.m_agcHangThreshold); // SetRXAAGCHangThreshold(id, (int)rx->agc_hang_threshold);
break;
case WDSPRxSettings::AGCMode::AGCSlow:
case WDSPRxProfile::WDSPRxAGCMode::AGCSlow:
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 1000); // SetRXAAGCHang(id, 1000);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 500); // SetRXAAGCDecay(id, 500);
WDSP::WCPAGC::SetAGCHangThreshold(*m_rxa, settings.m_agcHangThreshold); // SetRXAAGCHangThreshold(id, (int)rx->agc_hang_threshold);
break;
case WDSPRxSettings::AGCMode::AGCMedium:
case WDSPRxProfile::WDSPRxAGCMode::AGCMedium:
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 0); // SetRXAAGCHang(id, 0);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 250); // SetRXAAGCDecay(id, 250);
WDSP::WCPAGC::SetAGCHangThreshold(*m_rxa, settings.m_agcHangThreshold); // SetRXAAGCHangThreshold(id, 100);
break;
case WDSPRxSettings::AGCMode::AGCFast:
case WDSPRxProfile::WDSPRxAGCMode::AGCFast:
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 0); // SetRXAAGCHang(id, 0);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 50); // SetRXAAGCDecay(id, 50);