comparison libtwamr/d_gain_c.c @ 339:a723d9f9f697

libtwamr: integrate d_gain_c.c
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 18 Apr 2024 23:33:00 +0000
parents
children
comparison
equal deleted inserted replaced
338:5db2c920fc23 339:a723d9f9f697
1 /*
2 ********************************************************************************
3 *
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
5 * R99 Version 3.3.0
6 * REL-4 Version 4.1.0
7 *
8 ********************************************************************************
9 *
10 * File : d_gain_c.c
11 *
12 ********************************************************************************
13 */
14
15
16 /*
17 ********************************************************************************
18 * MODULE INCLUDE FILE AND VERSION ID
19 ********************************************************************************
20 */
21 #include "namespace.h"
22 #include "d_gain_c.h"
23
24 /*
25 ********************************************************************************
26 * INCLUDE FILES
27 ********************************************************************************
28 */
29 #include "tw_amr.h"
30 #include "typedef.h"
31 #include "basic_op.h"
32 #include "oper_32b.h"
33 #include "no_count.h"
34 #include "cnst.h"
35 #include "log2.h"
36 #include "pow2.h"
37 #include "gc_pred.h"
38 #include "gains_tab.h"
39
40 /*
41 ********************************************************************************
42 * PUBLIC PROGRAM CODE
43 ********************************************************************************
44 */
45
46 /*
47 **************************************************************************
48 *
49 * Function : d_gain_code
50 * Purpose : Decode the fixed codebook gain using the received index.
51 *
52 **************************************************************************
53 */
54 void d_gain_code (
55 gc_predState *pred_state, /* i/o : MA predictor state */
56 enum Mode mode, /* i : AMR mode (MR795 or MR122) */
57 Word16 index, /* i : received quantization index */
58 Word16 code[], /* i : innovation codevector */
59 Word16 *gain_code /* o : decoded innovation gain */
60 )
61 {
62 Word16 gcode0, exp, frac;
63 const Word16 *p;
64 Word16 qua_ener_MR122, qua_ener;
65 Word16 exp_inn_en;
66 Word16 frac_inn_en;
67 Word32 L_tmp;
68
69 /*-------------- Decode codebook gain ---------------*/
70
71 /*-------------------------------------------------------------------*
72 * predict codebook gain *
73 * ~~~~~~~~~~~~~~~~~~~~~ *
74 * gc0 = Pow2(int(d)+frac(d)) *
75 * = 2^exp + 2^frac *
76 * *
77 *-------------------------------------------------------------------*/
78
79 gc_pred(pred_state, mode, code, &exp, &frac,
80 &exp_inn_en, &frac_inn_en);
81
82 p = &qua_gain_code[add (add (index, index), index)];
83
84 /* Different scalings between MR122 and the other modes */
85 test ();
86 if (sub(mode, MR122) == 0)
87 {
88 gcode0 = extract_l (Pow2 (exp, frac)); /* predicted gain */
89 gcode0 = shl (gcode0, 4);
90 *gain_code = shl (mult (gcode0, *p++), 1); move16 ();
91 }
92 else
93 {
94 gcode0 = extract_l (Pow2 (14, frac));
95 L_tmp = L_mult(*p++, gcode0);
96 L_tmp = L_shr(L_tmp, sub(9, exp));
97 *gain_code = extract_h(L_tmp); /* Q1 */
98 }
99
100 /*-------------------------------------------------------------------*
101 * update table of past quantized energies *
102 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
103 *-------------------------------------------------------------------*/
104 qua_ener_MR122 = *p++; move16();
105 qua_ener = *p++; move16();
106 gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
107
108 return;
109 }