| 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);
|
|
|