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