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 #include "typedefs.h" 20 #include "signal_processing_library.h" 21 22 //#define G167 // for running G167 tests 23 //#define UNCONSTR // time-unconstrained filter 24 //#define AEC_DEBUG // for recording files 25 26 #define FRAME_LEN 80 27 #define PART_LEN 64 // Length of partition 28 #define PART_LEN1 (PART_LEN + 1) // Unique fft coefficients 29 #define PART_LEN2 (PART_LEN * 2) // Length of partition * 2 30 #define NR_PART 12 // Number of partitions 31 #define FILT_LEN (PART_LEN * NR_PART) // Filter length 32 #define FILT_LEN2 (FILT_LEN * 2) // Double filter length 33 #define FAR_BUF_LEN (FILT_LEN2 * 2) 34 #define PREF_BAND_SIZE 24 35 36 #define BLOCKL_MAX FRAME_LEN 37 38 typedef float complex_t[2]; 39 // For performance reasons, some arrays of complex numbers are replaced by twice 40 // as long arrays of float, all the real parts followed by all the imaginary 41 // ones (complex_t[SIZE] -> float[2][SIZE]). This allows SIMD optimizations and 42 // is better than two arrays (one for the real parts and one for the imaginary 43 // parts) as this other way would require two pointers instead of one and cause 44 // extra register spilling. This also allows the offsets to be calculated at 45 // compile time. 46 47 // Metrics 48 enum {offsetLevel = -100}; 49 50 typedef struct { 51 float sfrsum; 52 int sfrcounter; 53 float framelevel; 54 float frsum; 55 int frcounter; 56 float minlevel; 57 float averagelevel; 58 } power_level_t; 59 60 typedef struct { 61 float instant; 62 float average; 63 float min; 64 float max; 65 float sum; 66 float hisum; 67 float himean; 68 int counter; 69 int hicounter; 70 } stats_t; 71 72 typedef struct { 73 int farBufWritePos, farBufReadPos; 74 75 int knownDelay; 76 int inSamples, outSamples; 77 int delayEstCtr; 78 79 void *farFrBuf, *nearFrBuf, *outFrBuf; 80 81 void *nearFrBufH; 82 void *outFrBufH; 83 84 float xBuf[PART_LEN2]; // farend 85 float dBuf[PART_LEN2]; // nearend 86 float eBuf[PART_LEN2]; // error 87 88 float dBufH[PART_LEN2]; // nearend 89 90 float xPow[PART_LEN1]; 91 float dPow[PART_LEN1]; 92 float dMinPow[PART_LEN1]; 93 float dInitMinPow[PART_LEN1]; 94 float *noisePow; 95 #ifdef FFTW 96 float fftR[PART_LEN2]; 97 fftw_complex fftC[PART_LEN2]; 98 fftw_plan fftPlan, ifftPlan; 99 100 fftw_complex xfBuf[NR_PART * PART_LEN1]; 101 fftw_complex wfBuf[NR_PART * PART_LEN1]; 102 fftw_complex sde[PART_LEN1]; 103 #else 104 float xfBuf[2][NR_PART * PART_LEN1]; // farend fft buffer 105 float wfBuf[2][NR_PART * PART_LEN1]; // filter fft 106 complex_t sde[PART_LEN1]; // cross-psd of nearend and error 107 complex_t sxd[PART_LEN1]; // cross-psd of farend and nearend 108 complex_t xfwBuf[NR_PART * PART_LEN1]; // farend windowed fft buffer 109 #endif 110 float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1]; // far, near and error psd 111 float hNs[PART_LEN1]; 112 float hNlFbMin, hNlFbLocalMin; 113 float hNlXdAvgMin; 114 int hNlNewMin, hNlMinCtr; 115 float overDrive, overDriveSm; 116 float targetSupp, minOverDrive; 117 float outBuf[PART_LEN]; 118 int delayIdx; 119 120 short stNearState, echoState; 121 short divergeState; 122 123 int xfBufBlockPos; 124 125 short farBuf[FILT_LEN2 * 2]; 126 127 short mult; // sampling frequency multiple 128 int sampFreq; 129 WebRtc_UWord32 seed; 130 131 float mu; // stepsize 132 float errThresh; // error threshold 133 134 int noiseEstCtr; 135 136 // Toggles for G.167 testing 137 #ifdef G167 138 short adaptToggle; // Filter adaptation 139 short nlpToggle; // Nonlinear processing 140 short cnToggle; // Comfort noise 141 #endif 142 143 power_level_t farlevel; 144 power_level_t nearlevel; 145 power_level_t linoutlevel; 146 power_level_t nlpoutlevel; 147 148 int metricsMode; 149 int stateCounter; 150 stats_t erl; 151 stats_t erle; 152 stats_t aNlp; 153 stats_t rerl; 154 155 // Quantities to control H band scaling for SWB input 156 int freq_avg_ic; //initial bin for averaging nlp gain 157 int flag_Hband_cn; //for comfort noise 158 float cn_scale_Hband; //scale for comfort noise in H band 159 160 #ifdef AEC_DEBUG 161 FILE *farFile; 162 FILE *nearFile; 163 FILE *outFile; 164 FILE *outLpFile; 165 #endif 166 } aec_t; 167 168 typedef void (*WebRtcAec_FilterFar_t)(aec_t *aec, float yf[2][PART_LEN1]); 169 extern WebRtcAec_FilterFar_t WebRtcAec_FilterFar; 170 typedef void (*WebRtcAec_ScaleErrorSignal_t)(aec_t *aec, float ef[2][PART_LEN1]); 171 extern WebRtcAec_ScaleErrorSignal_t WebRtcAec_ScaleErrorSignal; 172 #define IP_LEN PART_LEN // this must be at least ceil(2 + sqrt(PART_LEN)) 173 #define W_LEN PART_LEN 174 typedef void (*WebRtcAec_FilterAdaptation_t) 175 (aec_t *aec, float *fft, float ef[2][PART_LEN1]); 176 extern WebRtcAec_FilterAdaptation_t WebRtcAec_FilterAdaptation; 177 typedef void (*WebRtcAec_OverdriveAndSuppress_t) 178 (aec_t *aec, float hNl[PART_LEN1], const float hNlFb, float efw[2][PART_LEN1]); 179 extern WebRtcAec_OverdriveAndSuppress_t WebRtcAec_OverdriveAndSuppress; 180 181 int WebRtcAec_CreateAec(aec_t **aec); 182 int WebRtcAec_FreeAec(aec_t *aec); 183 int WebRtcAec_InitAec(aec_t *aec, int sampFreq); 184 void WebRtcAec_InitAec_SSE2(void); 185 186 void WebRtcAec_InitMetrics(aec_t *aec); 187 void WebRtcAec_ProcessFrame(aec_t *aec, const short *farend, 188 const short *nearend, const short *nearendH, 189 short *out, short *outH, 190 int knownDelay); 191 192 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_ 193 194