blob: ffe17f2b8b5d74f200899a9c17d24905b9bcfa9c [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
Mirko Bonadei3d255302018-10-11 10:50:45 +020016#include "rtc_base/system/rtc_export.h"
17
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010018namespace webrtc {
19
20// Configuration struct for EchoCanceller3
Mirko Bonadei3d255302018-10-11 10:50:45 +020021struct RTC_EXPORT EchoCanceller3Config {
Sam Zackrisson877dc892018-10-23 14:17:38 +020022 // Checks and updates the config parameters to lie within (mostly) reasonable
Sam Zackrissona4c85142018-10-10 10:44:43 +020023 // ranges. Returns true if and only of the config did not need to be changed.
24 static bool Validate(EchoCanceller3Config* config);
25
Per Åhgrenb6b00dc2018-02-20 22:18:27 +010026 EchoCanceller3Config();
Per Åhgren251c7352018-03-28 16:31:57 +020027 EchoCanceller3Config(const EchoCanceller3Config& e);
Gustaf Ullberg11539f02018-10-15 13:40:29 +020028
29 struct Buffering {
30 bool use_new_render_buffering = true;
31 size_t excess_render_detection_interval_blocks = 250;
32 size_t max_allowed_excess_render_blocks = 8;
33 } buffering;
34
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010035 struct Delay {
Per Åhgren398689f2018-08-23 11:38:27 +020036 Delay();
37 Delay(const Delay& e);
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010038 size_t default_delay = 5;
Gustaf Ullberg26728742018-06-04 19:04:40 +020039 size_t down_sampling_factor = 4;
Gustaf Ullberg11539f02018-10-15 13:40:29 +020040 size_t num_filters = 5;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010041 size_t api_call_jitter_blocks = 26;
42 size_t min_echo_path_delay_blocks = 0;
43 size_t delay_headroom_blocks = 2;
44 size_t hysteresis_limit_1_blocks = 1;
45 size_t hysteresis_limit_2_blocks = 1;
Per Åhgren2d9a3b12018-05-17 17:24:29 +020046 size_t skew_hysteresis_blocks = 3;
Per Åhgren398689f2018-08-23 11:38:27 +020047 size_t fixed_capture_delay_samples = 0;
Per Åhgren6a4fd192018-09-07 00:13:03 +020048 float delay_estimate_smoothing = 0.7f;
49 float delay_candidate_detection_threshold = 0.2f;
50 struct DelaySelectionThresholds {
51 int initial;
52 int converged;
Per Åhgren8b7d2062018-10-30 23:44:40 +010053 } delay_selection_thresholds = {5, 20};
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010054 } delay;
55
56 struct Filter {
57 struct MainConfiguration {
58 size_t length_blocks;
59 float leakage_converged;
60 float leakage_diverged;
61 float error_floor;
Gustaf Ullberg040f87f2018-10-09 15:02:39 +020062 float error_ceil;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010063 float noise_gate;
64 };
65
66 struct ShadowConfiguration {
67 size_t length_blocks;
68 float rate;
69 float noise_gate;
70 };
71
Gustaf Ullberg040f87f2018-10-09 15:02:39 +020072 MainConfiguration main = {13, 0.00005f, 0.05f, 0.001f, 2.f, 20075344.f};
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010073 ShadowConfiguration shadow = {13, 0.7f, 20075344.f};
74
Gustaf Ullberg040f87f2018-10-09 15:02:39 +020075 MainConfiguration main_initial = {12, 0.005f, 0.5f,
76 0.001f, 2.f, 20075344.f};
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010077 ShadowConfiguration shadow_initial = {12, 0.9f, 20075344.f};
Per Åhgren5f1a31c2018-03-08 15:54:41 +010078
79 size_t config_change_duration_blocks = 250;
Per Åhgrenc3da6712018-08-17 00:09:15 +020080 float initial_state_seconds = 2.5f;
Jesús de Vicente Peña8459b172018-08-21 16:09:49 +020081 bool conservative_initial_phase = false;
Per Åhgren24021542018-08-31 07:34:29 +020082 bool enable_shadow_filter_output_usage = true;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010083 } filter;
84
85 struct Erle {
86 float min = 1.f;
Per Åhgren5c532d32018-03-22 00:29:25 +010087 float max_l = 4.f;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010088 float max_h = 1.5f;
Jesús de Vicente Peñaa6878122018-08-28 14:27:45 +020089 bool onset_detection = true;
Jesús de Vicente Peña44974e12018-11-20 12:54:23 +010090 size_t num_sections = 1;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010091 } erle;
92
93 struct EpStrength {
Per Åhgrenced31ba2018-05-09 11:48:49 +020094 float lf = 1.f;
95 float mf = 1.f;
96 float hf = 1.f;
Per Åhgren70045712018-10-09 01:11:15 +020097 float default_len = 0.83f;
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020098 bool reverb_based_on_render = true;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +010099 bool echo_can_saturate = true;
100 bool bounded_erl = false;
101 } ep_strength;
102
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100103 struct EchoAudibility {
104 float low_render_limit = 4 * 64.f;
105 float normal_render_limit = 64.f;
Per Åhgrenb02644f2018-04-17 11:52:17 +0200106 float floor_power = 2 * 64.f;
107 float audibility_threshold_lf = 10;
108 float audibility_threshold_mf = 10;
109 float audibility_threshold_hf = 10;
Per Åhgren1724a802018-11-14 16:01:45 +0100110 bool use_stationary_properties = false;
111 bool use_stationarity_properties_at_init = false;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100112 } echo_audibility;
113
114 struct RenderLevels {
115 float active_render_limit = 100.f;
116 float poor_excitation_render_limit = 150.f;
Gustaf Ullbergc4b7f032018-06-01 11:22:05 +0200117 float poor_excitation_render_limit_ds8 = 20.f;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100118 } render_levels;
119
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100120 struct EchoRemovalControl {
121 struct GainRampup {
Jesús de Vicente Peñadd092872018-05-25 16:55:11 +0200122 float initial_gain = 0.0f;
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100123 float first_non_zero_gain = 0.001f;
124 int non_zero_gain_blocks = 187;
125 int full_gain_blocks = 312;
126 } gain_rampup;
Per Åhgren461cdf02018-02-27 01:59:37 +0100127 bool has_clock_drift = false;
Per Åhgrene3ca9912018-05-28 22:57:17 +0200128 bool linear_and_stable_echo_path = false;
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100129 } echo_removal_control;
Per Åhgren251c7352018-03-28 16:31:57 +0200130
131 struct EchoModel {
Jesús de Vicente Peñadd092872018-05-25 16:55:11 +0200132 EchoModel();
133 EchoModel(const EchoModel& e);
Per Åhgren251c7352018-03-28 16:31:57 +0200134 size_t noise_floor_hold = 50;
135 float min_noise_floor_power = 1638400.f;
136 float stationary_gate_slope = 10.f;
137 float noise_gate_power = 27509.42f;
138 float noise_gate_slope = 0.3f;
139 size_t render_pre_window_size = 1;
Per Åhgren85eef492018-03-28 16:19:47 +0200140 size_t render_post_window_size = 1;
Jesús de Vicente Peñadd092872018-05-25 16:55:11 +0200141 size_t render_pre_window_size_init = 10;
142 size_t render_post_window_size_init = 10;
Per Åhgren85eef492018-03-28 16:19:47 +0200143 float nonlinear_hold = 1;
144 float nonlinear_release = 0.001f;
Per Åhgren251c7352018-03-28 16:31:57 +0200145 } echo_model;
Per Åhgren47d7fbd2018-04-24 12:44:29 +0200146
147 struct Suppressor {
Per Åhgren524e8782018-08-24 22:48:49 +0200148 Suppressor();
149 Suppressor(const Suppressor& e);
150
Gustaf Ullberg8406c432018-06-19 12:31:33 +0200151 size_t nearend_average_blocks = 4;
Gustaf Ullbergec642172018-07-03 13:48:32 +0200152
153 struct MaskingThresholds {
Per Åhgren524e8782018-08-24 22:48:49 +0200154 MaskingThresholds(float enr_transparent,
155 float enr_suppress,
156 float emr_transparent);
157 MaskingThresholds(const MaskingThresholds& e);
Gustaf Ullbergec642172018-07-03 13:48:32 +0200158 float enr_transparent;
159 float enr_suppress;
160 float emr_transparent;
161 };
Per Åhgren524e8782018-08-24 22:48:49 +0200162
163 struct Tuning {
164 Tuning(MaskingThresholds mask_lf,
165 MaskingThresholds mask_hf,
166 float max_inc_factor,
167 float max_dec_factor_lf);
168 Tuning(const Tuning& e);
169 MaskingThresholds mask_lf;
170 MaskingThresholds mask_hf;
171 float max_inc_factor;
172 float max_dec_factor_lf;
173 };
174
Per Åhgren0d8c1002018-10-10 00:25:16 +0200175 Tuning normal_tuning = Tuning(MaskingThresholds(.3f, .4f, .3f),
Per Åhgren524e8782018-08-24 22:48:49 +0200176 MaskingThresholds(.07f, .1f, .3f),
177 2.0f,
178 0.25f);
Per Åhgren13d392d2018-10-09 23:33:00 +0200179 Tuning nearend_tuning = Tuning(MaskingThresholds(1.09f, 1.1f, .3f),
180 MaskingThresholds(.1f, .3f, .3f),
Per Åhgren524e8782018-08-24 22:48:49 +0200181 2.0f,
182 0.25f);
183
184 struct DominantNearendDetection {
Gustaf Ullbergde10eea2018-11-28 09:44:50 +0100185 float enr_threshold = .25f;
186 float enr_exit_threshold = 10.f;
Gustaf Ullbergc9f9b872018-10-22 15:15:36 +0200187 float snr_threshold = 30.f;
188 int hold_duration = 50;
189 int trigger_threshold = 12;
Per Åhgren700b4a42018-10-23 21:21:37 +0200190 bool use_during_initial_phase = true;
Per Åhgren524e8782018-08-24 22:48:49 +0200191 } dominant_nearend_detection;
192
Per Åhgrenfde4aa92018-08-27 14:19:35 +0200193 struct HighBandsSuppression {
194 float enr_threshold = 1.f;
195 float max_gain_during_echo = 1.f;
196 } high_bands_suppression;
197
Per Åhgren524e8782018-08-24 22:48:49 +0200198 float floor_first_increase = 0.00001f;
Per Åhgren7343f562018-08-17 10:08:34 +0200199 bool enforce_transparent = false;
200 bool enforce_empty_higher_bands = false;
Per Åhgren47d7fbd2018-04-24 12:44:29 +0200201 } suppressor;
Gustaf Ullbergbffa3002018-02-14 15:12:00 +0100202};
203} // namespace webrtc
204
205#endif // API_AUDIO_ECHO_CANCELLER3_CONFIG_H_