| Index: webrtc/modules/audio_processing/aec3/matched_filter.cc
|
| diff --git a/webrtc/modules/audio_processing/aec3/matched_filter.cc b/webrtc/modules/audio_processing/aec3/matched_filter.cc
|
| index 64596b53c09a5fba195a87ed34aff98d64e40bd7..5da902db2ee69badfaa5a767abdb1c50816caf9d 100644
|
| --- a/webrtc/modules/audio_processing/aec3/matched_filter.cc
|
| +++ b/webrtc/modules/audio_processing/aec3/matched_filter.cc
|
| @@ -146,12 +146,6 @@ void MatchedFilterCore(size_t x_start_index,
|
|
|
| } // namespace aec3
|
|
|
| -MatchedFilter::IndexedBuffer::IndexedBuffer(size_t size) : data(size, 0.f) {
|
| - RTC_DCHECK_EQ(0, size % kSubBlockSize);
|
| -}
|
| -
|
| -MatchedFilter::IndexedBuffer::~IndexedBuffer() = default;
|
| -
|
| MatchedFilter::MatchedFilter(ApmDataDumper* data_dumper,
|
| Aec3Optimization optimization,
|
| size_t window_size_sub_blocks,
|
| @@ -162,51 +156,51 @@ MatchedFilter::MatchedFilter(ApmDataDumper* data_dumper,
|
| filter_intra_lag_shift_(alignment_shift_sub_blocks * kSubBlockSize),
|
| filters_(num_matched_filters,
|
| std::vector<float>(window_size_sub_blocks * kSubBlockSize, 0.f)),
|
| - lag_estimates_(num_matched_filters),
|
| - x_buffer_(kSubBlockSize *
|
| - (alignment_shift_sub_blocks * num_matched_filters +
|
| - window_size_sub_blocks +
|
| - 1)) {
|
| + lag_estimates_(num_matched_filters) {
|
| RTC_DCHECK(data_dumper);
|
| - RTC_DCHECK_EQ(0, x_buffer_.data.size() % kSubBlockSize);
|
| RTC_DCHECK_LT(0, window_size_sub_blocks);
|
| }
|
|
|
| MatchedFilter::~MatchedFilter() = default;
|
|
|
| -void MatchedFilter::Update(const std::array<float, kSubBlockSize>& render,
|
| +void MatchedFilter::Reset() {
|
| + for (auto& f : filters_) {
|
| + std::fill(f.begin(), f.end(), 0.f);
|
| + }
|
| +
|
| + for (auto& l : lag_estimates_) {
|
| + l = MatchedFilter::LagEstimate();
|
| + }
|
| +}
|
| +
|
| +void MatchedFilter::Update(const DownsampledRenderBuffer& render_buffer,
|
| const std::array<float, kSubBlockSize>& capture) {
|
| - const std::array<float, kSubBlockSize>& x = render;
|
| const std::array<float, kSubBlockSize>& y = capture;
|
|
|
| const float x2_sum_threshold = filters_[0].size() * 150.f * 150.f;
|
|
|
| - // Insert the new subblock into x_buffer.
|
| - x_buffer_.index = (x_buffer_.index - kSubBlockSize + x_buffer_.data.size()) %
|
| - x_buffer_.data.size();
|
| - RTC_DCHECK_LE(kSubBlockSize, x_buffer_.data.size() - x_buffer_.index);
|
| - std::copy(x.rbegin(), x.rend(), x_buffer_.data.begin() + x_buffer_.index);
|
| -
|
| // Apply all matched filters.
|
| size_t alignment_shift = 0;
|
| for (size_t n = 0; n < filters_.size(); ++n) {
|
| float error_sum = 0.f;
|
| bool filters_updated = false;
|
| +
|
| size_t x_start_index =
|
| - (x_buffer_.index + alignment_shift + kSubBlockSize - 1) %
|
| - x_buffer_.data.size();
|
| + (render_buffer.position + alignment_shift + kSubBlockSize - 1) %
|
| + render_buffer.buffer.size();
|
|
|
| switch (optimization_) {
|
| #if defined(WEBRTC_ARCH_X86_FAMILY)
|
| case Aec3Optimization::kSse2:
|
| aec3::MatchedFilterCore_SSE2(x_start_index, x2_sum_threshold,
|
| - x_buffer_.data, y, filters_[n],
|
| + render_buffer.buffer, y, filters_[n],
|
| &filters_updated, &error_sum);
|
| break;
|
| #endif
|
| default:
|
| - aec3::MatchedFilterCore(x_start_index, x2_sum_threshold, x_buffer_.data,
|
| - y, filters_[n], &filters_updated, &error_sum);
|
| + aec3::MatchedFilterCore(x_start_index, x2_sum_threshold,
|
| + render_buffer.buffer, y, filters_[n],
|
| + &filters_updated, &error_sum);
|
| }
|
|
|
| // Compute anchor for the matched filter error.
|
|
|