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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 {0.92f, 0.08f}}; | 124 {0.92f, 0.08f}}; |
125 const float WebRtcAec_kNormalSmoothingCoefficients[2][2] = {{0.9f, 0.1f}, | 125 const float WebRtcAec_kNormalSmoothingCoefficients[2][2] = {{0.9f, 0.1f}, |
126 {0.93f, 0.07f}}; | 126 {0.93f, 0.07f}}; |
127 | 127 |
128 // Number of partitions forming the NLP's "preferred" bands. | 128 // Number of partitions forming the NLP's "preferred" bands. |
129 enum { kPrefBandSize = 24 }; | 129 enum { kPrefBandSize = 24 }; |
130 | 130 |
131 WebRtcAecFilterFar WebRtcAec_FilterFar; | 131 WebRtcAecFilterFar WebRtcAec_FilterFar; |
132 WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal; | 132 WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal; |
133 WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation; | 133 WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation; |
134 WebRtcAecOverdriveAndSuppress WebRtcAec_OverdriveAndSuppress; | 134 WebRtcAecOverdrive WebRtcAec_Overdrive; |
| 135 WebRtcAecSuppress WebRtcAec_Suppress; |
135 WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence; | 136 WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence; |
136 WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra; | 137 WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra; |
137 WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex; | 138 WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex; |
138 WebRtcAecPartitionDelay WebRtcAec_PartitionDelay; | 139 WebRtcAecPartitionDelay WebRtcAec_PartitionDelay; |
139 WebRtcAecWindowData WebRtcAec_WindowData; | 140 WebRtcAecWindowData WebRtcAec_WindowData; |
140 | 141 |
141 __inline static float MulRe(float aRe, float aIm, float bRe, float bIm) { | 142 __inline static float MulRe(float aRe, float aIm, float bRe, float bIm) { |
142 return aRe * bRe - aIm * bIm; | 143 return aRe * bRe - aIm * bIm; |
143 } | 144 } |
144 | 145 |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 h_fft_buf[0][pos] += fft[0]; | 301 h_fft_buf[0][pos] += fft[0]; |
301 h_fft_buf[0][pos + PART_LEN] += fft[1]; | 302 h_fft_buf[0][pos + PART_LEN] += fft[1]; |
302 | 303 |
303 for (j = 1; j < PART_LEN; j++) { | 304 for (j = 1; j < PART_LEN; j++) { |
304 h_fft_buf[0][pos + j] += fft[2 * j]; | 305 h_fft_buf[0][pos + j] += fft[2 * j]; |
305 h_fft_buf[1][pos + j] += fft[2 * j + 1]; | 306 h_fft_buf[1][pos + j] += fft[2 * j + 1]; |
306 } | 307 } |
307 } | 308 } |
308 } | 309 } |
309 | 310 |
310 static void OverdriveAndSuppress(float overdrive_scaling, | 311 static void Overdrive(float overdrive_scaling, |
311 float hNl[PART_LEN1], | 312 const float hNlFb, |
312 const float hNlFb, | 313 float hNl[PART_LEN1]) { |
313 float efw[2][PART_LEN1]) { | 314 for (int i = 0; i < PART_LEN1; ++i) { |
314 int i; | |
315 for (i = 0; i < PART_LEN1; i++) { | |
316 // Weight subbands | 315 // Weight subbands |
317 if (hNl[i] > hNlFb) { | 316 if (hNl[i] > hNlFb) { |
318 hNl[i] = WebRtcAec_weightCurve[i] * hNlFb + | 317 hNl[i] = WebRtcAec_weightCurve[i] * hNlFb + |
319 (1 - WebRtcAec_weightCurve[i]) * hNl[i]; | 318 (1 - WebRtcAec_weightCurve[i]) * hNl[i]; |
320 } | 319 } |
321 hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]); | 320 hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]); |
| 321 } |
| 322 } |
322 | 323 |
| 324 static void Suppress(const float hNl[PART_LEN1], float efw[2][PART_LEN1]) { |
| 325 for (int i = 0; i < PART_LEN1; ++i) { |
323 // Suppress error signal | 326 // Suppress error signal |
324 efw[0][i] *= hNl[i]; | 327 efw[0][i] *= hNl[i]; |
325 efw[1][i] *= hNl[i]; | 328 efw[1][i] *= hNl[i]; |
326 | 329 |
327 // Ooura fft returns incorrect sign on imaginary component. It matters here | 330 // Ooura fft returns incorrect sign on imaginary component. It matters here |
328 // because we are making an additive change with comfort noise. | 331 // because we are making an additive change with comfort noise. |
329 efw[1][i] *= -1; | 332 efw[1][i] *= -1; |
330 } | 333 } |
331 } | 334 } |
332 | 335 |
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 | 1153 |
1151 // Smooth the overdrive. | 1154 // Smooth the overdrive. |
1152 if (aec->overDrive < aec->overdrive_scaling) { | 1155 if (aec->overDrive < aec->overdrive_scaling) { |
1153 aec->overdrive_scaling = | 1156 aec->overdrive_scaling = |
1154 0.99f * aec->overdrive_scaling + 0.01f * aec->overDrive; | 1157 0.99f * aec->overdrive_scaling + 0.01f * aec->overDrive; |
1155 } else { | 1158 } else { |
1156 aec->overdrive_scaling = | 1159 aec->overdrive_scaling = |
1157 0.9f * aec->overdrive_scaling + 0.1f * aec->overDrive; | 1160 0.9f * aec->overdrive_scaling + 0.1f * aec->overDrive; |
1158 } | 1161 } |
1159 | 1162 |
1160 WebRtcAec_OverdriveAndSuppress(aec->overdrive_scaling, hNl, hNlFb, efw); | 1163 WebRtcAec_Overdrive(aec->overdrive_scaling, hNlFb, hNl); |
| 1164 WebRtcAec_Suppress(hNl, efw); |
1161 | 1165 |
1162 // Add comfort noise. | 1166 // Add comfort noise. |
1163 ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl); | 1167 ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl); |
1164 | 1168 |
1165 // Inverse error fft. | 1169 // Inverse error fft. |
1166 ScaledInverseFft(efw, fft, 2.0f, 1); | 1170 ScaledInverseFft(efw, fft, 2.0f, 1); |
1167 | 1171 |
1168 // Overlap and add to obtain output. | 1172 // Overlap and add to obtain output. |
1169 for (i = 0; i < PART_LEN; i++) { | 1173 for (i = 0; i < PART_LEN; i++) { |
1170 output[i] = (fft[i] * WebRtcAec_sqrtHanning[i] + | 1174 output[i] = (fft[i] * WebRtcAec_sqrtHanning[i] + |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 WebRtc_set_lookahead(aec->delay_estimator, kLookaheadBlocks); | 1474 WebRtc_set_lookahead(aec->delay_estimator, kLookaheadBlocks); |
1471 #endif | 1475 #endif |
1472 aec->extended_filter_enabled = 0; | 1476 aec->extended_filter_enabled = 0; |
1473 aec->aec3_enabled = 0; | 1477 aec->aec3_enabled = 0; |
1474 aec->refined_adaptive_filter_enabled = false; | 1478 aec->refined_adaptive_filter_enabled = false; |
1475 | 1479 |
1476 // Assembly optimization | 1480 // Assembly optimization |
1477 WebRtcAec_FilterFar = FilterFar; | 1481 WebRtcAec_FilterFar = FilterFar; |
1478 WebRtcAec_ScaleErrorSignal = ScaleErrorSignal; | 1482 WebRtcAec_ScaleErrorSignal = ScaleErrorSignal; |
1479 WebRtcAec_FilterAdaptation = FilterAdaptation; | 1483 WebRtcAec_FilterAdaptation = FilterAdaptation; |
1480 WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppress; | 1484 WebRtcAec_Overdrive = Overdrive; |
| 1485 WebRtcAec_Suppress = Suppress; |
1481 WebRtcAec_ComputeCoherence = ComputeCoherence; | 1486 WebRtcAec_ComputeCoherence = ComputeCoherence; |
1482 WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectra; | 1487 WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectra; |
1483 WebRtcAec_StoreAsComplex = StoreAsComplex; | 1488 WebRtcAec_StoreAsComplex = StoreAsComplex; |
1484 WebRtcAec_PartitionDelay = PartitionDelay; | 1489 WebRtcAec_PartitionDelay = PartitionDelay; |
1485 WebRtcAec_WindowData = WindowData; | 1490 WebRtcAec_WindowData = WindowData; |
1486 | 1491 |
1487 #if defined(WEBRTC_ARCH_X86_FAMILY) | 1492 #if defined(WEBRTC_ARCH_X86_FAMILY) |
1488 if (WebRtc_GetCPUInfo(kSSE2)) { | 1493 if (WebRtc_GetCPUInfo(kSSE2)) { |
1489 WebRtcAec_InitAec_SSE2(); | 1494 WebRtcAec_InitAec_SSE2(); |
1490 } | 1495 } |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1951 | 1956 |
1952 int WebRtcAec_system_delay(AecCore* self) { | 1957 int WebRtcAec_system_delay(AecCore* self) { |
1953 return self->system_delay; | 1958 return self->system_delay; |
1954 } | 1959 } |
1955 | 1960 |
1956 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { | 1961 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { |
1957 assert(delay >= 0); | 1962 assert(delay >= 0); |
1958 self->system_delay = delay; | 1963 self->system_delay = delay; |
1959 } | 1964 } |
1960 } // namespace webrtc | 1965 } // namespace webrtc |
OLD | NEW |