LVPSA_Private.h revision 2c8e5cab3faa6d360e222b7a6c40a80083d021ac
1/*
2 * Copyright (C) 2004-2010 NXP Software
3 * Copyright (C) 2010 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/************************************************************************/
19/*                                                                      */
20/*     Project::   PSA_01_ARMC_01                                       */
21/*     $Author: beq07716 $*/
22/*     $Revision: 1006 $*/
23/*     $Date: 2010-06-28 14:01:47 +0200 (Mon, 28 Jun 2010) $*/
24/*                                                                      */
25/************************************************************************/
26#ifndef _LVPSA_PRIVATE_H_
27#define _LVPSA_PRIVATE_H_
28
29#include "LVPSA.h"
30#include "BIQUAD.h"
31#include "LVPSA_QPD.h"
32#include "LVM_Macros.h"
33
34
35
36#ifdef __cplusplus
37extern "C" {
38#endif /* __cplusplus */
39
40/**********************************************************************************
41   CONSTANT DEFINITIONS
42***********************************************************************************/
43
44/* Memory */
45#define LVPSA_INSTANCE_ALIGN             4      /* 32-bit alignment for structures                                  */
46#define LVPSA_SCRATCH_ALIGN              4      /* 32-bit alignment for long data                                   */
47#define LVPSA_COEF_ALIGN                 4      /* 32-bit alignment for long words                                  */
48#define LVPSA_DATA_ALIGN                 4      /* 32-bit alignment for long data                                   */
49
50#define LVPSA_MEMREGION_INSTANCE         0      /* Offset to instance memory region in memory table                 */
51#define LVPSA_MEMREGION_PERSISTENT_COEF  1      /* Offset to persistent coefficients  memory region in memory table */
52#define LVPSA_MEMREGION_PERSISTENT_DATA  2      /* Offset to persistent taps  memory region in memory table         */
53#define LVPSA_MEMREGION_SCRATCH          3      /* Offset to scratch  memory region in memory table                 */
54
55#define LVPSA_NR_SUPPORTED_RATE          9      /* From 8000Hz to 48000Hz                                           */
56#define LVPSA_NR_SUPPORTED_SPEED         3      /* LOW, MEDIUM, HIGH                                                */
57
58#define LVPSA_MAXBUFFERDURATION          4000   /* Maximum length in ms of the levels buffer                        */
59#define LVPSA_MAXINPUTBLOCKSIZE          5000   /* Maximum length in mono samples of the block to process           */
60#define LVPSA_NBANDSMIN                  1      /* Minimum number of frequency band                                 */
61#define LVPSA_NBANDSMAX                  30     /* Maximum number of frequency band                                 */
62#define LVPSA_MAXCENTERFREQ              20000  /* Maximum possible center frequency                                */
63#define LVPSA_MINPOSTGAIN                -15    /* Minimum possible post gain                                       */
64#define LVPSA_MAXPOSTGAIN                15     /* Maximum possible post gain                                       */
65#define LVPSA_MINQFACTOR                 25     /* Minimum possible Q factor                                        */
66#define LVPSA_MAXQFACTOR                 1200   /* Maximum possible Q factor                                        */
67
68#define LVPSA_MAXLEVELDECAYFACTOR        0x4111 /* Decay factor for the maximum values calculation                  */
69#define LVPSA_MAXLEVELDECAYSHIFT         14     /* Decay shift for the maximum values calculation                   */
70
71#define LVPSA_MAXUNSIGNEDCHAR            0xFF
72
73#define LVPSA_FsInvertShift              31
74#define LVPSA_GAINSHIFT                  11
75#define LVPSA_FREQSHIFT                  25
76
77/**********************************************************************************
78   TYPES DEFINITIONS
79***********************************************************************************/
80
81#define LVPSA_InternalRefreshTime       0x0014    /* 20 ms (50Hz) in Q16.0      */
82#define LVPSA_InternalRefreshTimeInv    0x0666    /* 1/20ms left shifted by 15  */
83#define LVPSA_InternalRefreshTimeShift  15
84
85
86/* Precision of the filter */
87typedef enum
88{
89    LVPSA_SimplePrecisionFilter,    /* Simple precision */
90    LVPSA_DoublePrecisionFilter     /* Double precision */
91} LVPSA_BPFilterPrecision_en;
92
93typedef struct
94{
95    LVM_CHAR                    bControlPending;                    /* Flag incating a change of the control parameters                                             */
96    LVM_UINT16                  nBands;                             /* Number of bands of the spectrum analyzer                                                     */
97    LVM_UINT16                  MaxInputBlockSize;                  /* Maximum input data buffer size                                                               */
98
99    LVPSA_ControlParams_t       CurrentParams;                      /* Current control parameters of the module                                                     */
100    LVPSA_ControlParams_t       NewParams;                          /* New control parameters given by the user                                                     */
101    LVPSA_MemTab_t              MemoryTable;
102
103    LVPSA_BPFilterPrecision_en *pBPFiltersPrecision;                /* Points a nBands elements array that contains the filter precision for each band              */
104    Biquad_Instance_t          *pBP_Instances;                      /* Points a nBands elements array that contains the band pass filter instance for each band     */
105    Biquad_1I_Order2_Taps_t    *pBP_Taps;                           /* Points a nBands elements array that contains the band pass filter taps for each band         */
106    QPD_State_t                *pQPD_States;                        /* Points a nBands elements array that contains the QPD filter instance for each band           */
107    QPD_Taps_t                 *pQPD_Taps;                          /* Points a nBands elements array that contains the QPD filter taps for each band               */
108    LVM_UINT16                 *pPostGains;                         /* Points a nBands elements array that contains the post-filter gains for each band             */
109
110    LVPSA_FilterParam_t        *pFiltersParams;                     /* Copy of the filters parameters from the input parameters                                     */
111
112
113    LVM_UINT16                  nSamplesBufferUpdate;               /* Number of samples to make 20ms                                                               */
114    LVM_INT32                   BufferUpdateSamplesCount;           /* Counter used to know when to put a new value in the buffer                                   */
115    LVM_UINT16                  nRelevantFilters;                   /* Number of relevent filters depending on sampling frequency and bands center frequency        */
116    LVM_UINT16                  LocalSamplesCount;                  /* Counter used to update the SpectralDataBufferAudioTime                                       */
117
118    LVM_UINT16                  DownSamplingFactor;                 /* Down sampling factor depending on the sampling frequency                                     */
119    LVM_UINT16                  DownSamplingCount;                  /* Counter used for the downsampling handling                                                   */
120
121    LVM_UINT16                  SpectralDataBufferDuration;         /* Length of the buffer in time (ms) defined by the application                                 */
122    LVM_UINT8                  *pSpectralDataBufferStart;           /* Starting address of the buffer                                                               */
123    LVM_UINT8                  *pSpectralDataBufferWritePointer;    /* Current position of the writting pointer of the buffer                                       */
124    LVPSA_Time                  SpectralDataBufferAudioTime;        /* AudioTime at which the last value save occured in the buffer                                 */
125    LVM_UINT32                  SpectralDataBufferLength;           /* Number of spectrum data value that the buffer can contain (per band)
126                                                                       = SpectralDataBufferDuration/20ms                                                            */
127
128    LVM_UINT8                  *pPreviousPeaks;                     /* Points to a nBands elements array that contains the previous peak value of the level
129                                                                     detection. Those values are decremented after each call to the GetSpectrum function          */
130
131}LVPSA_InstancePr_t, *pLVPSA_InstancePr_t;
132
133
134
135/**********************************************************************************
136   FUNCTIONS PROTOTYPE
137***********************************************************************************/
138/************************************************************************************/
139/*                                                                                  */
140/* FUNCTION:            LVPSA_ApplyNewSettings                                      */
141/*                                                                                  */
142/* DESCRIPTION:                                                                     */
143/*  Reinitialize some parameters and changes filters' coefficients if               */
144/*  some control parameters have changed.                                           */
145/*                                                                                  */
146/* PARAMETERS:                                                                      */
147/*  pInst               Pointer to the instance                                     */
148/*                                                                                  */
149/* RETURNS:                                                                         */
150/*  LVPSA_OK            Always succeeds                                             */
151/*                                                                                  */
152/************************************************************************************/
153LVPSA_RETURN LVPSA_ApplyNewSettings (LVPSA_InstancePr_t     *pInst);
154
155#ifdef __cplusplus
156}
157#endif /* __cplusplus */
158
159#endif /* _LVPSA_PRIVATE_H */
160