xref: /aosp_15_r20/external/libldac/src/quant_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     Subfunction: Get Scale Factor Index
21*aef9bcd9SKiyoung Kim ***************************************************************************************************/
get_scale_factor_id_ldac(SCALAR val)22*aef9bcd9SKiyoung Kim __inline static int get_scale_factor_id_ldac(
23*aef9bcd9SKiyoung Kim SCALAR val)
24*aef9bcd9SKiyoung Kim {
25*aef9bcd9SKiyoung Kim     int id;
26*aef9bcd9SKiyoung Kim     IEEE754_FI fi;
27*aef9bcd9SKiyoung Kim 
28*aef9bcd9SKiyoung Kim     fi.f = val;
29*aef9bcd9SKiyoung Kim     id = ((fi.i & 0x7fffffff) >> 23) - 111;
30*aef9bcd9SKiyoung Kim 
31*aef9bcd9SKiyoung Kim     if (id < 0) {
32*aef9bcd9SKiyoung Kim         id = 0;
33*aef9bcd9SKiyoung Kim     }
34*aef9bcd9SKiyoung Kim     if (id > LDAC_NIDSF-1) {
35*aef9bcd9SKiyoung Kim         id = LDAC_NIDSF-1;
36*aef9bcd9SKiyoung Kim     }
37*aef9bcd9SKiyoung Kim 
38*aef9bcd9SKiyoung Kim     return id;
39*aef9bcd9SKiyoung Kim }
40*aef9bcd9SKiyoung Kim 
41*aef9bcd9SKiyoung Kim /***************************************************************************************************
42*aef9bcd9SKiyoung Kim     Normalize Spectrum
43*aef9bcd9SKiyoung Kim ***************************************************************************************************/
44*aef9bcd9SKiyoung Kim static SCALAR sa_val_ldac[LDAC_MAXNSPS] = {
45*aef9bcd9SKiyoung Kim     -0.75, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
46*aef9bcd9SKiyoung Kim };
47*aef9bcd9SKiyoung Kim 
norm_spectrum_ldac(AC * p_ac)48*aef9bcd9SKiyoung Kim DECLFUNC void norm_spectrum_ldac(
49*aef9bcd9SKiyoung Kim AC *p_ac)
50*aef9bcd9SKiyoung Kim {
51*aef9bcd9SKiyoung Kim     int iqu, isp;
52*aef9bcd9SKiyoung Kim     int lsp, hsp;
53*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
54*aef9bcd9SKiyoung Kim     int idsf;
55*aef9bcd9SKiyoung Kim     int *p_idsf = p_ac->a_idsf;
56*aef9bcd9SKiyoung Kim     SCALAR maxspec, tmp;
57*aef9bcd9SKiyoung Kim     SCALAR *p_spec = p_ac->p_acsub->a_spec;
58*aef9bcd9SKiyoung Kim 
59*aef9bcd9SKiyoung Kim     for (iqu = 0; iqu < nqus; iqu++) {
60*aef9bcd9SKiyoung Kim         lsp = ga_isp_ldac[iqu];
61*aef9bcd9SKiyoung Kim         hsp = ga_isp_ldac[iqu+1];
62*aef9bcd9SKiyoung Kim 
63*aef9bcd9SKiyoung Kim         maxspec = fabs(p_spec[lsp]);
64*aef9bcd9SKiyoung Kim         for (isp = lsp+1; isp < hsp; isp++) {
65*aef9bcd9SKiyoung Kim             tmp = fabs(p_spec[isp]);
66*aef9bcd9SKiyoung Kim             if (maxspec < tmp) {
67*aef9bcd9SKiyoung Kim                 maxspec = tmp;
68*aef9bcd9SKiyoung Kim             }
69*aef9bcd9SKiyoung Kim         }
70*aef9bcd9SKiyoung Kim         idsf = get_scale_factor_id_ldac(maxspec);
71*aef9bcd9SKiyoung Kim 
72*aef9bcd9SKiyoung Kim         if (idsf > 0) {
73*aef9bcd9SKiyoung Kim             tmp = ga_isf_ldac[idsf];
74*aef9bcd9SKiyoung Kim             for (isp = lsp; isp < hsp; isp++) {
75*aef9bcd9SKiyoung Kim                 p_spec[isp] *= tmp;
76*aef9bcd9SKiyoung Kim             }
77*aef9bcd9SKiyoung Kim         }
78*aef9bcd9SKiyoung Kim         else {
79*aef9bcd9SKiyoung Kim             for (isp = lsp; isp < hsp; isp++) {
80*aef9bcd9SKiyoung Kim                 p_spec[isp] = sa_val_ldac[isp-lsp];
81*aef9bcd9SKiyoung Kim             }
82*aef9bcd9SKiyoung Kim         }
83*aef9bcd9SKiyoung Kim 
84*aef9bcd9SKiyoung Kim         p_idsf[iqu] = idsf;
85*aef9bcd9SKiyoung Kim     }
86*aef9bcd9SKiyoung Kim 
87*aef9bcd9SKiyoung Kim     return;
88*aef9bcd9SKiyoung Kim }
89*aef9bcd9SKiyoung Kim 
90*aef9bcd9SKiyoung Kim /***************************************************************************************************
91*aef9bcd9SKiyoung Kim     Subfunction: Quantize Spectrum Core
92*aef9bcd9SKiyoung Kim ***************************************************************************************************/
quant_spectrum_core_ldac(AC * p_ac,int iqu)93*aef9bcd9SKiyoung Kim __inline static void quant_spectrum_core_ldac(
94*aef9bcd9SKiyoung Kim AC *p_ac,
95*aef9bcd9SKiyoung Kim int iqu)
96*aef9bcd9SKiyoung Kim {
97*aef9bcd9SKiyoung Kim     int i;
98*aef9bcd9SKiyoung Kim     int isp = ga_isp_ldac[iqu];
99*aef9bcd9SKiyoung Kim     int nsps = ga_nsps_ldac[iqu];
100*aef9bcd9SKiyoung Kim     int *p_qspec = p_ac->a_qspec+isp;
101*aef9bcd9SKiyoung Kim     SCALAR qf = ga_qf_ldac[p_ac->a_idwl1[iqu]];
102*aef9bcd9SKiyoung Kim     SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp;
103*aef9bcd9SKiyoung Kim 
104*aef9bcd9SKiyoung Kim     IEEE754_FI fi;
105*aef9bcd9SKiyoung Kim     const float fc = (float)((1 << 23) + (1 << 22));
106*aef9bcd9SKiyoung Kim 
107*aef9bcd9SKiyoung Kim     for (i = 0; i < nsps; i++) {
108*aef9bcd9SKiyoung Kim         fi.f = p_nspec[i] * qf + fc;
109*aef9bcd9SKiyoung Kim         p_qspec[i] = (short)fi.i;
110*aef9bcd9SKiyoung Kim     }
111*aef9bcd9SKiyoung Kim 
112*aef9bcd9SKiyoung Kim     return;
113*aef9bcd9SKiyoung Kim }
114*aef9bcd9SKiyoung Kim 
115*aef9bcd9SKiyoung Kim /***************************************************************************************************
116*aef9bcd9SKiyoung Kim     Quantize Spectrum
117*aef9bcd9SKiyoung Kim ***************************************************************************************************/
quant_spectrum_ldac(AC * p_ac)118*aef9bcd9SKiyoung Kim DECLFUNC void quant_spectrum_ldac(
119*aef9bcd9SKiyoung Kim AC *p_ac)
120*aef9bcd9SKiyoung Kim {
121*aef9bcd9SKiyoung Kim     int iqu;
122*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
123*aef9bcd9SKiyoung Kim 
124*aef9bcd9SKiyoung Kim     for (iqu = 0; iqu < nqus; iqu++) {
125*aef9bcd9SKiyoung Kim         quant_spectrum_core_ldac(p_ac, iqu);
126*aef9bcd9SKiyoung Kim     }
127*aef9bcd9SKiyoung Kim 
128*aef9bcd9SKiyoung Kim     return;
129*aef9bcd9SKiyoung Kim }
130*aef9bcd9SKiyoung Kim 
131*aef9bcd9SKiyoung Kim /***************************************************************************************************
132*aef9bcd9SKiyoung Kim     Subfunction: Quantize Residual Spectrum Core
133*aef9bcd9SKiyoung Kim ***************************************************************************************************/
quant_residual_core_ldac(AC * p_ac,int iqu)134*aef9bcd9SKiyoung Kim __inline static void quant_residual_core_ldac(
135*aef9bcd9SKiyoung Kim AC *p_ac,
136*aef9bcd9SKiyoung Kim int iqu)
137*aef9bcd9SKiyoung Kim {
138*aef9bcd9SKiyoung Kim     int i;
139*aef9bcd9SKiyoung Kim     int isp = ga_isp_ldac[iqu];
140*aef9bcd9SKiyoung Kim     int nsps = ga_nsps_ldac[iqu];
141*aef9bcd9SKiyoung Kim     int *p_qspec = p_ac->a_qspec+isp;
142*aef9bcd9SKiyoung Kim     int *p_rspec = p_ac->a_rspec+isp;
143*aef9bcd9SKiyoung Kim     SCALAR ldqspec;
144*aef9bcd9SKiyoung Kim     SCALAR iqf = ga_iqf_ldac[LDAC_MAXIDWL1];
145*aef9bcd9SKiyoung Kim     SCALAR rqsf = ga_qf_ldac[p_ac->a_idwl2[iqu]] * ga_irsf_ldac[LDAC_MAXIDWL1]
146*aef9bcd9SKiyoung Kim             * _scalar(0.996093750);
147*aef9bcd9SKiyoung Kim     SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp;
148*aef9bcd9SKiyoung Kim 
149*aef9bcd9SKiyoung Kim     IEEE754_FI fi;
150*aef9bcd9SKiyoung Kim     const float fc = (float)((1 << 23) + (1 << 22));
151*aef9bcd9SKiyoung Kim 
152*aef9bcd9SKiyoung Kim     for (i = 0; i < nsps; i++) {
153*aef9bcd9SKiyoung Kim         ldqspec = p_qspec[i] * iqf;
154*aef9bcd9SKiyoung Kim         fi.f = (p_nspec[i] - ldqspec) * rqsf + fc;
155*aef9bcd9SKiyoung Kim         p_rspec[i] = (short)fi.i;
156*aef9bcd9SKiyoung Kim     }
157*aef9bcd9SKiyoung Kim 
158*aef9bcd9SKiyoung Kim     return;
159*aef9bcd9SKiyoung Kim }
160*aef9bcd9SKiyoung Kim 
161*aef9bcd9SKiyoung Kim /***************************************************************************************************
162*aef9bcd9SKiyoung Kim     Quantize Residual Spectrum
163*aef9bcd9SKiyoung Kim ***************************************************************************************************/
quant_residual_ldac(AC * p_ac)164*aef9bcd9SKiyoung Kim DECLFUNC void quant_residual_ldac(
165*aef9bcd9SKiyoung Kim AC *p_ac)
166*aef9bcd9SKiyoung Kim {
167*aef9bcd9SKiyoung Kim     int iqu;
168*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
169*aef9bcd9SKiyoung Kim     int *p_idwl2 = p_ac->a_idwl2;
170*aef9bcd9SKiyoung Kim 
171*aef9bcd9SKiyoung Kim     for (iqu = 0; iqu < nqus; iqu++) {
172*aef9bcd9SKiyoung Kim         if (p_idwl2[iqu] > 0) {
173*aef9bcd9SKiyoung Kim             quant_residual_core_ldac(p_ac, iqu);
174*aef9bcd9SKiyoung Kim         }
175*aef9bcd9SKiyoung Kim     }
176*aef9bcd9SKiyoung Kim 
177*aef9bcd9SKiyoung Kim     return;
178*aef9bcd9SKiyoung Kim }
179*aef9bcd9SKiyoung Kim 
180