说明
本文中几种滑动平均的公式及说明可点击此处
滑动平均模板类
#pragma once
#include <queue>
#include <list>
namespace ns_filter {
template <typename T, int M>
class SMA
{
public:
static_assert(M>1, "SMA require window width>1");
SMA() :_last_flt_value{
0 } {
};
~SMA() {
};
T apply(const T& raw) {
_queue.push(raw);
if (_queue.size() > M) {
_last_flt_value += ((raw - _queue.front()) / M);
_queue.pop();
} else {
_last_flt_value = (_last_flt_value * (_queue.size() - 1) + raw) / _queue.size();
}
return _last_flt_value;
}
private:
std::queue<T> _queue;
T _last_flt_value{
0}