AEC3: Remove redundant class
This CL removes the redundant class in preparation
for adding multichannel functionality to the
reverb computation.
The changes are bitexact.
Bug: webrtc:10913
Change-Id: I284665f7143cb5e1c79bfa573638fdff5f2411c9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/155960
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29414}
diff --git a/modules/audio_processing/aec3/BUILD.gn b/modules/audio_processing/aec3/BUILD.gn
index 6baf3a1..a9026f8 100644
--- a/modules/audio_processing/aec3/BUILD.gn
+++ b/modules/audio_processing/aec3/BUILD.gn
@@ -84,8 +84,6 @@
"render_delay_controller.h",
"render_delay_controller_metrics.cc",
"render_delay_controller_metrics.h",
- "render_reverb_model.cc",
- "render_reverb_model.h",
"render_signal_analyzer.cc",
"render_signal_analyzer.h",
"residual_echo_estimator.cc",
diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc
index f0e183a..bd6710a 100644
--- a/modules/audio_processing/aec3/aec_state.cc
+++ b/modules/audio_processing/aec3/aec_state.cc
@@ -29,6 +29,56 @@
constexpr size_t kBlocksSinceConvergencedFilterInit = 10000;
constexpr size_t kBlocksSinceConsistentEstimateInit = 10000;
+void UpdateAndComputeReverb(
+ const SpectrumBuffer& spectrum_buffer,
+ int delay_blocks,
+ float reverb_decay,
+ ReverbModel* reverb_model,
+ rtc::ArrayView<float, kFftLengthBy2Plus1> reverb_power_spectrum) {
+ RTC_DCHECK(reverb_model);
+ const size_t num_render_channels = spectrum_buffer.buffer[0].size();
+ int idx_at_delay =
+ spectrum_buffer.OffsetIndex(spectrum_buffer.read, delay_blocks);
+ int idx_past = spectrum_buffer.IncIndex(idx_at_delay);
+
+ std::array<float, kFftLengthBy2Plus1> X2_data;
+ rtc::ArrayView<const float> X2;
+ if (num_render_channels > 1) {
+ auto sum_channels =
+ [](size_t num_render_channels,
+ const std::vector<std::vector<float>>& spectrum_band_0,
+ rtc::ArrayView<float, kFftLengthBy2Plus1> render_power) {
+ std::fill(render_power.begin(), render_power.end(), 0.f);
+ for (size_t ch = 0; ch < num_render_channels; ++ch) {
+ RTC_DCHECK_EQ(spectrum_band_0[ch].size(), kFftLengthBy2Plus1);
+ for (size_t k = 0; k < kFftLengthBy2Plus1; ++k) {
+ render_power[k] += spectrum_band_0[ch][k];
+ }
+ }
+ };
+ sum_channels(num_render_channels, spectrum_buffer.buffer[idx_past],
+ X2_data);
+ reverb_model->UpdateReverbNoFreqShaping(
+ X2_data, /*power_spectrum_scaling=*/1.0f, reverb_decay);
+
+ sum_channels(num_render_channels, spectrum_buffer.buffer[idx_at_delay],
+ X2_data);
+ X2 = X2_data;
+ } else {
+ reverb_model->UpdateReverbNoFreqShaping(
+ spectrum_buffer.buffer[idx_past][/*channel=*/0],
+ /*power_spectrum_scaling=*/1.0f, reverb_decay);
+
+ X2 = spectrum_buffer.buffer[idx_at_delay][/*channel=*/0];
+ }
+
+ rtc::ArrayView<const float, kFftLengthBy2Plus1> reverb_power =
+ reverb_model->reverb();
+ for (size_t k = 0; k < X2.size(); ++k) {
+ reverb_power_spectrum[k] = X2[k] + reverb_power[k];
+ }
+}
+
} // namespace
int AecState::instance_count_ = 0;
@@ -171,14 +221,14 @@
active_render && !SaturatedCapture() ? 1 : 0;
std::array<float, kFftLengthBy2Plus1> X2_reverb;
- render_reverb_.Apply(render_buffer.GetSpectrumBuffer(),
- delay_state_.DirectPathFilterDelay(), ReverbDecay(),
- X2_reverb);
+
+ UpdateAndComputeReverb(render_buffer.GetSpectrumBuffer(),
+ delay_state_.DirectPathFilterDelay(), ReverbDecay(),
+ &reverb_model_, X2_reverb);
if (config_.echo_audibility.use_stationarity_properties) {
// Update the echo audibility evaluator.
- echo_audibility_.Update(render_buffer,
- render_reverb_.GetReverbContributionPowerSpectrum(),
+ echo_audibility_.Update(render_buffer, reverb_model_.reverb(),
delay_state_.DirectPathFilterDelay(),
delay_state_.ExternalDelayReported());
}
diff --git a/modules/audio_processing/aec3/aec_state.h b/modules/audio_processing/aec3/aec_state.h
index 500822d..69cdafd 100644
--- a/modules/audio_processing/aec3/aec_state.h
+++ b/modules/audio_processing/aec3/aec_state.h
@@ -28,7 +28,6 @@
#include "modules/audio_processing/aec3/erle_estimator.h"
#include "modules/audio_processing/aec3/filter_analyzer.h"
#include "modules/audio_processing/aec3/render_buffer.h"
-#include "modules/audio_processing/aec3/render_reverb_model.h"
#include "modules/audio_processing/aec3/reverb_model_estimator.h"
#include "modules/audio_processing/aec3/subtractor_output.h"
#include "modules/audio_processing/aec3/subtractor_output_analyzer.h"
@@ -294,7 +293,7 @@
absl::optional<DelayEstimate> external_delay_;
EchoAudibility echo_audibility_;
ReverbModelEstimator reverb_model_estimator_;
- RenderReverbModel render_reverb_;
+ ReverbModel reverb_model_;
std::vector<SubtractorOutputAnalyzer> subtractor_output_analyzers_;
};
diff --git a/modules/audio_processing/aec3/render_reverb_model.cc b/modules/audio_processing/aec3/render_reverb_model.cc
deleted file mode 100644
index 0410a9a..0000000
--- a/modules/audio_processing/aec3/render_reverb_model.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "modules/audio_processing/aec3/render_reverb_model.h"
-
-#include <algorithm>
-
-#include "api/array_view.h"
-#include "rtc_base/checks.h"
-
-namespace webrtc {
-
-RenderReverbModel::RenderReverbModel() {
- Reset();
-}
-
-RenderReverbModel::~RenderReverbModel() = default;
-
-void RenderReverbModel::Reset() {
- render_reverb_.Reset();
-}
-
-void RenderReverbModel::Apply(const SpectrumBuffer& spectrum_buffer,
- int delay_blocks,
- float reverb_decay,
- rtc::ArrayView<float> reverb_power_spectrum) {
- int idx_at_delay =
- spectrum_buffer.OffsetIndex(spectrum_buffer.read, delay_blocks);
- int idx_past = spectrum_buffer.IncIndex(idx_at_delay);
- const auto& X2 = spectrum_buffer.buffer[idx_at_delay][/*channel=*/0];
- RTC_DCHECK_EQ(X2.size(), reverb_power_spectrum.size());
- render_reverb_.UpdateReverbNoFreqShaping(
- spectrum_buffer.buffer[idx_past][/*channel=*/0], 1.0f, reverb_decay);
-
- rtc::ArrayView<const float, kFftLengthBy2Plus1> reverb_power =
- render_reverb_.reverb();
- for (size_t k = 0; k < X2.size(); ++k) {
- reverb_power_spectrum[k] = X2[k] + reverb_power[k];
- }
-}
-
-} // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_reverb_model.h b/modules/audio_processing/aec3/render_reverb_model.h
deleted file mode 100644
index 8859a90..0000000
--- a/modules/audio_processing/aec3/render_reverb_model.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef MODULES_AUDIO_PROCESSING_AEC3_RENDER_REVERB_MODEL_H_
-#define MODULES_AUDIO_PROCESSING_AEC3_RENDER_REVERB_MODEL_H_
-
-#include "api/array_view.h"
-#include "modules/audio_processing/aec3/reverb_model.h"
-#include "modules/audio_processing/aec3/spectrum_buffer.h"
-
-namespace webrtc {
-
-// The RenderReverbModel class applies an exponential reverberant model over the
-// render spectrum.
-class RenderReverbModel {
- public:
- RenderReverbModel();
- ~RenderReverbModel();
-
- // Resets the state.
- void Reset();
-
- // Applies the reverberation model over the render spectrum. It also returns
- // the reverberation render power spectrum in the array reverb_power_spectrum.
- void Apply(const SpectrumBuffer& spectrum_buffer,
- int delay_blocks,
- float reverb_decay,
- rtc::ArrayView<float> reverb_power_spectrum);
-
- // Gets the reverberation spectrum that was added to the render spectrum for
- // computing the reverberation render spectrum.
- rtc::ArrayView<const float> GetReverbContributionPowerSpectrum() const {
- return render_reverb_.reverb();
- }
-
- private:
- ReverbModel render_reverb_;
-};
-
-} // namespace webrtc.
-
-#endif // MODULES_AUDIO_PROCESSING_AEC3_RENDER_REVERB_MODEL_H_