FFmpeg

#include "libavutil/common.h"
#include "libavutil/float_dsp.h"
#include "libavutil/libm.h"
#include "libavutil/mathematics.h"
#include "avcodec.h"
#include "acelp_pitch_delay.h"
#include "celp_math.h"
#include "audiodsp.h"
Go to the source code of this file.
Functions  
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_4bit_to_2nd_delay3 (int ac_index, int pitch_delay_min) 
Decode pitch delay with 1/3 precision.  
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.  
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.  
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.  
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 (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 ma_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)  
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 subframe at 1/3 fractional 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.
ac_index  adaptive codebook index (8 bits) 
Pitch delay is coded: with 1/3 resolution, 19 < pitch_delay < 85 integers only, 85 <= pitch_delay <= 143
Definition at line 32 of file acelp_pitch_delay.c.
Referenced by decode_frame().
int ff_acelp_decode_4bit_to_2nd_delay3  (  int  ac_index, 
int  pitch_delay_min  
) 
Decode pitch delay with 1/3 precision.
ac_index  adaptive codebook index (4 bits) 
pitch_delay_min  lower bound (integer) of pitch delay interval for second subframe 
Pitch delay is coded: integers only, 6 < pitch_delay  int(prev_pitch_delay) <= 2 with 1/3 resolution, 2 < pitch_delay  int(prev_pitch_delay) < 1 integers only, 1 <= pitch_delay  int(prev_pitch_delay) < 5
Definition at line 40 of file acelp_pitch_delay.c.
Referenced by decode_frame().
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.
ac_index  adaptive codebook index (5 or 6 bits) 
pitch_delay_min  lower bound (integer) of pitch delay interval for second subframe 
Pitch delay is coded: with 1/3 resolution, 6 < pitch_delay  int(prev_pitch_delay) < 5
Definition at line 52 of file acelp_pitch_delay.c.
Referenced by decode_frame().
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.
ac_index  adaptive codebook index (9 bits) 
Pitch delay is coded: with 1/6 resolution, 17 < pitch_delay < 95 integers only, 95 <= pitch_delay <= 143
Definition at line 59 of file acelp_pitch_delay.c.
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.
ac_index  adaptive codebook index (6 bits) 
pitch_delay_min  lower bound (integer) of pitch delay interval for second subframe 
Pitch delay is coded: with 1/6 resolution, 6 < pitch_delay  int(prev_pitch_delay) < 5
Definition at line 66 of file acelp_pitch_delay.c.
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.
[in,out]  quant_energy  past quantized energies (5.10) 
gain_corr_factor  gain correction factor  
log2_ma_pred_order  log2() of MA prediction order  
erasure  frame erasure flag 
If frame erasure flag is not equal to zero, memory is updated with averaged energy, attenuated by 4dB: max(avg(quant_energy[i])4, 14), i=0,ma_pred_order
In normal mode memory is updated with Er  Ep = 20 * log10(gain_corr_factor)
Definition at line 73 of file acelp_pitch_delay.c.
Referenced by decode_frame().
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).
adsp  initialized audio DSP context  
gain_corr_factor  gain correction factor (2.13)  
fc_v  fixedcodebook vector (2.13)  
mr_energy  mean innovation energy and fixedpoint correction (7.13)  
[in,out]  quant_energy  past quantized energies (5.10) 
subframe_size  length of subframe 
The routine implements equations 69, 66 and 71 of the G.729 specification (3.9.1)
Em  mean innovation energy (dB, constant, depends on decoding algorithm) Ep  meanremoved predicted energy (dB) Er  meanremoved innovation energy (dB) Ei  mean energy of the fixedcodebook contribution (dB) N  subframe_size M  MA (Moving Average) prediction order gc  fixedcodebook gain gc_p  predicted fixedcodebook gain
Fixed codebook gain is computed using predicted gain gc_p and correction factor gain_corr_factor as shown below:
gc = gc_p * gain_corr_factor
The predicted fixed codebook gain gc_p is found by predicting the energy of the fixedcodebook contribution from the energy of previous fixedcodebook contributions.
mean = 1/N * sum(i,0,N){ fc_v[i] * fc_v[i] } Ei = 10log(mean) Er = 10log(1/N * gc^2 * mean)  Em = 20log(gc) + Ei  Em
Replacing Er with Ep and gc with gc_p we will receive:
Ep = 10log(1/N * gc_p^2 * mean)  Em = 20log(gc_p) + Ei  Em
and from above:
gc_p = 10^((Ep  Ei + Em) / 20)
Ep is predicted using past energies and prediction coefficients:
Ep = sum(i,0,M){ ma_prediction_coeff[i] * quant_energy[i] }
gc_p in fixedpoint arithmetic is calculated as following:
mean = 1/N * sum(i,0,N){ (fc_v[i] / 2^13) * (fc_v[i] / 2^13) } = = 1/N * sum(i,0,N) { fc_v[i] * fc_v[i] } / 2^26 Ei = 10log(mean) = 10log(N)  10log(2^26) + + 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) Ep  Ei + Em = Ep + Em + 10log(N) + 10log(2^26)   10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) = = Ep + mr_energy  10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) gc_p = 10 ^ ((Ep  Ei + Em) / 20) = = 2 ^ (3.3219 * (Ep  Ei + Em) / 20) = 2 ^ (0.166 * (Ep  Ei + Em))
where
mr_energy = Em + 10log(N) + 10log(2^26)
Definition at line 94 of file acelp_pitch_delay.c.
Referenced by decode_frame().
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)
fixed_gain_factor  gain correction factor 
fixed_mean_energy  mean decoded algebraic codebook vector energy 
prediction_error  vector of the quantified predictor errors of the four previous subframes. It is updated by this function. 
energy_mean  desired mean innovation energy 
pred_table  table of four moving average coefficients 
Definition at line 127 of file acelp_pitch_delay.c.
Referenced by amrnb_decode_frame(), amrwb_decode_frame(), and decode_frame().
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 subframe at 1/3 fractional precision.
The choice of pitch lag is described in 3GPP TS 26.090 section 5.6.1.
lag_int  integer part of pitch lag of the current subframe 
lag_frac  fractional part of pitch lag of the current subframe 
pitch_index  parsed adaptive codebook (pitch) index 
prev_lag_int  integer part of pitch lag for the previous subframe 
subframe  current subframe number 
third_as_first  treat the third frame the same way as the first 
Definition at line 148 of file acelp_pitch_delay.c.
Referenced by decode_frame(), and decode_pitch_vector().