ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
PeakDetection.tpp
Go to the documentation of this file.
1#pragma once
2
3template <size_t sampleSize>
4PeakDetection<sampleSize>::PeakDetection(uint8_t lag, float threshold, float influence) {
5 this->lag = lag;
6 this->threshold = threshold;
7 this->influence = influence;
8}
9
10template <size_t sampleSize>
11void PeakDetection<sampleSize>::GetStdDev(uint8_t start, uint8_t length, float* data, float& avgRet, float& stdRet) {
12 float average = 0.0f;
13 float stdDev = 0.0f;
14
15 for (uint8_t i = 0; i < length; i++) {
16 average += data[start + i];
17 }
18
19 average /= (float)length;
20
21 for (uint8_t i = 0; i < length; i++) {
22 stdDev += powf(data[start + i] - average, 2.0f);
23 }
24
25 avgRet = average;
26 stdRet = sqrtf(stdDev / (float)length);
27}
28
29template <size_t sampleSize>
30void PeakDetection<sampleSize>::Calculate(float* data, bool* peaks) {
31 float average = 0.0f;
32 float stdDev = 0.0f;
33 float maxData = 0.0f;
34
35 for (uint8_t i = 0; i < sampleSize; i++) {
36 filData[i] = 0.0f;
37 avg[i] = 0.0f;
38 std[i] = 0.0f;
39 maxData = Mathematics::Max(maxData, data[i]);
40 }
41
42 if (maxData > threshold) {
43 GetStdDev(0, lag, data, average, stdDev);
44
45 avg[lag - 1] = average;
46 std[lag - 1] = stdDev;
47
48 for (uint8_t i = lag; i < sampleSize - lag; i++) {
49 if (fabs(data[i] - avg[i - 1]) > threshold * std[i - 1]) {
50 if (data[i] > avg[i - 1]) peaks[i] = true;
51 filData[i] = influence * data[i] + (1.0f - influence) * filData[i - 1];
52 } else {
53 peaks[i] = false;
54 filData[i] = data[i];
55 }
56
57 GetStdDev(i - lag + 1, i, data, avg[i], std[i]);
58
59 avg[i] = average;
60 std[i] = stdDev;
61 }
62 } else {
63 for (uint8_t i = 0; i < sampleSize; i++) {
64 peaks[i] = false;
65 }
66 }
67}