AEC3: Add multichannel support to the residual echo estimator

This CL adds support for multichannel in the residual echo
estimator code. It also adds placeholder functionality in
the surrounding code to ensure that the residual echo
estimator receives the require inputs.

The changes in the CL has been shown to be bitexact on a
large set of mono recordings.

Bug: webrtc:10913
Change-Id: I726128ca928648b1dcf36c5f479eb243f3ff3f96
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/155361
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29400}
This commit is contained in:
Per Åhgren
2019-10-08 12:35:47 +02:00
committed by Commit Bot
parent 7e6abf0053
commit b4161d3c0d
20 changed files with 437 additions and 371 deletions

View File

@ -28,37 +28,27 @@ class ReverbModel {
// Resets the state.
void Reset();
// The methods AddReverbNoFreqShaping and AddReverb add the reverberation
// contribution to an input/output power spectrum
// Before applying the exponential reverberant model, the input power spectrum
// is pre-scaled. Use the method AddReverb when a different scaling should be
// applied per frequency and AddReverb_no_freq_shape if the same scaling
// should be used for all the frequencies.
void AddReverbNoFreqShaping(rtc::ArrayView<const float> power_spectrum,
float power_spectrum_scaling,
float reverb_decay,
rtc::ArrayView<float> reverb_power_spectrum);
// Returns the reverb.
rtc::ArrayView<const float, kFftLengthBy2Plus1> reverb() const {
return reverb_;
}
void AddReverb(rtc::ArrayView<const float> power_spectrum,
rtc::ArrayView<const float> freq_response_tail,
float reverb_decay,
rtc::ArrayView<float> reverb_power_spectrum);
// The methods UpdateReverbNoFreqShaping and UpdateReverb update the
// estimate of the reverberation contribution to an input/output power
// spectrum. Before applying the exponential reverberant model, the input
// power spectrum is pre-scaled. Use the method UpdateReverb when a different
// scaling should be applied per frequency and UpdateReverb_no_freq_shape if
// the same scaling should be used for all the frequencies.
void UpdateReverbNoFreqShaping(rtc::ArrayView<const float> power_spectrum,
float power_spectrum_scaling,
float reverb_decay);
// Updates the reverberation contributions without applying any shaping of the
// spectrum.
void UpdateReverbContributionsNoFreqShaping(
rtc::ArrayView<const float> power_spectrum,
float power_spectrum_scaling,
float reverb_decay);
// Returns the current power spectrum reverberation contributions.
rtc::ArrayView<const float> GetPowerSpectrum() const { return reverb_; }
// Update the reverb based on new data.
void UpdateReverb(rtc::ArrayView<const float> power_spectrum,
rtc::ArrayView<const float> power_spectrum_scaling,
float reverb_decay);
private:
// Updates the reverberation contributions.
void UpdateReverbContributions(rtc::ArrayView<const float>& power_spectrum,
rtc::ArrayView<const float>& freq_resp_tail,
float reverb_decay);
std::array<float, kFftLengthBy2Plus1> reverb_;
};