RSeries astromech firmware
MedianSampleBuffer.h
Go to the documentation of this file.
1 #ifndef MedianSampleBuffer_h
2 #define MedianSampleBuffer_h
3 
12 template <typename T, uint8_t size>
14 {
15 public:
16  static_assert(size == 3 || size == 5 ||
17  size == 6 || size == 7 ||
18  size == 9 || size == 25
19  , "Only 3, 5, 6, 7, 9, 25 are supported" );
20 
21  void append(T val)
22  {
23  for (uint8_t i = 0; i < size-1; i++)
24  {
25  V[i] = V[i+1];
26  B[i] = V[i];
27  }
28  V[size-1] = B[size-1] = val;
29  }
30 
31  T median()
32  {
33  if (size == 3)
34  {
35  sort(B[0], B[1]);
36  sort(B[1], B[2]);
37  sort(B[0], B[1]);
38  return B[1];
39  }
40  else if (size == 5)
41  {
42  sort(B[0], B[1]); sort(B[3], B[4]); sort(B[0], B[3]);
43  sort(B[1], B[4]); sort(B[1], B[2]); sort(B[2], B[3]);
44  sort(B[1], B[2]);
45  return B[2];
46  }
47  else if (size == 6)
48  {
49  sort(B[1], B[2]); sort(B[3],B[4]);
50  sort(B[0], B[1]); sort(B[2],B[3]); sort(B[4],B[5]);
51  sort(B[1], B[2]); sort(B[3],B[4]);
52  sort(B[0], B[1]); sort(B[2],B[3]); sort(B[4],B[5]);
53  sort(B[1], B[2]); sort(B[3],B[4]);
54  return (B[2] + B[3]) / 2;
55  }
56  else if (size == 7)
57  {
58  sort(B[0], B[5]); sort(B[0], B[3]); sort(B[1], B[6]);
59  sort(B[2], B[4]); sort(B[0], B[1]); sort(B[3], B[5]);
60  sort(B[2], B[6]); sort(B[2], B[3]); sort(B[3], B[6]);
61  sort(B[4], B[5]); sort(B[1], B[4]); sort(B[1], B[3]);
62  sort(B[3], B[4]);
63  return B[3];
64  }
65  else if (size == 9)
66  {
67  sort(B[1], B[2]); sort(B[4], B[5]); sort(B[7], B[8]);
68  sort(B[0], B[1]); sort(B[3], B[4]); sort(B[6], B[7]);
69  sort(B[1], B[2]); sort(B[4], B[5]); sort(B[7], B[8]);
70  sort(B[0], B[3]); sort(B[5], B[8]); sort(B[4], B[7]);
71  sort(B[3], B[6]); sort(B[1], B[4]); sort(B[2], B[5]);
72  sort(B[4], B[7]); sort(B[4], B[2]); sort(B[6], B[4]);
73  sort(B[4], B[2]);
74  return B[4];
75  }
76  else if (size == 25)
77  {
78  sort(B[0], B[1]); sort(B[3], B[4]); sort(B[2], B[4]);
79  sort(B[2], B[3]); sort(B[6], B[7]); sort(B[5], B[7]);
80  sort(B[5], B[6]); sort(B[9], B[10]); sort(B[8], B[10]);
81  sort(B[8], B[9]); sort(B[12], B[13]); sort(B[11], B[13]);
82  sort(B[11], B[12]); sort(B[15], B[16]); sort(B[14], B[16]);
83  sort(B[14], B[15]); sort(B[18], B[19]); sort(B[17], B[19]);
84  sort(B[17], B[18]); sort(B[21], B[22]); sort(B[20], B[22]);
85  sort(B[20], B[21]); sort(B[23], B[24]); sort(B[2], B[5]);
86  sort(B[3], B[6]); sort(B[0], B[6]); sort(B[0], B[3]);
87  sort(B[4], B[7]); sort(B[1], B[7]); sort(B[1], B[4]);
88  sort(B[11], B[14]); sort(B[8], B[14]); sort(B[8], B[11]);
89  sort(B[12], B[15]); sort(B[9], B[15]); sort(B[9], B[12]);
90  sort(B[13], B[16]); sort(B[10], B[16]); sort(B[10], B[13]);
91  sort(B[20], B[23]); sort(B[17], B[23]); sort(B[17], B[20]);
92  sort(B[21], B[24]); sort(B[18], B[24]); sort(B[18], B[21]);
93  sort(B[19], B[22]); sort(B[8], B[17]); sort(B[9], B[18]);
94  sort(B[0], B[18]); sort(B[0], B[9]); sort(B[10], B[19]);
95  sort(B[1], B[19]); sort(B[1], B[10]); sort(B[11], B[20]);
96  sort(B[2], B[20]); sort(B[2], B[11]); sort(B[12], B[21]);
97  sort(B[3], B[21]); sort(B[3], B[12]); sort(B[13], B[22]);
98  sort(B[4], B[22]); sort(B[4], B[13]); sort(B[14], B[23]);
99  sort(B[5], B[23]); sort(B[5], B[14]); sort(B[15], B[24]);
100  sort(B[6], B[24]); sort(B[6], B[15]); sort(B[7], B[16]);
101  sort(B[7], B[19]); sort(B[13], B[21]); sort(B[15], B[23]);
102  sort(B[7], B[13]); sort(B[7], B[15]); sort(B[1], B[9]);
103  sort(B[3], B[11]); sort(B[5], B[17]); sort(B[11], B[17]);
104  sort(B[9], B[17]); sort(B[4], B[10]); sort(B[6], B[12]);
105  sort(B[7], B[14]); sort(B[4], B[6]); sort(B[4], B[7]);
106  sort(B[12], B[14]); sort(B[10], B[14]); sort(B[6], B[7]);
107  sort(B[10], B[12]); sort(B[6], B[10]); sort(B[6], B[17]);
108  sort(B[12], B[17]); sort(B[7], B[17]); sort(B[7], B[10]);
109  sort(B[12], B[18]); sort(B[7], B[12]); sort(B[10], B[18]);
110  sort(B[12], B[20]); sort(B[10], B[20]); sort(B[10], B[12]);
111  return B[12];
112  }
113  // Not supported
114  return 0;
115  }
116 
117 private:
118  T V[size] = { 0 };
119  T B[size] = { 0 };
120 
121  constexpr void sort(T& a, T& b)
122  {
123  if ((a)>(b))
124  {
125  T t = a;
126  a = b;
127  b = t;
128  }
129  }
130 };
131 #endif
MedianSampleBuffer::append
void append(T val)
Definition: MedianSampleBuffer.h:21
MedianSampleBuffer
The median of N numerical values by:
Definition: MedianSampleBuffer.h:13
MedianSampleBuffer::median
T median()
Definition: MedianSampleBuffer.h:31