annotate libgsmfr2/rpe.c @ 282:9ee8ad3d4d30

frtest: rm gsmfr-hand-test and gsmfr-max-out utils These hack programs were never properly documented and were written only as part of a debug chase, in pursuit of a bug that ultimately turned out to be in our then-hacky patch to osmo-bts-sysmo, before beginning of proper patches in Osmocom. These hack programs need to be dropped from the present sw package because they depend on old libgsm, and we are eliminating that dependency.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 05:44:47 +0000
parents bee3a94f42a7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
270
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This C source file has been adapted from TU-Berlin libgsm source,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * original notice follows:
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdint.h>
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <assert.h>
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include "tw_gsmfr.h"
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include "typedef.h"
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include "ed_state.h"
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 #include "ed_internal.h"
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 /* 4.2.13 .. 4.2.17 RPE ENCODING SECTION
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 /* 4.2.13 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 static void Weighting_filter (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 register word * e, /* signal [-5..0.39.44] IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 word * x /* signal [0..39] OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 /*
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 * The coefficients of the weighting filter are stored in a table
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * (see table 4.4). The following scaling is used:
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 * H[0..10] = integer( real_H[ 0..10] * 8192 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 /* word wt[ 50 ]; */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 register longword L_result;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 register int k /* , i */ ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 /* Initialization of a temporary working array wt[0...49]
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 /* for (k = 0; k <= 4; k++) wt[k] = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 * for (k = 5; k <= 44; k++) wt[k] = *e++;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 * for (k = 45; k <= 49; k++) wt[k] = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * (e[-5..-1] and e[40..44] are allocated by the caller,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 * are initially zero and are not written anywhere.)
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 e -= 5;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 /* Compute the signal x[0..39]
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 for (k = 0; k <= 39; k++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 L_result = 8192 >> 1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 /* for (i = 0; i <= 10; i++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 * L_result = GSM_L_ADD( L_result, L_temp );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 * }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 #undef STEP
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 #define STEP( i, H ) (e[ k + i ] * (longword)H)
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 /* Every one of these multiplications is done twice --
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 * but I don't see an elegant way to optimize this.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 * Do you?
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 #ifdef STUPID_COMPILER
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 L_result += STEP( 0, -134 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 L_result += STEP( 1, -374 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 /* + STEP( 2, 0 ) */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 L_result += STEP( 3, 2054 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 L_result += STEP( 4, 5741 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 L_result += STEP( 5, 8192 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 L_result += STEP( 6, 5741 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 L_result += STEP( 7, 2054 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 /* + STEP( 8, 0 ) */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 L_result += STEP( 9, -374 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 L_result += STEP( 10, -134 ) ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 #else
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 L_result +=
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 STEP( 0, -134 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 + STEP( 1, -374 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 /* + STEP( 2, 0 ) */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 + STEP( 3, 2054 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 + STEP( 4, 5741 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 + STEP( 5, 8192 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 + STEP( 6, 5741 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 + STEP( 7, 2054 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 /* + STEP( 8, 0 ) */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 + STEP( 9, -374 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 + STEP(10, -134 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 ;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 #endif
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 * x[k] = SASR( L_result, 16 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 /* 2 adds vs. >>16 => 14, minus one shift to compensate for
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 * those we lost when replacing L_MULT by '*'.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 L_result = SASR( L_result, 13 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 x[k] = ( L_result < MIN_WORD ? MIN_WORD
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 : (L_result > MAX_WORD ? MAX_WORD : L_result ));
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 /* 4.2.14 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 static void RPE_grid_selection (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 word * x, /* [0..39] IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 word * xM, /* [0..12] OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 word * Mc_out /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 /*
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 * The signal x[0..39] is used to select the RPE grid which is
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 * represented by Mc.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 /* register word temp1; */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 register int /* m, */ i;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 register longword L_result, L_temp;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 longword EM; /* xxx should be L_EM? */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 word Mc;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 longword L_common_0_3;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 EM = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 Mc = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 /* for (m = 0; m <= 3; m++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 * L_result = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 * for (i = 0; i <= 12; i++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 * temp1 = SASR( x[m + 3*i], 2 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 * assert(temp1 != MIN_WORD);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * L_temp = GSM_L_MULT( temp1, temp1 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 * L_result = GSM_L_ADD( L_temp, L_result );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 * }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 *
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 * if (L_result > EM) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 * Mc = m;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 * EM = L_result;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 * }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 * }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 #undef STEP
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 #define STEP( m, i ) L_temp = SASR( x[m + 3 * i], 2 ); \
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 L_result += L_temp * L_temp;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 /* common part of 0 and 3 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 L_result = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 L_common_0_3 = L_result;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 /* i = 0 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 STEP( 0, 0 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 L_result <<= 1; /* implicit in L_MULT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 EM = L_result;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 /* i = 1 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 L_result = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 STEP( 1, 0 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 L_result <<= 1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 if (L_result > EM) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 Mc = 1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 EM = L_result;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 /* i = 2 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 L_result = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 STEP( 2, 0 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 L_result <<= 1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 if (L_result > EM) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 Mc = 2;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 EM = L_result;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 /* i = 3 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 L_result = L_common_0_3;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 STEP( 3, 12 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 L_result <<= 1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 if (L_result > EM) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 Mc = 3;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 EM = L_result;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 /**/
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 /* Down-sampling by a factor 3 to get the selected xM[0..12]
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 * RPE sequence.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 *Mc_out = Mc;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 /* 4.12.15 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 static void APCM_quantization_xmaxc_to_exp_mant (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 word xmaxc, /* IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 word * exp_out, /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 word * mant_out ) /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 word exp, mant;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 /* Compute exponent and mantissa of the decoded version of xmaxc
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 exp = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 mant = xmaxc - (exp << 3);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 if (mant == 0) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 exp = -4;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 mant = 7;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 else {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 while (mant <= 7) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 mant = mant << 1 | 1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 exp--;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 mant -= 8;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 assert( exp >= -4 && exp <= 6 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 assert( mant >= 0 && mant <= 7 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 *exp_out = exp;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 *mant_out = mant;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 static void APCM_quantization (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 word * xM, /* [0..12] IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 word * xMc, /* [0..12] OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 word * mant_out, /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 word * exp_out, /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 word * xmaxc_out /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 int i, itest;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 word xmax, xmaxc, temp, temp1, temp2;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 word exp, mant;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 /* Find the maximum absolute value xmax of xM[0..12].
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 xmax = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 for (i = 0; i <= 12; i++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 temp = xM[i];
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 temp = GSM_ABS(temp);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 if (temp > xmax) xmax = temp;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 /* Qantizing and coding of xmax to get xmaxc.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 exp = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 temp = SASR( xmax, 9 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 itest = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 for (i = 0; i <= 5; i++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 itest |= (temp <= 0);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 temp = SASR( temp, 1 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 assert(exp <= 5);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 if (itest == 0) exp++; /* exp = add (exp, 1) */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 assert(exp <= 6 && exp >= 0);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 temp = exp + 5;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 assert(temp <= 11 && temp >= 0);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 xmaxc = gsm_add( SASR(xmax, temp), exp << 3 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 /* Quantizing and coding of the xM[0..12] RPE sequence
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 * to get the xMc[0..12]
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 /* This computation uses the fact that the decoded version of xmaxc
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 * can be calculated by using the exponent and the mantissa part of
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 * xmaxc (logarithmic table).
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 * So, this method avoids any division and uses only a scaling
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 * of the RPE samples by a function of the exponent. A direct
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 * multiplication by the inverse of the mantissa (NRFAC[0..7]
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 * found in table 4.5) gives the 3 bit coded version xMc[0..12]
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 * of the RPE samples.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 /* Direct computation of xMc[0..12] using table 4.5
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 assert( exp <= 4096 && exp >= -4096);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 assert( mant >= 0 && mant <= 7 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 temp1 = 6 - exp; /* normalization by the exponent */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 for (i = 0; i <= 12; i++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 assert(temp1 >= 0 && temp1 < 16);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 temp = xM[i] << temp1;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 temp = GSM_MULT( temp, temp2 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 temp = SASR(temp, 12);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 xMc[i] = temp + 4; /* see note below */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 /* NOTE: This equation is used to make all the xMc[i] positive.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 *mant_out = mant;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 *exp_out = exp;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 *xmaxc_out = xmaxc;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 /* 4.2.16 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 static void APCM_inverse_quantization (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 const word * xMc, /* [0..12] IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 word mant,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 word exp,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 register word * xMp) /* [0..12] OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 /*
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 * This part is for decoding the RPE sequence of coded xMc[0..12]
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 * samples to obtain the xMp[0..12] array. Table 4.6 is used to get
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 * the mantissa of xmaxc (FAC[0..7]).
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 int i;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 word temp, temp1, temp2, temp3;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 longword ltmp;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 assert( mant >= 0 && mant <= 7 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364 temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 for (i = 13; i--;) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 /* temp = gsm_sub( *xMc++ << 1, 7 ); */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 temp = (*xMc++ << 1) - 7; /* restore sign */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371 assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 temp <<= 12; /* 16 bit signed */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 temp = GSM_MULT_R( temp1, temp );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 temp = GSM_ADD( temp, temp3 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 *xMp++ = gsm_asr( temp, temp2 );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 /* 4.2.17 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382 static void RPE_grid_positioning (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 word Mc, /* grid position IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384 register word * xMp, /* [0..12] IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 register word * ep /* [0..39] OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387 /*
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 * This procedure computes the reconstructed long term residual signal
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 * ep[0..39] for the LTP analysis filter. The inputs are the Mc
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390 * which is the grid position selection and the xMp[0..12] decoded
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391 * RPE samples which are upsampled by a factor of 3 by inserting zero
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392 * values.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 int i = 13;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 assert(0 <= Mc && Mc <= 3);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
399 switch (Mc) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 case 3: *ep++ = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401 case 2: do {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 *ep++ = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 case 1: *ep++ = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
404 case 0: *ep++ = *xMp++;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
405 } while (--i);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 while (++Mc < 4) *ep++ = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
408
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
409 /*
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411 int i, k;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 for (k = 0; k <= 39; k++) ep[k] = 0;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413 for (i = 0; i <= 12; i++) {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
414 ep[ Mc + (3*i) ] = xMp[i];
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
415 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
417 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
418
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
419 /* 4.2.18 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
420
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421 /* This procedure adds the reconstructed long term residual signal
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422 * ep[0..39] to the estimated signal dpp[0..39] from the long term
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423 * analysis filter to compute the reconstructed short term residual
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424 * signal dp[-40..-1]; also the reconstructed short term residual
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 * array dp[-120..-41] is updated.
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
428 #if 0 /* Has been inlined in code.c */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429 void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp),
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
430 word * dpp, /* [0...39] IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431 word * ep, /* [0...39] IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432 word * dp) /* [-120...-1] IN/OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
434 int k;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
435
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
436 for (k = 0; k <= 79; k++)
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
437 dp[ -120 + k ] = dp[ -80 + k ];
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439 for (k = 0; k <= 39; k++)
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
442 #endif /* Has been inlined in code.c */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444 void Gsm_RPE_Encoding (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445 struct gsmfr_0610_state * S,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
446
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
447 word * e, /* -5..-1][0..39][40..44 IN/OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448 word * xmaxc, /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 word * Mc, /* OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 word * xMc) /* [0..12] OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
452 word x[40];
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
453 word xM[13], xMp[13];
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 word mant, exp;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
456 Weighting_filter(e, x);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
457 RPE_grid_selection(x, xM, Mc);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
458
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
459 APCM_quantization( xM, xMc, &mant, &exp, xmaxc);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 APCM_inverse_quantization( xMc, mant, exp, xMp);
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
462 RPE_grid_positioning( *Mc, xMp, e );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
463 }
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 void Gsm_RPE_Decoding (
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 struct gsmfr_0610_state * S,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468 word xmaxcr,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469 word Mcr,
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470 const word * xMcr, /* [0..12], 3 bits IN */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471 word * erp /* [0..39] OUT */
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472 )
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473 {
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474 word exp, mant;
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 word xMp[ 13 ];
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
477 APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
478 APCM_inverse_quantization( xMcr, mant, exp, xMp );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479 RPE_grid_positioning( Mcr, xMp, erp );
bee3a94f42a7 libgsmfr2: integrate rpe.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480 }