1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-25 17:28:50 -05:00

NFM modulator: try to improve audio input

This commit is contained in:
f4exb 2022-08-15 13:09:49 +02:00
parent d699271fcd
commit 532e794fca
12 changed files with 53 additions and 2 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

View File

@ -279,6 +279,12 @@ void NFMModGUI::on_mic_toggled(bool checked)
applySettings(); applySettings();
} }
void NFMModGUI::on_compressor_toggled(bool checked)
{
m_settings.m_compressorEnable = checked;
applySettings();
}
void NFMModGUI::on_feedbackEnable_toggled(bool checked) void NFMModGUI::on_feedbackEnable_toggled(bool checked)
{ {
m_settings.m_feedbackAudioEnable = checked; m_settings.m_feedbackAudioEnable = checked;
@ -581,6 +587,7 @@ void NFMModGUI::displaySettings()
ui->dcsCode->setText(tr("%1").arg(m_settings.m_dcsCode, 3, 8, QLatin1Char('0'))); ui->dcsCode->setText(tr("%1").arg(m_settings.m_dcsCode, 3, 8, QLatin1Char('0')));
ui->dcsPositive->setChecked(m_settings.m_dcsPositive); ui->dcsPositive->setChecked(m_settings.m_dcsPositive);
ui->bpf->setChecked(m_settings.m_bpfOn); ui->bpf->setChecked(m_settings.m_bpfOn);
ui->compressor->setChecked(m_settings.m_compressorEnable);
ui->channelMute->setChecked(m_settings.m_channelMute); ui->channelMute->setChecked(m_settings.m_channelMute);
ui->playLoop->setChecked(m_settings.m_playLoop); ui->playLoop->setChecked(m_settings.m_playLoop);
@ -729,6 +736,7 @@ void NFMModGUI::makeUIConnections()
QObject::connect(ui->tone, &ButtonSwitch::toggled, this, &NFMModGUI::on_tone_toggled); QObject::connect(ui->tone, &ButtonSwitch::toggled, this, &NFMModGUI::on_tone_toggled);
QObject::connect(ui->morseKeyer, &ButtonSwitch::toggled, this, &NFMModGUI::on_morseKeyer_toggled); QObject::connect(ui->morseKeyer, &ButtonSwitch::toggled, this, &NFMModGUI::on_morseKeyer_toggled);
QObject::connect(ui->mic, &ButtonSwitch::toggled, this, &NFMModGUI::on_mic_toggled); QObject::connect(ui->mic, &ButtonSwitch::toggled, this, &NFMModGUI::on_mic_toggled);
QObject::connect(ui->compressor, &ButtonSwitch::toggled, this, &NFMModGUI::on_compressor_toggled);
QObject::connect(ui->play, &ButtonSwitch::toggled, this, &NFMModGUI::on_play_toggled); QObject::connect(ui->play, &ButtonSwitch::toggled, this, &NFMModGUI::on_play_toggled);
QObject::connect(ui->playLoop, &ButtonSwitch::toggled, this, &NFMModGUI::on_playLoop_toggled); QObject::connect(ui->playLoop, &ButtonSwitch::toggled, this, &NFMModGUI::on_playLoop_toggled);
QObject::connect(ui->navTimeSlider, &QSlider::valueChanged, this, &NFMModGUI::on_navTimeSlider_valueChanged); QObject::connect(ui->navTimeSlider, &QSlider::valueChanged, this, &NFMModGUI::on_navTimeSlider_valueChanged);

View File

@ -122,6 +122,7 @@ private slots:
void on_tone_toggled(bool checked); void on_tone_toggled(bool checked);
void on_morseKeyer_toggled(bool checked); void on_morseKeyer_toggled(bool checked);
void on_mic_toggled(bool checked); void on_mic_toggled(bool checked);
void on_compressor_toggled(bool checked);
void on_play_toggled(bool checked); void on_play_toggled(bool checked);
void on_playLoop_toggled(bool checked); void on_playLoop_toggled(bool checked);

View File

@ -589,6 +589,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="ButtonSwitch" name="compressor">
<property name="toolTip">
<string>Audio input compressor on/off</string>
</property>
<property name="text">
<string>CMP</string>
</property>
</widget>
</item>
<item> <item>
<widget class="Line" name="line_3"> <widget class="Line" name="line_3">
<property name="orientation"> <property name="orientation">

View File

@ -75,6 +75,7 @@ void NFMModSettings::resetToDefaults()
m_feedbackAudioDeviceName = AudioDeviceManager::m_defaultDeviceName; m_feedbackAudioDeviceName = AudioDeviceManager::m_defaultDeviceName;
m_feedbackVolumeFactor = 0.5f; m_feedbackVolumeFactor = 0.5f;
m_feedbackAudioEnable = false; m_feedbackAudioEnable = false;
m_compressorEnable = false;
m_streamIndex = 0; m_streamIndex = 0;
m_useReverseAPI = false; m_useReverseAPI = false;
m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIAddress = "127.0.0.1";
@ -135,6 +136,7 @@ QByteArray NFMModSettings::serialize() const
s.writeBool(30, m_hidden); s.writeBool(30, m_hidden);
s.writeBool(31, m_preEmphasisOn); s.writeBool(31, m_preEmphasisOn);
s.writeBool(32, m_bpfOn); s.writeBool(32, m_bpfOn);
s.writeBool(33, m_compressorEnable);
return s.final(); return s.final();
} }
@ -224,6 +226,7 @@ bool NFMModSettings::deserialize(const QByteArray& data)
d.readBool(30, &m_hidden, false); d.readBool(30, &m_hidden, false);
d.readBool(31, &m_preEmphasisOn, true); d.readBool(31, &m_preEmphasisOn, true);
d.readBool(32, &m_bpfOn, true); d.readBool(32, &m_bpfOn, true);
d.readBool(33, &m_compressorEnable, false);
return true; return true;
} }

