acelp_pitch_delay.c
Go to the documentation of this file.
1 /*
2  * gain code, gain pitch and pitch delay decoding
3  *
4  * Copyright (c) 2008 Vladimir Voroshilov
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "libavutil/common.h"
24 #include "libavutil/float_dsp.h"
25 #include "libavutil/libm.h"
26 #include "libavutil/mathematics.h"
27 #include "avcodec.h"
28 #include "acelp_pitch_delay.h"
29 #include "celp_math.h"
30 
32 {
33  ac_index += 58;
34  if(ac_index > 254)
35  ac_index = 3 * ac_index - 510;
36  return ac_index;
37 }
38 
40  int ac_index,
41  int pitch_delay_min)
42 {
43  if(ac_index < 4)
44  return 3 * (ac_index + pitch_delay_min);
45  else if(ac_index < 12)
46  return 3 * pitch_delay_min + ac_index + 6;
47  else
48  return 3 * (ac_index + pitch_delay_min) - 18;
49 }
50 
52  int ac_index,
53  int pitch_delay_min)
54 {
55  return 3 * pitch_delay_min + ac_index - 2;
56 }
57 
59 {
60  if(ac_index < 463)
61  return ac_index + 105;
62  else
63  return 6 * (ac_index - 368);
64 }
66  int ac_index,
67  int pitch_delay_min)
68 {
69  return 6 * pitch_delay_min + ac_index - 3;
70 }
71 
73  int16_t* quant_energy,
74  int gain_corr_factor,
75  int log2_ma_pred_order,
76  int erasure)
77 {
78  int i;
79  int avg_gain=quant_energy[(1 << log2_ma_pred_order) - 1]; // (5.10)
80 
81  for(i=(1 << log2_ma_pred_order) - 1; i>0; i--)
82  {
83  avg_gain += quant_energy[i-1];
84  quant_energy[i] = quant_energy[i-1];
85  }
86 
87  if(erasure)
88  quant_energy[0] = FFMAX(avg_gain >> log2_ma_pred_order, -10240) - 4096; // -10 and -4 in (5.10)
89  else
90  quant_energy[0] = (6165 * ((ff_log2_q15(gain_corr_factor) >> 2) - (13 << 13))) >> 13;
91 }
92 
94  DSPContext *dsp,
95  int gain_corr_factor,
96  const int16_t* fc_v,
97  int mr_energy,
98  const int16_t* quant_energy,
99  const int16_t* ma_prediction_coeff,
100  int subframe_size,
101  int ma_pred_order)
102 {
103  int i;
104 
105  mr_energy <<= 10;
106 
107  for(i=0; i<ma_pred_order; i++)
108  mr_energy += quant_energy[i] * ma_prediction_coeff[i];
109 
110 #ifdef G729_BITEXACT
111  mr_energy += (((-6165LL * ff_log2(dsp->scalarproduct_int16(fc_v, fc_v, subframe_size, 0))) >> 3) & ~0x3ff);
112 
113  mr_energy = (5439 * (mr_energy >> 15)) >> 8; // (0.15) = (0.15) * (7.23)
114 
115  return bidir_sal(
116  ((ff_exp2(mr_energy & 0x7fff) + 16) >> 5) * (gain_corr_factor >> 1),
117  (mr_energy >> 15) - 25
118  );
119 #else
120  mr_energy = gain_corr_factor * exp(M_LN10 / (20 << 23) * mr_energy) /
121  sqrt(dsp->scalarproduct_int16(fc_v, fc_v, subframe_size));
122  return mr_energy >> 12;
123 #endif
124 }
125 
126 float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy,
127  float *prediction_error, float energy_mean,
128  const float *pred_table)
129 {
130  // Equations 66-69:
131  // ^g_c = ^gamma_gc * 100.05 (predicted dB + mean dB - dB of fixed vector)
132  // Note 10^(0.05 * -10log(average x2)) = 1/sqrt((average x2)).
133  float val = fixed_gain_factor *
134  exp2f(M_LOG2_10 * 0.05 *
135  (avpriv_scalarproduct_float_c(pred_table, prediction_error, 4) +
136  energy_mean)) /
137  sqrtf(fixed_mean_energy);
138 
139  // update quantified prediction error energy history
140  memmove(&prediction_error[0], &prediction_error[1],
141  3 * sizeof(prediction_error[0]));
142  prediction_error[3] = 20.0 * log10f(fixed_gain_factor);
143 
144  return val;
145 }
146 
147 void ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index,
148  const int prev_lag_int, const int subframe,
149  int third_as_first, int resolution)
150 {
151  /* Note n * 10923 >> 15 is floor(x/3) for 0 <= n <= 32767 */
152  if (subframe == 0 || (subframe == 2 && third_as_first)) {
153 
154  if (pitch_index < 197)
155  pitch_index += 59;
156  else
157  pitch_index = 3 * pitch_index - 335;
158 
159  } else {
160  if (resolution == 4) {
161  int search_range_min = av_clip(prev_lag_int - 5, PITCH_DELAY_MIN,
162  PITCH_DELAY_MAX - 9);
163 
164  // decoding with 4-bit resolution
165  if (pitch_index < 4) {
166  // integer only precision for [search_range_min, search_range_min+3]
167  pitch_index = 3 * (pitch_index + search_range_min) + 1;
168  } else if (pitch_index < 12) {
169  // 1/3 fractional precision for [search_range_min+3 1/3, search_range_min+5 2/3]
170  pitch_index += 3 * search_range_min + 7;
171  } else {
172  // integer only precision for [search_range_min+6, search_range_min+9]
173  pitch_index = 3 * (pitch_index + search_range_min - 6) + 1;
174  }
175  } else {
176  // decoding with 5 or 6 bit resolution, 1/3 fractional precision
177  pitch_index--;
178 
179  if (resolution == 5) {
180  pitch_index += 3 * av_clip(prev_lag_int - 10, PITCH_DELAY_MIN,
181  PITCH_DELAY_MAX - 19);
182  } else
183  pitch_index += 3 * av_clip(prev_lag_int - 5, PITCH_DELAY_MIN,
184  PITCH_DELAY_MAX - 9);
185  }
186  }
187  *lag_int = pitch_index * 10923 >> 15;
188  *lag_frac = pitch_index - 3 * *lag_int - 1;
189 }
void ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index, const int prev_lag_int, const int subframe, int third_as_first, int resolution)
Decode the adaptive codebook index to the integer and fractional parts of the pitch lag for one subfr...
static const uint16_t ma_prediction_coeff[4]
MA prediction coefficients (3.9.1 of G.729, near Equation 69)
Definition: g729data.h:343
int ff_exp2(uint16_t power)
fixed-point implementation of exp2(x) in [0; 1] domain.
Definition: celp_math.c:48
int ff_acelp_decode_6bit_to_2nd_delay6(int ac_index, int pitch_delay_min)
Decode pitch delay of the second subframe encoded by 6 bits with 1/6 precision.
int ff_acelp_decode_4bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay with 1/3 precision.
int ff_acelp_decode_8bit_to_1st_delay3(int ac_index)
Decode pitch delay of the first subframe encoded by 8 bits with 1/3 resolution.
int ff_acelp_decode_9bit_to_1st_delay6(int ac_index)
Decode pitch delay of the first subframe encoded by 9 bits with 1/6 precision.
float avpriv_scalarproduct_float_c(const float *v1, const float *v2, int len)
Return the scalar product of two vectors.
Definition: float_dsp.c:107
#define PITCH_DELAY_MAX
int ff_acelp_decode_5_6_bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay of the second subframe encoded by 5 or 6 bits with 1/3 precision.
integer sqrt
Definition: avutil.txt:2
int ff_log2_q15(uint32_t value)
Calculate log2(x).
Definition: celp_math.c:78
#define FFMAX(a, b)
Definition: common.h:56
external API header
#define ff_log2
Definition: intmath.h:56
#define M_LOG2_10
Definition: mathematics.h:40
void ff_acelp_update_past_gain(int16_t *quant_energy, int gain_corr_factor, int log2_ma_pred_order, int erasure)
Update past quantized energies.
int16_t ff_acelp_decode_gain_code(DSPContext *dsp, int gain_corr_factor, const int16_t *fc_v, int mr_energy, const int16_t *quant_energy, const int16_t *ma_prediction_coeff, int subframe_size, int ma_pred_order)
Decode the adaptive codebook gain and add correction (4.1.5 and 3.9.1 of G.729).
1i.*Xphase exp()
#define exp2f(x)
Definition: libm.h:82
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted then it is pulled from the input slice through the input converter and horizontal scaler The result is also stored in the ring buffer to serve future vertical scaler requests When no more output can be generated because lines from a future slice would be then all remaining lines in the current slice are horizontally scaled and put in the ring buffer[This is done for luma and chroma, each with possibly different numbers of lines per picture.] Input to YUV Converter When the input to the main path is not planar bits per component YUV or bit it is converted to planar bit YUV Two sets of converters exist for this the other leaves the full chroma resolution
Definition: swscale.txt:33
Replacements for frequently missing libm functions.
synthesis window for stochastic i
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 M_LN10
Definition: mathematics.h:37
common internal and external API header
static int bidir_sal(int value, int offset)
Shift value left or right depending on sign of offset parameter.
Definition: celp_math.h:71
static const float energy_mean[8]
desired mean innovation energy, indexed by active mode
Definition: amrnbdata.h:1458
#define PITCH_DELAY_MIN
#define log10f(x)
Definition: libm.h:132
float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy, float *prediction_error, float energy_mean, const float *pred_table)
Calculate fixed gain (part of section 6.1.3 of AMR spec)
DSPContext.
Definition: dsputil.h:127