annotate libtwamr/c8_31pf.c @ 542:f2d0f2f15d5f

libgsmefr: add wrapper for TW-TS-001 RTP input
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 28 Sep 2024 06:38:08 +0000
parents dfd5f159574b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }