OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 |
11 #include "webrtc/modules/audio_processing/aecm/aecm_core.h" | 11 #include "webrtc/modules/audio_processing/aecm/aecm_core.h" |
12 | 12 |
13 #include <assert.h> | 13 #include "webrtc/base/checks.h" |
14 | |
15 #include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h" | 14 #include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h" |
16 #include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h" | 15 #include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h" |
17 | 16 |
18 static const ALIGN8_BEG int16_t WebRtcAecm_kSqrtHanning[] ALIGN8_END = { | 17 static const ALIGN8_BEG int16_t WebRtcAecm_kSqrtHanning[] ALIGN8_END = { |
19 0, 399, 798, 1196, 1594, 1990, 2386, 2780, 3172, | 18 0, 399, 798, 1196, 1594, 1990, 2386, 2780, 3172, |
20 3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224, | 19 3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224, |
21 6591, 6954, 7313, 7668, 8019, 8364, 8705, 9040, | 20 6591, 6954, 7313, 7668, 8019, 8364, 8705, 9040, |
22 9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514, | 21 9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514, |
23 11795, 12068, 12335, 12594, 12845, 13089, 13325, 13553, | 22 11795, 12068, 12335, 12594, 12845, 13089, 13325, 13553, |
24 13773, 13985, 14189, 14384, 14571, 14749, 14918, 15079, | 23 13773, 13985, 14189, 14384, 14571, 14749, 14918, 15079, |
(...skipping 963 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 echoEst32Gained = WEBRTC_SPL_UMUL_32_16( | 987 echoEst32Gained = WEBRTC_SPL_UMUL_32_16( |
989 (uint32_t)aecm->echoFilt[i], | 988 (uint32_t)aecm->echoFilt[i], |
990 supGain >> tmp16no1); | 989 supGain >> tmp16no1); |
991 } else { | 990 } else { |
992 // Result in Q-(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN-16) | 991 // Result in Q-(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN-16) |
993 echoEst32Gained = (aecm->echoFilt[i] >> tmp16no1) * supGain; | 992 echoEst32Gained = (aecm->echoFilt[i] >> tmp16no1) * supGain; |
994 } | 993 } |
995 } | 994 } |
996 | 995 |
997 zeros16 = WebRtcSpl_NormW16(aecm->nearFilt[i]); | 996 zeros16 = WebRtcSpl_NormW16(aecm->nearFilt[i]); |
998 assert(zeros16 >= 0); // |zeros16| is a norm, hence non-negative. | 997 RTC_DCHECK_GE(zeros16, 0); // |zeros16| is a norm, hence non-negative. |
999 dfa_clean_q_domain_diff = aecm->dfaCleanQDomain - aecm->dfaCleanQDomainOld; | 998 dfa_clean_q_domain_diff = aecm->dfaCleanQDomain - aecm->dfaCleanQDomainOld; |
1000 if (zeros16 < dfa_clean_q_domain_diff && aecm->nearFilt[i]) { | 999 if (zeros16 < dfa_clean_q_domain_diff && aecm->nearFilt[i]) { |
1001 tmp16no1 = aecm->nearFilt[i] << zeros16; | 1000 tmp16no1 = aecm->nearFilt[i] << zeros16; |
1002 qDomainDiff = zeros16 - dfa_clean_q_domain_diff; | 1001 qDomainDiff = zeros16 - dfa_clean_q_domain_diff; |
1003 tmp16no2 = ptrDfaClean[i] >> -qDomainDiff; | 1002 tmp16no2 = ptrDfaClean[i] >> -qDomainDiff; |
1004 } else { | 1003 } else { |
1005 tmp16no1 = dfa_clean_q_domain_diff < 0 | 1004 tmp16no1 = dfa_clean_q_domain_diff < 0 |
1006 ? aecm->nearFilt[i] >> -dfa_clean_q_domain_diff | 1005 ? aecm->nearFilt[i] >> -dfa_clean_q_domain_diff |
1007 : aecm->nearFilt[i] << dfa_clean_q_domain_diff; | 1006 : aecm->nearFilt[i] << dfa_clean_q_domain_diff; |
1008 qDomainDiff = 0; | 1007 qDomainDiff = 0; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 : [temp1] "=&r" (temp1), [ptr1] "+r" (ptr1) | 1111 : [temp1] "=&r" (temp1), [ptr1] "+r" (ptr1) |
1113 : | 1112 : |
1114 : "memory", "hi", "lo" | 1113 : "memory", "hi", "lo" |
1115 ); | 1114 ); |
1116 } | 1115 } |
1117 | 1116 |
1118 for (i = kMinPrefBand; i <= kMaxPrefBand; i++) { | 1117 for (i = kMinPrefBand; i <= kMaxPrefBand; i++) { |
1119 avgHnl32 += (int32_t)hnl[i]; | 1118 avgHnl32 += (int32_t)hnl[i]; |
1120 } | 1119 } |
1121 | 1120 |
1122 assert(kMaxPrefBand - kMinPrefBand + 1 > 0); | 1121 RTC_DCHECK_GT(kMaxPrefBand - kMinPrefBand + 1, 0); |
1123 avgHnl32 /= (kMaxPrefBand - kMinPrefBand + 1); | 1122 avgHnl32 /= (kMaxPrefBand - kMinPrefBand + 1); |
1124 | 1123 |
1125 for (i = kMaxPrefBand; i < PART_LEN1; i++) { | 1124 for (i = kMaxPrefBand; i < PART_LEN1; i++) { |
1126 if (hnl[i] > (int16_t)avgHnl32) { | 1125 if (hnl[i] > (int16_t)avgHnl32) { |
1127 hnl[i] = (int16_t)avgHnl32; | 1126 hnl[i] = (int16_t)avgHnl32; |
1128 } | 1127 } |
1129 } | 1128 } |
1130 } | 1129 } |
1131 | 1130 |
1132 // Calculate NLP gain, result is in Q14 | 1131 // Calculate NLP gain, result is in Q14 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1264 const int32_t c114 = ONE_Q14; | 1263 const int32_t c114 = ONE_Q14; |
1265 | 1264 |
1266 int16_t randW16[PART_LEN]; | 1265 int16_t randW16[PART_LEN]; |
1267 int16_t uReal[PART_LEN1]; | 1266 int16_t uReal[PART_LEN1]; |
1268 int16_t uImag[PART_LEN1]; | 1267 int16_t uImag[PART_LEN1]; |
1269 int32_t outLShift32; | 1268 int32_t outLShift32; |
1270 | 1269 |
1271 int16_t shiftFromNearToNoise = kNoiseEstQDomain - aecm->dfaCleanQDomain; | 1270 int16_t shiftFromNearToNoise = kNoiseEstQDomain - aecm->dfaCleanQDomain; |
1272 int16_t minTrackShift = 9; | 1271 int16_t minTrackShift = 9; |
1273 | 1272 |
1274 assert(shiftFromNearToNoise >= 0); | 1273 RTC_DCHECK_GE(shiftFromNearToNoise, 0); |
1275 assert(shiftFromNearToNoise < 16); | 1274 RTC_DCHECK_LT(shiftFromNearToNoise, 16); |
1276 | 1275 |
1277 if (aecm->noiseEstCtr < 100) { | 1276 if (aecm->noiseEstCtr < 100) { |
1278 // Track the minimum more quickly initially. | 1277 // Track the minimum more quickly initially. |
1279 aecm->noiseEstCtr++; | 1278 aecm->noiseEstCtr++; |
1280 minTrackShift = 6; | 1279 minTrackShift = 6; |
1281 } | 1280 } |
1282 | 1281 |
1283 // Generate a uniform random array on [0 2^15-1]. | 1282 // Generate a uniform random array on [0 2^15-1]. |
1284 WebRtcSpl_RandUArray(randW16, PART_LEN, &aecm->seed); | 1283 WebRtcSpl_RandUArray(randW16, PART_LEN, &aecm->seed); |
1285 int16_t* randW16p = (int16_t*)randW16; | 1284 int16_t* randW16p = (int16_t*)randW16; |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 sgn = ((int)tt) >> 31; | 1555 sgn = ((int)tt) >> 31; |
1557 out[i].imag = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn); | 1556 out[i].imag = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn); |
1558 } | 1557 } |
1559 tt = out[PART_LEN].real + uReal[PART_LEN]; | 1558 tt = out[PART_LEN].real + uReal[PART_LEN]; |
1560 sgn = ((int)tt) >> 31; | 1559 sgn = ((int)tt) >> 31; |
1561 out[PART_LEN].real = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn); | 1560 out[PART_LEN].real = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn); |
1562 tt = out[PART_LEN].imag; | 1561 tt = out[PART_LEN].imag; |
1563 sgn = ((int)tt) >> 31; | 1562 sgn = ((int)tt) >> 31; |
1564 out[PART_LEN].imag = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn); | 1563 out[PART_LEN].imag = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn); |
1565 } | 1564 } |
OLD | NEW |