00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _ATSC_SLICER_AGC_H_
00024 #define _ATSC_SLICER_AGC_H_
00025
00026 #include <math.h>
00027 #include <gr_single_pole_iir.h>
00028
00035 class atsc_slicer_agc {
00036
00037 public:
00038 atsc_slicer_agc () : _gain(1), dc(0.0025) {};
00039
00040
00041 float gain () { return _gain; }
00042
00043 #if 1
00044 float scale (float input){
00045 float t = input * _gain;
00046 float output = t - REFERENCE;
00047 float error = REFERENCE - dc.filter (t);
00048 _gain += error * RATE;
00049 return output;
00050 }
00051 #else
00052 float scale(float input){
00053 float avg = dc.filter(input);
00054 if(fabs(avg)<.1)avg=.1;
00055 _gain += _gain*.99 + .01* REFERENCE/avg;
00056 return input*_gain - REFERENCE;
00057 }
00058 #endif
00059
00060 protected:
00061
00062 static const float REFERENCE = 1.25;
00063 static const float RATE = 1.0e-5;
00064 float _gain;
00065 gr_single_pole_iir<float,float,float> dc;
00066 };
00067
00068 #endif