1 #ifndef _RMS_H 2 #define _RMS_H 3 4 #include <math.h> 5 6 #define RMS_BUF_SIZE 64 7 8 typedef struct { 9 float buffer[RMS_BUF_SIZE]; 10 unsigned int pos; 11 float sum; 12 } rms_env; 13 14 rms_env *rms_env_new(); 15 16 static inline float rms_env_process(rms_env *r, float x); 17 18 void rms_env_reset(rms_env *r); 19 20 void rms_env_free(rms_env *r); 21 rms_env_process(rms_env * r,const float x)22inline static float rms_env_process(rms_env *r, const float x) 23 { 24 r->sum -= r->buffer[r->pos]; 25 r->sum += x; 26 if (r->sum < 1.0e-6) { 27 r->sum = 0.0f; 28 } 29 r->buffer[r->pos] = x; 30 r->pos = (r->pos + 1) & (RMS_BUF_SIZE - 1); 31 32 return sqrt(r->sum / (float)RMS_BUF_SIZE); 33 } 34 35 #endif 36