You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.8KB

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