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 23extern "C" { 24#endif /* __cplusplus */ 25 26#include "LVM_Types.h" 27/********************************************************************************** 28 INSTANCE MEMORY TYPE DEFINITION 29***********************************************************************************/ 30 31typedef struct 32{ 33 LVM_INT32 Storage[6]; 34 35} Biquad_Instance_t; 36 37 38/********************************************************************************** 39 COEFFICIENT TYPE DEFINITIONS 40***********************************************************************************/ 41 42/*** Biquad coefficients **********************************************************/ 43typedef 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 52typedef 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 *****************************************************/ 62typedef struct 63{ 64 LVM_INT16 A1; /* a1 */ 65 LVM_INT16 A0; /* a0 */ 66 LVM_INT16 B1; /* -b1! */ 67} FO_C16_Coefs_t; 68 69typedef 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*****************************************************/ 77typedef 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 *******************************************************/ 86typedef struct 87{ 88 LVM_INT16 A0; /* a0 */ 89 LVM_INT16 B2; /* -b2! */ 90 LVM_INT16 B1; /* -b1! */ 91} BP_C16_Coefs_t; 92 93typedef 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 *********************************************************/ 101typedef 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 109typedef 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 124typedef struct 125{ 126 LVM_INT32 Storage[ (1*2) ]; /* One channel, two taps of size LVM_INT32 */ 127} Biquad_1I_Order1_Taps_t; 128 129typedef 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 137typedef struct 138{ 139 LVM_INT32 Storage[ (1*4) ]; /* One channel, four taps of size LVM_INT32 */ 140} Biquad_1I_Order2_Taps_t; 141 142typedef 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 157void 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 161void BQ_2I_D16F32C15_TRC_WRA_01 ( Biquad_Instance_t *pInstance, 162 LVM_INT16 *pDataIn, 163 LVM_INT16 *pDataOut, 164 LVM_INT16 NrSamples); 165 166void BQ_2I_D16F32C14_TRC_WRA_01 ( Biquad_Instance_t *pInstance, 167 LVM_INT16 *pDataIn, 168 LVM_INT16 *pDataOut, 169 LVM_INT16 NrSamples); 170 171void BQ_2I_D16F32C13_TRC_WRA_01 ( Biquad_Instance_t *pInstance, 172 LVM_INT16 *pDataIn, 173 LVM_INT16 *pDataOut, 174 LVM_INT16 NrSamples); 175 176void 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 180void BQ_2I_D16F16C15_TRC_WRA_01( Biquad_Instance_t *pInstance, 181 LVM_INT16 *pDataIn, 182 LVM_INT16 *pDataOut, 183 LVM_INT16 NrSamples); 184 185void BQ_2I_D16F16C14_TRC_WRA_01( Biquad_Instance_t *pInstance, 186 LVM_INT16 *pDataIn, 187 LVM_INT16 *pDataOut, 188 LVM_INT16 NrSamples); 189 190void 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 194void BQ_1I_D16F16C15_TRC_WRA_01( Biquad_Instance_t *pInstance, 195 LVM_INT16 *pDataIn, 196 LVM_INT16 *pDataOut, 197 LVM_INT16 NrSamples); 198 199void 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 203void 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 210void 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 214void 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 225void 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 229void FO_1I_D16F16C15_TRC_WRA_01( Biquad_Instance_t *pInstance, 230 LVM_INT16 *pDataIn, 231 LVM_INT16 *pDataOut, 232 LVM_INT16 NrSamples); 233 234void 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 238void 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 245void 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 249void 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 260void 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 264void BP_1I_D16F16C14_TRC_WRA_01 ( Biquad_Instance_t *pInstance, 265 LVM_INT16 *pDataIn, 266 LVM_INT16 *pDataOut, 267 LVM_INT16 NrSamples); 268 269void 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 273void 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 281void 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 285void 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 293void 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 297void PK_2I_D32F32C30G11_TRC_WRA_01 ( Biquad_Instance_t *pInstance, 298 LVM_INT32 *pDataIn, 299 LVM_INT32 *pDataOut, 300 LVM_INT16 NrSamples); 301 302void 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 306void 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 318void DC_2I_D16_TRC_WRA_01_Init ( Biquad_Instance_t *pInstance); 319 320void 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