arduino-audio-tools
Loading...
Searching...
No Matches
MedianFilter.h
Go to the documentation of this file.
1#pragma once
2#include "Filter.h"
4
5namespace audio_tools {
6
14template <typename T = int16_t>
15class MedianFilter : public Filter<T> {
16 public:
17 MedianFilter(int size = 7) {
18 medianBuffer.resize(size);
22 };
23
24 virtual T process(T in) override { return insert(&medianFilter, in); }
25
26 protected:
27 struct MedianNode_t {
28 T value = 0; // sample value
29 struct MedianNode_t *nextAge = nullptr; // pointer to next oldest value
30 struct MedianNode_t *nextValue = nullptr; // pointer to next smallest value
32 nullptr; // pointer to previous smallest value
33 };
34
36 unsigned int numNodes = 0; // median node buffer length
37 MedianNode_t *medianBuffer = nullptr; // median node buffer
38 MedianNode_t *ageHead = nullptr; // pointer to oldest value
39 MedianNode_t *valueHead = nullptr; // pointer to smallest value
40 MedianNode_t *medianHead = nullptr; // pointer to median value
41 };
42
45
48 (medianFilter->numNodes % 2) && (medianFilter->numNodes > 1)) {
49 // initialize buffer nodes
50 for (unsigned int i = 0; i < medianFilter->numNodes; i++) {
58 }
59 // initialize heads
64
65 return 0;
66 }
67
68 return -1;
69 }
70
72 unsigned int i;
73 MedianNode_t *newNode=nullptr, *it=nullptr;
74
76 // if oldest node is also the smallest node, increment value head
78 }
79
82 // prepare for median correction
84 }
85
86 // replace age head with new sample
88 newNode->value = sample;
89
90 // remove age head from list
95 // increment age head
97
98 // find new node position
99 it = medianFilter->valueHead; // set iterator as value head
100 for (i = 0; i < medianFilter->numNodes - 1; i++) {
101 if (sample < it->value) {
102 if (i == 0) { // replace value head if new node is the smallest
104 }
105 break;
106 }
107 it = it->nextValue;
108 }
109
110 // insert new node in list
113 it->prevValue = newNode;
114 newNode->nextValue = it;
115
116 // adjust median node
117 if (i >= (medianFilter->numNodes / 2)) {
119 }
120
122 }
123};
124
125} // namespace audio_tools
Abstract filter interface definition;.
Definition Filter.h:28
An embedded friendly, fast one-dimensional median filter algorithm implementation in C and C++ Useful...
Definition MedianFilter.h:15
MedianFilter_t medianFilter
Definition MedianFilter.h:43
int insert(MedianFilter_t *medianFilter, T sample)
Definition MedianFilter.h:71
MedianFilter(int size=7)
Definition MedianFilter.h:17
Vector< MedianNode_t > medianBuffer
Definition MedianFilter.h:44
int init(MedianFilter_t *medianFilter)
Definition MedianFilter.h:46
virtual T process(T in) override
Definition MedianFilter.h:24
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Definition MedianFilter.h:35
unsigned int numNodes
Definition MedianFilter.h:36
MedianNode_t * medianBuffer
Definition MedianFilter.h:37
MedianNode_t * ageHead
Definition MedianFilter.h:38
MedianNode_t * medianHead
Definition MedianFilter.h:40
MedianNode_t * valueHead
Definition MedianFilter.h:39
Definition MedianFilter.h:27
T value
Definition MedianFilter.h:28
struct MedianNode_t * nextAge
Definition MedianFilter.h:29
struct MedianNode_t * prevValue
Definition MedianFilter.h:31
struct MedianNode_t * nextValue
Definition MedianFilter.h:30