changeset 10483:afad312b9989 libavcodec

Implement AMR gain function that is used by both AMR and SIPR. Based on AMR SoC code by Robert Swain and Colin McQuillan.
author vitor
date Sat, 31 Oct 2009 02:02:30 +0000
parents 90daf9b3083d
children ccad7a2ff75f
files acelp_pitch_delay.c acelp_pitch_delay.h
diffstat 2 files changed, 35 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/acelp_pitch_delay.c	Thu Oct 29 10:58:59 2009 +0000
+++ b/acelp_pitch_delay.c	Sat Oct 31 02:02:30 2009 +0000
@@ -119,3 +119,24 @@
     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;
+}
--- a/acelp_pitch_delay.h	Thu Oct 29 10:58:59 2009 +0000
+++ b/acelp_pitch_delay.h	Sat Oct 31 02:02:30 2009 +0000
@@ -220,4 +220,18 @@
     int subframe_size,
     int max_pred_order);
 
+/**
+ * Calculate fixed gain (part of section 6.1.3 of AMR spec)
+ *
+ * @param fixed_gain_factor gain correction factor
+ * @param fixed_energy decoded algebraic codebook vector energy
+ * @param prediction_error vector of the quantified predictor errors of
+ *        the four previous subframes. It is updated by this function.
+ * @param energy_mean desired mean innovation energy
+ * @param pred_table table of four moving average coefficients
+ */
+float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy,
+                            float *prediction_error, float energy_mean,
+                            const float *pred_table);
+
 #endif /* AVCODEC_ACELP_PITCH_DELAY_H */