blob: fdd74a69781919d752b3bf5b441727517a41a364 [file] [log] [blame]
Gustaf Ullbergbffa3002018-02-14 15:12:00 +01001/*
2 * Copyright (c) 2018 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 API_AUDIO_ECHO_CANCELLER3_CONFIG_H_
12#define API_AUDIO_ECHO_CANCELLER3_CONFIG_H_
13
Gustaf Ullberg3646f972018-02-14 15:19:04 +010014#include <stddef.h> // size_t
15
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010016namespace webrtc {
17
18// Configuration struct for EchoCanceller3
19struct EchoCanceller3Config {
Per Åhgrenb6b00dc2018-02-20 22:18:27 +010020 EchoCanceller3Config();
Per Åhgren251c7352018-03-28 16:31:57 +020021 EchoCanceller3Config(const EchoCanceller3Config& e);
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010022 struct Delay {
23 size_t default_delay = 5;
Gustaf Ullberg26728742018-06-04 19:04:40 +020024 size_t down_sampling_factor = 4;
Per Åhgrenfddaf752018-06-08 10:26:40 +020025 size_t num_filters = 6;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010026 size_t api_call_jitter_blocks = 26;
27 size_t min_echo_path_delay_blocks = 0;
28 size_t delay_headroom_blocks = 2;
29 size_t hysteresis_limit_1_blocks = 1;
30 size_t hysteresis_limit_2_blocks = 1;
Per Åhgren2d9a3b12018-05-17 17:24:29 +020031 size_t skew_hysteresis_blocks = 3;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010032 } delay;
33
34 struct Filter {
35 struct MainConfiguration {
36 size_t length_blocks;
37 float leakage_converged;
38 float leakage_diverged;
39 float error_floor;
40 float noise_gate;
41 };
42
43 struct ShadowConfiguration {
44 size_t length_blocks;
45 float rate;
46 float noise_gate;
47 };
48
49 MainConfiguration main = {13, 0.005f, 0.1f, 0.001f, 20075344.f};
50 ShadowConfiguration shadow = {13, 0.7f, 20075344.f};
51
52 MainConfiguration main_initial = {12, 0.05f, 5.f, 0.001f, 20075344.f};
53 ShadowConfiguration shadow_initial = {12, 0.9f, 20075344.f};
Per Åhgren5f1a31c2018-03-08 15:54:41 +010054
55 size_t config_change_duration_blocks = 250;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010056 } filter;
57
58 struct Erle {
59 float min = 1.f;
Per Åhgren5c532d32018-03-22 00:29:25 +010060 float max_l = 4.f;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010061 float max_h = 1.5f;
62 } erle;
63
64 struct EpStrength {
Per Åhgrenced31ba2018-05-09 11:48:49 +020065 float lf = 1.f;
66 float mf = 1.f;
67 float hf = 1.f;
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020068 float default_len = 0.88f;
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020069 bool reverb_based_on_render = true;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010070 bool echo_can_saturate = true;
71 bool bounded_erl = false;
72 } ep_strength;
73
74 struct Mask {
Per Åhgrenb02644f2018-04-17 11:52:17 +020075 Mask();
76 Mask(const Mask& m);
Gustaf Ullberg0e6375e2018-05-04 11:29:02 +020077 float m0 = 0.1f;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010078 float m1 = 0.01f;
79 float m2 = 0.0001f;
80 float m3 = 0.01f;
Per Åhgrenb02644f2018-04-17 11:52:17 +020081 float m5 = 0.01f;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010082 float m6 = 0.0001f;
83 float m7 = 0.01f;
84 float m8 = 0.0001f;
85 float m9 = 0.1f;
Per Åhgrenb02644f2018-04-17 11:52:17 +020086
87 float gain_curve_offset = 1.45f;
88 float gain_curve_slope = 5.f;
89 float temporal_masking_lf = 0.9f;
90 float temporal_masking_hf = 0.6f;
91 size_t temporal_masking_lf_bands = 3;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010092 } gain_mask;
93
94 struct EchoAudibility {
95 float low_render_limit = 4 * 64.f;
96 float normal_render_limit = 64.f;
Per Åhgrenb02644f2018-04-17 11:52:17 +020097 float floor_power = 2 * 64.f;
98 float audibility_threshold_lf = 10;
99 float audibility_threshold_mf = 10;
100 float audibility_threshold_hf = 10;
Per Åhgren90e3fbd2018-05-16 15:25:04 +0200101 bool use_stationary_properties = true;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100102 } echo_audibility;
103
104 struct RenderLevels {
105 float active_render_limit = 100.f;
106 float poor_excitation_render_limit = 150.f;
Gustaf Ullbergc4b7f032018-06-01 11:22:05 +0200107 float poor_excitation_render_limit_ds8 = 20.f;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100108 } render_levels;
109
110 struct GainUpdates {
111 struct GainChanges {
112 float max_inc;
113 float max_dec;
114 float rate_inc;
115 float rate_dec;
116 float min_inc;
117 float min_dec;
118 };
119
120 GainChanges low_noise = {2.f, 2.f, 1.4f, 1.4f, 1.1f, 1.1f};
121 GainChanges initial = {2.f, 2.f, 1.5f, 1.5f, 1.2f, 1.2f};
122 GainChanges normal = {2.f, 2.f, 1.5f, 1.5f, 1.2f, 1.2f};
123 GainChanges saturation = {1.2f, 1.2f, 1.5f, 1.5f, 1.f, 1.f};
124 GainChanges nonlinear = {1.5f, 1.5f, 1.2f, 1.2f, 1.1f, 1.1f};
125
Gustaf Ullberg0e6375e2018-05-04 11:29:02 +0200126 float max_inc_factor = 2.0f;
127 float max_dec_factor_lf = 0.25f;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100128 float floor_first_increase = 0.00001f;
129 } gain_updates;
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100130
131 struct EchoRemovalControl {
132 struct GainRampup {
Jesús de Vicente Peñadd092872018-05-25 16:55:11 +0200133 float initial_gain = 0.0f;
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100134 float first_non_zero_gain = 0.001f;
135 int non_zero_gain_blocks = 187;
136 int full_gain_blocks = 312;
137 } gain_rampup;
Per Åhgren461cdf02018-02-27 01:59:37 +0100138 bool has_clock_drift = false;
Per Åhgrene3ca9912018-05-28 22:57:17 +0200139 bool linear_and_stable_echo_path = false;
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100140 } echo_removal_control;
Per Åhgren251c7352018-03-28 16:31:57 +0200141
142 struct EchoModel {
Jesús de Vicente Peñadd092872018-05-25 16:55:11 +0200143 EchoModel();
144 EchoModel(const EchoModel& e);
Per Åhgren251c7352018-03-28 16:31:57 +0200145 size_t noise_floor_hold = 50;
146 float min_noise_floor_power = 1638400.f;
147 float stationary_gate_slope = 10.f;
148 float noise_gate_power = 27509.42f;
149 float noise_gate_slope = 0.3f;
150 size_t render_pre_window_size = 1;
Per Åhgren85eef492018-03-28 16:19:47 +0200151 size_t render_post_window_size = 1;
Jesús de Vicente Peñadd092872018-05-25 16:55:11 +0200152 size_t render_pre_window_size_init = 10;
153 size_t render_post_window_size_init = 10;
Per Åhgren85eef492018-03-28 16:19:47 +0200154 float nonlinear_hold = 1;
155 float nonlinear_release = 0.001f;
Per Åhgren251c7352018-03-28 16:31:57 +0200156 } echo_model;
Per Åhgren47d7fbd2018-04-24 12:44:29 +0200157
158 struct Suppressor {
159 size_t bands_with_reliable_coherence = 5;
Gustaf Ullberg8406c432018-06-19 12:31:33 +0200160 size_t nearend_average_blocks = 4;
Gustaf Ullbergec642172018-07-03 13:48:32 +0200161
162 struct MaskingThresholds {
163 float enr_transparent;
164 float enr_suppress;
165 float emr_transparent;
166 };
167 MaskingThresholds mask_lf = {.2f, .3f, .3f};
168 MaskingThresholds mask_hf = {.07f, .1f, .3f};
Per Åhgren47d7fbd2018-04-24 12:44:29 +0200169 } suppressor;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100170};
171} // namespace webrtc
172
173#endif // API_AUDIO_ECHO_CANCELLER3_CONFIG_H_