Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 1 | /* |
| 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 Ullberg | 3646f97 | 2018-02-14 15:19:04 +0100 | [diff] [blame] | 14 | #include <stddef.h> // size_t |
| 15 | |
Mirko Bonadei | 3d25530 | 2018-10-11 10:50:45 +0200 | [diff] [blame] | 16 | #include "rtc_base/system/rtc_export.h" |
| 17 | |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 18 | namespace webrtc { |
| 19 | |
| 20 | // Configuration struct for EchoCanceller3 |
Mirko Bonadei | 3d25530 | 2018-10-11 10:50:45 +0200 | [diff] [blame] | 21 | struct RTC_EXPORT EchoCanceller3Config { |
Sam Zackrisson | 877dc89 | 2018-10-23 14:17:38 +0200 | [diff] [blame] | 22 | // Checks and updates the config parameters to lie within (mostly) reasonable |
Sam Zackrisson | a4c8514 | 2018-10-10 10:44:43 +0200 | [diff] [blame] | 23 | // ranges. Returns true if and only of the config did not need to be changed. |
| 24 | static bool Validate(EchoCanceller3Config* config); |
| 25 | |
Per Åhgren | b6b00dc | 2018-02-20 22:18:27 +0100 | [diff] [blame] | 26 | EchoCanceller3Config(); |
Per Åhgren | 251c735 | 2018-03-28 16:31:57 +0200 | [diff] [blame] | 27 | EchoCanceller3Config(const EchoCanceller3Config& e); |
Artem Titov | 5d3a418 | 2019-12-03 11:13:26 +0100 | [diff] [blame] | 28 | EchoCanceller3Config& operator=(const EchoCanceller3Config& other); |
Gustaf Ullberg | 11539f0 | 2018-10-15 13:40:29 +0200 | [diff] [blame] | 29 | |
| 30 | struct Buffering { |
Gustaf Ullberg | 11539f0 | 2018-10-15 13:40:29 +0200 | [diff] [blame] | 31 | size_t excess_render_detection_interval_blocks = 250; |
| 32 | size_t max_allowed_excess_render_blocks = 8; |
| 33 | } buffering; |
| 34 | |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 35 | struct Delay { |
Per Åhgren | 398689f | 2018-08-23 11:38:27 +0200 | [diff] [blame] | 36 | Delay(); |
| 37 | Delay(const Delay& e); |
Artem Titov | 5d3a418 | 2019-12-03 11:13:26 +0100 | [diff] [blame] | 38 | Delay& operator=(const Delay& e); |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 39 | size_t default_delay = 5; |
Gustaf Ullberg | 2672874 | 2018-06-04 19:04:40 +0200 | [diff] [blame] | 40 | size_t down_sampling_factor = 4; |
Gustaf Ullberg | 11539f0 | 2018-10-15 13:40:29 +0200 | [diff] [blame] | 41 | size_t num_filters = 5; |
Gustaf Ullberg | 9249fbf | 2019-03-14 11:24:54 +0100 | [diff] [blame] | 42 | size_t delay_headroom_samples = 32; |
| 43 | size_t hysteresis_limit_blocks = 1; |
Per Åhgren | 398689f | 2018-08-23 11:38:27 +0200 | [diff] [blame] | 44 | size_t fixed_capture_delay_samples = 0; |
Per Åhgren | 6a4fd19 | 2018-09-07 00:13:03 +0200 | [diff] [blame] | 45 | float delay_estimate_smoothing = 0.7f; |
Gustaf Ullberg | aeb8ce8 | 2021-05-19 14:26:31 +0200 | [diff] [blame] | 46 | float delay_estimate_smoothing_delay_found = 0.7f; |
Per Åhgren | 6a4fd19 | 2018-09-07 00:13:03 +0200 | [diff] [blame] | 47 | float delay_candidate_detection_threshold = 0.2f; |
| 48 | struct DelaySelectionThresholds { |
| 49 | int initial; |
| 50 | int converged; |
Per Åhgren | 8b7d206 | 2018-10-30 23:44:40 +0100 | [diff] [blame] | 51 | } delay_selection_thresholds = {5, 20}; |
Gustaf Ullberg | 8f32b6c | 2019-04-05 16:23:50 +0200 | [diff] [blame] | 52 | bool use_external_delay_estimator = false; |
Sam Zackrisson | ffc8452 | 2019-10-15 13:43:02 +0200 | [diff] [blame] | 53 | bool log_warning_on_delay_changes = false; |
Per Åhgren | 6a05bb1 | 2019-12-03 11:24:59 +0100 | [diff] [blame] | 54 | struct AlignmentMixing { |
| 55 | bool downmix; |
| 56 | bool adaptive_selection; |
| 57 | float activity_power_threshold; |
| 58 | bool prefer_first_two_channels; |
| 59 | }; |
| 60 | AlignmentMixing render_alignment_mixing = {false, true, 10000.f, true}; |
| 61 | AlignmentMixing capture_alignment_mixing = {false, true, 10000.f, false}; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 62 | } delay; |
| 63 | |
| 64 | struct Filter { |
Per Åhgren | ff04511 | 2020-03-20 11:20:39 +0100 | [diff] [blame] | 65 | struct RefinedConfiguration { |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 66 | size_t length_blocks; |
| 67 | float leakage_converged; |
| 68 | float leakage_diverged; |
| 69 | float error_floor; |
Gustaf Ullberg | 040f87f | 2018-10-09 15:02:39 +0200 | [diff] [blame] | 70 | float error_ceil; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 71 | float noise_gate; |
| 72 | }; |
| 73 | |
Per Åhgren | 9d66198 | 2020-03-20 11:26:48 +0100 | [diff] [blame] | 74 | struct CoarseConfiguration { |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 75 | size_t length_blocks; |
| 76 | float rate; |
| 77 | float noise_gate; |
| 78 | }; |
| 79 | |
Per Åhgren | ff04511 | 2020-03-20 11:20:39 +0100 | [diff] [blame] | 80 | RefinedConfiguration refined = {13, 0.00005f, 0.05f, |
| 81 | 0.001f, 2.f, 20075344.f}; |
Per Åhgren | 9d66198 | 2020-03-20 11:26:48 +0100 | [diff] [blame] | 82 | CoarseConfiguration coarse = {13, 0.7f, 20075344.f}; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 83 | |
Per Åhgren | ff04511 | 2020-03-20 11:20:39 +0100 | [diff] [blame] | 84 | RefinedConfiguration refined_initial = {12, 0.005f, 0.5f, |
| 85 | 0.001f, 2.f, 20075344.f}; |
Per Åhgren | 9d66198 | 2020-03-20 11:26:48 +0100 | [diff] [blame] | 86 | CoarseConfiguration coarse_initial = {12, 0.9f, 20075344.f}; |
Per Åhgren | 5f1a31c | 2018-03-08 15:54:41 +0100 | [diff] [blame] | 87 | |
| 88 | size_t config_change_duration_blocks = 250; |
Per Åhgren | c3da671 | 2018-08-17 00:09:15 +0200 | [diff] [blame] | 89 | float initial_state_seconds = 2.5f; |
Gustaf Ullberg | 992a96f | 2020-12-08 13:03:55 +0100 | [diff] [blame] | 90 | int coarse_reset_hangover_blocks = 25; |
Jesús de Vicente Peña | 8459b17 | 2018-08-21 16:09:49 +0200 | [diff] [blame] | 91 | bool conservative_initial_phase = false; |
Per Åhgren | 9d66198 | 2020-03-20 11:26:48 +0100 | [diff] [blame] | 92 | bool enable_coarse_filter_output_usage = true; |
Gustaf Ullberg | 52caa0e | 2019-04-11 14:43:17 +0200 | [diff] [blame] | 93 | bool use_linear_filter = true; |
Gustaf Ullberg | 09226fc | 2021-02-19 13:03:14 +0100 | [diff] [blame] | 94 | bool high_pass_filter_echo_reference = false; |
Per Åhgren | c20a19c | 2019-11-13 11:12:29 +0100 | [diff] [blame] | 95 | bool export_linear_aec_output = false; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 96 | } filter; |
| 97 | |
| 98 | struct Erle { |
| 99 | float min = 1.f; |
Per Åhgren | 5c532d3 | 2018-03-22 00:29:25 +0100 | [diff] [blame] | 100 | float max_l = 4.f; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 101 | float max_h = 1.5f; |
Jesús de Vicente Peña | a687812 | 2018-08-28 14:27:45 +0200 | [diff] [blame] | 102 | bool onset_detection = true; |
Jesús de Vicente Peña | 44974e1 | 2018-11-20 12:54:23 +0100 | [diff] [blame] | 103 | size_t num_sections = 1; |
Per Åhgren | 8be669f | 2019-10-11 23:02:26 +0200 | [diff] [blame] | 104 | bool clamp_quality_estimate_to_zero = true; |
| 105 | bool clamp_quality_estimate_to_one = true; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 106 | } erle; |
| 107 | |
| 108 | struct EpStrength { |
Per Åhgren | e8efbbd | 2019-03-14 11:29:39 +0100 | [diff] [blame] | 109 | float default_gain = 1.f; |
Per Åhgren | 7004571 | 2018-10-09 01:11:15 +0200 | [diff] [blame] | 110 | float default_len = 0.83f; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 111 | bool echo_can_saturate = true; |
| 112 | bool bounded_erl = false; |
Gustaf Ullberg | 437d129 | 2021-04-20 13:48:57 +0200 | [diff] [blame] | 113 | bool erle_onset_compensation_in_dominant_nearend = false; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 114 | } ep_strength; |
| 115 | |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 116 | struct EchoAudibility { |
| 117 | float low_render_limit = 4 * 64.f; |
| 118 | float normal_render_limit = 64.f; |
Per Åhgren | b02644f | 2018-04-17 11:52:17 +0200 | [diff] [blame] | 119 | float floor_power = 2 * 64.f; |
| 120 | float audibility_threshold_lf = 10; |
| 121 | float audibility_threshold_mf = 10; |
| 122 | float audibility_threshold_hf = 10; |
Jesús de Vicente Peña | 70a5963 | 2019-04-16 12:32:15 +0200 | [diff] [blame] | 123 | bool use_stationarity_properties = false; |
Per Åhgren | 1724a80 | 2018-11-14 16:01:45 +0100 | [diff] [blame] | 124 | bool use_stationarity_properties_at_init = false; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 125 | } echo_audibility; |
| 126 | |
| 127 | struct RenderLevels { |
| 128 | float active_render_limit = 100.f; |
| 129 | float poor_excitation_render_limit = 150.f; |
Gustaf Ullberg | c4b7f03 | 2018-06-01 11:22:05 +0200 | [diff] [blame] | 130 | float poor_excitation_render_limit_ds8 = 20.f; |
Per Åhgren | ae40e19 | 2019-10-29 22:54:05 +0100 | [diff] [blame] | 131 | float render_power_gain_db = 0.f; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 132 | } render_levels; |
| 133 | |
Per Åhgren | b6b00dc | 2018-02-20 22:18:27 +0100 | [diff] [blame] | 134 | struct EchoRemovalControl { |
Per Åhgren | 461cdf0 | 2018-02-27 01:59:37 +0100 | [diff] [blame] | 135 | bool has_clock_drift = false; |
Per Åhgren | e3ca991 | 2018-05-28 22:57:17 +0200 | [diff] [blame] | 136 | bool linear_and_stable_echo_path = false; |
Per Åhgren | b6b00dc | 2018-02-20 22:18:27 +0100 | [diff] [blame] | 137 | } echo_removal_control; |
Per Åhgren | 251c735 | 2018-03-28 16:31:57 +0200 | [diff] [blame] | 138 | |
| 139 | struct EchoModel { |
Jesús de Vicente Peña | dd09287 | 2018-05-25 16:55:11 +0200 | [diff] [blame] | 140 | EchoModel(); |
| 141 | EchoModel(const EchoModel& e); |
Artem Titov | 5d3a418 | 2019-12-03 11:13:26 +0100 | [diff] [blame] | 142 | EchoModel& operator=(const EchoModel& e); |
Per Åhgren | 251c735 | 2018-03-28 16:31:57 +0200 | [diff] [blame] | 143 | size_t noise_floor_hold = 50; |
| 144 | float min_noise_floor_power = 1638400.f; |
| 145 | float stationary_gate_slope = 10.f; |
| 146 | float noise_gate_power = 27509.42f; |
| 147 | float noise_gate_slope = 0.3f; |
| 148 | size_t render_pre_window_size = 1; |
Per Åhgren | 85eef49 | 2018-03-28 16:19:47 +0200 | [diff] [blame] | 149 | size_t render_post_window_size = 1; |
Sam Zackrisson | 389bf0f | 2020-10-02 21:13:13 +0200 | [diff] [blame] | 150 | bool model_reverb_in_nonlinear_mode = true; |
Per Åhgren | 251c735 | 2018-03-28 16:31:57 +0200 | [diff] [blame] | 151 | } echo_model; |
Per Åhgren | 47d7fbd | 2018-04-24 12:44:29 +0200 | [diff] [blame] | 152 | |
Per Åhgren | a388b75 | 2020-03-25 07:31:47 +0100 | [diff] [blame] | 153 | struct ComfortNoise { |
| 154 | float noise_floor_dbfs = -96.03406f; |
| 155 | } comfort_noise; |
| 156 | |
Per Åhgren | 47d7fbd | 2018-04-24 12:44:29 +0200 | [diff] [blame] | 157 | struct Suppressor { |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 158 | Suppressor(); |
| 159 | Suppressor(const Suppressor& e); |
Artem Titov | 5d3a418 | 2019-12-03 11:13:26 +0100 | [diff] [blame] | 160 | Suppressor& operator=(const Suppressor& e); |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 161 | |
Gustaf Ullberg | 8406c43 | 2018-06-19 12:31:33 +0200 | [diff] [blame] | 162 | size_t nearend_average_blocks = 4; |
Gustaf Ullberg | ec64217 | 2018-07-03 13:48:32 +0200 | [diff] [blame] | 163 | |
| 164 | struct MaskingThresholds { |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 165 | MaskingThresholds(float enr_transparent, |
| 166 | float enr_suppress, |
| 167 | float emr_transparent); |
| 168 | MaskingThresholds(const MaskingThresholds& e); |
Artem Titov | 5d3a418 | 2019-12-03 11:13:26 +0100 | [diff] [blame] | 169 | MaskingThresholds& operator=(const MaskingThresholds& e); |
Gustaf Ullberg | ec64217 | 2018-07-03 13:48:32 +0200 | [diff] [blame] | 170 | float enr_transparent; |
| 171 | float enr_suppress; |
| 172 | float emr_transparent; |
| 173 | }; |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 174 | |
| 175 | struct Tuning { |
| 176 | Tuning(MaskingThresholds mask_lf, |
| 177 | MaskingThresholds mask_hf, |
| 178 | float max_inc_factor, |
| 179 | float max_dec_factor_lf); |
| 180 | Tuning(const Tuning& e); |
Artem Titov | 5d3a418 | 2019-12-03 11:13:26 +0100 | [diff] [blame] | 181 | Tuning& operator=(const Tuning& e); |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 182 | MaskingThresholds mask_lf; |
| 183 | MaskingThresholds mask_hf; |
| 184 | float max_inc_factor; |
| 185 | float max_dec_factor_lf; |
| 186 | }; |
| 187 | |
Per Åhgren | 0d8c100 | 2018-10-10 00:25:16 +0200 | [diff] [blame] | 188 | Tuning normal_tuning = Tuning(MaskingThresholds(.3f, .4f, .3f), |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 189 | MaskingThresholds(.07f, .1f, .3f), |
| 190 | 2.0f, |
| 191 | 0.25f); |
Per Åhgren | 13d392d | 2018-10-09 23:33:00 +0200 | [diff] [blame] | 192 | Tuning nearend_tuning = Tuning(MaskingThresholds(1.09f, 1.1f, .3f), |
| 193 | MaskingThresholds(.1f, .3f, .3f), |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 194 | 2.0f, |
| 195 | 0.25f); |
| 196 | |
Per Åhgren | cbdbb8c | 2021-05-07 23:17:28 +0000 | [diff] [blame] | 197 | bool lf_smoothing_during_initial_phase = true; |
| 198 | int last_permanent_lf_smoothing_band = 0; |
| 199 | int last_lf_smoothing_band = 5; |
| 200 | int last_lf_band = 5; |
| 201 | int first_hf_band = 8; |
| 202 | |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 203 | struct DominantNearendDetection { |
Gustaf Ullberg | de10eea | 2018-11-28 09:44:50 +0100 | [diff] [blame] | 204 | float enr_threshold = .25f; |
| 205 | float enr_exit_threshold = 10.f; |
Gustaf Ullberg | c9f9b87 | 2018-10-22 15:15:36 +0200 | [diff] [blame] | 206 | float snr_threshold = 30.f; |
| 207 | int hold_duration = 50; |
| 208 | int trigger_threshold = 12; |
Per Åhgren | 700b4a4 | 2018-10-23 21:21:37 +0200 | [diff] [blame] | 209 | bool use_during_initial_phase = true; |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 210 | } dominant_nearend_detection; |
| 211 | |
Gustaf Ullberg | f534a64 | 2019-11-25 16:13:58 +0100 | [diff] [blame] | 212 | struct SubbandNearendDetection { |
| 213 | size_t nearend_average_blocks = 1; |
| 214 | struct SubbandRegion { |
| 215 | size_t low; |
| 216 | size_t high; |
| 217 | }; |
| 218 | SubbandRegion subband1 = {1, 1}; |
| 219 | SubbandRegion subband2 = {1, 1}; |
| 220 | float nearend_threshold = 1.f; |
| 221 | float snr_threshold = 1.f; |
| 222 | } subband_nearend_detection; |
| 223 | |
| 224 | bool use_subband_nearend_detection = false; |
| 225 | |
Per Åhgren | fde4aa9 | 2018-08-27 14:19:35 +0200 | [diff] [blame] | 226 | struct HighBandsSuppression { |
| 227 | float enr_threshold = 1.f; |
| 228 | float max_gain_during_echo = 1.f; |
Per Åhgren | f9f5331 | 2020-10-04 00:39:49 +0200 | [diff] [blame] | 229 | float anti_howling_activation_threshold = 400.f; |
| 230 | float anti_howling_gain = 1.f; |
Per Åhgren | fde4aa9 | 2018-08-27 14:19:35 +0200 | [diff] [blame] | 231 | } high_bands_suppression; |
| 232 | |
Per Åhgren | 524e878 | 2018-08-24 22:48:49 +0200 | [diff] [blame] | 233 | float floor_first_increase = 0.00001f; |
Gustaf Ullberg | 7e4ad82 | 2020-10-22 14:36:37 +0200 | [diff] [blame] | 234 | bool conservative_hf_suppression = false; |
Per Åhgren | 47d7fbd | 2018-04-24 12:44:29 +0200 | [diff] [blame] | 235 | } suppressor; |
Gustaf Ullberg | bffa300 | 2018-02-14 15:12:00 +0100 | [diff] [blame] | 236 | }; |
| 237 | } // namespace webrtc |
| 238 | |
| 239 | #endif // API_AUDIO_ECHO_CANCELLER3_CONFIG_H_ |