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 "LVM_Types.h"
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Macros.h"
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "Mixer.h"
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Mixer_FilterCoeffs.h"
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************/
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                                                            */
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*   LVM_Mix_GetTimeConstant                                            */
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                         */
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This function calculates the filter coefficient using the following */
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  equation:                                                           */
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*       Alpha = exp(ln(0.1)/ (tc * Update + 1.0))                      */
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This is to be used with the follow first order filter, called at a  */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  rate of Update times a second. tc is the required time constant in  */
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  units of 100us.                                                     */
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*       Output(n) = Alpha * Output(n-1) + (1 - Alpha) * Target(n)      */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  The function assumes the block size is large, i.e. the update rate  */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  is approximately a fixed, and correct factor of the value of Fs     */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  given in the call. This is especially not true when the block size  */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  is very small, see the mixer documentation for further details.     */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  The function does not support all possible combinations of input    */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  values:                                                             */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. NumChannels is limited to the values 1 (Mono) and 2 (Stereo)     */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  2. The product tc * Fs is limited approximately to the range        */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      8 < (tc * Fs) < 2^35                                            */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                          */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  tc              - the time constant in 100us steps, i.e. 10 = 1ms   */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Fs              - the filter update rate in Hz                      */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  NumChannels     - Number of channels 1=Mono, 2=Stereo               */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                             */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Alpha   - the filter coefficient Q31 format                         */
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                      */
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************/
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_UINT32 LVM_Mixer_TimeConstant(LVM_UINT32   tc,
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  LVM_UINT16   Fs,
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  LVM_UINT16   NumChannels)
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32  Product;
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16   Interpolate;
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16  Shift;
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32   Diff;
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32  Table[] = {ALPHA_0,             /* Log spaced look-up table */
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_1,
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_2,
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_3,
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_4,
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_5,
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_6,
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_7,
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_8,
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_9,
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_10,
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_11,
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_12,
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_13,
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_14,
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_15,
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_16,
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_17,
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_18,
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_19,
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_20,
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_21,
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_22,
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_23,
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_24,
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_25,
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_26,
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_27,
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_28,
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_29,
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_30,
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_31,
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_32,
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_33,
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_34,
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_35,
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_36,
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_37,
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_38,
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_39,
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_40,
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_41,
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_42,
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_43,
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_44,
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_45,
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_46,
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_47,
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_48,
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_49,
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           ALPHA_50};
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Calculate the product of the time constant and the sample rate */
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Product = ((tc >> 16) * (LVM_UINT32)Fs) << 13;  /* Stereo value */
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Product = Product + (((tc & 0x0000FFFF) * (LVM_UINT32)Fs) >> 3);
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (NumChannels == 1)
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Product = Product >> 1;   /* Mono value */
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Normalize to get the table index and interpolation factor */
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (Shift=0; Shift<((Alpha_TableSize-1)/2); Shift++)
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if ((Product & 0x80000000)!=0)
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Product = Product << 1;
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Shift = (LVM_UINT16)((Shift << 1));
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((Product & 0x40000000)==0)
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Shift++;
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Interpolate = (LVM_INT16)((Product >> 15) & 0x00007FFF);
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Diff = (LVM_INT32)(Table[Shift] - Table[Shift+1]);
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    MUL32x16INTO32(Diff,Interpolate,Diff,15)
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Product = Table[Shift+1] + (LVM_UINT32)Diff;
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return Product;
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
157