| Index: webrtc/common_audio/smoothing_filter.h
|
| diff --git a/webrtc/common_audio/smoothing_filter.h b/webrtc/common_audio/smoothing_filter.h
|
| index 03eb718d54f05c3c2df7d30ae5984a4ef2443ae8..3fc8bfe84c4fc11587c5e02c85eaafed68dc9f21 100644
|
| --- a/webrtc/common_audio/smoothing_filter.h
|
| +++ b/webrtc/common_audio/smoothing_filter.h
|
| @@ -11,7 +11,6 @@
|
| #ifndef WEBRTC_COMMON_AUDIO_SMOOTHING_FILTER_H_
|
| #define WEBRTC_COMMON_AUDIO_SMOOTHING_FILTER_H_
|
|
|
| -#include "webrtc/base/analytics/exp_filter.h"
|
| #include "webrtc/base/constructormagic.h"
|
| #include "webrtc/base/optional.h"
|
| #include "webrtc/system_wrappers/include/clock.h"
|
| @@ -22,31 +21,49 @@ class SmoothingFilter {
|
| public:
|
| virtual ~SmoothingFilter() = default;
|
| virtual void AddSample(float sample) = 0;
|
| - virtual rtc::Optional<float> GetAverage() const = 0;
|
| + virtual rtc::Optional<float> GetAverage() = 0;
|
| virtual void SetTimeConstantMs(int time_constant_ms) = 0;
|
| };
|
|
|
| // SmoothingFilterImpl applies an exponential filter
|
| -// alpha = exp(-sample_interval / time_constant);
|
| +// alpha = exp(-1.0 / time_constant_ms);
|
| // y[t] = alpha * y[t-1] + (1 - alpha) * sample;
|
| +// This implies a sample rate of 1000 Hz, i.e., 1 sample / ms.
|
| +// But SmoothingFilterImpl allows sparse samples. All missing samples will be
|
| +// assumed to equal the last received sample.
|
| class SmoothingFilterImpl final : public SmoothingFilter {
|
| public:
|
| - // |time_constant_ms| is the time constant for the exponential filter.
|
| - SmoothingFilterImpl(int time_constant_ms, const Clock* clock);
|
| + // |init_time_ms| is initialization time. It defines a period starting from
|
| + // the arriving time of the first sample. During this period, the exponential
|
| + // filter uses a varying time constant so that a smaller time constant will be
|
| + // applied to the earlier samples. This is to allow the the filter to adapt to
|
| + // earlier samples quickly. After the initialization period, the time constant
|
| + // will be set to |init_time_ms| first and can be changed through
|
| + // |SetTimeConstantMs|.
|
| + SmoothingFilterImpl(int init_time_ms, const Clock* clock);
|
| + ~SmoothingFilterImpl() override;
|
|
|
| void AddSample(float sample) override;
|
| - rtc::Optional<float> GetAverage() const override;
|
| + rtc::Optional<float> GetAverage() override;
|
| void SetTimeConstantMs(int time_constant_ms) override;
|
|
|
| + // Methods used for unittests.
|
| + float alpha() const { return alpha_; }
|
| +
|
| private:
|
| - int time_constant_ms_;
|
| + void UpdateAlpha(int time_constant_ms);
|
| + void ExtrapolateLastSample(int64_t time_ms);
|
| +
|
| + const int init_time_ms_;
|
| + const float init_factor_;
|
| + const float init_const_;
|
| const Clock* const clock_;
|
|
|
| - bool first_sample_received_;
|
| - bool initialized_;
|
| - int64_t first_sample_time_ms_;
|
| - int64_t last_sample_time_ms_;
|
| - rtc::ExpFilter filter_;
|
| + rtc::Optional<int64_t> first_sample_time_ms_;
|
| + float last_sample_;
|
| + float alpha_;
|
| + float state_;
|
| + int64_t last_state_time_ms_;
|
|
|
| RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SmoothingFilterImpl);
|
| };
|
|
|