FreeCalypso > hg > gsm-codec-lib
annotate libtwamr/c8_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 | dfd5f159574b |
children |
rev | line source |
---|---|
323
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * R99 Version 3.3.0 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * REL-4 Version 4.1.0 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * File : c8_31pf.c |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * Purpose : Searches a 31 bit algebraic codebook containing |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * : 8 pulses in a frame of 40 samples. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 * : in the same manner as GSM-EFR |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 /* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 * MODULE INCLUDE FILE AND VERSION ID |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #include "namespace.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #include "c8_31pf.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 /* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 * INCLUDE FILES |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 #include "typedef.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include "basic_op.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #include "no_count.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include "cnst.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 #include "inv_sqrt.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 #include "cor_h.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 #include "set_sign.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 #include "s10_8pf.h" |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 /* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 * LOCAL VARIABLES AND TABLES |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 #define NB_PULSE 8 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 /* define values/representation for output codevector and sign */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 #define POS_CODE 8191 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 #define NEG_CODE 8191 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 #define POS_SIGN 32767 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 #define NEG_SIGN (Word16) (-32768L) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 /* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 * LOCAL PROGRAM CODE |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 /************************************************************************* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 * FUNCTION: build_code() |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 * PURPOSE: Builds the codeword, the filtered codeword and a |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 * linear uncombined version of the index of the |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 * codevector, based on the signs and positions of 8 pulses. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 *************************************************************************/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 static void build_code ( |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 Word16 codvec[], /* i : position of pulses */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 Word16 sign[], /* i : sign of d[n] */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 Word16 cod[], /* o : innovative code vector */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 Word16 h[], /* i : impulse response of weighted synthesis filter*/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 Word16 y[], /* o : filtered innovative code */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 Word16 sign_indx[], /* o : signs of 4 pulses (signs only) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 Word16 pos_indx[] /* o : position index of 8 pulses(position only) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 ) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 Word16 i, j, k, track, sign_index, pos_index, _sign[NB_PULSE]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 Word16 *p0, *p1, *p2, *p3, *p4, *p5, *p6, *p7; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 Word32 s; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 for (i = 0; i < L_CODE; i++) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 cod[i] = 0; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 for (i = 0; i < NB_TRACK_MR102; i++) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 pos_indx[i] = -1; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 sign_indx[i] = -1; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 for (k = 0; k < NB_PULSE; k++) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 /* read pulse position */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 i = codvec[k]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 /* read sign */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 j = sign[i]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 pos_index = shr(i, 2); /* index = pos/4 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 track = i & 3; logic16 (); /* track = pos%4 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 test (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 if (j > 0) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 cod[i] = add (cod[i], POS_CODE); move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 _sign[k] = POS_SIGN; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 sign_index = 0; /* bit=0 -> positive pulse */ move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 else |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 cod[i] = sub (cod[i], NEG_CODE); move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 _sign[k] = NEG_SIGN; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 sign_index = 1; move16 (); /* bit=1 => negative pulse */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 /* index = add (index, 8); 1 = negative old code */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 test (); move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 if (pos_indx[track] < 0) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 { /* first set first NB_TRACK pulses */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 pos_indx[track] = pos_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 sign_indx[track] = sign_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 else |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 { /* 2nd row of pulses , test if positions needs to be switched */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 test (); logic16 (); logic16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 if (((sign_index ^ sign_indx[track]) & 1) == 0) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 /* sign of 1st pulse == sign of 2nd pulse */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 test (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 if (sub (pos_indx[track], pos_index) <= 0) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 { /* no swap */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 pos_indx[track + NB_TRACK_MR102] = pos_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 else |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 { /* swap*/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 pos_indx[track + NB_TRACK_MR102] = pos_indx[track]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 pos_indx[track] = pos_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 sign_indx[track] = sign_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 else |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 /* sign of 1st pulse != sign of 2nd pulse */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 test (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 if (sub (pos_indx[track], pos_index) <= 0) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 { /*swap*/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 pos_indx[track + NB_TRACK_MR102] = pos_indx[track]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 pos_indx[track] = pos_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 sign_indx[track] = sign_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 else |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 { /*no swap */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 pos_indx[track + NB_TRACK_MR102] = pos_index; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 p0 = h - codvec[0]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 p1 = h - codvec[1]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 p2 = h - codvec[2]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 p3 = h - codvec[3]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 p4 = h - codvec[4]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 p5 = h - codvec[5]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 p6 = h - codvec[6]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 p7 = h - codvec[7]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 for (i = 0; i < L_CODE; i++) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 s = 0; move32 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 s = L_mac (s, *p0++, _sign[0]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 s = L_mac (s, *p1++, _sign[1]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 s = L_mac (s, *p2++, _sign[2]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 s = L_mac (s, *p3++, _sign[3]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 s = L_mac (s, *p4++, _sign[4]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 s = L_mac (s, *p5++, _sign[5]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 s = L_mac (s, *p6++, _sign[6]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 s = L_mac (s, *p7++, _sign[7]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 y[i] = round (s); move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 /************************************************************************* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 * FUNCTION: compress_code() |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 * PURPOSE: compression of three indeces [0..9] to one 10 bit index |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 * minimizing the phase shift of a bit error. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 *************************************************************************/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 static Word16 compress10 ( |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 Word16 pos_indxA, /* i : signs of 4 pulses (signs only) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 Word16 pos_indxB, /* i : position index of 8 pulses (pos only) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 Word16 pos_indxC) /* i : position and sign of 8 pulses (compressed) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 Word16 indx, ia,ib,ic; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 ia = shr(pos_indxA, 1); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 ib = extract_l(L_shr(L_mult(shr(pos_indxB, 1), 5), 1)); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 ic = extract_l(L_shr(L_mult(shr(pos_indxC, 1), 25), 1)); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 indx = shl(add(ia, add(ib, ic)), 3); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 ia = pos_indxA & 1; logic16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 ib = shl((pos_indxB & 1), 1); logic16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 ic = shl((pos_indxC & 1), 2); logic16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 indx = add(indx , add(ia, add(ib, ic))); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 return indx; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 /************************************************************************* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 * FUNCTION: compress_code() |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 * PURPOSE: compression of the linear codewords to 4+three indeces |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 * one bit from each pulse is made robust to errors by |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 * minimizing the phase shift of a bit error. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 * 4 signs (one for each track) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 * i0,i4,i1 => one index (7+3) bits, 3 LSBs more robust |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 * i2,i6,i5 => one index (7+3) bits, 3 LSBs more robust |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 * i3,i7 => one index (5+2) bits, 2-3 LSbs more robust |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 *************************************************************************/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 static void compress_code ( |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 Word16 sign_indx[], /* i : signs of 4 pulses (signs only) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 Word16 pos_indx[], /* i : position index of 8 pulses (position only) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 Word16 indx[]) /* o : position and sign of 8 pulses (compressed) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 Word16 i, ia, ib, ic; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 for (i = 0; i < NB_TRACK_MR102; i++) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 indx[i] = sign_indx[i]; move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 /* First index |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 indx[NB_TRACK] = (ia/2+(ib/2)*5 +(ic/2)*25)*8 + ia%2 + (ib%2)*2 + (ic%2)*4; */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 indx[NB_TRACK_MR102] = compress10(pos_indx[0],pos_indx[4],pos_indx[1]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 /* Second index |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 indx[NB_TRACK+1] = (ia/2+(ib/2)*5 +(ic/2)*25)*8 + ia%2 + (ib%2)*2 + (ic%2)*4; */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 move16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 indx[NB_TRACK_MR102+1]= compress10(pos_indx[2],pos_indx[6],pos_indx[5]); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 /* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 Third index |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 if ((ib/2)%2 == 1) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 indx[NB_TRACK+2] = ((((4-ia/2) + (ib/2)*5)*32+12)/25)*4 + ia%2 + (ib%2)*2; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 else |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 indx[NB_TRACK+2] = ((((ia/2) + (ib/2)*5)*32+12)/25)*4 + ia%2 + (ib%2)*2; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 ib = shr(pos_indx[7], 1) & 1; logic16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 test (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 if (sub(ib, 1) == 0) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 ia = sub(4, shr(pos_indx[3], 1)); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 else |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 ia = shr(pos_indx[3], 1); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 ib = extract_l(L_shr(L_mult(shr(pos_indx[7], 1), 5), 1)); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 ib = add(shl(add(ia, ib), 5), 12); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 ic = shl(mult(ib, 1311), 2); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 ia = pos_indx[3] & 1; logic16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 ib = shl((pos_indx[7] & 1), 1); logic16 (); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 indx[NB_TRACK_MR102+2] = add(ia, add(ib, ic)); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 } |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 /* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 * PUBLIC PROGRAM CODE |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 ******************************************************************************** |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 /************************************************************************* |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 * FUNCTION: code_8i40_31bits() |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 * PURPOSE: Searches a 31 bit algebraic codebook containing 8 pulses |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 * in a frame of 40 samples. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 * DESCRIPTION: |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 * The code contains 8 nonzero pulses: i0...i7. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 * All pulses can have two possible amplitudes: +1 or -1. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 * The 40 positions in a subframe are divided into 4 tracks of |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 * interleaved positions. Each track contains two pulses. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 * The pulses can have the following possible positions: |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 * i0, i4 : 0, 4, 8, 12, 16, 20, 24, 28, 32, 36 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 * i1, i5 : 1, 5, 9, 13, 17, 21, 25, 29, 33, 37 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 * i2, i6 : 2, 6, 10, 14, 18, 22, 26, 30, 34, 38 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 * i3, i7 : 3, 7, 11, 15, 19, 23, 27, 31, 35, 39 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 * Each pair of pulses require 1 bit for their signs. The positions |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 * are encoded together 3,3 and 2 resulting in |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 * (7+3) + (7+3) + (5+2) bits for their |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 * positions. This results in a 31 (4 sign and 27 pos) bit codebook. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 * The function determines the optimal pulse signs and positions, builds |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 * the codevector, and computes the filtered codevector. |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 * |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 *************************************************************************/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 void code_8i40_31bits ( |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 Word16 x[], /* i : target vector */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 Word16 cn[], /* i : residual after long term prediction */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 Word16 h[], /* i : impulse response of weighted synthesis |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 filter */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 Word16 cod[], /* o : algebraic (fixed) codebook excitation */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 Word16 y[], /* o : filtered fixed codebook excitation */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 Word16 indx[] /* o : 7 Word16, index of 8 pulses (signs+positions) */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 ) |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 { |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 Word16 ipos[NB_PULSE], pos_max[NB_TRACK_MR102], codvec[NB_PULSE]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 Word16 dn[L_CODE], sign[L_CODE]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 Word16 rr[L_CODE][L_CODE]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 Word16 linear_signs[NB_TRACK_MR102]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 Word16 linear_codewords[NB_PULSE]; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 cor_h_x2 (h, x, dn, 2, NB_TRACK_MR102, STEP_MR102); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 /* 2 = use GSMEFR scaling */ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 set_sign12k2 (dn, cn, sign, pos_max, NB_TRACK_MR102, ipos, STEP_MR102); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 /* same setsign alg as GSM-EFR new constants though*/ |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 cor_h (h, sign, rr); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 search_10and8i40 (NB_PULSE, STEP_MR102, NB_TRACK_MR102, |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 dn, rr, ipos, pos_max, codvec); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 build_code (codvec, sign, cod, h, y, linear_signs, linear_codewords); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 compress_code (linear_signs, linear_codewords, indx); |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 return; |
dfd5f159574b
libtwamr: integrate c8_31pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 } |