changeset 403:7e0aeab69b10

libtwamr: integrate spreproc.c
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 06 May 2024 23:11:34 +0000
parents a8b73b1c5b19
children a37687c6ff22
files libtwamr/Makefile libtwamr/namespace.list libtwamr/spreproc.c libtwamr/spreproc.h
diffstat 4 files changed, 167 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libtwamr/Makefile	Mon May 06 19:58:22 2024 +0000
+++ b/libtwamr/Makefile	Mon May 06 23:11:34 2024 +0000
@@ -14,7 +14,7 @@
 	prmno.o pstfilt.o q_gain_c.o q_gain_p.o q_plsf.o q_plsf3_tab.o \
 	q_plsf5_tab.o q_plsf_3.o q_plsf_5.o qgain475.o qgain795.o qua_gain.o \
 	qua_gain_tab.o reorder.o residu.o s10_8pf.o set_sign.o sid_sync.o \
-	sqrt_l.o syn_filt.o tls_flags.o weight_a.o window.o
+	spreproc.o sqrt_l.o syn_filt.o tls_flags.o weight_a.o window.o
 HDRS=	namespace.h
 LIB=	libtwamr.a
 
--- a/libtwamr/namespace.list	Mon May 06 19:58:22 2024 +0000
+++ b/libtwamr/namespace.list	Mon May 06 23:11:34 2024 +0000
@@ -65,6 +65,7 @@
 
 Cb_gain_average Cb_gain_average_reset
 MR475_update_unq_pred MR475_gain_quant MR795_gain_quant
+subframePreProc
 
 calc_unfilt_energies calc_filt_energies calc_target_energy
 code_2i40_9bits code_2i40_11bits code_3i40_14bits code_4i40_17bits
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/spreproc.c	Mon May 06 23:11:34 2024 +0000
@@ -0,0 +1,114 @@
+/*
+********************************************************************************
+*
+*      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             : spreproc.c
+*      Purpose          : Subframe preprocessing
+*
+********************************************************************************
+*/
+
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+#include "namespace.h"
+#include "spreproc.h"
+ 
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "weight_a.h"
+#include "syn_filt.h"
+#include "residu.h"
+#include "memops.h"
+#include "no_count.h"
+
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+int subframePreProc(
+    enum Mode mode,            /* i  : coder mode                            */
+    const Word16 gamma1[],     /* i  : spectral exp. factor 1                */
+    const Word16 gamma1_12k2[],/* i  : spectral exp. factor 1 for EFR        */
+    const Word16 gamma2[],     /* i  : spectral exp. factor 2                */
+    Word16 *A,                 /* i  : A(z) unquantized for the 4 subframes  */
+    Word16 *Aq,                /* i  : A(z)   quantized for the 4 subframes  */
+    Word16 *speech,            /* i  : speech segment                        */
+    Word16 *mem_err,           /* i  : pointer to error signal               */
+    Word16 *mem_w0,            /* i  : memory of weighting filter            */
+    Word16 *zero,              /* i  : pointer to zero vector                */
+    Word16 ai_zero[],          /* o  : history of weighted synth. filter     */
+    Word16 exc[],              /* o  : long term prediction residual         */
+    Word16 h1[],               /* o  : impulse response                      */
+    Word16 xn[],               /* o  : target vector for pitch search        */
+    Word16 res2[],             /* o  : long term prediction residual         */
+    Word16 error[]             /* o  : error of LPC synthesis filter         */
+)
+{
+   Word16 i;
+   Word16 Ap1[MP1];              /* A(z) with spectral expansion         */
+   Word16 Ap2[MP1];              /* A(z) with spectral expansion         */
+   const Word16 *g1;             /* Pointer to correct gammma1 vector    */
+
+   /*---------------------------------------------------------------*
+    * mode specific pointer to gamma1 values                        *
+    *---------------------------------------------------------------*/
+	test (); test ();
+	if ( sub(mode, MR122) == 0 || sub(mode, MR102) == 0 )
+        {
+           g1 = gamma1_12k2; move16 (); 
+	}
+        else
+        {
+           g1 = gamma1;      move16 (); 
+	}
+   /*---------------------------------------------------------------*
+    * Find the weighted LPC coefficients for the weighting filter.  *
+    *---------------------------------------------------------------*/
+   Weight_Ai(A, g1, Ap1);
+   Weight_Ai(A, gamma2, Ap2);
+   
+   /*---------------------------------------------------------------*
+    * Compute impulse response, h1[], of weighted synthesis filter  *
+    *---------------------------------------------------------------*/
+   for (i = 0; i <= M; i++)
+   {
+      ai_zero[i] = Ap1[i];        move16 ();
+   }
+
+   Syn_filt(Aq, ai_zero, h1, L_SUBFR, zero, 0);
+   Syn_filt(Ap2, h1, h1, L_SUBFR, zero, 0);
+   
+   /*------------------------------------------------------------------------*
+    *                                                                        *
+    *          Find the target vector for pitch search:                      *
+    *                                                                        *
+    *------------------------------------------------------------------------*/
+   
+   /* LPC residual */
+   Residu(Aq, speech, res2, L_SUBFR); 
+   Copy(res2, exc, L_SUBFR);
+
+   Syn_filt(Aq, exc, error, L_SUBFR, mem_err, 0);
+   
+   Residu(Ap1, error, xn, L_SUBFR);
+   
+   /* target signal xn[]*/
+   Syn_filt(Ap2, xn, xn, L_SUBFR, mem_w0, 0);    
+
+   return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/spreproc.h	Mon May 06 23:11:34 2024 +0000
@@ -0,0 +1,51 @@
+/*
+********************************************************************************
+*
+*      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             : spreproc.h
+*      Purpose          : Subframe preprocessing
+*
+********************************************************************************
+*/
+#ifndef spreproc_h
+#define spreproc_h "$Id $"
+ 
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "tw_amr.h"
+#include "typedef.h"
+#include "cnst.h"
+
+/*
+********************************************************************************
+*                         DECLARATION OF PROTOTYPES
+********************************************************************************
+*/
+int subframePreProc(
+    enum Mode mode,            /* i  : coder mode                            */
+    const Word16 gamma1[],     /* i  : spectral exp. factor 1                */
+    const Word16 gamma1_12k2[],/* i  : spectral exp. factor 1 for EFR        */
+    const Word16 gamma2[],     /* i  : spectral exp. factor 2                */
+    Word16 *A,                 /* i  : A(z) unquantized for the 4 subframes  */
+    Word16 *Aq,                /* i  : A(z)   quantized for the 4 subframes  */
+    Word16 *speech,            /* i  : speech segment                        */
+    Word16 *mem_err,           /* i  : pointer to error signal               */
+    Word16 *mem_w0,            /* i  : memory of weighting filter            */
+    Word16 *zero,              /* i  : pointer to zero vector                */
+    Word16 ai_zero[],          /* o  : history of weighted synth. filter     */
+    Word16 exc[],              /* o  : long term prediction residual         */
+    Word16 h1[],               /* o  : impulse response                      */
+    Word16 xn[],               /* o  : target vector for pitch search        */
+    Word16 res2[],             /* o  : long term prediction residual         */
+    Word16 error[]             /* o  : error of LPC synthesis filter         */
+);
+
+#endif