FreeCalypso > hg > gsm-codec-lib
annotate libgsmfr2/long_term.c @ 581:e2d5cad04cbf
libgsmhr1 RxFE: store CN R0+LPC separately from speech
In the original GSM 06.06 code the ECU for speech mode is entirely
separate from the CN generator, maintaining separate state. (The
main intertie between them is the speech vs CN state variable,
distinguishing between speech and CN BFIs, in addition to the
CN-specific function of distinguishing between initial and update
SIDs.)
In the present RxFE implementation I initially thought that we could
use the same saved_frame buffer for both ECU and CN, overwriting
just the first 4 params (R0 and LPC) when a valid SID comes in.
However, I now realize it was a bad idea: the original code has a
corner case (long sequence of speech-mode BFIs to put the ECU in
state 6, then SID and CN-mode BFIs, then a good speech frame) that
would be broken by that buffer reuse approach. We could eliminate
this corner case by resetting the ECU state when passing through
a CN insertion period, but doing so would needlessly increase
the behavioral diffs between GSM 06.06 and our version.
Solution: use a separate CN-specific buffer for CN R0+LPC parameters,
and match the behavior of GSM 06.06 code in this regard.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Feb 2025 10:02:45 +0000 |
parents | 65d3304502bd |
children |
rev | line source |
---|---|
267
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
65d3304502bd
libgsmfr2: integrate long_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, |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * original notice follows: |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdint.h> |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <assert.h> |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include "tw_gsmfr.h" |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include "typedef.h" |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include "ed_state.h" |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include "ed_internal.h" |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 /* |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 /* |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 * This module computes the LTP gain (bc) and the LTP lag (Nc) |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 * for the long term analysis filter. This is done by calculating a |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 * maximum of the cross-correlation function between the current |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 * sub-segment short term residual signal d[0..39] (output of |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 * the short term analysis filter; for simplification the index |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 * of this array begins at 0 and ends at 39 for each sub-segment of the |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 * RPE-LTP analysis) and the previous reconstructed short term |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 * performed to avoid overflow. |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 static void Calculation_of_the_LTP_parameters ( |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 register word * d, /* [0..39] IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 register word * dp, /* [-120..-1] IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 word * bc_out, /* OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 word * Nc_out /* OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 ) |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 register int k, lambda; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 word Nc, bc; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 word wt[40]; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 longword L_max, L_power; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 word R, S, dmax, scal; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 register word temp; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 /* Search of the optimum scaling of d[0..39]. |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 dmax = 0; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 for (k = 0; k <= 39; k++) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 temp = d[k]; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 temp = GSM_ABS( temp ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 if (temp > dmax) dmax = temp; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 temp = 0; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 if (dmax == 0) scal = 0; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 else { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 assert(dmax > 0); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 temp = gsm_norm( (longword)dmax << 16 ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 if (temp > 6) scal = 0; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 else scal = 6 - temp; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 assert(scal >= 0); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 /* Initialization of a working array wt |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 /* Search for the maximum cross-correlation and coding of the LTP lag |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 L_max = 0; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 Nc = 40; /* index for the maximum cross-correlation */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 for (lambda = 40; lambda <= 120; lambda++) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 # undef STEP |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 # define STEP(k) (longword)wt[k] * dp[k - lambda] |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 register longword L_result; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 L_result = STEP(0) ; L_result += STEP(1) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 L_result += STEP(2) ; L_result += STEP(3) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 L_result += STEP(4) ; L_result += STEP(5) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 L_result += STEP(6) ; L_result += STEP(7) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 L_result += STEP(8) ; L_result += STEP(9) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 L_result += STEP(10) ; L_result += STEP(11) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 L_result += STEP(12) ; L_result += STEP(13) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 L_result += STEP(14) ; L_result += STEP(15) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 L_result += STEP(16) ; L_result += STEP(17) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 L_result += STEP(18) ; L_result += STEP(19) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 L_result += STEP(20) ; L_result += STEP(21) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 L_result += STEP(22) ; L_result += STEP(23) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 L_result += STEP(24) ; L_result += STEP(25) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 L_result += STEP(26) ; L_result += STEP(27) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 L_result += STEP(28) ; L_result += STEP(29) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 L_result += STEP(30) ; L_result += STEP(31) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 L_result += STEP(32) ; L_result += STEP(33) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 L_result += STEP(34) ; L_result += STEP(35) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 L_result += STEP(36) ; L_result += STEP(37) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 L_result += STEP(38) ; L_result += STEP(39) ; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 if (L_result > L_max) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 Nc = lambda; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 L_max = L_result; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 *Nc_out = Nc; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 L_max <<= 1; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 /* Rescaling of L_max |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 assert(scal <= 100 && scal >= -100); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 L_max = L_max >> (6 - scal); /* sub(6, scal) */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 assert( Nc <= 120 && Nc >= 40); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 /* Compute the power of the reconstructed short term residual |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 * signal dp[..] |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 L_power = 0; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 for (k = 0; k <= 39; k++) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 register longword L_temp; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 L_temp = SASR( dp[k - Nc], 3 ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 L_power += L_temp * L_temp; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 L_power <<= 1; /* from L_MULT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 /* Normalization of L_max and L_power |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 if (L_max <= 0) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 *bc_out = 0; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 return; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 if (L_max >= L_power) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 *bc_out = 3; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 return; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 temp = gsm_norm( L_power ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 R = SASR( L_max << temp, 16 ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 S = SASR( L_power << temp, 16 ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 /* Coding of the LTP gain |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 /* Table 4.3a must be used to obtain the level DLB[i] for the |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 * quantization of the LTP gain b to get the coded version bc. |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 *bc_out = bc; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 /* 4.2.12 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 static void Long_term_analysis_filtering ( |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 word bc, /* IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 word Nc, /* IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 register word * dp, /* previous d [-120..-1] IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 register word * d, /* d [0..39] IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 register word * dpp, /* estimate [0..39] OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 register word * e /* long term res. signal [0..39] OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 ) |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 /* |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 * In this part, we have to decode the bc parameter to compute |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 * the samples of the estimate dpp[0..39]. The decoding of bc needs the |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 * use of table 4.3b. The long term residual signal e[0..39] |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 * is then calculated to be fed to the RPE encoding section. |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 register int k; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 register longword ltmp; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 # undef STEP |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 # define STEP(BP) \ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 for (k = 0; k <= 39; k++) { \ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 e[k] = GSM_SUB( d[k], dpp[k] ); \ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 switch (bc) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 case 0: STEP( 3277 ); break; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 case 1: STEP( 11469 ); break; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 case 2: STEP( 21299 ); break; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 case 3: STEP( 32767 ); break; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 struct gsmfr_0610_state * S, |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 word * d, /* [0..39] residual signal IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 word * dp, /* [-120..-1] d' IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 word * e, /* [0..39] OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 word * dpp, /* [0..39] OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 word * Nc, /* correlation lag OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 word * bc /* gain factor OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 ) |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 assert( d ); assert( dp ); assert( e ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 assert( dpp); assert( Nc ); assert( bc ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 Calculation_of_the_LTP_parameters(d, dp, bc, Nc); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 /* 4.3.2 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 void Gsm_Long_Term_Synthesis_Filtering ( |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 struct gsmfr_0610_state * S, |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 word Ncr, |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 word bcr, |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 register word * erp, /* [0..39] IN */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 register word * drp /* [-120..-1] IN, [-120..40] OUT */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 ) |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 /* |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 * This procedure uses the bcr and Ncr parameter to realize the |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 * long term synthesis filtering. The decoding of bcr needs |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 * table 4.3b. |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 register longword ltmp; /* for ADD */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 register int k; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 word brp, drpp, Nr; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 /* Check the limits of Nr. |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 S->nrp = Nr; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 assert(Nr >= 40 && Nr <= 120); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 /* Decoding of the LTP gain bcr |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 brp = gsm_QLB[ bcr ]; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 /* Computation of the reconstructed short term residual |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 * signal drp[0..39] |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 assert(brp != MIN_WORD); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 for (k = 0; k <= 39; k++) { |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 drp[k] = GSM_ADD( erp[k], drpp ); |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 } |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 /* |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 * Update of the reconstructed short term residual signal |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 * drp[ -1..-120 ] |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 */ |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; |
65d3304502bd
libgsmfr2: integrate long_term.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 } |