arduino-audio-tools
Loading...
Searching...
No Matches
src
AudioTools
CoreAudio
AudioFilter
MedianFilter.h
Go to the documentation of this file.
1
#pragma once
2
#include "
Filter.h
"
3
#include "
AudioTools/CoreAudio/AudioBasic/Collections/Vector.h
"
4
5
namespace
audio_tools
{
6
14
template
<
typename
T =
int
16_t>
15
class
MedianFilter
:
public
Filter
<T> {
16
public
:
17
MedianFilter
(
int
size = 7) {
18
medianBuffer
.resize(size);
19
medianFilter
.numNodes = size;
20
medianFilter
.medianBuffer =
medianBuffer
.data();
21
init
(&
medianFilter
);
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
31
struct
MedianNode_t
*
prevValue
=
32
nullptr
;
// pointer to previous smallest value
33
};
34
35
struct
MedianFilter_t
{
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
43
MedianFilter_t
medianFilter
;
44
Vector<MedianNode_t>
medianBuffer
{0};
45
46
int
init
(
MedianFilter_t
*
medianFilter
) {
47
if
(
medianFilter
&&
medianFilter
->medianBuffer &&
48
(
medianFilter
->numNodes % 2) && (
medianFilter
->numNodes > 1)) {
49
// initialize buffer nodes
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];
58
}
59
// initialize heads
60
medianFilter
->ageHead =
medianFilter
->medianBuffer;
61
medianFilter
->valueHead =
medianFilter
->medianBuffer;
62
medianFilter
->medianHead =
63
&
medianFilter
->medianBuffer[
medianFilter
->numNodes / 2];
64
65
return
0;
66
}
67
68
return
-1;
69
}
70
71
int
insert
(
MedianFilter_t
*
medianFilter
, T sample) {
72
unsigned
int
i;
73
MedianNode_t
*newNode=
nullptr
, *it=
nullptr
;
74
75
if
(
medianFilter
->ageHead ==
medianFilter
->valueHead) {
76
// if oldest node is also the smallest node, increment value head
77
medianFilter
->valueHead =
medianFilter
->valueHead->nextValue;
78
}
79
80
if
((
medianFilter
->ageHead ==
medianFilter
->medianHead) ||
81
(
medianFilter
->ageHead->value >
medianFilter
->medianHead->value)) {
82
// prepare for median correction
83
medianFilter
->medianHead =
medianFilter
->medianHead->prevValue;
84
}
85
86
// replace age head with new sample
87
newNode =
medianFilter
->ageHead;
88
newNode->
value
= sample;
89
90
// remove age head from list
91
medianFilter
->ageHead->nextValue->prevValue =
92
medianFilter
->ageHead->prevValue;
93
medianFilter
->ageHead->prevValue->nextValue =
94
medianFilter
->ageHead->nextValue;
95
// increment age head
96
medianFilter
->ageHead =
medianFilter
->ageHead->nextAge;
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
103
medianFilter
->valueHead = newNode;
104
}
105
break
;
106
}
107
it = it->nextValue;
108
}
109
110
// insert new node in list
111
it->prevValue->nextValue = newNode;
112
newNode->
prevValue
= it->
prevValue
;
113
it->
prevValue
= newNode;
114
newNode->
nextValue
= it;
115
116
// adjust median node
117
if
(i >= (
medianFilter
->numNodes / 2)) {
118
medianFilter
->medianHead =
medianFilter
->medianHead->nextValue;
119
}
120
121
return
medianFilter
->medianHead->value;
122
}
123
};
124
125
}
// namespace audio_tools
Filter.h
Vector.h
audio_tools::MedianFilter::medianFilter
MedianFilter_t medianFilter
Definition
MedianFilter.h:43
audio_tools::MedianFilter::insert
int insert(MedianFilter_t *medianFilter, T sample)
Definition
MedianFilter.h:71
audio_tools::MedianFilter::MedianFilter
MedianFilter(int size=7)
Definition
MedianFilter.h:17
audio_tools::MedianFilter::medianBuffer
Vector< MedianNode_t > medianBuffer
Definition
MedianFilter.h:44
audio_tools::MedianFilter::init
int init(MedianFilter_t *medianFilter)
Definition
MedianFilter.h:46
audio_tools::MedianFilter::process
virtual T process(T in) override
Definition
MedianFilter.h:24
audio_tools::Vector
Vector implementation which provides the most important methods as defined by std::vector....
Definition
Vector.h:21
audio_tools::audio_tools::Filter< int16_t >::Filter
Filter()=default
audio_tools
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition
LMSEchoCancellationStream.h:6
audio_tools::MedianFilter::MedianFilter_t
Definition
MedianFilter.h:35
audio_tools::MedianFilter::MedianFilter_t::numNodes
unsigned int numNodes
Definition
MedianFilter.h:36
audio_tools::MedianFilter::MedianFilter_t::medianBuffer
MedianNode_t * medianBuffer
Definition
MedianFilter.h:37
audio_tools::MedianFilter::MedianFilter_t::ageHead
MedianNode_t * ageHead
Definition
MedianFilter.h:38
audio_tools::MedianFilter::MedianFilter_t::medianHead
MedianNode_t * medianHead
Definition
MedianFilter.h:40
audio_tools::MedianFilter::MedianFilter_t::valueHead
MedianNode_t * valueHead
Definition
MedianFilter.h:39
audio_tools::MedianFilter::MedianNode_t
Definition
MedianFilter.h:27
audio_tools::MedianFilter::MedianNode_t::value
T value
Definition
MedianFilter.h:28
audio_tools::MedianFilter::MedianNode_t::nextAge
struct MedianNode_t * nextAge
Definition
MedianFilter.h:29
audio_tools::MedianFilter::MedianNode_t::prevValue
struct MedianNode_t * prevValue
Definition
MedianFilter.h:31
audio_tools::MedianFilter::MedianNode_t::nextValue
struct MedianNode_t * nextValue
Definition
MedianFilter.h:30
Generated by
1.15.0