annotate libtwamr/gc_pred.c @ 585:3c6bf0d26ee7 default tip

TW-TS-005 reader: fix maximum line length bug TW-TS-005 section 4.1 states: The maximum allowed length of each line is 80 characters, not including the OS-specific newline encoding. The implementation of this line length limit in the TW-TS-005 hex file reader function in the present suite was wrong, such that lines of the full maximum length could not be read. Fix it. Note that this bug affects comment lines too, not just actual RTP payloads. Neither Annex A nor Annex B features an RTP payload format that goes to the maximum of 40 bytes, but if a comment line goes to the maximum allowed length of 80 characters not including the terminating newline, the bug will be triggered, necessitating the present fix.
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 25 Feb 2025 07:49:28 +0000
parents 7f99b8ed30e5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : gc_pred.c
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : codebook gain MA prediction
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 /*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * MODULE INCLUDE FILE AND VERSION ID
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 #include "namespace.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 #include "gc_pred.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 /*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 * INCLUDE FILES
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 #include "typedef.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include "basic_op.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "oper_32b.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #include "cnst.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 #include "no_count.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 #include "log2.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 #include "memops.h"
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 /*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 * LOCAL VARIABLES AND TABLES
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 #define NPRED 4 /* number of prediction taps */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 /* MA prediction coefficients (Q13) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 static const Word16 pred[NPRED] = {5571, 4751, 2785, 1556};
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 /* average innovation energy. */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 /* MEAN_ENER = 36.0/constant, constant = 20*Log10(2) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 #define MEAN_ENER_MR122 783741L /* 36/(20*log10(2)) (Q17) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 /* MA prediction coefficients (Q6) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 static const Word16 pred_MR122[NPRED] = {44, 37, 22, 12};
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 /* minimum quantized energy: -14 dB */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 #define MIN_ENERGY -14336 /* 14 Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 #define MIN_ENERGY_MR122 -2381 /* 14 / (20*log10(2)) Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 /*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 * PUBLIC PROGRAM CODE
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 *****************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 /*************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 * Function: gc_pred_reset
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 * Purpose: Initializes state memory to zero
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 **************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 void gc_pred_reset (gc_predState *state)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 Word16 i;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 for(i = 0; i < NPRED; i++)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 state->past_qua_en[i] = MIN_ENERGY;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 state->past_qua_en_MR122[i] = MIN_ENERGY_MR122;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 /*************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 * FUNCTION: gc_pred_copy()
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 * PURPOSE: Copy MA predictor state variable
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 *************************************************************************/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 void
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 gc_pred_copy(
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 gc_predState *st_src, /* i : State struct */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 gc_predState *st_dest /* o : State struct */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 )
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 Copy (st_src->past_qua_en, st_dest->past_qua_en, NPRED);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 Copy (st_src->past_qua_en_MR122, st_dest->past_qua_en_MR122, NPRED);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 /*************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 * FUNCTION: gc_pred()
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 * PURPOSE: MA prediction of the innovation energy
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 * (in dB/(20*log10(2))) with mean removed).
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 *************************************************************************/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 void
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 gc_pred(
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 gc_predState *st, /* i/o: State struct */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 enum Mode mode, /* i : AMR mode */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 Word16 *code, /* i : innovative codebook vector (L_SUBFR) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 /* MR122: Q12, other modes: Q13 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 Word16 *exp_gcode0, /* o : exponent of predicted gain factor, Q0 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 Word16 *frac_gcode0,/* o : fraction of predicted gain factor Q15 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 Word16 *exp_en, /* o : exponent of innovation energy, Q0 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 /* (only calculated for MR795) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 Word16 *frac_en /* o : fraction of innovation energy, Q15 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 /* (only calculated for MR795) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 )
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 Word16 i;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 Word32 ener_code;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 Word16 exp, frac;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 /*-------------------------------------------------------------------*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 * energy of code: *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 * ~~~~~~~~~~~~~~~ *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 * ener_code = sum(code[i]^2) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 *-------------------------------------------------------------------*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 ener_code = L_mac((Word32) 0, code[0], code[0]);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 /* MR122: Q12*Q12 -> Q25 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 /* others: Q13*Q13 -> Q27 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 for (i = 1; i < L_SUBFR; i++)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 ener_code = L_mac(ener_code, code[i], code[i]);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 test ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 if (sub (mode, MR122) == 0)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 Word32 ener;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 /* ener_code = ener_code / lcode; lcode = 40; 1/40 = 26214 Q20 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 ener_code = L_mult (round (ener_code), 26214); /* Q9 * Q20 -> Q30 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 /*-------------------------------------------------------------------*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 * energy of code: *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 * ~~~~~~~~~~~~~~~ *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 * ener_code(Q17) = 10 * Log10(energy) / constant *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * = 1/2 * Log2(energy) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 * constant = 20*Log10(2) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 *-------------------------------------------------------------------*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 /* ener_code = 1/2 * Log2(ener_code); Note: Log2=log2+30 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 Log2(ener_code, &exp, &frac);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 ener_code = L_Comp (sub (exp, 30), frac); /* Q16 for log() */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 /* ->Q17 for 1/2 log()*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 /*-------------------------------------------------------------------*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 * predicted energy: *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 * ~~~~~~~~~~~~~~~~~ *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 * ener(Q24) = (Emean + sum{pred[i]*past_en[i]})/constant *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 * = MEAN_ENER + sum(pred[i]*past_qua_en[i]) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 * constant = 20*Log10(2) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 *-------------------------------------------------------------------*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 ener = MEAN_ENER_MR122; move32 (); /* Q24 (Q17) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 for (i = 0; i < NPRED; i++)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 ener = L_mac (ener, st->past_qua_en_MR122[i], pred_MR122[i]);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 /* Q10 * Q13 -> Q24 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 /* Q10 * Q6 -> Q17 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 /*-------------------------------------------------------------------*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 * predicted codebook gain *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 * ~~~~~~~~~~~~~~~~~~~~~~~ *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 * gc0 = Pow10( (ener*constant - ener_code*constant) / 20 ) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 * = Pow2(ener-ener_code) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 * = Pow2(int(d)+frac(d)) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 * *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 * (store exp and frac for pow2()) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 *-------------------------------------------------------------------*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 ener = L_shr (L_sub (ener, ener_code), 1); /* Q16 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 L_Extract(ener, exp_gcode0, frac_gcode0);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 else /* all modes except 12.2 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 Word32 L_tmp;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 Word16 exp_code, gcode0;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 /*-----------------------------------------------------------------*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 * Compute: means_ener - 10log10(ener_code/ L_sufr) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 *-----------------------------------------------------------------*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 exp_code = norm_l (ener_code);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 ener_code = L_shl (ener_code, exp_code);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 /* Log2 = log2 + 27 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 Log2_norm (ener_code, exp_code, &exp, &frac);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 /* fact = 10/log2(10) = 3.01 = 24660 Q13 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 L_tmp = Mpy_32_16(exp, frac, -24660); /* Q0.Q15 * Q13 -> Q14 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 /* L_tmp = means_ener - 10log10(ener_code/L_SUBFR)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 * = means_ener - 10log10(ener_code) + 10log10(L_SUBFR)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 * = K - fact * Log2(ener_code)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 * = K - fact * log2(ener_code) - fact*27
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 * ==> K = means_ener + fact*27 + 10log10(L_SUBFR)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 * means_ener = 33 = 540672 Q14 (MR475, MR515, MR59)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 * means_ener = 28.75 = 471040 Q14 (MR67)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 * means_ener = 30 = 491520 Q14 (MR74)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 * means_ener = 36 = 589824 Q14 (MR795)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 * means_ener = 33 = 540672 Q14 (MR102)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 * 10log10(L_SUBFR) = 16.02 = 262481.51 Q14
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 * fact * 27 = 1331640 Q14
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 * -----------------------------------------
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 * (MR475, MR515, MR59) K = 2134793.51 Q14 ~= 16678 * 64 * 2
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 * (MR67) K = 2065161.51 Q14 ~= 32268 * 32 * 2
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 * (MR74) K = 2085641.51 Q14 ~= 32588 * 32 * 2
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 * (MR795) K = 2183945.51 Q14 ~= 17062 * 64 * 2
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 * (MR102) K = 2134793.51 Q14 ~= 16678 * 64 * 2
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 if (test (), sub (mode, MR102) == 0)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 /* mean = 33 dB */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 L_tmp = L_mac(L_tmp, 16678, 64); /* Q14 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 else if (test (), sub (mode, MR795) == 0)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 /* ener_code = <xn xn> * 2^27*2^exp_code
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 frac_en = ener_code / 2^16
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 = <xn xn> * 2^11*2^exp_code
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 <xn xn> = <xn xn>*2^11*2^exp * 2^exp_en
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 := frac_en * 2^exp_en
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 ==> exp_en = -11-exp_code;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 *frac_en = extract_h (ener_code); move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 *exp_en = sub (-11, exp_code); move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 /* mean = 36 dB */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 L_tmp = L_mac(L_tmp, 17062, 64); /* Q14 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 else if (test (), sub (mode, MR74) == 0)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 /* mean = 30 dB */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 L_tmp = L_mac(L_tmp, 32588, 32); /* Q14 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 else if (test (), sub (mode, MR67) == 0)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 /* mean = 28.75 dB */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 L_tmp = L_mac(L_tmp, 32268, 32); /* Q14 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 else /* MR59, MR515, MR475 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 /* mean = 33 dB */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 L_tmp = L_mac(L_tmp, 16678, 64); /* Q14 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 /*-----------------------------------------------------------------*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 * Compute gcode0. *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 * = Sum(i=0,3) pred[i]*past_qua_en[i] - ener_code + mean_ener *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 *-----------------------------------------------------------------*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 L_tmp = L_shl(L_tmp, 10); /* Q24 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 for (i = 0; i < 4; i++)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 L_tmp = L_mac(L_tmp, pred[i], st->past_qua_en[i]);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 /* Q13 * Q10 -> Q24 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 gcode0 = extract_h(L_tmp); /* Q8 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 /*-----------------------------------------------------------------*
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 * gcode0 = pow(10.0, gcode0/20) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 * = pow(2, 3.3219*gcode0/20) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 * = pow(2, 0.166*gcode0) *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 *-----------------------------------------------------------------*/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 /* 5439 Q15 = 0.165985 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 /* (correct: 1/(20*log10(2)) 0.166096 = 5443 Q15) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 test ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 if (sub (mode, MR74) == 0) /* For IS641 bitexactness */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 L_tmp = L_mult(gcode0, 5439); /* Q8 * Q15 -> Q24 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 else
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 L_tmp = L_mult(gcode0, 5443); /* Q8 * Q15 -> Q24 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 L_tmp = L_shr(L_tmp, 8); /* -> Q16 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 L_Extract(L_tmp, exp_gcode0, frac_gcode0); /* -> Q0.Q15 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 /*************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 * FUNCTION: gc_pred_update()
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 * PURPOSE: update MA predictor with last quantized energy
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 *************************************************************************/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 void gc_pred_update(
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 gc_predState *st, /* i/o: State struct */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 Word16 qua_ener_MR122, /* i : quantized energy for update, Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 /* (log2(qua_err)) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 Word16 qua_ener /* i : quantized energy for update, Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 /* (20*log10(qua_err)) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 )
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 Word16 i;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 for (i = 3; i > 0; i--)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 st->past_qua_en[i] = st->past_qua_en[i - 1]; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 st->past_qua_en_MR122[i] = st->past_qua_en_MR122[i - 1]; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 st->past_qua_en_MR122[0] = qua_ener_MR122; /* log2 (qua_err), Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 st->past_qua_en[0] = qua_ener; /* 20*log10(qua_err), Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 /*************************************************************************
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 * FUNCTION: gc_pred_average_limited()
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 * PURPOSE: get average of MA predictor state values (with a lower limit)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 * [used in error concealment]
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 *
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 *************************************************************************/
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 void gc_pred_average_limited(
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 gc_predState *st, /* i: State struct */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 Word16 *ener_avg_MR122, /* o: everaged quantized energy, Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 /* (log2(qua_err)) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 Word16 *ener_avg /* o: averaged quantized energy, Q10 */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 /* (20*log10(qua_err)) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 )
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 Word16 av_pred_en;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 Word16 i;
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 /* do average in MR122 mode (log2() domain) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 av_pred_en = 0; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 for (i = 0; i < NPRED; i++)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 av_pred_en = add (av_pred_en, st->past_qua_en_MR122[i]);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 /* av_pred_en = 0.25*av_pred_en */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 av_pred_en = mult (av_pred_en, 8192);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 /* if (av_pred_en < -14/(20Log10(2))) av_pred_en = .. */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 test ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 if (sub (av_pred_en, MIN_ENERGY_MR122) < 0)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 av_pred_en = MIN_ENERGY_MR122; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 *ener_avg_MR122 = av_pred_en; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 /* do average for other modes (20*log10() domain) */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 av_pred_en = 0; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 for (i = 0; i < NPRED; i++)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 av_pred_en = add (av_pred_en, st->past_qua_en[i]);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 /* av_pred_en = 0.25*av_pred_en */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 av_pred_en = mult (av_pred_en, 8192);
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 /* if (av_pred_en < -14) av_pred_en = .. */
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 test ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371 if (sub (av_pred_en, MIN_ENERGY) < 0)
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 {
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 av_pred_en = MIN_ENERGY; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 }
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 *ener_avg = av_pred_en; move16 ();
7f99b8ed30e5 libtwamr: integrate gc_pred.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 }