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
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 }