summaryrefslogtreecommitdiff
path: root/libs/vamp-pyin/MeanFilter.h
blob: dc6f8a03b050de0951f972c70210e54730d2e59e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    pYIN - A fundamental frequency estimator for monophonic audio
    Centre for Digital Music, Queen Mary, University of London.
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef _MEAN_FILTER_H_
#define _MEAN_FILTER_H_

class MeanFilter
{
public:
    /**
     * Construct a non-causal mean filter with filter length flen,
     * that replaces each sample N with the mean of samples
     * [N-floor(F/2) .. N+floor(F/2)] where F is the filter length.
     * Only odd F are supported.
     */
    MeanFilter(int flen) : m_flen(flen) { }
    ~MeanFilter() { }

    /**
     * Filter the n samples in "in" and place the results in "out"
     */
    void filter(const double *in, double *out, const int n) {
	filterSubsequence(in, out, n, n, 0);
    }

    /**
     * Filter the n samples starting at the given offset in the
     * m-element array "in" and place the results in the n-element
     * array "out"
     */
    void filterSubsequence(const double *in, double *out,
			   const int m, const int n,
			   const int offset) {
	int half = m_flen/2;
	for (int i = 0; i < n; ++i) {
	    double v = 0;
	    int n = 0;
	    for (int j = -half; j <= half; ++j) {
		int ix = i + j + offset;
		if (ix >= 0 && ix < m) {
		    v += in[ix];
		    ++n;
		}
	    }
	    out[i] = v / n;
	}
    }

private:
    int m_flen;
};

#endif