xref: /aosp_15_r20/external/libldac/src/func_fixp_ldac.c (revision aef9bcd9217ad2365ebc8e70efaf94b64e04df14)
1*aef9bcd9SKiyoung Kim /*
2*aef9bcd9SKiyoung Kim  * Copyright (C) 2003 - 2016 Sony Corporation
3*aef9bcd9SKiyoung Kim  *
4*aef9bcd9SKiyoung Kim  * Licensed under the Apache License, Version 2.0 (the "License");
5*aef9bcd9SKiyoung Kim  * you may not use this file except in compliance with the License.
6*aef9bcd9SKiyoung Kim  * You may obtain a copy of the License at
7*aef9bcd9SKiyoung Kim  *
8*aef9bcd9SKiyoung Kim  *      http://www.apache.org/licenses/LICENSE-2.0
9*aef9bcd9SKiyoung Kim  *
10*aef9bcd9SKiyoung Kim  * Unless required by applicable law or agreed to in writing, software
11*aef9bcd9SKiyoung Kim  * distributed under the License is distributed on an "AS IS" BASIS,
12*aef9bcd9SKiyoung Kim  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*aef9bcd9SKiyoung Kim  * See the License for the specific language governing permissions and
14*aef9bcd9SKiyoung Kim  * limitations under the License.
15*aef9bcd9SKiyoung Kim  */
16*aef9bcd9SKiyoung Kim 
17*aef9bcd9SKiyoung Kim #include "ldac.h"
18*aef9bcd9SKiyoung Kim 
19*aef9bcd9SKiyoung Kim 
20*aef9bcd9SKiyoung Kim /*******************************************************************************
21*aef9bcd9SKiyoung Kim     Subfunction: Check Saturation
22*aef9bcd9SKiyoung Kim *******************************************************************************/
check_sature_ldac(INT64 val)23*aef9bcd9SKiyoung Kim __inline static INT32 check_sature_ldac(
24*aef9bcd9SKiyoung Kim INT64 val)
25*aef9bcd9SKiyoung Kim {
26*aef9bcd9SKiyoung Kim 
27*aef9bcd9SKiyoung Kim     return (INT32)val;
28*aef9bcd9SKiyoung Kim }
29*aef9bcd9SKiyoung Kim 
30*aef9bcd9SKiyoung Kim /*******************************************************************************
31*aef9bcd9SKiyoung Kim     Shift and Round
32*aef9bcd9SKiyoung Kim *******************************************************************************/
sftrnd_ldac(INT32 in,int shift)33*aef9bcd9SKiyoung Kim DECLFUNC INT32 sftrnd_ldac(
34*aef9bcd9SKiyoung Kim INT32 in,
35*aef9bcd9SKiyoung Kim int shift)
36*aef9bcd9SKiyoung Kim {
37*aef9bcd9SKiyoung Kim     INT64 out;
38*aef9bcd9SKiyoung Kim 
39*aef9bcd9SKiyoung Kim     if (shift > 0) {
40*aef9bcd9SKiyoung Kim         out = ((INT64)in + ((INT64)1 << (shift-1))) >> shift;
41*aef9bcd9SKiyoung Kim     }
42*aef9bcd9SKiyoung Kim     else {
43*aef9bcd9SKiyoung Kim         out = (INT64)in << (-shift);
44*aef9bcd9SKiyoung Kim     }
45*aef9bcd9SKiyoung Kim 
46*aef9bcd9SKiyoung Kim     return check_sature_ldac(out);
47*aef9bcd9SKiyoung Kim }
48*aef9bcd9SKiyoung Kim 
49*aef9bcd9SKiyoung Kim 
50*aef9bcd9SKiyoung Kim /*******************************************************************************
51*aef9bcd9SKiyoung Kim     Get Bit Length of Value
52*aef9bcd9SKiyoung Kim *******************************************************************************/
get_bit_length_ldac(INT32 val)53*aef9bcd9SKiyoung Kim DECLFUNC int get_bit_length_ldac(
54*aef9bcd9SKiyoung Kim INT32 val)
55*aef9bcd9SKiyoung Kim {
56*aef9bcd9SKiyoung Kim     int len;
57*aef9bcd9SKiyoung Kim 
58*aef9bcd9SKiyoung Kim     len = 0;
59*aef9bcd9SKiyoung Kim     while (val > 0) {
60*aef9bcd9SKiyoung Kim         val >>= 1;
61*aef9bcd9SKiyoung Kim         len++;
62*aef9bcd9SKiyoung Kim     }
63*aef9bcd9SKiyoung Kim 
64*aef9bcd9SKiyoung Kim     return len;
65*aef9bcd9SKiyoung Kim }
66*aef9bcd9SKiyoung Kim 
67*aef9bcd9SKiyoung Kim /*******************************************************************************
68*aef9bcd9SKiyoung Kim     Get Maximum Absolute Value
69*aef9bcd9SKiyoung Kim *******************************************************************************/
get_absmax_ldac(INT32 * p_x,int num)70*aef9bcd9SKiyoung Kim DECLFUNC INT32 get_absmax_ldac(
71*aef9bcd9SKiyoung Kim INT32 *p_x,
72*aef9bcd9SKiyoung Kim int num)
73*aef9bcd9SKiyoung Kim {
74*aef9bcd9SKiyoung Kim     int i;
75*aef9bcd9SKiyoung Kim     INT32 abmax, val;
76*aef9bcd9SKiyoung Kim 
77*aef9bcd9SKiyoung Kim     abmax = abs(p_x[0]);
78*aef9bcd9SKiyoung Kim     for (i = 1; i < num; i++) {
79*aef9bcd9SKiyoung Kim         val = abs(p_x[i]);
80*aef9bcd9SKiyoung Kim         if (abmax < val) {
81*aef9bcd9SKiyoung Kim             abmax = val;
82*aef9bcd9SKiyoung Kim         }
83*aef9bcd9SKiyoung Kim     }
84*aef9bcd9SKiyoung Kim 
85*aef9bcd9SKiyoung Kim     return abmax;
86*aef9bcd9SKiyoung Kim }
87*aef9bcd9SKiyoung Kim 
88