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/************************************************************************/ 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* %created_by: sra % (CM/S)*/ 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* %name: dB_to_Lin32.c % (CM/S)*/ 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* %version: 2 % (CM/S)*/ 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* %date_created: Wed Jun 18 11:27:46 2008 % (CM/S)*/ 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************/ 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*######################################################################################*/ 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Include files */ 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*######################################################################################*/ 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "ScalarArithmetic.h" 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**************************************************************************************** 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Name : dB_to_Lin32() 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Input : Signed 16-bit integer 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * MSB (16) = sign bit 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * (15->05) = integer part 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * (04->01) = decimal part 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Output : Signed 32-bit integer 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * MSB (32) = sign bit 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * (31->16) = integer part 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * (15->01) = decimal part 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Returns : Lin value format 1.16.15 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Description : 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Remarks : Makes an approximation to the conversion by counting the number 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * of 6dB steps for use as shifts and then interpolates with a remainder 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * with the equation: 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Correction = (Remainder / 1.5029) - (Remainder^2 / 6) 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * The two coefficients are scaled from 0x40000000 in 96 steps and calculated 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * as follows: 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * FIRST_COEF = 0x80000000 / (96 * 1.5029) 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * SECOND_COEF = 0x80000000 / (96^2 * 6) 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ****************************************************************************************/ 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define FOUR_OVER_SIX 21846 /* (4 / 6) * 2^15 */ 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define SIX_DB 96 /* 6 * 16 or 6dB in Q11.4 format */ 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define FIRST_COEF_NEG 14884305 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define FIRST_COEF_POS 7442152 /* FIRST_COEF_NEG / 2 */ 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define SECOND_COEF 38836 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define MAX_VALUE 1536 /* 96 * 16 */ 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 dB_to_Lin32(LVM_INT16 db_fix) 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Lin_val_32; 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 Shift; 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Remain; 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check sign of the input 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (db_fix<0) 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (db_fix > -MAX_VALUE) 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Shift = (LVM_INT16)((((LVM_UINT32)(-db_fix) >> 4) * FOUR_OVER_SIX) >> 17); /* Number of 6dB steps in Q11.4 format */ 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Remain = -db_fix - (Shift * SIX_DB); 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Remain = (0x7FFFFFFF - (Remain * FIRST_COEF_NEG)) + (Remain * Remain * SECOND_COEF); 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Lin_val_32 = (LVM_INT32)((LVM_UINT32)Remain >> (16 + Shift)); 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Lin_val_32 = 0; 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (db_fix < MAX_VALUE) 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Shift = (LVM_INT16)((((LVM_UINT32)db_fix >> 4) * FOUR_OVER_SIX) >> 17); /* Number of 6dB steps in Q11.4 format */ 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Remain = db_fix - (Shift * SIX_DB); 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Remain = 0x3FFFFFFF + (Remain * FIRST_COEF_POS) + (Remain * Remain * SECOND_COEF); 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Lin_val_32 = (LVM_INT32)((LVM_UINT32)Remain >> (15 - Shift)); 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Lin_val_32 = 0x7FFFFFFF; 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return Lin_val_32; /* format 1.16.15 */ 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 110