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 30 matching lines...) Expand all Loading... |
41 /* | 41 /* |
42 y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] | 42 y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] |
43 + (-a[1])*y[i-1] + (-a[2])*y[i-2]; | 43 + (-a[1])*y[i-1] + (-a[2])*y[i-2]; |
44 */ | 44 */ |
45 | 45 |
46 tmpW32 = y[1] * ba[3]; /* (-a[1])*y[i-1] (low part) */ | 46 tmpW32 = y[1] * ba[3]; /* (-a[1])*y[i-1] (low part) */ |
47 tmpW32 += y[3] * ba[4]; /* (-a[2])*y[i-2] (low part) */ | 47 tmpW32 += y[3] * ba[4]; /* (-a[2])*y[i-2] (low part) */ |
48 tmpW32 = (tmpW32>>15); | 48 tmpW32 = (tmpW32>>15); |
49 tmpW32 += y[0] * ba[3]; /* (-a[1])*y[i-1] (high part) */ | 49 tmpW32 += y[0] * ba[3]; /* (-a[1])*y[i-1] (high part) */ |
50 tmpW32 += y[2] * ba[4]; /* (-a[2])*y[i-2] (high part) */ | 50 tmpW32 += y[2] * ba[4]; /* (-a[2])*y[i-2] (high part) */ |
51 tmpW32 = (tmpW32<<1); | 51 tmpW32 *= 2; |
52 | 52 |
53 tmpW32 += signal[i] * ba[0]; /* b[0]*x[0] */ | 53 tmpW32 += signal[i] * ba[0]; /* b[0]*x[0] */ |
54 tmpW32 += x[0] * ba[1]; /* b[1]*x[i-1] */ | 54 tmpW32 += x[0] * ba[1]; /* b[1]*x[i-1] */ |
55 tmpW32 += x[1] * ba[2]; /* b[2]*x[i-2] */ | 55 tmpW32 += x[1] * ba[2]; /* b[2]*x[i-2] */ |
56 | 56 |
57 /* Update state (input part) */ | 57 /* Update state (input part) */ |
58 x[1] = x[0]; | 58 x[1] = x[0]; |
59 x[0] = signal[i]; | 59 x[0] = signal[i]; |
60 | 60 |
61 /* Rounding in Q(12-1), i.e. add 2^10 */ | 61 /* Rounding in Q(12-1), i.e. add 2^10 */ |
62 tmpW32b = tmpW32 + 1024; | 62 tmpW32b = tmpW32 + 1024; |
63 | 63 |
64 /* Saturate (to 2^26) so that the HP filtered signal does not overflow */ | 64 /* Saturate (to 2^26) so that the HP filtered signal does not overflow */ |
65 tmpW32b = WEBRTC_SPL_SAT((int32_t)67108863, tmpW32b, (int32_t)-67108864); | 65 tmpW32b = WEBRTC_SPL_SAT((int32_t)67108863, tmpW32b, (int32_t)-67108864); |
66 | 66 |
67 /* Convert back to Q0 and multiply with 2 */ | 67 /* Convert back to Q0 and multiply with 2 */ |
68 signal[i] = (int16_t)(tmpW32b >> 11); | 68 signal[i] = (int16_t)(tmpW32b >> 11); |
69 | 69 |
70 /* Update state (filtered part) */ | 70 /* Update state (filtered part) */ |
71 y[2] = y[0]; | 71 y[2] = y[0]; |
72 y[3] = y[1]; | 72 y[3] = y[1]; |
73 | 73 |
74 /* upshift tmpW32 by 3 with saturation */ | 74 /* upshift tmpW32 by 3 with saturation */ |
75 if (tmpW32>268435455) { | 75 if (tmpW32>268435455) { |
76 tmpW32 = WEBRTC_SPL_WORD32_MAX; | 76 tmpW32 = WEBRTC_SPL_WORD32_MAX; |
77 } else if (tmpW32<-268435456) { | 77 } else if (tmpW32<-268435456) { |
78 tmpW32 = WEBRTC_SPL_WORD32_MIN; | 78 tmpW32 = WEBRTC_SPL_WORD32_MIN; |
79 } else { | 79 } else { |
80 tmpW32 <<= 3; | 80 tmpW32 *= 8; |
81 } | 81 } |
82 | 82 |
83 y[0] = (int16_t)(tmpW32 >> 16); | 83 y[0] = (int16_t)(tmpW32 >> 16); |
84 y[1] = (int16_t)((tmpW32 - (y[0] << 16)) >> 1); | 84 y[1] = (int16_t)((tmpW32 & 0xffff) >> 1); |
85 | 85 |
86 } | 86 } |
87 | 87 |
88 return; | 88 return; |
89 } | 89 } |
OLD | NEW |