diff libtwamr/ton_stab.c @ 405:8fff74ca83e8

libtwamr: integrate ton_stab.c
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 06 May 2024 23:23:40 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtwamr/ton_stab.c	Mon May 06 23:23:40 2024 +0000
@@ -0,0 +1,182 @@
+/*
+*****************************************************************************
+*
+*      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             : ton_stab.c
+*
+*****************************************************************************
+*/
+
+/*
+*****************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+*****************************************************************************
+*/
+#include "namespace.h"
+#include "ton_stab.h"
+ 
+/*
+*****************************************************************************
+*                         INCLUDE FILES
+*****************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "no_count.h"
+#include "oper_32b.h"
+#include "cnst.h"
+#include "memops.h"
+
+/*
+*****************************************************************************
+*                         LOCAL VARIABLES AND TABLES
+*****************************************************************************
+*/
+
+/*
+*****************************************************************************
+*                         PUBLIC PROGRAM CODE
+*****************************************************************************
+*/
+
+/*************************************************************************
+ *
+ *  Function:   ton_stab_reset
+ *  Purpose:    Initializes state memory to zero
+ *
+ **************************************************************************
+ */
+void ton_stab_reset (tonStabState *st)
+{
+    /* initialize tone stabilizer state */ 
+    st->count = 0;
+    Set_zero(st->gp, N_FRAME);    /* Init Gp_Clipping */
+}
+
+/***************************************************************************
+ *                                                                          *
+ *  Function:  check_lsp()                                                  *
+ *  Purpose:   Check the LSP's to detect resonances                         *
+ *                                                                          *
+ ****************************************************************************
+ */
+Word16 check_lsp(tonStabState *st, /* i/o : State struct            */
+                 Word16 *lsp       /* i   : unquantized LSP's       */
+)
+{
+   Word16 i, dist, dist_min1, dist_min2, dist_th;
+ 
+   /* Check for a resonance:                             */
+   /* Find minimum distance between lsp[i] and lsp[i+1]  */
+ 
+   dist_min1 = MAX_16;                       move16 ();
+   for (i = 3; i < M-2; i++)
+   {
+      dist = sub(lsp[i], lsp[i+1]);
+
+      test ();
+      if (sub(dist, dist_min1) < 0)
+      {
+         dist_min1 = dist;                   move16 ();
+      }
+   }
+
+   dist_min2 = MAX_16;                       move16 ();
+   for (i = 1; i < 3; i++)
+   {
+      dist = sub(lsp[i], lsp[i+1]);
+
+      test ();
+      if (sub(dist, dist_min2) < 0)
+      {
+         dist_min2 = dist;                   move16 ();
+      }
+   }
+
+   if (test (), sub(lsp[1], 32000) > 0)
+   {
+      dist_th = 600;                         move16 ();
+   }
+   else if (test (), sub(lsp[1], 30500) > 0)
+   {
+      dist_th = 800;                         move16 ();
+   }
+   else
+   {
+      dist_th = 1100;                        move16 ();
+   }
+
+   test (); test ();
+   if (sub(dist_min1, 1500) < 0 ||
+       sub(dist_min2, dist_th) < 0)
+   {
+      st->count = add(st->count, 1);
+   }
+   else
+   {
+      st->count = 0;                         move16 ();
+   }
+   
+   /* Need 12 consecutive frames to set the flag */
+   test ();
+   if (sub(st->count, 12) >= 0)
+   {
+      st->count = 12;                        move16 ();
+      return 1;
+   }
+   else
+   {
+      return 0;
+   }
+}
+
+/***************************************************************************
+ *
+ *  Function:   Check_Gp_Clipping()                                          
+ *  Purpose:    Verify that the sum of the last (N_FRAME+1) pitch  
+ *              gains is under a certain threshold.              
+ *                                                                         
+ ***************************************************************************
+ */ 
+Word16 check_gp_clipping(tonStabState *st, /* i/o : State struct            */
+                         Word16 g_pitch    /* i   : pitch gain              */
+)
+{
+   Word16 i, sum;
+   
+   sum = shr(g_pitch, 3);          /* Division by 8 */
+   for (i = 0; i < N_FRAME; i++)
+   {
+      sum = add(sum, st->gp[i]);
+   }
+
+   test ();
+   if (sub(sum, GP_CLIP) > 0)
+   {
+      return 1;
+   }
+   else
+   {
+      return 0;
+   }
+}
+
+/***************************************************************************
+ *
+ *  Function:  Update_Gp_Clipping()                                          
+ *  Purpose:   Update past pitch gain memory
+ *                                                                         
+ ***************************************************************************
+ */
+void update_gp_clipping(tonStabState *st, /* i/o : State struct            */
+                        Word16 g_pitch    /* i   : pitch gain              */
+)
+{
+   Copy(&st->gp[1], &st->gp[0], N_FRAME-1);
+   st->gp[N_FRAME-1] = shr(g_pitch, 3);
+}