FreeCalypso > hg > gsm-codec-lib
annotate libtwamr/qgain475.c @ 542:f2d0f2f15d5f
libgsmefr: add wrapper for TW-TS-001 RTP input
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 28 Sep 2024 06:38:08 +0000 |
parents | 1d2b39027b70 |
children |
rev | line source |
---|---|
375
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * R99 Version 3.3.0 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * REL-4 Version 4.1.0 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * File : qg475.c |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * Purpose : Quantization of pitch and codebook gains for MR475. |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 * MODULE INCLUDE FILE AND VERSION ID |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 #include "namespace.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #include "qgain475.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 * INCLUDE FILES |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 #include "tw_amr.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include "typedef.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #include "basic_op.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include "mac_32.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 #include "no_count.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 #include "cnst.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 #include "pow2.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 #include "log2.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 #include "qua_gain_tab.h" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 * LOCAL VARIABLES AND TABLES |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 /* minimum allowed gain code prediction error: 102.887/4096 = 0.0251189 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 #define MIN_QUA_ENER ( -5443) /* Q10 <-> log2 (0.0251189) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 #define MIN_QUA_ENER_MR122 (-32768) /* Q10 <-> 20*log10(0.0251189) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 /* minimum allowed gain code prediction error: 32000/4096 = 7.8125 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 #define MAX_QUA_ENER ( 3037) /* Q10 <-> log2 (7.8125) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 #define MAX_QUA_ENER_MR122 ( 18284) /* Q10 <-> 20*log10(7.8125) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 * PRIVATE PROGRAM CODE |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 static void MR475_quant_store_results( |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 gc_predState *pred_st, /* i/o: gain predictor state struct */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 const Word16 *p, /* i : pointer to selected quantizer table entry */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 Word16 gcode0, /* i : predicted CB gain, Q(14 - exp_gcode0) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 Word16 exp_gcode0, /* i : exponent of predicted CB gain, Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 Word16 *gain_pit, /* o : Pitch gain, Q14 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 Word16 *gain_cod /* o : Code gain, Q1 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 ) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 Word16 g_code, exp, frac, tmp; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 Word32 L_tmp; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 Word16 qua_ener_MR122; /* o : quantized energy error, MR122 version Q10 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 Word16 qua_ener; /* o : quantized energy error, Q10 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 /* Read the quantized gains */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 *gain_pit = *p++; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 g_code = *p++; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 /*------------------------------------------------------------------* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 * calculate final fixed codebook gain: * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 * * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 * gc = gc0 * g * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 *------------------------------------------------------------------*/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 L_tmp = L_mult(g_code, gcode0); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 L_tmp = L_shr(L_tmp, sub(10, exp_gcode0)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 *gain_cod = extract_h(L_tmp); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 /*------------------------------------------------------------------* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 * calculate predictor update values and update gain predictor: * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 * * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 * qua_ener = log2(g) * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 * qua_ener_MR122 = 20*log10(g) * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 *------------------------------------------------------------------*/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 Log2 (L_deposit_l (g_code), &exp, &frac); /* Log2(x Q12) = log2(x) + 12 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 exp = sub(exp, 12); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 tmp = shr_r (frac, 5); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 qua_ener_MR122 = add (tmp, shl (exp, 10)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 L_tmp = Mpy_32_16(exp, frac, 24660); /* 24660 Q12 ~= 6.0206 = 20*log10(2) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 qua_ener = round (L_shl (L_tmp, 13)); /* Q12 * Q0 = Q13 -> Q10 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 gc_pred_update(pred_st, qua_ener_MR122, qua_ener); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 * PUBLIC PROGRAM CODE |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 ******************************************************************************** |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 /************************************************************************* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 * FUNCTION: MR475_update_unq_pred() |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 * PURPOSE: use optimum codebook gain and update "unquantized" |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 * gain predictor with the (bounded) prediction error |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 *************************************************************************/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 void |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 MR475_update_unq_pred( |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 gc_predState *pred_st, /* i/o: gain predictor state struct */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 Word16 exp_gcode0, /* i : predicted CB gain (exponent MSW), Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 Word16 frac_gcode0, /* i : predicted CB gain (exponent LSW), Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 Word16 cod_gain_exp, /* i : optimum codebook gain (exponent), Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 Word16 cod_gain_frac /* i : optimum codebook gain (fraction), Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 ) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 Word16 tmp, exp, frac; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 Word16 qua_ener, qua_ener_MR122; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 Word32 L_tmp; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 /* calculate prediction error factor (given optimum CB gain gcu): |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 * predErrFact = gcu / gcode0 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 * (limit to MIN_PRED_ERR_FACT <= predErrFact <= MAX_PRED_ERR_FACT |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 * -> limit qua_ener*) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 * calculate prediction error (log): |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 * qua_ener_MR122 = log2(predErrFact) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 * qua_ener = 20*log10(predErrFact) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 if (test(), cod_gain_frac <= 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 /* if gcu <= 0 -> predErrFact = 0 < MIN_PRED_ERR_FACT */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 /* -> set qua_ener(_MR122) directly */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 qua_ener = MIN_QUA_ENER; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 qua_ener_MR122 = MIN_QUA_ENER_MR122; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 else |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 /* convert gcode0 from DPF to standard fraction/exponent format */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 /* with normalized frac, i.e. 16384 <= frac <= 32767 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 /* Note: exponent correction (exp=exp-14) is done after div_s */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 frac_gcode0 = extract_l (Pow2 (14, frac_gcode0)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 /* make sure cod_gain_frac < frac_gcode0 for div_s */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 if (test (), sub(cod_gain_frac, frac_gcode0) >= 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 cod_gain_frac = shr (cod_gain_frac, 1); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 cod_gain_exp = add (cod_gain_exp, 1); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 predErrFact |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 = gcu / gcode0 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 = cod_gain_frac/frac_gcode0 * 2^(cod_gain_exp-(exp_gcode0-14)) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 = div_s (c_g_f, frac_gcode0)*2^-15 * 2^(c_g_e-exp_gcode0+14) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 = div_s * 2^(cod_gain_exp-exp_gcode0 - 1) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 frac = div_s (cod_gain_frac, frac_gcode0); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 tmp = sub (sub (cod_gain_exp, exp_gcode0), 1); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 Log2 (L_deposit_l (frac), &exp, &frac); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 exp = add (exp, tmp); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 /* calculate prediction error (log2, Q10) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 qua_ener_MR122 = shr_r (frac, 5); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 qua_ener_MR122 = add (qua_ener_MR122, shl (exp, 10)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 if (test (), sub(qua_ener_MR122, MIN_QUA_ENER_MR122) < 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 qua_ener = MIN_QUA_ENER; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 qua_ener_MR122 = MIN_QUA_ENER_MR122; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 else if (test (), sub(qua_ener_MR122, MAX_QUA_ENER_MR122) > 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 qua_ener = MAX_QUA_ENER; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 qua_ener_MR122 = MAX_QUA_ENER_MR122; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 else |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 /* calculate prediction error (20*log10, Q10) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 L_tmp = Mpy_32_16(exp, frac, 24660); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 /* 24660 Q12 ~= 6.0206 = 20*log10(2) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 qua_ener = round (L_shl (L_tmp, 13)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 /* Q12 * Q0 = Q13 -> Q26 -> Q10 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 /* update MA predictor memory */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 gc_pred_update(pred_st, qua_ener_MR122, qua_ener); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 /************************************************************************* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 * FUNCTION: MR475_gain_quant() |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 * PURPOSE: Quantization of pitch and codebook gains for two subframes |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 * (using predicted codebook gain) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 *************************************************************************/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 Word16 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 MR475_gain_quant( /* o : index of quantization. */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 gc_predState *pred_st, /* i/o: gain predictor state struct */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 /* data from subframe 0 (or 2) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 Word16 sf0_exp_gcode0, /* i : predicted CB gain (exponent), Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 Word16 sf0_frac_gcode0, /* i : predicted CB gain (fraction), Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 Word16 sf0_exp_coeff[], /* i : energy coeff. (5), exponent part, Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 Word16 sf0_frac_coeff[], /* i : energy coeff. (5), fraction part, Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 /* (frac_coeff and exp_coeff computed in */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 /* calc_filt_energies()) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 Word16 sf0_exp_target_en, /* i : exponent of target energy, Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 Word16 sf0_frac_target_en, /* i : fraction of target energy, Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 /* data from subframe 1 (or 3) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 Word16 sf1_code_nosharp[], /* i : innovative codebook vector (L_SUBFR) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 /* (whithout pitch sharpening) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 Word16 sf1_exp_gcode0, /* i : predicted CB gain (exponent), Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 Word16 sf1_frac_gcode0, /* i : predicted CB gain (fraction), Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 Word16 sf1_exp_coeff[], /* i : energy coeff. (5), exponent part, Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 Word16 sf1_frac_coeff[], /* i : energy coeff. (5), fraction part, Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 /* (frac_coeff and exp_coeff computed in */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 /* calc_filt_energies()) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 Word16 sf1_exp_target_en, /* i : exponent of target energy, Q0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 Word16 sf1_frac_target_en, /* i : fraction of target energy, Q15 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 Word16 gp_limit, /* i : pitch gain limit */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 Word16 *sf0_gain_pit, /* o : Pitch gain, Q14 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 Word16 *sf0_gain_cod, /* o : Code gain, Q1 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 Word16 *sf1_gain_pit, /* o : Pitch gain, Q14 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 Word16 *sf1_gain_cod /* o : Code gain, Q1 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 ) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 const Word16 *p; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 Word16 i, index = 0; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 Word16 tmp; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 Word16 exp; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 Word16 sf0_gcode0, sf1_gcode0; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 Word16 g_pitch, g2_pitch, g_code, g2_code, g_pit_cod; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 Word16 coeff[10], coeff_lo[10], exp_max[10]; /* 0..4: sf0; 5..9: sf1 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 Word32 L_tmp, dist_min; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 /*-------------------------------------------------------------------* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 * predicted codebook gain * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 * ~~~~~~~~~~~~~~~~~~~~~~~ * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 * gc0 = 2^exp_gcode0 + 2^frac_gcode0 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 * * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 * gcode0 (Q14) = 2^14*2^frac_gcode0 = gc0 * 2^(14-exp_gcode0) * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 *-------------------------------------------------------------------*/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 sf0_gcode0 = extract_l(Pow2(14, sf0_frac_gcode0)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 sf1_gcode0 = extract_l(Pow2(14, sf1_frac_gcode0)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 * For each subframe, the error energy (sum) to be minimized consists |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 * of five terms, t[0..4]. |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 * t[0] = gp^2 * <y1 y1> |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 * t[1] = -2*gp * <xn y1> |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 * t[2] = gc^2 * <y2 y2> |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 * t[3] = -2*gc * <xn y2> |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 * t[4] = 2*gp*gc * <y1 y2> |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 /* sf 0 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 /* determine the scaling exponent for g_code: ec = ec0 - 11 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 exp = sub(sf0_exp_gcode0, 11); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 /* calculate exp_max[i] = s[i]-1 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 exp_max[0] = sub(sf0_exp_coeff[0], 13); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 exp_max[1] = sub(sf0_exp_coeff[1], 14); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 exp_max[2] = add(sf0_exp_coeff[2], add(15, shl(exp, 1))); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 exp_max[3] = add(sf0_exp_coeff[3], exp); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 exp_max[4] = add(sf0_exp_coeff[4], add(1, exp)); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 /* sf 1 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 /* determine the scaling exponent for g_code: ec = ec0 - 11 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 exp = sub(sf1_exp_gcode0, 11); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 /* calculate exp_max[i] = s[i]-1 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 exp_max[5] = sub(sf1_exp_coeff[0], 13); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 exp_max[6] = sub(sf1_exp_coeff[1], 14); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 exp_max[7] = add(sf1_exp_coeff[2], add(15, shl(exp, 1))); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 exp_max[8] = add(sf1_exp_coeff[3], exp); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 exp_max[9] = add(sf1_exp_coeff[4], add(1, exp)); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 /*-------------------------------------------------------------------* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 * Gain search equalisation: * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 * ~~~~~~~~~~~~~~~~~~~~~~~~~ * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 * The MSE for the two subframes is weighted differently if there * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 * is a big difference in the corresponding target energies * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 *-------------------------------------------------------------------*/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 /* make the target energy exponents the same by de-normalizing the |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 fraction of the smaller one. This is necessary to be able to compare |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 them |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 exp = sf0_exp_target_en - sf1_exp_target_en; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 test (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 if (exp > 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 sf1_frac_target_en = shr (sf1_frac_target_en, exp); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 else |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 sf0_frac_target_en = shl (sf0_frac_target_en, exp); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 /* assume no change of exponents */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 exp = 0; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 /* test for target energy difference; set exp to +1 or -1 to scale |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 * up/down coefficients for sf 1 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 tmp = shr_r (sf1_frac_target_en, 1); /* tmp = ceil(0.5*en(sf1)) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 test (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 if (sub (tmp, sf0_frac_target_en) > 0) /* tmp > en(sf0)? */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 * target_energy(sf1) > 2*target_energy(sf0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 * -> scale up MSE(sf0) by 2 by adding 1 to exponents 0..4 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 exp = 1; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 else |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 tmp = shr (add (sf0_frac_target_en, 3), 2); /* tmp=ceil(0.25*en(sf0)) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 test(); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 if (sub (tmp, sf1_frac_target_en) > 0) /* tmp > en(sf1)? */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 /* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 * target_energy(sf1) < 0.25*target_energy(sf0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 * -> scale down MSE(sf0) by 0.5 by subtracting 1 from |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 * coefficients 0..4 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 exp = -1; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 for (i = 0; i < 5; i++) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 exp_max[i] = add (exp_max[i], exp); move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 /*-------------------------------------------------------------------* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 * Find maximum exponent: * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 * ~~~~~~~~~~~~~~~~~~~~~~ * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 * * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 * For the sum operation, all terms must have the same scaling; * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 * that scaling should be low enough to prevent overflow. There- * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 * fore, the maximum scale is determined and all coefficients are * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 * re-scaled: * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 * * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 * exp = max(exp_max[i]) + 1; * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 * e = exp_max[i]-exp; e <= 0! * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 * c[i] = c[i]*2^e * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 *-------------------------------------------------------------------*/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 exp = exp_max[0]; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 for (i = 1; i < 10; i++) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 move16(); test(); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 if (sub(exp_max[i], exp) > 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 exp = exp_max[i]; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 exp = add(exp, 1); /* To avoid overflow */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391 p = &sf0_frac_coeff[0]; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 for (i = 0; i < 5; i++) { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 tmp = sub(exp, exp_max[i]); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 L_tmp = L_deposit_h(*p++); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 L_tmp = L_shr(L_tmp, tmp); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 L_Extract(L_tmp, &coeff[i], &coeff_lo[i]); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 p = &sf1_frac_coeff[0]; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 for (; i < 10; i++) { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 tmp = sub(exp, exp_max[i]); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 L_tmp = L_deposit_h(*p++); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 L_tmp = L_shr(L_tmp, tmp); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 L_Extract(L_tmp, &coeff[i], &coeff_lo[i]); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 /*-------------------------------------------------------------------* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 * Codebook search: * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 * ~~~~~~~~~~~~~~~~ * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 * * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 * For each pair (g_pitch, g_fac) in the table calculate the * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 * terms t[0..4] and sum them up; the result is the mean squared * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 * error for the quantized gains from the table. The index for the * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 * minimum MSE is stored and finally used to retrieve the quantized * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 * gains * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 *-------------------------------------------------------------------*/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 /* start with "infinite" MSE */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418 dist_min = MAX_32; move32(); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 p = &table_gain_MR475[0]; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 for (i = 0; i < MR475_VQ_SIZE; i++) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 /* subframe 0 (and 2) calculations */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 g_pitch = *p++; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 g_code = *p++; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 g_code = mult(g_code, sf0_gcode0); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 g2_pitch = mult(g_pitch, g_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 g2_code = mult(g_code, g_code); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 g_pit_cod = mult(g_code, g_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 L_tmp = Mpy_32_16( coeff[0], coeff_lo[0], g2_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 L_tmp = Mac_32_16(L_tmp, coeff[1], coeff_lo[1], g_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 L_tmp = Mac_32_16(L_tmp, coeff[2], coeff_lo[2], g2_code); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 L_tmp = Mac_32_16(L_tmp, coeff[3], coeff_lo[3], g_code); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 L_tmp = Mac_32_16(L_tmp, coeff[4], coeff_lo[4], g_pit_cod); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 tmp = sub (g_pitch, gp_limit); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 /* subframe 1 (and 3) calculations */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 g_pitch = *p++; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 g_code = *p++; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 test (); test (); test (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 if (tmp <= 0 && sub(g_pitch, gp_limit) <= 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 g_code = mult(g_code, sf1_gcode0); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 g2_pitch = mult(g_pitch, g_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 g2_code = mult(g_code, g_code); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 g_pit_cod = mult(g_code, g_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453 L_tmp = Mac_32_16(L_tmp, coeff[5], coeff_lo[5], g2_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 L_tmp = Mac_32_16(L_tmp, coeff[6], coeff_lo[6], g_pitch); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 L_tmp = Mac_32_16(L_tmp, coeff[7], coeff_lo[7], g2_code); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 L_tmp = Mac_32_16(L_tmp, coeff[8], coeff_lo[8], g_code); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 L_tmp = Mac_32_16(L_tmp, coeff[9], coeff_lo[9], g_pit_cod); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 /* store table index if MSE for this index is lower |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 than the minimum MSE seen so far */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 test (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 if (L_sub(L_tmp, dist_min) < (Word32) 0) |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 { |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 dist_min = L_tmp; move32 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 index = i; move16 (); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 } |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 /*------------------------------------------------------------------* |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 * read quantized gains and update MA predictor memories * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 *------------------------------------------------------------------*/ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 /* for subframe 0, the pre-calculated gcode0/exp_gcode0 are the same |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 as those calculated from the "real" predictor using quantized gains */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477 tmp = shl(index, 2); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 MR475_quant_store_results(pred_st, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 &table_gain_MR475[tmp], |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 sf0_gcode0, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 sf0_exp_gcode0, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482 sf0_gain_pit, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 sf0_gain_cod); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 /* calculate new predicted gain for subframe 1 (this time using |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 the real, quantized gains) */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 gc_pred(pred_st, MR475, sf1_code_nosharp, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 &sf1_exp_gcode0, &sf1_frac_gcode0, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 &sf0_exp_gcode0, &sf0_gcode0); /* last two args are dummy */ |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490 sf1_gcode0 = extract_l(Pow2(14, sf1_frac_gcode0)); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492 tmp = add (tmp, 2); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 MR475_quant_store_results(pred_st, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 &table_gain_MR475[tmp], |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 sf1_gcode0, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 sf1_exp_gcode0, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497 sf1_gain_pit, |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 sf1_gain_cod); |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 return index; |
1d2b39027b70
libtwamr: integrate qgain475.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 } |