OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 // Number of partitions forming the NLP's "preferred" bands. | 133 // Number of partitions forming the NLP's "preferred" bands. |
134 enum { kPrefBandSize = 24 }; | 134 enum { kPrefBandSize = 24 }; |
135 | 135 |
136 #ifdef WEBRTC_AEC_DEBUG_DUMP | 136 #ifdef WEBRTC_AEC_DEBUG_DUMP |
137 extern int webrtc_aec_instance_count; | 137 extern int webrtc_aec_instance_count; |
138 #endif | 138 #endif |
139 | 139 |
140 WebRtcAecFilterFar WebRtcAec_FilterFar; | 140 WebRtcAecFilterFar WebRtcAec_FilterFar; |
141 WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal; | 141 WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal; |
142 WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation; | 142 WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation; |
143 WebRtcAecOverdriveAndSuppress WebRtcAec_OverdriveAndSuppress; | 143 WebRtcAecOverdrive WebRtcAec_Overdrive; |
144 WebRtcAecSuppress WebRtcAec_Suppress; | |
144 WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence; | 145 WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence; |
145 WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra; | 146 WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra; |
146 WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex; | 147 WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex; |
147 WebRtcAecPartitionDelay WebRtcAec_PartitionDelay; | 148 WebRtcAecPartitionDelay WebRtcAec_PartitionDelay; |
148 WebRtcAecWindowData WebRtcAec_WindowData; | 149 WebRtcAecWindowData WebRtcAec_WindowData; |
149 | 150 |
150 __inline static float MulRe(float aRe, float aIm, float bRe, float bIm) { | 151 __inline static float MulRe(float aRe, float aIm, float bRe, float bIm) { |
151 return aRe * bRe - aIm * bIm; | 152 return aRe * bRe - aIm * bIm; |
152 } | 153 } |
153 | 154 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
306 h_fft_buf[0][pos] += fft[0]; | 307 h_fft_buf[0][pos] += fft[0]; |
307 h_fft_buf[0][pos + PART_LEN] += fft[1]; | 308 h_fft_buf[0][pos + PART_LEN] += fft[1]; |
308 | 309 |
309 for (j = 1; j < PART_LEN; j++) { | 310 for (j = 1; j < PART_LEN; j++) { |
310 h_fft_buf[0][pos + j] += fft[2 * j]; | 311 h_fft_buf[0][pos + j] += fft[2 * j]; |
311 h_fft_buf[1][pos + j] += fft[2 * j + 1]; | 312 h_fft_buf[1][pos + j] += fft[2 * j + 1]; |
312 } | 313 } |
313 } | 314 } |
314 } | 315 } |
315 | 316 |
316 static void OverdriveAndSuppress(float overdrive_scaling, | 317 static void Overdrive(float overdrive_scaling, |
317 float hNl[PART_LEN1], | 318 const float hNlFb, |
318 const float hNlFb, | 319 float hNl[PART_LEN1]) { |
319 float efw[2][PART_LEN1]) { | 320 for (int i = 0; i < PART_LEN1; ++i) { |
320 int i; | |
321 for (i = 0; i < PART_LEN1; i++) { | |
322 // Weight subbands | 321 // Weight subbands |
323 if (hNl[i] > hNlFb) { | 322 if (hNl[i] > hNlFb) { |
324 hNl[i] = WebRtcAec_weightCurve[i] * hNlFb + | 323 hNl[i] = WebRtcAec_weightCurve[i] * hNlFb + |
325 (1 - WebRtcAec_weightCurve[i]) * hNl[i]; | 324 (1 - WebRtcAec_weightCurve[i]) * hNl[i]; |
326 } | 325 } |
327 hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]); | 326 hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]); |
327 } | |
328 } | |
328 | 329 |
330 static void Suppress(float hNl[PART_LEN1], float efw[2][PART_LEN1]) { | |
hlundin-webrtc
2016/05/03 08:22:29
hNl should be const.
peah-webrtc
2016/05/07 21:26:15
Done.
| |
331 for (int i = 0; i < PART_LEN1; ++i) { | |
329 // Suppress error signal | 332 // Suppress error signal |
330 efw[0][i] *= hNl[i]; | 333 efw[0][i] *= hNl[i]; |
331 efw[1][i] *= hNl[i]; | 334 efw[1][i] *= hNl[i]; |
332 | 335 |
333 // Ooura fft returns incorrect sign on imaginary component. It matters here | 336 // Ooura fft returns incorrect sign on imaginary component. It matters here |
334 // because we are making an additive change with comfort noise. | 337 // because we are making an additive change with comfort noise. |
335 efw[1][i] *= -1; | 338 efw[1][i] *= -1; |
336 } | 339 } |
337 } | 340 } |
338 | 341 |
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1156 | 1159 |
1157 // Smooth the overdrive. | 1160 // Smooth the overdrive. |
1158 if (aec->overDrive < aec->overdrive_scaling) { | 1161 if (aec->overDrive < aec->overdrive_scaling) { |
1159 aec->overdrive_scaling = | 1162 aec->overdrive_scaling = |
1160 0.99f * aec->overdrive_scaling + 0.01f * aec->overDrive; | 1163 0.99f * aec->overdrive_scaling + 0.01f * aec->overDrive; |
1161 } else { | 1164 } else { |
1162 aec->overdrive_scaling = | 1165 aec->overdrive_scaling = |
1163 0.9f * aec->overdrive_scaling + 0.1f * aec->overDrive; | 1166 0.9f * aec->overdrive_scaling + 0.1f * aec->overDrive; |
1164 } | 1167 } |
1165 | 1168 |
1166 WebRtcAec_OverdriveAndSuppress(aec->overdrive_scaling, hNl, hNlFb, efw); | 1169 WebRtcAec_Overdrive(aec->overdrive_scaling, hNlFb, hNl); |
1170 WebRtcAec_Suppress(hNl, efw); | |
1167 | 1171 |
1168 // Add comfort noise. | 1172 // Add comfort noise. |
1169 ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl); | 1173 ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl); |
1170 | 1174 |
1171 // Inverse error fft. | 1175 // Inverse error fft. |
1172 ScaledInverseFft(efw, fft, 2.0f, 1); | 1176 ScaledInverseFft(efw, fft, 2.0f, 1); |
1173 | 1177 |
1174 // Overlap and add to obtain output. | 1178 // Overlap and add to obtain output. |
1175 for (i = 0; i < PART_LEN; i++) { | 1179 for (i = 0; i < PART_LEN; i++) { |
1176 output[i] = (fft[i] * WebRtcAec_sqrtHanning[i] + | 1180 output[i] = (fft[i] * WebRtcAec_sqrtHanning[i] + |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1484 WebRtc_set_lookahead(aec->delay_estimator, kLookaheadBlocks); | 1488 WebRtc_set_lookahead(aec->delay_estimator, kLookaheadBlocks); |
1485 #endif | 1489 #endif |
1486 aec->extended_filter_enabled = 0; | 1490 aec->extended_filter_enabled = 0; |
1487 aec->aec3_enabled = 0; | 1491 aec->aec3_enabled = 0; |
1488 aec->refined_adaptive_filter_enabled = false; | 1492 aec->refined_adaptive_filter_enabled = false; |
1489 | 1493 |
1490 // Assembly optimization | 1494 // Assembly optimization |
1491 WebRtcAec_FilterFar = FilterFar; | 1495 WebRtcAec_FilterFar = FilterFar; |
1492 WebRtcAec_ScaleErrorSignal = ScaleErrorSignal; | 1496 WebRtcAec_ScaleErrorSignal = ScaleErrorSignal; |
1493 WebRtcAec_FilterAdaptation = FilterAdaptation; | 1497 WebRtcAec_FilterAdaptation = FilterAdaptation; |
1494 WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppress; | 1498 WebRtcAec_Overdrive = Overdrive; |
1499 WebRtcAec_Suppress = Suppress; | |
1495 WebRtcAec_ComputeCoherence = ComputeCoherence; | 1500 WebRtcAec_ComputeCoherence = ComputeCoherence; |
1496 WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectra; | 1501 WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectra; |
1497 WebRtcAec_StoreAsComplex = StoreAsComplex; | 1502 WebRtcAec_StoreAsComplex = StoreAsComplex; |
1498 WebRtcAec_PartitionDelay = PartitionDelay; | 1503 WebRtcAec_PartitionDelay = PartitionDelay; |
1499 WebRtcAec_WindowData = WindowData; | 1504 WebRtcAec_WindowData = WindowData; |
1500 | 1505 |
1501 #if defined(WEBRTC_ARCH_X86_FAMILY) | 1506 #if defined(WEBRTC_ARCH_X86_FAMILY) |
1502 if (WebRtc_GetCPUInfo(kSSE2)) { | 1507 if (WebRtc_GetCPUInfo(kSSE2)) { |
1503 WebRtcAec_InitAec_SSE2(); | 1508 WebRtcAec_InitAec_SSE2(); |
1504 } | 1509 } |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1991 | 1996 |
1992 int WebRtcAec_system_delay(AecCore* self) { | 1997 int WebRtcAec_system_delay(AecCore* self) { |
1993 return self->system_delay; | 1998 return self->system_delay; |
1994 } | 1999 } |
1995 | 2000 |
1996 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { | 2001 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { |
1997 assert(delay >= 0); | 2002 assert(delay >= 0); |
1998 self->system_delay = delay; | 2003 self->system_delay = delay; |
1999 } | 2004 } |
2000 } // namespace webrtc | 2005 } // namespace webrtc |
OLD | NEW |