mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-09-29 16:26:47 -04:00
PLL lock indication fixes
This commit is contained in:
parent
ed08480226
commit
48cac5385b
@ -123,6 +123,7 @@ public:
|
|||||||
double getMagSq() const { return m_magsq; }
|
double getMagSq() const { return m_magsq; }
|
||||||
bool getSquelchOpen() const { return m_squelchOpen; }
|
bool getSquelchOpen() const { return m_squelchOpen; }
|
||||||
bool getPllLocked() const { return m_settings.m_pll && m_pll.locked(); }
|
bool getPllLocked() const { return m_settings.m_pll && m_pll.locked(); }
|
||||||
|
Real getPllFrequency() const { return m_pll.getFreq(); }
|
||||||
|
|
||||||
void getMagSqLevels(double& avg, double& peak, int& nbSamples)
|
void getMagSqLevels(double& avg, double& peak, int& nbSamples)
|
||||||
{
|
{
|
||||||
|
@ -142,8 +142,10 @@ void AMDemodGUI::on_deltaFrequency_changed(qint64 value)
|
|||||||
|
|
||||||
void AMDemodGUI::on_pll_toggled(bool checked)
|
void AMDemodGUI::on_pll_toggled(bool checked)
|
||||||
{
|
{
|
||||||
if (!checked) {
|
if (!checked)
|
||||||
|
{
|
||||||
ui->pll->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
|
ui->pll->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
|
||||||
|
ui->pll->setToolTip(tr("PLL for synchronous AM"));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_settings.m_pll = checked;
|
m_settings.m_pll = checked;
|
||||||
@ -427,6 +429,9 @@ void AMDemodGUI::tick()
|
|||||||
} else {
|
} else {
|
||||||
ui->pll->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
|
ui->pll->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int freq = (m_amDemod->getPllFrequency() * m_amDemod->getAudioSampleRate()) / (2.0*M_PI);
|
||||||
|
ui->pll->setToolTip(tr("PLL for synchronous AM. Freq = %1 Hz").arg(freq));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_tickCount++;
|
m_tickCount++;
|
||||||
|
@ -90,7 +90,7 @@ void PhaseLockComplex::setPskOrder(unsigned int order)
|
|||||||
void PhaseLockComplex::setSampleRate(unsigned int sampleRate)
|
void PhaseLockComplex::setSampleRate(unsigned int sampleRate)
|
||||||
{
|
{
|
||||||
m_lockTime = sampleRate / 100; // 10ms for order 1
|
m_lockTime = sampleRate / 100; // 10ms for order 1
|
||||||
m_lockFreq = (2.0*M_PI*5.0) / sampleRate; // +/- 5 Hz frequency swing
|
m_lockFreq = (2.0*M_PI*(m_pskOrder > 1 ? 6.0 : 1.0)) / sampleRate; // +/- 6 Hz frequency swing
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +161,7 @@ void PhaseLockComplex::feed(float re, float im)
|
|||||||
if (m_pskOrder > 1)
|
if (m_pskOrder > 1)
|
||||||
{
|
{
|
||||||
float dPhi = normalizeAngle(m_phiHat - m_phiHatPrev);
|
float dPhi = normalizeAngle(m_phiHat - m_phiHatPrev);
|
||||||
m_freq = 0.001*dPhi + 0.999*m_freqPrev;
|
m_freq = m_expAvg.feed(dPhi);
|
||||||
|
|
||||||
if (m_lockTimeCount < m_lockTime-1)
|
if (m_lockTimeCount < m_lockTime-1)
|
||||||
{
|
{
|
||||||
@ -188,20 +188,14 @@ void PhaseLockComplex::feed(float re, float im)
|
|||||||
m_lockTimeCount = 0;
|
m_lockTimeCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_freqPrev = m_freq;
|
|
||||||
m_phiHatPrev = m_phiHat;
|
m_phiHatPrev = m_phiHat;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_freq = (m_phiHat - m_phiHatPrev) / (2.0*M_PI);
|
m_freqTest = normalizeAngle(m_phiHat - m_phiHatPrev);
|
||||||
|
m_freq = m_expAvg.feed(m_freqTest);
|
||||||
|
|
||||||
if (m_freq < -1.0f) {
|
float dFreq = m_freqTest - m_freqPrev;
|
||||||
m_freq += 2.0f;
|
|
||||||
} else if (m_freq > 1.0f) {
|
|
||||||
m_freq -= 2.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
float dFreq = m_freq - m_freqPrev;
|
|
||||||
|
|
||||||
if ((dFreq > -0.01) && (dFreq < 0.01))
|
if ((dFreq > -0.01) && (dFreq < 0.01))
|
||||||
{
|
{
|
||||||
@ -215,7 +209,7 @@ void PhaseLockComplex::feed(float re, float im)
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_phiHatPrev = m_phiHat;
|
m_phiHatPrev = m_phiHat;
|
||||||
m_freqPrev = m_freq;
|
m_freqPrev = m_freqTest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,12 +49,34 @@ public:
|
|||||||
const std::complex<float>& getComplex() const { return m_y; }
|
const std::complex<float>& getComplex() const { return m_y; }
|
||||||
float getReal() const { return m_yRe; }
|
float getReal() const { return m_yRe; }
|
||||||
float getImag() const { return m_yIm; }
|
float getImag() const { return m_yIm; }
|
||||||
bool locked() const { return m_pskOrder > 1 ? m_lockCount > 16 : m_lockCount > m_lockTime-2; }
|
bool locked() const { return m_pskOrder > 1 ? m_lockCount > 10 : m_lockCount > m_lockTime-2; }
|
||||||
float getFreq() const { return m_freq; }
|
float getFreq() const { return m_freq; }
|
||||||
float getDeltaPhi() const { return m_deltaPhi; }
|
float getDeltaPhi() const { return m_deltaPhi; }
|
||||||
float getPhiHat() const { return m_phiHat; }
|
float getPhiHat() const { return m_phiHat; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
class ExpAvg
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ExpAvg() : m_a0(0.999), m_a1(0.001), m_y1(0.0f)
|
||||||
|
{}
|
||||||
|
void setAlpha(const float& alpha)
|
||||||
|
{
|
||||||
|
m_a0 = alpha;
|
||||||
|
m_a1 = 1.0 - alpha;
|
||||||
|
}
|
||||||
|
float feed(const float& x)
|
||||||
|
{
|
||||||
|
float y = m_a1*x + m_a0*m_y1;
|
||||||
|
m_y1 = y;
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
float m_a0; //!< alpha
|
||||||
|
float m_a1; //!< 1 - alpha
|
||||||
|
float m_y1;
|
||||||
|
};
|
||||||
|
|
||||||
/** Normalize angle in radians into the [-pi,+pi] region */
|
/** Normalize angle in radians into the [-pi,+pi] region */
|
||||||
static float normalizeAngle(float angle);
|
static float normalizeAngle(float angle);
|
||||||
|
|
||||||
@ -82,6 +104,7 @@ private:
|
|||||||
unsigned int m_pskOrder;
|
unsigned int m_pskOrder;
|
||||||
int m_lockTime;
|
int m_lockTime;
|
||||||
int m_lockTimeCount;
|
int m_lockTimeCount;
|
||||||
|
ExpAvg m_expAvg;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SDRBASE_DSP_PHASELOCKCOMPLEX_H_ */
|
#endif /* SDRBASE_DSP_PHASELOCKCOMPLEX_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user