Subversion Repositories Kolibri OS

Rev

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

  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. #ifndef FFMPEG_G729POSTFILTER_H
  22. #define FFMPEG_G729POSTFILTER_H
  23.  
  24. #include <stdint.h>
  25. #include "dsputil.h"
  26.  
  27. /**
  28.  * tilt compensation factor (G.729, k1>0)
  29.  * 0.2 in Q15
  30.  */
  31. #define G729_TILT_FACTOR_PLUS       6554
  32.  
  33. /**
  34.  * tilt compensation factor (G.729, k1<0)
  35.  * 0.9 in Q15
  36.  */
  37. #define G729_TILT_FACTOR_MINUS     29491
  38.  
  39. /* 4.2.2 */
  40. #define FORMANT_PP_FACTOR_NUM  18022             //0.55 in Q15
  41. #define FORMANT_PP_FACTOR_DEN  22938             //0.70 in Q15
  42.  
  43. /**
  44.  * gain adjustment factor (G.729, 4.2.4)
  45.  * 0.9875 in Q15
  46.  */
  47. #define G729_AGC_FACTOR            32358
  48. #define G729_AGC_FAC1 (32768-G729_AGC_FACTOR)
  49.  
  50. /**
  51.  * 1.0 / (1.0 + 0.5) in Q15
  52.  * where 0.5 is the minimum value of
  53.  * weight factor, controlling amount of long-term postfiltering
  54.  */
  55. #define MIN_LT_FILT_FACTOR_A       21845
  56.  
  57. /**
  58.  * Short interpolation filter length
  59.  */
  60. #define SHORT_INT_FILT_LEN         2
  61.  
  62. /**
  63.  * Long interpolation filter length
  64.  */
  65. #define LONG_INT_FILT_LEN          8
  66.  
  67. /**
  68.  * Number of analyzed fractional pitch delays in second stage of long-term
  69.  * postfilter
  70.  */
  71. #define ANALYZED_FRAC_DELAYS       7
  72.  
  73. /**
  74.  * Amount of past residual signal data stored in buffer
  75.  */
  76. #define RES_PREV_DATA_SIZE (PITCH_DELAY_MAX + LONG_INT_FILT_LEN + 1)
  77.  
  78. /**
  79.  * \brief Signal postfiltering (4.2)
  80.  * \param dsp initialized DSP context
  81.  * \param ht_prev_data [in/out] (Q12) pointer to variable receiving tilt
  82.  *                     compensation filter data from previous subframe
  83.  * \param voicing [in/out] (Q0) pointer to variable receiving voicing decision
  84.  * \param lp_filter_coeffs (Q12) LP filter coefficients
  85.  * \param pitch_delay_int integer part of the pitch delay
  86.  * \param residual [in/out] (Q0) residual signal buffer (used in long-term postfilter)
  87.  * \param res_filter_data [in/out] (Q0) speech data of previous subframe
  88.  * \param pos_filter_data [in/out] (Q0) previous speech data for short-term postfilter
  89.  * \param speech [in/out] (Q0) signal buffer
  90.  * \param subframe_size size of subframe
  91.  *
  92.  * Filtering has the following  stages:
  93.  *   Long-term postfilter (4.2.1)
  94.  *   Short-term postfilter (4.2.2).
  95.  *   Tilt-compensation (4.2.3)
  96.  */
  97. void ff_g729_postfilter(DSPContext *dsp, int16_t* ht_prev_data, int* voicing,
  98.                      const int16_t *lp_filter_coeffs, int pitch_delay_int,
  99.                      int16_t* residual, int16_t* res_filter_data,
  100.                      int16_t* pos_filter_data, int16_t *speech,
  101.                      int subframe_size);
  102.  
  103. /**
  104.  * \brief Adaptive gain control (4.2.4)
  105.  * \param gain_before (Q0) gain of speech before applying postfilters
  106.  * \param gain_after  (Q0) gain of speech after applying postfilters
  107.  * \param speech [in/out] (Q0) signal buffer
  108.  * \param subframe_size length of subframe
  109.  * \param gain_prev (Q12) previous value of gain coefficient
  110.  *
  111.  * \return (Q12) last value of gain coefficient
  112.  */
  113. int16_t ff_g729_adaptive_gain_control(int gain_before, int gain_after, int16_t *speech,
  114.                                    int subframe_size, int16_t gain_prev);
  115.  
  116. #endif // FFMPEG_G729POSTFILTER_H
  117.