OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright (c) 2017 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 #include "webrtc/modules/audio_processing/echo_detector/likelihood_aggregator.h" | |
12 | |
13 #include <algorithm> | |
14 | |
15 #include "webrtc/base/checks.h" | |
16 | |
17 namespace webrtc { | |
18 | |
19 LikelihoodAggregator::LikelihoodAggregator(size_t window_size_frames) | |
20 : recent_values_(window_size_frames) { | |
peah-webrtc
2017/01/13 12:49:02
I think that if you initialize the maximum_candida
ivoc
2017/01/13 13:24:23
I don't think that's entirely true. The values in
peah-webrtc
2017/01/13 13:37:34
Good point! I did not know that.
| |
21 RTC_DCHECK_GT(window_size_frames, 0); | |
22 } | |
23 | |
24 LikelihoodAggregator::~LikelihoodAggregator() {} | |
25 | |
26 void LikelihoodAggregator::Update(float value) { | |
27 // If the new value is larger than any of the candidates, those candidates can | |
28 // be removed because they are older and have a smaller value, so they can | |
29 // never become the maximum in the future. | |
30 while (!maximum_candidates_.empty() && | |
peah-webrtc
2017/01/13 12:49:02
In it's current use in the residual echo detector,
ivoc
2017/01/13 13:24:23
You're right that when considering a single call t
peah-webrtc
2017/01/13 13:37:34
Acknowledged.
| |
31 value >= recent_values_[maximum_candidates_.back()]) { | |
32 maximum_candidates_.pop_back(); | |
33 } | |
34 // If the front (and oldest) candidate is too old, remove it. | |
35 if (!maximum_candidates_.empty() && | |
36 maximum_candidates_.front() == insertion_index_) { | |
37 maximum_candidates_.pop_front(); | |
38 } | |
39 maximum_candidates_.push_back(insertion_index_); | |
peah-webrtc
2017/01/13 12:49:02
This is potentially an expensive operation as it m
ivoc
2017/01/13 13:24:23
In a deque it should not cause reallocation (so no
peah-webrtc
2017/01/13 13:37:34
Ah, I did not know that the deque was stored like
| |
40 recent_values_[insertion_index_] = value; | |
41 insertion_index_++; | |
42 insertion_index_ %= recent_values_.size(); | |
43 } | |
44 | |
45 float LikelihoodAggregator::Max() const { | |
hlundin-webrtc
2017/01/13 13:38:32
Now it is very cheap again, so max() would be ok.
ivoc
2017/01/13 14:40:36
I lowercased it again :-)
| |
46 if (!maximum_candidates_.empty()) { | |
47 return recent_values_[maximum_candidates_.front()]; | |
48 } else { | |
49 return 0.f; | |
50 } | |
51 } | |
52 | |
53 void LikelihoodAggregator::Clear() { | |
54 std::fill(recent_values_.begin(), recent_values_.end(), 0.f); | |
55 maximum_candidates_.clear(); | |
56 } | |
57 | |
58 } // namespace webrtc | |
OLD | NEW |