00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _GRAGC_H_
00025 #define _GRAGC_H_
00026
00027 #include <VrSigProc.h>
00028
00029 template<class iType,class oType>
00030 class GrAGC : public VrSigProc {
00031 protected:
00032 double k;
00033 double power;
00034 virtual void initialize();
00035 public:
00036 virtual const char *name() { return "GrAGC"; }
00037 virtual int work(VrSampleRange output, void *ao[],
00038 VrSampleRange inputs[], void *ai[]);
00039 GrAGC(double k):VrSigProc(1,sizeof(iType),sizeof(oType)),k(k) { }
00040 };
00041
00042 template<class iType,class oType> int
00043 GrAGC<iType,oType>::work(VrSampleRange output, void *ao[],
00044 VrSampleRange inputs[], void *ai[])
00045 {
00046 iType **i = (iType **)ai;
00047 oType **o = (oType **)ao;
00048 double inv_gain;
00049 int size = output.size;
00050 while(size -- > 0) {
00051 power = power + ((*i[0] * *i[0]) - power)/k;
00052 inv_gain = sqrt(power);
00053 *o[0]++ = (*i[0]++ / inv_gain);
00054 }
00055 return output.size;
00056 }
00057
00058 template<class iType,class oType> void
00059 GrAGC<iType,oType>::initialize()
00060 {
00061 power = 1;
00062 }
00063 #endif