| 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 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 // Suppress error signal | 322 // Suppress error signal |
| 323 efw[0][i] *= hNl[i]; | 323 efw[0][i] *= hNl[i]; |
| 324 efw[1][i] *= hNl[i]; | 324 efw[1][i] *= hNl[i]; |
| 325 | 325 |
| 326 // Ooura fft returns incorrect sign on imaginary component. It matters here | 326 // Ooura fft returns incorrect sign on imaginary component. It matters here |
| 327 // because we are making an additive change with comfort noise. | 327 // because we are making an additive change with comfort noise. |
| 328 efw[1][i] *= -1; | 328 efw[1][i] *= -1; |
| 329 } | 329 } |
| 330 } | 330 } |
| 331 | 331 |
| 332 static int PartitionDelay(const AecCore* aec) { | 332 static int PartitionDelay(int num_partitions, |
| 333 float h_fft_buf[2] |
| 334 [kExtendedNumPartitions * PART_LEN1]) { |
| 333 // Measures the energy in each filter partition and returns the partition with | 335 // Measures the energy in each filter partition and returns the partition with |
| 334 // highest energy. | 336 // highest energy. |
| 335 // TODO(bjornv): Spread computational cost by computing one partition per | 337 // TODO(bjornv): Spread computational cost by computing one partition per |
| 336 // block? | 338 // block? |
| 337 float wfEnMax = 0; | 339 float wfEnMax = 0; |
| 338 int i; | 340 int i; |
| 339 int delay = 0; | 341 int delay = 0; |
| 340 | 342 |
| 341 for (i = 0; i < aec->num_partitions; i++) { | 343 for (i = 0; i < num_partitions; i++) { |
| 342 int j; | 344 int j; |
| 343 int pos = i * PART_LEN1; | 345 int pos = i * PART_LEN1; |
| 344 float wfEn = 0; | 346 float wfEn = 0; |
| 345 for (j = 0; j < PART_LEN1; j++) { | 347 for (j = 0; j < PART_LEN1; j++) { |
| 346 wfEn += aec->wfBuf[0][pos + j] * aec->wfBuf[0][pos + j] + | 348 wfEn += h_fft_buf[0][pos + j] * h_fft_buf[0][pos + j] + |
| 347 aec->wfBuf[1][pos + j] * aec->wfBuf[1][pos + j]; | 349 h_fft_buf[1][pos + j] * h_fft_buf[1][pos + j]; |
| 348 } | 350 } |
| 349 | 351 |
| 350 if (wfEn > wfEnMax) { | 352 if (wfEn > wfEnMax) { |
| 351 wfEnMax = wfEn; | 353 wfEnMax = wfEn; |
| 352 delay = i; | 354 delay = i; |
| 353 } | 355 } |
| 354 } | 356 } |
| 355 return delay; | 357 return delay; |
| 356 } | 358 } |
| 357 | 359 |
| (...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1046 WindowData(fft, farend); | 1048 WindowData(fft, farend); |
| 1047 Fft(fft, xfw); | 1049 Fft(fft, xfw); |
| 1048 xfw_ptr = &xfw[0][0]; | 1050 xfw_ptr = &xfw[0][0]; |
| 1049 | 1051 |
| 1050 // Buffer far. | 1052 // Buffer far. |
| 1051 memcpy(aec->xfwBuf, xfw_ptr, sizeof(float) * 2 * PART_LEN1); | 1053 memcpy(aec->xfwBuf, xfw_ptr, sizeof(float) * 2 * PART_LEN1); |
| 1052 | 1054 |
| 1053 aec->delayEstCtr++; | 1055 aec->delayEstCtr++; |
| 1054 if (aec->delayEstCtr == delayEstInterval) { | 1056 if (aec->delayEstCtr == delayEstInterval) { |
| 1055 aec->delayEstCtr = 0; | 1057 aec->delayEstCtr = 0; |
| 1056 aec->delayIdx = WebRtcAec_PartitionDelay(aec); | 1058 aec->delayIdx = WebRtcAec_PartitionDelay(aec->num_partitions, aec->wfBuf); |
| 1057 } | 1059 } |
| 1058 | 1060 |
| 1059 // Use delayed far. | 1061 // Use delayed far. |
| 1060 memcpy(xfw, aec->xfwBuf + aec->delayIdx * PART_LEN1, | 1062 memcpy(xfw, aec->xfwBuf + aec->delayIdx * PART_LEN1, |
| 1061 sizeof(xfw[0][0]) * 2 * PART_LEN1); | 1063 sizeof(xfw[0][0]) * 2 * PART_LEN1); |
| 1062 | 1064 |
| 1063 WebRtcAec_SubbandCoherence(aec->mult, aec->extended_filter_enabled == 1, efw, | 1065 WebRtcAec_SubbandCoherence(aec->mult, aec->extended_filter_enabled == 1, efw, |
| 1064 dfw, xfw, fft, cohde, cohxd, &aec->coherence_state, | 1066 dfw, xfw, fft, cohde, cohxd, &aec->coherence_state, |
| 1065 &aec->divergeState, | 1067 &aec->divergeState, |
| 1066 &aec->extreme_filter_divergence); | 1068 &aec->extreme_filter_divergence); |
| (...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1958 | 1960 |
| 1959 int WebRtcAec_system_delay(AecCore* self) { | 1961 int WebRtcAec_system_delay(AecCore* self) { |
| 1960 return self->system_delay; | 1962 return self->system_delay; |
| 1961 } | 1963 } |
| 1962 | 1964 |
| 1963 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { | 1965 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { |
| 1964 assert(delay >= 0); | 1966 assert(delay >= 0); |
| 1965 self->system_delay = delay; | 1967 self->system_delay = delay; |
| 1966 } | 1968 } |
| 1967 } // namespace webrtc | 1969 } // namespace webrtc |
| OLD | NEW |