FreeCalypso > hg > gsm-codec-lib
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 } |