[FFmpeg-soc] [soc]: r4852 - in amr: amrnbdata.h amrnbdec.c

cmcq subversion at mplayerhq.hu
Fri Jul 31 03:47:28 CEST 2009


Author: cmcq
Date: Fri Jul 31 03:47:27 2009
New Revision: 4852

Log:
Adjust the quantized LSFs to comply with ref decoder

Modified:
   amr/amrnbdata.h
   amr/amrnbdec.c

Modified: amr/amrnbdata.h
==============================================================================
--- amr/amrnbdata.h	Fri Jul 31 03:45:05 2009	(r4851)
+++ amr/amrnbdata.h	Fri Jul 31 03:47:27 2009	(r4852)
@@ -2038,6 +2038,7 @@ static const float pred_fac[LP_FILTER_OR
 #define PRED_FAC_MODE_122 0.65
 #define FREQ_LSP_FAC      2.0*M_PI/8000.0
 #define FREQ_LSF          1/8000.0
+#define MIN_LSF_SPACING   50.0488
 
 
 // pitch tables

Modified: amr/amrnbdec.c
==============================================================================
--- amr/amrnbdec.c	Fri Jul 31 03:45:05 2009	(r4851)
+++ amr/amrnbdec.c	Fri Jul 31 03:47:27 2009	(r4852)
@@ -203,6 +203,20 @@ static void interpolate_lsf(float lsf_q[
 }
 
 /**
+ * Adjust the quantized LSFs so they are increasing and not too close.
+ *
+ * This step isn't mentioned in the spec but is in the reference C decoder.
+ * Omitting this step creates audible distortion on the sinusoidal sweep
+ * test vectors in 3GPP TS 26.074.
+ */
+void adjust_lsfs(float *m) {
+    int i;
+    float tmp=0.0;
+    for (i = 0; i < LP_FILTER_ORDER; i++)
+        tmp = m[i] = FFMAX(m[i], tmp + MIN_LSF_SPACING);
+}
+
+/**
  * Decode a set of 5 split-matrix quantized lsf indexes into an lsp vector.
  *
  * @param p the context
@@ -237,6 +251,8 @@ static void lsf2lsp_for_mode122(AMRConte
     for (i = 0; i < LP_FILTER_ORDER; i++)
         lsf[i] += prev_lsf[i];
 
+    adjust_lsfs(lsf);
+
     // store LSF vector for fixed gain smoothing
     if (update_prev_lsf_r)
         interpolate_lsf(p->lsf_q, lsf);
@@ -299,6 +315,8 @@ static void lsf2lsp_3(AMRContext *p)
     for (i = 0; i < LP_FILTER_ORDER; i++)
         lsf_q[i] = lsf_r[i] + p->prev_lsf_r[i] * pred_fac[i] + lsf_3_mean[i];
 
+    adjust_lsfs(lsf_q);
+
     // store LSF vector for fixed gain smoothing
     interpolate_lsf(p->lsf_q, lsf_q);
 


More information about the FFmpeg-soc mailing list