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 #ifndef _BIQUAD_H_
19 #define _BIQUAD_H_
20 
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif /* __cplusplus */
25 
26 #include "LVM_Types.h"
27 /**********************************************************************************
28    INSTANCE MEMORY TYPE DEFINITION
29 ***********************************************************************************/
30 
31 typedef struct
32 {
33     LVM_INT32 Storage[6];
34 
35 } Biquad_Instance_t;
36 
37 
38 /**********************************************************************************
39    COEFFICIENT TYPE DEFINITIONS
40 ***********************************************************************************/
41 
42 /*** Biquad coefficients **********************************************************/
43 typedef struct
44 {
45     LVM_INT16 A2;   /*  a2  */
46     LVM_INT16 A1;   /*  a1  */
47     LVM_INT16 A0;   /*  a0  */
48     LVM_INT16 B2;   /* -b2! */
49     LVM_INT16 B1;   /* -b1! */
50 } BQ_C16_Coefs_t;
51 
52 typedef struct
53 {
54     LVM_INT32  A2;   /*  a2  */
55     LVM_INT32  A1;   /*  a1  */
56     LVM_INT32  A0;   /*  a0  */
57     LVM_INT32  B2;   /* -b2! */
58     LVM_INT32  B1;   /* -b1! */
59 } BQ_C32_Coefs_t;
60 
61 /*** First order coefficients *****************************************************/
62 typedef struct
63 {
64     LVM_INT16 A1;   /*  a1  */
65     LVM_INT16 A0;   /*  a0  */
66     LVM_INT16 B1;   /* -b1! */
67 } FO_C16_Coefs_t;
68 
69 typedef struct
70 {
71     LVM_INT32  A1;   /*  a1  */
72     LVM_INT32  A0;   /*  a0  */
73     LVM_INT32  B1;   /* -b1! */
74 } FO_C32_Coefs_t;
75 
76 /*** First order coefficients with Shift*****************************************************/
77 typedef struct
78 {
79     LVM_INT16 A1;    /*  a1  */
80     LVM_INT16 A0;    /*  a0  */
81     LVM_INT16 B1;    /* -b1! */
82     LVM_INT16 Shift; /* Shift */
83 } FO_C16_LShx_Coefs_t;
84 
85 /*** Band pass coefficients *******************************************************/
86 typedef struct
87 {
88     LVM_INT16 A0;   /*  a0  */
89     LVM_INT16 B2;   /* -b2! */
90     LVM_INT16 B1;   /* -b1! */
91 } BP_C16_Coefs_t;
92 
93 typedef struct
94 {
95     LVM_INT32  A0;   /*  a0  */
96     LVM_INT32  B2;   /* -b2! */
97     LVM_INT32  B1;   /* -b1! */
98 } BP_C32_Coefs_t;
99 
100 /*** Peaking coefficients *********************************************************/
101 typedef struct
102 {
103     LVM_INT16 A0;   /*  a0  */
104     LVM_INT16 B2;   /* -b2! */
105     LVM_INT16 B1;   /* -b1! */
106     LVM_INT16  G;   /* Gain */
107 } PK_C16_Coefs_t;
108 
109 typedef struct
110 {
111     LVM_INT32  A0;   /*  a0  */
112     LVM_INT32  B2;   /* -b2! */
113     LVM_INT32  B1;   /* -b1! */
114     LVM_INT16  G;   /* Gain */
115 } PK_C32_Coefs_t;
116 
117 
118 /**********************************************************************************
119    TAPS TYPE DEFINITIONS
120 ***********************************************************************************/
121 
122 /*** Types used for first order and shelving filter *******************************/
123 
124 typedef struct
125 {
126     LVM_INT32 Storage[ (1*2) ];  /* One channel, two taps of size LVM_INT32 */
127 } Biquad_1I_Order1_Taps_t;
128 
129 typedef struct
130 {
131     LVM_INT32 Storage[ (2*2) ];  /* Two channels, two taps of size LVM_INT32 */
132 } Biquad_2I_Order1_Taps_t;
133 
134 
135 /*** Types used for biquad, band pass and peaking filter **************************/
136 
137 typedef struct
138 {
139     LVM_INT32 Storage[ (1*4) ];  /* One channel, four taps of size LVM_INT32 */
140 } Biquad_1I_Order2_Taps_t;
141 
142 typedef struct
143 {
144     LVM_INT32 Storage[ (2*4) ];  /* Two channels, four taps of size LVM_INT32 */
145 } Biquad_2I_Order2_Taps_t;
146 
147 /* The names of the functions are changed to satisfy QAC rules: Name should be Unique withing 16 characters*/
148 #define BQ_2I_D32F32Cll_TRC_WRA_01_Init  Init_BQ_2I_D32F32Cll_TRC_WRA_01
149 #define BP_1I_D32F32C30_TRC_WRA_02       TWO_BP_1I_D32F32C30_TRC_WRA_02
150 
151 /**********************************************************************************
152    FUNCTION PROTOTYPES: BIQUAD FILTERS
153 ***********************************************************************************/
154 
155 /*** 16 bit data path *************************************************************/
156 
157 void BQ_2I_D16F32Css_TRC_WRA_01_Init (      Biquad_Instance_t       *pInstance,
158                                             Biquad_2I_Order2_Taps_t *pTaps,
159                                             BQ_C16_Coefs_t          *pCoef);
160 
161 void BQ_2I_D16F32C15_TRC_WRA_01 (           Biquad_Instance_t       *pInstance,
162                                             LVM_INT16                    *pDataIn,
163                                             LVM_INT16                    *pDataOut,
164                                             LVM_INT16                    NrSamples);
165 
166 void BQ_2I_D16F32C14_TRC_WRA_01 (           Biquad_Instance_t       *pInstance,
167                                             LVM_INT16                    *pDataIn,
168                                             LVM_INT16                    *pDataOut,
169                                             LVM_INT16                    NrSamples);
170 
171 void BQ_2I_D16F32C13_TRC_WRA_01 (           Biquad_Instance_t       *pInstance,
172                                             LVM_INT16                    *pDataIn,
173                                             LVM_INT16                    *pDataOut,
174                                             LVM_INT16                    NrSamples);
175 
176 void BQ_2I_D16F16Css_TRC_WRA_01_Init (      Biquad_Instance_t       *pInstance,
177                                             Biquad_2I_Order2_Taps_t *pTaps,
178                                             BQ_C16_Coefs_t          *pCoef);
179 
180 void BQ_2I_D16F16C15_TRC_WRA_01(            Biquad_Instance_t       *pInstance,
181                                             LVM_INT16                   *pDataIn,
182                                             LVM_INT16                   *pDataOut,
183                                             LVM_INT16                   NrSamples);
184 
185 void BQ_2I_D16F16C14_TRC_WRA_01(            Biquad_Instance_t       *pInstance,
186                                             LVM_INT16                   *pDataIn,
187                                             LVM_INT16                   *pDataOut,
188                                             LVM_INT16                   NrSamples);
189 
190 void BQ_1I_D16F16Css_TRC_WRA_01_Init (      Biquad_Instance_t       *pInstance,
191                                             Biquad_1I_Order2_Taps_t *pTaps,
192                                             BQ_C16_Coefs_t          *pCoef);
193 
194 void BQ_1I_D16F16C15_TRC_WRA_01(            Biquad_Instance_t       *pInstance,
195                                             LVM_INT16                   *pDataIn,
196                                             LVM_INT16                   *pDataOut,
197                                             LVM_INT16                   NrSamples);
198 
199 void BQ_1I_D16F32Css_TRC_WRA_01_Init (      Biquad_Instance_t       *pInstance,
200                                             Biquad_1I_Order2_Taps_t *pTaps,
201                                             BQ_C16_Coefs_t          *pCoef);
202 
203 void BQ_1I_D16F32C14_TRC_WRA_01 (           Biquad_Instance_t       *pInstance,
204                                             LVM_INT16                    *pDataIn,
205                                             LVM_INT16                    *pDataOut,
206                                             LVM_INT16                    NrSamples);
207 
208 /*** 32 bit data path *************************************************************/
209 
210 void BQ_2I_D32F32Cll_TRC_WRA_01_Init (      Biquad_Instance_t       *pInstance,
211                                             Biquad_2I_Order2_Taps_t *pTaps,
212                                             BQ_C32_Coefs_t          *pCoef);
213 
214 void BQ_2I_D32F32C30_TRC_WRA_01 (           Biquad_Instance_t       *pInstance,
215                                             LVM_INT32                    *pDataIn,
216                                             LVM_INT32                    *pDataOut,
217                                             LVM_INT16                    NrSamples);
218 
219 /**********************************************************************************
220    FUNCTION PROTOTYPES: FIRST ORDER FILTERS
221 ***********************************************************************************/
222 
223 /*** 16 bit data path *************************************************************/
224 
225 void FO_1I_D16F16Css_TRC_WRA_01_Init(       Biquad_Instance_t       *pInstance,
226                                             Biquad_1I_Order1_Taps_t *pTaps,
227                                             FO_C16_Coefs_t          *pCoef);
228 
229 void FO_1I_D16F16C15_TRC_WRA_01(            Biquad_Instance_t       *pInstance,
230                                             LVM_INT16                   *pDataIn,
231                                             LVM_INT16                   *pDataOut,
232                                             LVM_INT16                   NrSamples);
233 
234 void FO_2I_D16F32Css_LShx_TRC_WRA_01_Init(Biquad_Instance_t       *pInstance,
235                                           Biquad_2I_Order1_Taps_t *pTaps,
236                                           FO_C16_LShx_Coefs_t     *pCoef);
237 
238 void FO_2I_D16F32C15_LShx_TRC_WRA_01(Biquad_Instance_t       *pInstance,
239                                      LVM_INT16               *pDataIn,
240                                      LVM_INT16               *pDataOut,
241                                      LVM_INT16               NrSamples);
242 
243 /*** 32 bit data path *************************************************************/
244 
245 void FO_1I_D32F32Cll_TRC_WRA_01_Init(       Biquad_Instance_t       *pInstance,
246                                             Biquad_1I_Order1_Taps_t *pTaps,
247                                             FO_C32_Coefs_t          *pCoef);
248 
249 void FO_1I_D32F32C31_TRC_WRA_01(            Biquad_Instance_t       *pInstance,
250                                             LVM_INT32               *pDataIn,
251                                             LVM_INT32               *pDataOut,
252                                             LVM_INT16               NrSamples);
253 
254 /**********************************************************************************
255    FUNCTION PROTOTYPES: BAND PASS FILTERS
256 ***********************************************************************************/
257 
258 /*** 16 bit data path *************************************************************/
259 
260 void BP_1I_D16F16Css_TRC_WRA_01_Init (      Biquad_Instance_t       *pInstance,
261                                             Biquad_1I_Order2_Taps_t *pTaps,
262                                             BP_C16_Coefs_t          *pCoef);
263 
264 void BP_1I_D16F16C14_TRC_WRA_01 (           Biquad_Instance_t       *pInstance,
265                                             LVM_INT16                    *pDataIn,
266                                             LVM_INT16                    *pDataOut,
267                                             LVM_INT16                    NrSamples);
268 
269 void BP_1I_D16F32Cll_TRC_WRA_01_Init (      Biquad_Instance_t       *pInstance,
270                                             Biquad_1I_Order2_Taps_t *pTaps,
271                                             BP_C32_Coefs_t          *pCoef);
272 
273 void BP_1I_D16F32C30_TRC_WRA_01 (           Biquad_Instance_t       *pInstance,
274                                             LVM_INT16                    *pDataIn,
275                                             LVM_INT16                    *pDataOut,
276                                             LVM_INT16                    NrSamples);
277 
278 
279 /*** 32 bit data path *************************************************************/
280 
281 void BP_1I_D32F32Cll_TRC_WRA_02_Init (      Biquad_Instance_t       *pInstance,
282                                             Biquad_1I_Order2_Taps_t *pTaps,
283                                             BP_C32_Coefs_t          *pCoef);
284 
285 void BP_1I_D32F32C30_TRC_WRA_02(            Biquad_Instance_t       *pInstance,
286                                             LVM_INT32                    *pDataIn,
287                                             LVM_INT32                    *pDataOut,
288                                             LVM_INT16                    NrSamples);
289 
290 
291 /*** 32 bit data path STEREO ******************************************************/
292 
293 void PK_2I_D32F32CllGss_TRC_WRA_01_Init (   Biquad_Instance_t       *pInstance,
294                                             Biquad_2I_Order2_Taps_t *pTaps,
295                                             PK_C32_Coefs_t          *pCoef);
296 
297 void PK_2I_D32F32C30G11_TRC_WRA_01 (        Biquad_Instance_t       *pInstance,
298                                             LVM_INT32                    *pDataIn,
299                                             LVM_INT32                    *pDataOut,
300                                             LVM_INT16                    NrSamples);
301 
302 void PK_2I_D32F32CssGss_TRC_WRA_01_Init (   Biquad_Instance_t       *pInstance,
303                                             Biquad_2I_Order2_Taps_t *pTaps,
304                                             PK_C16_Coefs_t          *pCoef);
305 
306 void PK_2I_D32F32C14G11_TRC_WRA_01 (        Biquad_Instance_t       *pInstance,
307                                             LVM_INT32                    *pDataIn,
308                                             LVM_INT32                    *pDataOut,
309                                             LVM_INT16                    NrSamples);
310 
311 
312 /**********************************************************************************
313    FUNCTION PROTOTYPES: DC REMOVAL FILTERS
314 ***********************************************************************************/
315 
316 /*** 16 bit data path STEREO ******************************************************/
317 
318 void DC_2I_D16_TRC_WRA_01_Init     (        Biquad_Instance_t       *pInstance);
319 
320 void DC_2I_D16_TRC_WRA_01          (        Biquad_Instance_t       *pInstance,
321                                             LVM_INT16               *pDataIn,
322                                             LVM_INT16               *pDataOut,
323                                             LVM_INT16               NrSamples);
324 
325 #ifdef __cplusplus
326 }
327 #endif /* __cplusplus */
328 
329 
330 /**********************************************************************************/
331 
332 #endif  /** _BIQUAD_H_ **/
333 
334