annotate libtwamr/c4_17pf.c @ 581:e2d5cad04cbf

libgsmhr1 RxFE: store CN R0+LPC separately from speech In the original GSM 06.06 code the ECU for speech mode is entirely separate from the CN generator, maintaining separate state. (The main intertie between them is the speech vs CN state variable, distinguishing between speech and CN BFIs, in addition to the CN-specific function of distinguishing between initial and update SIDs.) In the present RxFE implementation I initially thought that we could use the same saved_frame buffer for both ECU and CN, overwriting just the first 4 params (R0 and LPC) when a valid SID comes in. However, I now realize it was a bad idea: the original code has a corner case (long sequence of speech-mode BFIs to put the ECU in state 6, then SID and CN-mode BFIs, then a good speech frame) that would be broken by that buffer reuse approach. We could eliminate this corner case by resetting the ECU state when passing through a CN insertion period, but doing so would needlessly increase the behavioral diffs between GSM 06.06 and our version. Solution: use a separate CN-specific buffer for CN R0+LPC parameters, and match the behavior of GSM 06.06 code in this regard.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Feb 2025 10:02:45 +0000
parents 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 }