Mercurial > hg > pyin
comparison MeanFilter.h @ 0:99bac62ee2da
added PYIN sources, should be compileable
author | matthiasm |
---|---|
date | Wed, 27 Nov 2013 11:59:49 +0000 |
parents | |
children | 5945b8905d1f |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:99bac62ee2da |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 /* | |
3 This file is Copyright (c) 2012 Chris Cannam | |
4 | |
5 Permission is hereby granted, free of charge, to any person | |
6 obtaining a copy of this software and associated documentation | |
7 files (the "Software"), to deal in the Software without | |
8 restriction, including without limitation the rights to use, copy, | |
9 modify, merge, publish, distribute, sublicense, and/or sell copies | |
10 of the Software, and to permit persons to whom the Software is | |
11 furnished to do so, subject to the following conditions: | |
12 | |
13 The above copyright notice and this permission notice shall be | |
14 included in all copies or substantial portions of the Software. | |
15 | |
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
17 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
18 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR | |
20 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |
21 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
22 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
23 */ | |
24 | |
25 #ifndef _MEAN_FILTER_H_ | |
26 #define _MEAN_FILTER_H_ | |
27 | |
28 class MeanFilter | |
29 { | |
30 public: | |
31 /** | |
32 * Construct a non-causal mean filter with filter length flen, | |
33 * that replaces each sample N with the mean of samples | |
34 * [N-floor(F/2) .. N+floor(F/2)] where F is the filter length. | |
35 * Only odd F are supported. | |
36 */ | |
37 MeanFilter(int flen) : m_flen(flen) { } | |
38 ~MeanFilter() { } | |
39 | |
40 /** | |
41 * Filter the n samples in "in" and place the results in "out" | |
42 */ | |
43 void filter(const double *in, double *out, const int n) { | |
44 filterSubsequence(in, out, n, n, 0); | |
45 } | |
46 | |
47 /** | |
48 * Filter the n samples starting at the given offset in the | |
49 * m-element array "in" and place the results in the n-element | |
50 * array "out" | |
51 */ | |
52 void filterSubsequence(const double *in, double *out, | |
53 const int m, const int n, | |
54 const int offset) { | |
55 int half = m_flen/2; | |
56 for (int i = 0; i < n; ++i) { | |
57 double v = 0; | |
58 int n = 0; | |
59 for (int j = -half; j <= half; ++j) { | |
60 int ix = i + j + offset; | |
61 if (ix >= 0 && ix < m) { | |
62 v += in[ix]; | |
63 ++n; | |
64 } | |
65 } | |
66 out[i] = v / n; | |
67 } | |
68 } | |
69 | |
70 private: | |
71 int m_flen; | |
72 }; | |
73 | |
74 #endif |