annotate libtwamr/c4_17pf.c @ 513:03a40ac2e931

libgsmhr1: implement validation for *.cod frames
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 25 Aug 2024 19:00:03 +0000
parents fc82b113977f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
322
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : c4_17pf.c
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : Searches a 17 bit algebraic codebook containing 4 pulses
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 * in a frame of 40 samples.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 /*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 * MODULE INCLUDE FILE AND VERSION ID
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 #include "namespace.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 #include "c4_17pf.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 /*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 * INCLUDE FILES
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include "typedef.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "basic_op.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #include "no_count.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 #include "inv_sqrt.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 #include "cnst.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 #include "cor_h.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 #include "set_sign.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 #include "graytab.h"
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 /*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 * LOCAL VARIABLES AND TABLES
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 #define NB_PULSE 4
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 /*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 * DECLARATION OF PROTOTYPES
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 static void search_4i40(
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 Word16 dn[], /* i : correlation between target and h[] */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 Word16 dn2[], /* i : maximum of corr. in each track. */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 Word16 rr[][L_CODE],/* i : matrix of autocorrelation */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 Word16 codvec[] /* o : algebraic codebook vector */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 );
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 static Word16 build_code(
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 Word16 codvec[], /* i : algebraic codebook vector */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 Word16 dn_sign[], /* i : sign of dn[] */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 Word16 cod[], /* o : algebraic (fixed) codebook excitation */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 Word16 h[], /* i : impulse response of weighted synthesis filter */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 Word16 y[], /* o : filtered fixed codebook excitation */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 Word16 sign[] /* o : index of 4 pulses (position+sign+ampl)*4 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 );
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 /*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 * PUBLIC PROGRAM CODE
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 /*************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 * FUNCTION: code_4i40_17bits()
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 * PURPOSE: Searches a 17 bit algebraic codebook containing 4 pulses
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 * in a frame of 40 samples.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 * DESCRIPTION:
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 * The code length is 40, containing 4 nonzero pulses: i0...i3.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 * All pulses can have two possible amplitudes: +1 or -1.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 * Pulse i0 to i2 can have 8 possible positions, pulse i3 can have
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 * 2x8=16 positions.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 * i0 : 0, 5, 10, 15, 20, 25, 30, 35.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 * i1 : 1, 6, 11, 16, 21, 26, 31, 36.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 * i2 : 2, 7, 12, 17, 22, 27, 32, 37.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 * i3 : 3, 8, 13, 18, 23, 28, 33, 38.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 * 4, 9, 14, 19, 24, 29, 34, 39.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 *************************************************************************/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 Word16 code_4i40_17bits(
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 Word16 x[], /* i : target vector */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 Word16 h[], /* i : impulse response of weighted synthesis filter */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 /* h[-L_subfr..-1] must be set to zero. */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 Word16 T0, /* i : Pitch lag */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 Word16 pitch_sharp, /* i : Last quantized pitch gain */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 Word16 code[], /* o : Innovative codebook */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 Word16 y[], /* o : filtered fixed codebook excitation */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 Word16 * sign /* o : Signs of 4 pulses */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 )
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 Word16 codvec[NB_PULSE];
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 Word16 dn[L_CODE], dn2[L_CODE], dn_sign[L_CODE];
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 Word16 rr[L_CODE][L_CODE];
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 Word16 i, index, sharp;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 sharp = shl(pitch_sharp, 1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 if (sub(T0, L_CODE) < 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 for (i = T0; i < L_CODE; i++) {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 h[i] = add(h[i], mult(h[i - T0], sharp)); move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 cor_h_x(h, x, dn, 1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 set_sign(dn, dn_sign, dn2, 4);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 cor_h(h, dn_sign, rr);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 search_4i40(dn, dn2, rr, codvec);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 move16 (); /* function result */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 index = build_code(codvec, dn_sign, code, h, y, sign);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 /*-----------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 * Compute innovation vector gain. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 * Include fixed-gain pitch contribution into code[]. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 *-----------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 if (sub(T0, L_CODE) < 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 for (i = T0; i < L_CODE; i++) {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 code[i] = add(code[i], mult(code[i - T0], sharp)); move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 return index;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 /*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 * PRIVATE PROGRAM CODE
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 ********************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 /*************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 * FUNCTION search_4i40()
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 * PURPOSE: Search the best codevector; determine positions of the 4 pulses
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 * in the 40-sample frame.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 *************************************************************************/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 #define _1_2 (Word16)(32768L/2)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 #define _1_4 (Word16)(32768L/4)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 #define _1_8 (Word16)(32768L/8)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 #define _1_16 (Word16)(32768L/16)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 static void search_4i40(
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 Word16 dn[], /* i : correlation between target and h[] */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 Word16 dn2[], /* i : maximum of corr. in each track. */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 Word16 rr[][L_CODE], /* i : matrix of autocorrelation */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 Word16 codvec[] /* o : algebraic codebook vector */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 )
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 Word16 i0, i1, i2, i3;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 Word16 ix = 0; /* initialization only needed to keep gcc silent */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 Word16 ps = 0; /* initialization only needed to keep gcc silent */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 Word16 i, pos, track, ipos[NB_PULSE];
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 Word16 psk, ps0, ps1, sq, sq1;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 Word16 alpk, alp, alp_16;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 Word32 s, alp0, alp1;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 /* Default value */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 psk = -1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 alpk = 1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 for (i = 0; i < NB_PULSE; i++)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 codvec[i] = i; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 for (track = 3; track < 5; track++) {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 /* fix starting position */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 ipos[0] = 0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 ipos[1] = 1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 ipos[2] = 2; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 ipos[3] = track; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 /*------------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 * main loop: try 4 tracks. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 *------------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 for (i = 0; i < NB_PULSE; i++)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 /*----------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 * i0 loop: try 4 positions (use position with max of corr.). *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 *----------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 move16 (); /* account for ptr. init. (rr[io]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 for (i0 = ipos[0]; i0 < L_CODE; i0 += STEP)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 test (); move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 if (dn2[i0] >= 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 ps0 = dn[i0]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 alp0 = L_mult(rr[i0][i0], _1_4);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 /*----------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 * i1 loop: 8 positions. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 *----------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 sq = -1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 alp = 1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 ps = 0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 ix = ipos[1]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 /* initialize 4 index for next loop. */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 /*-------------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 * These index have low complexity address computation because *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 * they are, in fact, pointers with fixed increment. For example, *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 * "rr[i0][i3]" is a pointer initialized to "&rr[i0][ipos[3]]" *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 * and incremented by "STEP". *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 *-------------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 move16 (); /* account for ptr. init. (rr[i1]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 move16 (); /* account for ptr. init. (dn[i1]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 move16 (); /* account for ptr. init. (rr[io]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 for (i1 = ipos[1]; i1 < L_CODE; i1 += STEP)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 ps1 = add(ps0, dn[i1]); /* idx increment = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 /* alp1 = alp0 + rr[i0][i1] + 1/2*rr[i1][i1]; */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 alp1 = L_mac(alp0, rr[i1][i1], _1_4); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 alp1 = L_mac(alp1, rr[i0][i1], _1_2); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 sq1 = mult(ps1, ps1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 alp_16 = round(alp1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 s = L_msu(L_mult(alp, sq1), sq, alp_16);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 if (s > 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 sq = sq1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 ps = ps1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 alp = alp_16; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 ix = i1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 i1 = ix; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 /*----------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 * i2 loop: 8 positions. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 *----------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 ps0 = ps; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 alp0 = L_mult(alp, _1_4);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 sq = -1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 alp = 1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 ps = 0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 ix = ipos[2]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 /* initialize 4 index for next loop (see i1 loop) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 move16 (); /* account for ptr. init. (rr[i2]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 move16 (); /* account for ptr. init. (rr[i1]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 move16 (); /* account for ptr. init. (dn[i2]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 move16 (); /* account for ptr. init. (rr[io]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 for (i2 = ipos[2]; i2 < L_CODE; i2 += STEP)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 ps1 = add(ps0, dn[i2]); /* index increment = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 /* alp1 = alp0 + rr[i0][i2] + rr[i1][i2] + 1/2*rr[i2][i2]; */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 alp1 = L_mac(alp0, rr[i2][i2], _1_16); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 alp1 = L_mac(alp1, rr[i1][i2], _1_8); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 alp1 = L_mac(alp1, rr[i0][i2], _1_8); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 sq1 = mult(ps1, ps1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 alp_16 = round(alp1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 s = L_msu(L_mult(alp, sq1), sq, alp_16);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 if (s > 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 sq = sq1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 ps = ps1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 alp = alp_16; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 ix = i2; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 i2 = ix; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 /*----------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 * i3 loop: 8 positions. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 *----------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 ps0 = ps; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 alp0 = L_deposit_h(alp);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 sq = -1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 alp = 1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 ps = 0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 ix = ipos[3]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 /* initialize 5 index for next loop (see i1 loop) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 move16 (); /* account for ptr. init. (rr[i3]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 move16 (); /* account for ptr. init. (rr[i2]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 move16 (); /* account for ptr. init. (rr[i1]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 move16 (); /* account for ptr. init. (dn[i3]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 move16 (); /* account for ptr. init. (rr[io]) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 for (i3 = ipos[3]; i3 < L_CODE; i3 += STEP)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 ps1 = add(ps0, dn[i3]); /* index increment = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 /* alp1 = alp0 + rr[i0][i3] + rr[i1][i3] + rr[i2][i3] + 1/2*rr[i3][i3]; */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 alp1 = L_mac(alp0, rr[i3][i3], _1_16); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 alp1 = L_mac(alp1, rr[i2][i3], _1_8); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 alp1 = L_mac(alp1, rr[i1][i3], _1_8); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 alp1 = L_mac(alp1, rr[i0][i3], _1_8); /* idx incr = STEP */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 sq1 = mult(ps1, ps1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 alp_16 = round(alp1);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 s = L_msu(L_mult(alp, sq1), sq, alp_16);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 if (s > 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 sq = sq1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 ps = ps1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 alp = alp_16; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 ix = i3; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 /*----------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 * memorise codevector if this one is better than the last one. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 *----------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 s = L_msu(L_mult(alpk, sq), psk, alp);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 if (s > 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 psk = sq; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 alpk = alp; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 codvec[0] = i0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 codvec[1] = i1; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 codvec[2] = i2; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 codvec[3] = ix; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368 /*----------------------------------------------------------------*
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 * Cyclic permutation of i0,i1,i2 and i3. *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 *----------------------------------------------------------------*/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 pos = ipos[3]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 ipos[3] = ipos[2]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 ipos[2] = ipos[1]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 ipos[1] = ipos[0]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 ipos[0] = pos; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 return;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 /*************************************************************************
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 * FUNCTION: build_code()
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387 * PURPOSE: Builds the codeword, the filtered codeword and index of the
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 * codevector, based on the signs and positions of 4 pulses.
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 *
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390 *************************************************************************/
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392 static Word16
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 build_code(
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394 Word16 codvec[], /* i : position of pulses */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 Word16 dn_sign[], /* i : sign of pulses */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396 Word16 cod[], /* o : innovative code vector */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 Word16 h[], /* i : impulse response of weighted synthesis filter */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398 Word16 y[], /* o : filtered innovative code */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
399 Word16 sign[] /* o : index of 4 pulses (sign+position) */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 )
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 Word16 i, j, k, track, index, _sign[NB_PULSE], indx, rsign;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 Word16 *p0, *p1, *p2, *p3;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
404 Word32 s;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
405
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 for (i = 0; i < L_CODE; i++)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
408 cod[i] = 0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
409 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411 indx = 0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 rsign = 0; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413 for (k = 0; k < NB_PULSE; k++)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
414 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
415 i = codvec[k]; move16 (); /* read pulse position */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416 j = dn_sign[i]; move16 (); /* read sign */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
417
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
418 index = mult(i, 6554); /* index = pos/5 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
419 /* track = pos%5 */
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
420 track = sub(i, extract_l(L_shr(L_mult(index, 5), 1)));
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423 index = gray[index]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 if (sub(track, 1) == 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427 index = shl(index, 3);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
428 else if (sub(track, 2) == 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
430 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431 index = shl(index, 6);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 else if (sub(track, 3) == 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
434 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
435 test ();test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
436 index = shl(index, 10);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
437 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438 else if (sub(track, 4) == 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 test ();test ();test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441 track = 3; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
442 index = add(shl(index, 10), 512);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445 test ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
446 if (j > 0)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
447 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448 cod[i] = 8191; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 _sign[k] = 32767; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 rsign = add(rsign, shl(1, track));
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 } else {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
452 cod[i] = -8192; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
453 _sign[k] = (Word16) - 32768L; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
456 indx = add(indx, index);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
457 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
458 *sign = rsign; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
459
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 p0 = h - codvec[0]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461 p1 = h - codvec[1]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
462 p2 = h - codvec[2]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
463 p3 = h - codvec[3]; move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 for (i = 0; i < L_CODE; i++)
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 {
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467 s = 0; move32 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468 s = L_mac(s, *p0++, _sign[0]);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469 s = L_mac(s, *p1++, _sign[1]);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470 s = L_mac(s, *p2++, _sign[2]);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471 s = L_mac(s, *p3++, _sign[3]);
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472 y[i] = round(s); move16 ();
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473 }
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 return indx;
fc82b113977f libtwamr: integrate c4_17pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476 }