FILTER_median.ino


1
// Algo from Detlef _. (detlef_a) 19.05.2024 20:53
2
// https://www.mikrocontroller.net/topic/567716#7668204
3
4
//typedef float median_t;
5
//typedef int32_t index_t;
6
7
typedef int16_t median_t;
8
typedef uint8_t index_t;
9
10
#define NN (3)
11
12
median_t median(median_t neu)
13
{
14
  index_t k, m;
15
  static index_t gross[NN];
16
  static index_t w = 0;
17
  static median_t alt[NN];
18
19
  //Ini
20
  if (w == 0) 
21
  {
22
    for (m = 0; m < NN; m++) alt[m] = 0;
23
    for (m = 0; m < NN; m++) gross[m] = m;
24
    w = 1;
25
  }
26
27
  // Den ältesten rausschmeissen
28
  k = 0;
29
  while (1) 
30
  {
31
    if (gross[k] == NN - 1) break;
32
    k++;
33
  }
34
35
  while (1) 
36
  {
37
    if (k == 0) break;
38
    gross[k] = gross[k - 1];
39
    k--;
40
  }
41
42
  // Wo musser denn hin?
43
  k = 0;
44
  while (1) 
45
  {
46
    if (alt[gross[k + 1]] > neu) break;
47
    k++;
48
    if (k == NN - 1)      break;
49
  }
50
51
  // Platz da
52
  m = 0;
53
54
  while (1) 
55
  {
56
    if (k == m) break;
57
    gross[m] = gross[m + 1];
58
    m++;
59
  }
60
61
  gross[k] = -1;
62
  for (m = 0; m < NN; m++) gross[m]++;
63
  // ruecken
64
  m = NN - 1;
65
  while (1) 
66
  {
67
    alt[m] = alt[m - 1];
68
    m--;
69
    if (m == 0) break;
70
  }
71
72
  alt[0] = neu;
73
  return (alt[gross[(NN - 1) / 2]]);
74
}
75
76
void setup()
77
{
78
  Serial.begin(115200);
79
}
80
81
void loop()
82
{
83
  uint32_t ts;
84
  median_t x; 
85
  median_t y;
86
87
  x = random(-32768,32767);
88
  
89
  ts = micros();
90
  y = median(x);
91
  uint32_t ende = micros();
92
93
  Serial.println("value" + String(x) + " time used [us]: " + String(ende - ts));
94
  delay(10);
95
96
}