comparison libgsmefr/d_gains.c @ 61:a18782a7d270

libgsmefr: d_gains.c compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 25 Nov 2022 20:19:30 +0000
parents 49dd1ac8e75b
children 9b07190a6d08
comparison
equal deleted inserted replaced
60:d273a77d5523 61:a18782a7d270
8 * 8 *
9 * MA prediction is performed on the innovation energy 9 * MA prediction is performed on the innovation energy
10 * ( in dB/(20*log10(2)) ) with mean removed. 10 * ( in dB/(20*log10(2)) ) with mean removed.
11 *************************************************************************/ 11 *************************************************************************/
12 12
13 #include "gsm_efr.h"
13 #include "typedef.h" 14 #include "typedef.h"
15 #include "namespace.h"
14 #include "basic_op.h" 16 #include "basic_op.h"
15 #include "oper_32b.h" 17 #include "oper_32b.h"
16 #include "count.h" 18 #include "no_count.h"
17 #include "sig_proc.h" 19 #include "sig_proc.h"
20 #include "memops.h"
21 #include "codec.h"
18 22
19 #include "gains_tb.h" 23 #include "gains_tb.h"
20 24
21 #include "cnst.h" 25 #include "cnst.h"
26 #include "dec_state.h"
22 #include "dtx.h" 27 #include "dtx.h"
23
24 extern Word16 gain_code_old_rx[4 * DTX_HANGOVER];
25
26 /* Static variables for bad frame handling */
27
28 /* Variables used by d_gain_pitch: */
29 Word16 pbuf[5], past_gain_pit, prev_gp;
30
31 /* Variables used by d_gain_code: */
32 Word16 gbuf[5], past_gain_code, prev_gc;
33
34 /* Static variables for CNI (used by d_gain_code) */
35
36 Word16 gcode0_CN, gain_code_old_CN, gain_code_new_CN, gain_code_muting_CN;
37
38 /* Memories of gain dequantization: */
39
40 /* past quantized energies. */
41 /* initialized to -14.0/constant, constant = 20*Log10(2) */
42
43 Word16 past_qua_en[4];
44
45 /* MA prediction coeff */
46 Word16 pred[4];
47 28
48 /************************************************************************* 29 /*************************************************************************
49 * 30 *
50 * FUNCTION: gmed5 31 * FUNCTION: gmed5
51 * 32 *
53 * 34 *
54 * DESCRIPTION: 35 * DESCRIPTION:
55 * 36 *
56 *************************************************************************/ 37 *************************************************************************/
57 38
58 Word16 gmed5 ( /* out : index of the median value (0...4) */ 39 static Word16 gmed5 ( /* out : index of the median value (0...4) */
59 Word16 ind[] /* in : Past gain values */ 40 Word16 ind[] /* in : Past gain values */
60 ) 41 )
61 { 42 {
62 Word16 i, j, ix = 0, tmp[5]; 43 Word16 i, j, ix = 0, tmp[5];
63 Word16 max, tmp2[5]; 44 Word16 max, tmp2[5];
64 45
65 for (i = 0; i < 5; i++) 46 Copy (ind, tmp2, 5);
66 {
67 tmp2[i] = ind[i]; move16 ();
68 }
69 47
70 for (i = 0; i < 5; i++) 48 for (i = 0; i < 5; i++)
71 { 49 {
72 max = -8192; move16 (); 50 max = -8192; move16 ();
73 for (j = 0; j < 5; j++) 51 for (j = 0; j < 5; j++)
74 { 52 {
75 test (); 53 if (tmp2[j] >= max)
76 if (sub (tmp2[j], max) >= 0)
77 { 54 {
78 max = tmp2[j]; move16 (); 55 max = tmp2[j]; move16 ();
79 ix = j; move16 (); 56 ix = j; move16 ();
80 } 57 }
81 } 58 }
98 * past gain is used. 75 * past gain is used.
99 * 76 *
100 *************************************************************************/ 77 *************************************************************************/
101 78
102 Word16 d_gain_pitch ( /* out : quantized pitch gain */ 79 Word16 d_gain_pitch ( /* out : quantized pitch gain */
80 struct EFR_decoder_state *st,
103 Word16 index, /* in : index of quantization */ 81 Word16 index, /* in : index of quantization */
104 Word16 bfi, /* in : bad frame indicator (good = 0) */ 82 Word16 bfi, /* in : bad frame indicator (good = 0) */
105 Word16 state, 83 Word16 state,
106 Word16 prev_bf, 84 Word16 prev_bf,
107 Word16 rxdtx_ctrl 85 Word16 rxdtx_ctrl
113 9830, 6553, 6553 91 9830, 6553, 6553
114 }; 92 };
115 93
116 Word16 gain, tmp, i; 94 Word16 gain, tmp, i;
117 95
118 test ();
119 if (bfi == 0) 96 if (bfi == 0)
120 { 97 {
121 test (); logic16 ();
122 if ((rxdtx_ctrl & RX_SP_FLAG) != 0) 98 if ((rxdtx_ctrl & RX_SP_FLAG) != 0)
123 { 99 {
124 gain = shr (qua_gain_pitch[index], 2); move16 (); 100 gain = shr (qua_gain_pitch[index], 2);
125 101
126 test ();
127 if (prev_bf != 0) 102 if (prev_bf != 0)
128 { 103 {
129 test (); 104 if (gain > st->prev_gp)
130 if (sub (gain, prev_gp) > 0)
131 { 105 {
132 gain = prev_gp; 106 gain = st->prev_gp;
133 } 107 }
134 } 108 }
135 } 109 }
136 else 110 else
137 { 111 {
138 gain = 0; move16 (); 112 gain = 0;
139 } 113 }
140 prev_gp = gain; move16 (); 114 st->prev_gp = gain;
141 } 115 }
142 else 116 else
143 { 117 {
144 test (); logic16 ();
145 if ((rxdtx_ctrl & RX_SP_FLAG) != 0) 118 if ((rxdtx_ctrl & RX_SP_FLAG) != 0)
146 { 119 {
147 tmp = gmed5 (pbuf); move16 (); 120 tmp = gmed5 (st->pbuf);
148 121
149 test (); 122 if (tmp < st->past_gain_pit)
150 if (sub (tmp, past_gain_pit) < 0) 123 {
151 { 124 st->past_gain_pit = tmp;
152 past_gain_pit = tmp; move16 (); 125 }
153 } 126 gain = mult (pdown[state], st->past_gain_pit);
154 gain = mult (pdown[state], past_gain_pit); 127 }
155 } 128 else
156 else 129 {
157 { 130 gain = 0;
158 gain = 0; move16 (); 131 }
159 } 132 }
160 } 133
161 134 st->past_gain_pit = gain;
162 past_gain_pit = gain; move16 (); 135
163 136 if (sub (st->past_gain_pit, 4096) > 0) /* if (past_gain_pit > 1.0) */
164 test (); 137 {
165 if (sub (past_gain_pit, 4096) > 0) /* if (past_gain_pit > 1.0) */ 138 st->past_gain_pit = 4096;
166 {
167 past_gain_pit = 4096; move16 ();
168 } 139 }
169 for (i = 1; i < 5; i++) 140 for (i = 1; i < 5; i++)
170 { 141 {
171 pbuf[i - 1] = pbuf[i]; move16 (); 142 st->pbuf[i - 1] = st->pbuf[i];
172 } 143 }
173 144
174 pbuf[4] = past_gain_pit; move16 (); 145 st->pbuf[4] = st->past_gain_pit;
175 146
176 return gain; 147 return gain;
177 } 148 }
178 149
179 /************************************************************************* 150 /*************************************************************************
195 /* average innovation energy. */ 166 /* average innovation energy. */
196 /* MEAN_ENER = 36.0/constant, constant = 20*Log10(2) */ 167 /* MEAN_ENER = 36.0/constant, constant = 20*Log10(2) */
197 #define MEAN_ENER 783741L /* 36/(20*log10(2)) */ 168 #define MEAN_ENER 783741L /* 36/(20*log10(2)) */
198 169
199 void d_gain_code ( 170 void d_gain_code (
171 struct EFR_decoder_state *st,
200 Word16 index, /* input : received quantization index */ 172 Word16 index, /* input : received quantization index */
201 Word16 code[], /* input : innovation codevector */ 173 Word16 code[], /* input : innovation codevector */
202 Word16 lcode, /* input : codevector length */ 174 Word16 lcode, /* input : codevector length */
203 Word16 *gain_code, /* output: decoded innovation gain */ 175 Word16 *gain_code, /* output: decoded innovation gain */
204 Word16 bfi, /* input : bad frame indicator */ 176 Word16 bfi, /* input : bad frame indicator */
217 189
218 Word16 i, tmp; 190 Word16 i, tmp;
219 Word16 gcode0, exp, frac, av_pred_en; 191 Word16 gcode0, exp, frac, av_pred_en;
220 Word32 ener, ener_code; 192 Word32 ener, ener_code;
221 193
222 test (); test (); logic16 ();
223 if (((rxdtx_ctrl & RX_UPD_SID_QUANT_MEM) != 0) && (i_subfr == 0)) 194 if (((rxdtx_ctrl & RX_UPD_SID_QUANT_MEM) != 0) && (i_subfr == 0))
224 { 195 {
225 gcode0_CN = update_gcode0_CN (gain_code_old_rx); move16 (); 196 st->gcode0_CN = update_gcode0_CN (st->gain_code_old_rx);
226 gcode0_CN = shl (gcode0_CN, 4); 197 st->gcode0_CN = shl (st->gcode0_CN, 4);
227 } 198 }
228 199
229 /* Handle cases of comfort noise fixed codebook gain decoding in 200 /* Handle cases of comfort noise fixed codebook gain decoding in
230 which past valid SID frames are repeated */ 201 which past valid SID frames are repeated */
231 202
232 test (); test (); test (); logic16 (); logic16 (); logic16 ();
233 if (((rxdtx_ctrl & RX_NO_TRANSMISSION) != 0) 203 if (((rxdtx_ctrl & RX_NO_TRANSMISSION) != 0)
234 || ((rxdtx_ctrl & RX_INVALID_SID_FRAME) != 0) 204 || ((rxdtx_ctrl & RX_INVALID_SID_FRAME) != 0)
235 || ((rxdtx_ctrl & RX_LOST_SID_FRAME) != 0)) 205 || ((rxdtx_ctrl & RX_LOST_SID_FRAME) != 0))
236 { 206 {
237 207
238 test (); logic16 ();
239 if ((rxdtx_ctrl & RX_NO_TRANSMISSION) != 0) 208 if ((rxdtx_ctrl & RX_NO_TRANSMISSION) != 0)
240 { 209 {
241 /* DTX active: no transmission. Interpolate gain values 210 /* DTX active: no transmission. Interpolate gain values
242 in memory */ 211 in memory */
243 test ();
244 if (i_subfr == 0) 212 if (i_subfr == 0)
245 { 213 {
246 *gain_code = interpolate_CN_param (gain_code_old_CN, 214 *gain_code = interpolate_CN_param (st->gain_code_old_CN,
247 gain_code_new_CN, rx_dtx_state); 215 st->gain_code_new_CN, rx_dtx_state);
248 move16 ();
249 } 216 }
250 else 217 else
251 { 218 {
252 *gain_code = prev_gc; move16 (); 219 *gain_code = st->prev_gc;
253 } 220 }
254 } 221 }
255 else 222 else
256 { /* Invalid or lost SID frame: 223 { /* Invalid or lost SID frame:
257 use gain values from last good SID frame */ 224 use gain values from last good SID frame */
258 gain_code_old_CN = gain_code_new_CN; move16 (); 225 st->gain_code_old_CN = st->gain_code_new_CN;
259 *gain_code = gain_code_new_CN; move16 (); 226 *gain_code = st->gain_code_new_CN;
260 227
261 /* reset table of past quantized energies */ 228 /* reset table of past quantized energies */
262 for (i = 0; i < 4; i++) 229 for (i = 0; i < 4; i++)
263 { 230 {
264 past_qua_en[i] = -2381; move16 (); 231 st->past_qua_en[i] = -2381;
265 } 232 }
266 } 233 }
267 234
268 test (); logic16 ();
269 if ((rxdtx_ctrl & RX_DTX_MUTING) != 0) 235 if ((rxdtx_ctrl & RX_DTX_MUTING) != 0)
270 { 236 {
271 /* attenuate the gain value by 0.75 dB in each subframe */ 237 /* attenuate the gain value by 0.75 dB in each subframe */
272 /* (total of 3 dB per frame) */ 238 /* (total of 3 dB per frame) */
273 gain_code_muting_CN = mult (gain_code_muting_CN, 30057); 239 st->gain_code_muting_CN = mult (st->gain_code_muting_CN, 30057);
274 *gain_code = gain_code_muting_CN; move16 (); 240 *gain_code = st->gain_code_muting_CN;
275 } 241 }
276 else 242 else
277 { 243 {
278 /* Prepare for DTX muting by storing last good gain value */ 244 /* Prepare for DTX muting by storing last good gain value */
279 gain_code_muting_CN = gain_code_new_CN; move16 (); 245 st->gain_code_muting_CN = st->gain_code_new_CN;
280 } 246 }
281 247
282 past_gain_code = *gain_code; move16 (); 248 st->past_gain_code = *gain_code;
283 249
284 for (i = 1; i < 5; i++) 250 for (i = 1; i < 5; i++)
285 { 251 {
286 gbuf[i - 1] = gbuf[i]; move16 (); 252 st->gbuf[i - 1] = st->gbuf[i];
287 } 253 }
288 254
289 gbuf[4] = past_gain_code; move16 (); 255 st->gbuf[4] = st->past_gain_code;
290 prev_gc = past_gain_code; move16 (); 256 st->prev_gc = st->past_gain_code;
291 257
292 return; 258 return;
293 } 259 }
294 260
295 /*----------------- Test erasure ---------------*/ 261 /*----------------- Test erasure ---------------*/
296 262
297 test ();
298 if (bfi != 0) 263 if (bfi != 0)
299 { 264 {
300 tmp = gmed5 (gbuf); move16 (); 265 tmp = gmed5 (st->gbuf);
301 test (); 266 if (sub (tmp, st->past_gain_code) < 0)
302 if (sub (tmp, past_gain_code) < 0) 267 {
303 { 268 st->past_gain_code = tmp;
304 past_gain_code = tmp; move16 (); 269 }
305 } 270 st->past_gain_code = mult (st->past_gain_code, cdown[state]);
306 past_gain_code = mult (past_gain_code, cdown[state]); 271 *gain_code = st->past_gain_code;
307 *gain_code = past_gain_code; move16 (); 272
308 273 av_pred_en = 0;
309 av_pred_en = 0; move16 ();
310 for (i = 0; i < 4; i++) 274 for (i = 0; i < 4; i++)
311 { 275 {
312 av_pred_en = add (av_pred_en, past_qua_en[i]); 276 av_pred_en = add (av_pred_en, st->past_qua_en[i]);
313 } 277 }
314 278
315 /* av_pred_en = 0.25*av_pred_en - 4/(20Log10(2)) */ 279 /* av_pred_en = 0.25*av_pred_en - 4/(20Log10(2)) */
316 av_pred_en = mult (av_pred_en, 8192); /* *= 0.25 */ 280 av_pred_en = mult (av_pred_en, 8192); /* *= 0.25 */
317 281
318 /* if (av_pred_en < -14/(20Log10(2))) av_pred_en = .. */ 282 /* if (av_pred_en < -14/(20Log10(2))) av_pred_en = .. */
319 test ();
320 if (sub (av_pred_en, -2381) < 0) 283 if (sub (av_pred_en, -2381) < 0)
321 { 284 {
322 av_pred_en = -2381; move16 (); 285 av_pred_en = -2381;
323 } 286 }
324 for (i = 3; i > 0; i--) 287 for (i = 3; i > 0; i--)
325 { 288 {
326 past_qua_en[i] = past_qua_en[i - 1]; move16 (); 289 st->past_qua_en[i] = st->past_qua_en[i - 1];
327 } 290 }
328 past_qua_en[0] = av_pred_en; move16 (); 291 st->past_qua_en[0] = av_pred_en;
329 for (i = 1; i < 5; i++) 292 for (i = 1; i < 5; i++)
330 { 293 {
331 gbuf[i - 1] = gbuf[i]; move16 (); 294 st->gbuf[i - 1] = st->gbuf[i];
332 } 295 }
333 gbuf[4] = past_gain_code; move16 (); 296 st->gbuf[4] = st->past_gain_code;
334 297
335 /* Use the most recent comfort noise fixed codebook gain value 298 /* Use the most recent comfort noise fixed codebook gain value
336 for updating the fixed codebook gain history */ 299 for updating the fixed codebook gain history */
337 test (); 300 if (st->gain_code_new_CN == 0)
338 if (gain_code_new_CN == 0) 301 {
339 { 302 tmp = st->prev_gc;
340 tmp = prev_gc; move16 (); 303 }
341 } 304 else
342 else 305 {
343 { 306 tmp = st->gain_code_new_CN;
344 tmp = gain_code_new_CN; 307 }
345 } 308
346 309 update_gain_code_history_rx (st, tmp);
347 update_gain_code_history_rx (tmp, gain_code_old_rx); 310
348
349 test ();
350 if (sub (i_subfr, (3 * L_SUBFR)) == 0) 311 if (sub (i_subfr, (3 * L_SUBFR)) == 0)
351 { 312 {
352 gain_code_old_CN = *gain_code; move16 (); 313 st->gain_code_old_CN = *gain_code;
353 } 314 }
354 return; 315 return;
355 } 316 }
356 317
357 test (); logic16 ();
358 if ((rxdtx_ctrl & RX_SP_FLAG) != 0) 318 if ((rxdtx_ctrl & RX_SP_FLAG) != 0)
359 { 319 {
360 320
361 /*-------------- Decode codebook gain ---------------*/ 321 /*-------------- Decode codebook gain ---------------*/
362 322
384 /* predicted energy */ 344 /* predicted energy */
385 345
386 ener = MEAN_ENER; move32 (); 346 ener = MEAN_ENER; move32 ();
387 for (i = 0; i < 4; i++) 347 for (i = 0; i < 4; i++)
388 { 348 {
389 ener = L_mac (ener, past_qua_en[i], pred[i]); 349 ener = L_mac (ener, st->past_qua_en[i], st->pred[i]);
390 } 350 }
391 351
392 /*-------------------------------------------------------------------* 352 /*-------------------------------------------------------------------*
393 * predicted codebook gain * 353 * predicted codebook gain *
394 * ~~~~~~~~~~~~~~~~~~~~~~~ * 354 * ~~~~~~~~~~~~~~~~~~~~~~~ *
404 364
405 gcode0 = shl (gcode0, 4); 365 gcode0 = shl (gcode0, 4);
406 366
407 *gain_code = mult (qua_gain_code[index], gcode0); move16 (); 367 *gain_code = mult (qua_gain_code[index], gcode0); move16 ();
408 368
409 test ();
410 if (prev_bf != 0) 369 if (prev_bf != 0)
411 { 370 {
412 test (); 371 if (sub (*gain_code, st->prev_gc) > 0)
413 if (sub (*gain_code, prev_gc) > 0) 372 {
414 { 373 *gain_code = st->prev_gc;
415 *gain_code = prev_gc; move16 ();
416 } 374 }
417 } 375 }
418 /*-------------------------------------------------------------------* 376 /*-------------------------------------------------------------------*
419 * update table of past quantized energies * 377 * update table of past quantized energies *
420 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 378 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
423 * constant = 20*Log10(2) * 381 * constant = 20*Log10(2) *
424 *-------------------------------------------------------------------*/ 382 *-------------------------------------------------------------------*/
425 383
426 for (i = 3; i > 0; i--) 384 for (i = 3; i > 0; i--)
427 { 385 {
428 past_qua_en[i] = past_qua_en[i - 1]; move16 (); 386 st->past_qua_en[i] = st->past_qua_en[i - 1];
429 } 387 }
430 Log2 (L_deposit_l (qua_gain_code[index]), &exp, &frac); 388 Log2 (L_deposit_l (qua_gain_code[index]), &exp, &frac);
431 389
432 past_qua_en[0] = shr (frac, 5); move16 (); 390 st->past_qua_en[0] = shr (frac, 5);
433 past_qua_en[0] = add (past_qua_en[0], shl (sub (exp, 11), 10)); 391 st->past_qua_en[0] = add (st->past_qua_en[0], shl (sub (exp, 11), 10));
434 move16 (); 392
435 393 update_gain_code_history_rx (st, *gain_code);
436 update_gain_code_history_rx (*gain_code, gain_code_old_rx);
437 394
438 if (sub (i_subfr, (3 * L_SUBFR)) == 0) 395 if (sub (i_subfr, (3 * L_SUBFR)) == 0)
439 { 396 {
440 gain_code_old_CN = *gain_code; move16 (); 397 st->gain_code_old_CN = *gain_code;
441 } 398 }
442 } 399 }
443 else 400 else
444 { 401 {
445 test (); test (); logic16 ();
446 if (((rxdtx_ctrl & RX_FIRST_SID_UPDATE) != 0) && (i_subfr == 0)) 402 if (((rxdtx_ctrl & RX_FIRST_SID_UPDATE) != 0) && (i_subfr == 0))
447 { 403 {
448 gain_code_new_CN = mult (gcode0_CN, qua_gain_code[index]); 404 st->gain_code_new_CN = mult (st->gcode0_CN, qua_gain_code[index]);
449 405
450 /*---------------------------------------------------------------* 406 /*---------------------------------------------------------------*
451 * reset table of past quantized energies * 407 * reset table of past quantized energies *
452 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 408 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
453 *---------------------------------------------------------------*/ 409 *---------------------------------------------------------------*/
454 410
455 for (i = 0; i < 4; i++) 411 for (i = 0; i < 4; i++)
456 { 412 {
457 past_qua_en[i] = -2381; move16 (); 413 st->past_qua_en[i] = -2381;
458 } 414 }
459 } 415 }
460 test (); test (); logic16 ();
461 if (((rxdtx_ctrl & RX_CONT_SID_UPDATE) != 0) && (i_subfr == 0)) 416 if (((rxdtx_ctrl & RX_CONT_SID_UPDATE) != 0) && (i_subfr == 0))
462 { 417 {
463 gain_code_old_CN = gain_code_new_CN; move16 (); 418 st->gain_code_old_CN = st->gain_code_new_CN;
464 gain_code_new_CN = mult (gcode0_CN, qua_gain_code[index]); 419 st->gain_code_new_CN = mult (st->gcode0_CN, qua_gain_code[index]);
465 move16 (); 420 }
466 }
467 test ();
468 if (i_subfr == 0) 421 if (i_subfr == 0)
469 { 422 {
470 *gain_code = interpolate_CN_param (gain_code_old_CN, 423 *gain_code = interpolate_CN_param (st->gain_code_old_CN,
471 gain_code_new_CN, 424 st->gain_code_new_CN,
472 rx_dtx_state); move16 (); 425 rx_dtx_state);
473 } 426 }
474 else 427 else
475 { 428 {
476 *gain_code = prev_gc; move16 (); 429 *gain_code = st->prev_gc;
477 } 430 }
478 } 431 }
479 432
480 past_gain_code = *gain_code; move16 (); 433 st->past_gain_code = *gain_code;
481 434
482 for (i = 1; i < 5; i++) 435 for (i = 1; i < 5; i++)
483 { 436 {
484 gbuf[i - 1] = gbuf[i]; move16 (); 437 st->gbuf[i - 1] = st->gbuf[i];
485 } 438 }
486 gbuf[4] = past_gain_code; move16 (); 439 st->gbuf[4] = st->past_gain_code;
487 prev_gc = past_gain_code; move16 (); 440 st->prev_gc = st->past_gain_code;
488 441
489 return; 442 return;
490 } 443 }