1 /*
2  * Copyright (C) 2003 - 2016 Sony Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "ldac.h"
18 
19 /***************************************************************************************************
20     Subfunction: Get Scale Factor Index
21 ***************************************************************************************************/
get_scale_factor_id_ldac(INT32 val)22 __inline static int get_scale_factor_id_ldac(
23 INT32 val)
24 {
25     int i;
26     int id, step;
27 
28     if (ga_sf_ldac[0] > val) {
29         return 0;
30     }
31 
32     id = LDAC_NIDSF >> 1;
33     step = LDAC_NIDSF >> 2;
34     for (i = 0; i < LDAC_IDSFBITS-1; i++) {
35         if (ga_sf_ldac[id] > val) {
36             id -= step;
37         }
38         else {
39             id += step;
40         }
41         step >>= 1;
42     }
43 
44     if ((ga_sf_ldac[id] <= val) && (id < LDAC_NIDSF-1)) {
45         id++;
46     }
47 
48     return id;
49 }
50 
51 /***************************************************************************************************
52     Normalize Spectrum
53 ***************************************************************************************************/
54 static INT32 sa_val_ldac[LDAC_MAXNSPS] = { /* Q31 */
55     0xa0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
56     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
57 };
58 
norm_spectrum_ldac(AC * p_ac)59 DECLFUNC void norm_spectrum_ldac(
60 AC *p_ac)
61 {
62     int iqu, isp;
63     int lsp, hsp;
64     int nqus = p_ac->p_ab->nqus;
65     int idsf;
66     INT32 maxspec, tmp;
67     INT32 *p_spec = p_ac->p_acsub->a_spec;
68 
69     for (iqu = 0; iqu < nqus; iqu++) {
70         lsp = ga_isp_ldac[iqu];
71         hsp = ga_isp_ldac[iqu+1];
72 
73         maxspec = abs(p_spec[lsp]);
74         for (isp = lsp+1; isp < hsp; isp++) {
75             tmp = abs(p_spec[isp]);
76             if (maxspec < tmp) {
77                 maxspec = tmp;
78             }
79         }
80         idsf = get_scale_factor_id_ldac(maxspec);
81 
82         if (idsf > 0) {
83             for (isp = lsp; isp < hsp; isp++) {
84                 p_spec[isp] = sftrnd_ldac(p_spec[isp], idsf-LDAC_Q_NORM);
85             }
86         }
87         else {
88             for (isp = lsp; isp < hsp; isp++) {
89                 p_spec[isp] = sa_val_ldac[isp-lsp];
90             }
91         }
92 
93         p_ac->a_idsf[iqu] = idsf;
94     }
95 
96     return;
97 }
98 
99 /***************************************************************************************************
100     Subfunction: Quantize Spectrum Core
101 ***************************************************************************************************/
quant_spectrum_core_ldac(AC * p_ac,int iqu)102 __inline static void quant_spectrum_core_ldac(
103 AC *p_ac,
104 int iqu)
105 {
106     int i;
107     int isp = ga_isp_ldac[iqu];
108     int nsps = ga_nsps_ldac[iqu];
109     int *p_qspec = p_ac->a_qspec+isp;
110     INT32 qf = ga_qf_ldac[p_ac->a_idwl1[iqu]];
111     INT32 *p_nspec = p_ac->p_acsub->a_spec+isp;
112 
113     for (i = 0; i < nsps; i++) {
114         /* Q00 <- Q31 * Q16 */
115         p_qspec[i] = mul_rsftrnd_ldac(p_nspec[i], qf, LDAC_Q_QUANT1);
116     }
117 
118     return;
119 }
120 
121 /***************************************************************************************************
122     Quantize Spectrum
123 ***************************************************************************************************/
quant_spectrum_ldac(AC * p_ac)124 DECLFUNC void quant_spectrum_ldac(
125 AC *p_ac)
126 {
127     int iqu;
128     int nqus = p_ac->p_ab->nqus;
129 
130     for (iqu = 0; iqu < nqus; iqu++) {
131         quant_spectrum_core_ldac(p_ac, iqu);
132     }
133 
134     return;
135 }
136 
137 /***************************************************************************************************
138     Subfunction: Quantize Residual Spectrum Core
139 ***************************************************************************************************/
quant_residual_core_ldac(AC * p_ac,int iqu)140 __inline static void quant_residual_core_ldac(
141 AC *p_ac,
142 int iqu)
143 {
144     int i;
145     int isp = ga_isp_ldac[iqu];
146     int nsps = ga_nsps_ldac[iqu];
147     int *p_qspec = p_ac->a_qspec+isp;
148     int *p_rspec = p_ac->a_rspec+isp;
149     INT32 ldqspec, rnspec;
150     INT32 iqf = ga_iqf_ldac[LDAC_MAXIDWL1];
151     INT32 rqf = ga_qf_ldac[p_ac->a_idwl2[iqu]];
152     INT32 irsf = ga_irsf_ldac[LDAC_MAXIDWL1];
153     INT32 *p_nspec = p_ac->p_acsub->a_spec+isp;
154 
155     for (i = 0; i < nsps; i++) {
156         /* Q31 <- Q00 * Q31 */
157         ldqspec = mul_lsftrnd_ldac(p_qspec[i], iqf, LDAC_Q_QUANT2);
158         /* Q31 <- (Q31 - Q31) * Q15 */
159         rnspec = mul_rsftrnd_ldac(p_nspec[i]-ldqspec, irsf, LDAC_Q_QUANT3);
160         /* Q00 <- Q31 * Q16 */
161         p_rspec[i] = mul_rsftrnd_ldac(rnspec, rqf, LDAC_Q_QUANT4);
162     }
163 
164     return;
165 }
166 
167 /***************************************************************************************************
168     Quantize Residual Spectrum
169 ***************************************************************************************************/
quant_residual_ldac(AC * p_ac)170 DECLFUNC void quant_residual_ldac(
171 AC *p_ac)
172 {
173     int iqu;
174     int nqus = p_ac->p_ab->nqus;
175     int	*p_idwl2 = p_ac->a_idwl2;
176 
177     for (iqu = 0; iqu < nqus; iqu++) {
178         if (p_idwl2[iqu] > 0) {
179             quant_residual_core_ldac(p_ac, iqu);
180         }
181     }
182 
183     return;
184 }
185 
186