• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2011 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 /*
12  * Specifies the interface for the AEC core.
13  */
14 
15 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_
16 #define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_
17 
18 #include <stdio.h>
19 
20 #include "signal_processing_library.h"
21 #include "typedefs.h"
22 
23 #define FRAME_LEN 80
24 #define PART_LEN 64 // Length of partition
25 #define PART_LEN1 (PART_LEN + 1) // Unique fft coefficients
26 #define PART_LEN2 (PART_LEN * 2) // Length of partition * 2
27 #define NR_PART 12  // Number of partitions in filter.
28 #define PREF_BAND_SIZE 24
29 
30 // Delay estimator constants, used for logging.
31 enum { kMaxDelayBlocks = 60 };
32 enum { kLookaheadBlocks = 15 };
33 enum { kHistorySizeBlocks = kMaxDelayBlocks + kLookaheadBlocks };
34 
35 typedef float complex_t[2];
36 // For performance reasons, some arrays of complex numbers are replaced by twice
37 // as long arrays of float, all the real parts followed by all the imaginary
38 // ones (complex_t[SIZE] -> float[2][SIZE]). This allows SIMD optimizations and
39 // is better than two arrays (one for the real parts and one for the imaginary
40 // parts) as this other way would require two pointers instead of one and cause
41 // extra register spilling. This also allows the offsets to be calculated at
42 // compile time.
43 
44 // Metrics
45 enum {offsetLevel = -100};
46 
47 typedef struct {
48     float sfrsum;
49     int sfrcounter;
50     float framelevel;
51     float frsum;
52     int frcounter;
53     float minlevel;
54     float averagelevel;
55 } power_level_t;
56 
57 typedef struct {
58     float instant;
59     float average;
60     float min;
61     float max;
62     float sum;
63     float hisum;
64     float himean;
65     int counter;
66     int hicounter;
67 } stats_t;
68 
69 typedef struct {
70     int farBufWritePos, farBufReadPos;
71 
72     int knownDelay;
73     int inSamples, outSamples;
74     int delayEstCtr;
75 
76     void *nearFrBuf, *outFrBuf;
77 
78     void *nearFrBufH;
79     void *outFrBufH;
80 
81     float dBuf[PART_LEN2]; // nearend
82     float eBuf[PART_LEN2]; // error
83 
84     float dBufH[PART_LEN2]; // nearend
85 
86     float xPow[PART_LEN1];
87     float dPow[PART_LEN1];
88     float dMinPow[PART_LEN1];
89     float dInitMinPow[PART_LEN1];
90     float *noisePow;
91 
92     float xfBuf[2][NR_PART * PART_LEN1]; // farend fft buffer
93     float wfBuf[2][NR_PART * PART_LEN1]; // filter fft
94     complex_t sde[PART_LEN1]; // cross-psd of nearend and error
95     complex_t sxd[PART_LEN1]; // cross-psd of farend and nearend
96     complex_t xfwBuf[NR_PART * PART_LEN1]; // farend windowed fft buffer
97 
98     float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1]; // far, near and error psd
99     float hNs[PART_LEN1];
100     float hNlFbMin, hNlFbLocalMin;
101     float hNlXdAvgMin;
102     int hNlNewMin, hNlMinCtr;
103     float overDrive, overDriveSm;
104     float targetSupp, minOverDrive;
105     float outBuf[PART_LEN];
106     int delayIdx;
107 
108     short stNearState, echoState;
109     short divergeState;
110 
111     int xfBufBlockPos;
112 
113     void* far_buf;
114     void* far_buf_windowed;
115     int system_delay;  // Current system delay buffered in AEC.
116 
117     int mult;  // sampling frequency multiple
118     int sampFreq;
119     WebRtc_UWord32 seed;
120 
121     float mu; // stepsize
122     float errThresh; // error threshold
123 
124     int noiseEstCtr;
125 
126     power_level_t farlevel;
127     power_level_t nearlevel;
128     power_level_t linoutlevel;
129     power_level_t nlpoutlevel;
130 
131     int metricsMode;
132     int stateCounter;
133     stats_t erl;
134     stats_t erle;
135     stats_t aNlp;
136     stats_t rerl;
137 
138     // Quantities to control H band scaling for SWB input
139     int freq_avg_ic;         //initial bin for averaging nlp gain
140     int flag_Hband_cn;      //for comfort noise
141     float cn_scale_Hband;   //scale for comfort noise in H band
142 
143     int delay_histogram[kHistorySizeBlocks];
144     int delay_logging_enabled;
145     void* delay_estimator;
146 
147 #ifdef WEBRTC_AEC_DEBUG_DUMP
148     void* far_time_buf;
149     FILE *farFile;
150     FILE *nearFile;
151     FILE *outFile;
152     FILE *outLinearFile;
153 #endif
154 } aec_t;
155 
156 typedef void (*WebRtcAec_FilterFar_t)(aec_t *aec, float yf[2][PART_LEN1]);
157 extern WebRtcAec_FilterFar_t WebRtcAec_FilterFar;
158 typedef void (*WebRtcAec_ScaleErrorSignal_t)(aec_t *aec, float ef[2][PART_LEN1]);
159 extern WebRtcAec_ScaleErrorSignal_t WebRtcAec_ScaleErrorSignal;
160 typedef void (*WebRtcAec_FilterAdaptation_t)
161   (aec_t *aec, float *fft, float ef[2][PART_LEN1]);
162 extern WebRtcAec_FilterAdaptation_t WebRtcAec_FilterAdaptation;
163 typedef void (*WebRtcAec_OverdriveAndSuppress_t)
164   (aec_t *aec, float hNl[PART_LEN1], const float hNlFb, float efw[2][PART_LEN1]);
165 extern WebRtcAec_OverdriveAndSuppress_t WebRtcAec_OverdriveAndSuppress;
166 
167 int WebRtcAec_CreateAec(aec_t **aec);
168 int WebRtcAec_FreeAec(aec_t *aec);
169 int WebRtcAec_InitAec(aec_t *aec, int sampFreq);
170 void WebRtcAec_InitAec_SSE2(void);
171 
172 void WebRtcAec_InitMetrics(aec_t *aec);
173 void WebRtcAec_BufferFarendPartition(aec_t *aec, const float* farend);
174 void WebRtcAec_ProcessFrame(aec_t* aec,
175                             const short *nearend,
176                             const short *nearendH,
177                             int knownDelay);
178 
179 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_
180