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 | }
|