Line data Source code
1 : /*
2 : * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : #ifndef WEBRTC_COMMON_AUDIO_SMOOTHING_FILTER_H_
12 : #define WEBRTC_COMMON_AUDIO_SMOOTHING_FILTER_H_
13 :
14 : #include "webrtc/base/constructormagic.h"
15 : #include "webrtc/base/optional.h"
16 : #include "webrtc/system_wrappers/include/clock.h"
17 :
18 : namespace webrtc {
19 :
20 0 : class SmoothingFilter {
21 : public:
22 0 : virtual ~SmoothingFilter() = default;
23 : virtual void AddSample(float sample) = 0;
24 : virtual rtc::Optional<float> GetAverage() = 0;
25 : virtual bool SetTimeConstantMs(int time_constant_ms) = 0;
26 : };
27 :
28 : // SmoothingFilterImpl applies an exponential filter
29 : // alpha = exp(-1.0 / time_constant_ms);
30 : // y[t] = alpha * y[t-1] + (1 - alpha) * sample;
31 : // This implies a sample rate of 1000 Hz, i.e., 1 sample / ms.
32 : // But SmoothingFilterImpl allows sparse samples. All missing samples will be
33 : // assumed to equal the last received sample.
34 0 : class SmoothingFilterImpl final : public SmoothingFilter {
35 : public:
36 : // |init_time_ms| is initialization time. It defines a period starting from
37 : // the arriving time of the first sample. During this period, the exponential
38 : // filter uses a varying time constant so that a smaller time constant will be
39 : // applied to the earlier samples. This is to allow the the filter to adapt to
40 : // earlier samples quickly. After the initialization period, the time constant
41 : // will be set to |init_time_ms| first and can be changed through
42 : // |SetTimeConstantMs|.
43 : SmoothingFilterImpl(int init_time_ms, const Clock* clock);
44 : ~SmoothingFilterImpl() override;
45 :
46 : void AddSample(float sample) override;
47 : rtc::Optional<float> GetAverage() override;
48 : bool SetTimeConstantMs(int time_constant_ms) override;
49 :
50 : // Methods used for unittests.
51 : float alpha() const { return alpha_; }
52 :
53 : private:
54 : void UpdateAlpha(int time_constant_ms);
55 : void ExtrapolateLastSample(int64_t time_ms);
56 :
57 : const int init_time_ms_;
58 : const float init_factor_;
59 : const float init_const_;
60 : const Clock* const clock_;
61 :
62 : rtc::Optional<int64_t> init_end_time_ms_;
63 : float last_sample_;
64 : float alpha_;
65 : float state_;
66 : int64_t last_state_time_ms_;
67 :
68 : RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SmoothingFilterImpl);
69 : };
70 :
71 : } // namespace webrtc
72 :
73 : #endif // WEBRTC_COMMON_AUDIO_SMOOTHING_FILTER_H_
|