static void update_energy(VadDtxContext *v, int16_t *signal, int numsamples, uint64_t curtime) { int i; float acc = 0; float en; for (i=0;i<numsamples;++i){ int s=signal[i]; acc += s * s; } en = (sqrt(acc / numsamples)+1) / max_e; v->energy = (en * coef) + v->energy * (1.0 - coef); ortp_extremum_record_max(&v->max,curtime,v->energy); //ms_message("Energy=%f, current max=%f",v->energy, ortp_extremum_get_current(&v->max)); }
// note: number of samples should not vary much // with filtered peak detection, variable buffer size from volume_process call is not optimal static void update_energy(Volume *v, int16_t *signal, int numsamples, uint64_t curtime) { int i; float acc = 0; float en; int lp = 0, pk = 0; for (i=0;i<numsamples;++i){ int s=signal[i]; acc += s * s; lp = abs(s); if (lp > pk) pk = lp; } en = (float)((sqrt(acc / numsamples)+1) / max_e); v->energy = (en * coef) + v->energy * (1.0f - coef); v->level_pk = (float)pk / max_e; v->instant_energy = en;// currently non-averaged energy seems better (short artefacts) ortp_extremum_record_max(&v->max,curtime,v->energy); ortp_extremum_record_min(&v->min,curtime,v->energy); }