diff libtwamr/d_plsf_3.c @ 344:05a46720af0f

libtwamr: integrate d_plsf_3.c
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 19 Apr 2024 01:23:15 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/d_plsf_3.c	Fri Apr 19 01:23:15 2024 +0000
@@ -0,0 +1,199 @@
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.6.0   December 12, 2001
+*                                R99   Version 3.3.0                
+*                                REL-4 Version 4.1.0                
+*
+********************************************************************************
+*
+*      File             : d_plsf_3.c
+*      Purpose          : Decodes the LSP parameters using the received
+*                         quantization indices. 1st order MA prediction and
+*                         split by 3 vector quantization (split-VQ)
+*
+********************************************************************************
+*/
+
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+#include "namespace.h"
+#include "d_plsf.h"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "no_count.h"
+#include "lsp_lsf.h"
+#include "reorder.h"
+#include "memops.h"
+#include "q_plsf3_tab.h"
+
+/*
+********************************************************************************
+*                         LOCAL VARIABLES AND TABLES
+********************************************************************************
+*/
+
+/* ALPHA    ->  0.9                                            */
+/* ONE_ALPHA-> (1.0-ALPHA)                                     */
+
+#define ALPHA     29491
+#define ONE_ALPHA 3277
+
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+/*************************************************************************
+ *
+ *  FUNCTION:   D_plsf_3()
+ *
+ *  PURPOSE: Decodes the LSP parameters using the received quantization
+ *           indices.1st order MA prediction and split by 3 vector
+ *           quantization (split-VQ)
+ *
+ *************************************************************************/
+
+void D_plsf_3(
+    D_plsfState *st,   /* i/o: State struct                               */
+    enum Mode mode,    /* i  : coder mode                                 */
+    Word16 bfi,        /* i  : bad frame indicator (set to 1 if a         */
+                       /*      bad frame is received)                     */
+    Word16 * indice,   /* i  : quantization indices of 3 submatrices, Q0  */
+    Word16 * lsp1_q    /* o  : quantized 1st LSP vector,              Q15 */
+)
+{
+    Word16 i, index;
+    const Word16 *p_cb1, *p_cb2, *p_cb3, *p_dico;
+    Word16 temp;
+    Word16 lsf1_r[M];
+    Word16 lsf1_q[M];
+    
+    test ();
+    if (bfi != 0)   /* if bad frame */
+    {
+        /* use the past LSFs slightly shifted towards their mean */
+
+        for (i = 0; i < M; i++)
+        {
+            /* lsfi_q[i] = ALPHA*past_lsf_q[i] + ONE_ALPHA*mean_lsf3[i]; */
+
+            lsf1_q[i] = add(mult(st->past_lsf_q[i], ALPHA),
+                            mult(mean_lsf3[i], ONE_ALPHA));
+                                                move16 ();
+        }
+
+        /* estimate past quantized residual to be used in next frame */
+	test();
+	if (sub(mode, MRDTX) != 0) {
+	  for (i = 0; i < M; i++) {
+            /* temp  = mean_lsf3[i] +  past_r2_q[i] * PRED_FAC; */
+	    
+            temp = add(mean_lsf3[i], mult(st->past_r_q[i], pred_fac[i]));
+	    
+            st->past_r_q[i] = sub(lsf1_q[i], temp);                   move16 ();
+	  }
+	} else {
+	  for (i = 0; i < M; i++) {
+            /* temp  = mean_lsf3[i] +  past_r2_q[i]; */
+	    
+            temp = add(mean_lsf3[i], st->past_r_q[i]);
+            st->past_r_q[i] = sub(lsf1_q[i], temp);                   move16 ();
+	  }	  
+	}
+    }
+    else  /* if good LSFs received */
+    {
+       test (); test ();
+       if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
+       {   /* MR475, MR515 */
+          p_cb1 = dico1_lsf3;                 move16 ();
+          p_cb2 = dico2_lsf3;                 move16 ();
+          p_cb3 = mr515_3_lsf;                move16 ();
+       }
+       else if (sub (mode, MR795) == 0)
+       {   /* MR795 */
+          test();
+          p_cb1 = mr795_1_lsf;                move16 ();
+          p_cb2 = dico2_lsf3;                 move16 ();
+          p_cb3 = dico3_lsf3;                 move16 ();
+       }
+       else 
+       {   /* MR59, MR67, MR74, MR102, MRDTX */
+          test();          
+          p_cb1 = dico1_lsf3;                 move16 ();
+          p_cb2 = dico2_lsf3;                 move16 ();
+          p_cb3 = dico3_lsf3;                 move16 ();
+       }
+       
+       /* decode prediction residuals from 3 received indices */
+
+        index = *indice++;                      move16 ();
+        p_dico = &p_cb1[add(index, add(index, index))];               move16 ();
+        lsf1_r[0] = *p_dico++;                  move16 ();
+        lsf1_r[1] = *p_dico++;                  move16 ();
+        lsf1_r[2] = *p_dico++;                  move16 ();
+
+        index = *indice++;                      move16 ();
+        
+        test (); test ();
+        if ((sub (mode, MR475) == 0) || (sub (mode, MR515) == 0))
+        {   /* MR475, MR515 only using every second entry */
+            index = shl(index,1);
+        }
+        
+        p_dico = &p_cb2[add(index, add(index, index))];               move16 ();
+        lsf1_r[3] = *p_dico++;                  move16 ();
+        lsf1_r[4] = *p_dico++;                  move16 ();
+        lsf1_r[5] = *p_dico++;                  move16 ();
+
+        index = *indice++;                      move16 ();
+        p_dico = &p_cb3[shl(index, 2)];         move16 ();
+        lsf1_r[6] = *p_dico++;                  move16 ();
+        lsf1_r[7] = *p_dico++;                  move16 ();
+        lsf1_r[8] = *p_dico++;                  move16 ();
+        lsf1_r[9] = *p_dico++;                  move16 ();
+
+        /* Compute quantized LSFs and update the past quantized residual */
+
+	if (sub(mode, MRDTX) != 0) 
+           for (i = 0; i < M; i++) {
+              temp = add(mean_lsf3[i], mult(st->past_r_q[i], pred_fac[i]));
+              lsf1_q[i] = add(lsf1_r[i], temp);   move16 ();
+              st->past_r_q[i] = lsf1_r[i];        move16 ();
+           }
+        else
+           for (i = 0; i < M; i++) {
+              temp = add(mean_lsf3[i], st->past_r_q[i]);
+              lsf1_q[i] = add(lsf1_r[i], temp);   move16 ();
+              st->past_r_q[i] = lsf1_r[i];        move16 ();
+           }
+    }
+
+    /* verification that LSFs has minimum distance of LSF_GAP Hz */
+
+    Reorder_lsf(lsf1_q, LSF_GAP, M);
+
+    Copy (lsf1_q, st->past_lsf_q, M);
+
+    /*  convert LSFs to the cosine domain */
+
+    Lsf_lsp(lsf1_q, lsp1_q, M);
+
+    return;
+}
+
+void Init_D_plsf_3(D_plsfState *st,  /* i/o: State struct                */
+		   Word16 index      /* i  : past_rq_init[] index [0, 7] */)
+{
+  Copy(&past_rq_init[index * M], st->past_r_q, M);
+}