annotate libtwamr/d8_31pf.c @ 478:936a08cc73ce

doc/AMR-library-API: describe the decoder
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 19 May 2024 21:32:31 +0000
parents 03198f6b0427
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }