-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdifferentiator.h
70 lines (60 loc) · 1.49 KB
/
differentiator.h
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
64
65
66
67
68
69
70
/*
* Copyright (C) 2020 - 2023 Judd Niemann - All Rights Reserved.
* You may use, distribute and modify this code under the
* terms of the GNU Lesser General Public License, version 2.1
*
* You should have received a copy of GNU Lesser General Public License v2.1
* with this file. If not, please refer to: https://github.com/jniemann66/sndscope.git
*/
#ifndef DIFFERENTIATOR_H
#define DIFFERENTIATOR_H
#include <array>
template <typename FloatType>
class Differentiator
{
private:
static constexpr FloatType coeffs[] {
0.0209,
0.0,
-0.1128,
0.0,
1.2411,
0.0,
-1.2411,
0.0,
0.1128,
0.0,
-0.0209
};
static constexpr size_t length{sizeof(coeffs) / sizeof(FloatType)};
std::array<FloatType, length> history;
size_t index{length - 1};
public:
static constexpr size_t delayTime{(length - 1) / 2};
Differentiator()
{
history.fill(0.0);
}
FloatType get(const FloatType& input)
{
// place input into history
history[index] = input;
// perform the convolution
FloatType dP{0.0}; // differentiator result
size_t p = index;
for(size_t j = 0 ; j < length; j++) {
dP += coeffs[j] * history.at(p);
if(++p == length) {
p = 0; // wrap
}
}
// update the current index
if(index == 0) {
index = length - 1; // wrap
} else {
index--;
}
return dP;
}
};
#endif // DIFFERENTIATOR_H