| 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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 h_fft_buf[0][pos] += fft[0]; | 300 h_fft_buf[0][pos] += fft[0]; |
| 301 h_fft_buf[0][pos + PART_LEN] += fft[1]; | 301 h_fft_buf[0][pos + PART_LEN] += fft[1]; |
| 302 | 302 |
| 303 for (j = 1; j < PART_LEN; j++) { | 303 for (j = 1; j < PART_LEN; j++) { |
| 304 h_fft_buf[0][pos + j] += fft[2 * j]; | 304 h_fft_buf[0][pos + j] += fft[2 * j]; |
| 305 h_fft_buf[1][pos + j] += fft[2 * j + 1]; | 305 h_fft_buf[1][pos + j] += fft[2 * j + 1]; |
| 306 } | 306 } |
| 307 } | 307 } |
| 308 } | 308 } |
| 309 | 309 |
| 310 static void OverdriveAndSuppress(AecCore* aec, | 310 static void OverdriveAndSuppress(float overdrive_scaling, |
| 311 float hNl[PART_LEN1], | 311 float hNl[PART_LEN1], |
| 312 const float hNlFb, | 312 const float hNlFb, |
| 313 float efw[2][PART_LEN1]) { | 313 float efw[2][PART_LEN1]) { |
| 314 int i; | 314 int i; |
| 315 for (i = 0; i < PART_LEN1; i++) { | 315 for (i = 0; i < PART_LEN1; i++) { |
| 316 // Weight subbands | 316 // Weight subbands |
| 317 if (hNl[i] > hNlFb) { | 317 if (hNl[i] > hNlFb) { |
| 318 hNl[i] = WebRtcAec_weightCurve[i] * hNlFb + | 318 hNl[i] = WebRtcAec_weightCurve[i] * hNlFb + |
| 319 (1 - WebRtcAec_weightCurve[i]) * hNl[i]; | 319 (1 - WebRtcAec_weightCurve[i]) * hNl[i]; |
| 320 } | 320 } |
| 321 hNl[i] = powf(hNl[i], aec->overDriveSm * WebRtcAec_overDriveCurve[i]); | 321 hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]); |
| 322 | 322 |
| 323 // Suppress error signal | 323 // Suppress error signal |
| 324 efw[0][i] *= hNl[i]; | 324 efw[0][i] *= hNl[i]; |
| 325 efw[1][i] *= hNl[i]; | 325 efw[1][i] *= hNl[i]; |
| 326 | 326 |
| 327 // Ooura fft returns incorrect sign on imaginary component. It matters here | 327 // Ooura fft returns incorrect sign on imaginary component. It matters here |
| 328 // because we are making an additive change with comfort noise. | 328 // because we are making an additive change with comfort noise. |
| 329 efw[1][i] *= -1; | 329 efw[1][i] *= -1; |
| 330 } | 330 } |
| 331 } | 331 } |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 if (aec->hNlMinCtr == 2) { | 1138 if (aec->hNlMinCtr == 2) { |
| 1139 aec->hNlNewMin = 0; | 1139 aec->hNlNewMin = 0; |
| 1140 aec->hNlMinCtr = 0; | 1140 aec->hNlMinCtr = 0; |
| 1141 aec->overDrive = | 1141 aec->overDrive = |
| 1142 WEBRTC_SPL_MAX(kTargetSupp[aec->nlp_mode] / | 1142 WEBRTC_SPL_MAX(kTargetSupp[aec->nlp_mode] / |
| 1143 static_cast<float>(log(aec->hNlFbMin + 1e-10f) + 1e-10f), | 1143 static_cast<float>(log(aec->hNlFbMin + 1e-10f) + 1e-10f), |
| 1144 min_overdrive[aec->nlp_mode]); | 1144 min_overdrive[aec->nlp_mode]); |
| 1145 } | 1145 } |
| 1146 | 1146 |
| 1147 // Smooth the overdrive. | 1147 // Smooth the overdrive. |
| 1148 if (aec->overDrive < aec->overDriveSm) { | 1148 if (aec->overDrive < aec->overdrive_scaling) { |
| 1149 aec->overDriveSm = 0.99f * aec->overDriveSm + 0.01f * aec->overDrive; | 1149 aec->overdrive_scaling = |
| 1150 0.99f * aec->overdrive_scaling + 0.01f * aec->overDrive; |
| 1150 } else { | 1151 } else { |
| 1151 aec->overDriveSm = 0.9f * aec->overDriveSm + 0.1f * aec->overDrive; | 1152 aec->overdrive_scaling = |
| 1153 0.9f * aec->overdrive_scaling + 0.1f * aec->overDrive; |
| 1152 } | 1154 } |
| 1153 | 1155 |
| 1154 WebRtcAec_OverdriveAndSuppress(aec, hNl, hNlFb, efw); | 1156 WebRtcAec_OverdriveAndSuppress(aec->overdrive_scaling, hNl, hNlFb, efw); |
| 1155 | 1157 |
| 1156 // Add comfort noise. | 1158 // Add comfort noise. |
| 1157 WebRtcAec_ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl); | 1159 WebRtcAec_ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl); |
| 1158 | 1160 |
| 1159 // Inverse error fft. | 1161 // Inverse error fft. |
| 1160 ScaledInverseFft(efw, fft, 2.0f, 1); | 1162 ScaledInverseFft(efw, fft, 2.0f, 1); |
| 1161 | 1163 |
| 1162 // Overlap and add to obtain output. | 1164 // Overlap and add to obtain output. |
| 1163 for (i = 0; i < PART_LEN; i++) { | 1165 for (i = 0; i < PART_LEN; i++) { |
| 1164 output[i] = (fft[i] * WebRtcAec_sqrtHanning[i] + | 1166 output[i] = (fft[i] * WebRtcAec_sqrtHanning[i] + |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1680 | 1682 |
| 1681 memset(aec->hNs, 0, sizeof(aec->hNs)); | 1683 memset(aec->hNs, 0, sizeof(aec->hNs)); |
| 1682 memset(aec->outBuf, 0, sizeof(float) * PART_LEN); | 1684 memset(aec->outBuf, 0, sizeof(float) * PART_LEN); |
| 1683 | 1685 |
| 1684 aec->hNlFbMin = 1; | 1686 aec->hNlFbMin = 1; |
| 1685 aec->hNlFbLocalMin = 1; | 1687 aec->hNlFbLocalMin = 1; |
| 1686 aec->hNlXdAvgMin = 1; | 1688 aec->hNlXdAvgMin = 1; |
| 1687 aec->hNlNewMin = 0; | 1689 aec->hNlNewMin = 0; |
| 1688 aec->hNlMinCtr = 0; | 1690 aec->hNlMinCtr = 0; |
| 1689 aec->overDrive = 2; | 1691 aec->overDrive = 2; |
| 1690 aec->overDriveSm = 2; | 1692 aec->overdrive_scaling = 2; |
| 1691 aec->delayIdx = 0; | 1693 aec->delayIdx = 0; |
| 1692 aec->stNearState = 0; | 1694 aec->stNearState = 0; |
| 1693 aec->echoState = 0; | 1695 aec->echoState = 0; |
| 1694 aec->divergeState = 0; | 1696 aec->divergeState = 0; |
| 1695 | 1697 |
| 1696 aec->seed = 777; | 1698 aec->seed = 777; |
| 1697 aec->delayEstCtr = 0; | 1699 aec->delayEstCtr = 0; |
| 1698 | 1700 |
| 1699 aec->extreme_filter_divergence = 0; | 1701 aec->extreme_filter_divergence = 0; |
| 1700 | 1702 |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1945 | 1947 |
| 1946 int WebRtcAec_system_delay(AecCore* self) { | 1948 int WebRtcAec_system_delay(AecCore* self) { |
| 1947 return self->system_delay; | 1949 return self->system_delay; |
| 1948 } | 1950 } |
| 1949 | 1951 |
| 1950 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { | 1952 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { |
| 1951 assert(delay >= 0); | 1953 assert(delay >= 0); |
| 1952 self->system_delay = delay; | 1954 self->system_delay = delay; |
| 1953 } | 1955 } |
| 1954 } // namespace webrtc | 1956 } // namespace webrtc |
| OLD | NEW |