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