comparison libtwamr/set_sign.c @ 314:15c354f75110

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