blob: 16d4b77449d61448a9dd8c999ac573ab49e6ac34 [file] [log] [blame]
Chisato Kenmochi94704432017-01-10 11:56:48 +09001/*
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***************************************************************************************************/
22__inline static int get_scale_factor_id_ldac(
23INT32 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***************************************************************************************************/
54static 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
59DECLFUNC void norm_spectrum_ldac(
60AC *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***************************************************************************************************/
102__inline static void quant_spectrum_core_ldac(
103AC *p_ac,
104int 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***************************************************************************************************/
124DECLFUNC void quant_spectrum_ldac(
125AC *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***************************************************************************************************/
140__inline static void quant_residual_core_ldac(
141AC *p_ac,
142int 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***************************************************************************************************/
170DECLFUNC void quant_residual_ldac(
171AC *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