FreeCalypso > hg > gsm-codec-lib
annotate libtwamr/d8_31pf.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 | 03198f6b0427 |
children |
rev | line source |
---|---|
335
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * R99 Version 3.3.0 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * REL-4 Version 4.1.0 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * File : d8_31pf.c |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * Purpose : Builds the innovative codevector |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 * MODULE INCLUDE FILE AND VERSION ID |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 #include "namespace.h" |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #include "d8_31pf.h" |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 * INCLUDE FILES |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 #include "typedef.h" |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include "basic_op.h" |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #include "no_count.h" |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include "cnst.h" |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 * LOCAL VARIABLES AND TABLES |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 #define NB_PULSE 8 /* number of pulses */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 /* define values/representation for output codevector and sign */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 #define POS_CODE 8191 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 #define NEG_CODE 8191 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 static void decompress10 ( |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 Word16 MSBs, /* i : MSB part of the index */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 Word16 LSBs, /* i : LSB part of the index */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 Word16 index1, /* i : index for first pos in pos_index[] */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 Word16 index2, /* i : index for second pos in pos_index[] */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 Word16 index3, /* i : index for third pos in pos_index[] */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 Word16 pos_indx[]) /* o : position of 3 pulses (decompressed) */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 Word16 ia, ib, ic; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 pos_indx[index1] = ((MSBs-25*(MSBs/25))%5)*2 + (LSBs-4*(LSBs/4))%2; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 pos_indx[index2] = ((MSBs-25*(MSBs/25))/5)*2 + (LSBs-4*(LSBs/4))/2; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 pos_indx[index3] = (MSBs/25)*2 + LSBs/4; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 test (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 if (sub(MSBs, 124) > 0) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 MSBs = 124; move16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 ia = mult(MSBs, 1311); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 ia = sub(MSBs, extract_l(L_shr(L_mult(ia, 25), 1))); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 ib = shl(sub(ia, extract_l(L_shr(L_mult(mult(ia, 6554), 5), 1))), 1); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 ic = shl(shr(LSBs, 2), 2); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 ic = sub(LSBs, ic); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 pos_indx[index1] = add(ib, (ic & 1)); logic16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 ib = shl(mult(ia, 6554), 1); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 pos_indx[index2] = add(ib, shr(ic, 1)); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 pos_indx[index3] = add(shl(mult(MSBs, 1311), 1), shr(LSBs, 2)); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 return; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 /************************************************************************* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 * FUNCTION: decompress_code() |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 * PURPOSE: decompression of the linear codewords to 4+three indeces |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 * one bit from each pulse is made robust to errors by |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 * minimizing the phase shift of a bit error. |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 * 4 signs (one for each track) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 * i0,i4,i1 => one index (7+3) bits, 3 LSBs more robust |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 * i2,i6,i5 => one index (7+3) bits, 3 LSBs more robust |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 * i3,i7 => one index (5+2) bits, 2-3 LSbs more robust |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 *************************************************************************/ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 static void decompress_code ( |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 Word16 indx[], /* i : position and sign of 8 pulses (compressed) */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 Word16 sign_indx[], /* o : signs of 4 pulses (signs only) */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 Word16 pos_indx[] /* o : position index of 8 pulses (position only) */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 ) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 Word16 i, ia, ib, MSBs, LSBs, MSBs0_24; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 for (i = 0; i < NB_TRACK_MR102; i++) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 sign_indx[i] = indx[i]; move16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 First index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 MSBs = indx[NB_TRACK]/8; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 LSBs = indx[NB_TRACK]%8; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 MSBs = shr(indx[NB_TRACK_MR102], 3); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 LSBs = indx[NB_TRACK_MR102] & 7; logic16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 decompress10 (MSBs, LSBs, 0, 4, 1, pos_indx); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 Second index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 MSBs = indx[NB_TRACK+1]/8; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 LSBs = indx[NB_TRACK+1]%8; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 MSBs = shr(indx[NB_TRACK_MR102+1], 3); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 LSBs = indx[NB_TRACK_MR102+1] & 7; logic16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 decompress10 (MSBs, LSBs, 2, 6, 5, pos_indx); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 Third index: 10x10 -> 2x5x2x5-> 25x2x2 -> 5+1x2 bits |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 MSBs = indx[NB_TRACK+2]/4; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 LSBs = indx[NB_TRACK+2]%4; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 MSBs0_24 = (MSBs*25+12)/32; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 if ((MSBs0_24/5)%2==1) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 pos_indx[3] = (4-(MSBs0_24%5))*2 + LSBs%2; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 else |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 pos_indx[3] = (MSBs0_24%5)*2 + LSBs%2; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 pos_indx[7] = (MSBs0_24/5)*2 + LSBs/2; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 MSBs = shr(indx[NB_TRACK_MR102+2], 2); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 LSBs = indx[NB_TRACK_MR102+2] & 3; logic16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 MSBs0_24 = shr(add(extract_l(L_shr(L_mult(MSBs, 25), 1)), 12), 5); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 ia = mult(MSBs0_24, 6554) & 1; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 ib = sub(MSBs0_24, extract_l(L_shr(L_mult(mult(MSBs0_24, 6554), 5), 1))); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 test (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 if (sub(ia, 1) == 0) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 ib = sub(4, ib); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 pos_indx[3] = add(shl(ib, 1), (LSBs & 1)); logic16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 ia = shl(mult(MSBs0_24, 6554), 1); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 pos_indx[7] = add(ia, shr(LSBs, 1)); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 /* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 * PUBLIC PROGRAM CODE |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 ******************************************************************************** |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 /************************************************************************* |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 * FUNCTION: dec_8i40_31bits() |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 * PURPOSE: Builds the innovative codevector from the received |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 * index of algebraic codebook. |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 * See c8_31pf.c for more details about the algebraic codebook structure. |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 * |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 *************************************************************************/ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 void dec_8i40_31bits ( |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 Word16 index[], /* i : index of 8 pulses (sign+position) */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 Word16 cod[] /* o : algebraic (fixed) codebook excitation */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 ) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 Word16 i, j, pos1, pos2, sign; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 Word16 linear_signs[NB_TRACK_MR102]; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 Word16 linear_codewords[NB_PULSE]; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 for (i = 0; i < L_CODE; i++) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 cod[i] = 0; move16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 decompress_code (index, linear_signs, linear_codewords); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 /* decode the positions and signs of pulses and build the codeword */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 for (j = 0; j < NB_TRACK_MR102; j++) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 /* compute index i */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 i = linear_codewords[j]; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 i = extract_l (L_shr (L_mult (i, 4), 1)); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 pos1 = add (i, j); /* position of pulse "j" */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 test (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 if (linear_signs[j] == 0) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 sign = POS_CODE; move16 (); /* +1.0 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 else |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 sign = -NEG_CODE; move16 (); /* -1.0 */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 cod[pos1] = sign; move16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 /* compute index i */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 i = linear_codewords[add (j, 4)]; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 i = extract_l (L_shr (L_mult (i, 4), 1)); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 pos2 = add (i, j); /* position of pulse "j+4" */ |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 test (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 if (sub (pos2, pos1) < 0) |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 { |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 sign = negate (sign); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 cod[pos2] = add (cod[pos2], sign); move16 (); |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 } |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 return; |
03198f6b0427
libtwamr: integrate d8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 } |