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