summaryrefslogtreecommitdiff
path: root/libavcodec/acelp_pitch_delay.c
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2009-10-31 02:02:30 +0000
committerVitor Sessak <vitor1001@gmail.com>2009-10-31 02:02:30 +0000
commit083c5a48ece9a6f316c49f383fa056279c811fd6 (patch)
tree2b357924276a95ef6db71e4487663dd5dfbb1984 /libavcodec/acelp_pitch_delay.c
parent050ba6f45eac82c524b5ce664d16c20ce4f16628 (diff)
Implement AMR gain function that is used by both AMR and SIPR.
Based on AMR SoC code by Robert Swain and Colin McQuillan. Originally committed as revision 20421 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/acelp_pitch_delay.c')
-rw-r--r--libavcodec/acelp_pitch_delay.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/libavcodec/acelp_pitch_delay.c b/libavcodec/acelp_pitch_delay.c
index ac929c4689..4c809d7eeb 100644
--- a/libavcodec/acelp_pitch_delay.c
+++ b/libavcodec/acelp_pitch_delay.c
@@ -119,3 +119,24 @@ int16_t ff_acelp_decode_gain_code(
return mr_energy >> 12;
#endif
}
+
+float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy,
+ float *prediction_error, float energy_mean,
+ const float *pred_table)
+{
+ // Equations 66-69:
+ // ^g_c = ^gamma_gc * 100.05 (predicted dB + mean dB - dB of fixed vector)
+ // Note 10^(0.05 * -10log(average x2)) = 1/sqrt((average x2)).
+ float val = fixed_gain_factor *
+ exp2f(log2f(10.0) * 0.05 *
+ (ff_dot_productf(pred_table, prediction_error, 4) +
+ energy_mean)) /
+ sqrtf(fixed_mean_energy);
+
+ // update quantified prediction error energy history
+ memmove(&prediction_error[0], &prediction_error[1],
+ 3 * sizeof(prediction_error[0]));
+ prediction_error[3] = 20.0 * log10f(fixed_gain_factor);
+
+ return val;
+}