FreeCalypso > hg > gsm-codec-lib
annotate libtwamr/c4_17pf.c @ 353:b252d74da6c6
.hgignore: add libtwamr/namespace.h (now generated)
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sun, 05 May 2024 21:32:59 +0000 | 
| parents | fc82b113977f | 
| children | 
| 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 } | 
