Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(578)

Side by Side Diff: webrtc/modules/audio_processing/level_controller/gain_selector.cc

Issue 2090583002: New module for the adaptive level controlling functionality in the audio processing module (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Corrected an assignment error Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 #include "webrtc/modules/audio_processing/level_controller/gain_selector.h"
12
13 #include <math.h>
14 #include <algorithm>
15
16 #include "webrtc/base/checks.h"
17 #include "webrtc/modules/audio_processing/include/audio_processing.h"
18 #include "webrtc/modules/audio_processing/level_controller/lc_constants.h"
19
20 namespace webrtc {
21
22 GainSelector::GainSelector() {
23 Initialize(AudioProcessing::kSampleRate48kHz);
24 }
25
26 void GainSelector::Initialize(int sample_rate_hz) {
27 gain_ = 1.f;
28 frame_length_ = rtc::CheckedDivExact(sample_rate_hz, 100);
29 highly_nonstationary_signal_hold_counter_ = 0;
30 }
31
32 // Chooses the gain to apply by the level controller such that
33 // 1) The level of the stationary noise does not exceed
34 // a predefined threshold.
35 // 2) The gain does not exceed the gain that has been found
36 // to saturate the signal.
37 // 3) The peak level achieves the target peak level.
38 // 4) The gain is not below 1.
39 // 4) The gain is 1 if the signal has been classified as stationary
40 // for a long time.
41 // 5) The gain is not above the maximum gain.
42 float GainSelector::GetNewGain(float peak_level,
43 float noise_energy,
44 float saturating_gain,
45 SignalClassifier::SignalType signal_type) {
46 RTC_DCHECK_LT(0.f, peak_level);
47
48 if (signal_type == SignalClassifier::SignalType::kHighlyNonStationary) {
49 highly_nonstationary_signal_hold_counter_ = 10000;
50 } else {
51 highly_nonstationary_signal_hold_counter_ =
52 std::max(0, highly_nonstationary_signal_hold_counter_ - 1);
53 }
54
55 float desired_gain;
56 if (highly_nonstationary_signal_hold_counter_ > 0) {
hlundin-webrtc 2016/06/28 11:29:01 Please, explain this logic in a comment.
peah-webrtc 2016/06/28 22:19:37 Done.
57 desired_gain = kTargetLcPeakLevel / peak_level;
58
59 float max_noise_energy = kMaxLcNoisePower * frame_length_;
60 if (noise_energy * desired_gain * desired_gain > max_noise_energy) {
61 RTC_DCHECK_LE(0.f, noise_energy);
62 desired_gain = sqrtf(max_noise_energy / noise_energy);
63 }
64 } else {
65 desired_gain = 1.0f;
66 }
67
68 gain_ += 0.2f * (desired_gain - gain_);
69
70 gain_ = std::min(gain_, saturating_gain);
71 gain_ = std::min(gain_, kMaxLcGain);
72 gain_ = std::max(gain_, 1.f);
73
74 return gain_;
75 }
76
77 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698