Files
platform-external-webrtc/modules/audio_processing/aec3/stationarity_estimator.h
Jesús de Vicente Peña 496cedfe56 AEC3: Reverberation model: Changes on the decay estimation.
In this CL we have introduced changes on the estimation of the decay involved in the exponential modeling of the reverberation. Specifically, the instantaneous ERLE has been tracked and used for adapting faster in the regions when the linear filter is performing well. Furthermore, the adaptation is just perform during render activity.


Change-Id: I974fd60e4e1a40a879660efaa24457ed940f77b4
Bug: webrtc:9479
Reviewed-on: https://webrtc-review.googlesource.com/86680
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Commit-Queue: Jesus de Vicente Pena <devicentepena@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23836}
2018-07-04 10:04:32 +00:00

120 lines
3.9 KiB
C++

/*
* 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_STATIONARITY_ESTIMATOR_H_
#define MODULES_AUDIO_PROCESSING_AEC3_STATIONARITY_ESTIMATOR_H_
#include <array>
#include <memory>
#include <vector>
#include "api/array_view.h"
#include "modules/audio_processing/aec3/aec3_common.h"
#include "modules/audio_processing/aec3/reverb_model.h"
#include "modules/audio_processing/aec3/vector_buffer.h"
namespace webrtc {
class ApmDataDumper;
class StationarityEstimator {
public:
StationarityEstimator();
~StationarityEstimator();
// Reset the stationarity estimator.
void Reset();
// Update just the noise estimator. Usefull until the delay is known
void UpdateNoiseEstimator(rtc::ArrayView<const float> spectrum);
// Update the flag indicating whether this current frame is stationary. For
// getting a more robust estimation, it looks at future and/or past frames.
void UpdateStationarityFlags(const VectorBuffer& spectrum_buffer,
int idx_current,
int num_lookahead,
float reverb_decay);
// Returns true if the current band is stationary.
bool IsBandStationary(size_t band) const {
return stationarity_flags_[band] && (hangovers_[band] == 0);
}
// Returns true if the current block is estimated as stationary.
bool IsBlockStationary() const;
private:
static constexpr int kWindowLength = 13;
// Returns the power of the stationary noise spectrum at a band.
float GetStationarityPowerBand(size_t k) const { return noise_.Power(k); }
// Get an estimation of the stationarity for the current band by looking
// at the past/present/future available data.
bool EstimateBandStationarity(
const VectorBuffer& spectrum_buffer,
const std::array<float, kFftLengthBy2Plus1>& reverb,
const std::array<int, kWindowLength>& indexes,
size_t band) const;
// True if all bands at the current point are stationary.
bool AreAllBandsStationary();
// Update the hangover depending on the stationary status of the current
// frame.
void UpdateHangover();
// Smooth the stationarity detection by looking at neighbouring frequency
// bands.
void SmoothStationaryPerFreq();
class NoiseSpectrum {
public:
NoiseSpectrum();
~NoiseSpectrum();
// Reset the noise power spectrum estimate state.
void Reset();
// Update the noise power spectrum with a new frame.
void Update(rtc::ArrayView<const float> spectrum);
// Get the noise estimation power spectrum.
rtc::ArrayView<const float> Spectrum() const { return noise_spectrum_; }
// Get the noise power spectrum at a certain band.
float Power(size_t band) const {
RTC_DCHECK_LT(band, noise_spectrum_.size());
return noise_spectrum_[band];
}
private:
// Get the update coefficient to be used for the current frame.
float GetAlpha() const;
// Update the noise power spectrum at a certain band with a new frame.
float UpdateBandBySmoothing(float power_band,
float power_band_noise,
float alpha) const;
std::array<float, kFftLengthBy2Plus1> noise_spectrum_;
size_t block_counter_;
};
static int instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
NoiseSpectrum noise_;
std::array<int, kFftLengthBy2Plus1> hangovers_;
std::array<bool, kFftLengthBy2Plus1> stationarity_flags_;
ReverbModel render_reverb_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_AEC3_STATIONARITY_ESTIMATOR_H_