mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-27 11:00:31 -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; } | ||||
| 	bool getSquelchOpen() const { return m_squelchOpen; } | ||||
| 	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) | ||||
| 	{ | ||||
|  | ||||
| @ -142,8 +142,10 @@ void AMDemodGUI::on_deltaFrequency_changed(qint64 value) | ||||
| 
 | ||||
| void AMDemodGUI::on_pll_toggled(bool checked) | ||||
| { | ||||
|     if (!checked) { | ||||
|     if (!checked) | ||||
|     { | ||||
|         ui->pll->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); | ||||
|         ui->pll->setToolTip(tr("PLL for synchronous AM")); | ||||
|     } | ||||
| 
 | ||||
|     m_settings.m_pll = checked; | ||||
| @ -427,6 +429,9 @@ void AMDemodGUI::tick() | ||||
| 	    } else { | ||||
| 	        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++; | ||||
|  | ||||
| @ -90,7 +90,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
 | ||||
|     m_lockFreq = (2.0*M_PI*(m_pskOrder > 1 ? 6.0 : 1.0)) / sampleRate; // +/- 6 Hz frequency swing
 | ||||
|     reset(); | ||||
| } | ||||
| 
 | ||||
| @ -161,7 +161,7 @@ void PhaseLockComplex::feed(float re, float im) | ||||
|     if (m_pskOrder > 1) | ||||
|     { | ||||
|         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) | ||||
|         { | ||||
| @ -188,20 +188,14 @@ void PhaseLockComplex::feed(float re, float im) | ||||
|             m_lockTimeCount = 0; | ||||
|         } | ||||
| 
 | ||||
|         m_freqPrev = m_freq; | ||||
|         m_phiHatPrev = m_phiHat; | ||||
|     } | ||||
|     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) { | ||||
|             m_freq += 2.0f; | ||||
|         } else if (m_freq > 1.0f) { | ||||
|             m_freq -= 2.0f; | ||||
|         } | ||||
| 
 | ||||
|         float dFreq = m_freq - m_freqPrev; | ||||
|         float dFreq = m_freqTest - m_freqPrev; | ||||
| 
 | ||||
|         if ((dFreq > -0.01) && (dFreq < 0.01)) | ||||
|         { | ||||
| @ -215,7 +209,7 @@ void PhaseLockComplex::feed(float re, float im) | ||||
|         } | ||||
| 
 | ||||
|         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; } | ||||
|     float getReal() const { return m_yRe; } | ||||
|     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 getDeltaPhi() const { return m_deltaPhi; } | ||||
|     float getPhiHat() const { return m_phiHat; } | ||||
| 
 | ||||
| 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 */ | ||||
|     static float normalizeAngle(float angle); | ||||
| 
 | ||||
| @ -82,6 +104,7 @@ private: | ||||
|     unsigned int m_pskOrder; | ||||
|     int m_lockTime; | ||||
|     int m_lockTimeCount; | ||||
|     ExpAvg m_expAvg; | ||||
| }; | ||||
| 
 | ||||
| #endif /* SDRBASE_DSP_PHASELOCKCOMPLEX_H_ */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user