NFM Demod: AF squelch crap

This commit is contained in:
f4exb 2017-05-12 14:41:27 +02:00
parent 07fc282d89
commit 74f65fcbdc
6 changed files with 65 additions and 23 deletions

View File

@ -38,6 +38,7 @@ NFMDemod::NFMDemod() :
m_squelchGate(2400),
m_audioMute(false),
m_squelchOpen(false),
m_afSquelchOpen(false),
m_magsq(0.0f),
m_magsqSum(0.0f),
m_magsqPeak(0.0f),
@ -180,22 +181,46 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
// AF processing
if ( (m_running.m_deltaSquelch && ((deviation > m_squelchLevel) || (deviation < -m_squelchLevel))) ||
(!m_running.m_deltaSquelch && (m_movingAverage.average() < m_squelchLevel)) )
if (m_running.m_deltaSquelch)
{
if (m_squelchCount > 0)
{
m_squelchCount--;
}
if (m_afSquelch.analyze(demod)) {
m_squelchCount = m_afSquelch.evaluate() ? m_squelchGate + 480 : 0;
}
}
else
{
if (m_squelchCount < m_squelchGate + 480)
{
m_squelchCount++;
}
if (m_movingAverage.average() < m_squelchLevel)
{
if (m_squelchCount > 0)
{
m_squelchCount--;
}
}
else
{
if (m_squelchCount < m_squelchGate + 480)
{
m_squelchCount++;
}
}
}
// if ( (m_running.m_deltaSquelch && ((deviation > m_squelchLevel) || (deviation < -m_squelchLevel))) ||
// (!m_running.m_deltaSquelch && (m_movingAverage.average() < m_squelchLevel)) )
// {
// if (m_squelchCount > 0)
// {
// m_squelchCount--;
// }
// }
// else
// {
// if (m_squelchCount < m_squelchGate + 480)
// {
// m_squelchCount++;
// }
// }
//squelchOpen = (getMag() > m_squelchLevel);
m_squelchOpen = (m_squelchCount > m_squelchGate);
@ -244,9 +269,17 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
}
else
{
Real squelchFactor = (Real) (m_squelchCount - m_squelchGate) / 480.0f;
demod = m_bandpass.filter(demod);
sample = demod * m_running.m_volume * squelchFactor * squelchFactor;
demod = m_bandpass.filter(demod);
if (m_running.m_deltaSquelch)
{
sample = demod * m_running.m_volume;
}
else
{
Real squelchFactor = (Real) (m_squelchCount - m_squelchGate) / 480.0f;
sample = demod * m_running.m_volume * squelchFactor * squelchFactor;
}
}
}
else
@ -400,13 +433,17 @@ void NFMDemod::apply()
if ((m_config.m_squelch != m_running.m_squelch) ||
(m_config.m_deltaSquelch != m_running.m_deltaSquelch))
{
if (m_config.m_deltaSquelch) { // input is a value in negative millis
m_squelchLevel = - m_config.m_squelch / 1000.0;
} else { // input is a value in centi-Bels
if (m_config.m_deltaSquelch)
{ // input is a value in negative millis
m_squelchLevel = (- m_config.m_squelch) / 1000.0;
m_afSquelch.setThreshold(m_squelchLevel);
}
else
{ // input is a value in centi-Bels
m_squelchLevel = std::pow(10.0, m_config.m_squelch / 100.0);
}
//m_squelchLevel *= m_squelchLevel;
//m_afSquelch.setThreshold(m_squelchLevel);
//m_afSquelch.setThreshold(m_squelchLevel);
}
m_running.m_inputSampleRate = m_config.m_inputSampleRate;

View File

@ -215,6 +215,7 @@ private:
Real m_squelchLevel;
bool m_squelchOpen;
bool m_afSquelchOpen;
Real m_magsq; //!< displayed averaged value
Real m_magsqSum;
Real m_magsqPeak;

View File

@ -216,7 +216,7 @@ void NFMDemodGUI::on_deltaSquelch_toggled(bool checked)
if (ui->deltaSquelch->isChecked())
{
ui->squelchText->setText(QString("%1").arg((-ui->squelch->value()) / 10.0, 0, 'f', 1));
ui->squelchText->setToolTip(tr("Squelch deviation threshold (%)"));
ui->squelchText->setToolTip(tr("Squelch AF balance threshold (%)"));
}
else
{

View File

@ -407,8 +407,11 @@
<height>24</height>
</size>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Toggle frequency deviation (on) or channel power (off) based squelch</string>
<string>Toggle AF balance (on) or channel power (off) based squelch</string>
</property>
<property name="text">
<string>D</string>

View File

@ -37,7 +37,7 @@ AFSquelch::AFSquelch() :
m_u0 = new double[m_nTones];
m_u1 = new double[m_nTones];
m_power = new double[m_nTones];
m_movingAverages.resize(m_nTones, MovingAverage<Real>(m_nbAvg, 0.0));
m_movingAverages.resize(m_nTones, MovingAverage<double>(m_nbAvg, 0.0));
m_toneSet[0] = 2000.0;
m_toneSet[1] = 10000.0;
@ -89,7 +89,7 @@ void AFSquelch::setCoefficients(int N, unsigned int nbAvg, int _samplerate, int
m_sampleRate = _samplerate;
m_samplesAttack = _samplesAttack;
m_samplesDecay = _samplesDecay;
m_movingAverages.resize(m_nTones, MovingAverage<Real>(m_nbAvg, 0.0));
m_movingAverages.resize(m_nTones, MovingAverage<double>(m_nbAvg, 1.0));
// for each of the frequencies (tones) of interest calculate
// k and the associated filter coefficient as per the Goertzel
@ -169,7 +169,7 @@ void AFSquelch::reset()
bool AFSquelch::evaluate()
{
double maxPower = 0.0;
double maxPower = 1.0;
double minPower;
int minIndex = 0, maxIndex = 0;
@ -194,6 +194,7 @@ bool AFSquelch::evaluate()
// principle is to open if power is uneven because noise gives even power
bool open = (minPower/maxPower < m_threshold) && (minIndex > maxIndex);
//qDebug("AFSquelch::evaluate: %g : %g", minPower/maxPower, m_threshold);
if (open)
{

View File

@ -83,7 +83,7 @@ private:
double *m_u0;
double *m_u1;
double *m_power;
std::vector<MovingAverage<Real> > m_movingAverages;
std::vector<MovingAverage<double> > m_movingAverages;
};