FastLED 3.9.15
Loading...
Searching...
No Matches
alpha_trimmed_mean_impl.h
Go to the documentation of this file.
1#pragma once
2
4#include "fl/stl/algorithm.h"
5#include "fl/stl/span.h"
7
8namespace fl {
9namespace detail {
10
11template <typename T, fl::size N = 0>
13 public:
14 explicit AlphaTrimmedMeanImpl(fl::size trim_count = 1)
15 : mSortedCount(0), mTrimCount(trim_count), mLastValue(T(0)) {}
16 explicit AlphaTrimmedMeanImpl(fl::size capacity, fl::size trim_count)
18 mSortedCount(0), mTrimCount(trim_count), mLastValue(T(0)) {}
19
21 if (values.size() == 0) return mLastValue;
22 for (fl::size i = 0; i < values.size(); ++i) {
23 mRing.push_back(values[i]);
24 }
25 // Rebuild sorted array from ring contents
26 mSortedCount = mRing.size();
27 for (fl::size i = 0; i < mSortedCount; ++i) {
28 mSorted[i] = mRing[i];
29 }
31 // Compute trimmed mean
32 fl::size lo = mTrimCount;
33 fl::size hi = (mSortedCount > mTrimCount) ? mSortedCount - mTrimCount : 0;
34 if (lo >= hi) {
36 } else {
37 T sum = T(0);
38 for (fl::size i = lo; i < hi; ++i) {
39 sum = sum + mSorted[i];
40 }
41 mLastValue = div_by_count(sum, hi - lo);
42 }
43 return mLastValue;
44 }
45
46 T update(T input) {
47 if (!mRing.full()) {
48 T* base = &mSorted[0];
49 T* pos = fl::lower_bound(base, base + mSortedCount, input);
50 fl::size idx = static_cast<fl::size>(pos - base);
51 for (fl::size i = mSortedCount; i > idx; --i) {
52 mSorted[i] = mSorted[i - 1];
53 }
54 mSorted[idx] = input;
56 } else {
57 T oldest = mRing.front();
58 T* base = &mSorted[0];
59 T* rm_pos = fl::lower_bound(base, base + mSortedCount, oldest);
60 fl::size rm = static_cast<fl::size>(rm_pos - base);
61 for (fl::size i = rm; i + 1 < mSortedCount; ++i) {
62 mSorted[i] = mSorted[i + 1];
63 }
64 T* ins_pos = fl::lower_bound(base, base + mSortedCount - 1, input);
65 fl::size idx = static_cast<fl::size>(ins_pos - base);
66 for (fl::size i = mSortedCount - 1; i > idx; --i) {
67 mSorted[i] = mSorted[i - 1];
68 }
69 mSorted[idx] = input;
70 }
71 mRing.push_back(input);
72
73 fl::size lo = mTrimCount;
74 fl::size hi = (mSortedCount > mTrimCount) ? mSortedCount - mTrimCount : 0;
75 if (lo >= hi) {
77 } else {
78 T sum = T(0);
79 for (fl::size i = lo; i < hi; ++i) {
80 sum = sum + mSorted[i];
81 }
82 mLastValue = div_by_count(sum, hi - lo);
83 }
84 return mLastValue;
85 }
86
87 T value() const { return mLastValue; }
88
89 void reset() {
90 mRing.clear();
91 mSortedCount = 0;
92 mLastValue = T(0);
93 }
94
95 fl::size size() const { return mRing.size(); }
96 fl::size capacity() const { return mRing.capacity(); }
97
98 void resize(fl::size new_capacity, fl::size trim_count) {
99 mRing = circular_buffer<T, N>(new_capacity);
100 mSorted = circular_buffer<T, N>(new_capacity);
101 mSortedCount = 0;
102 mTrimCount = trim_count;
103 mLastValue = T(0);
104 }
105
106 private:
109 fl::size mSortedCount;
110 fl::size mTrimCount;
112};
113
114} // namespace detail
115} // namespace fl
uint8_t pos
Definition Blur.ino:11
void resize(fl::size new_capacity, fl::size trim_count)
AlphaTrimmedMeanImpl(fl::size capacity, fl::size trim_count)
T update(fl::span< const T > values)
constexpr fl::size size() const FL_NOEXCEPT
Definition span.h:458
fl::enable_if< fl::is_floating_point< T >::value, T >::type div_by_count(T sum, fl::size count)
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_traits.h:48
void sort(Iterator first, Iterator last, Compare comp) FL_NOEXCEPT
Definition algorithm.h:564
Iterator lower_bound(Iterator first, Iterator last, const T &value, Compare comp) FL_NOEXCEPT
Definition algorithm.h:551
Base definition for an LED controller.
Definition crgb.hpp:179