struct exp_smoothing {
float alpha; // smoothing parameter (1 = identity mapping)
float last; // state
float operator()(float x) {
return last += (x - last) * alpha;
}
};
template<class Filter, class Iterator>
Filter apply_inplace(Filter flt, Iterator beg, Iterator end) {
while (beg != end) {
*beg = flt(*beg);
++beg;
}
return flt;
}
#include <iostream>
#include <vector>
int main() {
std::vector<float> signal = {0,1,2,3,4,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6};
exp_smoothing flt = {
0.5f, // alpha
0.0f // last
};
flt = apply_inplace(flt,signal.begin(),signal.end());
for (float x : signal) {
std::cout << x << '\n';
}
}
c3RydWN0IGV4cF9zbW9vdGhpbmcgewogICAgZmxvYXQgYWxwaGE7IC8vIHNtb290aGluZyBwYXJhbWV0ZXIgKDEgPSBpZGVudGl0eSBtYXBwaW5nKQogICAgZmxvYXQgbGFzdDsgIC8vIHN0YXRlCiAKICAgIGZsb2F0IG9wZXJhdG9yKCkoZmxvYXQgeCkgewogICAgCXJldHVybiBsYXN0ICs9ICh4IC0gbGFzdCkgKiBhbHBoYTsgCiAgICB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBGaWx0ZXIsIGNsYXNzIEl0ZXJhdG9yPgpGaWx0ZXIgYXBwbHlfaW5wbGFjZShGaWx0ZXIgZmx0LCBJdGVyYXRvciBiZWcsIEl0ZXJhdG9yIGVuZCkgewogICAgd2hpbGUgKGJlZyAhPSBlbmQpIHsKICAgICAgICAqYmVnID0gZmx0KCpiZWcpOwogICAgICAgICsrYmVnOwogICAgfQogICAgcmV0dXJuIGZsdDsKfQoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgogCmludCBtYWluKCkgewogICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHNpZ25hbCA9IHswLDEsMiwzLDQsNSw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2fTsKICAgIGV4cF9zbW9vdGhpbmcgZmx0ID0gewogICAgICAgIDAuNWYsIC8vIGFscGhhCiAgICAgICAgMC4wZiAgLy8gbGFzdAogICAgfTsKICAgIGZsdCA9IGFwcGx5X2lucGxhY2UoZmx0LHNpZ25hbC5iZWdpbigpLHNpZ25hbC5lbmQoKSk7CiAgICBmb3IgKGZsb2F0IHggOiBzaWduYWwpIHsKICAgIAlzdGQ6OmNvdXQgPDwgeCA8PCAnXG4nOwogICAgfQp9Cg==