From e723764376cfff89ba899bae9e27cafc0b3c9784 Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 17 May 2018 02:35:06 +0200 Subject: [PATCH] New PLL: removed locked status heuristics for order > 1 --- sdrbase/dsp/phaselockcomplex.cpp | 89 ++------------------------------ sdrbase/dsp/phaselockcomplex.h | 14 +---- 2 files changed, 5 insertions(+), 98 deletions(-) diff --git a/sdrbase/dsp/phaselockcomplex.cpp b/sdrbase/dsp/phaselockcomplex.cpp index 16d32327a..1eb0b1edc 100644 --- a/sdrbase/dsp/phaselockcomplex.cpp +++ b/sdrbase/dsp/phaselockcomplex.cpp @@ -36,24 +36,15 @@ PhaseLockComplex::PhaseLockComplex() : m_deltaPhi(0.0), m_phiHat(0.0), m_phiHatPrev(0.0), - m_phiHat1(0.0), - m_phiHat2(0.0), - m_dPhiHatAccum(0.0), - m_phiHatCount(0), m_y(1.0, 0.0), m_p(1.0, 0.0), m_yRe(1.0), m_yIm(0.0), m_freq(0.0), m_freqPrev(0.0), - m_lock(0.0), m_lockCount(0), m_pskOrder(1), - m_lockTime1(480), - m_lockTime(2400), - m_lockTimef(2400.0f), - m_lockThreshold(4.8f), - m_avgF(2400) + m_lockTime(480) { } @@ -95,11 +86,7 @@ void PhaseLockComplex::setPskOrder(unsigned int order) void PhaseLockComplex::setSampleRate(unsigned int sampleRate) { - m_lockTime1 = sampleRate / 100; // 10ms for order 1 - m_lockTime = sampleRate / 20; // 50ms for order > 1 - m_lockTimef = (float) m_lockTime; - m_lockThreshold = m_lockTime * 0.00015f; // threshold of 0.002 taking division by lock time into account - m_avgF.resize(m_lockTime); + m_lockTime = sampleRate / 100; // 10ms for order 1 reset(); } @@ -112,10 +99,6 @@ void PhaseLockComplex::reset() m_deltaPhi = 0.0f; m_phiHat = 0.0f; m_phiHatPrev = 0.0f; - m_phiHat1 = 0.0f; - m_phiHat2 = 0.0f; - m_dPhiHatAccum = 0.0f; - m_phiHatCount = 0; m_y.real(1.0); m_y.imag(0.0); m_p.real(1.0); @@ -124,7 +107,6 @@ void PhaseLockComplex::reset() m_yIm = 0.0f; m_freq = 0.0f; m_freqPrev = 0.0f; - m_lock = 0.0f; m_lockCount = 0; } @@ -170,70 +152,7 @@ void PhaseLockComplex::feed(float re, float im) } // lock estimation - if (m_pskOrder > 1) - { - float dPhi = normalizeAngle(m_phiHat - m_phiHatPrev); - - m_avgF(dPhi); - - if (m_phiHatCount < (m_lockTime-1)) - { - m_phiHatCount++; - } - else - { - m_freq = m_avgF.asFloat(); - float dFreq = m_freq - m_freqPrev; - - if ((dFreq > -m_lockThreshold) && (dFreq < m_lockThreshold)) - { - if (m_lockCount < 20) { - m_lockCount++; - } - } - else{ - if (m_lockCount > 0) { - m_lockCount--; - } - } - - m_freqPrev = m_freq; - m_phiHatCount = 0; - } - - // if (m_phiHatCount < (m_lockTime-1)) - // { - // m_dPhiHatAccum += dPhi; // re-accumulate phase for differential calculation - // m_phiHatCount++; - // } - // else - // { - // float dPhi11 = (m_dPhiHatAccum - m_phiHat1); // optimized out division by lock time - // float dPhi12 = (m_phiHat1 - m_phiHat2); - // m_lock = dPhi11 - dPhi12; // second derivative of phase to get lock status - - // if ((m_lock > -m_lockThreshold) && (m_lock < m_lockThreshold)) // includes re-multiplication by lock time - // { - // if (m_lockCount < 20) { // [0..20] - // m_lockCount++; - // } - // } - // else - // { - // if (m_lockCount > 0) { - // m_lockCount -= 2; - // } - // } - - // m_phiHat2 = m_phiHat1; - // m_phiHat1 = m_dPhiHatAccum; - // m_dPhiHatAccum = 0.0f; - // m_phiHatCount = 0; - // } - - // m_phiHatPrev = m_phiHat; - } - else + if (m_pskOrder <= 1) { m_freq = (m_phiHat - m_phiHatPrev) / (2.0*M_PI); @@ -247,7 +166,7 @@ void PhaseLockComplex::feed(float re, float im) if ((dFreq > -0.01) && (dFreq < 0.01)) { - if (m_lockCount < (m_lockTime1-1)) { // [0..479] + if (m_lockCount < (m_lockTime-1)) { // [0..479] m_lockCount++; } } diff --git a/sdrbase/dsp/phaselockcomplex.h b/sdrbase/dsp/phaselockcomplex.h index 56f455328..baf4af9b7 100644 --- a/sdrbase/dsp/phaselockcomplex.h +++ b/sdrbase/dsp/phaselockcomplex.h @@ -24,7 +24,6 @@ #define SDRBASE_DSP_PHASELOCKCOMPLEX_H_ #include "dsp/dsptypes.h" -#include "util/movingaverage.h" #include "export.h" /** General purpose Phase-locked loop using complex analytic signal input. */ @@ -50,7 +49,7 @@ public: const std::complex& getComplex() const { return m_y; } float getReal() const { return m_yRe; } float getImag() const { return m_yIm; } - bool locked() const { return m_lockCount > (m_pskOrder > 1 ? 15 : (m_lockTime1-2)); } // 6 + bool locked() const { return m_pskOrder > 1 ? false : m_lockCount > m_lockTime-2; } float getDeltaPhi() const { return m_deltaPhi; } float getPhiHat() const { return m_phiHat; } @@ -70,26 +69,15 @@ private: float m_deltaPhi; float m_phiHat; float m_phiHatPrev; - float m_phiHat1; - float m_phiHat2; - float m_dPhiHatAccum; - int m_phiHatCount; std::complex m_y; std::complex m_p; float m_yRe; float m_yIm; float m_freq; float m_freqPrev; - float m_lock; int m_lockCount; unsigned int m_pskOrder; - int m_lockTime1; int m_lockTime; - float m_lockTimef; - float m_lockThreshold; - MovingAverageUtilVar m_avgF; }; - - #endif /* SDRBASE_DSP_PHASELOCKCOMPLEX_H_ */