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