aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2016-05-01 10:17:21 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2016-05-01 15:15:19 +0200
commit28e7f1e9d1dc0e7574c3a8db9c56af38cbca2606 (patch)
treed328c1cac3b1867ee7949991d32cdb93b03940c8 /src
parent0c99848120f654538334491cc1abe450b831f3f0 (diff)
common code: Remove DC level before using Goertzel filter
A DC level degrades the quality of the filtered result
Diffstat (limited to 'src')
-rw-r--r--src/common/goertzel.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/common/goertzel.c b/src/common/goertzel.c
index 2410990..5a89165 100644
--- a/src/common/goertzel.c
+++ b/src/common/goertzel.c
@@ -32,17 +32,18 @@
/* return average value (rectified value), that can be 0..1 */
double audio_level(int16_t *samples, int length)
{
- int bias;
+ int32_t bias;
double level;
int sk;
int n;
- /* level calculation */
+ /* calculate bias */
bias = 0;
for (n = 0; n < length; n++)
bias += samples[n];
bias = bias / length;
+ /* level calculation */
level = 0;
for (n = 0; n < length; n++) {
sk = samples[n] - bias;
@@ -71,10 +72,17 @@ double audio_level(int16_t *samples, int length)
*/
void audio_goertzel(int16_t *samples, int length, int offset, int *coeff, double *result, int k)
{
+ int32_t bias;
int32_t sk, sk1, sk2;
int64_t cos2pik;
int i, n;
+ /* calculate bias to remove DC */
+ bias = 0;
+ for (n = 0; n < length; n++)
+ bias += samples[n];
+ bias = bias / length;
+
/* we do goertzel */
for (i = 0; i < k; i++) {
sk = 0;
@@ -83,7 +91,7 @@ void audio_goertzel(int16_t *samples, int length, int offset, int *coeff, double
cos2pik = coeff[i];
/* note: after 'length' cycles, offset is restored to its initial value */
for (n = 0; n < length; n++) {
- sk = ((cos2pik * sk1) >> 15) - sk2 + samples[offset++];
+ sk = ((cos2pik * sk1) >> 15) - sk2 + samples[offset++] - bias;
sk2 = sk1;
sk1 = sk;
if (offset == length)