| 
									
										
										
										
											2015-05-12 12:12:13 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * kissagc.h | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Created on: May 12, 2015 | 
					
						
							|  |  |  |  *      Author: f4exb | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INCLUDE_GPL_DSP_AGC_H_
 | 
					
						
							|  |  |  | #define INCLUDE_GPL_DSP_AGC_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "movingaverage.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | class AGC | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	AGC(); | 
					
						
							|  |  |  | 	AGC(int historySize, Real R); | 
					
						
							|  |  |  | 	virtual ~AGC(); | 
					
						
							| 
									
										
										
										
											2015-09-07 09:32:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	void resize(int historySize, Real R); | 
					
						
							|  |  |  | 	Real getValue(); | 
					
						
							| 
									
										
										
										
											2015-09-12 16:34:57 +02:00
										 |  |  | 	Real getAverage(); | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	virtual void feed(Complex& ci) = 0; | 
					
						
							| 
									
										
										
										
											2015-09-07 09:32:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2015-09-07 09:32:29 +02:00
										 |  |  | 	Real m_u0; | 
					
						
							|  |  |  | 	Real m_R;       // objective mag
 | 
					
						
							|  |  |  | 	MovingAverage<Real> m_moving_average; // Averaging engine. The stack length conditions the smoothness of AGC.
 | 
					
						
							|  |  |  | 	int m_historySize; | 
					
						
							|  |  |  | 	int m_count; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | class MagSquaredAGC : public AGC | 
					
						
							| 
									
										
										
										
											2015-09-07 09:32:29 +02:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	MagSquaredAGC(); | 
					
						
							|  |  |  | 	MagSquaredAGC(int historySize, Real R); | 
					
						
							|  |  |  | 	virtual ~MagSquaredAGC(); | 
					
						
							|  |  |  | 	virtual void feed(Complex& ci); | 
					
						
							| 
									
										
										
										
											2015-10-04 06:26:06 +02:00
										 |  |  | 	Real getMagSq() const { return m_magsq; } | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	Real m_magsq; | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-09-07 09:32:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | class MagAGC : public AGC | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	MagAGC(); | 
					
						
							|  |  |  | 	MagAGC(int historySize, Real R); | 
					
						
							|  |  |  | 	virtual ~MagAGC(); | 
					
						
							|  |  |  | 	virtual void feed(Complex& ci); | 
					
						
							| 
									
										
										
										
											2015-10-04 06:26:06 +02:00
										 |  |  | 	Real getMagSq() const { return m_magsq; } | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	Real m_magsq; | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | class AlphaAGC : public AGC | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	AlphaAGC(); | 
					
						
							|  |  |  | 	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); | 
					
						
							| 
									
										
										
										
											2015-10-04 06:26:06 +02:00
										 |  |  | 	Real getMagSq() const { return m_magsq; } | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	Real m_alpha; | 
					
						
							| 
									
										
										
										
											2015-10-04 06:26:06 +02:00
										 |  |  | 	Real m_magsq; | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	bool m_squelchOpen; | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | class SimpleAGC | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	SimpleAGC() : | 
					
						
							|  |  |  | 			m_squelchOpen(false), | 
					
						
							|  |  |  | 			m_fill(0), | 
					
						
							|  |  |  | 			m_cutoff(0), | 
					
						
							|  |  |  | 			m_clip(0), | 
					
						
							|  |  |  | 			m_moving_average() | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | 	{} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	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) | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | 	{} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 	void resize(int historySize, Real initial, Real cutoff=0, Real clip=0) | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 			m_fill = initial; | 
					
						
							|  |  |  | 			m_cutoff = cutoff; | 
					
						
							|  |  |  | 			m_clip = clip; | 
					
						
							|  |  |  | 			m_moving_average.resize(historySize, initial); | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Real getValue() | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  | 			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); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-20 09:28:57 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2015-09-07 23:31:34 +02:00
										 |  |  |     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<Real> m_moving_average; // Averaging engine. The stack length conditions the smoothness of AGC.
 | 
					
						
							| 
									
										
										
										
											2015-05-12 12:12:13 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* INCLUDE_GPL_DSP_AGC_H_ */
 |