blob: f0a24c0249823485d997361b7566db1926363444 [file] [log] [blame]
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +02001/*
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#include "modules/audio_processing/aec3/reverb_model.h"
12
Yves Gerey988cc082018-10-23 12:03:01 +020013#include <stddef.h>
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020014#include <algorithm>
15#include <functional>
16
17#include "api/array_view.h"
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020018
19namespace webrtc {
20
21ReverbModel::ReverbModel() {
22 Reset();
23}
24
25ReverbModel::~ReverbModel() = default;
26
27void ReverbModel::Reset() {
28 reverb_.fill(0.);
29}
30
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020031void ReverbModel::AddReverbNoFreqShaping(
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020032 rtc::ArrayView<const float> power_spectrum,
33 float power_spectrum_scaling,
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020034 float reverb_decay,
35 rtc::ArrayView<float> reverb_power_spectrum) {
36 UpdateReverbContributionsNoFreqShaping(power_spectrum, power_spectrum_scaling,
37 reverb_decay);
38
39 // Add the power of the echo reverb to the residual echo power.
40 std::transform(reverb_power_spectrum.begin(), reverb_power_spectrum.end(),
41 reverb_.begin(), reverb_power_spectrum.begin(),
42 std::plus<float>());
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020043}
44
45void ReverbModel::AddReverb(rtc::ArrayView<const float> power_spectrum,
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020046 rtc::ArrayView<const float> power_spectrum_scaling,
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020047 float reverb_decay,
48 rtc::ArrayView<float> reverb_power_spectrum) {
49 UpdateReverbContributions(power_spectrum, power_spectrum_scaling,
50 reverb_decay);
51
52 // Add the power of the echo reverb to the residual echo power.
53 std::transform(reverb_power_spectrum.begin(), reverb_power_spectrum.end(),
54 reverb_.begin(), reverb_power_spectrum.begin(),
55 std::plus<float>());
56}
57
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020058void ReverbModel::UpdateReverbContributionsNoFreqShaping(
59 rtc::ArrayView<const float> power_spectrum,
60 float power_spectrum_scaling,
61 float reverb_decay) {
62 if (reverb_decay > 0) {
63 // Update the estimate of the reverberant power.
64 for (size_t k = 0; k < power_spectrum.size(); ++k) {
65 reverb_[k] = (reverb_[k] + power_spectrum[k] * power_spectrum_scaling) *
66 reverb_decay;
67 }
68 }
69}
70
71void ReverbModel::UpdateReverbContributions(
72 rtc::ArrayView<const float>& power_spectrum,
73 rtc::ArrayView<const float>& power_spectrum_scaling,
74 float reverb_decay) {
75 if (reverb_decay > 0) {
76 // Update the estimate of the reverberant power.
77 for (size_t k = 0; k < power_spectrum.size(); ++k) {
78 reverb_[k] =
79 (reverb_[k] + power_spectrum[k] * power_spectrum_scaling[k]) *
80 reverb_decay;
81 }
82 }
83}
84
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020085} // namespace webrtc