• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -----------------------------------------------------------------------------
2 Software License for The Fraunhofer FDK AAC Codec Library for Android
3 
4 © Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5 Forschung e.V. All rights reserved.
6 
7  1.    INTRODUCTION
8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
11 a wide variety of Android devices.
12 
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14 general perceptual audio codecs. AAC-ELD is considered the best-performing
15 full-bandwidth communications codec by independent studies and is widely
16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17 specifications.
18 
19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
20 those of Fraunhofer) may be obtained through Via Licensing
21 (www.vialicensing.com) or through the respective patent owners individually for
22 the purpose of encoding or decoding bit streams in products that are compliant
23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24 Android devices already license these patent claims through Via Licensing or
25 directly from the patent owners, and therefore FDK AAC Codec software may
26 already be covered under those patent licenses when it is used for those
27 licensed purposes only.
28 
29 Commercially-licensed AAC software libraries, including floating-point versions
30 with enhanced sound quality, are also available from Fraunhofer. Users are
31 encouraged to check the Fraunhofer website for additional applications
32 information and documentation.
33 
34 2.    COPYRIGHT LICENSE
35 
36 Redistribution and use in source and binary forms, with or without modification,
37 are permitted without payment of copyright license fees provided that you
38 satisfy the following conditions:
39 
40 You must retain the complete text of this software license in redistributions of
41 the FDK AAC Codec or your modifications thereto in source code form.
42 
43 You must retain the complete text of this software license in the documentation
44 and/or other materials provided with redistributions of the FDK AAC Codec or
45 your modifications thereto in binary form. You must make available free of
46 charge copies of the complete source code of the FDK AAC Codec and your
47 modifications thereto to recipients of copies in binary form.
48 
49 The name of Fraunhofer may not be used to endorse or promote products derived
50 from this library without prior written permission.
51 
52 You may not charge copyright license fees for anyone to use, copy or distribute
53 the FDK AAC Codec software or your modifications thereto.
54 
55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
56 that you changed the software and the date of any change. For modified versions
57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59 AAC Codec Library for Android."
60 
61 3.    NO PATENT LICENSE
62 
63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65 Fraunhofer provides no warranty of patent non-infringement with respect to this
66 software.
67 
68 You may use this FDK AAC Codec software or modifications thereto only for
69 purposes that are authorized by appropriate patent licenses.
70 
71 4.    DISCLAIMER
72 
73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75 including but not limited to the implied warranties of merchantability and
76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78 or consequential damages, including but not limited to procurement of substitute
79 goods or services; loss of use, data, or profits, or business interruption,
80 however caused and on any theory of liability, whether in contract, strict
81 liability, or tort (including negligence), arising in any way out of the use of
82 this software, even if advised of the possibility of such damage.
83 
84 5.    CONTACT INFORMATION
85 
86 Fraunhofer Institute for Integrated Circuits IIS
87 Attention: Audio and Multimedia Departments - FDK AAC LL
88 Am Wolfsmantel 33
89 91058 Erlangen, Germany
90 
91 www.iis.fraunhofer.de/amm
92 amm-info@iis.fraunhofer.de
93 ----------------------------------------------------------------------------- */
94 
95 /**************************** AAC decoder library ******************************
96 
97    Author(s):   Matthias Hildenbrand
98 
99    Description: USAC ACELP frame decoder
100 
101 *******************************************************************************/
102 
103 #include "usacdec_acelp.h"
104 
105 #include "usacdec_ace_d4t64.h"
106 #include "usacdec_ace_ltp.h"
107 #include "usacdec_rom.h"
108 #include "usacdec_lpc.h"
109 #include "genericStds.h"
110 
111 #define PIT_FR2_12k8 128 /* Minimum pitch lag with resolution 1/2      */
112 #define PIT_FR1_12k8 160 /* Minimum pitch lag with resolution 1        */
113 #define TILT_CODE2 \
114   FL2FXCONST_SGL(0.3f * 2.0f) /* ACELP code pre-emphasis factor ( *2 )      */
115 #define PIT_SHARP \
116   FL2FXCONST_SGL(0.85f) /* pitch sharpening factor                    */
117 #define PREEMPH_FAC \
118   FL2FXCONST_SGL(0.68f) /* ACELP synth pre-emphasis factor            */
119 
120 #define ACELP_HEADROOM 1
121 #define ACELP_OUTSCALE (MDCT_OUT_HEADROOM - ACELP_HEADROOM)
122 
123 /**
124  * \brief Calculate pre-emphasis (1 - mu z^-1) on input signal.
125  * \param[in] in pointer to input signal; in[-1] is also needed.
126  * \param[out] out pointer to output signal.
127  * \param[in] L length of filtering.
128  */
129 /* static */
E_UTIL_preemph(const FIXP_DBL * in,FIXP_DBL * out,INT L)130 void E_UTIL_preemph(const FIXP_DBL *in, FIXP_DBL *out, INT L) {
131   int i;
132 
133   for (i = 0; i < L; i++) {
134     out[i] = fAddSaturate(in[i], -fMult(PREEMPH_FAC, in[i - 1]));
135   }
136 
137   return;
138 }
139 
140 /**
141  * \brief Calculate de-emphasis 1/(1 - TILT_CODE z^-1) on innovative codebook
142  * vector.
143  * \param[in,out] x innovative codebook vector.
144  */
Preemph_code(FIXP_COD x[])145 static void Preemph_code(
146     FIXP_COD x[] /* (i/o)   : input signal overwritten by the output */
147 ) {
148   int i;
149   FIXP_DBL L_tmp;
150 
151   /* ARM926: 12 cycles per sample */
152   for (i = L_SUBFR - 1; i > 0; i--) {
153     L_tmp = FX_COD2FX_DBL(x[i]);
154     L_tmp -= fMultDiv2(x[i - 1], TILT_CODE2);
155     x[i] = FX_DBL2FX_COD(L_tmp);
156   }
157 }
158 
159 /**
160  * \brief Apply pitch sharpener to the innovative codebook vector.
161  * \param[in,out] x innovative codebook vector.
162  * \param[in] pit_lag decoded pitch lag.
163  */
Pit_shrp(FIXP_COD x[],int pit_lag)164 static void Pit_shrp(
165     FIXP_COD x[], /* in/out: impulse response (or algebraic code) */
166     int pit_lag   /* input : pitch lag                            */
167 ) {
168   int i;
169   FIXP_DBL L_tmp;
170 
171   for (i = pit_lag; i < L_SUBFR; i++) {
172     L_tmp = FX_COD2FX_DBL(x[i]);
173     L_tmp += fMult(x[i - pit_lag], PIT_SHARP);
174     x[i] = FX_DBL2FX_COD(L_tmp);
175   }
176 
177   return;
178 }
179 
180   /**
181    * \brief Calculate Quantized codebook gain, Quantized pitch gain and unbiased
182    *        Innovative code vector energy.
183    * \param[in] index index of quantizer.
184    * \param[in] code innovative code vector with exponent = SF_CODE.
185    * \param[out] gain_pit Quantized pitch gain g_p with exponent = SF_GAIN_P.
186    * \param[out] gain_code Quantized codebook gain g_c.
187    * \param[in] mean_ener mean_ener defined in open-loop (2 bits), exponent = 7.
188    * \param[out] E_code unbiased innovative code vector energy.
189    * \param[out] E_code_e exponent of unbiased innovative code vector energy.
190    */
191 
192 #define SF_MEAN_ENER_LG10 9
193 
194 /* pow(10.0, {18, 30, 42, 54}/20.0) /(float)(1<<SF_MEAN_ENER_LG10) */
195 static const FIXP_DBL pow_10_mean_energy[4] = {0x01fc5ebd, 0x07e7db92,
196                                                0x1f791f65, 0x7d4bfba3};
197 
D_gain2_plus(int index,FIXP_COD code[],FIXP_SGL * gain_pit,FIXP_DBL * gain_code,int mean_ener_bits,int bfi,FIXP_SGL * past_gpit,FIXP_DBL * past_gcode,FIXP_DBL * pEner_code,int * pEner_code_e)198 static void D_gain2_plus(int index, FIXP_COD code[], FIXP_SGL *gain_pit,
199                          FIXP_DBL *gain_code, int mean_ener_bits, int bfi,
200                          FIXP_SGL *past_gpit, FIXP_DBL *past_gcode,
201                          FIXP_DBL *pEner_code, int *pEner_code_e) {
202   FIXP_DBL Ltmp;
203   FIXP_DBL gcode0, gcode_inov;
204   INT gcode0_e, gcode_inov_e;
205   int i;
206 
207   FIXP_DBL ener_code;
208   INT ener_code_e;
209 
210   /* ener_code = sum(code[]^2) */
211   ener_code = FIXP_DBL(0);
212   for (i = 0; i < L_SUBFR; i++) {
213     ener_code += fPow2Div2(code[i]);
214   }
215 
216   ener_code_e = fMax(fNorm(ener_code) - 1, 0);
217   ener_code <<= ener_code_e;
218   ener_code_e = 2 * SF_CODE + 1 - ener_code_e;
219 
220   /* export energy of code for calc_period_factor() */
221   *pEner_code = ener_code;
222   *pEner_code_e = ener_code_e;
223 
224   ener_code += scaleValue(FL2FXCONST_DBL(0.01f), -ener_code_e);
225 
226   /* ener_code *= 1/L_SUBFR, and make exponent even (because of square root
227    * below). */
228   if (ener_code_e & 1) {
229     ener_code_e -= 5;
230     ener_code >>= 1;
231   } else {
232     ener_code_e -= 6;
233   }
234   gcode_inov = invSqrtNorm2(ener_code, &gcode0_e);
235   gcode_inov_e = gcode0_e - (ener_code_e >> 1);
236 
237   if (bfi) {
238     FIXP_DBL tgcode;
239     FIXP_SGL tgpit;
240 
241     tgpit = *past_gpit;
242 
243     if (tgpit > FL2FXCONST_SGL(0.95f / (1 << SF_GAIN_P))) {
244       tgpit = FL2FXCONST_SGL(0.95f / (1 << SF_GAIN_P));
245     } else if (tgpit < FL2FXCONST_SGL(0.5f / (1 << SF_GAIN_P))) {
246       tgpit = FL2FXCONST_SGL(0.5f / (1 << SF_GAIN_P));
247     }
248     *gain_pit = tgpit;
249     tgpit = FX_DBL2FX_SGL(fMult(tgpit, FL2FXCONST_DBL(0.95f)));
250     *past_gpit = tgpit;
251 
252     tgpit = FL2FXCONST_SGL(1.4f / (1 << SF_GAIN_P)) - tgpit;
253     tgcode = fMult(*past_gcode, tgpit) << SF_GAIN_P;
254     *gain_code = scaleValue(fMult(tgcode, gcode_inov), gcode_inov_e);
255     *past_gcode = tgcode;
256 
257     return;
258   }
259 
260   /*-------------- Decode gains ---------------*/
261   /*
262    gcode0 = pow(10.0, (float)mean_ener/20.0);
263    gcode0 = gcode0 / sqrt(ener_code/L_SUBFR);
264    */
265   gcode0 = pow_10_mean_energy[mean_ener_bits];
266   gcode0 = fMultDiv2(gcode0, gcode_inov);
267   gcode0_e = gcode0_e + SF_MEAN_ENER_LG10 - (ener_code_e >> 1) + 1;
268 
269   i = index << 1;
270   *gain_pit = t_qua_gain7b[i]; /* adaptive codebook gain */
271   /* t_qua_gain[ind2p1] : fixed codebook gain correction factor */
272   Ltmp = fMult(t_qua_gain7b[i + 1], gcode0);
273   *gain_code = scaleValue(Ltmp, gcode0_e - SF_GAIN_C + SF_QUA_GAIN7B);
274 
275   /* update bad frame handler */
276   *past_gpit = *gain_pit;
277 
278   /*--------------------------------------------------------
279     past_gcode  = gain_code/gcode_inov
280    --------------------------------------------------------*/
281   {
282     FIXP_DBL gcode_m;
283     INT gcode_e;
284 
285     gcode_m = fDivNormHighPrec(Ltmp, gcode_inov, &gcode_e);
286     gcode_e += (gcode0_e - SF_GAIN_C + SF_QUA_GAIN7B) - (gcode_inov_e);
287     *past_gcode = scaleValue(gcode_m, gcode_e);
288   }
289 }
290 
291 /**
292  * \brief Calculate period/voicing factor r_v
293  * \param[in] exc pitch excitation.
294  * \param[in] gain_pit gain of pitch g_p.
295  * \param[in] gain_code gain of code g_c.
296  * \param[in] gain_code_e exponent of gain of code.
297  * \param[in] ener_code unbiased innovative code vector energy.
298  * \param[in] ener_code_e exponent of unbiased innovative code vector energy.
299  * \return period/voice factor r_v (-1=unvoiced to 1=voiced), exponent SF_PFAC.
300  */
calc_period_factor(FIXP_DBL exc[],FIXP_SGL gain_pit,FIXP_DBL gain_code,FIXP_DBL ener_code,int ener_code_e)301 static FIXP_DBL calc_period_factor(FIXP_DBL exc[], FIXP_SGL gain_pit,
302                                    FIXP_DBL gain_code, FIXP_DBL ener_code,
303                                    int ener_code_e) {
304   int ener_exc_e, L_tmp_e, s = 0;
305   FIXP_DBL ener_exc, L_tmp;
306   FIXP_DBL period_fac;
307 
308   /* energy of pitch excitation */
309   ener_exc = (FIXP_DBL)0;
310   for (int i = 0; i < L_SUBFR; i++) {
311     ener_exc += fPow2Div2(exc[i]) >> s;
312     if (ener_exc >= FL2FXCONST_DBL(0.5f)) {
313       ener_exc >>= 1;
314       s++;
315     }
316   }
317 
318   ener_exc_e = fNorm(ener_exc);
319   ener_exc = fMult(ener_exc << ener_exc_e, fPow2(gain_pit));
320   if (ener_exc != (FIXP_DBL)0) {
321     ener_exc_e = 2 * SF_EXC + 1 + 2 * SF_GAIN_P - ener_exc_e + s;
322   } else {
323     ener_exc_e = 0;
324   }
325 
326   /* energy of innovative code excitation */
327   /* L_tmp = ener_code * gain_code*gain_code; */
328   L_tmp_e = fNorm(gain_code);
329   L_tmp = fPow2(gain_code << L_tmp_e);
330   L_tmp = fMult(ener_code, L_tmp);
331   L_tmp_e = 2 * SF_GAIN_C + ener_code_e - 2 * L_tmp_e;
332 
333   /* Find common exponent */
334   {
335     FIXP_DBL num, den;
336     int exp_diff;
337 
338     exp_diff = ener_exc_e - L_tmp_e;
339     if (exp_diff >= 0) {
340       ener_exc >>= 1;
341       if (exp_diff <= DFRACT_BITS - 2) {
342         L_tmp >>= exp_diff + 1;
343       } else {
344         L_tmp = (FIXP_DBL)0;
345       }
346       den = ener_exc + L_tmp;
347       if (ener_exc_e < DFRACT_BITS - 1) {
348         den += scaleValue(FL2FXCONST_DBL(0.01f), -ener_exc_e - 1);
349       }
350     } else {
351       if (exp_diff >= -(DFRACT_BITS - 2)) {
352         ener_exc >>= 1 - exp_diff;
353       } else {
354         ener_exc = (FIXP_DBL)0;
355       }
356       L_tmp >>= 1;
357       den = ener_exc + L_tmp;
358       if (L_tmp_e < DFRACT_BITS - 1) {
359         den += scaleValue(FL2FXCONST_DBL(0.01f), -L_tmp_e - 1);
360       }
361     }
362     num = (ener_exc - L_tmp);
363     num >>= SF_PFAC;
364 
365     if (den > (FIXP_DBL)0) {
366       if (ener_exc > L_tmp) {
367         period_fac = schur_div(num, den, 16);
368       } else {
369         period_fac = -schur_div(-num, den, 16);
370       }
371     } else {
372       period_fac = (FIXP_DBL)MAXVAL_DBL;
373     }
374   }
375 
376   /* exponent = SF_PFAC */
377   return period_fac;
378 }
379 
380 /*------------------------------------------------------------*
381  * noise enhancer                                             *
382  * ~~~~~~~~~~~~~~                                             *
383  * - Enhance excitation on noise. (modify gain of code)       *
384  *   If signal is noisy and LPC filter is stable, move gain   *
385  *   of code 1.5 dB toward gain of code threshold.            *
386  *   This decrease by 3 dB noise energy variation.            *
387  *------------------------------------------------------------*/
388 /**
389  * \brief Enhance excitation on noise. (modify gain of code)
390  * \param[in] gain_code Quantized codebook gain g_c, exponent = SF_GAIN_C.
391  * \param[in] period_fac periodicity factor, exponent = SF_PFAC.
392  * \param[in] stab_fac stability factor, exponent = SF_STAB.
393  * \param[in,out] p_gc_threshold modified gain of previous subframe.
394  * \return gain_code smoothed gain of code g_sc, exponent = SF_GAIN_C.
395  */
396 static FIXP_DBL
noise_enhancer(FIXP_DBL gain_code,FIXP_DBL period_fac,FIXP_SGL stab_fac,FIXP_DBL * p_gc_threshold)397 noise_enhancer(/* (o) : smoothed gain g_sc                     SF_GAIN_C */
398                FIXP_DBL gain_code, /* (i) : Quantized codebook gain SF_GAIN_C */
399                FIXP_DBL period_fac, /* (i) : periodicity factor (-1=unvoiced to
400                                        1=voiced), SF_PFAC */
401                FIXP_SGL stab_fac,   /* (i) : stability factor (0 <= ... < 1.0)
402                                        SF_STAB   */
403                FIXP_DBL
404                    *p_gc_threshold) /* (io): gain of code threshold SF_GAIN_C */
405 {
406   FIXP_DBL fac, L_tmp, gc_thres;
407 
408   gc_thres = *p_gc_threshold;
409 
410   L_tmp = gain_code;
411   if (L_tmp < gc_thres) {
412     L_tmp += fMultDiv2(gain_code,
413                        FL2FXCONST_SGL(2.0 * 0.19f)); /* +1.5dB => *(1.0+0.19) */
414     if (L_tmp > gc_thres) {
415       L_tmp = gc_thres;
416     }
417   } else {
418     L_tmp = fMult(gain_code,
419                   FL2FXCONST_SGL(1.0f / 1.19f)); /* -1.5dB => *10^(-1.5/20) */
420     if (L_tmp < gc_thres) {
421       L_tmp = gc_thres;
422     }
423   }
424   *p_gc_threshold = L_tmp;
425 
426   /* voicing factor     lambda = 0.5*(1-period_fac) */
427   /* gain smoothing factor S_m = lambda*stab_fac  (=fac)
428                                = 0.5(stab_fac - stab_fac * period_fac) */
429   fac = (FX_SGL2FX_DBL(stab_fac) >> (SF_PFAC + 1)) -
430         fMultDiv2(stab_fac, period_fac);
431   /* fac_e = SF_PFAC + SF_STAB */
432   FDK_ASSERT(fac >= (FIXP_DBL)0);
433 
434   /* gain_code = (float)((fac*tmp) + ((1.0-fac)*gain_code)); */
435   gain_code = fMult(fac, L_tmp) -
436               fMult(FL2FXCONST_DBL(-1.0f / (1 << (SF_PFAC + SF_STAB))) + fac,
437                     gain_code);
438   gain_code <<= (SF_PFAC + SF_STAB);
439 
440   return gain_code;
441 }
442 
443 /**
444  * \brief Update adaptive codebook u'(n) (exc)
445  *        Enhance pitch of c(n) and build post-processed excitation u(n) (exc2)
446  * \param[in] code innovative codevector c(n), exponent = SF_CODE.
447  * \param[in,out] exc filtered adaptive codebook v(n), exponent = SF_EXC.
448  * \param[in] gain_pit adaptive codebook gain, exponent = SF_GAIN_P.
449  * \param[in] gain_code innovative codebook gain g_c, exponent = SF_GAIN_C.
450  * \param[in] gain_code_smoothed smoothed innov. codebook gain g_sc, exponent =
451  * SF_GAIN_C.
452  * \param[in] period_fac periodicity factor r_v, exponent = SF_PFAC.
453  * \param[out] exc2 post-processed excitation u(n), exponent = SF_EXC.
454  */
BuildAdaptiveExcitation(FIXP_COD code[],FIXP_DBL exc[],FIXP_SGL gain_pit,FIXP_DBL gain_code,FIXP_DBL gain_code_smoothed,FIXP_DBL period_fac,FIXP_DBL exc2[])455 void BuildAdaptiveExcitation(
456     FIXP_COD code[],    /* (i) : algebraic codevector c(n)             Q9  */
457     FIXP_DBL exc[],     /* (io): filtered adaptive codebook v(n)       Q15 */
458     FIXP_SGL gain_pit,  /* (i) : adaptive codebook gain g_p            Q14 */
459     FIXP_DBL gain_code, /* (i) : innovative codebook gain g_c          Q16 */
460     FIXP_DBL gain_code_smoothed, /* (i) : smoothed innov. codebook gain g_sc
461                                     Q16 */
462     FIXP_DBL period_fac, /* (i) : periodicity factor r_v                Q15 */
463     FIXP_DBL exc2[]      /* (o) : post-processed excitation u(n)        Q15 */
464 ) {
465 /* Note: code[L_SUBFR] and exc2[L_SUBFR] share the same memory!
466          If exc2[i] is written, code[i] will be destroyed!
467 */
468 #define SF_HEADROOM (1)
469 #define SF (SF_CODE + SF_GAIN_C + 1 - SF_EXC - SF_HEADROOM)
470 #define SF_GAIN_P2 (SF_GAIN_P - SF_HEADROOM)
471 
472   int i;
473   FIXP_DBL tmp, cpe, code_smooth_prev, code_smooth;
474 
475   FIXP_COD code_i;
476   FIXP_DBL cpe_code_smooth, cpe_code_smooth_prev;
477 
478   /* cpe = (1+r_v)/8 * 2 ; ( SF = -1) */
479   cpe = (period_fac >> (2 - SF_PFAC)) + FL2FXCONST_DBL(0.25f);
480 
481   /* u'(n) */
482   tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1); /* v(0)*g_p */
483   *exc++ = (tmp + (fMultDiv2(code[0], gain_code) << SF)) << SF_HEADROOM;
484 
485   /* u(n) */
486   code_smooth_prev = fMultDiv2(*code++, gain_code_smoothed)
487                      << SF; /* c(0) * g_sc */
488   code_i = *code++;
489   code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF; /* c(1) * g_sc */
490   tmp += code_smooth_prev; /* tmp = v(0)*g_p + c(0)*g_sc */
491   cpe_code_smooth = fMultDiv2(cpe, code_smooth);
492   *exc2++ = (tmp - cpe_code_smooth) << SF_HEADROOM;
493   cpe_code_smooth_prev = fMultDiv2(cpe, code_smooth_prev);
494 
495   i = L_SUBFR - 2;
496   do /* ARM926: 22 cycles per iteration */
497   {
498     /* u'(n) */
499     tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1);
500     *exc++ = (tmp + (fMultDiv2(code_i, gain_code) << SF)) << SF_HEADROOM;
501     /* u(n) */
502     tmp += code_smooth; /* += g_sc * c(i) */
503     tmp -= cpe_code_smooth_prev;
504     cpe_code_smooth_prev = cpe_code_smooth;
505     code_i = *code++;
506     code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF;
507     cpe_code_smooth = fMultDiv2(cpe, code_smooth);
508     *exc2++ = (tmp - cpe_code_smooth)
509               << SF_HEADROOM; /* tmp - c_pe * g_sc * c(i+1) */
510   } while (--i != 0);
511 
512   /* u'(n) */
513   tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1);
514   *exc = (tmp + (fMultDiv2(code_i, gain_code) << SF)) << SF_HEADROOM;
515   /* u(n) */
516   tmp += code_smooth;
517   tmp -= cpe_code_smooth_prev;
518   *exc2++ = tmp << SF_HEADROOM;
519 
520   return;
521 }
522 
523 /**
524  * \brief Interpolate LPC vector in LSP domain for current subframe and convert
525  * to LP domain
526  * \param[in] lsp_old LPC vector (LSP domain) corresponding to the beginning of
527  * current ACELP frame.
528  * \param[in] lsp_new LPC vector (LSP domain) corresponding to the end of
529  * current ACELP frame.
530  * \param[in] subfr_nr number of current ACELP subframe 0..3.
531  * \param[in] nb_subfr total number of ACELP subframes in this frame.
532  * \param[out] A LP filter coefficients for current ACELP subframe, exponent =
533  * SF_A_COEFFS.
534  */
535 /* static */
int_lpc_acelp(const FIXP_LPC lsp_old[],const FIXP_LPC lsp_new[],int subfr_nr,int nb_subfr,FIXP_LPC A[],INT * A_exp)536 void int_lpc_acelp(
537     const FIXP_LPC lsp_old[], /* input : LSPs from past frame              */
538     const FIXP_LPC lsp_new[], /* input : LSPs from present frame           */
539     int subfr_nr, int nb_subfr,
540     FIXP_LPC
541         A[], /* output: interpolated LP coefficients for current subframe */
542     INT *A_exp) {
543   int i;
544   FIXP_LPC lsp_interpol[M_LP_FILTER_ORDER];
545   FIXP_SGL fac_old, fac_new;
546 
547   FDK_ASSERT((nb_subfr == 3) || (nb_subfr == 4));
548 
549   fac_old = lsp_interpol_factor[nb_subfr & 0x1][(nb_subfr - 1) - subfr_nr];
550   fac_new = lsp_interpol_factor[nb_subfr & 0x1][subfr_nr];
551   for (i = 0; i < M_LP_FILTER_ORDER; i++) {
552     lsp_interpol[i] = FX_DBL2FX_LPC(
553         (fMultDiv2(lsp_old[i], fac_old) + fMultDiv2(lsp_new[i], fac_new)) << 1);
554   }
555 
556   E_LPC_f_lsp_a_conversion(lsp_interpol, A, A_exp);
557 
558   return;
559 }
560 
561 /**
562  * \brief Perform LP synthesis by filtering the post-processed excitation u(n)
563  *        through the LP synthesis filter 1/A(z)
564  * \param[in] a LP filter coefficients, exponent = SF_A_COEFFS.
565  * \param[in] length length of input/output signal.
566  * \param[in] x post-processed excitation u(n).
567  * \param[in,out] y LP synthesis signal and filter memory
568  * y[-M_LP_FILTER_ORDER..-1].
569  */
570 
571 /* static */
Syn_filt(const FIXP_LPC a[],const INT a_exp,INT length,FIXP_DBL x[],FIXP_DBL y[])572 void Syn_filt(const FIXP_LPC a[], /* (i) : a[m] prediction coefficients Q12 */
573               const INT a_exp,
574               INT length,   /* (i) : length of input/output signal (64|128)   */
575               FIXP_DBL x[], /* (i) : input signal Qx  */
576               FIXP_DBL y[]  /* (i/o) : filter states / output signal  Qx-s*/
577 ) {
578   int i, j;
579   FIXP_DBL L_tmp;
580 
581   for (i = 0; i < length; i++) {
582     L_tmp = (FIXP_DBL)0;
583 
584     for (j = 0; j < M_LP_FILTER_ORDER; j++) {
585       L_tmp -= fMultDiv2(a[j], y[i - (j + 1)]) >> (LP_FILTER_SCALE - 1);
586     }
587 
588     L_tmp = scaleValue(L_tmp, a_exp + LP_FILTER_SCALE);
589     y[i] = fAddSaturate(L_tmp, x[i]);
590   }
591 
592   return;
593 }
594 
595 /**
596  * \brief Calculate de-emphasis 1/(1 - mu z^-1) on input signal.
597  * \param[in] x input signal.
598  * \param[out] y output signal.
599  * \param[in] L length of signal.
600  * \param[in,out] mem memory (signal[-1]).
601  */
602 /* static */
Deemph(FIXP_DBL * x,FIXP_DBL * y,int L,FIXP_DBL * mem)603 void Deemph(FIXP_DBL *x, FIXP_DBL *y, int L, FIXP_DBL *mem) {
604   int i;
605   FIXP_DBL yi = *mem;
606 
607   for (i = 0; i < L; i++) {
608     FIXP_DBL xi = x[i] >> 1;
609     xi = fMultAddDiv2(xi, PREEMPH_FAC, yi);
610     yi = SATURATE_LEFT_SHIFT(xi, 1, 32);
611     y[i] = yi;
612   }
613   *mem = yi;
614   return;
615 }
616 
617 /**
618  * \brief Compute the LP residual by filtering the input speech through the
619  * analysis filter A(z).
620  * \param[in] a LP filter coefficients, exponent = SF_A_COEFFS
621  * \param[in] x input signal (note that values x[-m..-1] are needed), exponent =
622  * SF_SYNTH
623  * \param[out] y output signal (residual), exponent = SF_EXC
624  * \param[in] l length of filtering
625  */
626 /* static */
E_UTIL_residu(const FIXP_LPC * a,const INT a_exp,FIXP_DBL * x,FIXP_DBL * y,INT l)627 void E_UTIL_residu(const FIXP_LPC *a, const INT a_exp, FIXP_DBL *x, FIXP_DBL *y,
628                    INT l) {
629   FIXP_DBL s;
630   INT i, j;
631 
632   /* (note that values x[-m..-1] are needed) */
633   for (i = 0; i < l; i++) {
634     s = (FIXP_DBL)0;
635 
636     for (j = 0; j < M_LP_FILTER_ORDER; j++) {
637       s += fMultDiv2(a[j], x[i - j - 1]) >> (LP_FILTER_SCALE - 1);
638     }
639 
640     s = scaleValue(s, a_exp + LP_FILTER_SCALE);
641     y[i] = fAddSaturate(s, x[i]);
642   }
643 
644   return;
645 }
646 
647 /* use to map subfr number to number of bits used for acb_index */
648 static const UCHAR num_acb_idx_bits_table[2][NB_SUBFR] = {
649     {9, 6, 9, 6}, /* coreCoderFrameLength == 1024 */
650     {9, 6, 6, 0}  /* coreCoderFrameLength == 768  */
651 };
652 
DecodePitchLag(HANDLE_FDK_BITSTREAM hBs,const UCHAR num_acb_idx_bits,const int PIT_MIN,const int PIT_FR2,const int PIT_FR1,const int PIT_MAX,int * pT0,int * pT0_frac,int * pT0_min,int * pT0_max)653 static int DecodePitchLag(HANDLE_FDK_BITSTREAM hBs,
654                           const UCHAR num_acb_idx_bits,
655                           const int PIT_MIN, /* TMIN */
656                           const int PIT_FR2, /* TFR2 */
657                           const int PIT_FR1, /* TFR1 */
658                           const int PIT_MAX, /* TMAX */
659                           int *pT0, int *pT0_frac, int *pT0_min, int *pT0_max) {
660   int acb_idx;
661   int error = 0;
662   int T0, T0_frac;
663 
664   FDK_ASSERT((num_acb_idx_bits == 9) || (num_acb_idx_bits == 6));
665 
666   acb_idx = FDKreadBits(hBs, num_acb_idx_bits);
667 
668   if (num_acb_idx_bits == 6) {
669     /* When the pitch value is encoded on 6 bits, a pitch resolution of 1/4 is
670        always used in the range [T1-8, T1+7.75], where T1 is nearest integer to
671        the fractional pitch lag of the previous subframe.
672     */
673     T0 = *pT0_min + acb_idx / 4;
674     T0_frac = acb_idx & 0x3;
675   } else { /* num_acb_idx_bits == 9 */
676     /* When the pitch value is encoded on 9 bits, a fractional pitch delay is
677        used with resolutions 0.25 in the range [TMIN, TFR2-0.25], resolutions
678        0.5 in the range [TFR2, TFR1-0.5], and integers only in the range [TFR1,
679        TMAX]. NOTE: for small sampling rates TMAX can get smaller than TFR1.
680     */
681     int T0_min, T0_max;
682 
683     if (acb_idx < (PIT_FR2 - PIT_MIN) * 4) {
684       /* first interval with 0.25 pitch resolution */
685       T0 = PIT_MIN + (acb_idx / 4);
686       T0_frac = acb_idx & 0x3;
687     } else if (acb_idx < ((PIT_FR2 - PIT_MIN) * 4 + (PIT_FR1 - PIT_FR2) * 2)) {
688       /* second interval with 0.5 pitch resolution */
689       acb_idx -= (PIT_FR2 - PIT_MIN) * 4;
690       T0 = PIT_FR2 + (acb_idx / 2);
691       T0_frac = (acb_idx & 0x1) * 2;
692     } else {
693       /* third interval with 1.0 pitch resolution */
694       T0 = acb_idx + PIT_FR1 - ((PIT_FR2 - PIT_MIN) * 4) -
695            ((PIT_FR1 - PIT_FR2) * 2);
696       T0_frac = 0;
697     }
698     /* find T0_min and T0_max for subframe 1 or 3 */
699     T0_min = T0 - 8;
700     if (T0_min < PIT_MIN) {
701       T0_min = PIT_MIN;
702     }
703     T0_max = T0_min + 15;
704     if (T0_max > PIT_MAX) {
705       T0_max = PIT_MAX;
706       T0_min = T0_max - 15;
707     }
708     *pT0_min = T0_min;
709     *pT0_max = T0_max;
710   }
711   *pT0 = T0;
712   *pT0_frac = T0_frac;
713 
714   return error;
715 }
ConcealPitchLag(CAcelpStaticMem * acelp_mem,const int PIT_MAX,int * pT0,int * pT0_frac)716 static void ConcealPitchLag(CAcelpStaticMem *acelp_mem, const int PIT_MAX,
717                             int *pT0, int *pT0_frac) {
718   USHORT *pold_T0 = &acelp_mem->old_T0;
719   UCHAR *pold_T0_frac = &acelp_mem->old_T0_frac;
720 
721   if ((int)*pold_T0 >= PIT_MAX) {
722     *pold_T0 = (USHORT)(PIT_MAX - 5);
723   }
724   *pT0 = (int)*pold_T0;
725   *pT0_frac = (int)*pold_T0_frac;
726 }
727 
728 static UCHAR tab_coremode2nbits[8] = {20, 28, 36, 44, 52, 64, 12, 16};
729 
MapCoreMode2NBits(int core_mode)730 static int MapCoreMode2NBits(int core_mode) {
731   return (int)tab_coremode2nbits[core_mode];
732 }
733 
CLpd_AcelpDecode(CAcelpStaticMem * acelp_mem,INT i_offset,const FIXP_LPC lsp_old[M_LP_FILTER_ORDER],const FIXP_LPC lsp_new[M_LP_FILTER_ORDER],FIXP_SGL stab_fac,CAcelpChannelData * pAcelpData,INT numLostSubframes,int lastLpcLost,int frameCnt,FIXP_DBL synth[],int pT[],FIXP_DBL * pit_gain,INT coreCoderFrameLength)734 void CLpd_AcelpDecode(CAcelpStaticMem *acelp_mem, INT i_offset,
735                       const FIXP_LPC lsp_old[M_LP_FILTER_ORDER],
736                       const FIXP_LPC lsp_new[M_LP_FILTER_ORDER],
737                       FIXP_SGL stab_fac, CAcelpChannelData *pAcelpData,
738                       INT numLostSubframes, int lastLpcLost, int frameCnt,
739                       FIXP_DBL synth[], int pT[], FIXP_DBL *pit_gain,
740                       INT coreCoderFrameLength) {
741   int i_subfr, subfr_nr, l_div, T;
742   int T0 = -1, T0_frac = -1; /* mark invalid */
743 
744   int pit_gain_index = 0;
745 
746   const int PIT_MAX = PIT_MAX_12k8 + (6 * i_offset); /* maximum pitch lag */
747 
748   FIXP_COD *code;
749   FIXP_DBL *exc2;
750   FIXP_DBL *syn;
751   FIXP_DBL *exc;
752   FIXP_LPC A[M_LP_FILTER_ORDER];
753   INT A_exp;
754 
755   FIXP_DBL period_fac;
756   FIXP_SGL gain_pit;
757   FIXP_DBL gain_code, gain_code_smooth, Ener_code;
758   int Ener_code_e;
759   int n;
760   int bfi = (numLostSubframes > 0) ? 1 : 0;
761 
762   C_ALLOC_SCRATCH_START(
763       exc_buf, FIXP_DBL,
764       PIT_MAX_MAX + L_INTERPOL + L_DIV + 1); /* 411 + 17 + 256 + 1 = 685 */
765   C_ALLOC_SCRATCH_START(syn_buf, FIXP_DBL,
766                         M_LP_FILTER_ORDER + L_DIV); /* 16 + 256 = 272 */
767   /* use same memory for code[L_SUBFR] and exc2[L_SUBFR] */
768   C_ALLOC_SCRATCH_START(tmp_buf, FIXP_DBL, L_SUBFR); /* 64 */
769   /* make sure they don't overlap if they are accessed alternatingly in
770    * BuildAdaptiveExcitation() */
771 #if (COD_BITS == FRACT_BITS)
772   code = (FIXP_COD *)(tmp_buf + L_SUBFR / 2);
773 #elif (COD_BITS == DFRACT_BITS)
774   code = (FIXP_COD *)tmp_buf;
775 #endif
776   exc2 = (FIXP_DBL *)tmp_buf;
777 
778   syn = syn_buf + M_LP_FILTER_ORDER;
779   exc = exc_buf + PIT_MAX_MAX + L_INTERPOL;
780 
781   FDKmemcpy(syn_buf, acelp_mem->old_syn_mem,
782             M_LP_FILTER_ORDER * sizeof(FIXP_DBL));
783   FDKmemcpy(exc_buf, acelp_mem->old_exc_mem,
784             (PIT_MAX_MAX + L_INTERPOL) * sizeof(FIXP_DBL));
785 
786   FDKmemclear(exc_buf + (PIT_MAX_MAX + L_INTERPOL),
787               (L_DIV + 1) * sizeof(FIXP_DBL));
788 
789   l_div = coreCoderFrameLength / NB_DIV;
790 
791   for (i_subfr = 0, subfr_nr = 0; i_subfr < l_div;
792        i_subfr += L_SUBFR, subfr_nr++) {
793     /*-------------------------------------------------*
794      * - Decode pitch lag (T0 and T0_frac)             *
795      *-------------------------------------------------*/
796     if (bfi) {
797       ConcealPitchLag(acelp_mem, PIT_MAX, &T0, &T0_frac);
798     } else {
799       T0 = (int)pAcelpData->T0[subfr_nr];
800       T0_frac = (int)pAcelpData->T0_frac[subfr_nr];
801     }
802 
803     /*-------------------------------------------------*
804      * - Find the pitch gain, the interpolation filter *
805      *   and the adaptive codebook vector.             *
806      *-------------------------------------------------*/
807     Pred_lt4(&exc[i_subfr], T0, T0_frac);
808 
809     if ((!bfi && pAcelpData->ltp_filtering_flag[subfr_nr] == 0) ||
810         (bfi && numLostSubframes == 1 && stab_fac < FL2FXCONST_SGL(0.25f))) {
811       /* find pitch excitation with lp filter: v'(n) => v(n) */
812       Pred_lt4_postfilter(&exc[i_subfr]);
813     }
814 
815     /*-------------------------------------------------------*
816      * - Decode innovative codebook.                         *
817      * - Add the fixed-gain pitch contribution to code[].    *
818      *-------------------------------------------------------*/
819     if (bfi) {
820       for (n = 0; n < L_SUBFR; n++) {
821         code[n] =
822             FX_SGL2FX_COD((FIXP_SGL)E_UTIL_random(&acelp_mem->seed_ace)) >> 4;
823       }
824     } else {
825       int nbits = MapCoreMode2NBits((int)pAcelpData->acelp_core_mode);
826       D_ACELP_decode_4t64(pAcelpData->icb_index[subfr_nr], nbits, &code[0]);
827     }
828 
829     T = T0;
830     if (T0_frac > 2) {
831       T += 1;
832     }
833 
834     Preemph_code(code);
835     Pit_shrp(code, T);
836 
837     /* Output pitch lag for bass post-filter */
838     if (T > PIT_MAX) {
839       pT[subfr_nr] = PIT_MAX;
840     } else {
841       pT[subfr_nr] = T;
842     }
843     D_gain2_plus(
844         pAcelpData->gains[subfr_nr],
845         code,       /* (i)  : Innovative code vector, exponent = SF_CODE */
846         &gain_pit,  /* (o)  : Quantized pitch gain, exponent = SF_GAIN_P */
847         &gain_code, /* (o)  : Quantized codebook gain                    */
848         pAcelpData
849             ->mean_energy, /* (i)  : mean_ener defined in open-loop (2 bits) */
850         bfi, &acelp_mem->past_gpit, &acelp_mem->past_gcode,
851         &Ener_code,    /* (o)  : Innovative code vector energy              */
852         &Ener_code_e); /* (o)  : Innovative code vector energy exponent     */
853 
854     pit_gain[pit_gain_index++] = FX_SGL2FX_DBL(gain_pit);
855 
856     /* calc periodicity factor r_v */
857     period_fac =
858         calc_period_factor(/* (o) : factor (-1=unvoiced to 1=voiced)    */
859                            &exc[i_subfr], /* (i) : pitch excitation, exponent =
860                                              SF_EXC */
861                            gain_pit,      /* (i) : gain of pitch, exponent =
862                                              SF_GAIN_P */
863                            gain_code,     /* (i) : gain of code     */
864                            Ener_code,     /* (i) : Energy of code[]     */
865                            Ener_code_e);  /* (i) : Exponent of energy of code[]
866                                            */
867 
868     if (lastLpcLost && frameCnt == 0) {
869       if (gain_pit > FL2FXCONST_SGL(1.0f / (1 << SF_GAIN_P))) {
870         gain_pit = FL2FXCONST_SGL(1.0f / (1 << SF_GAIN_P));
871       }
872     }
873 
874     gain_code_smooth =
875         noise_enhancer(/* (o) : smoothed gain g_sc exponent = SF_GAIN_C */
876                        gain_code,  /* (i) : Quantized codebook gain  */
877                        period_fac, /* (i) : periodicity factor (-1=unvoiced to
878                                       1=voiced)  */
879                        stab_fac,   /* (i) : stability factor (0 <= ... < 1),
880                                       exponent = 1 */
881                        &acelp_mem->gc_threshold);
882 
883     /* Compute adaptive codebook update u'(n), pitch enhancement c'(n) and
884      * post-processed excitation u(n). */
885     BuildAdaptiveExcitation(code, exc + i_subfr, gain_pit, gain_code,
886                             gain_code_smooth, period_fac, exc2);
887 
888     /* Interpolate filter coeffs for current subframe in lsp domain and convert
889      * to LP domain */
890     int_lpc_acelp(lsp_old,  /* input : LSPs from past frame              */
891                   lsp_new,  /* input : LSPs from present frame           */
892                   subfr_nr, /* input : ACELP subframe index              */
893                   coreCoderFrameLength / L_DIV,
894                   A, /* output: LP coefficients of this subframe  */
895                   &A_exp);
896 
897     Syn_filt(A, /* (i) : a[m] prediction coefficients               */
898              A_exp, L_SUBFR, /* (i) : length */
899              exc2, /* (i) : input signal                               */
900              &syn[i_subfr] /* (i/o) : filter states / output signal */
901     );
902 
903   } /* end of subframe loop */
904 
905   /* update pitch value for bfi procedure */
906   acelp_mem->old_T0_frac = T0_frac;
907   acelp_mem->old_T0 = T0;
908 
909   /* save old excitation and old synthesis memory for next ACELP frame */
910   FDKmemcpy(acelp_mem->old_exc_mem, exc + l_div - (PIT_MAX_MAX + L_INTERPOL),
911             sizeof(FIXP_DBL) * (PIT_MAX_MAX + L_INTERPOL));
912   FDKmemcpy(acelp_mem->old_syn_mem, syn_buf + l_div,
913             sizeof(FIXP_DBL) * M_LP_FILTER_ORDER);
914 
915   Deemph(syn, synth, l_div,
916          &acelp_mem->de_emph_mem); /* ref soft: mem = synth[-1] */
917 
918   scaleValues(synth, l_div, -ACELP_OUTSCALE);
919   acelp_mem->deemph_mem_wsyn = acelp_mem->de_emph_mem;
920 
921   C_ALLOC_SCRATCH_END(tmp_buf, FIXP_DBL, L_SUBFR);
922   C_ALLOC_SCRATCH_END(syn_buf, FIXP_DBL, M_LP_FILTER_ORDER + L_DIV);
923   C_ALLOC_SCRATCH_END(exc_buf, FIXP_DBL, PIT_MAX_MAX + L_INTERPOL + L_DIV + 1);
924   return;
925 }
926 
CLpd_AcelpReset(CAcelpStaticMem * acelp)927 void CLpd_AcelpReset(CAcelpStaticMem *acelp) {
928   acelp->gc_threshold = (FIXP_DBL)0;
929 
930   acelp->past_gpit = (FIXP_SGL)0;
931   acelp->past_gcode = (FIXP_DBL)0;
932   acelp->old_T0 = 64;
933   acelp->old_T0_frac = 0;
934   acelp->deemph_mem_wsyn = (FIXP_DBL)0;
935   acelp->wsyn_rms = (FIXP_DBL)0;
936   acelp->seed_ace = 0;
937 }
938 
939 /* TCX time domain concealment */
940 /*   Compare to figure 13a on page 54 in 3GPP TS 26.290 */
CLpd_TcxTDConceal(CAcelpStaticMem * acelp_mem,SHORT * pitch,const FIXP_LPC lsp_old[M_LP_FILTER_ORDER],const FIXP_LPC lsp_new[M_LP_FILTER_ORDER],const FIXP_SGL stab_fac,INT nLostSf,FIXP_DBL synth[],INT coreCoderFrameLength,UCHAR last_tcx_noise_factor)941 void CLpd_TcxTDConceal(CAcelpStaticMem *acelp_mem, SHORT *pitch,
942                        const FIXP_LPC lsp_old[M_LP_FILTER_ORDER],
943                        const FIXP_LPC lsp_new[M_LP_FILTER_ORDER],
944                        const FIXP_SGL stab_fac, INT nLostSf, FIXP_DBL synth[],
945                        INT coreCoderFrameLength, UCHAR last_tcx_noise_factor) {
946   /* repeat past excitation with pitch from previous decoded TCX frame */
947   C_ALLOC_SCRATCH_START(
948       exc_buf, FIXP_DBL,
949       PIT_MAX_MAX + L_INTERPOL + L_DIV); /* 411 +  17 + 256 + 1 =  */
950   C_ALLOC_SCRATCH_START(syn_buf, FIXP_DBL,
951                         M_LP_FILTER_ORDER + L_DIV); /* 256 +  16           =  */
952                                                     /*                    +=  */
953   FIXP_DBL ns_buf[L_DIV + 1];
954   FIXP_DBL *syn = syn_buf + M_LP_FILTER_ORDER;
955   FIXP_DBL *exc = exc_buf + PIT_MAX_MAX + L_INTERPOL;
956   FIXP_DBL *ns = ns_buf + 1;
957   FIXP_DBL tmp, fact_exc;
958   INT T = fMin(*pitch, (SHORT)PIT_MAX_MAX);
959   int i, i_subfr, subfr_nr;
960   int lDiv = coreCoderFrameLength / NB_DIV;
961 
962   FDKmemcpy(syn_buf, acelp_mem->old_syn_mem,
963             M_LP_FILTER_ORDER * sizeof(FIXP_DBL));
964   FDKmemcpy(exc_buf, acelp_mem->old_exc_mem,
965             (PIT_MAX_MAX + L_INTERPOL) * sizeof(FIXP_DBL));
966 
967   /* if we lost all packets (i.e. 1 packet of TCX-20 ms, 2 packets of
968      the TCX-40 ms or 4 packets of the TCX-80ms), we lost the whole
969      coded frame extrapolation strategy: repeat lost excitation and
970      use extrapolated LSFs */
971 
972   /* AMR-WB+ like TCX TD concealment */
973 
974   /* number of lost frame cmpt */
975   if (nLostSf < 2) {
976     fact_exc = FL2FXCONST_DBL(0.8f);
977   } else {
978     fact_exc = FL2FXCONST_DBL(0.4f);
979   }
980 
981   /* repeat past excitation */
982   for (i = 0; i < lDiv; i++) {
983     exc[i] = fMult(fact_exc, exc[i - T]);
984   }
985 
986   tmp = fMult(fact_exc, acelp_mem->wsyn_rms);
987   acelp_mem->wsyn_rms = tmp;
988 
989   /* init deemph_mem_wsyn */
990   acelp_mem->deemph_mem_wsyn = exc[-1];
991 
992   ns[-1] = acelp_mem->deemph_mem_wsyn;
993 
994   for (i_subfr = 0, subfr_nr = 0; i_subfr < lDiv;
995        i_subfr += L_SUBFR, subfr_nr++) {
996     FIXP_DBL tRes[L_SUBFR];
997     FIXP_LPC A[M_LP_FILTER_ORDER];
998     INT A_exp;
999 
1000     /* interpolate LPC coefficients */
1001     int_lpc_acelp(lsp_old, lsp_new, subfr_nr, lDiv / L_SUBFR, A, &A_exp);
1002 
1003     Syn_filt(A,              /* (i) : a[m] prediction coefficients         */
1004              A_exp, L_SUBFR, /* (i) : length                               */
1005              &exc[i_subfr],  /* (i) : input signal                         */
1006              &syn[i_subfr]   /* (i/o) : filter states / output signal      */
1007     );
1008 
1009     E_LPC_a_weight(
1010         A, A,
1011         M_LP_FILTER_ORDER); /* overwrite A as it is not needed any longer */
1012 
1013     E_UTIL_residu(A, A_exp, &syn[i_subfr], tRes, L_SUBFR);
1014 
1015     Deemph(tRes, &ns[i_subfr], L_SUBFR, &acelp_mem->deemph_mem_wsyn);
1016 
1017     /* Amplitude limiter (saturate at wsyn_rms) */
1018     for (i = i_subfr; i < i_subfr + L_SUBFR; i++) {
1019       if (ns[i] > tmp) {
1020         ns[i] = tmp;
1021       } else {
1022         if (ns[i] < -tmp) {
1023           ns[i] = -tmp;
1024         }
1025       }
1026     }
1027 
1028     E_UTIL_preemph(&ns[i_subfr], tRes, L_SUBFR);
1029 
1030     Syn_filt(A,              /* (i) : a[m] prediction coefficients         */
1031              A_exp, L_SUBFR, /* (i) : length                               */
1032              tRes,           /* (i) : input signal                         */
1033              &syn[i_subfr]   /* (i/o) : filter states / output signal      */
1034     );
1035 
1036     FDKmemmove(&synth[i_subfr], &syn[i_subfr], L_SUBFR * sizeof(FIXP_DBL));
1037   }
1038 
1039   /* save old excitation and old synthesis memory for next ACELP frame */
1040   FDKmemcpy(acelp_mem->old_exc_mem, exc + lDiv - (PIT_MAX_MAX + L_INTERPOL),
1041             sizeof(FIXP_DBL) * (PIT_MAX_MAX + L_INTERPOL));
1042   FDKmemcpy(acelp_mem->old_syn_mem, syn_buf + lDiv,
1043             sizeof(FIXP_DBL) * M_LP_FILTER_ORDER);
1044   acelp_mem->de_emph_mem = acelp_mem->deemph_mem_wsyn;
1045 
1046   C_ALLOC_SCRATCH_END(syn_buf, FIXP_DBL, M_LP_FILTER_ORDER + L_DIV);
1047   C_ALLOC_SCRATCH_END(exc_buf, FIXP_DBL, PIT_MAX_MAX + L_INTERPOL + L_DIV);
1048 }
1049 
Acelp_PreProcessing(FIXP_DBL * synth_buf,FIXP_DBL * old_synth,INT * pitch,INT * old_T_pf,FIXP_DBL * pit_gain,FIXP_DBL * old_gain_pf,INT samplingRate,INT * i_offset,INT coreCoderFrameLength,INT synSfd,INT nbSubfrSuperfr)1050 void Acelp_PreProcessing(FIXP_DBL *synth_buf, FIXP_DBL *old_synth, INT *pitch,
1051                          INT *old_T_pf, FIXP_DBL *pit_gain,
1052                          FIXP_DBL *old_gain_pf, INT samplingRate, INT *i_offset,
1053                          INT coreCoderFrameLength, INT synSfd,
1054                          INT nbSubfrSuperfr) {
1055   int n;
1056 
1057   /* init beginning of synth_buf with old synthesis from previous frame */
1058   FDKmemcpy(synth_buf, old_synth, sizeof(FIXP_DBL) * (PIT_MAX_MAX - BPF_DELAY));
1059 
1060   /* calculate pitch lag offset for ACELP decoder */
1061   *i_offset =
1062       (samplingRate * PIT_MIN_12k8 + (FSCALE_DENOM / 2)) / FSCALE_DENOM -
1063       PIT_MIN_12k8;
1064 
1065   /* for bass postfilter */
1066   for (n = 0; n < synSfd; n++) {
1067     pitch[n] = old_T_pf[n];
1068     pit_gain[n] = old_gain_pf[n];
1069   }
1070   for (n = 0; n < nbSubfrSuperfr; n++) {
1071     pitch[n + synSfd] = L_SUBFR;
1072     pit_gain[n + synSfd] = (FIXP_DBL)0;
1073   }
1074 }
1075 
Acelp_PostProcessing(FIXP_DBL * synth_buf,FIXP_DBL * old_synth,INT * pitch,INT * old_T_pf,INT coreCoderFrameLength,INT synSfd,INT nbSubfrSuperfr)1076 void Acelp_PostProcessing(FIXP_DBL *synth_buf, FIXP_DBL *old_synth, INT *pitch,
1077                           INT *old_T_pf, INT coreCoderFrameLength, INT synSfd,
1078                           INT nbSubfrSuperfr) {
1079   int n;
1080 
1081   /* store last part of synth_buf (which is not handled by the IMDCT overlap)
1082    * for next frame */
1083   FDKmemcpy(old_synth, synth_buf + coreCoderFrameLength,
1084             sizeof(FIXP_DBL) * (PIT_MAX_MAX - BPF_DELAY));
1085 
1086   /* for bass postfilter */
1087   for (n = 0; n < synSfd; n++) {
1088     old_T_pf[n] = pitch[nbSubfrSuperfr + n];
1089   }
1090 }
1091 
1092 #define L_FAC_ZIR (LFAC)
1093 
CLpd_Acelp_Zir(const FIXP_LPC A[],const INT A_exp,CAcelpStaticMem * acelp_mem,const INT length,FIXP_DBL zir[],int doDeemph)1094 void CLpd_Acelp_Zir(const FIXP_LPC A[], const INT A_exp,
1095                     CAcelpStaticMem *acelp_mem, const INT length,
1096                     FIXP_DBL zir[], int doDeemph) {
1097   C_ALLOC_SCRATCH_START(tmp_buf, FIXP_DBL, L_FAC_ZIR + M_LP_FILTER_ORDER);
1098   FDK_ASSERT(length <= L_FAC_ZIR);
1099 
1100   FDKmemcpy(tmp_buf, acelp_mem->old_syn_mem,
1101             M_LP_FILTER_ORDER * sizeof(FIXP_DBL));
1102   FDKmemset(tmp_buf + M_LP_FILTER_ORDER, 0, L_FAC_ZIR * sizeof(FIXP_DBL));
1103 
1104   Syn_filt(A, A_exp, length, &tmp_buf[M_LP_FILTER_ORDER],
1105            &tmp_buf[M_LP_FILTER_ORDER]);
1106   if (!doDeemph) {
1107     /* if last lpd mode was TD concealment, then bypass deemph */
1108     FDKmemcpy(zir, tmp_buf, length * sizeof(*zir));
1109   } else {
1110     Deemph(&tmp_buf[M_LP_FILTER_ORDER], &zir[0], length,
1111            &acelp_mem->de_emph_mem);
1112     scaleValues(zir, length, -ACELP_OUTSCALE);
1113   }
1114   C_ALLOC_SCRATCH_END(tmp_buf, FIXP_DBL, L_FAC_ZIR + M_LP_FILTER_ORDER);
1115 }
1116 
CLpd_AcelpPrepareInternalMem(const FIXP_DBL * synth,UCHAR last_lpd_mode,UCHAR last_last_lpd_mode,const FIXP_LPC * A_new,const INT A_new_exp,const FIXP_LPC * A_old,const INT A_old_exp,CAcelpStaticMem * acelp_mem,INT coreCoderFrameLength,INT clearOldExc,UCHAR lpd_mode)1117 void CLpd_AcelpPrepareInternalMem(const FIXP_DBL *synth, UCHAR last_lpd_mode,
1118                                   UCHAR last_last_lpd_mode,
1119                                   const FIXP_LPC *A_new, const INT A_new_exp,
1120                                   const FIXP_LPC *A_old, const INT A_old_exp,
1121                                   CAcelpStaticMem *acelp_mem,
1122                                   INT coreCoderFrameLength, INT clearOldExc,
1123                                   UCHAR lpd_mode) {
1124   int l_div =
1125       coreCoderFrameLength / NB_DIV; /* length of one ACELP/TCX20 frame */
1126   int l_div_partial;
1127   FIXP_DBL *syn, *old_exc_mem;
1128 
1129   C_ALLOC_SCRATCH_START(synth_buf, FIXP_DBL,
1130                         PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER);
1131   syn = &synth_buf[M_LP_FILTER_ORDER];
1132 
1133   l_div_partial = PIT_MAX_MAX + L_INTERPOL - l_div;
1134   old_exc_mem = acelp_mem->old_exc_mem;
1135 
1136   if (lpd_mode == 4) {
1137     /* Bypass Domain conversion. TCXTD Concealment does no deemphasis in the
1138      * end. */
1139     FDKmemcpy(
1140         synth_buf, &synth[-(PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER)],
1141         (PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER) * sizeof(FIXP_DBL));
1142     /* Set deemphasis memory state for TD concealment */
1143     acelp_mem->deemph_mem_wsyn = scaleValueSaturate(synth[-1], ACELP_OUTSCALE);
1144   } else {
1145     /* convert past [PIT_MAX_MAX+L_INTERPOL+M_LP_FILTER_ORDER] synthesis to
1146      * preemph domain */
1147     E_UTIL_preemph(&synth[-(PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER)],
1148                    synth_buf, PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER);
1149     scaleValuesSaturate(synth_buf, PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER,
1150                         ACELP_OUTSCALE);
1151   }
1152 
1153   /* Set deemphasis memory state */
1154   acelp_mem->de_emph_mem = scaleValueSaturate(synth[-1], ACELP_OUTSCALE);
1155 
1156   /* update acelp synth filter memory */
1157   FDKmemcpy(acelp_mem->old_syn_mem,
1158             &syn[PIT_MAX_MAX + L_INTERPOL - M_LP_FILTER_ORDER],
1159             M_LP_FILTER_ORDER * sizeof(FIXP_DBL));
1160 
1161   if (clearOldExc) {
1162     FDKmemclear(old_exc_mem, (PIT_MAX_MAX + L_INTERPOL) * sizeof(FIXP_DBL));
1163     C_ALLOC_SCRATCH_END(synth_buf, FIXP_DBL,
1164                         PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER);
1165     return;
1166   }
1167 
1168   /* update past [PIT_MAX_MAX+L_INTERPOL] samples of exc memory */
1169   if (last_lpd_mode == 1) {        /* last frame was TCX20 */
1170     if (last_last_lpd_mode == 0) { /* ACELP -> TCX20 -> ACELP transition */
1171       /* Delay valid part of excitation buffer (from previous ACELP frame) by
1172        * l_div samples */
1173       FDKmemmove(old_exc_mem, old_exc_mem + l_div,
1174                  sizeof(FIXP_DBL) * l_div_partial);
1175     } else if (last_last_lpd_mode > 0) { /* TCX -> TCX20 -> ACELP transition */
1176       E_UTIL_residu(A_old, A_old_exp, syn, old_exc_mem, l_div_partial);
1177     }
1178     E_UTIL_residu(A_new, A_new_exp, syn + l_div_partial,
1179                   old_exc_mem + l_div_partial, l_div);
1180   } else { /* prev frame was FD, TCX40 or TCX80 */
1181     int exc_A_new_length = (coreCoderFrameLength / 2 > PIT_MAX_MAX + L_INTERPOL)
1182                                ? PIT_MAX_MAX + L_INTERPOL
1183                                : coreCoderFrameLength / 2;
1184     int exc_A_old_length = PIT_MAX_MAX + L_INTERPOL - exc_A_new_length;
1185     E_UTIL_residu(A_old, A_old_exp, syn, old_exc_mem, exc_A_old_length);
1186     E_UTIL_residu(A_new, A_new_exp, &syn[exc_A_old_length],
1187                   &old_exc_mem[exc_A_old_length], exc_A_new_length);
1188   }
1189   C_ALLOC_SCRATCH_END(synth_buf, FIXP_DBL,
1190                       PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER);
1191 
1192   return;
1193 }
1194 
CLpd_ACELP_GetFreeExcMem(CAcelpStaticMem * acelp_mem,INT length)1195 FIXP_DBL *CLpd_ACELP_GetFreeExcMem(CAcelpStaticMem *acelp_mem, INT length) {
1196   FDK_ASSERT(length <= PIT_MAX_MAX + L_INTERPOL);
1197   return acelp_mem->old_exc_mem;
1198 }
1199 
CLpd_AcelpRead(HANDLE_FDK_BITSTREAM hBs,CAcelpChannelData * acelp,INT acelp_core_mode,INT coreCoderFrameLength,INT i_offset)1200 INT CLpd_AcelpRead(HANDLE_FDK_BITSTREAM hBs, CAcelpChannelData *acelp,
1201                    INT acelp_core_mode, INT coreCoderFrameLength,
1202                    INT i_offset) {
1203   int nb_subfr = coreCoderFrameLength / L_DIV;
1204   const UCHAR *num_acb_index_bits =
1205       (nb_subfr == 4) ? num_acb_idx_bits_table[0] : num_acb_idx_bits_table[1];
1206   int nbits;
1207   int error = 0;
1208 
1209   const int PIT_MIN = PIT_MIN_12k8 + i_offset;
1210   const int PIT_FR2 = PIT_FR2_12k8 - i_offset;
1211   const int PIT_FR1 = PIT_FR1_12k8;
1212   const int PIT_MAX = PIT_MAX_12k8 + (6 * i_offset);
1213   int T0, T0_frac, T0_min = 0, T0_max;
1214 
1215   if (PIT_MAX > PIT_MAX_MAX) {
1216     error = AAC_DEC_DECODE_FRAME_ERROR;
1217     goto bail;
1218   }
1219 
1220   acelp->acelp_core_mode = acelp_core_mode;
1221 
1222   nbits = MapCoreMode2NBits(acelp_core_mode);
1223 
1224   /* decode mean energy with 2 bits : 18, 30, 42 or 54 dB */
1225   acelp->mean_energy = FDKreadBits(hBs, 2);
1226 
1227   for (int sfr = 0; sfr < nb_subfr; sfr++) {
1228     /* read ACB index and store T0 and T0_frac for each ACELP subframe. */
1229     error = DecodePitchLag(hBs, num_acb_index_bits[sfr], PIT_MIN, PIT_FR2,
1230                            PIT_FR1, PIT_MAX, &T0, &T0_frac, &T0_min, &T0_max);
1231     if (error) {
1232       goto bail;
1233     }
1234     acelp->T0[sfr] = (USHORT)T0;
1235     acelp->T0_frac[sfr] = (UCHAR)T0_frac;
1236     acelp->ltp_filtering_flag[sfr] = FDKreadBits(hBs, 1);
1237     switch (nbits) {
1238       case 12: /* 12 bits AMR-WB codebook is used */
1239         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 1);
1240         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 5);
1241         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 1);
1242         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5);
1243         break;
1244       case 16: /* 16 bits AMR-WB codebook is used */
1245         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 1);
1246         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 5);
1247         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 5);
1248         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5);
1249         break;
1250       case 20: /* 20 bits AMR-WB codebook is used */
1251         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 5);
1252         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 5);
1253         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 5);
1254         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5);
1255         break;
1256       case 28: /* 28 bits AMR-WB codebook is used */
1257         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 9);
1258         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 9);
1259         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 5);
1260         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5);
1261         break;
1262       case 36: /* 36 bits AMR-WB codebook is used */
1263         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 9);
1264         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 9);
1265         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 9);
1266         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 9);
1267         break;
1268       case 44: /* 44 bits AMR-WB codebook is used */
1269         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 13);
1270         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 13);
1271         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 9);
1272         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 9);
1273         break;
1274       case 52: /* 52 bits AMR-WB codebook is used */
1275         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 13);
1276         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 13);
1277         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 13);
1278         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 13);
1279         break;
1280       case 64: /* 64 bits AMR-WB codebook is used */
1281         acelp->icb_index[sfr][0] = FDKreadBits(hBs, 2);
1282         acelp->icb_index[sfr][1] = FDKreadBits(hBs, 2);
1283         acelp->icb_index[sfr][2] = FDKreadBits(hBs, 2);
1284         acelp->icb_index[sfr][3] = FDKreadBits(hBs, 2);
1285         acelp->icb_index[sfr][4] = FDKreadBits(hBs, 14);
1286         acelp->icb_index[sfr][5] = FDKreadBits(hBs, 14);
1287         acelp->icb_index[sfr][6] = FDKreadBits(hBs, 14);
1288         acelp->icb_index[sfr][7] = FDKreadBits(hBs, 14);
1289         break;
1290       default:
1291         FDK_ASSERT(0);
1292         break;
1293     }
1294     acelp->gains[sfr] = FDKreadBits(hBs, 7);
1295   }
1296 
1297 bail:
1298   return error;
1299 }
1300