ffmpeg / libavcodec / acelp_pitch_delay.h @ 2912e87a
History  View  Annotate  Download (8.85 KB)
1 
/*


2 
* gain code, gain pitch and pitch delay decoding

3 
*

4 
* Copyright (c) 2008 Vladimir Voroshilov

5 
*

6 
* This file is part of Libav.

7 
*

8 
* Libav 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 
* Libav 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 Libav; if not, write to the Free Software

20 
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 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 
*/

60 
int ff_acelp_decode_5_6_bit_to_2nd_delay3(

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 
*/

80 
int ff_acelp_decode_4bit_to_2nd_delay3(

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 
*/

113 
int ff_acelp_decode_6bit_to_2nd_delay6(

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 
*/

133 
void ff_acelp_update_past_gain(

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 fixedcodebook vector (2.13)

145 
* \param mr_energy mean innovation energy and fixedpoint 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 fixedcodebook 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  meanremoved predicted energy (dB)

155 
* Er  meanremoved innovation energy (dB)

156 
* Ei  mean energy of the fixedcodebook contribution (dB)

157 
* N  subframe_size

158 
* M  MA (Moving Average) prediction order

159 
* gc  fixedcodebook gain

160 
* gc_p  predicted fixedcodebook 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 fixedcodebook contribution from the energy

169 
* of previous fixedcodebook 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 fixedpoint 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 
*/

210 
int16_t ff_acelp_decode_gain_code( 
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 */ 