31#ifndef ETL_CUMULATIVE_MOVING_AVERAGE_INCLUDED
32#define ETL_CUMULATIVE_MOVING_AVERAGE_INCLUDED
40 namespace private_pseudo_moving_average
46 template <
typename TPseudo_Moving_Average>
47 class add_insert_iterator :
public etl::iterator<ETL_OR_STD::output_iterator_tag, typename TPseudo_Moving_Average::value_type, void, void, void>
52 explicit add_insert_iterator(TPseudo_Moving_Average& pma) ETL_NOEXCEPT
58 add_insert_iterator& operator*() ETL_NOEXCEPT
64 add_insert_iterator& operator++() ETL_NOEXCEPT
70 add_insert_iterator& operator++(
int) ETL_NOEXCEPT
76 add_insert_iterator& operator=(
typename TPseudo_Moving_Average::value_type value)
84 TPseudo_Moving_Average* p_pma;
94 template <typename T, const size_t SAMPLE_SIZE, const size_t SCALING = 1U, const bool IsIntegral = etl::is_integral<T>::value,
95 const bool IsFloat = etl::is_floating_point<T>::value>
105 template <
typename T, const
size_t SAMPLE_SIZE_, const
size_t SCALING_>
112 typedef typename etl::conditional<etl::is_signed<T>::value, int32_t, uint32_t>
::type scale_t;
113 typedef typename etl::conditional<etl::is_signed<T>::value, int32_t, uint32_t>
::type sample_t;
115 static ETL_CONSTANT sample_t SAMPLES =
static_cast<sample_t
>(SAMPLE_SIZE_);
116 static ETL_CONSTANT scale_t SCALE =
static_cast<scale_t
>(SCALING_);
120 typedef T value_type;
124 static ETL_CONSTANT
size_t SCALING = SCALING_;
131 : average(initial_value * SCALE)
141 average = (initial_value * SCALE);
151 average += SCALE * new_value;
152 average /= SAMPLES + sample_t(1);
170 return add_insert_iterator(*
this);
178 template <
typename T, const
size_t SAMPLE_SIZE_, const
size_t SCALING_>
181 template <
typename T, const
size_t SAMPLE_SIZE_, const
size_t SCALING_>
190 template <
typename T, const
size_t SCALING_>
195 typedef typename etl::conditional<etl::is_signed<T>::value, int32_t, uint32_t>
::type scale_t;
196 typedef typename etl::conditional<etl::is_signed<T>::value, int32_t, uint32_t>
::type sample_t;
198 static ETL_CONSTANT scale_t SCALE =
static_cast<scale_t
>(SCALING_);
202 typedef T value_type;
205 static ETL_CONSTANT
size_t SCALING = SCALING_;
212 : average(initial_value * SCALE)
213 , samples(sample_t(sample_size))
223 average = (initial_value * SCALE);
232 samples = sample_t(sample_size);
242 average += SCALE * new_value;
243 average /= samples + sample_t(1);
261 return add_insert_iterator(*
this);
270 template <
typename T, const
size_t SCALING_>
279 template <
typename T, const
size_t SAMPLE_SIZE_>
286 typedef T value_type;
289 static ETL_CONSTANT
size_t SAMPLE_SIZE = SAMPLE_SIZE_;
296 : reciprocal_samples_plus_1(T(1.0) / T(SAMPLE_SIZE_ + 1U))
297 , average(initial_value)
307 average = initial_value;
314 void add(
const T new_value)
316 average += (new_value - average) * reciprocal_samples_plus_1;
334 return add_insert_iterator(*
this);
339 const T reciprocal_samples_plus_1;
344 template <
typename T, const
size_t SAMPLE_SIZE_>
345 ETL_CONSTANT
size_t pseudo_moving_average<T, SAMPLE_SIZE_, 1U, false, true>::SAMPLE_SIZE;
352 template <
typename T>
359 typedef T value_type;
367 : reciprocal_samples_plus_1(T(1.0) / T(sample_size + 1U))
368 , average(initial_value)
378 average = initial_value;
387 reciprocal_samples_plus_1 = T(1.0) / (T(sample_size) + T(1));
394 void add(
const T new_value)
396 average += (new_value - average) * reciprocal_samples_plus_1;
414 return add_insert_iterator(*
this);
419 T reciprocal_samples_plus_1;
Definition pseudo_moving_average.h:48
pseudo_moving_average(const T initial_value, const size_t sample_size)
Definition pseudo_moving_average.h:211
void clear(const T initial_value)
Definition pseudo_moving_average.h:221
void add(T new_value)
Definition pseudo_moving_average.h:239
T value() const
Definition pseudo_moving_average.h:250
void set_sample_size(const size_t sample_size)
Definition pseudo_moving_average.h:230
add_insert_iterator input()
Definition pseudo_moving_average.h:259
static ETL_CONSTANT size_t SCALING
The sample scaling factor.
Definition pseudo_moving_average.h:205
add_insert_iterator input()
Definition pseudo_moving_average.h:412
void set_sample_size(const size_t sample_size)
Definition pseudo_moving_average.h:385
pseudo_moving_average(const T initial_value, const size_t sample_size)
Definition pseudo_moving_average.h:366
T value() const
Definition pseudo_moving_average.h:403
void add(const T new_value)
Definition pseudo_moving_average.h:394
void clear(const T initial_value)
Definition pseudo_moving_average.h:376
void clear(const T initial_value)
Definition pseudo_moving_average.h:305
T value() const
Definition pseudo_moving_average.h:323
add_insert_iterator input()
Definition pseudo_moving_average.h:332
void add(const T new_value)
Definition pseudo_moving_average.h:314
pseudo_moving_average(const T initial_value)
Definition pseudo_moving_average.h:295
void add(T new_value)
Definition pseudo_moving_average.h:148
pseudo_moving_average(const T initial_value)
Definition pseudo_moving_average.h:130
T value() const
Definition pseudo_moving_average.h:159
static ETL_CONSTANT size_t SAMPLE_SIZE
The number of samples averaged over.
Definition pseudo_moving_average.h:123
void clear(const T initial_value)
Definition pseudo_moving_average.h:139
add_insert_iterator input()
Definition pseudo_moving_average.h:168
static ETL_CONSTANT size_t SCALING
The sample scaling factor.
Definition pseudo_moving_average.h:124
Definition pseudo_moving_average.h:96
bitset_ext
Definition absolute.h:40
iterator
Definition iterator.h:424