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