diff libtwamr/b_cn_cod.c @ 255:07f936338de1

libtwamr: integrated up to b_cn_cod.c
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 05 Apr 2024 17:31:49 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/b_cn_cod.c	Fri Apr 05 17:31:49 2024 +0000
@@ -0,0 +1,159 @@
+/*
+********************************************************************************
+*
+*      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             : b_cn_cod.c
+*      Purpose          : Contains function for comfort noise generation.
+*
+********************************************************************************
+*/
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+#include "namespace.h"
+#include "b_cn_cod.h"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "no_count.h"
+#include "cnst.h"
+#include "window.h"
+
+/*
+********************************************************************************
+*                         LOCAL CONSTANTS
+********************************************************************************
+*/
+#define  NB_PULSE 10 /* number of random pulses in DTX operation   */
+
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+/*************************************************************************
+ *
+ *   FUNCTION NAME: pseudonoise
+ *
+ *************************************************************************/
+Word16 pseudonoise (
+    Word32 *shift_reg, /* i/o : Old CN generator shift register state */
+    Word16 no_bits     /* i   : Number of bits                        */
+)
+{
+   Word16 noise_bits, Sn, i;
+   
+   noise_bits = 0;                              move16 ();
+   for (i = 0; i < no_bits; i++)
+   {
+      /* State n == 31 */
+      test (); logic32 ();
+      if ((*shift_reg & 0x00000001L) != 0)
+      {
+         Sn = 1;                                move16 ();                         
+      }
+      else
+      {
+         Sn = 0;                                move16 ();                        
+      }
+      
+      /* State n == 3 */
+      test (); logic32 ();
+      if ((*shift_reg & 0x10000000L) != 0)
+      {
+         Sn = Sn ^ 1;                           move16 (); logic16 ();
+      }
+      else
+      {
+         Sn = Sn ^ 0;                           move16 (); logic16 ();  
+      }
+      
+      noise_bits = shl (noise_bits, 1);
+      noise_bits = noise_bits | (extract_l (*shift_reg) & 1);
+      logic16 (); logic16 (); move16 ();
+      
+      *shift_reg = L_shr (*shift_reg, 1);         
+      test ();
+      if (Sn & 1)
+      {
+         *shift_reg = *shift_reg | 0x40000000L; move32 (); logic32 ();
+      }
+   }
+   return noise_bits;
+}
+
+/***************************************************************************
+*
+*  Function    : build_CN_code
+*
+***************************************************************************/ 
+void build_CN_code (
+    Word32 *seed,         /* i/o : Old CN generator shift register state */
+    Word16 cod[]          /* o   : Generated CN fixed codebook vector    */
+)
+{
+   Word16 i, j, k;
+   
+   for (i = 0; i < L_SUBFR; i++)
+   {
+      cod[i] = 0;                    move16 ();     
+   }
+   
+   for (k = 0; k < NB_PULSE; k++)
+   {
+      i = pseudonoise (seed, 2);      /* generate pulse position */
+      i = shr (extract_l (L_mult (i, 10)), 1);
+      i = add (i, k);
+      
+      j = pseudonoise (seed, 1);      /* generate sign           */
+
+      test ();   
+      if (j > 0)
+      {
+         cod[i] = 4096;              move16 ();                   
+      }
+      else
+      {
+         cod[i] = -4096;             move16 ();                         
+      }
+   }
+   
+   return;
+}
+
+/*************************************************************************
+ *
+ *   FUNCTION NAME: build_CN_param
+ *
+ *************************************************************************/
+void build_CN_param (
+    Word16 *seed,             /* i/o : Old CN generator shift register state */
+    const Word16 n_param,           /* i  : number of params */  
+    const Word16 param_size_table[],/* i : size of params */   
+    Word16 parm[]             /* o : CN Generated params */
+    )
+{
+   Word16 i;
+   const Word16 *p;
+
+   *seed = extract_l(L_add(L_shr(L_mult(*seed, 31821), 1), 13849L));
+
+   p = &window_200_40[*seed & 0x7F]; logic16();
+   for(i=0; i< n_param;i++){
+     move16 (); logic16(); logic16(); logic16();
+     parm[i] = *p++ & ~(0xFFFF<<param_size_table[i]);  
+   }
+}