g729postfilter.c
Go to the documentation of this file.
1 /*
2  * G.729, G729 Annex D postfilter
3  * Copyright (c) 2008 Vladimir Voroshilov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #include <inttypes.h>
22 #include <limits.h>
23 
24 #include "avcodec.h"
25 #include "g729.h"
26 #include "acelp_pitch_delay.h"
27 #include "g729postfilter.h"
28 #include "celp_math.h"
29 #include "acelp_filters.h"
30 #include "acelp_vectors.h"
31 #include "celp_filters.h"
32 
33 #define FRAC_BITS 15
34 #include "mathops.h"
35 
36 /**
37  * short interpolation filter (of length 33, according to spec)
38  * for computing signal with non-integer delay
39  */
41  0, 31650, 28469, 23705, 18050, 12266, 7041, 2873,
42  0, -1597, -2147, -1992, -1492, -933, -484, -188,
43 };
44 
45 /**
46  * long interpolation filter (of length 129, according to spec)
47  * for computing signal with non-integer delay
48  */
50  0, 31915, 29436, 25569, 20676, 15206, 9639, 4439,
51  0, -3390, -5579, -6549, -6414, -5392, -3773, -1874,
52  0, 1595, 2727, 3303, 3319, 2850, 2030, 1023,
53  0, -887, -1527, -1860, -1876, -1614, -1150, -579,
54  0, 501, 859, 1041, 1044, 892, 631, 315,
55  0, -266, -453, -543, -538, -455, -317, -156,
56  0, 130, 218, 258, 253, 212, 147, 72,
57  0, -59, -101, -122, -123, -106, -77, -40,
58 };
59 
60 /**
61  * formant_pp_factor_num_pow[i] = FORMANT_PP_FACTOR_NUM^(i+1)
62  */
63 static const int16_t formant_pp_factor_num_pow[10]= {
64  /* (0.15) */
65  18022, 9912, 5451, 2998, 1649, 907, 499, 274, 151, 83
66 };
67 
68 /**
69  * formant_pp_factor_den_pow[i] = FORMANT_PP_FACTOR_DEN^(i+1)
70  */
71 static const int16_t formant_pp_factor_den_pow[10] = {
72  /* (0.15) */
73  22938, 16057, 11240, 7868, 5508, 3856, 2699, 1889, 1322, 925
74 };
75 
76 /**
77  * \brief Residual signal calculation (4.2.1 if G.729)
78  * \param out [out] output data filtered through A(z/FORMANT_PP_FACTOR_NUM)
79  * \param filter_coeffs (3.12) A(z/FORMANT_PP_FACTOR_NUM) filter coefficients
80  * \param in input speech data to process
81  * \param subframe_size size of one subframe
82  *
83  * \note in buffer must contain 10 items of previous speech data before top of the buffer
84  * \remark It is safe to pass the same buffer for input and output.
85  */
86 static void residual_filter(int16_t* out, const int16_t* filter_coeffs, const int16_t* in,
87  int subframe_size)
88 {
89  int i, n;
90 
91  for (n = subframe_size - 1; n >= 0; n--) {
92  int sum = 0x800;
93  for (i = 0; i < 10; i++)
94  sum += filter_coeffs[i] * in[n - i - 1];
95 
96  out[n] = in[n] + (sum >> 12);
97  }
98 }
99 
100 /**
101  * \brief long-term postfilter (4.2.1)
102  * \param dsp initialized DSP context
103  * \param pitch_delay_int integer part of the pitch delay in the first subframe
104  * \param residual filtering input data
105  * \param residual_filt [out] speech signal with applied A(z/FORMANT_PP_FACTOR_NUM) filter
106  * \param subframe_size size of subframe
107  *
108  * \return 0 if long-term prediction gain is less than 3dB, 1 - otherwise
109  */
110 static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int,
111  const int16_t* residual, int16_t *residual_filt,
112  int subframe_size)
113 {
114  int i, k, tmp, tmp2;
115  int sum;
116  int L_temp0;
117  int L_temp1;
118  int64_t L64_temp0;
119  int64_t L64_temp1;
120  int16_t shift;
121  int corr_int_num, corr_int_den;
122 
123  int ener;
124  int16_t sh_ener;
125 
126  int16_t gain_num,gain_den; //selected signal's gain numerator and denominator
127  int16_t sh_gain_num, sh_gain_den;
128  int gain_num_square;
129 
130  int16_t gain_long_num,gain_long_den; //filtered through long interpolation filter signal's gain numerator and denominator
131  int16_t sh_gain_long_num, sh_gain_long_den;
132 
133  int16_t best_delay_int, best_delay_frac;
134 
135  int16_t delayed_signal_offset;
136  int lt_filt_factor_a, lt_filt_factor_b;
137 
138  int16_t * selected_signal;
139  const int16_t * selected_signal_const; //Necessary to avoid compiler warning
140 
141  int16_t sig_scaled[SUBFRAME_SIZE + RES_PREV_DATA_SIZE];
142  int16_t delayed_signal[ANALYZED_FRAC_DELAYS][SUBFRAME_SIZE+1];
143  int corr_den[ANALYZED_FRAC_DELAYS][2];
144 
145  tmp = 0;
146  for(i=0; i<subframe_size + RES_PREV_DATA_SIZE; i++)
147  tmp |= FFABS(residual[i]);
148 
149  if(!tmp)
150  shift = 3;
151  else
152  shift = av_log2(tmp) - 11;
153 
154  if (shift > 0)
155  for (i = 0; i < subframe_size + RES_PREV_DATA_SIZE; i++)
156  sig_scaled[i] = residual[i] >> shift;
157  else
158  for (i = 0; i < subframe_size + RES_PREV_DATA_SIZE; i++)
159  sig_scaled[i] = residual[i] << -shift;
160 
161  /* Start of best delay searching code */
162  gain_num = 0;
163 
164  ener = dsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE,
165  sig_scaled + RES_PREV_DATA_SIZE,
166  subframe_size);
167  if (ener) {
168  sh_ener = FFMAX(av_log2(ener) - 14, 0);
169  ener >>= sh_ener;
170  /* Search for best pitch delay.
171 
172  sum{ r(n) * r(k,n) ] }^2
173  R'(k)^2 := -------------------------
174  sum{ r(k,n) * r(k,n) }
175 
176 
177  R(T) := sum{ r(n) * r(n-T) ] }
178 
179 
180  where
181  r(n-T) is integer delayed signal with delay T
182  r(k,n) is non-integer delayed signal with integer delay best_delay
183  and fractional delay k */
184 
185  /* Find integer delay best_delay which maximizes correlation R(T).
186 
187  This is also equals to numerator of R'(0),
188  since the fine search (second step) is done with 1/8
189  precision around best_delay. */
190  corr_int_num = 0;
191  best_delay_int = pitch_delay_int - 1;
192  for (i = pitch_delay_int - 1; i <= pitch_delay_int + 1; i++) {
193  sum = dsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE,
194  sig_scaled + RES_PREV_DATA_SIZE - i,
195  subframe_size);
196  if (sum > corr_int_num) {
197  corr_int_num = sum;
198  best_delay_int = i;
199  }
200  }
201  if (corr_int_num) {
202  /* Compute denominator of pseudo-normalized correlation R'(0). */
203  corr_int_den = dsp->scalarproduct_int16(sig_scaled - best_delay_int + RES_PREV_DATA_SIZE,
204  sig_scaled - best_delay_int + RES_PREV_DATA_SIZE,
205  subframe_size);
206 
207  /* Compute signals with non-integer delay k (with 1/8 precision),
208  where k is in [0;6] range.
209  Entire delay is qual to best_delay+(k+1)/8
210  This is archieved by applying an interpolation filter of
211  legth 33 to source signal. */
212  for (k = 0; k < ANALYZED_FRAC_DELAYS; k++) {
213  ff_acelp_interpolate(&delayed_signal[k][0],
214  &sig_scaled[RES_PREV_DATA_SIZE - best_delay_int],
216  ANALYZED_FRAC_DELAYS+1,
217  8 - k - 1,
219  subframe_size + 1);
220  }
221 
222  /* Compute denominator of pseudo-normalized correlation R'(k).
223 
224  corr_den[k][0] is square root of R'(k) denominator, for int(T) == int(T0)
225  corr_den[k][1] is square root of R'(k) denominator, for int(T) == int(T0)+1
226 
227  Also compute maximum value of above denominators over all k. */
228  tmp = corr_int_den;
229  for (k = 0; k < ANALYZED_FRAC_DELAYS; k++) {
230  sum = dsp->scalarproduct_int16(&delayed_signal[k][1],
231  &delayed_signal[k][1],
232  subframe_size - 1);
233  corr_den[k][0] = sum + delayed_signal[k][0 ] * delayed_signal[k][0 ];
234  corr_den[k][1] = sum + delayed_signal[k][subframe_size] * delayed_signal[k][subframe_size];
235 
236  tmp = FFMAX3(tmp, corr_den[k][0], corr_den[k][1]);
237  }
238 
239  sh_gain_den = av_log2(tmp) - 14;
240  if (sh_gain_den >= 0) {
241 
242  sh_gain_num = FFMAX(sh_gain_den, sh_ener);
243  /* Loop through all k and find delay that maximizes
244  R'(k) correlation.
245  Search is done in [int(T0)-1; intT(0)+1] range
246  with 1/8 precision. */
247  delayed_signal_offset = 1;
248  best_delay_frac = 0;
249  gain_den = corr_int_den >> sh_gain_den;
250  gain_num = corr_int_num >> sh_gain_num;
251  gain_num_square = gain_num * gain_num;
252  for (k = 0; k < ANALYZED_FRAC_DELAYS; k++) {
253  for (i = 0; i < 2; i++) {
254  int16_t gain_num_short, gain_den_short;
255  int gain_num_short_square;
256  /* Compute numerator of pseudo-normalized
257  correlation R'(k). */
258  sum = dsp->scalarproduct_int16(&delayed_signal[k][i],
259  sig_scaled + RES_PREV_DATA_SIZE,
260  subframe_size);
261  gain_num_short = FFMAX(sum >> sh_gain_num, 0);
262 
263  /*
264  gain_num_short_square gain_num_square
265  R'(T)^2 = -----------------------, max R'(T)^2= --------------
266  den gain_den
267  */
268  gain_num_short_square = gain_num_short * gain_num_short;
269  gain_den_short = corr_den[k][i] >> sh_gain_den;
270 
271  tmp = MULL(gain_num_short_square, gain_den, FRAC_BITS);
272  tmp2 = MULL(gain_num_square, gain_den_short, FRAC_BITS);
273 
274  // R'(T)^2 > max R'(T)^2
275  if (tmp > tmp2) {
276  gain_num = gain_num_short;
277  gain_den = gain_den_short;
278  gain_num_square = gain_num_short_square;
279  delayed_signal_offset = i;
280  best_delay_frac = k + 1;
281  }
282  }
283  }
284 
285  /*
286  R'(T)^2
287  2 * --------- < 1
288  R(0)
289  */
290  L64_temp0 = (int64_t)gain_num_square << ((sh_gain_num << 1) + 1);
291  L64_temp1 = ((int64_t)gain_den * ener) << (sh_gain_den + sh_ener);
292  if (L64_temp0 < L64_temp1)
293  gain_num = 0;
294  } // if(sh_gain_den >= 0)
295  } // if(corr_int_num)
296  } // if(ener)
297  /* End of best delay searching code */
298 
299  if (!gain_num) {
300  memcpy(residual_filt, residual + RES_PREV_DATA_SIZE, subframe_size * sizeof(int16_t));
301 
302  /* Long-term prediction gain is less than 3dB. Long-term postfilter is disabled. */
303  return 0;
304  }
305  if (best_delay_frac) {
306  /* Recompute delayed signal with an interpolation filter of length 129. */
307  ff_acelp_interpolate(residual_filt,
308  &sig_scaled[RES_PREV_DATA_SIZE - best_delay_int + delayed_signal_offset],
311  8 - best_delay_frac,
313  subframe_size + 1);
314  /* Compute R'(k) correlation's numerator. */
315  sum = dsp->scalarproduct_int16(residual_filt,
316  sig_scaled + RES_PREV_DATA_SIZE,
317  subframe_size);
318 
319  if (sum < 0) {
320  gain_long_num = 0;
321  sh_gain_long_num = 0;
322  } else {
323  tmp = FFMAX(av_log2(sum) - 14, 0);
324  sum >>= tmp;
325  gain_long_num = sum;
326  sh_gain_long_num = tmp;
327  }
328 
329  /* Compute R'(k) correlation's denominator. */
330  sum = dsp->scalarproduct_int16(residual_filt, residual_filt, subframe_size);
331 
332  tmp = FFMAX(av_log2(sum) - 14, 0);
333  sum >>= tmp;
334  gain_long_den = sum;
335  sh_gain_long_den = tmp;
336 
337  /* Select between original and delayed signal.
338  Delayed signal will be selected if it increases R'(k)
339  correlation. */
340  L_temp0 = gain_num * gain_num;
341  L_temp0 = MULL(L_temp0, gain_long_den, FRAC_BITS);
342 
343  L_temp1 = gain_long_num * gain_long_num;
344  L_temp1 = MULL(L_temp1, gain_den, FRAC_BITS);
345 
346  tmp = ((sh_gain_long_num - sh_gain_num) << 1) - (sh_gain_long_den - sh_gain_den);
347  if (tmp > 0)
348  L_temp0 >>= tmp;
349  else
350  L_temp1 >>= -tmp;
351 
352  /* Check if longer filter increases the values of R'(k). */
353  if (L_temp1 > L_temp0) {
354  /* Select long filter. */
355  selected_signal = residual_filt;
356  gain_num = gain_long_num;
357  gain_den = gain_long_den;
358  sh_gain_num = sh_gain_long_num;
359  sh_gain_den = sh_gain_long_den;
360  } else
361  /* Select short filter. */
362  selected_signal = &delayed_signal[best_delay_frac-1][delayed_signal_offset];
363 
364  /* Rescale selected signal to original value. */
365  if (shift > 0)
366  for (i = 0; i < subframe_size; i++)
367  selected_signal[i] <<= shift;
368  else
369  for (i = 0; i < subframe_size; i++)
370  selected_signal[i] >>= -shift;
371 
372  /* necessary to avoid compiler warning */
373  selected_signal_const = selected_signal;
374  } // if(best_delay_frac)
375  else
376  selected_signal_const = residual + RES_PREV_DATA_SIZE - (best_delay_int + 1 - delayed_signal_offset);
377 #ifdef G729_BITEXACT
378  tmp = sh_gain_num - sh_gain_den;
379  if (tmp > 0)
380  gain_den >>= tmp;
381  else
382  gain_num >>= -tmp;
383 
384  if (gain_num > gain_den)
385  lt_filt_factor_a = MIN_LT_FILT_FACTOR_A;
386  else {
387  gain_num >>= 2;
388  gain_den >>= 1;
389  lt_filt_factor_a = (gain_den << 15) / (gain_den + gain_num);
390  }
391 #else
392  L64_temp0 = ((int64_t)gain_num) << (sh_gain_num - 1);
393  L64_temp1 = ((int64_t)gain_den) << sh_gain_den;
394  lt_filt_factor_a = FFMAX((L64_temp1 << 15) / (L64_temp1 + L64_temp0), MIN_LT_FILT_FACTOR_A);
395 #endif
396 
397  /* Filter through selected filter. */
398  lt_filt_factor_b = 32767 - lt_filt_factor_a + 1;
399 
400  ff_acelp_weighted_vector_sum(residual_filt, residual + RES_PREV_DATA_SIZE,
401  selected_signal_const,
402  lt_filt_factor_a, lt_filt_factor_b,
403  1<<14, 15, subframe_size);
404 
405  // Long-term prediction gain is larger than 3dB.
406  return 1;
407 }
408 
409 /**
410  * \brief Calculate reflection coefficient for tilt compensation filter (4.2.3).
411  * \param dsp initialized DSP context
412  * \param lp_gn (3.12) coefficients of A(z/FORMANT_PP_FACTOR_NUM) filter
413  * \param lp_gd (3.12) coefficients of A(z/FORMANT_PP_FACTOR_DEN) filter
414  * \param speech speech to update
415  * \param subframe_size size of subframe
416  *
417  * \return (3.12) reflection coefficient
418  *
419  * \remark The routine also calculates the gain term for the short-term
420  * filter (gf) and multiplies the speech data by 1/gf.
421  *
422  * \note All members of lp_gn, except 10-19 must be equal to zero.
423  */
424 static int16_t get_tilt_comp(DSPContext *dsp, int16_t *lp_gn,
425  const int16_t *lp_gd, int16_t* speech,
426  int subframe_size)
427 {
428  int rh1,rh0; // (3.12)
429  int temp;
430  int i;
431  int gain_term;
432 
433  lp_gn[10] = 4096; //1.0 in (3.12)
434 
435  /* Apply 1/A(z/FORMANT_PP_FACTOR_DEN) filter to hf. */
436  ff_celp_lp_synthesis_filter(lp_gn + 11, lp_gd + 1, lp_gn + 11, 22, 10, 0, 0, 0x800);
437  /* Now lp_gn (starting with 10) contains impulse response
438  of A(z/FORMANT_PP_FACTOR_NUM)/A(z/FORMANT_PP_FACTOR_DEN) filter. */
439 
440  rh0 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 10, 20);
441  rh1 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 11, 20);
442 
443  /* downscale to avoid overflow */
444  temp = av_log2(rh0) - 14;
445  if (temp > 0) {
446  rh0 >>= temp;
447  rh1 >>= temp;
448  }
449 
450  if (FFABS(rh1) > rh0 || !rh0)
451  return 0;
452 
453  gain_term = 0;
454  for (i = 0; i < 20; i++)
455  gain_term += FFABS(lp_gn[i + 10]);
456  gain_term >>= 2; // (3.12) -> (5.10)
457 
458  if (gain_term > 0x400) { // 1.0 in (5.10)
459  temp = 0x2000000 / gain_term; // 1.0/gain_term in (0.15)
460  for (i = 0; i < subframe_size; i++)
461  speech[i] = (speech[i] * temp + 0x4000) >> 15;
462  }
463 
464  return -(rh1 << 15) / rh0;
465 }
466 
467 /**
468  * \brief Apply tilt compensation filter (4.2.3).
469  * \param res_pst [in/out] residual signal (partially filtered)
470  * \param k1 (3.12) reflection coefficient
471  * \param subframe_size size of subframe
472  * \param ht_prev_data previous data for 4.2.3, equation 86
473  *
474  * \return new value for ht_prev_data
475 */
476 static int16_t apply_tilt_comp(int16_t* out, int16_t* res_pst, int refl_coeff,
477  int subframe_size, int16_t ht_prev_data)
478 {
479  int tmp, tmp2;
480  int i;
481  int gt, ga;
482  int fact, sh_fact;
483 
484  if (refl_coeff > 0) {
485  gt = (refl_coeff * G729_TILT_FACTOR_PLUS + 0x4000) >> 15;
486  fact = 0x4000; // 0.5 in (0.15)
487  sh_fact = 15;
488  } else {
489  gt = (refl_coeff * G729_TILT_FACTOR_MINUS + 0x4000) >> 15;
490  fact = 0x800; // 0.5 in (3.12)
491  sh_fact = 12;
492  }
493  ga = (fact << 15) / av_clip_int16(32768 - FFABS(gt));
494  gt >>= 1;
495 
496  /* Apply tilt compensation filter to signal. */
497  tmp = res_pst[subframe_size - 1];
498 
499  for (i = subframe_size - 1; i >= 1; i--) {
500  tmp2 = (res_pst[i] << 15) + ((gt * res_pst[i-1]) << 1);
501  tmp2 = (tmp2 + 0x4000) >> 15;
502 
503  tmp2 = (tmp2 * ga * 2 + fact) >> sh_fact;
504  out[i] = tmp2;
505  }
506  tmp2 = (res_pst[0] << 15) + ((gt * ht_prev_data) << 1);
507  tmp2 = (tmp2 + 0x4000) >> 15;
508  tmp2 = (tmp2 * ga * 2 + fact) >> sh_fact;
509  out[0] = tmp2;
510 
511  return tmp;
512 }
513 
514 void ff_g729_postfilter(DSPContext *dsp, int16_t* ht_prev_data, int* voicing,
515  const int16_t *lp_filter_coeffs, int pitch_delay_int,
516  int16_t* residual, int16_t* res_filter_data,
517  int16_t* pos_filter_data, int16_t *speech, int subframe_size)
518 {
519  int16_t residual_filt_buf[SUBFRAME_SIZE+11];
520  int16_t lp_gn[33]; // (3.12)
521  int16_t lp_gd[11]; // (3.12)
522  int tilt_comp_coeff;
523  int i;
524 
525  /* Zero-filling is necessary for tilt-compensation filter. */
526  memset(lp_gn, 0, 33 * sizeof(int16_t));
527 
528  /* Calculate A(z/FORMANT_PP_FACTOR_NUM) filter coefficients. */
529  for (i = 0; i < 10; i++)
530  lp_gn[i + 11] = (lp_filter_coeffs[i + 1] * formant_pp_factor_num_pow[i] + 0x4000) >> 15;
531 
532  /* Calculate A(z/FORMANT_PP_FACTOR_DEN) filter coefficients. */
533  for (i = 0; i < 10; i++)
534  lp_gd[i + 1] = (lp_filter_coeffs[i + 1] * formant_pp_factor_den_pow[i] + 0x4000) >> 15;
535 
536  /* residual signal calculation (one-half of short-term postfilter) */
537  memcpy(speech - 10, res_filter_data, 10 * sizeof(int16_t));
538  residual_filter(residual + RES_PREV_DATA_SIZE, lp_gn + 11, speech, subframe_size);
539  /* Save data to use it in the next subframe. */
540  memcpy(res_filter_data, speech + subframe_size - 10, 10 * sizeof(int16_t));
541 
542  /* long-term filter. If long-term prediction gain is larger than 3dB (returned value is
543  nonzero) then declare current subframe as periodic. */
544  *voicing = FFMAX(*voicing, long_term_filter(dsp, pitch_delay_int,
545  residual, residual_filt_buf + 10,
546  subframe_size));
547 
548  /* shift residual for using in next subframe */
549  memmove(residual, residual + subframe_size, RES_PREV_DATA_SIZE * sizeof(int16_t));
550 
551  /* short-term filter tilt compensation */
552  tilt_comp_coeff = get_tilt_comp(dsp, lp_gn, lp_gd, residual_filt_buf + 10, subframe_size);
553 
554  /* Apply second half of short-term postfilter: 1/A(z/FORMANT_PP_FACTOR_DEN) */
555  ff_celp_lp_synthesis_filter(pos_filter_data + 10, lp_gd + 1,
556  residual_filt_buf + 10,
557  subframe_size, 10, 0, 0, 0x800);
558  memcpy(pos_filter_data, pos_filter_data + subframe_size, 10 * sizeof(int16_t));
559 
560  *ht_prev_data = apply_tilt_comp(speech, pos_filter_data + 10, tilt_comp_coeff,
561  subframe_size, *ht_prev_data);
562 }
563 
564 /**
565  * \brief Adaptive gain control (4.2.4)
566  * \param gain_before gain of speech before applying postfilters
567  * \param gain_after gain of speech after applying postfilters
568  * \param speech [in/out] signal buffer
569  * \param subframe_size length of subframe
570  * \param gain_prev (3.12) previous value of gain coefficient
571  *
572  * \return (3.12) last value of gain coefficient
573  */
574 int16_t ff_g729_adaptive_gain_control(int gain_before, int gain_after, int16_t *speech,
575  int subframe_size, int16_t gain_prev)
576 {
577  int gain; // (3.12)
578  int n;
579  int exp_before, exp_after;
580 
581  if(!gain_after && gain_before)
582  return 0;
583 
584  if (gain_before) {
585 
586  exp_before = 14 - av_log2(gain_before);
587  gain_before = bidir_sal(gain_before, exp_before);
588 
589  exp_after = 14 - av_log2(gain_after);
590  gain_after = bidir_sal(gain_after, exp_after);
591 
592  if (gain_before < gain_after) {
593  gain = (gain_before << 15) / gain_after;
594  gain = bidir_sal(gain, exp_after - exp_before - 1);
595  } else {
596  gain = ((gain_before - gain_after) << 14) / gain_after + 0x4000;
597  gain = bidir_sal(gain, exp_after - exp_before);
598  }
599  gain = (gain * G729_AGC_FAC1 + 0x4000) >> 15; // gain * (1-0.9875)
600  } else
601  gain = 0;
602 
603  for (n = 0; n < subframe_size; n++) {
604  // gain_prev = gain + 0.9875 * gain_prev
605  gain_prev = (G729_AGC_FACTOR * gain_prev + 0x4000) >> 15;
606  gain_prev = av_clip_int16(gain + gain_prev);
607  speech[n] = av_clip_int16((speech[n] * gain_prev + 0x2000) >> 14);
608  }
609  return gain_prev;
610 }
static int16_t get_tilt_comp(DSPContext *dsp, int16_t *lp_gn, const int16_t *lp_gd, int16_t *speech, int subframe_size)
Calculate reflection coefficient for tilt compensation filter (4.2.3).
static int shift(int a, int b)
Definition: sonic.c:86
else temp
Definition: vf_mcdeint.c:148
int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, const int16_t *in, int buffer_length, int filter_length, int stop_on_overflow, int shift, int rounder)
LP synthesis filter.
Definition: celp_filters.c:60
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
#define ANALYZED_FRAC_DELAYS
Number of analyzed fractional pitch delays in second stage of long-term postfilter.
static void residual_filter(int16_t *out, const int16_t *filter_coeffs, const int16_t *in, int subframe_size)
Residual signal calculation (4.2.1 if G.729)
static const int16_t ff_g729_interp_filt_long[(ANALYZED_FRAC_DELAYS+1)*LONG_INT_FILT_LEN]
long interpolation filter (of length 129, according to spec) for computing signal with non-integer de...
#define LONG_INT_FILT_LEN
Long interpolation filter length.
#define FRAC_BITS
static const int16_t formant_pp_factor_num_pow[10]
formant_pp_factor_num_pow[i] = FORMANT_PP_FACTOR_NUM^(i+1)
int16_t ff_g729_adaptive_gain_control(int gain_before, int gain_after, int16_t *speech, int subframe_size, int16_t gain_prev)
Adaptive gain control (4.2.4)
static const int16_t ff_g729_interp_filt_short[(ANALYZED_FRAC_DELAYS+1)*SHORT_INT_FILT_LEN]
short interpolation filter (of length 33, according to spec) for computing signal with non-integer de...
static int16_t apply_tilt_comp(int16_t *out, int16_t *res_pst, int refl_coeff, int subframe_size, int16_t ht_prev_data)
Apply tilt compensation filter (4.2.3).
#define FFMAX(a, b)
Definition: common.h:56
external API header
void ff_acelp_weighted_vector_sum(int16_t *out, const int16_t *in_a, const int16_t *in_b, int16_t weight_coeff_a, int16_t weight_coeff_b, int16_t rounder, int shift, int length)
weighted sum of two vectors with rounding.
#define MIN_LT_FILT_FACTOR_A
1.0 / (1.0 + 0.5) in Q15 where 0.5 is the minimum value of weight factor, controlling amount of long-...
#define FFABS(a)
Definition: common.h:53
#define G729_AGC_FACTOR
gain adjustment factor (G.729, 4.2.4) 0.9875 in Q15
static const int16_t formant_pp_factor_den_pow[10]
formant_pp_factor_den_pow[i] = FORMANT_PP_FACTOR_DEN^(i+1)
void ff_g729_postfilter(DSPContext *dsp, int16_t *ht_prev_data, int *voicing, const int16_t *lp_filter_coeffs, int pitch_delay_int, int16_t *residual, int16_t *res_filter_data, int16_t *pos_filter_data, int16_t *speech, int subframe_size)
Signal postfiltering (4.2)
for k
#define G729_AGC_FAC1
synthesis window for stochastic i
static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, const int16_t *residual, int16_t *residual_filt, int subframe_size)
long-term postfilter (4.2.1)
int32_t(* scalarproduct_int16)(const int16_t *v1, const int16_t *v2, int len)
Calculate scalar product of two vectors.
Definition: dsputil.h:274
#define G729_TILT_FACTOR_PLUS
tilt compensation factor (G.729, k1>0) 0.2 in Q15
void ff_acelp_interpolate(int16_t *out, const int16_t *in, const int16_t *filter_coeffs, int precision, int frac_pos, int filter_length, int length)
Generic FIR interpolation routine.
Definition: acelp_filters.c:44
#define SHORT_INT_FILT_LEN
Short interpolation filter length.
#define av_log2
Definition: intmath.h:89
#define SUBFRAME_SIZE
Definition: evrcdec.c:40
static int bidir_sal(int value, int offset)
Shift value left or right depending on sign of offset parameter.
Definition: celp_math.h:71
#define MULL(a, b, s)
Definition: mathops.h:55
#define RES_PREV_DATA_SIZE
Amount of past residual signal data stored in buffer.
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
#define G729_TILT_FACTOR_MINUS
tilt compensation factor (G.729, k1<0) 0.9 in Q15
#define FFMAX3(a, b, c)
Definition: common.h:57
DSPContext.
Definition: dsputil.h:127