comparison libtwamr/spstproc.c @ 404:a37687c6ff22

libtwamr: integrate spstproc.c
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 06 May 2024 23:17:09 +0000
parents
children
comparison
equal deleted inserted replaced
403:7e0aeab69b10 404:a37687c6ff22
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 : subframePostProc.c
11 * Purpose : Subframe post processing
12 *
13 ********************************************************************************
14 */
15
16 /*
17 ********************************************************************************
18 * MODULE INCLUDE FILE AND VERSION ID
19 ********************************************************************************
20 */
21 #include "namespace.h"
22 #include "spstproc.h"
23
24 /*
25 ********************************************************************************
26 * INCLUDE FILES
27 ********************************************************************************
28 */
29 #include "typedef.h"
30 #include "basic_op.h"
31 #include "oper_32b.h"
32 #include "no_count.h"
33 #include "syn_filt.h"
34 #include "cnst.h"
35
36 /*
37 ********************************************************************************
38 * LOCAL VARIABLES AND TABLES
39 ********************************************************************************
40 */
41
42 /*
43 ********************************************************************************
44 * PUBLIC PROGRAM CODE
45 ********************************************************************************
46 */
47 int subframePostProc(
48 Word16 *speech, /* i : speech segment */
49 enum Mode mode, /* i : coder mode */
50 Word16 i_subfr, /* i : Subframe nr */
51 Word16 gain_pit, /* i : Pitch gain Q14 */
52 Word16 gain_code, /* i : Decoded innovation gain */
53 Word16 *Aq, /* i : A(z) quantized for the 4 subframes */
54 Word16 synth[], /* i : Local snthesis */
55 Word16 xn[], /* i : Target vector for pitch search */
56 Word16 code[], /* i : Fixed codebook exitation */
57 Word16 y1[], /* i : Filtered adaptive exitation */
58 Word16 y2[], /* i : Filtered fixed codebook excitation */
59 Word16 *mem_syn, /* i/o : memory of synthesis filter */
60 Word16 *mem_err, /* o : pointer to error signal */
61 Word16 *mem_w0, /* o : memory of weighting filter */
62 Word16 *exc, /* o : long term prediction residual */
63 Word16 *sharp /* o : pitch sharpening value */
64 )
65 {
66 Word16 i, j, k;
67 Word16 temp;
68 Word32 L_temp;
69 Word16 tempShift;
70 Word16 kShift;
71 Word16 pitch_fac;
72
73 test ();
74 if (sub(mode, MR122) != 0)
75 {
76 tempShift = 1; move16 ();
77 kShift = 2; move16 ();
78 pitch_fac = gain_pit; move16 ();
79 }
80 else
81 {
82 tempShift = 2; move16 ();
83 kShift = 4; move16 ();
84 pitch_fac = shr (gain_pit, 1);
85 }
86
87 /*------------------------------------------------------------*
88 * - Update pitch sharpening "sharp" with quantized gain_pit *
89 *------------------------------------------------------------*/
90
91 *sharp = gain_pit; move16 ();
92 test ();
93 if (sub(*sharp, SHARPMAX) > 0)
94 {
95 *sharp = SHARPMAX; move16 ();
96 }
97 /*------------------------------------------------------*
98 * - Find the total excitation *
99 * - find synthesis speech corresponding to exc[] *
100 * - update filters memories for finding the target *
101 * vector in the next subframe *
102 * (update error[-m..-1] and mem_w_err[]) *
103 *------------------------------------------------------*/
104
105 for (i = 0; i < L_SUBFR; i++) {
106 /* exc[i] = gain_pit*exc[i] + gain_code*code[i]; */
107
108 /*
109 * 12k2 others
110 * ---------------------------------
111 * exc Q0 Q0
112 * gain_pit Q14 Q14
113 * pitch_fac Q13 Q14
114 * product: Q14 Q15
115 *
116 * code Q12 Q13
117 * gain_code Q1 Q1
118 * product Q14 Q15
119 * sum Q14 Q15
120 *
121 * tempShift 2 1
122 * sum<<tempShift Q16 Q16
123 * result -> exc Q0 Q0
124 */
125 L_temp = L_mult (exc[i + i_subfr], pitch_fac);
126 L_temp = L_mac (L_temp, code[i], gain_code);
127 L_temp = L_shl (L_temp, tempShift);
128 exc[i + i_subfr] = round (L_temp); move16 ();
129 }
130
131 Syn_filt(Aq, &exc[i_subfr], &synth[i_subfr], L_SUBFR,
132 mem_syn, 1);
133
134 for (i = L_SUBFR - M, j = 0; i < L_SUBFR; i++, j++) {
135 mem_err[j] = sub(speech[i_subfr + i],
136 synth[i_subfr + i]); move16 ();
137 /*
138 * 12k2 others
139 * ---------------------------------
140 * y1 Q0 Q0
141 * gain_pit Q14 Q14
142 * product Q15 Q15
143 * shifted prod. Q16 Q16
144 * temp Q0 Q0
145 *
146 * y2 Q10 Q12
147 * gain_code Q1 Q1
148 * product Q12 Q14
149 * kshift 4 2
150 * shifted prod. Q16 Q16
151 * k Q0 Q0
152 * mem_w0,xn,sum Q0 Q0
153 */
154 temp = extract_h(L_shl(L_mult(y1[i], gain_pit), 1));
155 k = extract_h(L_shl(L_mult(y2[i], gain_code), kShift));
156 mem_w0[j] = sub(xn[i], add(temp, k)); move16 ();
157 }
158
159 return 0;
160 }