annotate libtwamr/c2_11pf.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 9bca350be398
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
319
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : c2_11pf.c
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : Searches a 11 bit algebraic codebook containing 2 pulses
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 * in a frame of 40 samples.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 /*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 * MODULE INCLUDE FILE AND VERSION ID
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 #include "namespace.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 #include "c2_11pf.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 /*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 * INCLUDE FILES
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include "typedef.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "basic_op.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #include "no_count.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 #include "inv_sqrt.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 #include "cnst.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 #include "cor_h.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 #include "set_sign.h"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 /*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 * LOCAL VARIABLES AND TABLES
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 #define NB_PULSE 2
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 #include "c2_11pf.tab"
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 /*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 * DECLARATION OF PROTOTYPES
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 static void search_2i40(
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 Word16 dn[], /* i : correlation between target and h[] */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 Word16 rr[][L_CODE],/* i : matrix of autocorrelation */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 Word16 codvec[] /* o : algebraic codebook vector */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 );
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 static Word16 build_code(
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 Word16 codvec[], /* i : algebraic codebook vector */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 Word16 dn_sign[], /* i : sign of dn[] */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 Word16 cod[], /* o : algebraic (fixed) codebook excitation */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 Word16 h[], /* i : impulse response of weighted synthesis filter */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 Word16 y[], /* o : filtered fixed codebook excitation */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 Word16 sign[] /* o : sign of 2 pulses */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 );
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 /*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 * PUBLIC PROGRAM CODE
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 /*************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 * FUNCTION: code_2i40_11bits()
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 * PURPOSE: Searches a 11 bit algebraic codebook containing 2 pulses
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 * in a frame of 40 samples.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 * DESCRIPTION:
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 * The code length is 40, containing 2 nonzero pulses: i0...i1.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 * All pulses can have two possible amplitudes: +1 or -1.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 * Pulse i0 can have 2x8=16 possible positions, pulse i1 can have
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 * 4x8=32 positions.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 * i0 : 1, 6, 11, 16, 21, 26, 31, 36.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 * 3, 8, 13, 18, 23, 28, 33, 38.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 * i1 : 0, 5, 10, 15, 20, 25, 30, 35.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 * 1, 6, 11, 16, 21, 26, 31, 36.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 * 2, 7, 12, 17, 22, 27, 32, 37.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 * 4, 9, 14, 19, 24, 29, 34, 39.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 *************************************************************************/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 Word16 code_2i40_11bits(
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 Word16 x[], /* i : target vector */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 Word16 h[], /* i : impulse response of weighted synthesis filter */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 /* h[-L_subfr..-1] must be set to zero. */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 Word16 T0, /* i : Pitch lag */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 Word16 pitch_sharp, /* i : Last quantized pitch gain */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 Word16 code[], /* o : Innovative codebook */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 Word16 y[], /* o : filtered fixed codebook excitation */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 Word16 * sign /* o : Signs of 2 pulses */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 )
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 Word16 codvec[NB_PULSE];
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 Word16 dn[L_CODE], dn2[L_CODE], dn_sign[L_CODE];
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 Word16 rr[L_CODE][L_CODE];
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 Word16 i, index, sharp;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 sharp = shl(pitch_sharp, 1);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 test ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 if (sub(T0, L_CODE) < 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 for (i = T0; i < L_CODE; i++) {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 h[i] = add(h[i], mult(h[i - T0], sharp)); move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 cor_h_x(h, x, dn, 1);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 set_sign(dn, dn_sign, dn2, 8); /* dn2[] not used in this codebook search */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 cor_h(h, dn_sign, rr);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 search_2i40(dn, rr, codvec);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 move16 (); /* function result */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 index = build_code(codvec, dn_sign, code, h, y, sign);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 /*-----------------------------------------------------------------*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 * Compute innovation vector gain. *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 * Include fixed-gain pitch contribution into code[]. *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 *-----------------------------------------------------------------*/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 test ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 if (sub(T0, L_CODE) < 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 for (i = T0; i < L_CODE; i++)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 code[i] = add(code[i], mult(code[i - T0], sharp)); move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 return index;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 /*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 * PRIVATE PROGRAM CODE
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 *****************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 /*************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 * FUNCTION search_2i40()
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 * PURPOSE: Search the best codevector; determine positions of the 2 pulses
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 * in the 40-sample frame.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 *************************************************************************/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 #define _1_2 (Word16)(32768L/2)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 #define _1_4 (Word16)(32768L/4)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 #define _1_8 (Word16)(32768L/8)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 #define _1_16 (Word16)(32768L/16)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 static void search_2i40(
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 Word16 dn[], /* i : correlation between target and h[] */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 Word16 rr[][L_CODE], /* i : matrix of autocorrelation */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 Word16 codvec[] /* o : algebraic codebook vector */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 )
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 Word16 i0, i1;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 Word16 ix = 0; /* initialization only needed to keep gcc silent */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 Word16 track1, track2, ipos[NB_PULSE];
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 Word16 psk, ps0, ps1, sq, sq1;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 Word16 alpk, alp, alp_16;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 Word32 s, alp0, alp1;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 Word16 i;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 psk = -1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 alpk = 1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 for (i = 0; i < NB_PULSE; i++)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 codvec[i] = i; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 /*------------------------------------------------------------------*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 * main loop: try 2x4 tracks. *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 *------------------------------------------------------------------*/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 for (track1 = 0; track1 < 2; track1++)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 for (track2 = 0; track2 < 4; track2++)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 /* fix starting position */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 ipos[0] = startPos1[track1]; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 ipos[1] = startPos2[track2]; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 /*----------------------------------------------------------------*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 * i0 loop: try 8 positions. *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 *----------------------------------------------------------------*/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 move16 (); /* account for ptr. init. (rr[io]) */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 for (i0 = ipos[0]; i0 < L_CODE; i0 += STEP)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 ps0 = dn[i0]; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 alp0 = L_mult(rr[i0][i0], _1_4);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 /*-------------------------------------------------------------*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 * i1 loop: 8 positions. *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 *-------------------------------------------------------------*/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 sq = -1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 alp = 1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 ix = ipos[1]; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 /*---------------------------------------------------------------*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 * These index have low complexity address computation because *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 * they are, in fact, pointers with fixed increment. For example,*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 * "rr[i0][i2]" is a pointer initialized to "&rr[i0][ipos[2]]" *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 * and incremented by "STEP". *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 *---------------------------------------------------------------*/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 move16 (); /* account for ptr. init. (rr[i1]) */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 move16 (); /* account for ptr. init. (dn[i1]) */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 move16 (); /* account for ptr. init. (rr[io]) */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 for (i1 = ipos[1]; i1 < L_CODE; i1 += STEP) {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 ps1 = add(ps0, dn[i1]); /* idx increment = STEP */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 /* alp1 = alp0 + rr[i0][i1] + 1/2*rr[i1][i1]; */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 alp1 = L_mac(alp0, rr[i1][i1], _1_4); /* idx incr = STEP */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 alp1 = L_mac(alp1, rr[i0][i1], _1_2); /* idx incr = STEP */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 sq1 = mult(ps1, ps1);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 alp_16 = round(alp1);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 s = L_msu(L_mult(alp, sq1), sq, alp_16);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 test ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 if (s > 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 sq = sq1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 alp = alp_16; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 ix = i1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 /*---------------------------------------------------------------*
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 * memorise codevector if this one is better than the last one. *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 *---------------------------------------------------------------*/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 s = L_msu(L_mult(alpk, sq), psk, alp);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 test ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 if (s > 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 psk = sq; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 alpk = alp; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 codvec[0] = i0; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 codvec[1] = ix; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 return;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 /*************************************************************************
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 * FUNCTION: build_code()
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 * PURPOSE: Builds the codeword, the filtered codeword and index of the
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 * codevector, based on the signs and positions of 2 pulses.
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 *
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 *************************************************************************/
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 static Word16 build_code(
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 Word16 codvec[], /* i : position of pulses */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 Word16 dn_sign[], /* i : sign of pulses */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 Word16 cod[], /* o : innovative code vector */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 Word16 h[], /* i : impulse response of weighted synthesis filter */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 Word16 y[], /* o : filtered innovative code */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 Word16 sign[] /* o : sign of 2 pulses */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 )
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 Word16 i, j, k, track, index, _sign[NB_PULSE], indx, rsign;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 Word16 *p0, *p1;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 Word32 s;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 for (i = 0; i < L_CODE; i++)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 cod[i] = 0; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 indx = 0; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 rsign = 0; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 for (k = 0; k < NB_PULSE; k++)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 i = codvec[k]; /* read pulse position */ move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 j = dn_sign[i]; /* read sign */ move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 index = mult(i, 6554); /* index = pos/5 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 /* track = pos%5 */
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 track = sub(i, extract_l(L_shr(L_mult(index, 5), 1)));
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 test (); test (); test (); test ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 if (sub(track, 0) == 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 track = 1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 index = shl(index, 6);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 else if (sub(track, 1) == 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 test ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 if (sub(k, 0) == 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 track = 0; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 index = shl(index, 1);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 else
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 track = 1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 index = add(shl(index, 6), 16);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 else if (sub(track, 2) == 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 track = 1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 index = add(shl(index, 6), 32);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 else if (sub(track, 3) == 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 track = 0; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 index = add(shl(index, 1), 1);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 else if (sub(track, 4) == 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 track = 1; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 index = add(shl(index, 6), 48);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 test ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 if (j > 0)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 cod[i] = 8191; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 _sign[k] = 32767; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 rsign = add(rsign, shl(1, track));
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 else
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 cod[i] = -8192; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 _sign[k] = (Word16) - 32768L; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 indx = add(indx, index);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 *sign = rsign; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 p0 = h - codvec[0]; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 p1 = h - codvec[1]; move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 for (i = 0; i < L_CODE; i++)
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 {
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 s = 0; move32 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 s = L_mac(s, *p0++, _sign[0]);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 s = L_mac(s, *p1++, _sign[1]);
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 y[i] = round(s); move16 ();
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 }
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 return indx;
9bca350be398 libtwamr: integrate c2_11pf.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 }