18 medianBuffer.resize(size);
19 medianFilter.numNodes = size;
20 medianFilter.medianBuffer = medianBuffer.data();
24 virtual T process(T in)
override {
return insert(&medianFilter, in); }
36 unsigned int numNodes = 0;
46 int init(MedianFilter_t *medianFilter) {
47 if (medianFilter && medianFilter->medianBuffer &&
48 (medianFilter->numNodes % 2) && (medianFilter->numNodes > 1)) {
50 for (
unsigned int i = 0; i < medianFilter->numNodes; i++) {
51 medianFilter->medianBuffer[i].value = 0;
52 medianFilter->medianBuffer[i].nextAge =
53 &medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes];
54 medianFilter->medianBuffer[i].nextValue =
55 &medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes];
56 medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes].prevValue =
57 &medianFilter->medianBuffer[i];
60 medianFilter->ageHead = medianFilter->medianBuffer;
61 medianFilter->valueHead = medianFilter->medianBuffer;
62 medianFilter->medianHead =
63 &medianFilter->medianBuffer[medianFilter->numNodes / 2];
71 int insert(MedianFilter_t *medianFilter, T sample) {
73 MedianNode_t *newNode=
nullptr, *it=
nullptr;
75 if (medianFilter->ageHead == medianFilter->valueHead) {
77 medianFilter->valueHead = medianFilter->valueHead->nextValue;
80 if ((medianFilter->ageHead == medianFilter->medianHead) ||
81 (medianFilter->ageHead->value > medianFilter->medianHead->value)) {
83 medianFilter->medianHead = medianFilter->medianHead->prevValue;
87 newNode = medianFilter->ageHead;
88 newNode->value = sample;
91 medianFilter->ageHead->nextValue->prevValue =
92 medianFilter->ageHead->prevValue;
93 medianFilter->ageHead->prevValue->nextValue =
94 medianFilter->ageHead->nextValue;
96 medianFilter->ageHead = medianFilter->ageHead->nextAge;
99 it = medianFilter->valueHead;
100 for (i = 0; i < medianFilter->numNodes - 1; i++) {
101 if (sample < it->value) {
103 medianFilter->valueHead = newNode;
111 it->prevValue->nextValue = newNode;
112 newNode->prevValue = it->prevValue;
113 it->prevValue = newNode;
114 newNode->nextValue = it;
117 if (i >= (medianFilter->numNodes / 2)) {
118 medianFilter->medianHead = medianFilter->medianHead->nextValue;
121 return medianFilter->medianHead->value;