12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include    "LVPSA.h"
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include    "LVPSA_Private.h"
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include    "VectorArithmetic.h"
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define     LOW_FREQ            298             /* 32768/110 for low test frequency */
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define     HIGH_FREQ           386             /* 32768/85 for high test frequency */
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_SetBPFiltersType (  LVPSA_InstancePr_t        *pInst,
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVPSA_ControlParams_t      *pParams  );
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_SetQPFCoefficients( LVPSA_InstancePr_t        *pInst,
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVPSA_ControlParams_t      *pParams  );
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_BPSinglePrecCoefs(  LVM_UINT16             Fs,
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVPSA_FilterParam_t   *pFilterParams,
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       BP_C16_Coefs_t        *pCoefficients);
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_BPDoublePrecCoefs(  LVM_UINT16            Fs,
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVPSA_FilterParam_t  *pFilterParams,
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       BP_C32_Coefs_t       *pCoefficients);
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_BPDoublePrecCoefs(  LVM_UINT16              Fs,
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVPSA_FilterParam_t     *pFilterParams,
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       BP_C32_Coefs_t          *pCoefficients);
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_SetBPFCoefficients( LVPSA_InstancePr_t        *pInst,
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVPSA_ControlParams_t      *pParams  );
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_ClearFilterHistory( LVPSA_InstancePr_t        *pInst);
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_Control                                               */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Give some new control parameters to the module.                                 */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance           Pointer to the instance                                     */
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  NewParams           Structure that contains the new parameters                  */
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK            Succeeds                                                    */
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  otherwise           Error due to bad parameters                                 */
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_Control           ( pLVPSA_Handle_t             hInstance,
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVPSA_ControlParams_t      *pNewParams     )
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVPSA_InstancePr_t     *pLVPSA_Inst    = (LVPSA_InstancePr_t*)hInstance;
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pNewParams == LVM_NULL))
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVPSA_ERROR_NULLADDRESS);
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pNewParams->Fs >= LVPSA_NR_SUPPORTED_RATE)
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVPSA_ERROR_INVALIDPARAM);
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pNewParams->LevelDetectionSpeed >= LVPSA_NR_SUPPORTED_SPEED)
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVPSA_ERROR_INVALIDPARAM);
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pLVPSA_Inst->NewParams = *pNewParams;
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pLVPSA_Inst->bControlPending = LVM_TRUE;
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_GetControlParams                                      */
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Get the current control parameters of the module                                */
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance       Pointer to the instance                                         */
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams         Pointer to an empty control structure                           */
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK            Succeeds                                                    */
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  otherwise           Error due to bad parameters                                 */
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_GetControlParams         (    pLVPSA_Handle_t            hInstance,
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                 LVPSA_ControlParams_t     *pParams )
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVPSA_InstancePr_t     *pLVPSA_Inst    = (LVPSA_InstancePr_t*)hInstance;
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pParams == LVM_NULL))
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVPSA_ERROR_NULLADDRESS);
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pParams->Fs                     = pLVPSA_Inst->CurrentParams.Fs;
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pParams->LevelDetectionSpeed    = pLVPSA_Inst->CurrentParams.LevelDetectionSpeed;
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_GetInitParams                                         */
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Get the initialization parameters of the module                                 */
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance       Pointer to the instance                                         */
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams         Pointer to an empty control structure                           */
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK            Succeeds                                                    */
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  otherwise           Error due to bad parameters                                 */
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_GetInitParams         (    pLVPSA_Handle_t            hInstance,
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                              LVPSA_InitParams_t        *pParams )
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVPSA_InstancePr_t     *pLVPSA_Inst    = (LVPSA_InstancePr_t*)hInstance;
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pParams == LVM_NULL))
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVPSA_ERROR_NULLADDRESS);
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pParams->SpectralDataBufferDuration   = pLVPSA_Inst->SpectralDataBufferDuration;
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pParams->MaxInputBlockSize            = pLVPSA_Inst->MaxInputBlockSize;
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pParams->nBands                       = pLVPSA_Inst->nBands;
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pParams->pFiltersParams               = pLVPSA_Inst->pFiltersParams;
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_ApplyNewSettings                                      */
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Reinitialize some parameters and changes filters' coefficients if               */
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  some control parameters have changed.                                           */
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInst               Pointer to the instance                                     */
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK            Succeeds                                                    */
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  otherwise           Error due to bad parameters                                 */
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_ApplyNewSettings (LVPSA_InstancePr_t     *pInst)
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16 ii;
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16 Freq;
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVPSA_ControlParams_t   Params;
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_INT16        LVPSA_nSamplesBufferUpdate[];
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_UINT16       LVPSA_SampleRateTab[];
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_UINT16       LVPSA_DownSamplingFactor[];
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInst == 0)
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVPSA_ERROR_NULLADDRESS);
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Params = pInst->NewParams;
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Modifies filters types and coefficients, clear the taps and
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       re-initializes parameters if sample frequency has changed    */
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(Params.Fs != pInst->CurrentParams.Fs)
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInst->CurrentParams.Fs = Params.Fs;
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Initialize the center freqeuncies as a function of the sample rate */
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Freq = (LVM_UINT16) ((LVPSA_SampleRateTab[pInst->CurrentParams.Fs]>>1) / (pInst->nBands + 1));
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(ii = pInst->nBands; ii > 0; ii--)
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInst->pFiltersParams[ii-1].CenterFrequency = (LVM_UINT16) (Freq * ii);
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Count the number of relevant filters. If the center frequency of the filter is
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent           bigger than the nyquist frequency, then the filter is not relevant and doesn't
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent           need to be used */
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(ii = pInst->nBands; ii > 0; ii--)
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pInst->pFiltersParams[ii-1].CenterFrequency < (LVPSA_SampleRateTab[pInst->CurrentParams.Fs]>>1))
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInst->nRelevantFilters = ii;
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_SetBPFiltersType(pInst, &Params);
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_SetBPFCoefficients(pInst, &Params);
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_SetQPFCoefficients(pInst, &Params);
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_ClearFilterHistory(pInst);
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInst->nSamplesBufferUpdate = (LVM_UINT16)LVPSA_nSamplesBufferUpdate[Params.Fs];
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInst->BufferUpdateSamplesCount = 0;
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInst->DownSamplingFactor = LVPSA_DownSamplingFactor[Params.Fs];
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInst->DownSamplingCount = 0;
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(ii = 0; ii < (pInst->nBands * pInst->SpectralDataBufferLength); ii++)
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInst->pSpectralDataBufferStart[ii] = 0;
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(ii = 0; ii < pInst->nBands; ii++)
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInst->pPreviousPeaks[ii] = 0;
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(Params.LevelDetectionSpeed != pInst->CurrentParams.LevelDetectionSpeed)
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVPSA_SetQPFCoefficients(pInst, &Params);
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInst->CurrentParams = pInst->NewParams;
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return (LVPSA_OK);
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_SetBPFiltersType                                      */
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the filter type based on the BPFilterType.                                 */
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInst               Pointer to the instance                                     */
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Poniter to conrol parameters                                */
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK            Always succeeds                                             */
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. To select the biquad type the follow rules are applied:                      */
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Double precision    if (fc <= fs/110)                                   */
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Double precision    if (fs/110 < fc < fs/85) & (Q>3)                    */
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Single precision    otherwise                                           */
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_SetBPFiltersType (   LVPSA_InstancePr_t        *pInst,
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVPSA_ControlParams_t      *pParams  )
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_UINT16   LVPSA_SampleRateTab[];                                            /* Sample rate table */
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          ii;                                                         /* Filter band index */
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          fs = (LVM_UINT32)LVPSA_SampleRateTab[(LVM_UINT16)pParams->Fs];      /* Sample rate */
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          fc;                                                         /* Filter centre frequency */
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           QFactor;                                                    /* Filter Q factor */
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (ii = 0; ii < pInst->nRelevantFilters; ii++)
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the filter settings
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        fc = (LVM_UINT32)pInst->pFiltersParams[ii].CenterFrequency;     /* Get the band centre frequency */
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        QFactor =(LVM_INT16) pInst->pFiltersParams[ii].QFactor;                    /* Get the band Q factor */
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * For each filter set the type of biquad required
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInst->pBPFiltersPrecision[ii] = LVPSA_SimplePrecisionFilter;     /* Default to single precision */
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if ((LOW_FREQ * fs) >= (fc << 15))
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * fc <= fs/110
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInst->pBPFiltersPrecision[ii] = LVPSA_DoublePrecisionFilter;
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (((LOW_FREQ * fs) < (fc << 15)) && ((fc << 15) < (HIGH_FREQ * fs)) && (QFactor > 300))
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                * (fs/110 < fc < fs/85) & (Q>3)
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                */
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInst->pBPFiltersPrecision[ii] = LVPSA_DoublePrecisionFilter;
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_SetBPFCoefficients                                    */
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the band pass filter coefficients. This uses the type to select            */
3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  single or double precision coefficients.                                        */
3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInst               Pointer to the instance                                     */
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Params              Initialisation parameters                                   */
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK            Always succeeds                                             */
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_SetBPFCoefficients(  LVPSA_InstancePr_t        *pInst,
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVPSA_ControlParams_t      *pParams)
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16                      ii;
3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the coefficients for each band by the init function
3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (ii = 0; ii < pInst->nRelevantFilters; ii++)
3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        switch  (pInst->pBPFiltersPrecision[ii])
3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            case    LVPSA_DoublePrecisionFilter:
3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                BP_C32_Coefs_t      Coefficients;
3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Calculate the double precision coefficients
3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVPSA_BPDoublePrecCoefs((LVM_UINT16)pParams->Fs,
3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &pInst->pFiltersParams[ii],
3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &Coefficients);
3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Set the coefficients
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                BP_1I_D16F32Cll_TRC_WRA_01_Init ( &pInst->pBP_Instances[ii],
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                  &pInst->pBP_Taps[ii],
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                  &Coefficients);
3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            case    LVPSA_SimplePrecisionFilter:
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                BP_C16_Coefs_t      Coefficients;
3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Calculate the single precision coefficients
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVPSA_BPSinglePrecCoefs((LVM_UINT16)pParams->Fs,
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &pInst->pFiltersParams[ii],
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &Coefficients);
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Set the coefficients
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                BP_1I_D16F16Css_TRC_WRA_01_Init ( &pInst->pBP_Instances[ii],
3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                  &pInst->pBP_Taps[ii],
3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                  &Coefficients);
3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_SetQPFCoefficients                                    */
3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the quasi peak filters coefficients. This uses the chosen                  */
3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LevelDetectionSpeed from the control parameters.                                */
3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInst               Pointer to the instance                                     */
3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Params              Control parameters                                          */
4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK            Always succeeds                                             */
4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_SetQPFCoefficients(   LVPSA_InstancePr_t        *pInst,
4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         LVPSA_ControlParams_t      *pParams  )
4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16     ii;
4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Fs_en      Fs = pParams->Fs;
4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    QPD_C32_Coefs  *pCoefficients;
4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern         QPD_C32_Coefs     LVPSA_QPD_Coefs[];
4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pCoefficients = &LVPSA_QPD_Coefs[(pParams->LevelDetectionSpeed * LVPSA_NR_SUPPORTED_RATE) + Fs];
4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (ii = 0; ii < pInst->nRelevantFilters; ii++)
4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVPSA_QPD_Init (&pInst->pQPD_States[ii],
4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            &pInst->pQPD_Taps[ii],
4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pCoefficients );
4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVPSA_BPSinglePrecCoefs                                    */
4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Calculate single precision coefficients for a band pass filter                      */
4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Fs                       Sampling frequency index                                   */
4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pFilterParams            Pointer to the filter definition                           */
4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pCoefficients            Pointer to the coefficients                                */
4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK         Always succeeds                                                    */
4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. The equations used are as follows:                                               */
4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      t0 = 2 * Pi * Fc / Fs                                                           */
4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      b2 = -0.5 * (2Q - t0) / (2Q + t0)                                               */
4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      b1 = (0.5 - b2) * cos(t0)                                                       */
4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      a0 = (0.5 + b2) / 2                                                             */
4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Where:                                                                              */
4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      Fc          is the centre frequency, DC to Nyquist                              */
4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      Fs          is the sample frequency, 8000 to 48000 in descrete steps            */
4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      Q           is the Q factor, 0.25 to 12                                         */
4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  2. This function is entirely based on the LVEQNB_SinglePrecCoefs function           */
4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*     of the n bands equalizer (LVEQNB                                                 */
4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_BPSinglePrecCoefs(    LVM_UINT16              Fs,
4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         LVPSA_FilterParam_t    *pFilterParams,
4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         BP_C16_Coefs_t         *pCoefficients)
4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_INT16    LVPSA_TwoPiOnFsTable[];
4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_INT16    LVPSA_CosCoef[];
4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Intermediate variables and temporary values
4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           T0;
4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           D;
4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           A0;
4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B1;
4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B2;
4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           Dt0;
4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B2_Den;
4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B2_Num;
4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           COS_T0;
4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           coef;
4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           factor;
4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           t0;
4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           i;
4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Get the filter definition
4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          Frequency   = pFilterParams->CenterFrequency;
4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          QFactor     = pFilterParams->QFactor;
4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculating the intermediate values
4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    T0 = (LVM_INT32)Frequency * LVPSA_TwoPiOnFsTable[Fs];   /* T0 = 2 * Pi * Fc / Fs */
5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    D = 3200;                                               /* Floating point value 1.000000 (1*100*2^5) */
5022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                            /* Force D = 1 : the function was originally used for a peaking filter.
5032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                               The D parameter do not exist for a BandPass filter coefficients */
5042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the B2 coefficient
5072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Dt0 = D * (T0 >> 10);
5092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B2_Den = (LVM_INT32)(((LVM_UINT32)QFactor << 19) + (LVM_UINT32)(Dt0 >> 2));
5102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B2_Num = (LVM_INT32)((LVM_UINT32)(Dt0 >> 3) - ((LVM_UINT32)QFactor << 18));
5112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B2 = (B2_Num / (B2_Den >> 16)) << 15;
5122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the cosine by a polynomial expansion using the equation:
5152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     *
5162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     *  Cos += coef(n) * t0^n                   For n = 0 to 6
5172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    T0 = (T0 >> 10) * 20859;                    /* Scale to 1.0 in 16-bit for range 0 to fs/2 */
5192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    t0 = (LVM_INT16)(T0 >> 16);
5202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    factor = 0x7fff;                            /* Initialise to 1.0 for the a0 coefficient */
5212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    COS_T0 = 0;                                 /* Initialise the error to zero */
5222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=1; i<7; i++)
5232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        coef = LVPSA_CosCoef[i];                /* Get the nth coefficient */
5252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        COS_T0 += (factor * coef) >> 5;         /* The nth partial sum */
5262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        factor = (factor * t0) >> 15;           /* Calculate t0^n */
5272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    COS_T0 = COS_T0 << (LVPSA_CosCoef[0]+6);          /* Correct the scaling */
5292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B1 = ((0x40000000 - B2) >> 16) * (COS_T0 >> 16);    /* B1 = (0.5 - b2) * cos(t0) */
5322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    A0 = (0x40000000 + B2) >> 1;                        /* A0 = (0.5 + b2) / 2 */
5332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Write coeff into the data structure
5362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pCoefficients->A0 = (LVM_INT16)(A0>>16);
5382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pCoefficients->B1 = (LVM_INT16)(B1>>15);
5392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pCoefficients->B2 = (LVM_INT16)(B2>>16);
5402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
5432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
5442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
5462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVPSA_BPDoublePrecCoefs                                    */
5482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
5502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Calculate double precision coefficients for a band pass filter                      */
5512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
5532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Fs                       Sampling frequency index                                   */
5542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pFilterParams            Pointer to the filter definition                           */
5552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pCoefficients            Pointer to the coefficients                                */
5562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
5582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK                 Always succeeds                                            */
5592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
5612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. The equations used are as follows:                                               */
5622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      t0 = 2 * Pi * Fc / Fs                                                           */
5642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      b2 = -0.5 * (2Q - t0) / (2Q + t0)                                               */
5662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      b1 = (0.5 - b2) * (1 - coserr(t0))                                              */
5672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      a0 = (0.5 + b2) / 2                                                             */
5682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Where:                                                                              */
5702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      Fc          is the centre frequency, DC to Fs/50                                */
5712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      Fs          is the sample frequency, 8000 to 48000 in descrete steps            */
5722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      Q           is the Q factor, 0.25 to 12 (represented by 25 to 1200)             */
5732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  2. The double precision coefficients are only used when fc is less than fs/85, so   */
5752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*     the cosine of t0 is always close to 1.0. Instead of calculating the cosine       */
5762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*     itself the difference from the value 1.0 is calculated, this can be done with    */
5772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*     lower precision maths.                                                           */
5782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  3. The value of the B2 coefficient is only calculated as a single precision value,  */
5802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*     small errors in this value have a combined effect on the Q and Gain but not the  */
5812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*     the frequency of the filter.                                                     */
5822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  4. This function is entirely based on the LVEQNB_DoublePrecCoefs function           */
5842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*     of the n bands equalizer (LVEQNB                                                 */
5852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
5872c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_BPDoublePrecCoefs(   LVM_UINT16            Fs,
5882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVPSA_FilterParam_t  *pFilterParams,
5892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        BP_C32_Coefs_t       *pCoefficients)
5902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
5912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_INT16    LVPSA_TwoPiOnFsTable[];
5932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern LVM_INT16    LVPSA_DPCosCoef[];
5942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Intermediate variables and temporary values
5972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           T0;
5992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           D;
6002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           A0;
6012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B1;
6022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B2;
6032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           Dt0;
6042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B2_Den;
6052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           B2_Num;
6062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           CosErr;
6072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           coef;
6082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32           factor;
6092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           t0;
6102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           i;
6112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Get the filter definition
6142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          Frequency   = pFilterParams->CenterFrequency;
6162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          QFactor     = pFilterParams->QFactor;
6172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculating the intermediate values
6212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    T0 = (LVM_INT32)Frequency * LVPSA_TwoPiOnFsTable[Fs];   /* T0 = 2 * Pi * Fc / Fs */
6232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    D = 3200;                                               /* Floating point value 1.000000 (1*100*2^5) */
6242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                            /* Force D = 1 : the function was originally used for a peaking filter.
6252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                               The D parameter do not exist for a BandPass filter coefficients */
6262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the B2 coefficient
6292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Dt0 = D * (T0 >> 10);
6312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B2_Den = (LVM_INT32)(((LVM_UINT32)QFactor << 19) + (LVM_UINT32)(Dt0 >> 2));
6322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B2_Num = (LVM_INT32)((LVM_UINT32)(Dt0 >> 3) - ((LVM_UINT32)QFactor << 18));
6332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B2 = (B2_Num / (B2_Den >> 16)) << 15;
6342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the cosine error by a polynomial expansion using the equation:
6372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     *
6382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     *  CosErr += coef(n) * t0^n                For n = 0 to 4
6392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    T0 = (T0 >> 6) * 0x7f53;                    /* Scale to 1.0 in 16-bit for range 0 to fs/50 */
6412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    t0 = (LVM_INT16)(T0 >> 16);
6422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    factor = 0x7fff;                            /* Initialise to 1.0 for the a0 coefficient */
6432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CosErr = 0;                                 /* Initialise the error to zero */
6442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=1; i<5; i++)
6452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        coef = LVPSA_DPCosCoef[i];              /* Get the nth coefficient */
6472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CosErr += (factor * coef) >> 5;         /* The nth partial sum */
6482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        factor = (factor * t0) >> 15;           /* Calculate t0^n */
6492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CosErr = CosErr << (LVPSA_DPCosCoef[0]);          /* Correct the scaling */
6512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the B1 and A0 coefficients
6542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B1 = (0x40000000 - B2);                     /* B1 = (0.5 - b2) */
6562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    A0 = ((B1 >> 16) * (CosErr >> 10)) >> 6;    /* Temporary storage for (0.5 - b2) * coserr(t0) */
6572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    B1 -= A0;                                   /* B1 = (0.5 - b2) * (1 - coserr(t0))  */
6582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    A0 = (0x40000000 + B2) >> 1;                /* A0 = (0.5 + b2) / 2 */
6592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Write coeff into the data structure
6622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pCoefficients->A0 = A0;
6642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pCoefficients->B1 = B1;
6652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pCoefficients->B2 = B2;
6662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
6682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
6692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
6712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
6722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVPSA_ClearFilterHistory                                    */
6732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
6742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
6752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Clears the filters' data history                                                */
6762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
6772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
6782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInst           Pointer to the instance                                         */
6792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
6802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
6812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVPSA_OK         Always succeeds                                                */
6822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
6832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
6842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
6852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
6862c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_ClearFilterHistory(LVPSA_InstancePr_t        *pInst)
6872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
6882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT8       *pTapAddress;
6892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32       i;
6902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Band Pass filters taps */
6922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pTapAddress = (LVM_INT8 *)pInst->pBP_Taps;
6932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for(i = 0; i < pInst->nBands * sizeof(Biquad_1I_Order2_Taps_t); i++)
6942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pTapAddress[i] = 0;
6962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Quasi-peak filters taps */
6992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pTapAddress = (LVM_INT8 *)pInst->pQPD_Taps;
7002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for(i = 0; i < pInst->nBands * sizeof(QPD_Taps_t); i++)
7012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
7022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pTapAddress[i] = 0;
7032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVPSA_OK);
7062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
7072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
708