annotate libgsmfr2/short_term.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 d320a8fa3392
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
271
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This C source file has been adapted from TU-Berlin libgsm source,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * original notice follows:
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdint.h>
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include "tw_gsmfr.h"
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include "typedef.h"
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include "ed_state.h"
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include "ed_internal.h"
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 /*
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * SHORT TERM ANALYSIS FILTERING SECTION
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 /* 4.2.8 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 static void Decoding_of_the_coded_Log_Area_Ratios (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 const word * LARc, /* coded log area ratio [0..7] IN */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 word * LARpp) /* out: decoded .. */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 register word temp1 /* , temp2 */;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 register long ltmp; /* for GSM_ADD */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 /* This procedure requires for efficient implementation
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 * two tables.
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 * INVA[1..8] = integer( (32768 * 8) / real_A[1..8])
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 * MIC[1..8] = minimum value of the LARc[1..8]
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 /* Compute the LARpp[1..8]
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 * temp1 = GSM_ADD( *LARc, *MIC ) << 10;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 * temp2 = *B << 1;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 * temp1 = GSM_SUB( temp1, temp2 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * assert(*INVA != MIN_WORD);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 * temp1 = GSM_MULT_R( *INVA, temp1 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 * *LARpp = GSM_ADD( temp1, temp1 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 * }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 #undef STEP
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 #define STEP( B_TIMES_TWO, MIC, INVA ) \
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 temp1 = GSM_ADD( *LARc++, MIC ) << 10; \
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 temp1 = GSM_SUB( temp1, B_TIMES_TWO ); \
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 temp1 = GSM_MULT_R( INVA, temp1 ); \
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 *LARpp++ = GSM_ADD( temp1, temp1 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 STEP( 0, -32, 13107 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 STEP( 0, -32, 13107 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 STEP( 4096, -16, 13107 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 STEP( -5120, -16, 13107 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 STEP( 188, -8, 19223 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 STEP( -3584, -8, 17476 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 STEP( -682, -4, 31454 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 STEP( -2288, -4, 29708 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 /* NOTE: the addition of *MIC is used to restore
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 * the sign of *LARc.
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 /* 4.2.9 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 /* Computation of the quantized reflection coefficients
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 /* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8]
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 /*
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 * Within each frame of 160 analyzed speech samples the short term
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 * analysis and synthesis filters operate with four different sets of
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 * coefficients, derived from the previous set of decoded LARs(LARpp(j-1))
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 * and the actual set of decoded LARs (LARpp(j))
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 * (Initial value: LARpp(j-1)[1..8] = 0.)
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 static void Coefficients_0_12 (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 register word * LARpp_j_1,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 register word * LARpp_j,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 register word * LARp)
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 register int i;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 register longword ltmp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1));
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 static void Coefficients_13_26 (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 register word * LARpp_j_1,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 register word * LARpp_j,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 register word * LARp)
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 register int i;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 register longword ltmp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 static void Coefficients_27_39 (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 register word * LARpp_j_1,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 register word * LARpp_j,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 register word * LARp)
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 register int i;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 register longword ltmp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 static void Coefficients_40_159 (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 register word * LARpp_j,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 register word * LARp)
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 register int i;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 *LARp = *LARpp_j;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 /* 4.2.9.2 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 static void LARp_to_rp (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 register word * LARp) /* [0..7] IN/OUT */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 /*
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 * The input of this procedure is the interpolated LARp[0..7] array.
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 * The reflection coefficients, rp[i], are used in the analysis
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * filter and in the synthesis filter.
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 register int i;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 register word temp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 register longword ltmp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 for (i = 1; i <= 8; i++, LARp++) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 /* temp = GSM_ABS( *LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 * if (temp < 11059) temp <<= 1;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 * else if (temp < 20070) temp += 11059;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 * else temp = GSM_ADD( temp >> 2, 26112 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 *
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 * *LARp = *LARp < 0 ? -temp : temp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 if (*LARp < 0) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 *LARp = - ((temp < 11059) ? temp << 1
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 : ((temp < 20070) ? temp + 11059
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 : GSM_ADD( temp >> 2, 26112 )));
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 } else {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 temp = *LARp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 *LARp = (temp < 11059) ? temp << 1
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 : ((temp < 20070) ? temp + 11059
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 : GSM_ADD( temp >> 2, 26112 ));
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 /* 4.2.10 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 static void Short_term_analysis_filtering (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 struct gsmfr_0610_state * S,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 register word * rp, /* [0..7] IN */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 register int k_n, /* k_end - k_start */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 register word * s /* [0..n-1] IN/OUT */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 )
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 /*
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 * This procedure computes the short term residual signal d[..] to be fed
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 * to the RPE-LTP loop from the s[..] signal and from the local rp[..]
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 * array (quantized reflection coefficients). As the call of this
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 * procedure can be done in many ways (see the interpolation of the LAR
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 * coefficient), it is assumed that the computation begins with index
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 * k_start (for arrays d[..] and s[..]) and stops with index k_end
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 * (k_start and k_end are defined in 4.2.9.1). This procedure also
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 * needs to keep the array u[0..7] in memory for each call.
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 register word * u = S->u;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 register int i;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 register word di, zzz, ui, sav, rpi;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 register longword ltmp;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 for (; k_n--; s++) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 di = sav = *s;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 for (i = 0; i < 8; i++) { /* YYY */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 ui = u[i];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 rpi = rp[i];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 u[i] = sav;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 zzz = GSM_MULT_R(rpi, di);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 sav = GSM_ADD( ui, zzz);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 zzz = GSM_MULT_R(rpi, ui);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 di = GSM_ADD( di, zzz );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 *s = di;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 static void Short_term_synthesis_filtering (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 struct gsmfr_0610_state * S,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 register word * rrp, /* [0..7] IN */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 register int k, /* k_end - k_start */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 register word * wt, /* [0..k-1] IN */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 register word * sr /* [0..k-1] OUT */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 )
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 register word * v = S->v;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 register int i;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 register word sri, tmp1, tmp2;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 register longword ltmp; /* for GSM_ADD & GSM_SUB */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 while (k--) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 sri = *wt++;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 for (i = 8; i--;) {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 tmp1 = rrp[i];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 tmp2 = v[i];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 ? MAX_WORD
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 + 16384) >> 15)) ;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 sri = GSM_SUB( sri, tmp2 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 ? MAX_WORD
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 : 0x0FFFF & (( (longword)tmp1 * (longword)sri
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 + 16384) >> 15)) ;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 v[i+1] = GSM_ADD( v[i], tmp1);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 *sr++ = v[0] = sri;
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 void Gsm_Short_Term_Analysis_Filter (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 struct gsmfr_0610_state * S,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 const word * LARc, /* coded log area ratio [0..7] IN */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 word * s /* signal [0..159] IN/OUT */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 )
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 word * LARpp_j = S->LARpp[ S->j ];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 word LARp[8];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 #undef FILTER
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 # define FILTER Short_term_analysis_filtering
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 FILTER( S, LARp, 13, s);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 FILTER( S, LARp, 14, s + 13);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 FILTER( S, LARp, 13, s + 27);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 Coefficients_40_159( LARpp_j, LARp);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 FILTER( S, LARp, 120, s + 40);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 }
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 void Gsm_Short_Term_Synthesis_Filter (
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 struct gsmfr_0610_state * S,
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 const word * LARcr, /* received log area ratios [0..7] IN */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 word * wt, /* received d [0..159] IN */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 word * s /* signal s [0..159] OUT */
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 )
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 {
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 word * LARpp_j = S->LARpp[ S->j ];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 word * LARpp_j_1 = S->LARpp[ S->j ^=1 ];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 word LARp[8];
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 #undef FILTER
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 # define FILTER Short_term_synthesis_filtering
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 FILTER( S, LARp, 13, wt, s );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 FILTER( S, LARp, 14, wt + 13, s + 13 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 FILTER( S, LARp, 13, wt + 27, s + 27 );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 Coefficients_40_159( LARpp_j, LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 LARp_to_rp( LARp );
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 FILTER(S, LARp, 120, wt + 40, s + 40);
d320a8fa3392 libgsmfr2: integrate short_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 }