UDP source plugin: optimize squelch gate and release times for SSB

This commit is contained in:
f4exb 2017-08-20 23:44:40 +02:00
parent 872fa9bd20
commit f56bea2afe
3 changed files with 38 additions and 13 deletions

View File

@ -37,7 +37,8 @@ UDPSrc::UDPSrc(MessageQueue* uiMessageQueue, UDPSrcGUI* udpSrcGUI, BasebandSampl
m_squelchOpen(false), m_squelchOpen(false),
m_squelchOpenCount(0), m_squelchOpenCount(0),
m_squelchCloseCount(0), m_squelchCloseCount(0),
m_squelchThreshold(4800), m_squelchGate(4800),
m_squelchRelease(4800),
m_agc(9600, m_agcTarget, 1e-6), m_agc(9600, m_agcTarget, 1e-6),
m_settingsMutex(QMutex::Recursive) m_settingsMutex(QMutex::Recursive)
{ {
@ -448,11 +449,23 @@ void UDPSrc::apply(bool force)
m_interpolator.create(16, m_config.m_inputSampleRate, m_config.m_rfBandwidth / 2.0); m_interpolator.create(16, m_config.m_inputSampleRate, m_config.m_rfBandwidth / 2.0);
m_sampleDistanceRemain = m_config.m_inputSampleRate / m_config.m_outputSampleRate; m_sampleDistanceRemain = m_config.m_inputSampleRate / m_config.m_outputSampleRate;
m_squelchThreshold = m_config.m_outputSampleRate * m_config.m_squelchGate; if ((m_config.m_sampleFormat == FormatLSB) ||
(m_config.m_sampleFormat == FormatLSBMono) ||
(m_config.m_sampleFormat == FormatUSB) ||
(m_config.m_sampleFormat == FormatUSBMono))
{
m_squelchGate = m_config.m_outputSampleRate * 0.05;
}
else
{
m_squelchGate = m_config.m_outputSampleRate * m_config.m_squelchGate;
}
m_squelchRelease = m_config.m_outputSampleRate * m_config.m_squelchGate;
initSquelch(m_squelchOpen); initSquelch(m_squelchOpen);
m_agc.resize(m_config.m_outputSampleRate * 0.2, m_agcTarget); // Fixed 200 ms m_agc.resize(m_config.m_outputSampleRate * 0.2, m_agcTarget); // Fixed 200 ms
m_agc.setStepDownDelay( m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 0.01 : m_config.m_squelchGate)); m_agc.setStepDownDelay( m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 0.01 : m_config.m_squelchGate));
m_agc.setGate(m_config.m_outputSampleRate * 0.02); m_agc.setGate(m_config.m_outputSampleRate * 0.05);
m_bandpass.create(301, m_config.m_outputSampleRate, 300.0, m_config.m_rfBandwidth / 2.0f); m_bandpass.create(301, m_config.m_outputSampleRate, 300.0, m_config.m_rfBandwidth / 2.0f);
@ -476,10 +489,21 @@ void UDPSrc::apply(bool force)
if ((m_config.m_squelchGate != m_running.m_squelchGate) || force) if ((m_config.m_squelchGate != m_running.m_squelchGate) || force)
{ {
m_squelchThreshold = m_config.m_outputSampleRate * m_config.m_squelchGate; if ((m_config.m_sampleFormat == FormatLSB) ||
(m_config.m_sampleFormat == FormatLSBMono) ||
(m_config.m_sampleFormat == FormatUSB) ||
(m_config.m_sampleFormat == FormatUSBMono))
{
m_squelchGate = m_config.m_outputSampleRate * 0.05;
}
else
{
m_squelchGate = m_config.m_outputSampleRate * m_config.m_squelchGate;
}
m_squelchRelease = m_config.m_outputSampleRate * m_config.m_squelchGate;
initSquelch(m_squelchOpen); initSquelch(m_squelchOpen);
m_agc.setStepDownDelay(m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 0.01 : m_config.m_squelchGate)); // same delay for up and down m_agc.setStepDownDelay(m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 0.01 : m_config.m_squelchGate)); // same delay for up and down
m_agc.setGate(m_config.m_outputSampleRate * 0.02);
} }
if ((m_config.m_squelch != m_running.m_squelch) || force) if ((m_config.m_squelch != m_running.m_squelch) || force)

View File

@ -340,7 +340,8 @@ protected:
bool m_squelchOpen; bool m_squelchOpen;
int m_squelchOpenCount; int m_squelchOpenCount;
int m_squelchCloseCount; int m_squelchCloseCount;
int m_squelchThreshold; //!< number of samples computed from given gate int m_squelchGate; //!< number of samples computed from given gate
int m_squelchRelease;
MagAGC m_agc; MagAGC m_agc;
Bandpass<double> m_bandpass; Bandpass<double> m_bandpass;
@ -353,26 +354,26 @@ protected:
{ {
if ((!m_running.m_squelchEnabled) || (value > m_running.m_squelch)) if ((!m_running.m_squelchEnabled) || (value > m_running.m_squelch))
{ {
if (m_squelchThreshold == 0) if (m_squelchGate == 0)
{ {
m_squelchOpen = true; m_squelchOpen = true;
} }
else else
{ {
if (m_squelchOpenCount < m_squelchThreshold) if (m_squelchOpenCount < m_squelchGate)
{ {
m_squelchOpenCount++; m_squelchOpenCount++;
} }
else else
{ {
m_squelchCloseCount = m_squelchThreshold; m_squelchCloseCount = m_squelchRelease;
m_squelchOpen = true; m_squelchOpen = true;
} }
} }
} }
else else
{ {
if (m_squelchThreshold == 0) if (m_squelchGate == 0)
{ {
m_squelchOpen = false; m_squelchOpen = false;
} }
@ -396,8 +397,8 @@ protected:
if (open) if (open)
{ {
m_squelchOpen = true; m_squelchOpen = true;
m_squelchOpenCount = m_squelchThreshold; m_squelchOpenCount = m_squelchGate;
m_squelchCloseCount = m_squelchThreshold; m_squelchCloseCount = m_squelchRelease;
} }
else else
{ {

View File

@ -641,7 +641,7 @@
<string>Squelch gate (ms)</string> <string>Squelch gate (ms)</string>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>50</number> <number>90</number>
</property> </property>
<property name="pageStep"> <property name="pageStep">
<number>1</number> <number>1</number>