3template <size_t sampleSize>
4PeakDetection<sampleSize>::PeakDetection(uint8_t lag, float threshold, float influence) {
6 this->threshold = threshold;
7 this->influence = influence;
10template <size_t sampleSize>
11void PeakDetection<sampleSize>::GetStdDev(uint8_t start, uint8_t length, float* data, float& avgRet, float& stdRet) {
15 for (uint8_t i = 0; i < length; i++) {
16 average += data[start + i];
19 average /= (float)length;
21 for (uint8_t i = 0; i < length; i++) {
22 stdDev += powf(data[start + i] - average, 2.0f);
26 stdRet = sqrtf(stdDev / (float)length);
29template <size_t sampleSize>
30void PeakDetection<sampleSize>::Calculate(float* data, bool* peaks) {
35 for (uint8_t i = 0; i < sampleSize; i++) {
39 maxData = Mathematics::Max(maxData, data[i]);
42 if (maxData > threshold) {
43 GetStdDev(0, lag, data, average, stdDev);
45 avg[lag - 1] = average;
46 std[lag - 1] = stdDev;
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];
57 GetStdDev(i - lag + 1, i, data, avg[i], std[i]);
63 for (uint8_t i = 0; i < sampleSize; i++) {