View File

@ -63,6 +63,7 @@ struct NFMModSettings
QString m_feedbackAudioDeviceName; //!< This is the audio device you send the audio samples to for audio feedback QString m_feedbackAudioDeviceName; //!< This is the audio device you send the audio samples to for audio feedback
float m_feedbackVolumeFactor; float m_feedbackVolumeFactor;
bool m_feedbackAudioEnable; bool m_feedbackAudioEnable;
bool m_compressorEnable;
int m_streamIndex; int m_streamIndex;
bool m_useReverseAPI; bool m_useReverseAPI;
QString m_reverseAPIAddress; QString m_reverseAPIAddress;

View File

@ -55,6 +55,16 @@ NFMModSource::NFMModSource() :
m_magsq = 0.0; m_magsq = 0.0;
m_audioCompressor.initSimple(
m_audioSampleRate,
-8, // pregain (dB)
-20, // threshold (dB)
20, // knee (dB)
15, // ratio (dB)
0.003, // attack (s)
0.25 // release (s)
);
applySettings(m_settings, true); applySettings(m_settings, true);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
} }
@ -242,7 +252,16 @@ void NFMModSource::pullAF(Real& sample)
case NFMModSettings::NFMModInputAudio: case NFMModSettings::NFMModInputAudio:
if (m_audioBufferFill < m_audioBuffer.size()) if (m_audioBufferFill < m_audioBuffer.size())
{ {
sample = ((m_audioBuffer[m_audioBufferFill].l + m_audioBuffer[m_audioBufferFill].r) / 65536.0f) * m_settings.m_volumeFactor; if (m_settings.m_compressorEnable)
{
sample = ((m_audioBuffer[m_audioBufferFill].l + m_audioBuffer[m_audioBufferFill].r) / 3276.8f);
sample = clamp<float>(m_audioCompressor.compress(sample), -1.0f, 1.0f) * m_settings.m_volumeFactor * 3.0f;
}
else
{
sample = ((m_audioBuffer[m_audioBufferFill].l + m_audioBuffer[m_audioBufferFill].r) / 3276.8f) * m_settings.m_volumeFactor;
}
m_audioBufferFill++; m_audioBufferFill++;
} }
else else
@ -365,6 +384,8 @@ void NFMModSource::applyAudioSampleRate(int sampleRate)
m_cwKeyer.setSampleRate(sampleRate); m_cwKeyer.setSampleRate(sampleRate);
m_cwKeyer.reset(); m_cwKeyer.reset();
m_preemphasisFilter.configure(m_preemphasis*sampleRate); m_preemphasisFilter.configure(m_preemphasis*sampleRate);
m_audioCompressor.m_rate = sampleRate;
m_audioCompressor.initState();
m_audioSampleRate = sampleRate; m_audioSampleRate = sampleRate;
applyFeedbackAudioSampleRate(m_feedbackAudioSampleRate); applyFeedbackAudioSampleRate(m_feedbackAudioSampleRate);

View File

@ -34,6 +34,7 @@
#include "util/movingaverage.h" #include "util/movingaverage.h"
#include "dsp/cwkeyer.h" #include "dsp/cwkeyer.h"
#include "audio/audiofifo.h" #include "audio/audiofifo.h"
#include "audio/audiocompressorsnd.h"
#include "nfmmodsettings.h" #include "nfmmodsettings.h"
#include "nfmmoddcs.h" #include "nfmmoddcs.h"
@ -124,6 +125,8 @@ private:
std::ifstream *m_ifstream; std::ifstream *m_ifstream;
CWKeyer m_cwKeyer; CWKeyer m_cwKeyer;
AudioCompressorSnd m_audioCompressor;
QMutex m_mutex; QMutex m_mutex;
static const int m_levelNbSamples; static const int m_levelNbSamples;

View File

@ -122,7 +122,7 @@ You should aim at keeping the peak value below 100% using the volume control
<h3>10: Input source control</h3> <h3>10: Input source control</h3>
![Modulator input source control GUI](../../../doc/img/ModControls.png) ![Modulator input source control GUI](../../../doc/img/NFMMod_plugin_input.png)
<h4>10.1: Tone input select</h4> <h4>10.1: Tone input select</h4>
@ -142,6 +142,10 @@ Left click to switch to the audio input. You must switch it off to make other in
Right click to select audio input device. See [audio management documentation](../../../sdrgui/audio.md) for details. Right click to select audio input device. See [audio management documentation](../../../sdrgui/audio.md) for details.
<h4>10.5: Audio input compression</h4>
Toggles the compressor for the audio input.
<h3>11: Audio feedback</h3> <h3>11: Audio feedback</h3>
Activate or de-activate the input source audio feedback Activate or de-activate the input source audio feedback