acelp_pitch_delay.h
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 #ifndef AVCODEC_ACELP_PITCH_DELAY_H
24 #define AVCODEC_ACELP_PITCH_DELAY_H
25 
26 #include <stdint.h>
27 #include "dsputil.h"
28 
29 #define PITCH_DELAY_MIN 20
30 #define PITCH_DELAY_MAX 143
31 
32 /**
33  * @brief Decode pitch delay of the first subframe encoded by 8 bits with 1/3
34  * resolution.
35  * @param ac_index adaptive codebook index (8 bits)
36  *
37  * @return pitch delay in 1/3 units
38  *
39  * Pitch delay is coded:
40  * with 1/3 resolution, 19 < pitch_delay < 85
41  * integers only, 85 <= pitch_delay <= 143
42  */
43 int ff_acelp_decode_8bit_to_1st_delay3(int ac_index);
44 
45 /**
46  * @brief Decode pitch delay of the second subframe encoded by 5 or 6 bits
47  * with 1/3 precision.
48  * @param ac_index adaptive codebook index (5 or 6 bits)
49  * @param pitch_delay_min lower bound (integer) of pitch delay interval
50  * for second subframe
51  *
52  * @return pitch delay in 1/3 units
53  *
54  * Pitch delay is coded:
55  * with 1/3 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5
56  *
57  * @remark The routine is used in G.729 @@8k, AMR @@10.2k, AMR @@7.95k,
58  * AMR @@7.4k for the second subframe.
59  */
61  int ac_index,
62  int pitch_delay_min);
63 
64 /**
65  * @brief Decode pitch delay with 1/3 precision.
66  * @param ac_index adaptive codebook index (4 bits)
67  * @param pitch_delay_min lower bound (integer) of pitch delay interval for
68  * second subframe
69  *
70  * @return pitch delay in 1/3 units
71  *
72  * Pitch delay is coded:
73  * integers only, -6 < pitch_delay - int(prev_pitch_delay) <= -2
74  * with 1/3 resolution, -2 < pitch_delay - int(prev_pitch_delay) < 1
75  * integers only, 1 <= pitch_delay - int(prev_pitch_delay) < 5
76  *
77  * @remark The routine is used in G.729 @@6.4k, AMR @@6.7k, AMR @@5.9k,
78  * AMR @@5.15k, AMR @@4.75k for the second subframe.
79  */
81  int ac_index,
82  int pitch_delay_min);
83 
84 /**
85  * @brief Decode pitch delay of the first subframe encoded by 9 bits
86  * with 1/6 precision.
87  * @param ac_index adaptive codebook index (9 bits)
88  *
89  * @return pitch delay in 1/6 units
90  *
91  * Pitch delay is coded:
92  * with 1/6 resolution, 17 < pitch_delay < 95
93  * integers only, 95 <= pitch_delay <= 143
94  *
95  * @remark The routine is used in AMR @@12.2k for the first and third subframes.
96  */
97 int ff_acelp_decode_9bit_to_1st_delay6(int ac_index);
98 
99 /**
100  * @brief Decode pitch delay of the second subframe encoded by 6 bits
101  * with 1/6 precision.
102  * @param ac_index adaptive codebook index (6 bits)
103  * @param pitch_delay_min lower bound (integer) of pitch delay interval for
104  * second subframe
105  *
106  * @return pitch delay in 1/6 units
107  *
108  * Pitch delay is coded:
109  * with 1/6 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5
110  *
111  * @remark The routine is used in AMR @@12.2k for the second and fourth subframes.
112  */
114  int ac_index,
115  int pitch_delay_min);
116 
117 /**
118  * @brief Update past quantized energies
119  * @param[in,out] quant_energy past quantized energies (5.10)
120  * @param gain_corr_factor gain correction factor
121  * @param log2_ma_pred_order log2() of MA prediction order
122  * @param erasure frame erasure flag
123  *
124  * If frame erasure flag is not equal to zero, memory is updated with
125  * averaged energy, attenuated by 4dB:
126  * max(avg(quant_energy[i])-4, -14), i=0,ma_pred_order
127  *
128  * In normal mode memory is updated with
129  * Er - Ep = 20 * log10(gain_corr_factor)
130  *
131  * @remark The routine is used in G.729 and AMR (all modes).
132  */
134  int16_t* quant_energy,
135  int gain_corr_factor,
136  int log2_ma_pred_order,
137  int erasure);
138 
139 /**
140  * @brief Decode the adaptive codebook gain and add
141  * correction (4.1.5 and 3.9.1 of G.729).
142  * @param dsp initialized dsputil context
143  * @param gain_corr_factor gain correction factor (2.13)
144  * @param fc_v fixed-codebook vector (2.13)
145  * @param mr_energy mean innovation energy and fixed-point correction (7.13)
146  * @param[in,out] quant_energy past quantized energies (5.10)
147  * @param subframe_size length of subframe
148  *
149  * @return quantized fixed-codebook gain (14.1)
150  *
151  * The routine implements equations 69, 66 and 71 of the G.729 specification (3.9.1)
152  *
153  * Em - mean innovation energy (dB, constant, depends on decoding algorithm)
154  * Ep - mean-removed predicted energy (dB)
155  * Er - mean-removed innovation energy (dB)
156  * Ei - mean energy of the fixed-codebook contribution (dB)
157  * N - subframe_size
158  * M - MA (Moving Average) prediction order
159  * gc - fixed-codebook gain
160  * gc_p - predicted fixed-codebook gain
161  *
162  * Fixed codebook gain is computed using predicted gain gc_p and
163  * correction factor gain_corr_factor as shown below:
164  *
165  * gc = gc_p * gain_corr_factor
166  *
167  * The predicted fixed codebook gain gc_p is found by predicting
168  * the energy of the fixed-codebook contribution from the energy
169  * of previous fixed-codebook contributions.
170  *
171  * mean = 1/N * sum(i,0,N){ fc_v[i] * fc_v[i] }
172  *
173  * Ei = 10log(mean)
174  *
175  * Er = 10log(1/N * gc^2 * mean) - Em = 20log(gc) + Ei - Em
176  *
177  * Replacing Er with Ep and gc with gc_p we will receive:
178  *
179  * Ep = 10log(1/N * gc_p^2 * mean) - Em = 20log(gc_p) + Ei - Em
180  *
181  * and from above:
182  *
183  * gc_p = 10^((Ep - Ei + Em) / 20)
184  *
185  * Ep is predicted using past energies and prediction coefficients:
186  *
187  * Ep = sum(i,0,M){ ma_prediction_coeff[i] * quant_energy[i] }
188  *
189  * gc_p in fixed-point arithmetic is calculated as following:
190  *
191  * mean = 1/N * sum(i,0,N){ (fc_v[i] / 2^13) * (fc_v[i] / 2^13) } =
192  * = 1/N * sum(i,0,N) { fc_v[i] * fc_v[i] } / 2^26
193  *
194  * Ei = 10log(mean) = -10log(N) - 10log(2^26) +
195  * + 10log(sum(i,0,N) { fc_v[i] * fc_v[i] })
196  *
197  * Ep - Ei + Em = Ep + Em + 10log(N) + 10log(2^26) -
198  * - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) =
199  * = Ep + mr_energy - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] })
200  *
201  * gc_p = 10 ^ ((Ep - Ei + Em) / 20) =
202  * = 2 ^ (3.3219 * (Ep - Ei + Em) / 20) = 2 ^ (0.166 * (Ep - Ei + Em))
203  *
204  * where
205  *
206  * mr_energy = Em + 10log(N) + 10log(2^26)
207  *
208  * @remark The routine is used in G.729 and AMR (all modes).
209  */
211  DSPContext *dsp,
212  int gain_corr_factor,
213  const int16_t* fc_v,
214  int mr_energy,
215  const int16_t* quant_energy,
216  const int16_t* ma_prediction_coeff,
217  int subframe_size,
218  int max_pred_order);
219 
220 /**
221  * Calculate fixed gain (part of section 6.1.3 of AMR spec)
222  *
223  * @param fixed_gain_factor gain correction factor
224  * @param fixed_mean_energy mean decoded algebraic codebook vector energy
225  * @param prediction_error vector of the quantified predictor errors of
226  * the four previous subframes. It is updated by this function.
227  * @param energy_mean desired mean innovation energy
228  * @param pred_table table of four moving average coefficients
229  */
230 float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy,
231  float *prediction_error, float energy_mean,
232  const float *pred_table);
233 
234 
235 /**
236  * Decode the adaptive codebook index to the integer and fractional parts
237  * of the pitch lag for one subframe at 1/3 fractional precision.
238  *
239  * The choice of pitch lag is described in 3GPP TS 26.090 section 5.6.1.
240  *
241  * @param lag_int integer part of pitch lag of the current subframe
242  * @param lag_frac fractional part of pitch lag of the current subframe
243  * @param pitch_index parsed adaptive codebook (pitch) index
244  * @param prev_lag_int integer part of pitch lag for the previous subframe
245  * @param subframe current subframe number
246  * @param third_as_first treat the third frame the same way as the first
247  */
248 void ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index,
249  const int prev_lag_int, const int subframe,
250  int third_as_first, int resolution);
251 
252 #endif /* AVCODEC_ACELP_PITCH_DELAY_H */
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 max_pred_order)
Decode the adaptive codebook gain and add correction (4.1.5 and 3.9.1 of G.729).
static const uint16_t ma_prediction_coeff[4]
MA prediction coefficients (3.9.1 of G.729, near Equation 69)
Definition: g729data.h:343
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.
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...
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_9bit_to_1st_delay6(int ac_index)
Decode pitch delay of the first subframe encoded by 9 bits with 1/6 precision.
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)
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.
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
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.
DSP utils.
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.
static const float energy_mean[8]
desired mean innovation energy, indexed by active mode
Definition: amrnbdata.h:1458
DSPContext.
Definition: dsputil.h:127