Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
vpStatisticalTestEWMA.cpp
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * See the file LICENSE.txt at the root directory of this source
10 * distribution for additional information about the GNU GPL.
11 *
12 * For using ViSP with software that can not be combined with the GNU
13 * GPL, please contact Inria about acquiring a ViSP Professional
14 * Edition License.
15 *
16 * See https://visp.inria.fr for more information.
17 *
18 * This software was developed at:
19 * Inria Rennes - Bretagne Atlantique
20 * Campus Universitaire de Beaulieu
21 * 35042 Rennes Cedex
22 * France
23 *
24 * If you have questions regarding the use of this file, please contact
25 * Inria at visp@inria.fr
26 *
27 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 */
30
38
39#include <visp3/core/vpStatisticalTestEWMA.h>
40
43{
44 float delta = 3.f * m_stdev * std::sqrt(m_alpha / (2.f - m_alpha));
45 m_limitDown = m_mean - delta;
46 m_limitUp = m_mean + delta;
47}
48
58
68
70{
71 bool areStatsReady = vpStatisticalTestAbstract::updateStatistics(signal);
72 if (areStatsReady) {
73 // Computation of the limits
75
76 // Initialize first value
77 m_wt = m_mean;
78 }
79 return areStatsReady;
80}
81
83{
84 // Update last value
85 m_wtprev = m_wt;
86// w(t) = alpha * s(t) + (1 - alpha) * w(t- 1);
87 m_wt = m_wtprev + m_alpha * (signal - m_wtprev);
88}
89
92 , m_alpha(0.f)
93 , m_wt(0.f)
94 , m_wtprev(0.f)
95{
96 init(alpha);
97}
98
99void vpStatisticalTestEWMA::init(const float &alpha)
100{
102 m_alpha = alpha;
103 unsigned int nbRequiredSamples = static_cast<unsigned int>(std::ceil(3.f / m_alpha));
104 setNbSamplesForStat(nbRequiredSamples);
105 m_wt = 0.f;
106 m_wtprev = 0.f;
107}
108
109void vpStatisticalTestEWMA::init(const float &alpha, const float &mean, const float &stdev)
110{
112 m_alpha = alpha;
113 m_mean = mean;
114 unsigned int nbRequiredSamples = static_cast<unsigned int>(std::ceil(3.f / m_alpha));
115 setNbSamplesForStat(nbRequiredSamples);
116 m_stdev = stdev;
117 m_wt = mean;
118 m_wtprev = 0.f;
119
120 // Computation of the limits
123}
124
125void vpStatisticalTestEWMA::setAlpha(const float &alpha)
126{
127 init(alpha);
128}
129END_VISP_NAMESPACE
vpMeanDriftType
Enum that indicates if a drift of the mean occurred.
void init()
(Re)Initialize the algorithm.
vpStatisticalTestAbstract()
Construct a new vpStatisticalTestAbstract object.
virtual bool updateStatistics(const float &signal)
Update m_s and if enough values are available, compute the mean, the standard deviation and the limit...
void setNbSamplesForStat(const unsigned int &nbSamples)
Set the number of samples required to compute the mean and standard deviation of the signal and alloc...
vpStatisticalTestEWMA(const float &alpha=0.1f)
Construct a new vpStatisticalTestEWMA object.
virtual void updateTestSignals(const float &signal) VP_OVERRIDE
Update the test signals.
virtual bool updateStatistics(const float &signal) VP_OVERRIDE
Update m_s and if enough values are available, compute the mean, the standard deviation and the limit...
virtual void computeDeltaAndLimits()
Compute the upper and lower limits of the test signal.
void setAlpha(const float &alpha)
Set the forgetting factor.
virtual vpMeanDriftType detectUpwardMeanDrift() VP_OVERRIDE
Detects if an upward mean drift occurred on the mean.
virtual vpMeanDriftType detectDownwardMeanDrift() VP_OVERRIDE
Detects if a downward mean drift occurred.