mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-17 07:37:51 +01:00

This patch estimates the connection RTT using EventBasedExponentialMovingAverage. The half time is set to 500 but can be modified using field trials. This new metric is currently unused, but will be used for exploration of of whether it can be used instead of the existing metric. Bug: webrtc:11140 Change-Id: I9db93e9b9eb932e3cd18935cd4ce0d90fc1cb293 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/161000 Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#29944}
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
/*
|
|
* Copyright 2019 The WebRTC Project Authors. All rights reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef RTC_BASE_NUMERICS_EVENT_BASED_EXPONENTIAL_MOVING_AVERAGE_H_
|
|
#define RTC_BASE_NUMERICS_EVENT_BASED_EXPONENTIAL_MOVING_AVERAGE_H_
|
|
|
|
#include <cmath>
|
|
#include <cstdint>
|
|
#include <limits>
|
|
#include "absl/types/optional.h"
|
|
|
|
namespace rtc {
|
|
|
|
/**
|
|
* This class implements exponential moving average for time series
|
|
* estimating both value, variance and variance of estimator based on
|
|
* https://en.wikipedia.org/w/index.php?title=Moving_average§ion=9#Application_to_measuring_computer_performance
|
|
* with the additions from nisse@ added to
|
|
* https://en.wikipedia.org/wiki/Talk:Moving_average.
|
|
*
|
|
* A sample gets exponentially less weight so that it's 50%
|
|
* after |half_time| time units.
|
|
*/
|
|
class EventBasedExponentialMovingAverage {
|
|
public:
|
|
// |half_time| specifies how much weight will be given to old samples,
|
|
// see example above.
|
|
explicit EventBasedExponentialMovingAverage(int half_time);
|
|
|
|
void AddSample(int64_t now, int value);
|
|
|
|
double GetAverage() const { return value_; }
|
|
double GetVariance() const { return sample_variance_; }
|
|
|
|
// Compute 95% confidence interval assuming that
|
|
// - variance of samples are normal distributed.
|
|
// - variance of estimator is normal distributed.
|
|
//
|
|
// The returned values specifies the distance from the average,
|
|
// i.e if X = GetAverage(), m = GetConfidenceInterval()
|
|
// then a there is 95% likelihood that the observed variables is inside
|
|
// [ X +/- m ].
|
|
double GetConfidenceInterval() const;
|
|
|
|
// Reset
|
|
void Reset();
|
|
|
|
// Update the half_time.
|
|
// NOTE: resets estimate too.
|
|
void SetHalfTime(int half_time);
|
|
|
|
private:
|
|
double tau_;
|
|
double value_ = std::nan("uninit");
|
|
double sample_variance_ = std::numeric_limits<double>::infinity();
|
|
// This is the ratio between variance of the estimate and variance of samples.
|
|
double estimator_variance_ = 1;
|
|
absl::optional<int64_t> last_observation_timestamp_;
|
|
};
|
|
|
|
} // namespace rtc
|
|
|
|
#endif // RTC_BASE_NUMERICS_EVENT_BASED_EXPONENTIAL_MOVING_AVERAGE_H_
|