Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include "options.h"
7 : #include "basop_util.h"
8 : #include "vad_basop.h"
9 : //#include "prot_fx.h"
10 : #include "rom_enc.h"
11 : #include "prot_fx.h" /* Function prototypes */
12 : #include "prot_fx_enc.h" /* Function prototypes */
13 :
14 : /*-------------------------------------------------------------------*
15 : * spec_center_fx()
16 : *
17 : *
18 : *-------------------------------------------------------------------*/
19 :
20 3100 : void spec_center_fx(
21 : Word32 *sb_power, /* i : energy of sub-band divided uniformly Q31 */
22 : Word16 *sp_center, /* o : spectral center Q10 */
23 : const Word32 bw_index, /* i : band width Q0 */
24 : const Word16 Q_sb_p /* i : the Scaling of sb_power*/
25 : )
26 : {
27 : Word16 i;
28 :
29 : Word32 t_sp_center, frame_power;
30 : Word32 t_sp_center_num, frame_power_den;
31 : Word32 sb_power_mlt;
32 : Word32 t_sp_center_nb, frame_power_nb;
33 : Word32 zerop1;
34 : Word32 sb_power_shr[24];
35 :
36 : Word16 d_t_sp_center;
37 : Word16 Q_t_sp_center, Q_frame_power;
38 : Word16 Q_t_sc, Q_f_p;
39 : Word16 d_t_sp_center_Qtmp;
40 :
41 :
42 3100 : zerop1 = 0;
43 3100 : move32();
44 3100 : t_sp_center = 0;
45 3100 : move32();
46 3100 : frame_power = 0;
47 3100 : move32();
48 :
49 34100 : FOR( i = 0; i < 10; i++ )
50 : {
51 31000 : sb_power_shr[i] = L_shr( sb_power[i], 5 ); /* Q26 */
52 31000 : move32();
53 : }
54 :
55 34100 : FOR( i = 0; i < 10; i++ )
56 : {
57 31000 : sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_1[i] ); /* Q16 + QB */
58 31000 : t_sp_center = L_add( L_shr( sb_power_mlt, 6 ), t_sp_center ); /* Q11 + QB */
59 31000 : frame_power = L_add( sb_power_shr[i], frame_power ); /*0-9 */ /* Q26 */
60 : }
61 :
62 3100 : t_sp_center_nb = t_sp_center;
63 3100 : move32();
64 3100 : frame_power_nb = frame_power;
65 3100 : move32();
66 :
67 : /*+0.1 */
68 3100 : Q_t_sc = sub( Q_sb_p, 10 );
69 3100 : IF( GE_16( Q_t_sc, 34 ) )
70 : {
71 6 : t_sp_center = L_shr( t_sp_center, sub( Q_t_sc, 33 ) ); /* Q44 + QB - Q_t_sc)*/
72 6 : zerop1 = CNT0P1 >> 1; /* Q33 */
73 6 : move32();
74 6 : Q_t_sc = 33;
75 6 : move16();
76 : }
77 : ELSE
78 : {
79 3094 : Q_t_sc = sub( Q_t_sc, 1 ); /* Q_t_sc - 1 */
80 3094 : t_sp_center = L_shr( t_sp_center, 1 ); /* Q10 + QB */
81 3094 : zerop1 = L_shr( CNT0P1, sub( 34, Q_t_sc ) ); /* Q_t_sc */
82 : }
83 3100 : t_sp_center_num = L_add( t_sp_center, zerop1 );
84 :
85 3100 : Q_f_p = sub( Q_sb_p, 5 );
86 3100 : IF( GE_16( Q_f_p, 34 ) )
87 : {
88 21 : frame_power = L_shr( frame_power, sub( Q_f_p, 33 ) );
89 21 : zerop1 = ( CNT0P1 >> 1 );
90 21 : move32();
91 21 : Q_f_p = 33;
92 21 : move16();
93 : }
94 : ELSE
95 : {
96 3079 : Q_f_p = sub( Q_f_p, 1 );
97 3079 : frame_power = L_shr( frame_power, 1 );
98 3079 : zerop1 = L_shr( CNT0P1, sub( 34, Q_f_p ) );
99 : }
100 :
101 3100 : frame_power_den = L_add( frame_power, zerop1 );
102 3100 : IF( frame_power == 0 )
103 : {
104 0 : frame_power_den = CNT0P1;
105 0 : move32();
106 0 : Q_f_p = 34;
107 0 : move16();
108 : }
109 : /*div */
110 3100 : Q_t_sp_center = sub( norm_l( t_sp_center_num ), 1 );
111 3100 : Q_frame_power = norm_l( frame_power_den );
112 3100 : t_sp_center_num = L_shl( t_sp_center_num, Q_t_sp_center );
113 3100 : frame_power_den = L_shl( frame_power_den, Q_frame_power );
114 :
115 3100 : d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
116 :
117 3100 : d_t_sp_center_Qtmp = add( Q_t_sc, Q_t_sp_center );
118 3100 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_frame_power );
119 3100 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_f_p );
120 3100 : d_t_sp_center_Qtmp = add( d_t_sp_center_Qtmp, 15 );
121 3100 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, SP_CENTER_Q );
122 :
123 3100 : d_t_sp_center = shr( d_t_sp_center, d_t_sp_center_Qtmp );
124 3100 : sp_center[0] = add( mult( sp_center[0], 0x5999 ), mult( d_t_sp_center, 0x2666 ) );
125 3100 : sp_center[2] = d_t_sp_center;
126 3100 : move16();
127 3100 : move16();
128 :
129 3100 : t_sp_center = 0;
130 3100 : move32();
131 3100 : frame_power = 0;
132 3100 : move32();
133 3100 : IF( EQ_32( bw_index, CLDFBVAD_WB_ID ) )
134 : {
135 0 : FOR( i = 10; i < 20; i++ )
136 : {
137 0 : sb_power_shr[i] = L_shr( sb_power[i], 5 );
138 0 : move32();
139 : }
140 :
141 0 : FOR( i = 1; i < 20; i++ )
142 : {
143 0 : sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_2[i - 1] );
144 0 : t_sp_center = L_add( L_shr( sb_power_mlt, 8 ), t_sp_center );
145 0 : frame_power = L_add( sb_power_shr[i], frame_power ); /*1-19 */
146 : }
147 : /*+0.1 */
148 0 : Q_t_sc = sub( Q_sb_p, 13 );
149 :
150 0 : IF( GE_16( Q_t_sc, 34 ) )
151 : {
152 0 : t_sp_center = L_shr( t_sp_center, sub( Q_t_sc, 33 ) );
153 0 : zerop1 = ( CNT0P1 >> 1 );
154 0 : move32();
155 0 : Q_t_sc = 33;
156 0 : move16();
157 : }
158 : ELSE
159 : {
160 0 : Q_t_sc = sub( Q_t_sc, 1 );
161 0 : t_sp_center = L_shr( t_sp_center, 1 );
162 0 : zerop1 = L_shr( CNT0P1, s_min( 31, sub( 34, Q_t_sc ) ) );
163 : }
164 0 : t_sp_center_num = L_add( t_sp_center, zerop1 );
165 :
166 0 : Q_f_p = sub( Q_sb_p, 5 );
167 0 : IF( GE_16( Q_f_p, 34 ) )
168 : {
169 0 : frame_power = L_shr( frame_power, sub( Q_f_p, 33 ) );
170 0 : zerop1 = L_shr( CNT0P1, 1 );
171 0 : Q_f_p = 33;
172 0 : move16();
173 : }
174 : ELSE
175 : {
176 0 : Q_f_p = sub( Q_f_p, 1 );
177 0 : frame_power = L_shr( frame_power, 1 );
178 0 : zerop1 = L_shr( CNT0P1, sub( 34, Q_f_p ) );
179 : }
180 0 : frame_power_den = L_add( frame_power, zerop1 );
181 0 : IF( frame_power == 0 )
182 : {
183 0 : frame_power_den = CNT0P1;
184 0 : move32();
185 0 : Q_f_p = 34;
186 0 : move16();
187 : }
188 :
189 : /*div */
190 0 : Q_t_sp_center = sub( norm_l( t_sp_center_num ), 1 );
191 0 : Q_frame_power = norm_l( frame_power_den );
192 0 : t_sp_center_num = L_shl( t_sp_center_num, Q_t_sp_center );
193 0 : frame_power_den = L_shl( frame_power_den, Q_frame_power );
194 :
195 0 : d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
196 :
197 0 : d_t_sp_center_Qtmp = add( Q_t_sc, Q_t_sp_center );
198 0 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_frame_power );
199 0 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_f_p );
200 0 : d_t_sp_center_Qtmp = add( d_t_sp_center_Qtmp, 15 );
201 0 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, SP_CENTER_Q );
202 :
203 0 : sp_center[3] = shr( d_t_sp_center, d_t_sp_center_Qtmp );
204 0 : move16();
205 : }
206 3100 : ELSE IF( EQ_32( bw_index, CLDFBVAD_SWB_ID ) )
207 : {
208 46500 : FOR( i = 10; i < 24; i++ )
209 : {
210 43400 : sb_power_shr[i] = L_shr( sb_power[i], 5 );
211 43400 : move32();
212 : }
213 :
214 74400 : FOR( i = 1; i < 24; i++ )
215 : {
216 71300 : sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_2[i - 1] );
217 71300 : t_sp_center = L_add( L_shr( sb_power_mlt, 9 ), t_sp_center );
218 71300 : frame_power = L_add( sb_power_shr[i], frame_power ); /*1-23 */
219 : }
220 :
221 : /*+0.1 */
222 3100 : Q_t_sc = sub( Q_sb_p, 14 );
223 :
224 3100 : IF( GE_16( Q_t_sc, 34 ) )
225 : {
226 3 : t_sp_center = L_shr( t_sp_center, limitScale32( sub( Q_t_sc, 33 ) ) );
227 3 : zerop1 = ( CNT0P1 >> 1 );
228 3 : move32();
229 3 : Q_t_sc = 33;
230 3 : move16();
231 : }
232 : ELSE
233 : {
234 3097 : Q_t_sc = sub( Q_t_sc, 1 );
235 3097 : t_sp_center = L_shr( t_sp_center, 1 );
236 3097 : zerop1 = L_shr( CNT0P1, limitScale32( sub( 34, Q_t_sc ) ) );
237 : }
238 3100 : t_sp_center_num = L_add( t_sp_center, zerop1 );
239 :
240 3100 : Q_f_p = sub( Q_sb_p, 5 );
241 3100 : IF( GE_16( Q_f_p, 34 ) )
242 : {
243 21 : frame_power = L_shr( frame_power, sub( Q_f_p, 33 ) );
244 21 : zerop1 = ( CNT0P1 >> 1 );
245 21 : move32();
246 21 : Q_f_p = 33;
247 21 : move16();
248 : }
249 : ELSE
250 : {
251 3079 : Q_f_p = sub( Q_f_p, 1 );
252 3079 : frame_power = L_shr( frame_power, 1 );
253 3079 : zerop1 = L_shr( CNT0P1, sub( 34, Q_f_p ) );
254 : }
255 3100 : frame_power_den = L_add( frame_power, zerop1 );
256 3100 : IF( frame_power == 0 )
257 : {
258 0 : frame_power_den = CNT0P1;
259 0 : move32();
260 0 : Q_f_p = 34;
261 0 : move16();
262 : }
263 :
264 : /*div*/
265 3100 : Q_t_sp_center = sub( norm_l( t_sp_center_num ), 1 );
266 3100 : Q_frame_power = norm_l( frame_power_den );
267 3100 : t_sp_center_num = L_shl( t_sp_center_num, Q_t_sp_center );
268 3100 : frame_power_den = L_shl( frame_power_den, Q_frame_power );
269 :
270 3100 : d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
271 :
272 3100 : d_t_sp_center_Qtmp = add( Q_t_sc, Q_t_sp_center );
273 3100 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_frame_power );
274 3100 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_f_p );
275 3100 : d_t_sp_center_Qtmp = add( d_t_sp_center_Qtmp, 15 );
276 3100 : d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, SP_CENTER_Q );
277 3100 : sp_center[3] = shr( d_t_sp_center, d_t_sp_center_Qtmp );
278 3100 : move16();
279 : }
280 : ELSE
281 : {
282 0 : t_sp_center = t_sp_center_nb;
283 0 : move32();
284 0 : frame_power = frame_power_nb;
285 0 : move32();
286 :
287 0 : IF( frame_power == 0 )
288 : {
289 0 : d_t_sp_center = 0;
290 0 : move16();
291 : }
292 : ELSE
293 : {
294 : /*div*/
295 0 : Q_t_sp_center = sub( norm_l( t_sp_center ), 1 );
296 0 : Q_frame_power = norm_l( frame_power );
297 0 : t_sp_center_num = L_shl( t_sp_center, Q_t_sp_center );
298 0 : frame_power_den = L_shl( frame_power, Q_frame_power );
299 :
300 0 : d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
301 0 : d_t_sp_center = shr( d_t_sp_center, sub( add( sub( Q_t_sp_center, Q_frame_power ), 10 ), SP_CENTER_Q ) );
302 : }
303 :
304 0 : sp_center[0] = add( mult( sp_center[0], 0x5999 ), mult( d_t_sp_center, 0x2666 ) );
305 0 : sp_center[2] = d_t_sp_center;
306 0 : move16();
307 0 : move16();
308 :
309 0 : t_sp_center = 0;
310 0 : move32();
311 0 : frame_power = 0;
312 0 : move32();
313 0 : FOR( i = 1; i < 10; i++ )
314 : {
315 0 : sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_1[i - 1] );
316 0 : t_sp_center = L_add( L_shr( sb_power_mlt, 6 ), t_sp_center );
317 0 : frame_power = L_add( sb_power_shr[i], frame_power ); /*1-9 */
318 : }
319 0 : IF( frame_power == 0 )
320 : {
321 0 : sp_center[3] = 0;
322 0 : move16();
323 : }
324 : ELSE
325 : {
326 : /*div */
327 0 : Q_t_sp_center = sub( norm_l( t_sp_center ), 1 );
328 0 : Q_frame_power = norm_l( frame_power );
329 0 : t_sp_center_num = L_shl( t_sp_center, Q_t_sp_center );
330 0 : frame_power_den = L_shl( frame_power, Q_frame_power );
331 :
332 0 : d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
333 0 : sp_center[3] = shr( d_t_sp_center, sub( add( sub( Q_t_sp_center, Q_frame_power ), 10 ), SP_CENTER_Q ) );
334 0 : move16();
335 : }
336 : }
337 3100 : }
|