comparison libgsmefr/cod_12k2.c @ 53:49dd1ac8e75b

libgsmefr: import most *.c files from ETSI source
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 25 Nov 2022 16:18:21 +0000
parents
children d285877fc4cc
comparison
equal deleted inserted replaced
52:988fd7ff514f 53:49dd1ac8e75b
1 /***************************************************************************
2 *
3 * FILE NAME: cod_12k2.c
4 *
5 * FUNCTIONS DEFINED IN THIS FILE:
6 * Coder_12k2 and Init_Coder_12k2
7 *
8 *
9 * Init_Coder_12k2(void):
10 * Initialization of variables for the coder section.
11 *
12 * Coder_12k2(Word16 ana[], Word16 synth[]):
13 * Speech encoder routine operating on a frame basis.
14 *
15
16 ***************************************************************************/
17
18 #include "typedef.h"
19 #include "basic_op.h"
20 #include "sig_proc.h"
21 #include "count.h"
22 #include "codec.h"
23 #include "cnst.h"
24
25 #include "window2.tab"
26
27 #include "vad.h"
28 #include "dtx.h"
29
30 /*-----------------------------------------------------------*
31 * Coder constant parameters (defined in "cnst.h") *
32 *-----------------------------------------------------------*
33 * L_WINDOW : LPC analysis window size *
34 * L_FRAME : Frame size *
35 * L_FRAME_BY2 : Half the frame size *
36 * L_SUBFR : Sub-frame size *
37 * M : LPC order *
38 * MP1 : LPC order+1 *
39 * L_TOTAL : Total size of speech buffer *
40 * PIT_MIN : Minimum pitch lag *
41 * PIT_MAX : Maximum pitch lag *
42 * L_INTERPOL : Length of filter for interpolation *
43 *-----------------------------------------------------------*/
44
45 /*--------------------------------------------------------*
46 * Static memory allocation. *
47 *--------------------------------------------------------*/
48
49 /* Speech vector */
50
51 static Word16 old_speech[L_TOTAL];
52 static Word16 *speech, *p_window, *p_window_mid;
53 Word16 *new_speech; /* Global variable */
54
55 /* Weight speech vector */
56
57 static Word16 old_wsp[L_FRAME + PIT_MAX];
58 static Word16 *wsp;
59
60 /* Excitation vector */
61
62 static Word16 old_exc[L_FRAME + PIT_MAX + L_INTERPOL];
63 static Word16 *exc;
64
65 /* Zero vector */
66
67 static Word16 ai_zero[L_SUBFR + MP1];
68 static Word16 *zero;
69
70 /* Impulse response vector */
71
72 static Word16 *h1;
73 static Word16 hvec[L_SUBFR * 2];
74
75 /* Spectral expansion factors */
76
77 static const Word16 F_gamma1[M] =
78 {
79 29491, 26542, 23888, 21499, 19349,
80 17414, 15672, 14105, 12694, 11425
81 };
82 static const Word16 F_gamma2[M] =
83 {
84 19661, 11797, 7078, 4247, 2548,
85 1529, 917, 550, 330, 198
86 };
87
88 /* Lsp (Line spectral pairs) */
89
90 static Word16 lsp_old[M];
91 static Word16 lsp_old_q[M];
92
93 /* Filter's memory */
94
95 static Word16 mem_syn[M], mem_w0[M], mem_w[M];
96 static Word16 mem_err[M + L_SUBFR], *error;
97
98 /***************************************************************************
99 * FUNCTION: Init_Coder_12k2
100 *
101 * PURPOSE: Initialization of variables for the coder section.
102 *
103 * DESCRIPTION:
104 * - initilize pointers to speech buffer
105 * - initialize static pointers
106 * - set static vectors to zero
107 *
108 ***************************************************************************/
109
110 void Init_Coder_12k2 (void)
111 {
112
113 /*--------------------------------------------------------------------------*
114 * Initialize pointers to speech vector. *
115 *--------------------------------------------------------------------------*/
116
117 new_speech = old_speech + L_TOTAL - L_FRAME;/* New speech */
118 speech = new_speech; /* Present frame */
119 p_window = old_speech + L_TOTAL - L_WINDOW; /* For LPC window */
120 p_window_mid = p_window; /* For LPC window */
121
122 /* Initialize static pointers */
123
124 wsp = old_wsp + PIT_MAX;
125 exc = old_exc + PIT_MAX + L_INTERPOL;
126 zero = ai_zero + MP1;
127 error = mem_err + M;
128 h1 = &hvec[L_SUBFR];
129
130 /* Static vectors to zero */
131
132 Set_zero (old_speech, L_TOTAL);
133 Set_zero (old_exc, PIT_MAX + L_INTERPOL);
134 Set_zero (old_wsp, PIT_MAX);
135 Set_zero (mem_syn, M);
136 Set_zero (mem_w, M);
137 Set_zero (mem_w0, M);
138 Set_zero (mem_err, M);
139 Set_zero (zero, L_SUBFR);
140 Set_zero (hvec, L_SUBFR); /* set to zero "h1[-L_SUBFR..-1]" */
141
142 /* Initialize lsp_old [] */
143
144 lsp_old[0] = 30000;
145 lsp_old[1] = 26000;
146 lsp_old[2] = 21000;
147 lsp_old[3] = 15000;
148 lsp_old[4] = 8000;
149 lsp_old[5] = 0;
150 lsp_old[6] = -8000;
151 lsp_old[7] = -15000;
152 lsp_old[8] = -21000;
153 lsp_old[9] = -26000;
154
155 /* Initialize lsp_old_q[] */
156
157 Copy (lsp_old, lsp_old_q, M);
158
159 return;
160 }
161
162 /***************************************************************************
163 * FUNCTION: Coder_12k2
164 *
165 * PURPOSE: Principle encoder routine.
166 *
167 * DESCRIPTION: This function is called every 20 ms speech frame,
168 * operating on the newly read 160 speech samples. It performs the
169 * principle encoding functions to produce the set of encoded parameters
170 * which include the LSP, adaptive codebook, and fixed codebook
171 * quantization indices (addresses and gains).
172 *
173 * INPUTS:
174 * No input arguments are passed to this function. However, before
175 * calling this function, 160 new speech data samples should be copied to
176 * the vector new_speech[]. This is a global pointer which is declared in
177 * this file (it points to the end of speech buffer minus 160).
178 *
179 * OUTPUTS:
180 *
181 * ana[]: vector of analysis parameters.
182 * synth[]: Local synthesis speech (for debugging purposes)
183 *
184 ***************************************************************************/
185
186 void Coder_12k2 (
187 Word16 ana[], /* output : Analysis parameters */
188 Word16 synth[] /* output : Local synthesis */
189 )
190 {
191 /* LPC coefficients */
192
193 Word16 r_l[MP1], r_h[MP1]; /* Autocorrelations lo and hi */
194 Word16 A_t[(MP1) * 4]; /* A(z) unquantized for the 4 subframes */
195 Word16 Aq_t[(MP1) * 4]; /* A(z) quantized for the 4 subframes */
196 Word16 Ap1[MP1]; /* A(z) with spectral expansion */
197 Word16 Ap2[MP1]; /* A(z) with spectral expansion */
198 Word16 *A, *Aq; /* Pointer on A_t and Aq_t */
199 Word16 lsp_new[M], lsp_new_q[M];/* LSPs at 4th subframe */
200 Word16 lsp_mid[M], lsp_mid_q[M];/* LSPs at 2nd subframe */
201
202 /* Other vectors */
203
204 Word16 xn[L_SUBFR]; /* Target vector for pitch search */
205 Word16 xn2[L_SUBFR]; /* Target vector for codebook search */
206 Word16 res2[L_SUBFR]; /* Long term prediction residual */
207 Word16 code[L_SUBFR]; /* Fixed codebook excitation */
208 Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */
209 Word16 y2[L_SUBFR]; /* Filtered fixed codebook excitation */
210
211 /* Scalars */
212
213 Word16 i, j, k, i_subfr;
214 Word16 T_op, T0, T0_min, T0_max, T0_frac;
215 Word16 gain_pit, gain_code, pit_flag, pit_sharp;
216 Word16 temp;
217 Word32 L_temp;
218
219 Word16 scal_acf, VAD_flag, lags[2], rc[4];
220
221 extern Word16 ptch;
222 extern Word16 txdtx_ctrl, CN_excitation_gain;
223 extern Word32 L_pn_seed_tx;
224 extern Word16 dtx_mode;
225
226 /*----------------------------------------------------------------------*
227 * - Perform LPC analysis: (twice per frame) *
228 * * autocorrelation + lag windowing *
229 * * Levinson-Durbin algorithm to find a[] *
230 * * convert a[] to lsp[] *
231 * * quantize and code the LSPs *
232 * * find the interpolated LSPs and convert to a[] for all *
233 * subframes (both quantized and unquantized) *
234 *----------------------------------------------------------------------*/
235
236 /* LP analysis centered at 2nd subframe */
237
238
239 scal_acf = Autocorr (p_window_mid, M, r_h, r_l, window_160_80);
240 /* Autocorrelations */
241
242 #if (WMOPS)
243 fwc (); /* function worst case */
244 #endif
245
246 Lag_window (M, r_h, r_l); /* Lag windowing */
247
248 #if (WMOPS)
249 fwc (); /* function worst case */
250 #endif
251
252 Levinson (r_h, r_l, &A_t[MP1], rc); /* Levinson-Durbin */
253
254 #if (WMOPS)
255 fwc (); /* function worst case */
256 #endif
257
258 Az_lsp (&A_t[MP1], lsp_mid, lsp_old); /* From A(z) to lsp */
259
260 #if (WMOPS)
261 fwc (); /* function worst case */
262 #endif
263
264 /* LP analysis centered at 4th subframe */
265
266 /* Autocorrelations */
267 scal_acf = Autocorr (p_window, M, r_h, r_l, window_232_8);
268
269 #if (WMOPS)
270 fwc (); /* function worst case */
271 #endif
272
273 Lag_window (M, r_h, r_l); /* Lag windowing */
274
275 #if (WMOPS)
276 fwc (); /* function worst case */
277 #endif
278
279 Levinson (r_h, r_l, &A_t[MP1 * 3], rc); /* Levinson-Durbin */
280
281 #if (WMOPS)
282 fwc (); /* function worst case */
283 #endif
284
285 Az_lsp (&A_t[MP1 * 3], lsp_new, lsp_mid); /* From A(z) to lsp */
286
287 #if (WMOPS)
288 fwc (); /* function worst case */
289 #endif
290
291 if (dtx_mode == 1)
292 {
293 /* DTX enabled, make voice activity decision */
294 VAD_flag = vad_computation (r_h, r_l, scal_acf, rc, ptch);
295 move16 ();
296
297 tx_dtx (VAD_flag, &txdtx_ctrl); /* TX DTX handler */
298 }
299 else
300 {
301 /* DTX disabled, active speech in every frame */
302 VAD_flag = 1;
303 txdtx_ctrl = TX_VAD_FLAG | TX_SP_FLAG;
304 }
305
306 /* LSP quantization (lsp_mid[] and lsp_new[] jointly quantized) */
307
308 Q_plsf_5 (lsp_mid, lsp_new, lsp_mid_q, lsp_new_q, ana, txdtx_ctrl);
309
310 #if (WMOPS)
311 fwc (); /* function worst case */
312 #endif
313 ana += 5; move16 ();
314
315 /*--------------------------------------------------------------------*
316 * Find interpolated LPC parameters in all subframes (both quantized *
317 * and unquantized). *
318 * The interpolated parameters are in array A_t[] of size (M+1)*4 *
319 * and the quantized interpolated parameters are in array Aq_t[] *
320 *--------------------------------------------------------------------*/
321
322 Int_lpc2 (lsp_old, lsp_mid, lsp_new, A_t);
323
324 #if (WMOPS)
325 fwc (); /* function worst case */
326 #endif
327
328 test (); logic16 ();
329 if ((txdtx_ctrl & TX_SP_FLAG) != 0)
330 {
331 Int_lpc (lsp_old_q, lsp_mid_q, lsp_new_q, Aq_t);
332
333 /* update the LSPs for the next frame */
334 for (i = 0; i < M; i++)
335 {
336 lsp_old[i] = lsp_new[i]; move16 ();
337 lsp_old_q[i] = lsp_new_q[i]; move16 ();
338 }
339 }
340 else
341 {
342 /* Use unquantized LPC parameters in case of no speech activity */
343 for (i = 0; i < MP1; i++)
344 {
345 Aq_t[i] = A_t[i]; move16 ();
346 Aq_t[i + MP1] = A_t[i + MP1]; move16 ();
347 Aq_t[i + MP1 * 2] = A_t[i + MP1 * 2]; move16 ();
348 Aq_t[i + MP1 * 3] = A_t[i + MP1 * 3]; move16 ();
349 }
350
351 /* update the LSPs for the next frame */
352 for (i = 0; i < M; i++)
353 {
354 lsp_old[i] = lsp_new[i]; move16 ();
355 lsp_old_q[i] = lsp_new[i]; move16 ();
356 }
357 }
358
359 #if (WMOPS)
360 fwc (); /* function worst case */
361 #endif
362
363 /*----------------------------------------------------------------------*
364 * - Find the weighted input speech wsp[] for the whole speech frame *
365 * - Find the open-loop pitch delay for first 2 subframes *
366 * - Set the range for searching closed-loop pitch in 1st subframe *
367 * - Find the open-loop pitch delay for last 2 subframes *
368 *----------------------------------------------------------------------*/
369
370 A = A_t; move16 ();
371 for (i = 0; i < L_FRAME; i += L_SUBFR)
372 {
373 Weight_Ai (A, F_gamma1, Ap1);
374
375 #if (WMOPS)
376 fwc (); /* function worst case */
377 #endif
378
379 Weight_Ai (A, F_gamma2, Ap2);
380
381 #if (WMOPS)
382 fwc (); /* function worst case */
383 #endif
384
385 Residu (Ap1, &speech[i], &wsp[i], L_SUBFR);
386
387 #if (WMOPS)
388 fwc (); /* function worst case */
389 #endif
390
391 Syn_filt (Ap2, &wsp[i], &wsp[i], L_SUBFR, mem_w, 1);
392
393 #if (WMOPS)
394 fwc (); /* function worst case */
395 #endif
396
397 A += MP1; move16 ();
398 }
399
400 /* Find open loop pitch lag for first two subframes */
401
402 T_op = Pitch_ol (wsp, PIT_MIN, PIT_MAX, L_FRAME_BY2); move16 ();
403
404 #if (WMOPS)
405 fwc (); /* function worst case */
406 #endif
407
408 lags[0] = T_op; move16 ();
409
410 test (); logic16 ();
411 if ((txdtx_ctrl & TX_SP_FLAG) != 0)
412 {
413 /* Range for closed loop pitch search in 1st subframe */
414
415 T0_min = sub (T_op, 3);
416 test ();
417 if (sub (T0_min, PIT_MIN) < 0)
418 {
419 T0_min = PIT_MIN; move16 ();
420 }
421 T0_max = add (T0_min, 6);
422 test ();
423 if (sub (T0_max, PIT_MAX) > 0)
424 {
425 T0_max = PIT_MAX; move16 ();
426 T0_min = sub (T0_max, 6);
427 }
428 #if (WMOPS)
429 fwc (); /* function worst case */
430 #endif
431 }
432 /* Find open loop pitch lag for last two subframes */
433
434 T_op = Pitch_ol (&wsp[L_FRAME_BY2], PIT_MIN, PIT_MAX, L_FRAME_BY2);
435 move16 ();
436
437 #if (WMOPS)
438 fwc (); /* function worst case */
439 #endif
440
441 if (dtx_mode == 1)
442 {
443 lags[1] = T_op; move16 ();
444 periodicity_update (lags, &ptch);
445 }
446 /*----------------------------------------------------------------------*
447 * Loop for every subframe in the analysis frame *
448 *----------------------------------------------------------------------*
449 * To find the pitch and innovation parameters. The subframe size is *
450 * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. *
451 * - find the weighted LPC coefficients *
452 * - find the LPC residual signal res[] *
453 * - compute the target signal for pitch search *
454 * - compute impulse response of weighted synthesis filter (h1[]) *
455 * - find the closed-loop pitch parameters *
456 * - encode the pitch delay *
457 * - update the impulse response h1[] by including pitch *
458 * - find target vector for codebook search *
459 * - codebook search *
460 * - encode codebook address *
461 * - VQ of pitch and codebook gains *
462 * - find synthesis speech *
463 * - update states of weighting filter *
464 *----------------------------------------------------------------------*/
465
466 /* pointer to interpolated LPC parameters */
467 A = A_t; move16 ();
468 /* pointer to interpolated quantized LPC parameters */
469 Aq = Aq_t; move16 ();
470
471 for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
472 {
473
474 test (); logic16 ();
475 if ((txdtx_ctrl & TX_SP_FLAG) != 0)
476 {
477
478 /*---------------------------------------------------------------*
479 * Find the weighted LPC coefficients for the weighting filter. *
480 *---------------------------------------------------------------*/
481
482 Weight_Ai (A, F_gamma1, Ap1);
483
484 #if (WMOPS)
485 fwc (); /* function worst case */
486 #endif
487
488 Weight_Ai (A, F_gamma2, Ap2);
489
490 #if (WMOPS)
491 fwc (); /* function worst case */
492 #endif
493
494 /*---------------------------------------------------------------*
495 * Compute impulse response, h1[], of weighted synthesis filter *
496 *---------------------------------------------------------------*/
497
498 for (i = 0; i <= M; i++)
499 {
500 ai_zero[i] = Ap1[i]; move16 ();
501 }
502
503 Syn_filt (Aq, ai_zero, h1, L_SUBFR, zero, 0);
504
505 #if (WMOPS)
506 fwc (); /* function worst case */
507 #endif
508
509 Syn_filt (Ap2, h1, h1, L_SUBFR, zero, 0);
510
511 #if (WMOPS)
512 fwc (); /* function worst case */
513 #endif
514
515 }
516 /*---------------------------------------------------------------*
517 * Find the target vector for pitch search: *
518 *---------------------------------------------------------------*/
519
520 Residu (Aq, &speech[i_subfr], res2, L_SUBFR); /* LPC residual */
521
522 #if (WMOPS)
523 fwc (); /* function worst case */
524 #endif
525
526 test (); logic16 ();
527 if ((txdtx_ctrl & TX_SP_FLAG) == 0)
528 {
529 /* Compute comfort noise excitation gain based on
530 LP residual energy */
531
532 CN_excitation_gain = compute_CN_excitation_gain (res2);
533 move16 ();
534 }
535 else
536 {
537 Copy (res2, &exc[i_subfr], L_SUBFR);
538
539 #if (WMOPS)
540 fwc (); /* function worst case */
541 #endif
542
543 Syn_filt (Aq, &exc[i_subfr], error, L_SUBFR, mem_err, 0);
544
545 #if (WMOPS)
546 fwc (); /* function worst case */
547 #endif
548
549 Residu (Ap1, error, xn, L_SUBFR);
550
551 #if (WMOPS)
552 fwc (); /* function worst case */
553 #endif
554
555 Syn_filt (Ap2, xn, xn, L_SUBFR, mem_w0, 0); /* target signal xn[]*/
556
557 #if (WMOPS)
558 fwc (); /* function worst case */
559 #endif
560
561 /*--------------------------------------------------------------*
562 * Closed-loop fractional pitch search *
563 *--------------------------------------------------------------*/
564
565 /* flag for first and 3th subframe */
566 pit_flag = i_subfr; move16 ();
567 test ();
568 /* set t0_min and t0_max for 3th subf.*/
569 if (sub (i_subfr, L_FRAME_BY2) == 0)
570 {
571 T0_min = sub (T_op, 3);
572
573 test ();
574 if (sub (T0_min, PIT_MIN) < 0)
575 {
576 T0_min = PIT_MIN; move16 ();
577 }
578 T0_max = add (T0_min, 6);
579 test ();
580 if (sub (T0_max, PIT_MAX) > 0)
581 {
582 T0_max = PIT_MAX; move16 ();
583 T0_min = sub (T0_max, 6);
584 }
585 pit_flag = 0; move16 ();
586 }
587 #if (WMOPS)
588 fwc (); /* function worst case */
589 #endif
590
591 T0 = Pitch_fr6 (&exc[i_subfr], xn, h1, L_SUBFR, T0_min, T0_max,
592 pit_flag, &T0_frac); move16 ();
593
594 #if (WMOPS)
595 fwc (); /* function worst case */
596 #endif
597
598 *ana = Enc_lag6 (T0, &T0_frac, &T0_min, &T0_max, PIT_MIN,
599 PIT_MAX, pit_flag);
600 move16 ();
601
602 #if (WMOPS)
603 fwc (); /* function worst case */
604 #endif
605 }
606 ana++;
607 /* Incrementation of ana is done here to work also
608 when no speech activity is present */
609
610 test (); logic16 ();
611
612 if ((txdtx_ctrl & TX_SP_FLAG) != 0)
613 {
614
615 /*---------------------------------------------------------------*
616 * - find unity gain pitch excitation (adaptive codebook entry) *
617 * with fractional interpolation. *
618 * - find filtered pitch exc. y1[]=exc[] convolved with h1[] *
619 * - compute pitch gain and limit between 0 and 1.2 *
620 * - update target vector for codebook search *
621 * - find LTP residual. *
622 *---------------------------------------------------------------*/
623
624 Pred_lt_6 (&exc[i_subfr], T0, T0_frac, L_SUBFR);
625
626 #if (WMOPS)
627 fwc (); /* function worst case */
628 #endif
629
630 Convolve (&exc[i_subfr], h1, y1, L_SUBFR);
631
632 #if (WMOPS)
633 fwc (); /* function worst case */
634 #endif
635
636 gain_pit = G_pitch (xn, y1, L_SUBFR); move16 ();
637
638 #if (WMOPS)
639 fwc (); /* function worst case */
640 #endif
641
642 *ana = q_gain_pitch (&gain_pit); move16 ();
643
644 #if (WMOPS)
645 fwc (); /* function worst case */
646 #endif
647
648 }
649 else
650 {
651 gain_pit = 0; move16 ();
652 }
653
654 ana++; /* Incrementation of ana is done here to work
655 also when no speech activity is present */
656
657 test (); logic16 ();
658
659 if ((txdtx_ctrl & TX_SP_FLAG) != 0)
660 {
661 /* xn2[i] = xn[i] - y1[i] * gain_pit */
662 /* res2[i] -= exc[i+i_subfr] * gain_pit */
663
664 for (i = 0; i < L_SUBFR; i++)
665 {
666 L_temp = L_mult (y1[i], gain_pit);
667 L_temp = L_shl (L_temp, 3);
668 xn2[i] = sub (xn[i], extract_h (L_temp)); move16 ();
669
670 L_temp = L_mult (exc[i + i_subfr], gain_pit);
671 L_temp = L_shl (L_temp, 3);
672 res2[i] = sub (res2[i], extract_h (L_temp)); move16 ();
673 }
674
675 #if (WMOPS)
676 fwc (); /* function worst case */
677 #endif
678
679 /*-------------------------------------------------------------*
680 * - include pitch contribution into impulse resp. h1[] *
681 *-------------------------------------------------------------*/
682
683 /* pit_sharp = gain_pit; */
684 /* if (pit_sharp > 1.0) pit_sharp = 1.0; */
685
686 pit_sharp = shl (gain_pit, 3);
687
688 for (i = T0; i < L_SUBFR; i++)
689 {
690 temp = mult (h1[i - T0], pit_sharp);
691 h1[i] = add (h1[i], temp); move16 ();
692 }
693
694 #if (WMOPS)
695 fwc (); /* function worst case */
696 #endif
697
698 /*--------------------------------------------------------------*
699 * - Innovative codebook search (find index and gain) *
700 *--------------------------------------------------------------*/
701
702 code_10i40_35bits (xn2, res2, h1, code, y2, ana);
703
704 #if (WMOPS)
705 fwc (); /* function worst case */
706 #endif
707
708 }
709 else
710 {
711 build_CN_code (code, &L_pn_seed_tx);
712 }
713 ana += 10; move16 ();
714
715 test (); logic16 ();
716 if ((txdtx_ctrl & TX_SP_FLAG) != 0)
717 {
718
719 /*-------------------------------------------------------*
720 * - Add the pitch contribution to code[]. *
721 *-------------------------------------------------------*/
722
723 for (i = T0; i < L_SUBFR; i++)
724 {
725 temp = mult (code[i - T0], pit_sharp);
726 code[i] = add (code[i], temp); move16 ();
727 }
728
729 #if (WMOPS)
730 fwc (); /* function worst case */
731 #endif
732
733 /*------------------------------------------------------*
734 * - Quantization of fixed codebook gain. *
735 *------------------------------------------------------*/
736
737 gain_code = G_code (xn2, y2); move16 ();
738
739 #if (WMOPS)
740 fwc (); /* function worst case */
741 #endif
742
743 }
744 *ana++ = q_gain_code (code, L_SUBFR, &gain_code, txdtx_ctrl, i_subfr);
745 move16 ();
746
747 #if (WMOPS)
748 fwc (); /* function worst case */
749 #endif
750
751 /*------------------------------------------------------*
752 * - Find the total excitation *
753 * - find synthesis speech corresponding to exc[] *
754 * - update filter memories for finding the target *
755 * vector in the next subframe *
756 * (update mem_err[] and mem_w0[]) *
757 *------------------------------------------------------*/
758
759 for (i = 0; i < L_SUBFR; i++)
760 {
761 /* exc[i] = gain_pit*exc[i] + gain_code*code[i]; */
762
763 L_temp = L_mult (exc[i + i_subfr], gain_pit);
764 L_temp = L_mac (L_temp, code[i], gain_code);
765 L_temp = L_shl (L_temp, 3);
766 exc[i + i_subfr] = round (L_temp); move16 ();
767 }
768
769 #if (WMOPS)
770 fwc (); /* function worst case */
771 #endif
772
773 Syn_filt (Aq, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem_syn, 1);
774
775 #if (WMOPS)
776 fwc (); /* function worst case */
777 #endif
778
779 test (); logic16 ();
780 if ((txdtx_ctrl & TX_SP_FLAG) != 0)
781 {
782
783 for (i = L_SUBFR - M, j = 0; i < L_SUBFR; i++, j++)
784 {
785 mem_err[j] = sub (speech[i_subfr + i], synth[i_subfr + i]);
786 move16 ();
787 temp = extract_h (L_shl (L_mult (y1[i], gain_pit), 3));
788 k = extract_h (L_shl (L_mult (y2[i], gain_code), 5));
789 mem_w0[j] = sub (xn[i], add (temp, k)); move16 ();
790 }
791 }
792 else
793 {
794 for (j = 0; j < M; j++)
795 {
796 mem_err[j] = 0; move16 ();
797 mem_w0[j] = 0; move16 ();
798 }
799 }
800
801 #if (WMOPS)
802 fwc (); /* function worst case */
803 #endif
804 /* interpolated LPC parameters for next subframe */
805 A += MP1; move16 ();
806 Aq += MP1; move16 ();
807 }
808
809 /*--------------------------------------------------*
810 * Update signal for next frame. *
811 * -> shift to the left by L_FRAME: *
812 * speech[], wsp[] and exc[] *
813 *--------------------------------------------------*/
814
815 Copy (&old_speech[L_FRAME], &old_speech[0], L_TOTAL - L_FRAME);
816
817 #if (WMOPS)
818 fwc (); /* function worst case */
819 #endif
820
821 Copy (&old_wsp[L_FRAME], &old_wsp[0], PIT_MAX);
822
823 #if (WMOPS)
824 fwc (); /* function worst case */
825 #endif
826
827 Copy (&old_exc[L_FRAME], &old_exc[0], PIT_MAX + L_INTERPOL);
828
829 #if (WMOPS)
830 fwc (); /* function worst case */
831 #endif
832
833 return;
834 }