Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Unified Diff: webrtc/modules/audio_processing/echo_detector/echo_detector.h

Issue 2419563003: Add algorithm for Residual Echo Detector. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_processing/echo_detector/echo_detector.h
diff --git a/webrtc/modules/audio_processing/echo_detector/echo_detector.h b/webrtc/modules/audio_processing/echo_detector/echo_detector.h
index fd190834329cc1760208f0efd7349ab62e84fc62..f0a55fec74f99669ff7e9059ee30e3e231beebe3 100644
--- a/webrtc/modules/audio_processing/echo_detector/echo_detector.h
+++ b/webrtc/modules/audio_processing/echo_detector/echo_detector.h
@@ -12,19 +12,100 @@
#define WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_ECHO_DETECTOR_H_
#include <stddef.h>
+#include <vector>
namespace webrtc {
+// This class iteratively estimates the mean and variance of a signal.
+class MeanVarianceEstimator {
hlundin-webrtc 2016/10/14 08:00:39 This and the two next classes are an internal matt
ivoc 2016/10/17 16:05:08 Ok, I will move each to its own file.
+ public:
+ void UpdateEstimate(float value);
+ float SigmaEstimate();
hlundin-webrtc 2016/10/14 08:00:40 const method
hlundin-webrtc 2016/10/14 08:00:40 This is almost an accessor method; you can name it
peah-webrtc 2016/10/14 08:18:58 const
ivoc 2016/10/17 16:05:08 Done, I went with std_deviation (without estimate)
+ float MeanEstimate();
hlundin-webrtc 2016/10/14 08:00:40 This is a simple accessor method => float mean() c
peah-webrtc 2016/10/14 08:18:58 const
ivoc 2016/10/17 16:05:08 Done.
+ void Clear();
+
+ private:
+ // Estimate of the expected value of the input values.
+ float mean_ = 0.f;
+ // Estimate of the variance of the input values.
+ float variance_ = 0.f;
+ // Parameter controlling the adaptation speed.
+ static constexpr float alpha_ = 0.01f;
hlundin-webrtc 2016/10/14 08:00:40 static const members should go before variable mem
ivoc 2016/10/17 16:05:08 Done.
+};
+
+// This class iteratively estimates the covariance between two signals.
+class CovarianceEstimator {
+ public:
+ void UpdateCovarianceEstimate(float x,
+ float x_mean,
+ float x_var,
+ float y,
+ float y_mean,
+ float y_var);
+ float PCCEstimate();
hlundin-webrtc 2016/10/14 08:00:39 float pcc() const { return pcc_; }
hlundin-webrtc 2016/10/14 08:00:40 Comment, so that the reader understands what PCC m
ivoc 2016/10/17 16:05:08 Done.
+ void Clear();
+
+ private:
+ // Estimate of the Pearson product-moment correlation coefficient of the two
+ // signals.
+ float PCC_ = 0.f;
hlundin-webrtc 2016/10/14 08:00:39 pcc_
ivoc 2016/10/17 16:05:08 I renamed this to normalized_cross_correlation_, f
+ // Estimate of the covariance value.
+ float covariance_ = 0.f;
+ // Parameter controlling the adaptation speed.
+ static constexpr float alpha_ = 0.01f;
hlundin-webrtc 2016/10/14 08:00:39 Same comments as above: move up and rename to kAlp
ivoc 2016/10/17 16:05:08 Done.
+};
+
+// Ring buffer containing floating point values.
+struct CircularBuffer {
+ public:
+ CircularBuffer(int size);
hlundin-webrtc 2016/10/14 08:00:39 explicit
hlundin-webrtc 2016/10/14 08:00:40 size_t size
ivoc 2016/10/17 16:05:08 Done.
+ ~CircularBuffer();
+
+ void Insert(float value);
+ float GetValue(int delay);
+ void Clear();
+
+ private:
+ std::vector<float> buffer_;
+ const int size_;
hlundin-webrtc 2016/10/14 08:00:39 const size_t
peah-webrtc 2016/10/14 08:18:58 You don't need the size_ constant. Use buffer_.siz
ivoc 2016/10/17 16:05:08 I thought it would be more efficient to store it t
+ int next_insertion_index_ = 0;
hlundin-webrtc 2016/10/14 08:00:39 size_t
ivoc 2016/10/17 16:05:08 Done.
+};
+
class EchoDetector {
public:
- EchoDetector() {}
- ~EchoDetector() {}
+ EchoDetector();
+ ~EchoDetector();
void BufferFarend(const float* farend, size_t num_samples);
void Process(const float* nearend, size_t num_samples);
void Initialize(int sample_rate_hz);
+
+ float EchoLikelihood();
hlundin-webrtc 2016/10/14 08:00:39 float echo_likelihood() const { return echo_likeli
ivoc 2016/10/17 16:05:08 Done.
+
+ private:
+ static constexpr int lookback_periods_ = 650;
hlundin-webrtc 2016/10/14 08:00:39 kLookbackPeriods
hlundin-webrtc 2016/10/14 08:00:39 size_t?
peah-webrtc 2016/10/14 08:18:58 size_t?
ivoc 2016/10/17 16:05:08 Done.
+ static constexpr int render_buffer_size_ = 20;
hlundin-webrtc 2016/10/14 08:00:39 kRenderBufferSize
hlundin-webrtc 2016/10/14 08:00:40 Definitely size_t.
peah-webrtc 2016/10/14 08:18:58 size_t?
ivoc 2016/10/17 16:05:08 Done.
+
+ // Buffer for storing the power of incoming farend buffers. This is needed for
+ // cases where calls to BufferFarend and Process are jittery.
+ CircularBuffer render_buffer_;
+ // Delay of next render sample that should be used.
+ int render_buffer_delay_ = 0;
peah-webrtc 2016/10/14 08:18:58 size_t?
ivoc 2016/10/17 16:05:08 Done.
+
+ // Delayed versions of the power, mean and sigma, for calculating the delayed
+ // covariance values.
+ CircularBuffer render_power_;
+ CircularBuffer render_power_mean_;
+ CircularBuffer render_power_sigma_;
hlundin-webrtc 2016/10/14 08:00:39 render_power_std_dev_
ivoc 2016/10/17 16:05:08 Done.
+
+ MeanVarianceEstimator render_variance_;
+ MeanVarianceEstimator capture_variance_;
+ // Covariance estimates for different delay values.
+ std::vector<CovarianceEstimator> covariance_;
+ // Current echo likelihood.
+ float echo_likelihood_ = 0.f;
};
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698