diff libgsmefr/int_lpc.c @ 53:49dd1ac8e75b

libgsmefr: import most *.c files from ETSI source
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 25 Nov 2022 16:18:21 +0000
parents
children a0a1e8de4b46
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmefr/int_lpc.c	Fri Nov 25 16:18:21 2022 +0000
@@ -0,0 +1,112 @@
+/*************************************************************************
+ *
+ *  FUNCTION:  Int_lpc()
+ *
+ *  PURPOSE:  Interpolates the LSPs and converts to LPC parameters to get
+ *            a different LP filter in each subframe.
+ *
+ *  DESCRIPTION:
+ *     The 20 ms speech frame is divided into 4 subframes.
+ *     The LSPs are quantized and transmitted at the 2nd and 4th subframes
+ *     (twice per frame) and interpolated at the 1st and 3rd subframe.
+ *
+ *          |------|------|------|------|
+ *             sf1    sf2    sf3    sf4
+ *       F0            Fm            F1
+ *
+ *     sf1:   1/2 Fm + 1/2 F0         sf3:   1/2 F1 + 1/2 Fm
+ *     sf2:       Fm                  sf4:       F1
+ *
+ *************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "count.h"
+#include "sig_proc.h"
+
+#define M   10                  /* LP order */
+#define MP1 11                  /* M+1 */
+
+void Int_lpc (
+    Word16 lsp_old[],   /* input : LSP vector at the 4th subframe
+                           of past frame    */
+    Word16 lsp_mid[],   /* input : LSP vector at the 2nd subframe
+                           of present frame */
+    Word16 lsp_new[],   /* input : LSP vector at the 4th subframe of
+                           present frame */
+    Word16 Az[]         /* output: interpolated LP parameters in
+                           all subframes */
+)
+{
+    Word16 i;
+    Word16 lsp[M];
+
+    /*  lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */
+
+    for (i = 0; i < M; i++)
+    {
+        lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_old[i], 1));
+                                move16 (); 
+    }
+
+    Lsp_Az (lsp, Az);           /* Subframe 1 */
+    Az += MP1;                  move16 (); 
+
+    Lsp_Az (lsp_mid, Az);       /* Subframe 2 */
+    Az += MP1;                  move16 (); 
+
+    for (i = 0; i < M; i++)
+    {
+        lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_new[i], 1));
+                                move16 (); 
+    }
+
+    Lsp_Az (lsp, Az);           /* Subframe 3 */
+    Az += MP1;                  move16 (); 
+
+    Lsp_Az (lsp_new, Az);       /* Subframe 4 */
+
+    return;
+}
+
+/*----------------------------------------------------------------------*
+ * Function Int_lpc2()                                                  *
+ * ~~~~~~~~~~~~~~~~~~                                                   *
+ * Interpolation of the LPC parameters.                                 *
+ * Same as the previous function but we do not recompute Az() for       *
+ * subframe 2 and 4 because it is already available.                    *
+ *----------------------------------------------------------------------*/
+
+void Int_lpc2 (
+             Word16 lsp_old[],  /* input : LSP vector at the 4th subframe
+                                 of past frame    */
+             Word16 lsp_mid[],  /* input : LSP vector at the 2nd subframe
+                                 of present frame */
+             Word16 lsp_new[],  /* input : LSP vector at the 4th subframe of
+                                 present frame */
+             Word16 Az[]        /* output: interpolated LP parameters
+                                 in subframes 1 and 3 */
+)
+{
+    Word16 i;
+    Word16 lsp[M];
+
+    /*  lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */
+
+    for (i = 0; i < M; i++)
+    {
+        lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_old[i], 1));
+                                move16 (); 
+    }
+    Lsp_Az (lsp, Az);           /* Subframe 1 */
+    Az += MP1 * 2;              move16 (); 
+
+    for (i = 0; i < M; i++)
+    {
+        lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_new[i], 1));
+                                move16 (); 
+    }
+    Lsp_Az (lsp, Az);           /* Subframe 3 */
+
+    return;
+}