2
|
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 }
|