changeset 367:bd4f660eb75a

libtwamr: integrate g_pitch.c
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 06 May 2024 03:08:58 +0000
parents 1588a7d9e732
children 3a25bdfad0d8
files libtwamr/Makefile libtwamr/g_pitch.c libtwamr/g_pitch.h libtwamr/namespace.list
diffstat 4 files changed, 214 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/libtwamr/Makefile	Mon May 06 03:04:57 2024 +0000
+++ b/libtwamr/Makefile	Mon May 06 03:08:58 2024 +0000
@@ -6,9 +6,9 @@
 	d1035pf.o d2_11pf.o d2_9pf.o d3_14pf.o d4_17pf.o d8_31pf.o d_gain_c.o \
 	d_gain_p.o d_plsf.o d_plsf_3.o d_plsf_5.o dec_gain.o dec_lag3.o \
 	dec_lag6.o dhf_check.o dhf_tables.o e_homing.o ec_gains.o enc_lag3.o \
-	enc_lag6.o ex_ctrl.o g_adapt.o g_code.o gains_tab.o gc_pred.o gmed_n.o \
-	graytab.o inv_sqrt.o log2.o lsp_lsf.o oper_32b.o pow2.o prmno.o \
-	q_plsf3_tab.o q_plsf5_tab.o qua_gain_tab.o reorder.o s10_8pf.o \
+	enc_lag6.o ex_ctrl.o g_adapt.o g_code.o g_pitch.o gains_tab.o gc_pred.o\
+	gmed_n.o graytab.o inv_sqrt.o log2.o lsp_lsf.o oper_32b.o pow2.o \
+	prmno.o q_plsf3_tab.o q_plsf5_tab.o qua_gain_tab.o reorder.o s10_8pf.o \
 	set_sign.o sqrt_l.o tls_flags.o window.o
 HDRS=	namespace.h
 LIB=	libtwamr.a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/g_pitch.c	Mon May 06 03:08:58 2024 +0000
