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}
This commit is contained in:
Per Åhgren 2019-10-09 12:54:43 +02:00 committed by Commit Bot
parent 9ddd72989a
commit 1d3008bfc6
5 changed files with 56 additions and 107 deletions

View File

@ -84,8 +84,6 @@ rtc_static_library("aec3") {
"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",

View File

@ -29,6 +29,56 @@ namespace {
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 @@ void AecState::Update(
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());
}

View File

@ -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 @@ class AecState {
absl::optional<DelayEstimate> external_delay_;
EchoAudibility echo_audibility_;
ReverbModelEstimator reverb_model_estimator_;
RenderReverbModel render_reverb_;
ReverbModel reverb_model_;
std::vector<SubtractorOutputAnalyzer> subtractor_output_analyzers_;
};

View File

@ -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

View File

@ -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_