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.173
22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23 Available from http://www.3gpp.org
24
25 (C) 2007, 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 Filename: synthesis_amr_wb.cpp
35
36 Date: 05/04/2007
37
38 ------------------------------------------------------------------------------
39 REVISION HISTORY
40
41
42 Description:
43
44 ------------------------------------------------------------------------------
45 INPUT AND OUTPUT DEFINITIONS
46
47 int16 Aq[], A(z) : quantized Az
48 int16 exc[], (i) : excitation at 12kHz
49 int16 Q_new, (i) : scaling performed on exc
50 int16 synth16k[], (o) : 16kHz synthesis signal
51 int16 prms, (i) : compressed amr wb
52 int16 HfIsf[],
53 int16 nb_bits,
54 int16 newDTXState,
55 Decoder_State * st, (i/o) : State structure
56 int16 bfi, (i) : bad frame indicator
57 int16 *ScratchMem
58
59
60 ------------------------------------------------------------------------------
61 FUNCTION DESCRIPTION
62
63 Synthesis of signal at 16kHz with HF extension
64
65 ------------------------------------------------------------------------------
66 REQUIREMENTS
67
68
69 ------------------------------------------------------------------------------
70 REFERENCES
71
72 ------------------------------------------------------------------------------
73 PSEUDO-CODE
74
75 ------------------------------------------------------------------------------
76 */
77
78
79 /*----------------------------------------------------------------------------
80 ; INCLUDES
81 ----------------------------------------------------------------------------*/
82
83 #include "pv_amr_wb_type_defs.h"
84 #include "pvamrwbdecoder_mem_funcs.h"
85 #include "pvamrwbdecoder_basic_op.h"
86 #include "pvamrwbdecoder_cnst.h"
87 #include "pvamrwbdecoder_acelp.h"
88 #include "e_pv_amrwbdec.h"
89 #include "get_amr_wb_bits.h"
90 #include "pvamrwb_math_op.h"
91 #include "pvamrwbdecoder_api.h"
92 #include "synthesis_amr_wb.h"
93
94 /*----------------------------------------------------------------------------
95 ; MACROS
96 ; Define module specific macros here
97 ----------------------------------------------------------------------------*/
98
99
100 /*----------------------------------------------------------------------------
101 ; DEFINES
102 ; Include all pre-processor statements here. Include conditional
103 ; compile variables also.
104 ----------------------------------------------------------------------------*/
105
106 /*----------------------------------------------------------------------------
107 ; LOCAL FUNCTION DEFINITIONS
108 ; Function Prototype declaration
109 ----------------------------------------------------------------------------*/
110
111 /*----------------------------------------------------------------------------
112 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
113 ; Variable declaration - defined here and used outside this module
114 ----------------------------------------------------------------------------*/
115 /* High Band encoding */
116 const int16 HP_gain[16] =
117 {
118 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,
119 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728
120 };
121
122 /*----------------------------------------------------------------------------
123 ; EXTERNAL FUNCTION REFERENCES
124 ; Declare functions defined elsewhere and referenced in this module
125 ----------------------------------------------------------------------------*/
126
127 /*----------------------------------------------------------------------------
128 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
129 ; Declare variables used in this module but defined elsewhere
130 ----------------------------------------------------------------------------*/
131
132 /*----------------------------------------------------------------------------
133 ; FUNCTION CODE
134 ----------------------------------------------------------------------------*/
135
synthesis_amr_wb(int16 Aq[],int16 exc[],int16 Q_new,int16 synth16k[],int16 prms,int16 HfIsf[],int16 nb_bits,int16 newDTXState,Decoder_State * st,int16 bfi,int16 * ScratchMem)136 void synthesis_amr_wb(
137 int16 Aq[], /* A(z) : quantized Az */
138 int16 exc[], /* (i) : excitation at 12kHz */
139 int16 Q_new, /* (i) : scaling performed on exc */
140 int16 synth16k[], /* (o) : 16kHz synthesis signal */
141 int16 prms, /* (i) : parameter */
142 int16 HfIsf[],
143 int16 nb_bits,
144 int16 newDTXState,
145 Decoder_State * st, /* (i/o) : State structure */
146 int16 bfi, /* (i) : bad frame indicator */
147 int16 *ScratchMem
148 )
149 {
150 int16 i, fac, exp;
151 int16 tmp;
152 int16 ener, exp_ener;
153 int32 L_tmp;
154 int32 L_tmp2;
155
156 int16 HF_corr_gain;
157 int16 HF_gain_ind;
158 int16 gain1, gain2;
159
160 int16 *pt_synth;
161 int16 *pt_HF;
162 int16 *synth_hi = ScratchMem;
163 int16 *synth_lo = &ScratchMem[M + L_SUBFR];
164 int16 *synth = &synth_lo[M + L_SUBFR];
165 int16 *HF = &synth[L_SUBFR];
166 int16 *Ap = &HF[L_SUBFR16k]; /* High Frequency vector */
167 int16 *HfA = &Ap[M16k + 1];
168 int16 *pt_tmp;
169
170 /*------------------------------------------------------------*
171 * speech synthesis *
172 * ~~~~~~~~~~~~~~~~ *
173 * - Find synthesis speech corresponding to exc2[]. *
174 * - Perform fixed deemphasis and hp 50hz filtering. *
175 * - Oversampling from 12.8kHz to 16kHz. *
176 *------------------------------------------------------------*/
177
178 pv_memcpy((void *)synth_hi,
179 (void *)st->mem_syn_hi,
180 M*sizeof(*synth_hi));
181
182 pv_memcpy((void *)synth_lo,
183 (void *)st->mem_syn_lo,
184 M*sizeof(*synth_lo));
185
186 Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
187
188 pv_memcpy((void *)st->mem_syn_hi,
189 (void *)(synth_hi + L_SUBFR),
190 M*sizeof(*st->mem_syn_hi));
191
192 pv_memcpy((void *)st->mem_syn_lo,
193 (void *)(synth_lo + L_SUBFR),
194 M*sizeof(*st->mem_syn_lo));
195
196 deemphasis_32(synth_hi + M,
197 synth_lo + M,
198 synth,
199 PREEMPH_FAC,
200 L_SUBFR,
201 &(st->mem_deemph));
202
203 highpass_50Hz_at_12k8(synth,
204 L_SUBFR,
205 st->mem_sig_out);
206
207 oversamp_12k8_to_16k(synth,
208 L_SUBFR,
209 synth16k,
210 st->mem_oversamp,
211 ScratchMem);
212
213 /*
214 * HF noise synthesis
215 * - Generate HF noise between 5.5 and 7.5 kHz.
216 * - Set energy of noise according to synthesis tilt.
217 * tilt > 0.8 ==> - 14 dB (voiced)
218 * tilt 0.5 ==> - 6 dB (voiced or noise)
219 * tilt < 0.0 ==> 0 dB (noise)
220 */
221
222 /* generate white noise vector */
223 pt_tmp = HF;
224 for (i = L_SUBFR16k >> 2; i != 0 ; i--)
225 {
226 *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
227 *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
228 *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
229 *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
230 }
231 /* energy of excitation */
232
233 pt_tmp = exc;
234
235 for (i = L_SUBFR >> 2; i != 0; i--)
236 {
237 *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
238 pt_tmp++;
239 *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
240 pt_tmp++;
241 *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
242 pt_tmp++;
243 *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
244 pt_tmp++;
245 }
246
247
248 Q_new -= 3;
249
250 ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));
251 exp_ener -= Q_new << 1;
252
253 /* set energy of white noise to energy of excitation */
254
255 tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
256
257 if (tmp > ener)
258 {
259 tmp >>= 1; /* Be sure tmp < ener */
260 exp += 1;
261 }
262 L_tmp = L_deposit_h(div_16by16(tmp, ener)); /* result is normalized */
263 exp -= exp_ener;
264 one_ov_sqrt_norm(&L_tmp, &exp);
265 L_tmp = shl_int32(L_tmp, exp + 1); /* L_tmp x 2, L_tmp in Q31 */
266
267 tmp = (int16)(L_tmp >> 16); /* tmp = 2 x sqrt(ener_exc/ener_hf) */
268
269
270
271 pt_tmp = HF;
272 for (i = L_SUBFR16k >> 2; i != 0 ; i--)
273 {
274 *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
275 pt_tmp++;
276 *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
277 pt_tmp++;
278 *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
279 pt_tmp++;
280 *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
281 pt_tmp++;
282 }
283
284 /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
285
286 highpass_400Hz_at_12k8(synth, L_SUBFR, st->mem_hp400);
287
288 L_tmp = 1L;
289 L_tmp2 = 1L;
290
291
292 L_tmp = mac_16by16_to_int32(L_tmp, synth[0], synth[0]);
293
294 for (i = 1; i < L_SUBFR; i++)
295 {
296 L_tmp = mac_16by16_to_int32(L_tmp, synth[i], synth[i ]);
297 L_tmp2 = mac_16by16_to_int32(L_tmp2, synth[i], synth[i - 1]);
298 }
299
300
301 exp = normalize_amr_wb(L_tmp);
302
303 ener = (int16)((L_tmp << exp) >> 16); /* ener = r[0] */
304 tmp = (int16)((L_tmp2 << exp) >> 16); /* tmp = r[1] */
305
306 if (tmp > 0)
307 {
308 fac = div_16by16(tmp, ener);
309 }
310 else
311 {
312 fac = 0;
313 }
314
315 /* modify energy of white noise according to synthesis tilt */
316 gain1 = 32767 - fac;
317 gain2 = mult_int16(gain1, 20480);
318 gain2 = shl_int16(gain2, 1);
319
320 if (st->vad_hist > 0)
321 {
322 tmp = gain2 - 1;
323 }
324 else
325 {
326 tmp = gain1 - 1;
327 }
328
329
330 if (tmp != 0)
331 {
332 tmp++;
333 }
334
335 if (tmp < 3277)
336 {
337 tmp = 3277; /* 0.1 in Q15 */
338
339 }
340
341
342 if ((nb_bits >= NBBITS_24k) && (bfi == 0))
343 {
344 /* HF correction gain */
345 HF_gain_ind = prms;
346 HF_corr_gain = HP_gain[HF_gain_ind];
347
348 pt_tmp = HF;
349 for (i = L_SUBFR16k >> 2; i != 0 ; i--)
350 {
351 *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
352 pt_tmp++;
353 *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
354 pt_tmp++;
355 *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
356 pt_tmp++;
357 *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
358 pt_tmp++;
359 }
360
361 /* HF gain */
362 }
363 else
364 {
365 pt_tmp = HF;
366 for (i = L_SUBFR16k >> 2; i != 0 ; i--)
367 {
368 *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
369 pt_tmp++;
370 *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
371 pt_tmp++;
372 *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
373 pt_tmp++;
374 *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
375 pt_tmp++;
376 }
377 }
378
379
380 if ((nb_bits <= NBBITS_7k) && (newDTXState == SPEECH))
381 {
382 isf_extrapolation(HfIsf);
383 Isp_Az(HfIsf, HfA, M16k, 0);
384
385 weight_amrwb_lpc(HfA, Ap, 29491, M16k); /* fac=0.9 */
386
387 wb_syn_filt(Ap,
388 M16k,
389 HF,
390 HF,
391 L_SUBFR16k,
392 st->mem_syn_hf,
393 1,
394 ScratchMem);
395 }
396 else
397 {
398 /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
399 weight_amrwb_lpc(Aq, Ap, 19661, M); /* fac=0.6 */
400
401 wb_syn_filt(Ap,
402 M,
403 HF,
404 HF,
405 L_SUBFR16k,
406 st->mem_syn_hf + (M16k - M),
407 1,
408 ScratchMem);
409 }
410
411 /* noise Band Pass filtering (1ms of delay) */
412 band_pass_6k_7k(HF,
413 L_SUBFR16k,
414 st->mem_hf,
415 ScratchMem);
416
417
418 if (nb_bits >= NBBITS_24k)
419 {
420 /* Low Pass filtering (7 kHz) */
421 low_pass_filt_7k(HF,
422 L_SUBFR16k,
423 st->mem_hf3,
424 ScratchMem);
425 }
426 /* add filtered HF noise to speech synthesis */
427
428 pt_synth = synth16k;
429 pt_HF = HF;
430
431 for (i = L_SUBFR16k >> 1; i != 0; i--)
432 {
433 *(pt_synth) = add_int16(*(pt_synth), *(pt_HF++)); /* check 16 bit saturation */
434 pt_synth++;
435 *(pt_synth) = add_int16(*(pt_synth), *(pt_HF++));
436 pt_synth++;
437 }
438
439 }
440
441