annotate libtwamr/set_sign.c @ 477:4c9222d95647

libtwamr encoder: always emit frame->mode = mode; In the original implementation of amr_encode_frame(), the 'mode' member of the output struct was set to 0xFF if the output frame type is TX_NO_DATA. This design was made to mimic the mode field (16-bit word) being set to 0xFFFF (or -1) in 3GPP test sequence format - but nothing actually depends on this struct member being set in any way, and amr_frame_to_tseq() generates the needed 0xFFFF on its own, based on frame->type being equal to TX_NO_DATA. It is simpler and more efficient to always set frame->mode to the actual encoding mode in amr_encode_frame(), and this new behavior has already been documented in doc/AMR-library-API description in anticipation of the present change.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 18 May 2024 22:30:42 +0000
parents 15c354f75110
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
314
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : set_sign.c
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : Builds sign vector according to "dn[]" and "cn[]".
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 /*
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * MODULE INCLUDE FILE AND VERSION ID
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 #include "namespace.h"
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 #include "set_sign.h"
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 /*
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * INCLUDE FILES
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 #include "typedef.h"
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 #include "basic_op.h"
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 #include "no_count.h"
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include "inv_sqrt.h"
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "cnst.h"
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 /*
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * PUBLIC PROGRAM CODE
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 ********************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 /*************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 * FUNCTION set_sign()
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 * PURPOSE: Builds sign[] vector according to "dn[]" and "cn[]".
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 * Also finds the position of maximum of correlation in each track
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * and the starting position for each pulse.
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 *************************************************************************/
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 void set_sign(Word16 dn[], /* i/o : correlation between target and h[] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 Word16 sign[], /* o : sign of dn[] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 Word16 dn2[], /* o : maximum of correlation in each track. */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 Word16 n /* i : # of maximum correlations in dn2[] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 )
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 Word16 i, j, k;
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 Word16 val, min;
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 Word16 pos = 0; /* initialization only needed to keep gcc silent */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 /* set sign according to dn[] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 for (i = 0; i < L_CODE; i++) {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 val = dn[i]; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 test ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 if (val >= 0) {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 sign[i] = 32767; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 } else {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 sign[i] = -32767; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 val = negate(val);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 dn[i] = val; move16 (); /* modify dn[] according to the fixed sign */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 dn2[i] = val; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 /* keep 8-n maximum positions/8 of each track and store it in dn2[] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 for (i = 0; i < NB_TRACK; i++)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 for (k = 0; k < (8-n); k++)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 min = 0x7fff; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 for (j = i; j < L_CODE; j += STEP)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 test (); move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 if (dn2[j] >= 0)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 val = sub(dn2[j], min);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 test ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 if (val < 0)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 min = dn2[j]; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 pos = j; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 dn2[pos] = -1; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 return;
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 /*************************************************************************
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 * FUNCTION set_sign12k2()
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 * PURPOSE: Builds sign[] vector according to "dn[]" and "cn[]", and modifies
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 * dn[] to include the sign information (dn[i]=sign[i]*dn[i]).
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 * Also finds the position of maximum of correlation in each track
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 * and the starting position for each pulse.
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 *************************************************************************/
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 void set_sign12k2 (
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 Word16 dn[], /* i/o : correlation between target and h[] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 Word16 cn[], /* i : residual after long term prediction */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 Word16 sign[], /* o : sign of d[n] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 Word16 pos_max[], /* o : position of maximum correlation */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 Word16 nb_track, /* i : number of tracks tracks */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 Word16 ipos[], /* o : starting position for each pulse */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 Word16 step /* i : the step size in the tracks */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 )
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 Word16 i, j;
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 Word16 val, cor, k_cn, k_dn, max, max_of_all;
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 Word16 pos = 0; /* initialization only needed to keep gcc silent */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 Word16 en[L_CODE]; /* correlation vector */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 Word32 s;
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 /* calculate energy for normalization of cn[] and dn[] */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 s = 256; move32 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 for (i = 0; i < L_CODE; i++)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 s = L_mac (s, cn[i], cn[i]);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 s = Inv_sqrt (s); move32 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 k_cn = extract_h (L_shl (s, 5));
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 s = 256; move32 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 for (i = 0; i < L_CODE; i++)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 s = L_mac (s, dn[i], dn[i]);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 s = Inv_sqrt (s); move32 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 k_dn = extract_h (L_shl (s, 5));
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 for (i = 0; i < L_CODE; i++)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 val = dn[i]; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 cor = round (L_shl (L_mac (L_mult (k_cn, cn[i]), k_dn, val), 10));
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 test ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 if (cor >= 0)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 sign[i] = 32767; move16 (); /* sign = +1 */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 else
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 sign[i] = -32767; move16 (); /* sign = -1 */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 cor = negate (cor);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 val = negate (val);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 /* modify dn[] according to the fixed sign */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 dn[i] = val; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 en[i] = cor; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 max_of_all = -1; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 for (i = 0; i < nb_track; i++)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 max = -1; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 for (j = i; j < L_CODE; j += step)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 cor = en[j]; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 val = sub (cor, max);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 test ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 if (val > 0)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 max = cor; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 pos = j; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 /* store maximum correlation position */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 pos_max[i] = pos; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 val = sub (max, max_of_all);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 test ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 if (val > 0)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 max_of_all = max; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 /* starting position for i0 */
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 ipos[0] = i; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 /*----------------------------------------------------------------*
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 * Set starting position of each pulse. *
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 *----------------------------------------------------------------*/
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 pos = ipos[0]; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 ipos[nb_track] = pos; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 for (i = 1; i < nb_track; i++)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 pos = add (pos, 1);
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 test ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 if (sub (pos, nb_track) >= 0)
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 {
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 pos = 0; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 ipos[i] = pos; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 ipos[add(i, nb_track)] = pos; move16 ();
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 }
15c354f75110 libtwamr: integrate set_sign.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 }