Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 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 
22
#include 
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
 */
40
static const int16_t ff_g729_interp_filt_short[(ANALYZED_FRAC_DELAYS+1)*SHORT_INT_FILT_LEN] = {
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
 */
49
static const int16_t ff_g729_interp_filt_long[(ANALYZED_FRAC_DELAYS+1)*LONG_INT_FILT_LEN] = {
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
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],
215
                                     ff_g729_interp_filt_short,
216
                                     ANALYZED_FRAC_DELAYS+1,
217
                                     8 - k - 1,
218
                                     SHORT_INT_FILT_LEN,
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],
309
                             ff_g729_interp_filt_long,
310
                             ANALYZED_FRAC_DELAYS + 1,
311
                             8 - best_delay_frac,
312
                             LONG_INT_FILT_LEN,
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
}