OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 if (tmpU32no2 < tmpU32no1) { | 182 if (tmpU32no2 < tmpU32no1) { |
183 logApprox = (tmpU32no1 - tmpU32no2) >> (8 - zerosScale); // Q14 | 183 logApprox = (tmpU32no1 - tmpU32no2) >> (8 - zerosScale); // Q14 |
184 } | 184 } |
185 } | 185 } |
186 numFIX = (maxGain * constMaxGain) * (1 << 6); // Q14 | 186 numFIX = (maxGain * constMaxGain) * (1 << 6); // Q14 |
187 numFIX -= (int32_t)logApprox * diffGain; // Q14 | 187 numFIX -= (int32_t)logApprox * diffGain; // Q14 |
188 | 188 |
189 // Calculate ratio | 189 // Calculate ratio |
190 // Shift |numFIX| as much as possible. | 190 // Shift |numFIX| as much as possible. |
191 // Ensure we avoid wrap-around in |den| as well. | 191 // Ensure we avoid wrap-around in |den| as well. |
192 if (numFIX > (den >> 8)) // |den| is Q8. | 192 if (numFIX > (den >> 8) || -numFIX > (den >> 8)) // |den| is Q8. |
193 { | 193 { |
194 zeros = WebRtcSpl_NormW32(numFIX); | 194 zeros = WebRtcSpl_NormW32(numFIX); |
195 } else { | 195 } else { |
196 zeros = WebRtcSpl_NormW32(den) + 8; | 196 zeros = WebRtcSpl_NormW32(den) + 8; |
197 } | 197 } |
198 numFIX *= 1 << zeros; // Q(14+zeros) | 198 numFIX *= 1 << zeros; // Q(14+zeros) |
199 | 199 |
200 // Shift den so we end up in Qy1 | 200 // Shift den so we end up in Qy1 |
201 tmp32no1 = WEBRTC_SPL_SHIFT_W32(den, zeros - 8); // Q(zeros) | 201 tmp32no1 = WEBRTC_SPL_SHIFT_W32(den, zeros - 9); // Q(zeros - 1) |
202 if (numFIX < 0) { | 202 y32 = numFIX / tmp32no1; // in Q15 |
203 numFIX -= tmp32no1 / 2; | 203 y32 = (y32 + (y32 > 0 ? 1 : 0)) >> 1; // This is to do rounding in Q14. |
peah-webrtc
2016/06/03 06:51:12
As far as I know, right-shifting negative numbers
| |
204 } else { | 204 |
205 numFIX += tmp32no1 / 2; | |
206 } | |
207 y32 = numFIX / tmp32no1; // in Q14 | |
208 if (limiterEnable && (i < limiterIdx)) { | 205 if (limiterEnable && (i < limiterIdx)) { |
209 tmp32 = WEBRTC_SPL_MUL_16_U16(i - 1, kLog10_2); // Q14 | 206 tmp32 = WEBRTC_SPL_MUL_16_U16(i - 1, kLog10_2); // Q14 |
210 tmp32 -= limiterLvl * (1 << 14); // Q14 | 207 tmp32 -= limiterLvl * (1 << 14); // Q14 |
211 y32 = WebRtcSpl_DivW32W16(tmp32 + 10, 20); | 208 y32 = WebRtcSpl_DivW32W16(tmp32 + 10, 20); |
212 } | 209 } |
213 if (y32 > 39000) { | 210 if (y32 > 39000) { |
214 tmp32 = (y32 >> 1) * kLog10 + 4096; // in Q27 | 211 tmp32 = (y32 >> 1) * kLog10 + 4096; // in Q27 |
215 tmp32 >>= 13; // In Q14. | 212 tmp32 >>= 13; // In Q14. |
216 } else { | 213 } else { |
217 tmp32 = y32 * kLog10 + 8192; // in Q28 | 214 tmp32 = y32 * kLog10 + 8192; // in Q28 |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
681 // limit | 678 // limit |
682 if (state->logRatio > 2048) { | 679 if (state->logRatio > 2048) { |
683 state->logRatio = 2048; | 680 state->logRatio = 2048; |
684 } | 681 } |
685 if (state->logRatio < -2048) { | 682 if (state->logRatio < -2048) { |
686 state->logRatio = -2048; | 683 state->logRatio = -2048; |
687 } | 684 } |
688 | 685 |
689 return state->logRatio; // Q10 | 686 return state->logRatio; // Q10 |
690 } | 687 } |
OLD | NEW |