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; } | 	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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user