Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_processing / aec / aec_core_internal.h
1 /*
2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_INTERNAL_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_INTERNAL_H_
13
14 #include "webrtc/common_audio/wav_writer.h"
15 #include "webrtc/modules/audio_processing/aec/aec_common.h"
16 #include "webrtc/modules/audio_processing/aec/aec_core.h"
17 #include "webrtc/modules/audio_processing/utility/ring_buffer.h"
18 #include "webrtc/typedefs.h"
19
20 // Number of partitions for the extended filter mode. The first one is an enum
21 // to be used in array declarations, as it represents the maximum filter length.
22 enum {
23   kExtendedNumPartitions = 32
24 };
25 static const int kNormalNumPartitions = 12;
26
27 // Delay estimator constants, used for logging.
28 enum {
29   kMaxDelayBlocks = 60
30 };
31 enum {
32   kLookaheadBlocks = 15
33 };
34 enum {
35   kHistorySizeBlocks = kMaxDelayBlocks + kLookaheadBlocks
36 };
37
38 // Extended filter adaptation parameters.
39 // TODO(ajm): No narrowband tuning yet.
40 static const float kExtendedMu = 0.4f;
41 static const float kExtendedErrorThreshold = 1.0e-6f;
42
43 typedef struct PowerLevel {
44   float sfrsum;
45   int sfrcounter;
46   float framelevel;
47   float frsum;
48   int frcounter;
49   float minlevel;
50   float averagelevel;
51 } PowerLevel;
52
53 struct AecCore {
54   int farBufWritePos, farBufReadPos;
55
56   int knownDelay;
57   int inSamples, outSamples;
58   int delayEstCtr;
59
60   RingBuffer* nearFrBuf;
61   RingBuffer* outFrBuf;
62
63   RingBuffer* nearFrBufH;
64   RingBuffer* outFrBufH;
65
66   float dBuf[PART_LEN2];  // nearend
67   float eBuf[PART_LEN2];  // error
68
69   float dBufH[PART_LEN2];  // nearend
70
71   float xPow[PART_LEN1];
72   float dPow[PART_LEN1];
73   float dMinPow[PART_LEN1];
74   float dInitMinPow[PART_LEN1];
75   float* noisePow;
76
77   float xfBuf[2][kExtendedNumPartitions * PART_LEN1];  // farend fft buffer
78   float wfBuf[2][kExtendedNumPartitions * PART_LEN1];  // filter fft
79   complex_t sde[PART_LEN1];  // cross-psd of nearend and error
80   complex_t sxd[PART_LEN1];  // cross-psd of farend and nearend
81   // Farend windowed fft buffer.
82   complex_t xfwBuf[kExtendedNumPartitions * PART_LEN1];
83
84   float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1];  // far, near, error psd
85   float hNs[PART_LEN1];
86   float hNlFbMin, hNlFbLocalMin;
87   float hNlXdAvgMin;
88   int hNlNewMin, hNlMinCtr;
89   float overDrive, overDriveSm;
90   int nlp_mode;
91   float outBuf[PART_LEN];
92   int delayIdx;
93
94   short stNearState, echoState;
95   short divergeState;
96
97   int xfBufBlockPos;
98
99   RingBuffer* far_buf;
100   RingBuffer* far_buf_windowed;
101   int system_delay;  // Current system delay buffered in AEC.
102
103   int mult;  // sampling frequency multiple
104   int sampFreq;
105   uint32_t seed;
106
107   float normal_mu;               // stepsize
108   float normal_error_threshold;  // error threshold
109
110   int noiseEstCtr;
111
112   PowerLevel farlevel;
113   PowerLevel nearlevel;
114   PowerLevel linoutlevel;
115   PowerLevel nlpoutlevel;
116
117   int metricsMode;
118   int stateCounter;
119   Stats erl;
120   Stats erle;
121   Stats aNlp;
122   Stats rerl;
123
124   // Quantities to control H band scaling for SWB input
125   int freq_avg_ic;       // initial bin for averaging nlp gain
126   int flag_Hband_cn;     // for comfort noise
127   float cn_scale_Hband;  // scale for comfort noise in H band
128
129   int delay_histogram[kHistorySizeBlocks];
130   int delay_logging_enabled;
131   void* delay_estimator_farend;
132   void* delay_estimator;
133
134   int reported_delay_enabled;  // 0 = disabled, otherwise enabled.
135   // 1 = extended filter mode enabled, 0 = disabled.
136   int extended_filter_enabled;
137   // Runtime selection of number of filter partitions.
138   int num_partitions;
139
140 #ifdef WEBRTC_AEC_DEBUG_DUMP
141   // Sequence number of this AEC instance, so that different instances can
142   // choose different dump file names.
143   int instance_index;
144
145   // Number of times we've restarted dumping; used to pick new dump file names
146   // each time.
147   int debug_dump_count;
148
149   RingBuffer* far_time_buf;
150   rtc_WavFile* farFile;
151   rtc_WavFile* nearFile;
152   rtc_WavFile* outFile;
153   rtc_WavFile* outLinearFile;
154 #endif
155 };
156
157 typedef void (*WebRtcAec_FilterFar_t)(AecCore* aec, float yf[2][PART_LEN1]);
158 extern WebRtcAec_FilterFar_t WebRtcAec_FilterFar;
159 typedef void (*WebRtcAec_ScaleErrorSignal_t)(AecCore* aec,
160                                              float ef[2][PART_LEN1]);
161 extern WebRtcAec_ScaleErrorSignal_t WebRtcAec_ScaleErrorSignal;
162 typedef void (*WebRtcAec_FilterAdaptation_t)(AecCore* aec,
163                                              float* fft,
164                                              float ef[2][PART_LEN1]);
165 extern WebRtcAec_FilterAdaptation_t WebRtcAec_FilterAdaptation;
166 typedef void (*WebRtcAec_OverdriveAndSuppress_t)(AecCore* aec,
167                                                  float hNl[PART_LEN1],
168                                                  const float hNlFb,
169                                                  float efw[2][PART_LEN1]);
170 extern WebRtcAec_OverdriveAndSuppress_t WebRtcAec_OverdriveAndSuppress;
171
172 typedef void (*WebRtcAec_ComfortNoise_t)(AecCore* aec,
173                                          float efw[2][PART_LEN1],
174                                          complex_t* comfortNoiseHband,
175                                          const float* noisePow,
176                                          const float* lambda);
177 extern WebRtcAec_ComfortNoise_t WebRtcAec_ComfortNoise;
178
179 typedef void (*WebRtcAec_SubbandCoherence_t)(AecCore* aec,
180                                              float efw[2][PART_LEN1],
181                                              float xfw[2][PART_LEN1],
182                                              float* fft,
183                                              float* cohde,
184                                              float* cohxd);
185 extern WebRtcAec_SubbandCoherence_t WebRtcAec_SubbandCoherence;
186
187 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_INTERNAL_H_