blob: 0ca248fc75431ea63377c24ed693c6bec6b907e6 [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
13#include <math.h>
14
15#include <algorithm>
16#include <functional>
17
18#include "api/array_view.h"
19#include "modules/audio_processing/aec3/aec3_common.h"
20
21namespace webrtc {
22
23ReverbModel::ReverbModel() {
24 Reset();
25}
26
27ReverbModel::~ReverbModel() = default;
28
29void ReverbModel::Reset() {
30 reverb_.fill(0.);
31}
32
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020033void ReverbModel::AddReverbNoFreqShaping(
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020034 rtc::ArrayView<const float> power_spectrum,
35 float power_spectrum_scaling,
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020036 float reverb_decay,
37 rtc::ArrayView<float> reverb_power_spectrum) {
38 UpdateReverbContributionsNoFreqShaping(power_spectrum, power_spectrum_scaling,
39 reverb_decay);
40
41 // Add the power of the echo reverb to the residual echo power.
42 std::transform(reverb_power_spectrum.begin(), reverb_power_spectrum.end(),
43 reverb_.begin(), reverb_power_spectrum.begin(),
44 std::plus<float>());
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020045}
46
47void ReverbModel::AddReverb(rtc::ArrayView<const float> power_spectrum,
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020048 rtc::ArrayView<const float> power_spectrum_scaling,
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020049 float reverb_decay,
50 rtc::ArrayView<float> reverb_power_spectrum) {
51 UpdateReverbContributions(power_spectrum, power_spectrum_scaling,
52 reverb_decay);
53
54 // Add the power of the echo reverb to the residual echo power.
55 std::transform(reverb_power_spectrum.begin(), reverb_power_spectrum.end(),
56 reverb_.begin(), reverb_power_spectrum.begin(),
57 std::plus<float>());
58}
59
Jesús de Vicente Peñae58bd8a2018-06-26 17:19:15 +020060void ReverbModel::UpdateReverbContributionsNoFreqShaping(
61 rtc::ArrayView<const float> power_spectrum,
62 float power_spectrum_scaling,
63 float reverb_decay) {
64 if (reverb_decay > 0) {
65 // Update the estimate of the reverberant power.
66 for (size_t k = 0; k < power_spectrum.size(); ++k) {
67 reverb_[k] = (reverb_[k] + power_spectrum[k] * power_spectrum_scaling) *
68 reverb_decay;
69 }
70 }
71}
72
73void ReverbModel::UpdateReverbContributions(
74 rtc::ArrayView<const float>& power_spectrum,
75 rtc::ArrayView<const float>& power_spectrum_scaling,
76 float reverb_decay) {
77 if (reverb_decay > 0) {
78 // Update the estimate of the reverberant power.
79 for (size_t k = 0; k < power_spectrum.size(); ++k) {
80 reverb_[k] =
81 (reverb_[k] + power_spectrum[k] * power_spectrum_scaling[k]) *
82 reverb_decay;
83 }
84 }
85}
86
Jesús de Vicente Peña075cb2b2018-06-13 15:13:55 +020087} // namespace webrtc