1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-06 07:07:48 -04:00

AF squelch init sequence review

This commit is contained in:
f4exb 2017-05-13 15:07:56 +02:00
parent 9dc6fac63e
commit efb52beb09
2 changed files with 41 additions and 11 deletions

View File

@ -22,6 +22,7 @@ AFSquelch::AFSquelch() :
m_N(0), m_N(0),
m_sampleRate(0), m_sampleRate(0),
m_samplesProcessed(0), m_samplesProcessed(0),
m_samplesAvgProcessed(0),
m_maxPowerIndex(0), m_maxPowerIndex(0),
m_nTones(2), m_nTones(2),
m_samplesAttack(0), m_samplesAttack(0),
@ -37,10 +38,19 @@ 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<double>(m_nbAvg, 1.0f)); m_movingAverages.resize(m_nTones, MovingAverage<double>(m_nbAvg, 0.0f));
m_toneSet[0] = 2000.0; m_toneSet[0] = 2000.0;
m_toneSet[1] = 10000.0; m_toneSet[1] = 10000.0;
for (int j = 0; j < m_nTones; ++j)
{
m_k[j] = ((double)m_N * m_toneSet[j]) / (double)m_sampleRate;
m_coef[j] = 2.0 * cos((2.0 * M_PI * m_toneSet[j])/(double)m_sampleRate);
m_u0[j] = 0.0;
m_u1[j] = 0.0;
m_power[j] = 0.0;
}
} }
AFSquelch::AFSquelch(unsigned int nbTones, const Real *tones) : AFSquelch::AFSquelch(unsigned int nbTones, const Real *tones) :
@ -48,6 +58,7 @@ AFSquelch::AFSquelch(unsigned int nbTones, const Real *tones) :
m_nbAvg(128), m_nbAvg(128),
m_sampleRate(0), m_sampleRate(0),
m_samplesProcessed(0), m_samplesProcessed(0),
m_samplesAvgProcessed(0),
m_maxPowerIndex(0), m_maxPowerIndex(0),
m_nTones(nbTones), m_nTones(nbTones),
m_samplesAttack(0), m_samplesAttack(0),
@ -63,11 +74,16 @@ AFSquelch::AFSquelch(unsigned int nbTones, const Real *tones) :
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<double>(m_nbAvg, 1.0f)); m_movingAverages.resize(m_nTones, MovingAverage<double>(m_nbAvg, 0.0f));
for (int j = 0; j < m_nTones; ++j) for (int j = 0; j < m_nTones; ++j)
{ {
m_toneSet[j] = tones[j]; m_toneSet[j] = tones[j];
m_k[j] = ((double)m_N * m_toneSet[j]) / (double)m_sampleRate;
m_coef[j] = 2.0 * cos((2.0 * M_PI * m_toneSet[j])/(double)m_sampleRate);
m_u0[j] = 0.0;
m_u1[j] = 0.0;
m_power[j] = 0.0;
} }
} }
@ -90,8 +106,9 @@ 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<double>(m_nbAvg, 1.0)); m_movingAverages.resize(m_nTones, MovingAverage<double>(m_nbAvg, 0.0));
m_samplesProcessed = 0; m_samplesProcessed = 0;
m_samplesAvgProcessed = 0;
m_maxPowerIndex = 0; m_maxPowerIndex = 0;
m_attackCount = 0; m_attackCount = 0;
m_decayCount = 0; m_decayCount = 0;
@ -109,6 +126,9 @@ void AFSquelch::setCoefficients(int N, unsigned int nbAvg, int _samplerate, int
{ {
m_k[j] = ((double)m_N * m_toneSet[j]) / (double)m_sampleRate; m_k[j] = ((double)m_N * m_toneSet[j]) / (double)m_sampleRate;
m_coef[j] = 2.0 * cos((2.0 * M_PI * m_toneSet[j])/(double)m_sampleRate); m_coef[j] = 2.0 * cos((2.0 * M_PI * m_toneSet[j])/(double)m_sampleRate);
m_u0[j] = 0.0;
m_u1[j] = 0.0;
m_power[j] = 0.0;
} }
} }
@ -118,18 +138,27 @@ bool AFSquelch::analyze(Real sample)
{ {
feedback(sample); // Goertzel feedback feedback(sample); // Goertzel feedback
m_samplesProcessed += 1;
if (m_samplesProcessed == m_N) // completed a block of N if (m_samplesProcessed < m_N) // completed a block of N
{ {
feedForward(); // calculate the power at each tone m_samplesProcessed++;
m_samplesProcessed = 0; return false;
return true; // have a result
} }
else else
{ {
feedForward(); // calculate the power at each tone
m_samplesProcessed = 0;
if (m_samplesAvgProcessed < m_nbAvg)
{
m_samplesAvgProcessed++;
return false; return false;
} }
else
{
return true; // have a result
}
}
} }
@ -176,7 +205,7 @@ void AFSquelch::reset()
bool AFSquelch::evaluate() bool AFSquelch::evaluate()
{ {
double maxPower = 1.0; double maxPower = 0.0;
double minPower; double minPower;
int minIndex = 0, maxIndex = 0; int minIndex = 0, maxIndex = 0;
@ -200,7 +229,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 = maxPower == 0.0 ? true : (minPower/maxPower < m_threshold) && (minIndex > maxIndex);
//qDebug("AFSquelch::evaluate: %g : %g", minPower/maxPower, m_threshold); //qDebug("AFSquelch::evaluate: %g : %g", minPower/maxPower, m_threshold);
if (open) if (open)

View File

@ -69,6 +69,7 @@ private:
int m_N; int m_N;
int m_sampleRate; int m_sampleRate;
int m_samplesProcessed; int m_samplesProcessed;
int m_samplesAvgProcessed;
int m_maxPowerIndex; int m_maxPowerIndex;
int m_nTones; int m_nTones;
int m_samplesAttack; int m_samplesAttack;