2016-03-27 20:39:53 +01:00
|
|
|
#ifndef __AVMD_GOERTZEL_H__
|
|
|
|
|
|
|
|
|
2010-05-25 15:03:14 -04:00
|
|
|
#include <math.h>
|
2016-03-29 20:53:31 +01:00
|
|
|
#include "avmd_goertzel.h"
|
|
|
|
#include "avmd_buffer.h"
|
2010-05-25 15:03:14 -04:00
|
|
|
|
2016-03-27 20:39:53 +01:00
|
|
|
|
|
|
|
extern double avmd_goertzel(circ_buffer_t *b, size_t pos, double f, size_t num)
|
2010-05-25 15:03:14 -04:00
|
|
|
{
|
|
|
|
double s = 0.0;
|
|
|
|
double p = 0.0;
|
|
|
|
double p2 = 0.0;
|
|
|
|
double coeff;
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
coeff = 2.0 * cos(2.0 * M_PI * f);
|
|
|
|
|
2016-02-05 00:37:33 +00:00
|
|
|
for (i = 0; i < num; i++) {
|
2016-03-27 20:39:53 +01:00
|
|
|
/* TODO: optimize to avoid GET_SAMPLE when possible */
|
|
|
|
s = GET_SAMPLE(b, i + pos) + (coeff * p) - p2;
|
|
|
|
p2 = p;
|
|
|
|
p = s;
|
2010-05-25 15:03:14 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return (p2 * p2) + (p * p) - (coeff * p2 * p);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-03-27 20:39:53 +01:00
|
|
|
#endif /* __AVMD_GOERTZEL_H__ */
|