Index: webrtc/modules/audio_processing/aec/aec_core.h |
diff --git a/webrtc/modules/audio_processing/aec/aec_core.h b/webrtc/modules/audio_processing/aec/aec_core.h |
index 1155bc38b08629ebbb3561d207742f8537210ef8..668b48419564b2d143265cdbc88789cbee25267b 100644 |
--- a/webrtc/modules/audio_processing/aec/aec_core.h |
+++ b/webrtc/modules/audio_processing/aec/aec_core.h |
@@ -17,6 +17,15 @@ |
#include <stddef.h> |
+#include <memory> |
+ |
+extern "C" { |
+#include "webrtc/common_audio/ring_buffer.h" |
+} |
+#include "webrtc/base/constructormagic.h" |
+#include "webrtc/common_audio/wav_file.h" |
+#include "webrtc/modules/audio_processing/aec/aec_common.h" |
+#include "webrtc/modules/audio_processing/utility/block_mean_calculator.h" |
#include "webrtc/typedefs.h" |
namespace webrtc { |
@@ -27,6 +36,8 @@ namespace webrtc { |
#define PART_LEN2 (PART_LEN * 2) // Length of partition * 2 |
#define NUM_HIGH_BANDS_MAX 2 // Max number of high bands |
+class ApmDataDumper; |
+ |
typedef float complex_t[2]; |
// For performance reasons, some arrays of complex numbers are replaced by twice |
// as long arrays of float, all the real parts followed by all the imaginary |
@@ -51,7 +62,175 @@ typedef struct Stats { |
size_t hicounter; |
} Stats; |
-typedef struct AecCore AecCore; |
+// Number of partitions for the extended filter mode. The first one is an enum |
+// to be used in array declarations, as it represents the maximum filter length. |
+enum { kExtendedNumPartitions = 32 }; |
+static const int kNormalNumPartitions = 12; |
+ |
+// Delay estimator constants, used for logging and delay compensation if |
+// if reported delays are disabled. |
+enum { kLookaheadBlocks = 15 }; |
+enum { |
+ // 500 ms for 16 kHz which is equivalent with the limit of reported delays. |
+ kHistorySizeBlocks = 125 |
+}; |
+ |
+typedef struct PowerLevel { |
+ PowerLevel(); |
+ |
+ BlockMeanCalculator framelevel; |
+ BlockMeanCalculator averagelevel; |
+ float minlevel; |
+} PowerLevel; |
+ |
+class DivergentFilterFraction { |
+ public: |
+ DivergentFilterFraction(); |
+ |
+ // Reset. |
+ void Reset(); |
+ |
+ void AddObservation(const PowerLevel& nearlevel, |
+ const PowerLevel& linoutlevel, |
+ const PowerLevel& nlpoutlevel); |
+ |
+ // Return the latest fraction. |
+ float GetLatestFraction() const; |
+ |
+ private: |
+ // Clear all values added. |
+ void Clear(); |
+ |
+ size_t count_; |
+ size_t occurrence_; |
+ float fraction_; |
+ |
+ RTC_DISALLOW_COPY_AND_ASSIGN(DivergentFilterFraction); |
+}; |
+ |
+typedef struct CoherenceState { |
+ complex_t sde[PART_LEN1]; // cross-psd of nearend and error |
+ complex_t sxd[PART_LEN1]; // cross-psd of farend and nearend |
+ float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1]; // far, near, error psd |
+} CoherenceState; |
+ |
+struct AecCore { |
+ explicit AecCore(int instance_index); |
+ ~AecCore(); |
+ |
+ std::unique_ptr<ApmDataDumper> data_dumper; |
+ |
+ CoherenceState coherence_state; |
+ |
+ int farBufWritePos, farBufReadPos; |
+ |
+ int knownDelay; |
+ int inSamples, outSamples; |
+ int delayEstCtr; |
+ |
+ RingBuffer* nearFrBuf; |
+ RingBuffer* outFrBuf; |
+ |
+ RingBuffer* nearFrBufH[NUM_HIGH_BANDS_MAX]; |
+ RingBuffer* outFrBufH[NUM_HIGH_BANDS_MAX]; |
+ |
+ float dBuf[PART_LEN2]; // nearend |
+ float eBuf[PART_LEN2]; // error |
+ |
+ float dBufH[NUM_HIGH_BANDS_MAX][PART_LEN2]; // nearend |
+ |
+ float xPow[PART_LEN1]; |
+ float dPow[PART_LEN1]; |
+ float dMinPow[PART_LEN1]; |
+ float dInitMinPow[PART_LEN1]; |
+ float* noisePow; |
+ |
+ float xfBuf[2][kExtendedNumPartitions * PART_LEN1]; // farend fft buffer |
+ float wfBuf[2][kExtendedNumPartitions * PART_LEN1]; // filter fft |
+ // Farend windowed fft buffer. |
+ complex_t xfwBuf[kExtendedNumPartitions * PART_LEN1]; |
+ |
+ float hNs[PART_LEN1]; |
+ float hNlFbMin, hNlFbLocalMin; |
+ float hNlXdAvgMin; |
+ int hNlNewMin, hNlMinCtr; |
+ float overDrive; |
+ float overdrive_scaling; |
+ int nlp_mode; |
+ float outBuf[PART_LEN]; |
+ int delayIdx; |
+ |
+ short stNearState, echoState; |
+ short divergeState; |
+ |
+ int xfBufBlockPos; |
+ |
+ RingBuffer* far_time_buf; |
+ |
+ int system_delay; // Current system delay buffered in AEC. |
+ |
+ int mult; // sampling frequency multiple |
+ int sampFreq = 16000; |
+ size_t num_bands; |
+ uint32_t seed; |
+ |
+ float filter_step_size; // stepsize |
+ float error_threshold; // error threshold |
+ |
+ int noiseEstCtr; |
+ |
+ PowerLevel farlevel; |
+ PowerLevel nearlevel; |
+ PowerLevel linoutlevel; |
+ PowerLevel nlpoutlevel; |
+ |
+ int metricsMode; |
+ int stateCounter; |
+ Stats erl; |
+ Stats erle; |
+ Stats aNlp; |
+ Stats rerl; |
+ DivergentFilterFraction divergent_filter_fraction; |
+ |
+ // Quantities to control H band scaling for SWB input |
+ int freq_avg_ic; // initial bin for averaging nlp gain |
+ int flag_Hband_cn; // for comfort noise |
+ float cn_scale_Hband; // scale for comfort noise in H band |
+ |
+ int delay_metrics_delivered; |
+ int delay_histogram[kHistorySizeBlocks]; |
+ int num_delay_values; |
+ int delay_median; |
+ int delay_std; |
+ float fraction_poor_delays; |
+ int delay_logging_enabled; |
+ void* delay_estimator_farend; |
+ void* delay_estimator; |
+ // Variables associated with delay correction through signal based delay |
+ // estimation feedback. |
+ int signal_delay_correction; |
+ int previous_delay; |
+ int delay_correction_count; |
+ int shift_offset; |
+ float delay_quality_threshold; |
+ int frame_count; |
+ |
+ // 0 = delay agnostic mode (signal based delay correction) disabled. |
+ // Otherwise enabled. |
+ int delay_agnostic_enabled; |
+ // 1 = extended filter mode enabled, 0 = disabled. |
+ int extended_filter_enabled; |
+ // 1 = next generation aec mode enabled, 0 = disabled. |
+ int aec3_enabled; |
+ bool refined_adaptive_filter_enabled; |
+ |
+ // Runtime selection of number of filter partitions. |
+ int num_partitions; |
+ |
+ // Flag that extreme filter divergence has been detected by the Echo |
+ // Suppressor. |
+ int extreme_filter_divergence; |
+}; |
AecCore* WebRtcAec_CreateAec(int instance_count); // Returns NULL on error. |
void WebRtcAec_FreeAec(AecCore* aec); |