blob: a99cd4f4977eee0b4d9474c32a915218469c1ce9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/*
* Copyright (C) 2010-2013 Hendrik Leppkes
* http://www.1f0.de
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once
#include <assert.h>
#include "DShowUtil.h"
template <class T>
class FloatingAverage
{
public:
FloatingAverage(unsigned int iNumSamples = 10) {
SetNumSamples(iNumSamples);
}
~FloatingAverage() {
free(m_Samples);
}
void SetNumSamples(unsigned int iNumSamples) {
if (iNumSamples > m_NumSamplesAlloc) {
m_Samples = (T *)realloc(m_Samples, iNumSamples * sizeof(T));
m_NumSamplesAlloc = iNumSamples;
}
if (iNumSamples > m_NumSamples)
memset(m_Samples + m_NumSamples, 0, sizeof(T) * (iNumSamples - m_NumSamples));
m_NumSamples = iNumSamples;
}
void Sample(T fSample) {
m_Samples[m_CurrentSample] = fSample;
if (++m_CurrentSample >= m_NumSamples) {
m_CurrentSample = 0;
}
}
T Average() const {
T fAverage = 0;
for(unsigned int i = 0; i < m_NumSamples; ++i) {
fAverage += m_Samples[i] / m_NumSamples;
}
return fAverage;
}
T Minimum() const {
T min = m_Samples[0];
for(unsigned int i = 1; i < m_NumSamples; ++i) {
if (m_Samples[i] < min)
min = m_Samples[i];
}
return min;
}
T AbsMinimum() const {
T min = m_Samples[0];
for(unsigned int i = 1; i < m_NumSamples; ++i) {
if (abs(m_Samples[i]) < abs(min))
min = m_Samples[i];
}
return min;
}
T Maximum() const {
T max = m_Samples[0];
for(unsigned int i = 1; i < m_NumSamples; ++i) {
if (m_Samples[i] > max)
max = m_Samples[i];
}
return max;
}
T AbsMaximum() const {
T max = m_Samples[0];
for(unsigned int i = 1; i < m_NumSamples; ++i) {
if (abs(m_Samples[i]) > abs(max))
max = m_Samples[i];
}
return max;
}
void OffsetValues(T value) const {
for(unsigned int i = 0; i < m_NumSamples; ++i) {
m_Samples[i] += value;
}
}
unsigned int CurrentSample() const {
return m_CurrentSample;
}
private:
T *m_Samples = nullptr;
unsigned int m_NumSamples = 0;
unsigned int m_NumSamplesAlloc = 0;
unsigned int m_CurrentSample = 0;
};
|