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