mirror of https://github.com/f4exb/sdrangel.git
NFM Demod: AF squelch crap
This commit is contained in:
parent
07fc282d89
commit
74f65fcbdc
|
@ -38,6 +38,7 @@ NFMDemod::NFMDemod() :
|
||||||
m_squelchGate(2400),
|
m_squelchGate(2400),
|
||||||
m_audioMute(false),
|
m_audioMute(false),
|
||||||
m_squelchOpen(false),
|
m_squelchOpen(false),
|
||||||
|
m_afSquelchOpen(false),
|
||||||
m_magsq(0.0f),
|
m_magsq(0.0f),
|
||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
m_magsqPeak(0.0f),
|
m_magsqPeak(0.0f),
|
||||||
|
@ -180,22 +181,46 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
||||||
|
|
||||||
// AF processing
|
// AF processing
|
||||||
|
|
||||||
if ( (m_running.m_deltaSquelch && ((deviation > m_squelchLevel) || (deviation < -m_squelchLevel))) ||
|
if (m_running.m_deltaSquelch)
|
||||||
(!m_running.m_deltaSquelch && (m_movingAverage.average() < m_squelchLevel)) )
|
|
||||||
{
|
{
|
||||||
if (m_squelchCount > 0)
|
if (m_afSquelch.analyze(demod)) {
|
||||||
{
|
m_squelchCount = m_afSquelch.evaluate() ? m_squelchGate + 480 : 0;
|
||||||
m_squelchCount--;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_squelchCount < m_squelchGate + 480)
|
if (m_movingAverage.average() < m_squelchLevel)
|
||||||
{
|
{
|
||||||
m_squelchCount++;
|
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);
|
//squelchOpen = (getMag() > m_squelchLevel);
|
||||||
m_squelchOpen = (m_squelchCount > m_squelchGate);
|
m_squelchOpen = (m_squelchCount > m_squelchGate);
|
||||||
|
|
||||||
|
@ -244,9 +269,17 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Real squelchFactor = (Real) (m_squelchCount - m_squelchGate) / 480.0f;
|
demod = m_bandpass.filter(demod);
|
||||||
demod = m_bandpass.filter(demod);
|
|
||||||
sample = demod * m_running.m_volume * squelchFactor * squelchFactor;
|
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
|
else
|
||||||
|
@ -400,13 +433,17 @@ void NFMDemod::apply()
|
||||||
if ((m_config.m_squelch != m_running.m_squelch) ||
|
if ((m_config.m_squelch != m_running.m_squelch) ||
|
||||||
(m_config.m_deltaSquelch != m_running.m_deltaSquelch))
|
(m_config.m_deltaSquelch != m_running.m_deltaSquelch))
|
||||||
{
|
{
|
||||||
if (m_config.m_deltaSquelch) { // input is a value in negative millis
|
if (m_config.m_deltaSquelch)
|
||||||
m_squelchLevel = - m_config.m_squelch / 1000.0;
|
{ // input is a value in negative millis
|
||||||
} else { // input is a value in centi-Bels
|
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 = std::pow(10.0, m_config.m_squelch / 100.0);
|
||||||
}
|
}
|
||||||
//m_squelchLevel *= m_squelchLevel;
|
//m_squelchLevel *= m_squelchLevel;
|
||||||
//m_afSquelch.setThreshold(m_squelchLevel);
|
//m_afSquelch.setThreshold(m_squelchLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_running.m_inputSampleRate = m_config.m_inputSampleRate;
|
m_running.m_inputSampleRate = m_config.m_inputSampleRate;
|
||||||
|
|
|
@ -215,6 +215,7 @@ private:
|
||||||
|
|
||||||
Real m_squelchLevel;
|
Real m_squelchLevel;
|
||||||
bool m_squelchOpen;
|
bool m_squelchOpen;
|
||||||
|
bool m_afSquelchOpen;
|
||||||
Real m_magsq; //!< displayed averaged value
|
Real m_magsq; //!< displayed averaged value
|
||||||
Real m_magsqSum;
|
Real m_magsqSum;
|
||||||
Real m_magsqPeak;
|
Real m_magsqPeak;
|
||||||
|
|
|
@ -216,7 +216,7 @@ void NFMDemodGUI::on_deltaSquelch_toggled(bool checked)
|
||||||
if (ui->deltaSquelch->isChecked())
|
if (ui->deltaSquelch->isChecked())
|
||||||
{
|
{
|
||||||
ui->squelchText->setText(QString("%1").arg((-ui->squelch->value()) / 10.0, 0, 'f', 1));
|
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
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -407,8 +407,11 @@
|
||||||
<height>24</height>
|
<height>24</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="acceptDrops">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
<property name="toolTip">
|
<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>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>D</string>
|
<string>D</string>
|
||||||
|
|
|
@ -37,7 +37,7 @@ AFSquelch::AFSquelch() :
|
||||||
m_u0 = new double[m_nTones];
|
m_u0 = new double[m_nTones];
|
||||||
m_u1 = new double[m_nTones];
|
m_u1 = new double[m_nTones];
|
||||||
m_power = 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[0] = 2000.0;
|
||||||
m_toneSet[1] = 10000.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_sampleRate = _samplerate;
|
||||||
m_samplesAttack = _samplesAttack;
|
m_samplesAttack = _samplesAttack;
|
||||||
m_samplesDecay = _samplesDecay;
|
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
|
// for each of the frequencies (tones) of interest calculate
|
||||||
// k and the associated filter coefficient as per the Goertzel
|
// k and the associated filter coefficient as per the Goertzel
|
||||||
|
@ -169,7 +169,7 @@ void AFSquelch::reset()
|
||||||
|
|
||||||
bool AFSquelch::evaluate()
|
bool AFSquelch::evaluate()
|
||||||
{
|
{
|
||||||
double maxPower = 0.0;
|
double maxPower = 1.0;
|
||||||
double minPower;
|
double minPower;
|
||||||
int minIndex = 0, maxIndex = 0;
|
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
|
// principle is to open if power is uneven because noise gives even power
|
||||||
bool open = (minPower/maxPower < m_threshold) && (minIndex > maxIndex);
|
bool open = (minPower/maxPower < m_threshold) && (minIndex > maxIndex);
|
||||||
|
//qDebug("AFSquelch::evaluate: %g : %g", minPower/maxPower, m_threshold);
|
||||||
|
|
||||||
if (open)
|
if (open)
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,7 +83,7 @@ private:
|
||||||
double *m_u0;
|
double *m_u0;
|
||||||
double *m_u1;
|
double *m_u1;
|
||||||
double *m_power;
|
double *m_power;
|
||||||
std::vector<MovingAverage<Real> > m_movingAverages;
|
std::vector<MovingAverage<double> > m_movingAverages;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue