1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-05 23:45:00 -04:00

Channel analyzer NG: return of the lock status indicator and PLL frequency shift for PSK modulated signals

This commit is contained in:
f4exb
2018-05-18 19:03:54 +02:00
parent 6d95c04076
commit 9f48378677
5 changed files with 62 additions and 5 deletions
+40 -3
View File
@@ -43,8 +43,10 @@ PhaseLockComplex::PhaseLockComplex() :
m_freq(0.0),
m_freqPrev(0.0),
m_lockCount(0),
m_lockFreq(0.026f),
m_pskOrder(1),
m_lockTime(480)
m_lockTime(480),
m_lockTimeCount(0)
{
}
@@ -87,6 +89,7 @@ void PhaseLockComplex::setPskOrder(unsigned int order)
void PhaseLockComplex::setSampleRate(unsigned int sampleRate)
{
m_lockTime = sampleRate / 100; // 10ms for order 1
m_lockFreq = (2.0*M_PI*5.0) / sampleRate; // +/- 5 Hz frequency swing
reset();
}
@@ -108,6 +111,7 @@ void PhaseLockComplex::reset()
m_freq = 0.0f;
m_freqPrev = 0.0f;
m_lockCount = 0;
m_lockTimeCount = 0;
}
void PhaseLockComplex::feed(float re, float im)
@@ -151,8 +155,41 @@ void PhaseLockComplex::feed(float re, float im)
m_phiHat += 2.0*M_PI;
}
// lock estimation
if (m_pskOrder <= 1)
// lock and frequency estimation
if (m_pskOrder > 1)
{
float dPhi = normalizeAngle(m_phiHat - m_phiHatPrev);
m_freq = 0.001*dPhi + 0.999*m_freqPrev;
if (m_lockTimeCount < m_lockTime-1)
{
m_lockTimeCount++;
}
else
{
float dF = m_freq - m_freqTest;
if ((dF > -m_lockFreq) && (dF < m_lockFreq))
{
if (m_lockCount < 20) {
m_lockCount++;
}
}
else
{
if (m_lockCount > 0) {
m_lockCount--;
}
}
m_freqTest = m_freq;
m_lockTimeCount = 0;
}
m_freqPrev = m_freq;
m_phiHatPrev = m_phiHat;
}
else
{
m_freq = (m_phiHat - m_phiHatPrev) / (2.0*M_PI);