1 /*
2 * Copyright (C) 2004-2010 NXP Software
3 * Copyright (C) 2010 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 /**********************************************************************************
19 INCLUDE FILES
20 ***********************************************************************************/
21
22 #include "LVM_Types.h"
23 #include "LVM_Macros.h"
24 #include "VectorArithmetic.h"
25
26 /**********************************************************************************
27 FUNCTION DelayAllPass_32x32
28 ***********************************************************************************/
29
DelayAllPass_Sat_32x16To32(LVM_INT32 * delay,LVM_UINT16 size,LVM_INT16 coeff,LVM_UINT16 DelayOffset,LVM_UINT16 * pAllPassOffset,LVM_INT32 * dst,LVM_INT16 n)30 void DelayAllPass_Sat_32x16To32( LVM_INT32 *delay, /* Delay buffer */
31 LVM_UINT16 size, /* Delay size */
32 LVM_INT16 coeff, /* All pass filter coefficient */
33 LVM_UINT16 DelayOffset, /* Simple delay offset */
34 LVM_UINT16 *pAllPassOffset, /* All pass filter delay offset */
35 LVM_INT32 *dst, /* Source/destination */
36 LVM_INT16 n) /* Number of samples */
37 {
38 LVM_INT16 i;
39 LVM_UINT16 AllPassOffset = *pAllPassOffset;
40 LVM_INT32 temp;
41 LVM_INT32 a,b,c;
42
43 for (i = 0; i < n; i++)
44 {
45
46 MUL32x16INTO32(delay[AllPassOffset], coeff, temp, 15)
47 a = temp;
48 b = delay[DelayOffset];
49 DelayOffset++;
50
51 c = a + b;
52 if ((((c ^ a) & (c ^ b)) >> 31) != 0) /* overflow / underflow */
53 {
54 if(a < 0)
55 {
56 c = 0x80000000l;
57 }
58 else
59 {
60 c = 0x7FFFFFFFl;
61 }
62 }
63 *dst = c;
64 dst++;
65
66
67 MUL32x16INTO32(c, -coeff, temp, 15)
68 a = temp;
69 b = delay[AllPassOffset];
70 c = a + b;
71 if ((((c ^ a) & (c ^ b)) >> 31)!=0) /* overflow / underflow */
72 {
73 if(a < 0)
74 {
75 c = 0x80000000l;
76 }
77 else
78 {
79 c = 0x7FFFFFFFl;
80 }
81 }
82 delay[AllPassOffset] = c;
83 AllPassOffset++;
84
85 /* Make the delay buffer a circular buffer */
86 if (DelayOffset >= size)
87 {
88 DelayOffset = 0;
89 }
90
91 if (AllPassOffset >= size)
92 {
93 AllPassOffset = 0;
94 }
95 }
96
97 /* Update the offset */
98 *pAllPassOffset = AllPassOffset;
99
100 return;
101 }
102
103 /**********************************************************************************/
104
105