diff libtwamr/d_gain_c.c @ 339:a723d9f9f697

libtwamr: integrate d_gain_c.c
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 18 Apr 2024 23:33:00 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/d_gain_c.c	Thu Apr 18 23:33:00 2024 +0000
@@ -0,0 +1,109 @@
+/*
+********************************************************************************
+*
+*      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_gain_c.c
+*
+********************************************************************************
+*/
+ 
+ 
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+#include "namespace.h"
+#include "d_gain_c.h"
+ 
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "tw_amr.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "no_count.h"
+#include "cnst.h"
+#include "log2.h"
+#include "pow2.h"
+#include "gc_pred.h"
+#include "gains_tab.h"
+
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+
+/*
+**************************************************************************
+*
+*  Function    : d_gain_code
+*  Purpose     : Decode the fixed codebook gain using the received index.
+*
+**************************************************************************
+*/
+void d_gain_code (
+    gc_predState *pred_state, /* i/o : MA predictor state               */
+    enum Mode mode,           /* i   : AMR mode (MR795 or MR122)        */
+    Word16 index,             /* i   : received quantization index      */
+    Word16 code[],            /* i   : innovation codevector            */
+    Word16 *gain_code         /* o   : decoded innovation gain          */
+)
+{
+    Word16 gcode0, exp, frac;
+    const Word16 *p;
+    Word16 qua_ener_MR122, qua_ener;
+    Word16 exp_inn_en;
+    Word16 frac_inn_en;
+    Word32 L_tmp;
+    
+    /*-------------- Decode codebook gain ---------------*/
+    
+    /*-------------------------------------------------------------------*
+     *  predict codebook gain                                            *
+     *  ~~~~~~~~~~~~~~~~~~~~~                                            *
+     *  gc0     = Pow2(int(d)+frac(d))                                   *
+     *          = 2^exp + 2^frac                                         *
+     *                                                                   *
+     *-------------------------------------------------------------------*/
+
+    gc_pred(pred_state, mode, code, &exp, &frac,
+            &exp_inn_en, &frac_inn_en);
+    
+    p = &qua_gain_code[add (add (index, index), index)];
+
+    /* Different scalings between MR122 and the other modes */
+    test ();
+    if (sub(mode, MR122) == 0)
+    {
+        gcode0 = extract_l (Pow2 (exp, frac));  /* predicted gain */
+        gcode0 = shl (gcode0, 4);                                   
+        *gain_code = shl (mult (gcode0, *p++), 1);  move16 ();
+    }
+    else
+    {
+        gcode0 = extract_l (Pow2 (14, frac)); 
+        L_tmp = L_mult(*p++, gcode0);         
+        L_tmp = L_shr(L_tmp, sub(9, exp));    
+        *gain_code = extract_h(L_tmp);          /* Q1 */
+    }
+    
+    /*-------------------------------------------------------------------*
+     *  update table of past quantized energies                          *
+     *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                          *
+     *-------------------------------------------------------------------*/
+    qua_ener_MR122 = *p++;                 move16();
+    qua_ener = *p++;                       move16();
+    gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
+
+    return;
+}