FreeCalypso > hg > gsm-codec-lib
annotate libgsmfr2/lpc.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 | 0cfb7c95cce2 |
| children |
| rev | line source |
|---|---|
|
268
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This C source file has been adapted from TU-Berlin libgsm source, |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * original notice follows: |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdint.h> |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <assert.h> |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include "tw_gsmfr.h" |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include "typedef.h" |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include "ed_state.h" |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include "ed_internal.h" |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 /* |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 /* 4.2.4 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 static void Autocorrelation ( |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 word * s, /* [0..159] IN/OUT */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 longword * L_ACF) /* [0..8] OUT */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 /* |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 * The goal is to compute the array L_ACF[k]. The signal s[i] must |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 * be scaled in order to avoid an overflow situation. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 register int k, i; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 word temp, smax, scalauto; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 /* Dynamic scaling of the array s[0..159] |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 /* Search for the maximum. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 smax = 0; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 for (k = 0; k <= 159; k++) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 temp = GSM_ABS( s[k] ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 if (temp > smax) smax = temp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 /* Computation of the scaling factor. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 if (smax == 0) scalauto = 0; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 else { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 assert(smax > 0); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 /* Scaling of the array s[0...159] |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 if (scalauto > 0) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 # define SCALE(n) \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 case n: for (k = 0; k <= 159; k++) \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 break; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 switch (scalauto) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 SCALE(1) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 SCALE(2) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 SCALE(3) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 SCALE(4) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 # undef SCALE |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 /* Compute the L_ACF[..]. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 word * sp = s; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 word sl = *sp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 # define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 # define NEXTI sl = *++sp |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 for (k = 9; k--; L_ACF[k] = 0) ; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 STEP (0); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 STEP(0); STEP(1); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 STEP(0); STEP(1); STEP(2); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 STEP(0); STEP(1); STEP(2); STEP(3); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 for (i = 8; i <= 159; i++) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 NEXTI; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 STEP(0); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 STEP(1); STEP(2); STEP(3); STEP(4); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 STEP(5); STEP(6); STEP(7); STEP(8); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 for (k = 9; k--; L_ACF[k] <<= 1) ; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 /* Rescaling of the array s[0..159] |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 if (scalauto > 0) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 assert(scalauto <= 4); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 for (k = 160; k--; *s++ <<= scalauto) ; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 /* 4.2.5 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 static void Reflection_coefficients ( |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 longword * L_ACF, /* 0...8 IN */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 register word * r /* 0...7 OUT */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 ) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 register int i, m, n; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 register word temp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 register longword ltmp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 word ACF[9]; /* 0..8 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 word P[ 9]; /* 0..8 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 word K[ 9]; /* 2..8 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 /* Schur recursion with 16 bits arithmetic. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 if (L_ACF[0] == 0) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 for (i = 8; i--; *r++ = 0) ; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 return; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 assert( L_ACF[0] != 0 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 temp = gsm_norm( L_ACF[0] ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 assert(temp >= 0 && temp < 32); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 /* ? overflow ? */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 /* Initialize array P[..] and K[..] for the recursion. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ]; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ]; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 /* Compute reflection coefficients |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 for (n = 1; n <= 8; n++, r++) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 temp = P[1]; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 temp = GSM_ABS(temp); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 if (P[0] < temp) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 for (i = n; i <= 8; i++) *r++ = 0; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 return; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 *r = gsm_div( temp, P[0] ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 assert(*r >= 0); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 assert (*r != MIN_WORD); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 if (n == 8) return; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 /* Schur recursion |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 temp = GSM_MULT_R( P[1], *r ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 P[0] = GSM_ADD( P[0], temp ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 for (m = 1; m <= 8 - n; m++) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 temp = GSM_MULT_R( K[ m ], *r ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 P[m] = GSM_ADD( P[ m+1 ], temp ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 temp = GSM_MULT_R( P[ m+1 ], *r ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 K[m] = GSM_ADD( K[ m ], temp ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 /* 4.2.6 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 static void Transformation_to_Log_Area_Ratios ( |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 register word * r /* 0..7 IN/OUT */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 ) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 /* |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 * The following scaling for r[..] and LAR[..] has been used: |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 * |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1. |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 * LAR[..] = integer( real_LAR[..] * 16384 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 * with -1.625 <= real_LAR <= 1.625 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 register word temp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 register int i; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 /* Computation of the LAR[0..7] from the r[0..7] |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 for (i = 1; i <= 8; i++, r++) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 temp = *r; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 temp = GSM_ABS(temp); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 assert(temp >= 0); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 if (temp < 22118) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 temp >>= 1; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 } else if (temp < 31130) { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 assert( temp >= 11059 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 temp -= 11059; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 } else { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 assert( temp >= 26112 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 temp -= 26112; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 temp <<= 2; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 *r = *r < 0 ? -temp : temp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 assert( *r != MIN_WORD ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 /* 4.2.7 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 static void Quantization_and_coding ( |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 register word * LAR /* [0..7] IN/OUT */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 ) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 register word temp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 longword ltmp; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 /* This procedure needs four tables; the following equations |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 * give the optimum scaling for the constants: |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 * |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 * A[0..7] = integer( real_A[0..7] * 1024 ) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 * B[0..7] = integer( real_B[0..7] * 512 ) |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 * MAC[0..7] = maximum of the LARc[0..7] |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 * MIC[0..7] = minimum of the LARc[0..7] |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 # undef STEP |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 # define STEP( A, B, MAC, MIC ) \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 temp = GSM_MULT( A, *LAR ); \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 temp = GSM_ADD( temp, B ); \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 temp = GSM_ADD( temp, 256 ); \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 temp = SASR( temp, 9 ); \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 *LAR = temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 LAR++; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 STEP( 20480, 0, 31, -32 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 STEP( 20480, 0, 31, -32 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 STEP( 20480, 2048, 15, -16 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 STEP( 20480, -2560, 15, -16 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 STEP( 13964, 94, 7, -8 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 STEP( 15360, -1792, 7, -8 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 STEP( 8534, -341, 3, -4 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 STEP( 9036, -1144, 3, -4 ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 # undef STEP |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 } |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 void Gsm_LPC_Analysis ( |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 struct gsmfr_0610_state *S, |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 word * s, /* 0..159 signals IN/OUT */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 word * LARc) /* 0..7 LARc's OUT */ |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 { |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 longword L_ACF[9]; |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 Autocorrelation (s, L_ACF ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 Reflection_coefficients (L_ACF, LARc ); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 Transformation_to_Log_Area_Ratios (LARc); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 Quantization_and_coding (LARc); |
|
0cfb7c95cce2
libgsmfr2: integrate lpc.c from libgsm
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 } |
