1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20
21 3GPP TS 26.073
22 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23 Available from http://www.3gpp.org
24
25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30 ------------------------------------------------------------------------------
31
32
33
34 Pathname: ./audio/gsm-amr/c/src/spreproc.c
35 Functions: subframePreProc
36
37 Date: 02/06/2002
38
39 ------------------------------------------------------------------------------
40 REVISION HISTORY
41
42 Description: Updated template used to PV coding template.
43 Eliminated unnecessary use of the sub() function.
44
45 Description:
46 1. Replaced copy() and for-loop with more efficient memcpy().
47 2. Eliminated unused include file copy.h.
48
49 Description: Replaced OSCL mem type functions and eliminated include
50 files that now are chosen by OSCL definitions
51
52 Description: Replaced "int" and/or "char" with OSCL defined types.
53
54 Description:
55
56 ------------------------------------------------------------------------------
57 MODULE DESCRIPTION
58
59
60 ------------------------------------------------------------------------------
61 */
62
63 /*----------------------------------------------------------------------------
64 ; INCLUDES
65 ----------------------------------------------------------------------------*/
66 #include <string.h>
67
68 #include "spreproc.h"
69 #include "typedef.h"
70 #include "weight_a.h"
71 #include "syn_filt.h"
72 #include "residu.h"
73
74 /*----------------------------------------------------------------------------
75 ; MACROS
76 ; Define module specific macros here
77 ----------------------------------------------------------------------------*/
78
79 /*----------------------------------------------------------------------------
80 ; DEFINES
81 ; Include all pre-processor statements here. Include conditional
82 ; compile variables also.
83 ----------------------------------------------------------------------------*/
84
85 /*----------------------------------------------------------------------------
86 ; LOCAL FUNCTION DEFINITIONS
87 ; Function Prototype declaration
88 ----------------------------------------------------------------------------*/
89
90 /*----------------------------------------------------------------------------
91 ; LOCAL VARIABLE DEFINITIONS
92 ; Variable declaration - defined here and used outside this module
93 ----------------------------------------------------------------------------*/
94
95 /*
96 ------------------------------------------------------------------------------
97 FUNCTION NAME: subframePreProc
98 ------------------------------------------------------------------------------
99 INPUT AND OUTPUT DEFINITIONS
100
101 Inputs:
102 mode -- enum Mode -- coder mode
103 gamma1 -- const Word16 array -- spectral exp. factor 1
104 gamma1_12k2 -- const Word16 array -- spectral exp. factor 1 for EFR
105 gamma2 -- const Word16 array -- spectral exp. factor 2
106 A -- Pointer to Word16 -- A(z) unquantized for the 4 subframes
107 Aq -- Pointer to Word16 -- A(z) quantized for the 4 subframes
108 speech -- Pointer to Word16 -- speech segment
109 mem_err -- Pointer to Word16 -- pointer to error signal
110 mem_w0 -- Pointer to Word16 -- memory of weighting filter
111 zero -- Pointer to Word16 -- pointer to zero vector
112
113 Outputs:
114 ai_zero -- Word16 array -- history of weighted synth. filter
115 exc -- Word16 array -- long term prediction residual
116 h1 -- Word16 array -- impulse response
117 xn -- Word16 array -- target vector for pitch search
118 res2 -- Word16 array -- long term prediction residual
119 error -- Word16 array -- error of LPC synthesis filter
120
121 Returns:
122 Zero
123
124 Global Variables Used:
125 None
126
127 Local Variables Needed:
128 None
129
130 ------------------------------------------------------------------------------
131 FUNCTION DESCRIPTION
132
133
134 ------------------------------------------------------------------------------
135 REQUIREMENTS
136
137 None
138
139 ------------------------------------------------------------------------------
140 REFERENCES
141
142 spreproc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
143
144 ------------------------------------------------------------------------------
145 PSEUDO-CODE
146
147
148 ------------------------------------------------------------------------------
149 RESOURCES USED [optional]
150
151 When the code is written for a specific target processor the
152 the resources used should be documented below.
153
154 HEAP MEMORY USED: x bytes
155
156 STACK MEMORY USED: x bytes
157
158 CLOCK CYCLES: (cycle count equation for this function) + (variable
159 used to represent cycle count for each subroutine
160 called)
161 where: (cycle count variable) = cycle count for [subroutine
162 name]
163
164 ------------------------------------------------------------------------------
165 CAUTION [optional]
166 [State any special notes, constraints or cautions for users of this function]
167
168 ------------------------------------------------------------------------------
169 */
170
subframePreProc(enum Mode mode,const Word16 gamma1[],const Word16 gamma1_12k2[],const Word16 gamma2[],Word16 * A,Word16 * Aq,Word16 * speech,Word16 * mem_err,Word16 * mem_w0,Word16 * zero,Word16 ai_zero[],Word16 exc[],Word16 h1[],Word16 xn[],Word16 res2[],Word16 error[])171 void subframePreProc(
172 enum Mode mode, /* i : coder mode */
173 const Word16 gamma1[], /* i : spectral exp. factor 1 */
174 const Word16 gamma1_12k2[],/* i : spectral exp. factor 1 for EFR */
175 const Word16 gamma2[], /* i : spectral exp. factor 2 */
176 Word16 *A, /* i : A(z) unquantized for the 4 subframes */
177 Word16 *Aq, /* i : A(z) quantized for the 4 subframes */
178 Word16 *speech, /* i : speech segment */
179 Word16 *mem_err, /* i : pointer to error signal */
180 Word16 *mem_w0, /* i : memory of weighting filter */
181 Word16 *zero, /* i : pointer to zero vector */
182 Word16 ai_zero[], /* o : history of weighted synth. filter */
183 Word16 exc[], /* o : long term prediction residual */
184 Word16 h1[], /* o : impulse response */
185 Word16 xn[], /* o : target vector for pitch search */
186 Word16 res2[], /* o : long term prediction residual */
187 Word16 error[] /* o : error of LPC synthesis filter */
188 )
189 {
190 Word16 Ap1[MP1]; /* A(z) with spectral expansion */
191 Word16 Ap2[MP1]; /* A(z) with spectral expansion */
192 const Word16 *g1; /* Pointer to correct gammma1 vector */
193
194 /* mode specific pointer to gamma1 values */
195 if (mode == MR122 || mode == MR102)
196 {
197 g1 = gamma1_12k2;
198 }
199 else
200 {
201 g1 = gamma1;
202 }
203
204 /* Find the weighted LPC coefficients for the weighting filter. */
205 Weight_Ai(A, g1, Ap1);
206 Weight_Ai(A, gamma2, Ap2);
207
208 memcpy(ai_zero, Ap1, (M + 1)*sizeof(Word16));
209
210
211 Syn_filt(Aq, ai_zero, h1, L_SUBFR, zero, 0);
212 Syn_filt(Ap2, h1, h1, L_SUBFR, zero, 0);
213
214 /*
215 *
216 * Find the target vector for pitch search:
217 *
218 */
219
220 /* LPC residual */
221 Residu(Aq, speech, res2, L_SUBFR);
222
223 memcpy(exc, res2, L_SUBFR*sizeof(Word16));
224
225 Syn_filt(Aq, exc, error, L_SUBFR, mem_err, 0);
226
227 Residu(Ap1, error, xn, L_SUBFR);
228
229 /* target signal xn[]*/
230 Syn_filt(Ap2, xn, xn, L_SUBFR, mem_w0, 0);
231
232 return;
233
234 }
235