Mercurial > hg > audiostuff
comparison intercom/gsm/long_ter.c @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1:9cadc470e3da | 2:13be24d74cd2 |
---|---|
1 /* | |
2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische | |
3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for | |
4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. | |
5 */ | |
6 | |
7 /* $Header: /home/kbs/jutta/src/gsm/gsm-1.0/src/RCS/long_term.c,v 1.1 1992/10/28 00:15:50 jutta Exp $ */ | |
8 | |
9 #include <stdio.h> | |
10 #include <assert.h> | |
11 | |
12 #include "private.h" | |
13 | |
14 #include "gsm.h" | |
15 #include "proto.h" | |
16 | |
17 /* Prevent improper operation for 16-bit systems */ | |
18 #if defined(MSDOS) || defined(__MSDOS__) | |
19 # ifdef USE_TABLE_MUL | |
20 # undef USE_TABLE_MUL | |
21 # endif | |
22 #endif | |
23 | |
24 #ifdef USE_TABLE_MUL | |
25 | |
26 unsigned int umul_table[513][256]; | |
27 | |
28 init_umul_table() | |
29 { | |
30 int i, j; | |
31 int n; | |
32 unsigned int *p = &umul_table[0][0]; | |
33 | |
34 for (i = 0; i < 513; i++) { | |
35 n = 0; | |
36 for (j = 0; j < 256; j++) { | |
37 *p++ = n; | |
38 n += i; | |
39 } | |
40 } | |
41 } | |
42 | |
43 # define umul(x9, x15) \ | |
44 ((int)(umul_table[x9][x15 & 0x0FF] + (umul_table[x9][ x15 >> 8 ] << 8))) | |
45 | |
46 # define table_mul(a, b) \ | |
47 ( (a < 0) ? ((b < 0) ? umul(-a, -b) : -umul(-a, b)) \ | |
48 : ((b < 0) ? -umul(a, -b) : umul(a, b))) | |
49 | |
50 #endif /* USE_TABLE_MUL */ | |
51 | |
52 | |
53 | |
54 /* | |
55 * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION | |
56 */ | |
57 | |
58 | |
59 /* | |
60 * This procedure computes the LTP gain (bc) and the LTP lag (Nc) | |
61 * for the long term analysis filter. This is done by calculating a | |
62 * maximum of the cross-correlation function between the current | |
63 * sub-segment short term residual signal d[0..39] (output of | |
64 * the short term analysis filter; for simplification the index | |
65 * of this array begins at 0 and ends at 39 for each sub-segment of the | |
66 * RPE-LTP analysis) and the previous reconstructed short term | |
67 * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be | |
68 * performed to avoid overflow. | |
69 */ | |
70 | |
71 /* This procedure exists in four versions. First, the two integer | |
72 * versions with or without table-multiplication (as one function); | |
73 * then, the two floating point versions (as another function), with | |
74 * or without scaling. | |
75 */ | |
76 | |
77 #ifndef USE_FLOAT_MUL | |
78 | |
79 static void Calculation_of_the_LTP_parameters P4((d, dp, bc_out, Nc_out), register word * d, /* [0..39] IN */ | |
80 register word * dp, /* [-120..-1] IN */ | |
81 word * bc_out, /* OUT */ | |
82 word * Nc_out /* OUT */ | |
83 ) | |
84 { | |
85 register ulongword utmp; /* for L_ADD */ | |
86 | |
87 register int k, lambda; | |
88 word Nc, bc; | |
89 word wt[40]; | |
90 | |
91 longword L_max, L_power; | |
92 word R, S, dmax, scal; | |
93 register word temp; | |
94 | |
95 /* Search of the optimum scaling of d[0..39]. | |
96 */ | |
97 dmax = 0; | |
98 | |
99 for (k = 0; k <= 39; k++) { | |
100 temp = d[k]; | |
101 temp = GSM_ABS(temp); | |
102 if (temp > dmax) | |
103 dmax = temp; | |
104 } | |
105 | |
106 temp = 0; | |
107 if (dmax == 0) | |
108 scal = 0; | |
109 else { | |
110 assert(dmax > 0); | |
111 temp = gsm_norm((longword) dmax << 16); | |
112 } | |
113 | |
114 if (temp > 6) | |
115 scal = 0; | |
116 else | |
117 scal = 6 - temp; | |
118 | |
119 assert(scal >= 0); | |
120 | |
121 /* Initialization of a working array wt | |
122 */ | |
123 | |
124 for (k = 0; k <= 39; k++) | |
125 wt[k] = SASR(d[k], scal); | |
126 | |
127 /* Search for the maximum cross-correlation and coding of the LTP lag | |
128 */ | |
129 L_max = 0; | |
130 Nc = 40; /* index for the maximum cross-correlation */ | |
131 | |
132 for (lambda = 40; lambda <= 120; lambda++) { | |
133 | |
134 # ifdef STEP | |
135 # undef STEP | |
136 # endif | |
137 | |
138 # ifdef USE_TABLE_MUL | |
139 # define STEP(k) (table_mul(wt[k], dp[k - lambda])) | |
140 # else | |
141 # define STEP(k) (wt[k] * dp[k - lambda]) | |
142 # endif | |
143 | |
144 register longword L_result; | |
145 | |
146 L_result = STEP(0); | |
147 L_result += STEP(1); | |
148 L_result += STEP(2); | |
149 L_result += STEP(3); | |
150 L_result += STEP(4); | |
151 L_result += STEP(5); | |
152 L_result += STEP(6); | |
153 L_result += STEP(7); | |
154 L_result += STEP(8); | |
155 L_result += STEP(9); | |
156 L_result += STEP(10); | |
157 L_result += STEP(11); | |
158 L_result += STEP(12); | |
159 L_result += STEP(13); | |
160 L_result += STEP(14); | |
161 L_result += STEP(15); | |
162 L_result += STEP(16); | |
163 L_result += STEP(17); | |
164 L_result += STEP(18); | |
165 L_result += STEP(19); | |
166 L_result += STEP(20); | |
167 L_result += STEP(21); | |
168 L_result += STEP(22); | |
169 L_result += STEP(23); | |
170 L_result += STEP(24); | |
171 L_result += STEP(25); | |
172 L_result += STEP(26); | |
173 L_result += STEP(27); | |
174 L_result += STEP(28); | |
175 L_result += STEP(29); | |
176 L_result += STEP(30); | |
177 L_result += STEP(31); | |
178 L_result += STEP(32); | |
179 L_result += STEP(33); | |
180 L_result += STEP(34); | |
181 L_result += STEP(35); | |
182 L_result += STEP(36); | |
183 L_result += STEP(37); | |
184 L_result += STEP(38); | |
185 L_result += STEP(39); | |
186 | |
187 if (L_result > L_max) { | |
188 | |
189 Nc = lambda; | |
190 L_max = L_result; | |
191 } | |
192 } | |
193 | |
194 *Nc_out = Nc; | |
195 | |
196 L_max <<= 1; | |
197 | |
198 /* Rescaling of L_max | |
199 */ | |
200 assert(scal <= 100 && scal >= -100); | |
201 L_max = L_max >> (6 - scal); /* sub(6, scal) */ | |
202 | |
203 assert(Nc <= 120 && Nc >= 40); | |
204 | |
205 /* Compute the power of the reconstructed short term residual | |
206 * signal dp[..] | |
207 */ | |
208 L_power = 0; | |
209 for (k = 0; k <= 39; k++) { | |
210 | |
211 register longword L_temp; | |
212 | |
213 L_temp = SASR((longword) (dp[k - Nc]), 3); | |
214 L_power += L_temp * L_temp; | |
215 } | |
216 L_power <<= 1; /* from L_MULT */ | |
217 | |
218 /* Normalization of L_max and L_power | |
219 */ | |
220 | |
221 if (L_max <= 0) { | |
222 *bc_out = 0; | |
223 return; | |
224 } | |
225 if (L_max >= L_power) { | |
226 *bc_out = 3; | |
227 return; | |
228 } | |
229 | |
230 temp = gsm_norm(L_power); | |
231 | |
232 R = SASR(L_max << temp, 16); | |
233 S = SASR(L_power << temp, 16); | |
234 | |
235 /* Coding of the LTP gain | |
236 */ | |
237 | |
238 /* Table 4.3a must be used to obtain the level DLB[i] for the | |
239 * quantization of the LTP gain b to get the coded version bc. | |
240 */ | |
241 for (bc = 0; bc <= 2; bc++) | |
242 if (R <= gsm_mult(S, gsm_DLB[bc])) | |
243 break; | |
244 *bc_out = bc; | |
245 } | |
246 | |
247 #else /* USE_FLOAT_MUL */ | |
248 | |
249 static void Calculation_of_the_LTP_parameters P4((d, dp, bc_out, Nc_out), register word * d, /* [0..39] IN */ | |
250 register word * dp, /* [-120..-1] IN */ | |
251 word * bc_out, /* OUT */ | |
252 word * Nc_out /* OUT */ | |
253 ) | |
254 { | |
255 /* register ulongword utmp; / * for L_ADD */ | |
256 | |
257 register int k, lambda; | |
258 word Nc, bc; | |
259 | |
260 float wt_float[40]; | |
261 float dp_float_base[120], *dp_float = dp_float_base + 120; | |
262 | |
263 longword L_max, L_power; | |
264 word R, S, dmax, scal; | |
265 register word temp; | |
266 | |
267 /* Search of the optimum scaling of d[0..39]. | |
268 */ | |
269 dmax = 0; | |
270 | |
271 for (k = 0; k <= 39; k++) { | |
272 temp = d[k]; | |
273 temp = GSM_ABS(temp); | |
274 if (temp > dmax) | |
275 dmax = temp; | |
276 } | |
277 | |
278 temp = 0; | |
279 if (dmax == 0) | |
280 scal = 0; | |
281 else { | |
282 assert(dmax > 0); | |
283 temp = gsm_norm((longword) dmax << 16); | |
284 } | |
285 | |
286 if (temp > 6) | |
287 scal = 0; | |
288 else | |
289 scal = 6 - temp; | |
290 | |
291 assert(scal >= 0); | |
292 | |
293 /* Initialization of a working array wt | |
294 */ | |
295 | |
296 for (k = 0; k < 40; k++) | |
297 wt_float[k] = SASR(d[k], scal); | |
298 for (k = -120; k < 0; k++) | |
299 dp_float[k] = dp[k]; | |
300 | |
301 /* Search for the maximum cross-correlation and coding of the LTP lag | |
302 */ | |
303 L_max = 0; | |
304 Nc = 40; /* index for the maximum cross-correlation */ | |
305 | |
306 for (lambda = 40; lambda <= 120; lambda += 9) { | |
307 | |
308 /* Calculate L_result for l = lambda .. lambda + 9. | |
309 */ | |
310 register float *lp = dp_float - lambda; | |
311 | |
312 register float W; | |
313 register float a = lp[-8], b = lp[-7], c = lp[-6], | |
314 d = lp[-5], e = lp[-4], f = lp[-3], g = lp[-2], h = lp[-1]; | |
315 register float E; | |
316 register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, | |
317 S5 = 0, S6 = 0, S7 = 0, S8 = 0; | |
318 | |
319 # ifdef STEP | |
320 # undef STEP | |
321 # endif | |
322 | |
323 # define STEP(K, a, b, c, d, e, f, g, h) \ | |
324 W = wt_float[K]; \ | |
325 E = W * a; S8 += E; \ | |
326 E = W * b; S7 += E; \ | |
327 E = W * c; S6 += E; \ | |
328 E = W * d; S5 += E; \ | |
329 E = W * e; S4 += E; \ | |
330 E = W * f; S3 += E; \ | |
331 E = W * g; S2 += E; \ | |
332 E = W * h; S1 += E; \ | |
333 a = lp[K]; \ | |
334 E = W * a; S0 += E | |
335 | |
336 # define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) | |
337 # define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) | |
338 # define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) | |
339 # define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) | |
340 # define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) | |
341 # define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) | |
342 # define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) | |
343 # define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) | |
344 | |
345 STEP_A(0); | |
346 STEP_B(1); | |
347 STEP_C(2); | |
348 STEP_D(3); | |
349 STEP_E(4); | |
350 STEP_F(5); | |
351 STEP_G(6); | |
352 STEP_H(7); | |
353 | |
354 STEP_A(8); | |
355 STEP_B(9); | |
356 STEP_C(10); | |
357 STEP_D(11); | |
358 STEP_E(12); | |
359 STEP_F(13); | |
360 STEP_G(14); | |
361 STEP_H(15); | |
362 | |
363 STEP_A(16); | |
364 STEP_B(17); | |
365 STEP_C(18); | |
366 STEP_D(19); | |
367 STEP_E(20); | |
368 STEP_F(21); | |
369 STEP_G(22); | |
370 STEP_H(23); | |
371 | |
372 STEP_A(24); | |
373 STEP_B(25); | |
374 STEP_C(26); | |
375 STEP_D(27); | |
376 STEP_E(28); | |
377 STEP_F(29); | |
378 STEP_G(30); | |
379 STEP_H(31); | |
380 | |
381 STEP_A(32); | |
382 STEP_B(33); | |
383 STEP_C(34); | |
384 STEP_D(35); | |
385 STEP_E(36); | |
386 STEP_F(37); | |
387 STEP_G(38); | |
388 STEP_H(39); | |
389 | |
390 if (S0 > L_max) { | |
391 L_max = S0; | |
392 Nc = lambda; | |
393 } | |
394 if (S1 > L_max) { | |
395 L_max = S1; | |
396 Nc = lambda + 1; | |
397 } | |
398 if (S2 > L_max) { | |
399 L_max = S2; | |
400 Nc = lambda + 2; | |
401 } | |
402 if (S3 > L_max) { | |
403 L_max = S3; | |
404 Nc = lambda + 3; | |
405 } | |
406 if (S4 > L_max) { | |
407 L_max = S4; | |
408 Nc = lambda + 4; | |
409 } | |
410 if (S5 > L_max) { | |
411 L_max = S5; | |
412 Nc = lambda + 5; | |
413 } | |
414 if (S6 > L_max) { | |
415 L_max = S6; | |
416 Nc = lambda + 6; | |
417 } | |
418 if (S7 > L_max) { | |
419 L_max = S7; | |
420 Nc = lambda + 7; | |
421 } | |
422 if (S8 > L_max) { | |
423 L_max = S8; | |
424 Nc = lambda + 8; | |
425 } | |
426 } | |
427 *Nc_out = Nc; | |
428 | |
429 L_max <<= 1; | |
430 | |
431 /* Rescaling of L_max | |
432 */ | |
433 assert(scal <= 100 && scal >= -100); | |
434 L_max = L_max >> (6 - scal); /* sub(6, scal) */ | |
435 | |
436 assert(Nc <= 120 && Nc >= 40); | |
437 | |
438 /* Compute the power of the reconstructed short term residual | |
439 * signal dp[..] | |
440 */ | |
441 L_power = 0; | |
442 for (k = 0; k <= 39; k++) { | |
443 | |
444 register longword L_temp; | |
445 | |
446 L_temp = SASR(dp[k - Nc], 3); | |
447 L_power += L_temp * L_temp; | |
448 } | |
449 L_power <<= 1; /* from L_MULT */ | |
450 | |
451 /* Normalization of L_max and L_power | |
452 */ | |
453 | |
454 if (L_max <= 0) { | |
455 *bc_out = 0; | |
456 return; | |
457 } | |
458 if (L_max >= L_power) { | |
459 *bc_out = 3; | |
460 return; | |
461 } | |
462 | |
463 temp = gsm_norm(L_power); | |
464 | |
465 R = SASR(L_max << temp, 16); | |
466 S = SASR(L_power << temp, 16); | |
467 | |
468 /* Coding of the LTP gain | |
469 */ | |
470 | |
471 /* Table 4.3a must be used to obtain the level DLB[i] for the | |
472 * quantization of the LTP gain b to get the coded version bc. | |
473 */ | |
474 for (bc = 0; bc <= 2; bc++) | |
475 if (R <= gsm_mult(S, gsm_DLB[bc])) | |
476 break; | |
477 *bc_out = bc; | |
478 } | |
479 | |
480 #ifdef FAST | |
481 | |
482 static void Fast_Calculation_of_the_LTP_parameters P4((d, dp, bc_out, Nc_out), register word * d, /* [0..39] IN */ | |
483 register word * dp, /* [-120..-1] IN */ | |
484 word * bc_out, /* OUT */ | |
485 word * Nc_out /* OUT */ | |
486 ) | |
487 { | |
488 register ulongword utmp; /* for L_ADD */ | |
489 | |
490 register int k, lambda; | |
491 word Nc, bc; | |
492 | |
493 float wt_float[40]; | |
494 float dp_float_base[120], *dp_float = dp_float_base + 120; | |
495 | |
496 register float L_max, L_power; | |
497 | |
498 for (k = 0; k < 40; ++k) | |
499 wt_float[k] = (float) d[k]; | |
500 for (k = -120; k <= 0; ++k) | |
501 dp_float[k] = (float) dp[k]; | |
502 | |
503 /* Search for the maximum cross-correlation and coding of the LTP lag | |
504 */ | |
505 L_max = 0; | |
506 Nc = 40; /* index for the maximum cross-correlation */ | |
507 | |
508 for (lambda = 40; lambda <= 120; lambda += 9) { | |
509 | |
510 /* Calculate L_result for l = lambda .. lambda + 9. | |
511 */ | |
512 register float *lp = dp_float - lambda; | |
513 | |
514 register float W; | |
515 register float a = lp[-8], b = lp[-7], c = lp[-6], | |
516 d = lp[-5], e = lp[-4], f = lp[-3], g = lp[-2], h = lp[-1]; | |
517 register float E; | |
518 register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, | |
519 S5 = 0, S6 = 0, S7 = 0, S8 = 0; | |
520 | |
521 # ifdef STEP | |
522 # undef STEP | |
523 # endif | |
524 | |
525 # define STEP(K, a, b, c, d, e, f, g, h) \ | |
526 W = wt_float[K]; \ | |
527 E = W * a; S8 += E; \ | |
528 E = W * b; S7 += E; \ | |
529 E = W * c; S6 += E; \ | |
530 E = W * d; S5 += E; \ | |
531 E = W * e; S4 += E; \ | |
532 E = W * f; S3 += E; \ | |
533 E = W * g; S2 += E; \ | |
534 E = W * h; S1 += E; \ | |
535 a = lp[K]; \ | |
536 E = W * a; S0 += E | |
537 | |
538 # define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) | |
539 # define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) | |
540 # define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) | |
541 # define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) | |
542 # define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) | |
543 # define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) | |
544 # define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) | |
545 # define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) | |
546 | |
547 STEP_A(0); | |
548 STEP_B(1); | |
549 STEP_C(2); | |
550 STEP_D(3); | |
551 STEP_E(4); | |
552 STEP_F(5); | |
553 STEP_G(6); | |
554 STEP_H(7); | |
555 | |
556 STEP_A(8); | |
557 STEP_B(9); | |
558 STEP_C(10); | |
559 STEP_D(11); | |
560 STEP_E(12); | |
561 STEP_F(13); | |
562 STEP_G(14); | |
563 STEP_H(15); | |
564 | |
565 STEP_A(16); | |
566 STEP_B(17); | |
567 STEP_C(18); | |
568 STEP_D(19); | |
569 STEP_E(20); | |
570 STEP_F(21); | |
571 STEP_G(22); | |
572 STEP_H(23); | |
573 | |
574 STEP_A(24); | |
575 STEP_B(25); | |
576 STEP_C(26); | |
577 STEP_D(27); | |
578 STEP_E(28); | |
579 STEP_F(29); | |
580 STEP_G(30); | |
581 STEP_H(31); | |
582 | |
583 STEP_A(32); | |
584 STEP_B(33); | |
585 STEP_C(34); | |
586 STEP_D(35); | |
587 STEP_E(36); | |
588 STEP_F(37); | |
589 STEP_G(38); | |
590 STEP_H(39); | |
591 | |
592 if (S0 > L_max) { | |
593 L_max = S0; | |
594 Nc = lambda; | |
595 } | |
596 if (S1 > L_max) { | |
597 L_max = S1; | |
598 Nc = lambda + 1; | |
599 } | |
600 if (S2 > L_max) { | |
601 L_max = S2; | |
602 Nc = lambda + 2; | |
603 } | |
604 if (S3 > L_max) { | |
605 L_max = S3; | |
606 Nc = lambda + 3; | |
607 } | |
608 if (S4 > L_max) { | |
609 L_max = S4; | |
610 Nc = lambda + 4; | |
611 } | |
612 if (S5 > L_max) { | |
613 L_max = S5; | |
614 Nc = lambda + 5; | |
615 } | |
616 if (S6 > L_max) { | |
617 L_max = S6; | |
618 Nc = lambda + 6; | |
619 } | |
620 if (S7 > L_max) { | |
621 L_max = S7; | |
622 Nc = lambda + 7; | |
623 } | |
624 if (S8 > L_max) { | |
625 L_max = S8; | |
626 Nc = lambda + 8; | |
627 } | |
628 } | |
629 *Nc_out = Nc; | |
630 | |
631 if (L_max <= 0.) { | |
632 *bc_out = 0; | |
633 return; | |
634 } | |
635 | |
636 /* Compute the power of the reconstructed short term residual | |
637 * signal dp[..] | |
638 */ | |
639 dp_float -= Nc; | |
640 L_power = 0; | |
641 for (k = 0; k < 40; ++k) { | |
642 register float f = dp_float[k]; | |
643 L_power += f * f; | |
644 } | |
645 | |
646 if (L_max >= L_power) { | |
647 *bc_out = 3; | |
648 return; | |
649 } | |
650 | |
651 /* Coding of the LTP gain | |
652 * Table 4.3a must be used to obtain the level DLB[i] for the | |
653 * quantization of the LTP gain b to get the coded version bc. | |
654 */ | |
655 lambda = L_max / L_power * 32768.; | |
656 for (bc = 0; bc <= 2; ++bc) | |
657 if (lambda <= gsm_DLB[bc]) | |
658 break; | |
659 *bc_out = bc; | |
660 } | |
661 | |
662 #endif /* FAST */ | |
663 #endif /* USE_FLOAT_MUL */ | |
664 | |
665 | |
666 /* 4.2.12 */ | |
667 | |
668 static void Long_term_analysis_filtering P6((bc, Nc, dp, d, dpp, e), word bc, /* IN */ | |
669 word Nc, /* IN */ | |
670 register word * dp, /* previous d [-120..-1] IN */ | |
671 register word * d, /* d [0..39] IN */ | |
672 register word * dpp, /* estimate [0..39] OUT */ | |
673 register word * e /* long term res. signal [0..39] OUT */ | |
674 ) | |
675 /* | |
676 * In this part, we have to decode the bc parameter to compute | |
677 * the samples of the estimate dpp[0..39]. The decoding of bc needs the | |
678 * use of table 4.3b. The long term residual signal e[0..39] | |
679 * is then calculated to be fed to the RPE encoding section. | |
680 */ | |
681 { | |
682 /* register word bp; Was reported as unused */ | |
683 register int k; | |
684 register longword ltmp; | |
685 | |
686 # ifdef STEP | |
687 # undef STEP | |
688 # endif | |
689 | |
690 # define STEP(BP) \ | |
691 for (k = 0; k <= 39; k++) { \ | |
692 dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \ | |
693 e[k] = GSM_SUB( d[k], dpp[k] ); \ | |
694 } | |
695 | |
696 switch (bc) { | |
697 case 0: | |
698 STEP(3277); | |
699 break; | |
700 case 1: | |
701 STEP(11469); | |
702 break; | |
703 case 2: | |
704 STEP(21299); | |
705 break; | |
706 case 3: | |
707 STEP(32767); | |
708 break; | |
709 } | |
710 } | |
711 | |
712 void Gsm_Long_Term_Predictor P7((S, d, dp, e, dpp, Nc, bc), /* 4x for 160 samples */ | |
713 struct gsm_state *S, word * d, /* [0..39] residual signal IN */ | |
714 word * dp, /* [-120..-1] d' IN */ | |
715 word * e, /* [0..39] OUT */ | |
716 word * dpp, /* [0..39] OUT */ | |
717 word * Nc, /* correlation lag OUT */ | |
718 word * bc /* gain factor OUT */ | |
719 ) | |
720 { | |
721 assert(d); | |
722 assert(dp); | |
723 assert(e); | |
724 assert(dpp); | |
725 assert(Nc); | |
726 assert(bc); | |
727 | |
728 #if defined(FAST) && defined(USE_FLOAT_MUL) | |
729 if (S->fast) | |
730 Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc); | |
731 else | |
732 #endif | |
733 Calculation_of_the_LTP_parameters(d, dp, bc, Nc); | |
734 | |
735 Long_term_analysis_filtering(*bc, *Nc, dp, d, dpp, e); | |
736 } | |
737 | |
738 /* 4.3.2 */ | |
739 void Gsm_Long_Term_Synthesis_Filtering P5((S, Ncr, bcr, erp, drp), struct gsm_state *S, word Ncr, word bcr, register word * erp, /* [0..39] IN */ | |
740 register word * drp /* [-120..-1] IN, [0..40] OUT */ | |
741 ) | |
742 /* | |
743 * This procedure uses the bcr and Ncr parameter to realize the | |
744 * long term synthesis filtering. The decoding of bcr needs | |
745 * table 4.3b. | |
746 */ | |
747 { | |
748 register longword ltmp; /* for ADD */ | |
749 register int k; | |
750 word brp, drpp, Nr; | |
751 | |
752 /* Check the limits of Nr. | |
753 */ | |
754 Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; | |
755 S->nrp = Nr; | |
756 assert(Nr >= 40 && Nr <= 120); | |
757 | |
758 /* Decoding of the LTP gain bcr | |
759 */ | |
760 brp = gsm_QLB[bcr]; | |
761 | |
762 /* Computation of the reconstructed short term residual | |
763 * signal drp[0..39] | |
764 */ | |
765 assert(brp != MIN_WORD); | |
766 | |
767 for (k = 0; k <= 39; k++) { | |
768 drpp = GSM_MULT_R(brp, drp[k - Nr]); | |
769 drp[k] = GSM_ADD(erp[k], drpp); | |
770 } | |
771 | |
772 /* | |
773 * Update of the reconstructed short term residual signal | |
774 * drp[ -1..-120 ] | |
775 */ | |
776 | |
777 for (k = 0; k <= 119; k++) | |
778 drp[-120 + k] = drp[-80 + k]; | |
779 } |