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 #include "BIQUAD.h" 19 #include "BP_1I_D16F32Cll_TRC_WRA_01_Private.h" 20 #include "LVM_Macros.h" 21 22 23 /************************************************************************** 24 ASSUMPTIONS: 25 COEFS- 26 pBiquadState->coefs[0] is A0, 27 pBiquadState->coefs[1] is -B2, 28 pBiquadState->coefs[2] is -B1, these are in Q30 format 29 30 DELAYS- 31 pBiquadState->pDelays[0] is x(n-1)L in Q0 format 32 pBiquadState->pDelays[1] is x(n-2)L in Q0 format 33 pBiquadState->pDelays[2] is y(n-1)L in Q16 format 34 pBiquadState->pDelays[3] is y(n-2)L in Q16 format 35 ***************************************************************************/ 36 #ifdef BUILD_FLOAT 37 void BP_1I_D16F32C30_TRC_WRA_01 ( Biquad_FLOAT_Instance_t *pInstance, 38 LVM_FLOAT *pDataIn, 39 LVM_FLOAT *pDataOut, 40 LVM_INT16 NrSamples) 41 { 42 LVM_FLOAT ynL,templ; 43 LVM_INT16 ii; 44 PFilter_State_FLOAT pBiquadState = (PFilter_State_FLOAT)pInstance; 45 46 for (ii = NrSamples; ii != 0; ii--) 47 { 48 /************************************************************************** 49 PROCESSING OF THE LEFT CHANNEL 50 ***************************************************************************/ 51 // ynL= (A0 * (x(n)L - x(n-2)L )) 52 templ = (LVM_FLOAT) *pDataIn - pBiquadState->pDelays[1]; 53 ynL = pBiquadState->coefs[0] * templ; 54 55 // ynL+= ((-B2 * y(n-2)L ) ) 56 templ = pBiquadState->coefs[1] * pBiquadState->pDelays[3]; 57 ynL += templ; 58 59 // ynL+= ((-B1 * y(n-1)L )) 60 templ = pBiquadState->coefs[2] * pBiquadState->pDelays[2]; 61 ynL += templ; 62 63 /************************************************************************** 64 UPDATING THE DELAYS 65 ***************************************************************************/ 66 pBiquadState->pDelays[3] = pBiquadState->pDelays[2]; // y(n-2)L=y(n-1)L 67 pBiquadState->pDelays[1] = pBiquadState->pDelays[0]; // x(n-2)L=x(n-1)L 68 pBiquadState->pDelays[2] = ynL; // Update y(n-1)L in Q16 69 pBiquadState->pDelays[0] = (*pDataIn++); // Update x(n-1)L in Q0 70 71 /************************************************************************** 72 WRITING THE OUTPUT 73 ***************************************************************************/ 74 *pDataOut++ = (ynL); // Write Left output 75 } 76 } 77 #else 78 void BP_1I_D16F32C30_TRC_WRA_01 ( Biquad_Instance_t *pInstance, 79 LVM_INT16 *pDataIn, 80 LVM_INT16 *pDataOut, 81 LVM_INT16 NrSamples) 82 83 84 { 85 LVM_INT32 ynL,templ; 86 LVM_INT16 ii; 87 PFilter_State pBiquadState = (PFilter_State) pInstance; 88 89 for (ii = NrSamples; ii != 0; ii--) 90 { 91 92 93 /************************************************************************** 94 PROCESSING OF THE LEFT CHANNEL 95 ***************************************************************************/ 96 // ynL= (A0 (Q30) * (x(n)L (Q0) - x(n-2)L (Q0) ) >>14) in Q16 97 templ= (LVM_INT32) *pDataIn-pBiquadState->pDelays[1]; 98 MUL32x32INTO32(pBiquadState->coefs[0],templ,ynL,14) 99 100 // ynL+= ((-B2 (Q30) * y(n-2)L (Q16) ) >>30) in Q16 101 MUL32x32INTO32(pBiquadState->coefs[1],pBiquadState->pDelays[3],templ,30) 102 ynL+=templ; 103 104 // ynL+= ((-B1 (Q30) * y(n-1)L (Q16) ) >>30) in Q16 105 MUL32x32INTO32(pBiquadState->coefs[2],pBiquadState->pDelays[2],templ,30) 106 ynL+=templ; 107 108 /************************************************************************** 109 UPDATING THE DELAYS 110 ***************************************************************************/ 111 pBiquadState->pDelays[3]=pBiquadState->pDelays[2]; // y(n-2)L=y(n-1)L 112 pBiquadState->pDelays[1]=pBiquadState->pDelays[0]; // x(n-2)L=x(n-1)L 113 pBiquadState->pDelays[2]=ynL; // Update y(n-1)L in Q16 114 pBiquadState->pDelays[0]=(*pDataIn++); // Update x(n-1)L in Q0 115 116 /************************************************************************** 117 WRITING THE OUTPUT 118 ***************************************************************************/ 119 *pDataOut++=(LVM_INT16)(ynL>>16); // Write Left output in Q0 120 121 } 122 123 } 124 #endif 125