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