worked on FIR-Convolution and LocalMaxima detection

This commit is contained in:
k-a-z-u
2018-05-09 18:24:07 +02:00
parent 0fcc3fb1e9
commit 628aafaecd
7 changed files with 490 additions and 87 deletions

64
math/LocalMaxima.h Normal file
View File

@@ -0,0 +1,64 @@
#ifndef LOCALMAXIMA_H
#define LOCALMAXIMA_H
class LocalMaxima {
static constexpr float MAX = 1e40;
size_t everyNth;
size_t cnt = 0;
float s0;
float s1; // center value
float s2;
public:
struct Res {
bool isMax;
float val;
Res(bool isMax, float val) : isMax(isMax), val(val) {;}
};
/** ctor. use only every n-th sample */
LocalMaxima(const size_t everyNth) : everyNth(everyNth) {
reset();
}
/** is the given value a local maxima? */
Res add(const float s) {
if (cnt == 0*everyNth) {s0 = s;} // set, wait some time
else if (cnt == 1*everyNth) {s1 = s;} // set, wait some time
else if (cnt == 2*everyNth) {s2 = s;} // set
else if (cnt > 2*everyNth) { // now shift values for every time step, until max is found
s0 = s1;
s1 = s2;
s2 = s;
}
++cnt;
if ((s1 > s0) && (s1 > s2)) {
Res res(true, s1);
reset();
return res;
}
return Res(false, 0);
}
private:
void reset() {
s0 = MAX;
s1 = MAX;
s2 = MAX;
cnt = 0;
}
};
#endif // LOCALMAXIMA_H