mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 04:50:29 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			121 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * kissagc.h
 | |
|  *
 | |
|  *  Created on: May 12, 2015
 | |
|  *      Author: f4exb
 | |
|  */
 | |
| 
 | |
| #ifndef INCLUDE_GPL_DSP_AGC_H_
 | |
| #define INCLUDE_GPL_DSP_AGC_H_
 | |
| 
 | |
| #include "movingaverage.h"
 | |
| 
 | |
| class AGC
 | |
| {
 | |
| public:
 | |
| 	AGC(int historySize, Real R);
 | |
| 	virtual ~AGC();
 | |
| 
 | |
| 	void resize(int historySize, Real R);
 | |
| 	Real getValue();
 | |
| 	Real getAverage();
 | |
| 	virtual void feed(Complex& ci) = 0;
 | |
| 
 | |
| protected:
 | |
| 	Real m_u0;
 | |
| 	Real m_R;       // objective mag
 | |
| 	MovingAverage<double> m_moving_average; // Averaging engine. The stack length conditions the smoothness of AGC.
 | |
| 	int m_historySize;
 | |
| 	int m_count;
 | |
| };
 | |
| 
 | |
| class MagSquaredAGC : public AGC
 | |
| {
 | |
| public:
 | |
| 	MagSquaredAGC(int historySize, Real R);
 | |
| 	virtual ~MagSquaredAGC();
 | |
| 	virtual void feed(Complex& ci);
 | |
| 	Real getMagSq() const { return m_magsq; }
 | |
| private:
 | |
| 	Real m_magsq;
 | |
| };
 | |
| 
 | |
| class MagAGC : public AGC
 | |
| {
 | |
| public:
 | |
| 	MagAGC(int historySize, Real R);
 | |
| 	virtual ~MagAGC();
 | |
| 	virtual void feed(Complex& ci);
 | |
| 	Real getMagSq() const { return m_magsq; }
 | |
| private:
 | |
| 	Real m_magsq;
 | |
| };
 | |
| 
 | |
| class AlphaAGC : public AGC
 | |
| {
 | |
| public:
 | |
| 	AlphaAGC(int historySize, Real R);
 | |
| 	AlphaAGC(int historySize, Real R, Real alpha);
 | |
| 	virtual ~AlphaAGC();
 | |
|     void resize(int historySize, Real R, Real alpha);
 | |
| 	virtual void feed(Complex& ci);
 | |
| 	Real getMagSq() const { return m_magsq; }
 | |
| private:
 | |
| 	Real m_alpha;
 | |
| 	Real m_magsq;
 | |
| 	bool m_squelchOpen;
 | |
| };
 | |
| 
 | |
| class SimpleAGC
 | |
| {
 | |
| public:
 | |
| 	SimpleAGC(int historySize, Real initial, Real cutoff=0, Real clip=0) :
 | |
| 			m_squelchOpen(false),
 | |
| 			m_fill(initial),
 | |
| 			m_cutoff(cutoff),
 | |
| 			m_clip(clip),
 | |
| 			m_moving_average(historySize, initial)
 | |
| 	{}
 | |
| 
 | |
| 	void resize(int historySize, Real initial, Real cutoff=0, Real clip=0)
 | |
| 	{
 | |
| 			m_fill = initial;
 | |
| 			m_cutoff = cutoff;
 | |
| 			m_clip = clip;
 | |
| 			m_moving_average.resize(historySize, initial);
 | |
| 	}
 | |
| 
 | |
| 	void fill(double value)
 | |
| 	{
 | |
| 	    m_moving_average.fill(value);
 | |
| 	}
 | |
| 
 | |
| 	Real getValue()
 | |
| 	{
 | |
| 			if (m_moving_average.average() > m_clip)
 | |
| 			{
 | |
| 					return m_moving_average.average();
 | |
| 			} else
 | |
| 			{
 | |
| 					return m_clip;
 | |
| 			}
 | |
| 	}
 | |
| 
 | |
|     void feed(Real value)
 | |
|     {
 | |
|             if (value > m_cutoff)
 | |
|             {
 | |
|                     m_moving_average.feed(value);
 | |
|             }
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     bool m_squelchOpen; // open for processing
 | |
|     Real m_fill;    // refill average at this level
 | |
|     Real m_cutoff;  // consider samples only above this level
 | |
|     Real m_clip;    // never go below this level
 | |
|     MovingAverage<double> m_moving_average; // Averaging engine. The stack length conditions the smoothness of AGC.
 | |
| };
 | |
| 
 | |
| #endif /* INCLUDE_GPL_DSP_AGC_H_ */
 |