@@ -0,0 +1,169 @@
+/*
+********************************************************************************
+*
+*      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             : g_pitch.c
+*      Purpose          : Compute the pitch (adaptive codebook) gain.
+*
+********************************************************************************
+*/
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+#include "namespace.h"
+#include "g_pitch.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"
+ 
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+/*************************************************************************
+ *
+ *  FUNCTION:  G_pitch
+ *
+ *  PURPOSE:  Compute the pitch (adaptive codebook) gain.
+ *            Result in Q14 (NOTE: 12.2 bit exact using Q12) 
+ *
+ *  DESCRIPTION:
+ *      The adaptive codebook gain is given by
+ *
+ *              g = <x[], y[]> / <y[], y[]>
+ *
+ *      where x[] is the target vector, y[] is the filtered adaptive
+ *      codevector, and <> denotes dot product.
+ *      The gain is limited to the range [0,1.2] (=0..19661 Q14)
+ *
+ *************************************************************************/
+Word16 G_pitch     (    /* o : Gain of pitch lag saturated to 1.2       */
+    enum Mode mode,     /* i : AMR mode                                 */
+    Word16 xn[],        /* i : Pitch target.                            */
+    Word16 y1[],        /* i : Filtered adaptive codebook.              */
+    Word16 g_coeff[],   /* i : Correlations need for gain quantization  */
+    Word16 L_subfr      /* i : Length of subframe.                      */
+)
+{
+    Word16 i;
+    Word16 xy, yy, exp_xy, exp_yy, gain;
+    Word32 s;
+
+    Word16 scaled_y1[L_SUBFR];   /* Usually dynamic allocation of (L_subfr) */
+
+    /* divide "y1[]" by 4 to avoid overflow */
+
+    for (i = 0; i < L_subfr; i++)
+    {
+        scaled_y1[i] = shr (y1[i], 2); move16 (); 
+    }
+
+    /* Compute scalar product <y1[],y1[]> */
+
+    /* Q12 scaling / MR122 */
+    Overflow = 0;                   move16 ();
+    s = 1L;                         move32 (); /* Avoid case of all zeros */
+    for (i = 0; i < L_subfr; i++)
+    {
+        s = L_mac (s, y1[i], y1[i]);
+    }
+    test (); 
+    if (Overflow == 0)       /* Test for overflow */
+    {
+        exp_yy = norm_l (s);
+        yy = round (L_shl (s, exp_yy));
+    }
+    else
+    {
+        s = 1L;                     move32 (); /* Avoid case of all zeros */
+        for (i = 0; i < L_subfr; i++)
+        {
+            s = L_mac (s, scaled_y1[i], scaled_y1[i]);
+        }
+        exp_yy = norm_l (s);
+        yy = round (L_shl (s, exp_yy));
+        exp_yy = sub (exp_yy, 4);
+    }
+        
+    /* Compute scalar product <xn[],y1[]> */
+        
+    Overflow = 0;                   move16 (); 
+    s = 1L;                         move32 (); /* Avoid case of all zeros */
+        
+    for (i = 0; i < L_subfr; i++)
+    {
+        s = L_mac(s, xn[i], y1[i]);
+    }
+    test (); 
+    if (Overflow == 0)
+    {
+        exp_xy = norm_l (s);
+        xy = round (L_shl (s, exp_xy));
+    }
+    else
+    {
+        s = 1L;                     move32 (); /* Avoid case of all zeros */
+        for (i = 0; i < L_subfr; i++)
+        {
+            s = L_mac (s, xn[i], scaled_y1[i]);
+        }
+        exp_xy = norm_l (s);
+        xy = round (L_shl (s, exp_xy));
+        exp_xy = sub (exp_xy, 2);
+    }
+
+    g_coeff[0] = yy;                 move16 ();
+    g_coeff[1] = sub (15, exp_yy);   move16 ();
+    g_coeff[2] = xy;                 move16 ();
+    g_coeff[3] = sub (15, exp_xy);   move16 ();
+    
+    /* If (xy < 4) gain = 0 */
+
+    i = sub (xy, 4);
+
+    test (); 
+    if (i < 0)
+        return ((Word16) 0);
+
+    /* compute gain = xy/yy */
+
+    xy = shr (xy, 1);                  /* Be sure xy < yy */
+    gain = div_s (xy, yy);
+
+    i = sub (exp_xy, exp_yy);      /* Denormalization of division */        
+    gain = shr (gain, i);
+
+    /* if(gain >1.2) gain = 1.2 */
+
+    test (); 
+    if (sub (gain, 19661) > 0)
+    {
+        gain = 19661;                   move16 (); 
+    }
+
+    test ();
+    if (sub(mode, MR122) == 0)
+    {
+       /* clear 2 LSBits */
+       gain = gain & 0xfffC;            logic16 ();
+    }
+
+    return (gain);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/g_pitch.h	Mon May 06 03:08:58 2024 +0000
@@ -0,0 +1,40 @@
+/*
+********************************************************************************
+*
+*      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             : g_pitch.h
+*      Purpose          : Compute the pitch (adaptive codebook) gain.
+*
+********************************************************************************
+*/
+#ifndef g_pitch_h
+#define g_pitch_h "$Id $"
+ 
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "tw_amr.h"
+#include "typedef.h"
+ 
+/*
+********************************************************************************
+*                         DECLARATION OF PROTOTYPES
+********************************************************************************
+*/
+Word16 G_pitch     (    /* o : Gain of pitch lag saturated to 1.2       */
+    enum Mode mode,     /* i : AMR mode                                 */
+    Word16 xn[],        /* i : Pitch target.                            */
+    Word16 y1[],        /* i : Filtered adaptive codebook.              */
+    Word16 g_coeff[],   /* i : Correlations need for gain quantization.
+                               (7.4 only). Pass NULL if not needed      */
+    Word16 L_subfr      /* i : Length of subframe.                      */
+);
+ 
+#endif
--- a/libtwamr/namespace.list	Mon May 06 03:04:57 2024 +0000
+++ b/libtwamr/namespace.list	Mon May 06 03:08:58 2024 +0000
@@ -20,7 +20,8 @@
 Convolve
 Dec_gain Dec_lag3 Dec_lag6
 D_plsf_reset D_plsf_5 D_plsf_3 Init_D_plsf_3
-Enc_lag3 Enc_lag6 Ex_ctrl G_code
+Enc_lag3 Enc_lag6 Ex_ctrl
+G_code G_pitch
 Lsf_lsp Lsp_lsf Reorder_lsf
 
 agc agc2 agc_reset