]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
dos2unix gsm
authorMichael Jerris <mike@jerris.com>
Thu, 30 Mar 2006 01:34:04 +0000 (01:34 +0000)
committerMichael Jerris <mike@jerris.com>
Thu, 30 Mar 2006 01:34:04 +0000 (01:34 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@966 d0543943-73ff-0310-b7d9-9358b9ac24b2

19 files changed:
libs/codec/gsm/inc/config.h
libs/codec/gsm/inc/gsm.h
libs/codec/gsm/inc/private.h
libs/codec/gsm/inc/proto.h
libs/codec/gsm/inc/unproto.h
libs/codec/gsm/src/add.c
libs/codec/gsm/src/code.c
libs/codec/gsm/src/decode.c
libs/codec/gsm/src/gsm_create.c
libs/codec/gsm/src/gsm_decode.c
libs/codec/gsm/src/gsm_destroy.c
libs/codec/gsm/src/gsm_encode.c
libs/codec/gsm/src/gsm_lpc.c
libs/codec/gsm/src/gsm_option.c
libs/codec/gsm/src/long_term.c
libs/codec/gsm/src/preprocess.c
libs/codec/gsm/src/rpe.c
libs/codec/gsm/src/short_term.c
libs/codec/gsm/src/table.c

index 1973b6363e86276bf36f4b8c161b357c6b47e052..314c2a41b8cac6fc5dd5099e357089b5f59d0c60 100644 (file)
@@ -1,38 +1,38 @@
-/*\r
- * config.h\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#ifndef        CONFIG_H\r
-#define        CONFIG_H\r
-\r
-/*efine        SIGHANDLER_T    int             * signal handlers are void      */\r
-/*efine HAS_SYSV_SIGNAL        1               * sigs not blocked/reset?       */\r
-\r
-#define        HAS_STDLIB_H    1               /* /usr/include/stdlib.h        */\r
-/*efine        HAS_LIMITS_H    1               * /usr/include/limits.h */\r
-#define        HAS_FCNTL_H     1               /* /usr/include/fcntl.h         */\r
-/*efine        HAS_ERRNO_DECL  1               * errno.h declares errno        */\r
-\r
-#define        HAS_FSTAT       1               /* fstat syscall                */\r
-#define        HAS_FCHMOD      1               /* fchmod syscall               */\r
-#define        HAS_CHMOD       1               /* chmod syscall                */\r
-#define        HAS_FCHOWN      1               /* fchown syscall               */\r
-#define        HAS_CHOWN       1               /* chown syscall                */\r
-/*efine        HAS__FSETMODE   1               * _fsetmode -- set file mode    */\r
-\r
-#define        HAS_STRING_H    1               /* /usr/include/string.h        */\r
-/*efine        HAS_STRINGS_H   1               * /usr/include/strings.h        */\r
-\r
-#define        HAS_UNISTD_H    1               /* /usr/include/unistd.h        */\r
-#define        HAS_UTIME       1               /* POSIX utime(path, times)     */\r
-/*efine        HAS_UTIMES      1               * use utimes()  syscall instead */\r
-#define        HAS_UTIME_H     1               /* UTIME header file            */\r
-/*efine        HAS_UTIMBUF     1               * struct utimbuf                */\r
-/*efine        HAS_UTIMEUSEC   1               * microseconds in utimbuf?      */\r
-\r
-#endif /* CONFIG_H */\r
+/*
+ * config.h
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#ifndef        CONFIG_H
+#define        CONFIG_H
+
+/*efine        SIGHANDLER_T    int             * signal handlers are void      */
+/*efine HAS_SYSV_SIGNAL        1               * sigs not blocked/reset?       */
+
+#define        HAS_STDLIB_H    1               /* /usr/include/stdlib.h        */
+/*efine        HAS_LIMITS_H    1               * /usr/include/limits.h */
+#define        HAS_FCNTL_H     1               /* /usr/include/fcntl.h         */
+/*efine        HAS_ERRNO_DECL  1               * errno.h declares errno        */
+
+#define        HAS_FSTAT       1               /* fstat syscall                */
+#define        HAS_FCHMOD      1               /* fchmod syscall               */
+#define        HAS_CHMOD       1               /* chmod syscall                */
+#define        HAS_FCHOWN      1               /* fchown syscall               */
+#define        HAS_CHOWN       1               /* chown syscall                */
+/*efine        HAS__FSETMODE   1               * _fsetmode -- set file mode    */
+
+#define        HAS_STRING_H    1               /* /usr/include/string.h        */
+/*efine        HAS_STRINGS_H   1               * /usr/include/strings.h        */
+
+#define        HAS_UNISTD_H    1               /* /usr/include/unistd.h        */
+#define        HAS_UTIME       1               /* POSIX utime(path, times)     */
+/*efine        HAS_UTIMES      1               * use utimes()  syscall instead */
+#define        HAS_UTIME_H     1               /* UTIME header file            */
+/*efine        HAS_UTIMBUF     1               * struct utimbuf                */
+/*efine        HAS_UTIMEUSEC   1               * microseconds in utimbuf?      */
+
+#endif /* CONFIG_H */
index cf0145d2fb7159dc47f4668234158646d50dfb6d..77e0a57d99e06e69280ead1b9191a04ab8e63199 100644 (file)
@@ -1,72 +1,72 @@
-/*\r
- * gsm.h\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#ifndef        GSM_H\r
-#define        GSM_H\r
-\r
-#ifdef __cplusplus\r
-#      define  NeedFunctionPrototypes  1\r
-#endif\r
-\r
-#if __STDC__\r
-#      define  NeedFunctionPrototypes  1\r
-#endif\r
-\r
-#ifdef _NO_PROTO\r
-#      undef   NeedFunctionPrototypes\r
-#endif\r
-\r
-#ifdef NeedFunctionPrototypes\r
-#   include    <stdio.h>               /* for FILE *   */\r
-#endif\r
-\r
-#undef GSM_P\r
-#if NeedFunctionPrototypes\r
-#      define  GSM_P( protos ) protos\r
-#else\r
-#      define  GSM_P( protos ) ( /* protos */ )\r
-#endif\r
-\r
-/*\r
- *     Interface\r
- */\r
-\r
-typedef struct gsm_state *     gsm;\r
-typedef short                  gsm_signal;             /* signed 16 bit */\r
-typedef unsigned char          gsm_byte;\r
-typedef gsm_byte               gsm_frame[33];          /* 33 * 8 bits   */\r
-\r
-#define        GSM_MAGIC               0xD                     /* 13 kbit/s RPE-LTP */\r
-\r
-#define        GSM_PATCHLEVEL          10\r
-#define        GSM_MINOR               0\r
-#define        GSM_MAJOR               1\r
-\r
-#define        GSM_OPT_VERBOSE         1\r
-#define        GSM_OPT_FAST            2\r
-#define        GSM_OPT_LTP_CUT         3\r
-#define        GSM_OPT_WAV49           4\r
-#define        GSM_OPT_FRAME_INDEX     5\r
-#define        GSM_OPT_FRAME_CHAIN     6\r
-\r
-extern gsm  gsm_create         GSM_P((void));\r
-extern void gsm_destroy GSM_P((gsm));  \r
-\r
-extern int  gsm_print   GSM_P((FILE *, gsm, gsm_byte  *));\r
-extern int  gsm_option  GSM_P((gsm, int, int *));\r
-\r
-extern void gsm_encode  GSM_P((gsm, gsm_signal *, gsm_byte  *));\r
-extern int  gsm_decode  GSM_P((gsm, gsm_byte   *, gsm_signal *));\r
-\r
-extern int  gsm_explode GSM_P((gsm, gsm_byte   *, gsm_signal *));\r
-extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte   *));\r
-\r
-#undef GSM_P\r
-\r
-#endif /* GSM_H */\r
+/*
+ * gsm.h
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#ifndef        GSM_H
+#define        GSM_H
+
+#ifdef __cplusplus
+#      define  NeedFunctionPrototypes  1
+#endif
+
+#if __STDC__
+#      define  NeedFunctionPrototypes  1
+#endif
+
+#ifdef _NO_PROTO
+#      undef   NeedFunctionPrototypes
+#endif
+
+#ifdef NeedFunctionPrototypes
+#   include    <stdio.h>               /* for FILE *   */
+#endif
+
+#undef GSM_P
+#if NeedFunctionPrototypes
+#      define  GSM_P( protos ) protos
+#else
+#      define  GSM_P( protos ) ( /* protos */ )
+#endif
+
+/*
+ *     Interface
+ */
+
+typedef struct gsm_state *     gsm;
+typedef short                  gsm_signal;             /* signed 16 bit */
+typedef unsigned char          gsm_byte;
+typedef gsm_byte               gsm_frame[33];          /* 33 * 8 bits   */
+
+#define        GSM_MAGIC               0xD                     /* 13 kbit/s RPE-LTP */
+
+#define        GSM_PATCHLEVEL          10
+#define        GSM_MINOR               0
+#define        GSM_MAJOR               1
+
+#define        GSM_OPT_VERBOSE         1
+#define        GSM_OPT_FAST            2
+#define        GSM_OPT_LTP_CUT         3
+#define        GSM_OPT_WAV49           4
+#define        GSM_OPT_FRAME_INDEX     5
+#define        GSM_OPT_FRAME_CHAIN     6
+
+extern gsm  gsm_create         GSM_P((void));
+extern void gsm_destroy GSM_P((gsm));  
+
+extern int  gsm_print   GSM_P((FILE *, gsm, gsm_byte  *));
+extern int  gsm_option  GSM_P((gsm, int, int *));
+
+extern void gsm_encode  GSM_P((gsm, gsm_signal *, gsm_byte  *));
+extern int  gsm_decode  GSM_P((gsm, gsm_byte   *, gsm_signal *));
+
+extern int  gsm_explode GSM_P((gsm, gsm_byte   *, gsm_signal *));
+extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte   *));
+
+#undef GSM_P
+
+#endif /* GSM_H */
index f0ee16d72a0f6b5e5c0ea11ef63697935e460a6f..46071a662db8cb6763f9a7cff9ac94ed81711d37 100644 (file)
-/*\r
- * private.h\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#ifndef        PRIVATE_H\r
-#define        PRIVATE_H\r
-\r
-typedef short                  word;           /* 16 bit signed int    */\r
-typedef long                   longword;       /* 32 bit signed int    */\r
-\r
-typedef unsigned short         uword;          /* unsigned word        */\r
-typedef unsigned long          ulongword;      /* unsigned longword    */\r
-\r
-struct gsm_state {\r
-\r
-       word            dp0[ 280 ];\r
-\r
-       word            z1;             /* preprocessing.c, Offset_com. */\r
-       longword        L_z2;           /*                  Offset_com. */\r
-       int             mp;             /*                  Preemphasis */\r
-\r
-       word            u[8];           /* short_term_aly_filter.c      */\r
-       word            LARpp[2][8];    /*                              */\r
-       word            j;              /*                              */\r
-\r
-       word            ltp_cut;        /* long_term.c, LTP crosscorr.  */\r
-       word            nrp; /* 40 */   /* long_term.c, synthesis       */\r
-       word            v[9];           /* short_term.c, synthesis      */\r
-       word            msr;            /* decoder.c,   Postprocessing  */\r
-\r
-       char            verbose;        /* only used if !NDEBUG         */\r
-       char            fast;           /* only used if FAST            */\r
-\r
-       char            wav_fmt;        /* only used if WAV49 defined   */\r
-       unsigned char   frame_index;    /*            odd/even chaining */\r
-       unsigned char   frame_chain;    /*   half-byte to carry forward */\r
-};\r
-\r
-\r
-#define        MIN_WORD        (-32767 - 1)\r
-#define        MAX_WORD          32767\r
-\r
-#define        MIN_LONGWORD    (-2147483647 - 1)\r
-#define        MAX_LONGWORD      2147483647\r
-\r
-#ifdef SASR            /* flag: >> is a signed arithmetic shift right */\r
-#undef SASR\r
-#define        SASR(x, by)     ((x) >> (by))\r
-#else\r
-#define        SASR(x, by)     ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by))))\r
-#endif /* SASR */\r
-\r
-#include "proto.h"\r
-\r
-/*\r
- *     Prototypes from add.c\r
- */\r
-extern word    gsm_mult        P((word a, word b));\r
-extern longword gsm_L_mult     P((word a, word b));\r
-extern word    gsm_mult_r      P((word a, word b));\r
-\r
-extern word    gsm_div         P((word num, word denum));\r
-\r
-extern word    gsm_add         P(( word a, word b ));\r
-extern longword gsm_L_add      P(( longword a, longword b ));\r
-\r
-extern word    gsm_sub         P((word a, word b));\r
-extern longword gsm_L_sub      P((longword a, longword b));\r
-\r
-extern word    gsm_abs         P((word a));\r
-\r
-extern word    gsm_norm        P(( longword a ));\r
-\r
-extern longword gsm_L_asl      P((longword a, int n));\r
-extern word    gsm_asl         P((word a, int n));\r
-\r
-extern longword gsm_L_asr      P((longword a, int n));\r
-extern word    gsm_asr         P((word a, int n));\r
-\r
-/*\r
- *  Inlined functions from add.h \r
- */\r
-\r
-/* \r
- * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *)        \\r
- *     (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15))\r
- */\r
-#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */   \\r
-       (SASR( ((longword)(a) * (longword)(b) + 16384), 15 ))\r
-\r
-# define GSM_MULT(a,b)  /* word a, word b, !(a == b == MIN_WORD) */    \\r
-       (SASR( ((longword)(a) * (longword)(b)), 15 ))\r
-\r
-# define GSM_L_MULT(a, b) /* word a, word b */ \\r
-       (((longword)(a) * (longword)(b)) << 1)\r
-\r
-# define GSM_L_ADD(a, b)       \\r
-       ( (a) <  0 ? ( (b) >= 0 ? (a) + (b)     \\r
-                : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \\r
-                  >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 )   \\r
-       : ((b) <= 0 ? (a) + (b)   \\r
-                 : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \\r
-                   ? MAX_LONGWORD : utmp))\r
-\r
-/*\r
- * # define GSM_ADD(a, b)      \\r
- *     ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \\r
- *     ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)\r
- */\r
-/* Nonportable, but faster: */\r
-\r
-#define        GSM_ADD(a, b)   \\r
-       ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \\r
-               MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp)\r
-\r
-# define GSM_SUB(a, b) \\r
-       ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \\r
-       ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)\r
-\r
-# define GSM_ABS(a)    ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))\r
-\r
-/* Use these if necessary:\r
-\r
-# define GSM_MULT_R(a, b)      gsm_mult_r(a, b)\r
-# define GSM_MULT(a, b)                gsm_mult(a, b)\r
-# define GSM_L_MULT(a, b)      gsm_L_mult(a, b)\r
-\r
-# define GSM_L_ADD(a, b)       gsm_L_add(a, b)\r
-# define GSM_ADD(a, b)         gsm_add(a, b)\r
-# define GSM_SUB(a, b)         gsm_sub(a, b)\r
-\r
-# define GSM_ABS(a)            gsm_abs(a)\r
-\r
-*/\r
-\r
-/*\r
- *  More prototypes from implementations..\r
- */\r
-extern void Gsm_Coder P((\r
-               struct gsm_state        * S,\r
-               word    * s,    /* [0..159] samples             IN      */\r
-               word    * LARc, /* [0..7] LAR coefficients      OUT     */\r
-               word    * Nc,   /* [0..3] LTP lag               OUT     */\r
-               word    * bc,   /* [0..3] coded LTP gain        OUT     */\r
-               word    * Mc,   /* [0..3] RPE grid selection    OUT     */\r
-               word    * xmaxc,/* [0..3] Coded maximum amplitude OUT   */\r
-               word    * xMc   /* [13*4] normalized RPE samples OUT    */));\r
-\r
-extern void Gsm_Long_Term_Predictor P((                /* 4x for 160 samples */\r
-               struct gsm_state * S,\r
-               word    * d,    /* [0..39]   residual signal    IN      */\r
-               word    * dp,   /* [-120..-1] d'                IN      */\r
-               word    * e,    /* [0..40]                      OUT     */\r
-               word    * dpp,  /* [0..40]                      OUT     */\r
-               word    * Nc,   /* correlation lag              OUT     */\r
-               word    * bc    /* gain factor                  OUT     */));\r
-\r
-extern void Gsm_LPC_Analysis P((\r
-               struct gsm_state * S,\r
-               word * s,        /* 0..159 signals      IN/OUT  */\r
-               word * LARc));   /* 0..7   LARc's       OUT     */\r
-\r
-extern void Gsm_Preprocess P((\r
-               struct gsm_state * S,\r
-               word * s, word * so));\r
-\r
-extern void Gsm_Encoding P((\r
-               struct gsm_state * S,\r
-               word    * e,    \r
-               word    * ep,   \r
-               word    * xmaxc,\r
-               word    * Mc,   \r
-               word    * xMc));\r
-\r
-extern void Gsm_Short_Term_Analysis_Filter P((\r
-               struct gsm_state * S,\r
-               word    * LARc, /* coded log area ratio [0..7]  IN      */\r
-               word    * d     /* st res. signal [0..159]      IN/OUT  */));\r
-\r
-extern void Gsm_Decoder P((\r
-               struct gsm_state * S,\r
-               word    * LARcr,        /* [0..7]               IN      */\r
-               word    * Ncr,          /* [0..3]               IN      */\r
-               word    * bcr,          /* [0..3]               IN      */\r
-               word    * Mcr,          /* [0..3]               IN      */\r
-               word    * xmaxcr,       /* [0..3]               IN      */\r
-               word    * xMcr,         /* [0..13*4]            IN      */\r
-               word    * s));          /* [0..159]             OUT     */\r
-\r
-extern void Gsm_Decoding P((\r
-               struct gsm_state * S,\r
-               word    xmaxcr,\r
-               word    Mcr,\r
-               word    * xMcr,         /* [0..12]              IN      */\r
-               word    * erp));        /* [0..39]              OUT     */\r
-\r
-extern void Gsm_Long_Term_Synthesis_Filtering P((\r
-               struct gsm_state* S,\r
-               word    Ncr,\r
-               word    bcr,\r
-               word    * erp,          /* [0..39]                IN    */\r
-               word    * drp));        /* [-120..-1] IN, [0..40] OUT   */\r
-\r
-void Gsm_RPE_Decoding P((\r
-       struct gsm_state *S,\r
-               word xmaxcr,\r
-               word Mcr,\r
-               word * xMcr,  /* [0..12], 3 bits             IN      */\r
-               word * erp)); /* [0..39]                     OUT     */\r
-\r
-void Gsm_RPE_Encoding P((\r
-               struct gsm_state * S,\r
-               word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */\r
-               word    * xmaxc,        /*                              OUT */\r
-               word    * Mc,           /*                              OUT */\r
-               word    * xMc));        /* [0..12]                      OUT */\r
-\r
-extern void Gsm_Short_Term_Synthesis_Filter P((\r
-               struct gsm_state * S,\r
-               word    * LARcr,        /* log area ratios [0..7]  IN   */\r
-               word    * drp,          /* received d [0...39]     IN   */\r
-               word    * s));          /* signal   s [0..159]    OUT   */\r
-\r
-extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((\r
-               word    * dpp,          /* [0...39]     IN      */\r
-               word    * ep,           /* [0...39]     IN      */\r
-               word    * dp));         /* [-120...-1]  IN/OUT  */\r
-\r
-/*\r
- *  Tables from table.c\r
- */\r
-#ifndef        GSM_TABLE_C\r
-\r
-extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8];\r
-extern word gsm_INVA[8];\r
-extern word gsm_DLB[4], gsm_QLB[4];\r
-extern word gsm_H[11];\r
-extern word gsm_NRFAC[8];\r
-extern word gsm_FAC[8];\r
-\r
-#endif /* GSM_TABLE_C */\r
-\r
-/*\r
- *  Debugging\r
- */\r
-#ifdef NDEBUG\r
-\r
-#      define  gsm_debug_words(a, b, c, d)             /* nil */\r
-#      define  gsm_debug_longwords(a, b, c, d)         /* nil */\r
-#      define  gsm_debug_word(a, b)                    /* nil */\r
-#      define  gsm_debug_longword(a, b)                /* nil */\r
-\r
-#else  /* !NDEBUG => DEBUG */\r
-\r
-       extern void  gsm_debug_words     P((char * name, int, int, word *));\r
-       extern void  gsm_debug_longwords P((char * name, int, int, longword *));\r
-       extern void  gsm_debug_longword  P((char * name, longword));\r
-       extern void  gsm_debug_word      P((char * name, word));\r
-\r
-#endif /* !NDEBUG */\r
-\r
-#include "unproto.h"\r
-\r
-#endif /* PRIVATE_H */\r
+/*
+ * private.h
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#ifndef        PRIVATE_H
+#define        PRIVATE_H
+
+typedef short                  word;           /* 16 bit signed int    */
+typedef long                   longword;       /* 32 bit signed int    */
+
+typedef unsigned short         uword;          /* unsigned word        */
+typedef unsigned long          ulongword;      /* unsigned longword    */
+
+struct gsm_state {
+
+       word            dp0[ 280 ];
+
+       word            z1;             /* preprocessing.c, Offset_com. */
+       longword        L_z2;           /*                  Offset_com. */
+       int             mp;             /*                  Preemphasis */
+
+       word            u[8];           /* short_term_aly_filter.c      */
+       word            LARpp[2][8];    /*                              */
+       word            j;              /*                              */
+
+       word            ltp_cut;        /* long_term.c, LTP crosscorr.  */
+       word            nrp; /* 40 */   /* long_term.c, synthesis       */
+       word            v[9];           /* short_term.c, synthesis      */
+       word            msr;            /* decoder.c,   Postprocessing  */
+
+       char            verbose;        /* only used if !NDEBUG         */
+       char            fast;           /* only used if FAST            */
+
+       char            wav_fmt;        /* only used if WAV49 defined   */
+       unsigned char   frame_index;    /*            odd/even chaining */
+       unsigned char   frame_chain;    /*   half-byte to carry forward */
+};
+
+
+#define        MIN_WORD        (-32767 - 1)
+#define        MAX_WORD          32767
+
+#define        MIN_LONGWORD    (-2147483647 - 1)
+#define        MAX_LONGWORD      2147483647
+
+#ifdef SASR            /* flag: >> is a signed arithmetic shift right */
+#undef SASR
+#define        SASR(x, by)     ((x) >> (by))
+#else
+#define        SASR(x, by)     ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by))))
+#endif /* SASR */
+
+#include "proto.h"
+
+/*
+ *     Prototypes from add.c
+ */
+extern word    gsm_mult        P((word a, word b));
+extern longword gsm_L_mult     P((word a, word b));
+extern word    gsm_mult_r      P((word a, word b));
+
+extern word    gsm_div         P((word num, word denum));
+
+extern word    gsm_add         P(( word a, word b ));
+extern longword gsm_L_add      P(( longword a, longword b ));
+
+extern word    gsm_sub         P((word a, word b));
+extern longword gsm_L_sub      P((longword a, longword b));
+
+extern word    gsm_abs         P((word a));
+
+extern word    gsm_norm        P(( longword a ));
+
+extern longword gsm_L_asl      P((longword a, int n));
+extern word    gsm_asl         P((word a, int n));
+
+extern longword gsm_L_asr      P((longword a, int n));
+extern word    gsm_asr         P((word a, int n));
+
+/*
+ *  Inlined functions from add.h 
+ */
+
+/* 
+ * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *)        \
+ *     (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15))
+ */
+#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */   \
+       (SASR( ((longword)(a) * (longword)(b) + 16384), 15 ))
+
+# define GSM_MULT(a,b)  /* word a, word b, !(a == b == MIN_WORD) */    \
+       (SASR( ((longword)(a) * (longword)(b)), 15 ))
+
+# define GSM_L_MULT(a, b) /* word a, word b */ \
+       (((longword)(a) * (longword)(b)) << 1)
+
+# define GSM_L_ADD(a, b)       \
+       ( (a) <  0 ? ( (b) >= 0 ? (a) + (b)     \
+                : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \
+                  >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 )   \
+       : ((b) <= 0 ? (a) + (b)   \
+                 : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \
+                   ? MAX_LONGWORD : utmp))
+
+/*
+ * # define GSM_ADD(a, b)      \
+ *     ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \
+ *     ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
+ */
+/* Nonportable, but faster: */
+
+#define        GSM_ADD(a, b)   \
+       ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \
+               MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp)
+
+# define GSM_SUB(a, b) \
+       ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \
+       ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
+
+# define GSM_ABS(a)    ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))
+
+/* Use these if necessary:
+
+# define GSM_MULT_R(a, b)      gsm_mult_r(a, b)
+# define GSM_MULT(a, b)                gsm_mult(a, b)
+# define GSM_L_MULT(a, b)      gsm_L_mult(a, b)
+
+# define GSM_L_ADD(a, b)       gsm_L_add(a, b)
+# define GSM_ADD(a, b)         gsm_add(a, b)
+# define GSM_SUB(a, b)         gsm_sub(a, b)
+
+# define GSM_ABS(a)            gsm_abs(a)
+
+*/
+
+/*
+ *  More prototypes from implementations..
+ */
+extern void Gsm_Coder P((
+               struct gsm_state        * S,
+               word    * s,    /* [0..159] samples             IN      */
+               word    * LARc, /* [0..7] LAR coefficients      OUT     */
+               word    * Nc,   /* [0..3] LTP lag               OUT     */
+               word    * bc,   /* [0..3] coded LTP gain        OUT     */
+               word    * Mc,   /* [0..3] RPE grid selection    OUT     */
+               word    * xmaxc,/* [0..3] Coded maximum amplitude OUT   */
+               word    * xMc   /* [13*4] normalized RPE samples OUT    */));
+
+extern void Gsm_Long_Term_Predictor P((                /* 4x for 160 samples */
+               struct gsm_state * S,
+               word    * d,    /* [0..39]   residual signal    IN      */
+               word    * dp,   /* [-120..-1] d'                IN      */
+               word    * e,    /* [0..40]                      OUT     */
+               word    * dpp,  /* [0..40]                      OUT     */
+               word    * Nc,   /* correlation lag              OUT     */
+               word    * bc    /* gain factor                  OUT     */));
+
+extern void Gsm_LPC_Analysis P((
+               struct gsm_state * S,
+               word * s,        /* 0..159 signals      IN/OUT  */
+               word * LARc));   /* 0..7   LARc's       OUT     */
+
+extern void Gsm_Preprocess P((
+               struct gsm_state * S,
+               word * s, word * so));
+
+extern void Gsm_Encoding P((
+               struct gsm_state * S,
+               word    * e,    
+               word    * ep,   
+               word    * xmaxc,
+               word    * Mc,   
+               word    * xMc));
+
+extern void Gsm_Short_Term_Analysis_Filter P((
+               struct gsm_state * S,
+               word    * LARc, /* coded log area ratio [0..7]  IN      */
+               word    * d     /* st res. signal [0..159]      IN/OUT  */));
+
+extern void Gsm_Decoder P((
+               struct gsm_state * S,
+               word    * LARcr,        /* [0..7]               IN      */
+               word    * Ncr,          /* [0..3]               IN      */
+               word    * bcr,          /* [0..3]               IN      */
+               word    * Mcr,          /* [0..3]               IN      */
+               word    * xmaxcr,       /* [0..3]               IN      */
+               word    * xMcr,         /* [0..13*4]            IN      */
+               word    * s));          /* [0..159]             OUT     */
+
+extern void Gsm_Decoding P((
+               struct gsm_state * S,
+               word    xmaxcr,
+               word    Mcr,
+               word    * xMcr,         /* [0..12]              IN      */
+               word    * erp));        /* [0..39]              OUT     */
+
+extern void Gsm_Long_Term_Synthesis_Filtering P((
+               struct gsm_state* S,
+               word    Ncr,
+               word    bcr,
+               word    * erp,          /* [0..39]                IN    */
+               word    * drp));        /* [-120..-1] IN, [0..40] OUT   */
+
+void Gsm_RPE_Decoding P((
+       struct gsm_state *S,
+               word xmaxcr,
+               word Mcr,
+               word * xMcr,  /* [0..12], 3 bits             IN      */
+               word * erp)); /* [0..39]                     OUT     */
+
+void Gsm_RPE_Encoding P((
+               struct gsm_state * S,
+               word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */
+               word    * xmaxc,        /*                              OUT */
+               word    * Mc,           /*                              OUT */
+               word    * xMc));        /* [0..12]                      OUT */
+
+extern void Gsm_Short_Term_Synthesis_Filter P((
+               struct gsm_state * S,
+               word    * LARcr,        /* log area ratios [0..7]  IN   */
+               word    * drp,          /* received d [0...39]     IN   */
+               word    * s));          /* signal   s [0..159]    OUT   */
+
+extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((
+               word    * dpp,          /* [0...39]     IN      */
+               word    * ep,           /* [0...39]     IN      */
+               word    * dp));         /* [-120...-1]  IN/OUT  */
+
+/*
+ *  Tables from table.c
+ */
+#ifndef        GSM_TABLE_C
+
+extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8];
+extern word gsm_INVA[8];
+extern word gsm_DLB[4], gsm_QLB[4];
+extern word gsm_H[11];
+extern word gsm_NRFAC[8];
+extern word gsm_FAC[8];
+
+#endif /* GSM_TABLE_C */
+
+/*
+ *  Debugging
+ */
+#ifdef NDEBUG
+
+#      define  gsm_debug_words(a, b, c, d)             /* nil */
+#      define  gsm_debug_longwords(a, b, c, d)         /* nil */
+#      define  gsm_debug_word(a, b)                    /* nil */
+#      define  gsm_debug_longword(a, b)                /* nil */
+
+#else  /* !NDEBUG => DEBUG */
+
+       extern void  gsm_debug_words     P((char * name, int, int, word *));
+       extern void  gsm_debug_longwords P((char * name, int, int, longword *));
+       extern void  gsm_debug_longword  P((char * name, longword));
+       extern void  gsm_debug_word      P((char * name, word));
+
+#endif /* !NDEBUG */
+
+#include "unproto.h"
+
+#endif /* PRIVATE_H */
index 7858c4e9ec9777f1f08b4c09d4add9bcedbcff29..4072fb92fd0579738bf57a5fc44e3f1bb09e2fcb 100644 (file)
@@ -1,66 +1,66 @@
-/*\r
- * proto.h\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#ifndef        PROTO_H\r
-#define        PROTO_H\r
-\r
-#if __cplusplus\r
-#      define  NeedFunctionPrototypes  1\r
-#endif\r
-\r
-#if __STDC__\r
-#      define  NeedFunctionPrototypes  1\r
-#endif\r
-\r
-#ifdef _NO_PROTO\r
-#      undef   NeedFunctionPrototypes\r
-#endif\r
-\r
-#undef P       /* gnu stdio.h actually defines this...         */\r
-#undef P0\r
-#undef P1\r
-#undef P2\r
-#undef P3\r
-#undef P4\r
-#undef P5\r
-#undef P6\r
-#undef P7\r
-#undef P8\r
-\r
-#if NeedFunctionPrototypes\r
-\r
-#      define  P( protos )     protos\r
-\r
-#      define  P0()                            (void)\r
-#      define  P1(x, a)                        (a)\r
-#      define  P2(x, a, b)                     (a, b)\r
-#      define  P3(x, a, b, c)                  (a, b, c)\r
-#      define  P4(x, a, b, c, d)               (a, b, c, d)    \r
-#      define  P5(x, a, b, c, d, e)            (a, b, c, d, e)\r
-#      define  P6(x, a, b, c, d, e, f)         (a, b, c, d, e, f)\r
-#      define  P7(x, a, b, c, d, e, f, g)      (a, b, c, d, e, f, g)\r
-#      define  P8(x, a, b, c, d, e, f, g, h)   (a, b, c, d, e, f, g, h)\r
-\r
-#else /* !NeedFunctionPrototypes */\r
-\r
-#      define  P( protos )     ( /* protos */ )\r
-\r
-#      define  P0()                            ()\r
-#      define  P1(x, a)                        x a;\r
-#      define  P2(x, a, b)                     x a; b;\r
-#      define  P3(x, a, b, c)                  x a; b; c;\r
-#      define  P4(x, a, b, c, d)               x a; b; c; d;\r
-#      define  P5(x, a, b, c, d, e)            x a; b; c; d; e;\r
-#      define  P6(x, a, b, c, d, e, f)         x a; b; c; d; e; f;\r
-#      define  P7(x, a, b, c, d, e, f, g)      x a; b; c; d; e; f; g;\r
-#      define  P8(x, a, b, c, d, e, f, g, h)   x a; b; c; d; e; f; g; h;\r
-\r
-#endif  /* !NeedFunctionPrototypes */\r
-\r
-#endif /* PROTO_H */\r
+/*
+ * proto.h
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#ifndef        PROTO_H
+#define        PROTO_H
+
+#if __cplusplus
+#      define  NeedFunctionPrototypes  1
+#endif
+
+#if __STDC__
+#      define  NeedFunctionPrototypes  1
+#endif
+
+#ifdef _NO_PROTO
+#      undef   NeedFunctionPrototypes
+#endif
+
+#undef P       /* gnu stdio.h actually defines this...         */
+#undef P0
+#undef P1
+#undef P2
+#undef P3
+#undef P4
+#undef P5
+#undef P6
+#undef P7
+#undef P8
+
+#if NeedFunctionPrototypes
+
+#      define  P( protos )     protos
+
+#      define  P0()                            (void)
+#      define  P1(x, a)                        (a)
+#      define  P2(x, a, b)                     (a, b)
+#      define  P3(x, a, b, c)                  (a, b, c)
+#      define  P4(x, a, b, c, d)               (a, b, c, d)    
+#      define  P5(x, a, b, c, d, e)            (a, b, c, d, e)
+#      define  P6(x, a, b, c, d, e, f)         (a, b, c, d, e, f)
+#      define  P7(x, a, b, c, d, e, f, g)      (a, b, c, d, e, f, g)
+#      define  P8(x, a, b, c, d, e, f, g, h)   (a, b, c, d, e, f, g, h)
+
+#else /* !NeedFunctionPrototypes */
+
+#      define  P( protos )     ( /* protos */ )
+
+#      define  P0()                            ()
+#      define  P1(x, a)                        x a;
+#      define  P2(x, a, b)                     x a; b;
+#      define  P3(x, a, b, c)                  x a; b; c;
+#      define  P4(x, a, b, c, d)               x a; b; c; d;
+#      define  P5(x, a, b, c, d, e)            x a; b; c; d; e;
+#      define  P6(x, a, b, c, d, e, f)         x a; b; c; d; e; f;
+#      define  P7(x, a, b, c, d, e, f, g)      x a; b; c; d; e; f; g;
+#      define  P8(x, a, b, c, d, e, f, g, h)   x a; b; c; d; e; f; g; h;
+
+#endif  /* !NeedFunctionPrototypes */
+
+#endif /* PROTO_H */
index 3cdb71c2bfbecbe38615bbb00df9874212256938..40ecef4f28349875dd3b3e8bf6c4225eba6d5ea9 100644 (file)
@@ -1,24 +1,24 @@
-/*\r
- * unproto.h\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#ifdef PROTO_H         /* sic */\r
-#undef PROTO_H\r
-\r
-#undef P\r
-#undef P0\r
-#undef P1\r
-#undef P2\r
-#undef P3\r
-#undef P4\r
-#undef P5\r
-#undef P6\r
-#undef P7\r
-#undef P8\r
-\r
-#endif /* PROTO_H */\r
+/*
+ * unproto.h
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#ifdef PROTO_H         /* sic */
+#undef PROTO_H
+
+#undef P
+#undef P0
+#undef P1
+#undef P2
+#undef P3
+#undef P4
+#undef P5
+#undef P6
+#undef P7
+#undef P8
+
+#endif /* PROTO_H */
index 58eae6c1fbde1e43c2c519d2df50e66c0ce7f0bd..cc1b4b3624a549569b16696cce559b1d2af00760 100644 (file)
-/*\r
- * add.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-/*\r
- *  See private.h for the more commonly used macro versions.\r
- */\r
-\r
-#include       <stdio.h>\r
-#include       <assert.h>\r
-\r
-#include       "private.h"\r
-#include       "gsm.h"\r
-#include       "proto.h"\r
-\r
-#define        saturate(x)     \\r
-       ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))\r
-\r
-word gsm_add P2((a,b), word a, word b)\r
-{\r
-       longword sum = (longword)a + (longword)b;\r
-       return (word) saturate(sum);\r
-}\r
-\r
-word gsm_sub P2((a,b), word a, word b)\r
-{\r
-       longword diff = (longword)a - (longword)b;\r
-       return (word) saturate(diff);\r
-}\r
-\r
-word gsm_mult P2((a,b), word a, word b)\r
-{\r
-       if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;\r
-       else return (word) SASR( (longword)a * (longword)b, 15 );\r
-}\r
-\r
-word gsm_mult_r P2((a,b), word a, word b)\r
-{\r
-       if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;\r
-       else {\r
-               longword prod = (longword)a * (longword)b + 16384;\r
-               prod >>= 15;\r
-               return (word) (prod & 0xFFFF);\r
-       }\r
-}\r
-\r
-word gsm_abs P1((a), word a)\r
-{\r
-       return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;\r
-}\r
-\r
-longword gsm_L_mult P2((a,b),word a, word b)\r
-{\r
-       assert( a != MIN_WORD || b != MIN_WORD );\r
-       return ((longword)a * (longword)b) << 1;\r
-}\r
-\r
-longword gsm_L_add P2((a,b), longword a, longword b)\r
-{\r
-       if (a < 0) {\r
-               if (b >= 0) return a + b;\r
-               else {\r
-                       ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);\r
-                       return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;\r
-               }\r
-       }\r
-       else if (b <= 0) return a + b;\r
-       else {\r
-               ulongword A = (ulongword)a + (ulongword)b;\r
-               return A > MAX_LONGWORD ? MAX_LONGWORD : A;\r
-       }\r
-}\r
-\r
-longword gsm_L_sub P2((a,b), longword a, longword b)\r
-{\r
-       if (a >= 0) {\r
-               if (b >= 0) return a - b;\r
-               else {\r
-                       /* a>=0, b<0 */\r
-\r
-                       ulongword A = (ulongword)a + -(b + 1);\r
-                       return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);\r
-               }\r
-       }\r
-       else if (b <= 0) return a - b;\r
-       else {\r
-               /* a<0, b>0 */  \r
-\r
-               ulongword A = (ulongword)-(a + 1) + b;\r
-               return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;\r
-       }\r
-}\r
-\r
-static unsigned char const bitoff[ 256 ] = {\r
-        8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,\r
-        3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r
-        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
-        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\r
-};\r
-\r
-word gsm_norm P1((a), longword a )\r
-/*\r
- * the number of left shifts needed to normalize the 32 bit\r
- * variable L_var1 for positive values on the interval\r
- *\r
- * with minimum of\r
- * minimum of 1073741824  (01000000000000000000000000000000) and \r
- * maximum of 2147483647  (01111111111111111111111111111111)\r
- *\r
- *\r
- * and for negative values on the interval with\r
- * minimum of -2147483648 (-10000000000000000000000000000000) and\r
- * maximum of -1073741824 ( -1000000000000000000000000000000).\r
- *\r
- * in order to normalize the result, the following\r
- * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );\r
- *\r
- * (That's 'ffs', only from the left, not the right..)\r
- */\r
-{\r
-       assert(a != 0);\r
-\r
-       if (a < 0) {\r
-               if (a <= -1073741824) return 0;\r
-               a = ~a;\r
-       }\r
-\r
-       return    a & 0xffff0000 \r
-               ? ( a & 0xff000000\r
-                 ?  -1 + bitoff[ 0xFF & (a >> 24) ]\r
-                 :   7 + bitoff[ 0xFF & (a >> 16) ] )\r
-               : ( a & 0xff00\r
-                 ?  15 + bitoff[ 0xFF & (a >> 8) ]\r
-                 :  23 + bitoff[ 0xFF & a ] );\r
-}\r
-\r
-longword gsm_L_asl P2((a,n), longword a, int n)\r
-{\r
-       if (n >= 32) return 0;\r
-       if (n <= -32) return -(a < 0);\r
-       if (n < 0) return gsm_L_asr(a, -n);\r
-       return a << n;\r
-}\r
-\r
-word gsm_asl P2((a,n), word a, int n)\r
-{\r
-       if (n >= 16) return 0;\r
-       if (n <= -16) return -(a < 0);\r
-       if (n < 0) return gsm_asr(a, -n);\r
-       return a << n;\r
-}\r
-\r
-longword gsm_L_asr P2((a,n), longword a, int n)\r
-{\r
-       if (n >= 32) return -(a < 0);\r
-       if (n <= -32) return 0;\r
-       if (n < 0) return a << -n;\r
-\r
-#      ifdef   SASR\r
-               return a >> n;\r
-#      else\r
-               if (a >= 0) return a >> n;\r
-               else return -(longword)( -(ulongword)a >> n );\r
-#      endif\r
-}\r
-\r
-word gsm_asr P2((a,n), word a, int n)\r
-{\r
-       if (n >= 16) return -(a < 0);\r
-       if (n <= -16) return 0;\r
-       if (n < 0) return a << -n;\r
-\r
-#      ifdef   SASR\r
-               return a >> n;\r
-#      else\r
-               if (a >= 0) return a >> n;\r
-               else return -(word)( -(uword)a >> n );\r
-#      endif\r
-}\r
-\r
-/* \r
- *  (From p. 46, end of section 4.2.5)\r
- *\r
- *  NOTE: The following lines gives [sic] one correct implementation\r
- *       of the div(num, denum) arithmetic operation.  Compute div\r
- *        which is the integer division of num by denum: with denum\r
- *       >= num > 0\r
- */\r
-\r
-word gsm_div P2((num,denum), word num, word denum)\r
-{\r
-       longword        L_num   = num;\r
-       longword        L_denum = denum;\r
-       word            div     = 0;\r
-       int             k       = 15;\r
-\r
-       /* The parameter num sometimes becomes zero.\r
-        * Although this is explicitly guarded against in 4.2.5,\r
-        * we assume that the result should then be zero as well.\r
-        */\r
-\r
-       /* assert(num != 0); */\r
-\r
-       assert(num >= 0 && denum >= num);\r
-       if (num == 0)\r
-           return 0;\r
-\r
-       while (k--) {\r
-               div   <<= 1;\r
-               L_num <<= 1;\r
-\r
-               if (L_num >= L_denum) {\r
-                       L_num -= L_denum;\r
-                       div++;\r
-               }\r
-       }\r
-\r
-       return div;\r
-}\r
+/*
+ * add.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+/*
+ *  See private.h for the more commonly used macro versions.
+ */
+
+#include       <stdio.h>
+#include       <assert.h>
+
+#include       "private.h"
+#include       "gsm.h"
+#include       "proto.h"
+
+#define        saturate(x)     ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
+
+word gsm_add P2((a,b), word a, word b)
+{
+       longword sum = (longword)a + (longword)b;
+       return (word) saturate(sum);
+}
+
+word gsm_sub P2((a,b), word a, word b)
+{
+       longword diff = (longword)a - (longword)b;
+       return (word) saturate(diff);
+}
+
+word gsm_mult P2((a,b), word a, word b)
+{
+       if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;
+       else return (word) SASR( (longword)a * (longword)b, 15 );
+}
+
+word gsm_mult_r P2((a,b), word a, word b)
+{
+       if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
+       else {
+               longword prod = (longword)a * (longword)b + 16384;
+               prod >>= 15;
+               return (word) (prod & 0xFFFF);
+       }
+}
+
+word gsm_abs P1((a), word a)
+{
+       return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
+}
+
+longword gsm_L_mult P2((a,b),word a, word b)
+{
+       assert( a != MIN_WORD || b != MIN_WORD );
+       return ((longword)a * (longword)b) << 1;
+}
+
+longword gsm_L_add P2((a,b), longword a, longword b)
+{
+       if (a < 0) {
+               if (b >= 0) return a + b;
+               else {
+                       ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
+                       return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
+               }
+       }
+       else if (b <= 0) return a + b;
+       else {
+               ulongword A = (ulongword)a + (ulongword)b;
+               return A > MAX_LONGWORD ? MAX_LONGWORD : A;
+       }
+}
+
+longword gsm_L_sub P2((a,b), longword a, longword b)
+{
+       if (a >= 0) {
+               if (b >= 0) return a - b;
+               else {
+                       /* a>=0, b<0 */
+
+                       ulongword A = (ulongword)a + -(b + 1);
+                       return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
+               }
+       }
+       else if (b <= 0) return a - b;
+       else {
+               /* a<0, b>0 */  
+
+               ulongword A = (ulongword)-(a + 1) + b;
+               return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
+       }
+}
+
+static unsigned char const bitoff[ 256 ] = {
+        8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+        3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+word gsm_norm P1((a), longword a )
+/*
+ * the number of left shifts needed to normalize the 32 bit
+ * variable L_var1 for positive values on the interval
+ *
+ * with minimum of
+ * minimum of 1073741824  (01000000000000000000000000000000) and 
+ * maximum of 2147483647  (01111111111111111111111111111111)
+ *
+ *
+ * and for negative values on the interval with
+ * minimum of -2147483648 (-10000000000000000000000000000000) and
+ * maximum of -1073741824 ( -1000000000000000000000000000000).
+ *
+ * in order to normalize the result, the following
+ * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
+ *
+ * (That's 'ffs', only from the left, not the right..)
+ */
+{
+       assert(a != 0);
+
+       if (a < 0) {
+               if (a <= -1073741824) return 0;
+               a = ~a;
+       }
+
+       return    a & 0xffff0000 
+               ? ( a & 0xff000000
+                 ?  -1 + bitoff[ 0xFF & (a >> 24) ]
+                 :   7 + bitoff[ 0xFF & (a >> 16) ] )
+               : ( a & 0xff00
+                 ?  15 + bitoff[ 0xFF & (a >> 8) ]
+                 :  23 + bitoff[ 0xFF & a ] );
+}
+
+longword gsm_L_asl P2((a,n), longword a, int n)
+{
+       if (n >= 32) return 0;
+       if (n <= -32) return -(a < 0);
+       if (n < 0) return gsm_L_asr(a, -n);
+       return a << n;
+}
+
+word gsm_asl P2((a,n), word a, int n)
+{
+       if (n >= 16) return 0;
+       if (n <= -16) return -(a < 0);
+       if (n < 0) return gsm_asr(a, -n);
+       return a << n;
+}
+
+longword gsm_L_asr P2((a,n), longword a, int n)
+{
+       if (n >= 32) return -(a < 0);
+       if (n <= -32) return 0;
+       if (n < 0) return a << -n;
+
+#      ifdef   SASR
+               return a >> n;
+#      else
+               if (a >= 0) return a >> n;
+               else return -(longword)( -(ulongword)a >> n );
+#      endif
+}
+
+word gsm_asr P2((a,n), word a, int n)
+{
+       if (n >= 16) return -(a < 0);
+       if (n <= -16) return 0;
+       if (n < 0) return a << -n;
+
+#      ifdef   SASR
+               return a >> n;
+#      else
+               if (a >= 0) return a >> n;
+               else return -(word)( -(uword)a >> n );
+#      endif
+}
+
+/* 
+ *  (From p. 46, end of section 4.2.5)
+ *
+ *  NOTE: The following lines gives [sic] one correct implementation
+ *       of the div(num, denum) arithmetic operation.  Compute div
+ *        which is the integer division of num by denum: with denum
+ *       >= num > 0
+ */
+
+word gsm_div P2((num,denum), word num, word denum)
+{
+       longword        L_num   = num;
+       longword        L_denum = denum;
+       word            div     = 0;
+       int             k       = 15;
+
+       /* The parameter num sometimes becomes zero.
+        * Although this is explicitly guarded against in 4.2.5,
+        * we assume that the result should then be zero as well.
+        */
+
+       /* assert(num != 0); */
+
+       assert(num >= 0 && denum >= num);
+       if (num == 0)
+           return 0;
+
+       while (k--) {
+               div   <<= 1;
+               L_num <<= 1;
+
+               if (L_num >= L_denum) {
+                       L_num -= L_denum;
+                       div++;
+               }
+       }
+
+       return div;
+}
index aceebec61b756d546c75d75b7eee2216a8b0e555..6e8ca1e5a42ca8e0ae4f4b468c80044754fa3af6 100644 (file)
@@ -1,99 +1,99 @@
-/*\r
- * code.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include       "config.h"\r
-\r
-#ifdef HAS_STRING_H\r
-#include       <string.h>\r
-#else\r
-#include "proto.h"\r
-       extern char     * memcpy P((char *, char *, int));\r
-#endif\r
-\r
-#include       "private.h"\r
-#include       "gsm.h"\r
-#include       "proto.h"\r
-\r
-/* \r
- *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER \r
- */\r
-\r
-void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),\r
-\r
-       struct gsm_state        * S,\r
-\r
-       word    * s,    /* [0..159] samples                     IN      */\r
-\r
-/*\r
- * The RPE-LTD coder works on a frame by frame basis.  The length of\r
- * the frame is equal to 160 samples.  Some computations are done\r
- * once per frame to produce at the output of the coder the\r
- * LARc[1..8] parameters which are the coded LAR coefficients and \r
- * also to realize the inverse filtering operation for the entire\r
- * frame (160 samples of signal d[0..159]).  These parts produce at\r
- * the output of the coder:\r
- */\r
-\r
-       word    * LARc, /* [0..7] LAR coefficients              OUT     */\r
-\r
-/*\r
- * Procedure 4.2.11 to 4.2.18 are to be executed four times per\r
- * frame.  That means once for each sub-segment RPE-LTP analysis of\r
- * 40 samples.  These parts produce at the output of the coder:\r
- */\r
-\r
-       word    * Nc,   /* [0..3] LTP lag                       OUT     */\r
-       word    * bc,   /* [0..3] coded LTP gain                OUT     */\r
-       word    * Mc,   /* [0..3] RPE grid selection            OUT     */\r
-       word    * xmaxc,/* [0..3] Coded maximum amplitude       OUT     */\r
-       word    * xMc   /* [13*4] normalized RPE samples        OUT     */\r
-)\r
-{\r
-       int     k;\r
-       word    * dp  = S->dp0 + 120;   /* [ -120...-1 ] */\r
-       word    * dpp = dp;             /* [ 0...39 ]    */\r
-\r
-       static word e[50];\r
-\r
-       word    so[160];\r
-\r
-       Gsm_Preprocess                  (S, s, so);\r
-       Gsm_LPC_Analysis                (S, so, LARc);\r
-       Gsm_Short_Term_Analysis_Filter  (S, LARc, so);\r
-\r
-       for (k = 0; k <= 3; k++, xMc += 13) {\r
-\r
-               Gsm_Long_Term_Predictor ( S,\r
-                                        so+k*40, /* d      [0..39] IN  */\r
-                                        dp,      /* dp  [-120..-1] IN  */\r
-                                       e + 5,    /* e      [0..39] OUT */\r
-                                       dpp,      /* dpp    [0..39] OUT */\r
-                                        Nc++,\r
-                                        bc++);\r
-\r
-               Gsm_RPE_Encoding        ( S,\r
-                                       e + 5,  /* e      ][0..39][ IN/OUT */\r
-                                         xmaxc++, Mc++, xMc );\r
-               /*\r
-                * Gsm_Update_of_reconstructed_short_time_residual_signal\r
-                *                      ( dpp, e + 5, dp );\r
-                */\r
-\r
-               { register int i;\r
-                 register longword ltmp;\r
-                 for (i = 0; i <= 39; i++)\r
-                       dp[ i ] = (word) GSM_ADD( e[5 + i], dpp[i] );\r
-               }\r
-               dp  += 40;\r
-               dpp += 40;\r
-\r
-       }\r
-       (void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),\r
-               120 * sizeof(*S->dp0) );\r
-}\r
+/*
+ * code.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include       "config.h"
+
+#ifdef HAS_STRING_H
+#include       <string.h>
+#else
+#include "proto.h"
+       extern char     * memcpy P((char *, char *, int));
+#endif
+
+#include       "private.h"
+#include       "gsm.h"
+#include       "proto.h"
+
+/* 
+ *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER 
+ */
+
+void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),
+
+       struct gsm_state        * S,
+
+       word    * s,    /* [0..159] samples                     IN      */
+
+/*
+ * The RPE-LTD coder works on a frame by frame basis.  The length of
+ * the frame is equal to 160 samples.  Some computations are done
+ * once per frame to produce at the output of the coder the
+ * LARc[1..8] parameters which are the coded LAR coefficients and 
+ * also to realize the inverse filtering operation for the entire
+ * frame (160 samples of signal d[0..159]).  These parts produce at
+ * the output of the coder:
+ */
+
+       word    * LARc, /* [0..7] LAR coefficients              OUT     */
+
+/*
+ * Procedure 4.2.11 to 4.2.18 are to be executed four times per
+ * frame.  That means once for each sub-segment RPE-LTP analysis of
+ * 40 samples.  These parts produce at the output of the coder:
+ */
+
+       word    * Nc,   /* [0..3] LTP lag                       OUT     */
+       word    * bc,   /* [0..3] coded LTP gain                OUT     */
+       word    * Mc,   /* [0..3] RPE grid selection            OUT     */
+       word    * xmaxc,/* [0..3] Coded maximum amplitude       OUT     */
+       word    * xMc   /* [13*4] normalized RPE samples        OUT     */
+)
+{
+       int     k;
+       word    * dp  = S->dp0 + 120;   /* [ -120...-1 ] */
+       word    * dpp = dp;             /* [ 0...39 ]    */
+
+       static word e[50];
+
+       word    so[160];
+
+       Gsm_Preprocess                  (S, s, so);
+       Gsm_LPC_Analysis                (S, so, LARc);
+       Gsm_Short_Term_Analysis_Filter  (S, LARc, so);
+
+       for (k = 0; k <= 3; k++, xMc += 13) {
+
+               Gsm_Long_Term_Predictor ( S,
+                                        so+k*40, /* d      [0..39] IN  */
+                                        dp,      /* dp  [-120..-1] IN  */
+                                       e + 5,    /* e      [0..39] OUT */
+                                       dpp,      /* dpp    [0..39] OUT */
+                                        Nc++,
+                                        bc++);
+
+               Gsm_RPE_Encoding        ( S,
+                                       e + 5,  /* e      ][0..39][ IN/OUT */
+                                         xmaxc++, Mc++, xMc );
+               /*
+                * Gsm_Update_of_reconstructed_short_time_residual_signal
+                *                      ( dpp, e + 5, dp );
+                */
+
+               { register int i;
+                 register longword ltmp;
+                 for (i = 0; i <= 39; i++)
+                       dp[ i ] = (word) GSM_ADD( e[5 + i], dpp[i] );
+               }
+               dp  += 40;
+               dpp += 40;
+
+       }
+       (void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),
+               120 * sizeof(*S->dp0) );
+}
index 935c440159c9940b25c281b2426b69f816faadd5..ca181818732f5f491548278cb0798dbe8f1571e8 100644 (file)
@@ -1,64 +1,64 @@
-/*\r
- * decode.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-\r
-#include       "private.h"\r
-#include       "gsm.h"\r
-#include       "proto.h"\r
-\r
-/*\r
- *  4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER\r
- */\r
-\r
-static void Postprocessing P2((S,s),\r
-       struct gsm_state        * S,\r
-       register word           * s)\r
-{\r
-       register int            k;\r
-       register word           msr = S->msr;\r
-       register longword       ltmp;   /* for GSM_ADD */\r
-       register word           tmp;\r
-\r
-       for (k = 160; k--; s++) {\r
-               tmp = (word) GSM_MULT_R( msr, 28180 );\r
-               msr = (word) GSM_ADD(*s, tmp);     /* Deemphasis             */\r
-               *s  = (word) GSM_ADD(msr, msr) & 0xFFF8;  /* Truncation & Upscaling */\r
-       }\r
-       S->msr = msr;\r
-}\r
-\r
-void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s),\r
-       struct gsm_state        * S,\r
-\r
-       word            * LARcr,        /* [0..7]               IN      */\r
-\r
-       word            * Ncr,          /* [0..3]               IN      */\r
-       word            * bcr,          /* [0..3]               IN      */\r
-       word            * Mcr,          /* [0..3]               IN      */\r
-       word            * xmaxcr,       /* [0..3]               IN      */\r
-       word            * xMcr,         /* [0..13*4]            IN      */\r
-\r
-       word            * s)            /* [0..159]             OUT     */\r
-{\r
-       int             j, k;\r
-       word            erp[40], wt[160];\r
-       word            * drp = S->dp0 + 120;\r
-\r
-       for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {\r
-\r
-               Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp );\r
-               Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );\r
-\r
-               for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];\r
-       }\r
-\r
-       Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );\r
-       Postprocessing(S, s);\r
-}\r
+/*
+ * decode.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include <stdio.h>
+
+#include       "private.h"
+#include       "gsm.h"
+#include       "proto.h"
+
+/*
+ *  4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER
+ */
+
+static void Postprocessing P2((S,s),
+       struct gsm_state        * S,
+       register word           * s)
+{
+       register int            k;
+       register word           msr = S->msr;
+       register longword       ltmp;   /* for GSM_ADD */
+       register word           tmp;
+
+       for (k = 160; k--; s++) {
+               tmp = (word) GSM_MULT_R( msr, 28180 );
+               msr = (word) GSM_ADD(*s, tmp);     /* Deemphasis             */
+               *s  = (word) GSM_ADD(msr, msr) & 0xFFF8;  /* Truncation & Upscaling */
+       }
+       S->msr = msr;
+}
+
+void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s),
+       struct gsm_state        * S,
+
+       word            * LARcr,        /* [0..7]               IN      */
+
+       word            * Ncr,          /* [0..3]               IN      */
+       word            * bcr,          /* [0..3]               IN      */
+       word            * Mcr,          /* [0..3]               IN      */
+       word            * xmaxcr,       /* [0..3]               IN      */
+       word            * xMcr,         /* [0..13*4]            IN      */
+
+       word            * s)            /* [0..159]             OUT     */
+{
+       int             j, k;
+       word            erp[40], wt[160];
+       word            * drp = S->dp0 + 120;
+
+       for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {
+
+               Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp );
+               Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );
+
+               for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];
+       }
+
+       Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );
+       Postprocessing(S, s);
+}
index baafe0f643b53c949677f1cf74f451dd64830b8e..4454e30d2f176895adf5d6bd2edc45dfb2aa4f19 100644 (file)
@@ -1,46 +1,46 @@
-/*\r
- * gsm_create.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include       "config.h"\r
-\r
-#ifdef HAS_STRING_H\r
-#include       <string.h>\r
-#else\r
-#      include "proto.h"\r
-       extern char     * memset P((char *, int, int));\r
-#endif\r
-\r
-#ifdef HAS_STDLIB_H\r
-#      include <stdlib.h>\r
-#else\r
-#      ifdef   HAS_MALLOC_H\r
-#              include         <malloc.h>\r
-#      else\r
-               extern char * malloc();\r
-#      endif\r
-#endif\r
-\r
-#include <stdio.h>\r
-\r
-#include "gsm.h"\r
-#include "private.h"\r
-#include "proto.h"\r
-\r
-gsm gsm_create P0()\r
-{\r
-       gsm  r;\r
-\r
-       r = (gsm)malloc(sizeof(struct gsm_state));\r
-       if (!r) return r;\r
-\r
-       memset((char *)r, 0, sizeof(*r));\r
-       r->nrp = 40;\r
-\r
-       return r;\r
-}\r
+/*
+ * gsm_create.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include       "config.h"
+
+#ifdef HAS_STRING_H
+#include       <string.h>
+#else
+#      include "proto.h"
+       extern char     * memset P((char *, int, int));
+#endif
+
+#ifdef HAS_STDLIB_H
+#      include <stdlib.h>
+#else
+#      ifdef   HAS_MALLOC_H
+#              include         <malloc.h>
+#      else
+               extern char * malloc();
+#      endif
+#endif
+
+#include <stdio.h>
+
+#include "gsm.h"
+#include "private.h"
+#include "proto.h"
+
+gsm gsm_create P0()
+{
+       gsm  r;
+
+       r = (gsm)malloc(sizeof(struct gsm_state));
+       if (!r) return r;
+
+       memset((char *)r, 0, sizeof(*r));
+       r->nrp = 40;
+
+       return r;
+}
index 235a0032683f96df085b8d7e9ee1bd29f8902ee2..c5758bbdb17063a12e5e215d81bce7703e49266a 100644 (file)
-/*\r
- * gsm_decode.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)\r
-{\r
-       word    LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];\r
-\r
-#ifdef WAV49\r
-       if (s->wav_fmt) {\r
-\r
-               uword sr = 0;\r
-\r
-               s->frame_index = !s->frame_index;\r
-               if (s->frame_index) {\r
-\r
-                       sr = *c++;\r
-                       LARc[0] = sr & 0x3f;  sr >>= 6;\r
-                       sr |= (uword)*c++ << 2;\r
-                       LARc[1] = sr & 0x3f;  sr >>= 6;\r
-                       sr |= (uword)*c++ << 4;\r
-                       LARc[2] = sr & 0x1f;  sr >>= 5;\r
-                       LARc[3] = sr & 0x1f;  sr >>= 5;\r
-                       sr |= (uword)*c++ << 2;\r
-                       LARc[4] = sr & 0xf;  sr >>= 4;\r
-                       LARc[5] = sr & 0xf;  sr >>= 4;\r
-                       sr |= (uword)*c++ << 2;                 /* 5 */\r
-                       LARc[6] = sr & 0x7;  sr >>= 3;\r
-                       LARc[7] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 4;\r
-                       Nc[0] = sr & 0x7f;  sr >>= 7;\r
-                       bc[0] = sr & 0x3;  sr >>= 2;\r
-                       Mc[0] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmaxc[0] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[0] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[1] = sr & 0x7;  sr >>= 3;\r
-                       xmc[2] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[3] = sr & 0x7;  sr >>= 3;\r
-                       xmc[4] = sr & 0x7;  sr >>= 3;\r
-                       xmc[5] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;                 /* 10 */\r
-                       xmc[6] = sr & 0x7;  sr >>= 3;\r
-                       xmc[7] = sr & 0x7;  sr >>= 3;\r
-                       xmc[8] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[9] = sr & 0x7;  sr >>= 3;\r
-                       xmc[10] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[11] = sr & 0x7;  sr >>= 3;\r
-                       xmc[12] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 4;\r
-                       Nc[1] = sr & 0x7f;  sr >>= 7;\r
-                       bc[1] = sr & 0x3;  sr >>= 2;\r
-                       Mc[1] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmaxc[1] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[13] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;                              /* 15 */\r
-                       xmc[14] = sr & 0x7;  sr >>= 3;\r
-                       xmc[15] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[16] = sr & 0x7;  sr >>= 3;\r
-                       xmc[17] = sr & 0x7;  sr >>= 3;\r
-                       xmc[18] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[19] = sr & 0x7;  sr >>= 3;\r
-                       xmc[20] = sr & 0x7;  sr >>= 3;\r
-                       xmc[21] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[22] = sr & 0x7;  sr >>= 3;\r
-                       xmc[23] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[24] = sr & 0x7;  sr >>= 3;\r
-                       xmc[25] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 4;                 /* 20 */\r
-                       Nc[2] = sr & 0x7f;  sr >>= 7;\r
-                       bc[2] = sr & 0x3;  sr >>= 2;\r
-                       Mc[2] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmaxc[2] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[26] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[27] = sr & 0x7;  sr >>= 3;\r
-                       xmc[28] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[29] = sr & 0x7;  sr >>= 3;\r
-                       xmc[30] = sr & 0x7;  sr >>= 3;\r
-                       xmc[31] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[32] = sr & 0x7;  sr >>= 3;\r
-                       xmc[33] = sr & 0x7;  sr >>= 3;\r
-                       xmc[34] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;                              /* 25 */\r
-                       xmc[35] = sr & 0x7;  sr >>= 3;\r
-                       xmc[36] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[37] = sr & 0x7;  sr >>= 3;\r
-                       xmc[38] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 4;\r
-                       Nc[3] = sr & 0x7f;  sr >>= 7;\r
-                       bc[3] = sr & 0x3;  sr >>= 2;\r
-                       Mc[3] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmaxc[3] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[39] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[40] = sr & 0x7;  sr >>= 3;\r
-                       xmc[41] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;                 /* 30 */\r
-                       xmc[42] = sr & 0x7;  sr >>= 3;\r
-                       xmc[43] = sr & 0x7;  sr >>= 3;\r
-                       xmc[44] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[45] = sr & 0x7;  sr >>= 3;\r
-                       xmc[46] = sr & 0x7;  sr >>= 3;\r
-                       xmc[47] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[48] = sr & 0x7;  sr >>= 3;\r
-                       xmc[49] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[50] = sr & 0x7;  sr >>= 3;\r
-                       xmc[51] = sr & 0x7;  sr >>= 3;\r
-\r
-                       s->frame_chain = sr & 0xf;\r
-               }\r
-               else {\r
-                       sr = s->frame_chain;\r
-                       sr |= (uword)*c++ << 4;                 /* 1 */\r
-                       LARc[0] = sr & 0x3f;  sr >>= 6;\r
-                       LARc[1] = sr & 0x3f;  sr >>= 6;\r
-                       sr = *c++;\r
-                       LARc[2] = sr & 0x1f;  sr >>= 5;\r
-                       sr |= (uword)*c++ << 3;\r
-                       LARc[3] = sr & 0x1f;  sr >>= 5;\r
-                       LARc[4] = sr & 0xf;  sr >>= 4;\r
-                       sr |= (uword)*c++ << 2;\r
-                       LARc[5] = sr & 0xf;  sr >>= 4;\r
-                       LARc[6] = sr & 0x7;  sr >>= 3;\r
-                       LARc[7] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;                              /* 5 */\r
-                       Nc[0] = sr & 0x7f;  sr >>= 7;\r
-                       sr |= (uword)*c++ << 1;\r
-                       bc[0] = sr & 0x3;  sr >>= 2;\r
-                       Mc[0] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 5;\r
-                       xmaxc[0] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[0] = sr & 0x7;  sr >>= 3;\r
-                       xmc[1] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[2] = sr & 0x7;  sr >>= 3;\r
-                       xmc[3] = sr & 0x7;  sr >>= 3;\r
-                       xmc[4] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[5] = sr & 0x7;  sr >>= 3;\r
-                       xmc[6] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;                 /* 10 */\r
-                       xmc[7] = sr & 0x7;  sr >>= 3;\r
-                       xmc[8] = sr & 0x7;  sr >>= 3;\r
-                       xmc[9] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[10] = sr & 0x7;  sr >>= 3;\r
-                       xmc[11] = sr & 0x7;  sr >>= 3;\r
-                       xmc[12] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       Nc[1] = sr & 0x7f;  sr >>= 7;\r
-                       sr |= (uword)*c++ << 1;\r
-                       bc[1] = sr & 0x3;  sr >>= 2;\r
-                       Mc[1] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 5;\r
-                       xmaxc[1] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[13] = sr & 0x7;  sr >>= 3;\r
-                       xmc[14] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;                 /* 15 */\r
-                       xmc[15] = sr & 0x7;  sr >>= 3;\r
-                       xmc[16] = sr & 0x7;  sr >>= 3;\r
-                       xmc[17] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[18] = sr & 0x7;  sr >>= 3;\r
-                       xmc[19] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[20] = sr & 0x7;  sr >>= 3;\r
-                       xmc[21] = sr & 0x7;  sr >>= 3;\r
-                       xmc[22] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[23] = sr & 0x7;  sr >>= 3;\r
-                       xmc[24] = sr & 0x7;  sr >>= 3;\r
-                       xmc[25] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       Nc[2] = sr & 0x7f;  sr >>= 7;\r
-                       sr |= (uword)*c++ << 1;                 /* 20 */\r
-                       bc[2] = sr & 0x3;  sr >>= 2;\r
-                       Mc[2] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 5;\r
-                       xmaxc[2] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[26] = sr & 0x7;  sr >>= 3;\r
-                       xmc[27] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1; \r
-                       xmc[28] = sr & 0x7;  sr >>= 3;\r
-                       xmc[29] = sr & 0x7;  sr >>= 3;\r
-                       xmc[30] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       xmc[31] = sr & 0x7;  sr >>= 3;\r
-                       xmc[32] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[33] = sr & 0x7;  sr >>= 3;\r
-                       xmc[34] = sr & 0x7;  sr >>= 3;\r
-                       xmc[35] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;                 /* 25 */\r
-                       xmc[36] = sr & 0x7;  sr >>= 3;\r
-                       xmc[37] = sr & 0x7;  sr >>= 3;\r
-                       xmc[38] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;\r
-                       Nc[3] = sr & 0x7f;  sr >>= 7;\r
-                       sr |= (uword)*c++ << 1;         \r
-                       bc[3] = sr & 0x3;  sr >>= 2;\r
-                       Mc[3] = sr & 0x3;  sr >>= 2;\r
-                       sr |= (uword)*c++ << 5;\r
-                       xmaxc[3] = sr & 0x3f;  sr >>= 6;\r
-                       xmc[39] = sr & 0x7;  sr >>= 3;\r
-                       xmc[40] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[41] = sr & 0x7;  sr >>= 3;\r
-                       xmc[42] = sr & 0x7;  sr >>= 3;\r
-                       xmc[43] = sr & 0x7;  sr >>= 3;\r
-                       sr = *c++;                              /* 30 */\r
-                       xmc[44] = sr & 0x7;  sr >>= 3;\r
-                       xmc[45] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 2;\r
-                       xmc[46] = sr & 0x7;  sr >>= 3;\r
-                       xmc[47] = sr & 0x7;  sr >>= 3;\r
-                       xmc[48] = sr & 0x7;  sr >>= 3;\r
-                       sr |= (uword)*c++ << 1;\r
-                       xmc[49] = sr & 0x7;  sr >>= 3;\r
-                       xmc[50] = sr & 0x7;  sr >>= 3;\r
-                       xmc[51] = sr & 0x7;  sr >>= 3;\r
-               }\r
-       }\r
-       else\r
-#endif\r
-       {\r
-               /* GSM_MAGIC  = (*c >> 4) & 0xF; */\r
-\r
-               if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;\r
-\r
-               LARc[0]  = (*c++ & 0xF) << 2;           /* 1 */\r
-               LARc[0] |= (*c >> 6) & 0x3;\r
-               LARc[1]  = *c++ & 0x3F;\r
-               LARc[2]  = (*c >> 3) & 0x1F;\r
-               LARc[3]  = (*c++ & 0x7) << 2;\r
-               LARc[3] |= (*c >> 6) & 0x3;\r
-               LARc[4]  = (*c >> 2) & 0xF;\r
-               LARc[5]  = (*c++ & 0x3) << 2;\r
-               LARc[5] |= (*c >> 6) & 0x3;\r
-               LARc[6]  = (*c >> 3) & 0x7;\r
-               LARc[7]  = *c++ & 0x7;\r
-               Nc[0]  = (*c >> 1) & 0x7F;\r
-               bc[0]  = (*c++ & 0x1) << 1;\r
-               bc[0] |= (*c >> 7) & 0x1;\r
-               Mc[0]  = (*c >> 5) & 0x3;\r
-               xmaxc[0]  = (*c++ & 0x1F) << 1;\r
-               xmaxc[0] |= (*c >> 7) & 0x1;\r
-               xmc[0]  = (*c >> 4) & 0x7;\r
-               xmc[1]  = (*c >> 1) & 0x7;\r
-               xmc[2]  = (*c++ & 0x1) << 2;\r
-               xmc[2] |= (*c >> 6) & 0x3;\r
-               xmc[3]  = (*c >> 3) & 0x7;\r
-               xmc[4]  = *c++ & 0x7;\r
-               xmc[5]  = (*c >> 5) & 0x7;\r
-               xmc[6]  = (*c >> 2) & 0x7;\r
-               xmc[7]  = (*c++ & 0x3) << 1;            /* 10 */\r
-               xmc[7] |= (*c >> 7) & 0x1;\r
-               xmc[8]  = (*c >> 4) & 0x7;\r
-               xmc[9]  = (*c >> 1) & 0x7;\r
-               xmc[10]  = (*c++ & 0x1) << 2;\r
-               xmc[10] |= (*c >> 6) & 0x3;\r
-               xmc[11]  = (*c >> 3) & 0x7;\r
-               xmc[12]  = *c++ & 0x7;\r
-               Nc[1]  = (*c >> 1) & 0x7F;\r
-               bc[1]  = (*c++ & 0x1) << 1;\r
-               bc[1] |= (*c >> 7) & 0x1;\r
-               Mc[1]  = (*c >> 5) & 0x3;\r
-               xmaxc[1]  = (*c++ & 0x1F) << 1;\r
-               xmaxc[1] |= (*c >> 7) & 0x1;\r
-               xmc[13]  = (*c >> 4) & 0x7;\r
-               xmc[14]  = (*c >> 1) & 0x7;\r
-               xmc[15]  = (*c++ & 0x1) << 2;\r
-               xmc[15] |= (*c >> 6) & 0x3;\r
-               xmc[16]  = (*c >> 3) & 0x7;\r
-               xmc[17]  = *c++ & 0x7;\r
-               xmc[18]  = (*c >> 5) & 0x7;\r
-               xmc[19]  = (*c >> 2) & 0x7;\r
-               xmc[20]  = (*c++ & 0x3) << 1;\r
-               xmc[20] |= (*c >> 7) & 0x1;\r
-               xmc[21]  = (*c >> 4) & 0x7;\r
-               xmc[22]  = (*c >> 1) & 0x7;\r
-               xmc[23]  = (*c++ & 0x1) << 2;\r
-               xmc[23] |= (*c >> 6) & 0x3;\r
-               xmc[24]  = (*c >> 3) & 0x7;\r
-               xmc[25]  = *c++ & 0x7;\r
-               Nc[2]  = (*c >> 1) & 0x7F;\r
-               bc[2]  = (*c++ & 0x1) << 1;             /* 20 */\r
-               bc[2] |= (*c >> 7) & 0x1;\r
-               Mc[2]  = (*c >> 5) & 0x3;\r
-               xmaxc[2]  = (*c++ & 0x1F) << 1;\r
-               xmaxc[2] |= (*c >> 7) & 0x1;\r
-               xmc[26]  = (*c >> 4) & 0x7;\r
-               xmc[27]  = (*c >> 1) & 0x7;\r
-               xmc[28]  = (*c++ & 0x1) << 2;\r
-               xmc[28] |= (*c >> 6) & 0x3;\r
-               xmc[29]  = (*c >> 3) & 0x7;\r
-               xmc[30]  = *c++ & 0x7;\r
-               xmc[31]  = (*c >> 5) & 0x7;\r
-               xmc[32]  = (*c >> 2) & 0x7;\r
-               xmc[33]  = (*c++ & 0x3) << 1;\r
-               xmc[33] |= (*c >> 7) & 0x1;\r
-               xmc[34]  = (*c >> 4) & 0x7;\r
-               xmc[35]  = (*c >> 1) & 0x7;\r
-               xmc[36]  = (*c++ & 0x1) << 2;\r
-               xmc[36] |= (*c >> 6) & 0x3;\r
-               xmc[37]  = (*c >> 3) & 0x7;\r
-               xmc[38]  = *c++ & 0x7;\r
-               Nc[3]  = (*c >> 1) & 0x7F;\r
-               bc[3]  = (*c++ & 0x1) << 1;\r
-               bc[3] |= (*c >> 7) & 0x1;\r
-               Mc[3]  = (*c >> 5) & 0x3;\r
-               xmaxc[3]  = (*c++ & 0x1F) << 1;\r
-               xmaxc[3] |= (*c >> 7) & 0x1;\r
-               xmc[39]  = (*c >> 4) & 0x7;\r
-               xmc[40]  = (*c >> 1) & 0x7;\r
-               xmc[41]  = (*c++ & 0x1) << 2;\r
-               xmc[41] |= (*c >> 6) & 0x3;\r
-               xmc[42]  = (*c >> 3) & 0x7;\r
-               xmc[43]  = *c++ & 0x7;                  /* 30  */\r
-               xmc[44]  = (*c >> 5) & 0x7;\r
-               xmc[45]  = (*c >> 2) & 0x7;\r
-               xmc[46]  = (*c++ & 0x3) << 1;\r
-               xmc[46] |= (*c >> 7) & 0x1;\r
-               xmc[47]  = (*c >> 4) & 0x7;\r
-               xmc[48]  = (*c >> 1) & 0x7;\r
-               xmc[49]  = (*c++ & 0x1) << 2;\r
-               xmc[49] |= (*c >> 6) & 0x3;\r
-               xmc[50]  = (*c >> 3) & 0x7;\r
-               xmc[51]  = *c & 0x7;                    /* 33 */\r
-       }\r
-\r
-       Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);\r
-\r
-       return 0;\r
-}\r
+/*
+ * gsm_decode.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
+{
+       word    LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+#ifdef WAV49
+       if (s->wav_fmt) {
+
+               uword sr = 0;
+
+               s->frame_index = !s->frame_index;
+               if (s->frame_index) {
+
+                       sr = *c++;
+                       LARc[0] = sr & 0x3f;  sr >>= 6;
+                       sr |= (uword)*c++ << 2;
+                       LARc[1] = sr & 0x3f;  sr >>= 6;
+                       sr |= (uword)*c++ << 4;
+                       LARc[2] = sr & 0x1f;  sr >>= 5;
+                       LARc[3] = sr & 0x1f;  sr >>= 5;
+                       sr |= (uword)*c++ << 2;
+                       LARc[4] = sr & 0xf;  sr >>= 4;
+                       LARc[5] = sr & 0xf;  sr >>= 4;
+                       sr |= (uword)*c++ << 2;                 /* 5 */
+                       LARc[6] = sr & 0x7;  sr >>= 3;
+                       LARc[7] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 4;
+                       Nc[0] = sr & 0x7f;  sr >>= 7;
+                       bc[0] = sr & 0x3;  sr >>= 2;
+                       Mc[0] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 1;
+                       xmaxc[0] = sr & 0x3f;  sr >>= 6;
+                       xmc[0] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[1] = sr & 0x7;  sr >>= 3;
+                       xmc[2] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[3] = sr & 0x7;  sr >>= 3;
+                       xmc[4] = sr & 0x7;  sr >>= 3;
+                       xmc[5] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;                 /* 10 */
+                       xmc[6] = sr & 0x7;  sr >>= 3;
+                       xmc[7] = sr & 0x7;  sr >>= 3;
+                       xmc[8] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[9] = sr & 0x7;  sr >>= 3;
+                       xmc[10] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[11] = sr & 0x7;  sr >>= 3;
+                       xmc[12] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 4;
+                       Nc[1] = sr & 0x7f;  sr >>= 7;
+                       bc[1] = sr & 0x3;  sr >>= 2;
+                       Mc[1] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 1;
+                       xmaxc[1] = sr & 0x3f;  sr >>= 6;
+                       xmc[13] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;                              /* 15 */
+                       xmc[14] = sr & 0x7;  sr >>= 3;
+                       xmc[15] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[16] = sr & 0x7;  sr >>= 3;
+                       xmc[17] = sr & 0x7;  sr >>= 3;
+                       xmc[18] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[19] = sr & 0x7;  sr >>= 3;
+                       xmc[20] = sr & 0x7;  sr >>= 3;
+                       xmc[21] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[22] = sr & 0x7;  sr >>= 3;
+                       xmc[23] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[24] = sr & 0x7;  sr >>= 3;
+                       xmc[25] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 4;                 /* 20 */
+                       Nc[2] = sr & 0x7f;  sr >>= 7;
+                       bc[2] = sr & 0x3;  sr >>= 2;
+                       Mc[2] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 1;
+                       xmaxc[2] = sr & 0x3f;  sr >>= 6;
+                       xmc[26] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[27] = sr & 0x7;  sr >>= 3;
+                       xmc[28] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[29] = sr & 0x7;  sr >>= 3;
+                       xmc[30] = sr & 0x7;  sr >>= 3;
+                       xmc[31] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[32] = sr & 0x7;  sr >>= 3;
+                       xmc[33] = sr & 0x7;  sr >>= 3;
+                       xmc[34] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;                              /* 25 */
+                       xmc[35] = sr & 0x7;  sr >>= 3;
+                       xmc[36] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[37] = sr & 0x7;  sr >>= 3;
+                       xmc[38] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 4;
+                       Nc[3] = sr & 0x7f;  sr >>= 7;
+                       bc[3] = sr & 0x3;  sr >>= 2;
+                       Mc[3] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 1;
+                       xmaxc[3] = sr & 0x3f;  sr >>= 6;
+                       xmc[39] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[40] = sr & 0x7;  sr >>= 3;
+                       xmc[41] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;                 /* 30 */
+                       xmc[42] = sr & 0x7;  sr >>= 3;
+                       xmc[43] = sr & 0x7;  sr >>= 3;
+                       xmc[44] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[45] = sr & 0x7;  sr >>= 3;
+                       xmc[46] = sr & 0x7;  sr >>= 3;
+                       xmc[47] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[48] = sr & 0x7;  sr >>= 3;
+                       xmc[49] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[50] = sr & 0x7;  sr >>= 3;
+                       xmc[51] = sr & 0x7;  sr >>= 3;
+
+                       s->frame_chain = sr & 0xf;
+               }
+               else {
+                       sr = s->frame_chain;
+                       sr |= (uword)*c++ << 4;                 /* 1 */
+                       LARc[0] = sr & 0x3f;  sr >>= 6;
+                       LARc[1] = sr & 0x3f;  sr >>= 6;
+                       sr = *c++;
+                       LARc[2] = sr & 0x1f;  sr >>= 5;
+                       sr |= (uword)*c++ << 3;
+                       LARc[3] = sr & 0x1f;  sr >>= 5;
+                       LARc[4] = sr & 0xf;  sr >>= 4;
+                       sr |= (uword)*c++ << 2;
+                       LARc[5] = sr & 0xf;  sr >>= 4;
+                       LARc[6] = sr & 0x7;  sr >>= 3;
+                       LARc[7] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;                              /* 5 */
+                       Nc[0] = sr & 0x7f;  sr >>= 7;
+                       sr |= (uword)*c++ << 1;
+                       bc[0] = sr & 0x3;  sr >>= 2;
+                       Mc[0] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 5;
+                       xmaxc[0] = sr & 0x3f;  sr >>= 6;
+                       xmc[0] = sr & 0x7;  sr >>= 3;
+                       xmc[1] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[2] = sr & 0x7;  sr >>= 3;
+                       xmc[3] = sr & 0x7;  sr >>= 3;
+                       xmc[4] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[5] = sr & 0x7;  sr >>= 3;
+                       xmc[6] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;                 /* 10 */
+                       xmc[7] = sr & 0x7;  sr >>= 3;
+                       xmc[8] = sr & 0x7;  sr >>= 3;
+                       xmc[9] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[10] = sr & 0x7;  sr >>= 3;
+                       xmc[11] = sr & 0x7;  sr >>= 3;
+                       xmc[12] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       Nc[1] = sr & 0x7f;  sr >>= 7;
+                       sr |= (uword)*c++ << 1;
+                       bc[1] = sr & 0x3;  sr >>= 2;
+                       Mc[1] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 5;
+                       xmaxc[1] = sr & 0x3f;  sr >>= 6;
+                       xmc[13] = sr & 0x7;  sr >>= 3;
+                       xmc[14] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;                 /* 15 */
+                       xmc[15] = sr & 0x7;  sr >>= 3;
+                       xmc[16] = sr & 0x7;  sr >>= 3;
+                       xmc[17] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[18] = sr & 0x7;  sr >>= 3;
+                       xmc[19] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[20] = sr & 0x7;  sr >>= 3;
+                       xmc[21] = sr & 0x7;  sr >>= 3;
+                       xmc[22] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[23] = sr & 0x7;  sr >>= 3;
+                       xmc[24] = sr & 0x7;  sr >>= 3;
+                       xmc[25] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       Nc[2] = sr & 0x7f;  sr >>= 7;
+                       sr |= (uword)*c++ << 1;                 /* 20 */
+                       bc[2] = sr & 0x3;  sr >>= 2;
+                       Mc[2] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 5;
+                       xmaxc[2] = sr & 0x3f;  sr >>= 6;
+                       xmc[26] = sr & 0x7;  sr >>= 3;
+                       xmc[27] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1; 
+                       xmc[28] = sr & 0x7;  sr >>= 3;
+                       xmc[29] = sr & 0x7;  sr >>= 3;
+                       xmc[30] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       xmc[31] = sr & 0x7;  sr >>= 3;
+                       xmc[32] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[33] = sr & 0x7;  sr >>= 3;
+                       xmc[34] = sr & 0x7;  sr >>= 3;
+                       xmc[35] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;                 /* 25 */
+                       xmc[36] = sr & 0x7;  sr >>= 3;
+                       xmc[37] = sr & 0x7;  sr >>= 3;
+                       xmc[38] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;
+                       Nc[3] = sr & 0x7f;  sr >>= 7;
+                       sr |= (uword)*c++ << 1;         
+                       bc[3] = sr & 0x3;  sr >>= 2;
+                       Mc[3] = sr & 0x3;  sr >>= 2;
+                       sr |= (uword)*c++ << 5;
+                       xmaxc[3] = sr & 0x3f;  sr >>= 6;
+                       xmc[39] = sr & 0x7;  sr >>= 3;
+                       xmc[40] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[41] = sr & 0x7;  sr >>= 3;
+                       xmc[42] = sr & 0x7;  sr >>= 3;
+                       xmc[43] = sr & 0x7;  sr >>= 3;
+                       sr = *c++;                              /* 30 */
+                       xmc[44] = sr & 0x7;  sr >>= 3;
+                       xmc[45] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 2;
+                       xmc[46] = sr & 0x7;  sr >>= 3;
+                       xmc[47] = sr & 0x7;  sr >>= 3;
+                       xmc[48] = sr & 0x7;  sr >>= 3;
+                       sr |= (uword)*c++ << 1;
+                       xmc[49] = sr & 0x7;  sr >>= 3;
+                       xmc[50] = sr & 0x7;  sr >>= 3;
+                       xmc[51] = sr & 0x7;  sr >>= 3;
+               }
+       }
+       else
+#endif
+       {
+               /* GSM_MAGIC  = (*c >> 4) & 0xF; */
+
+               if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+
+               LARc[0]  = (*c++ & 0xF) << 2;           /* 1 */
+               LARc[0] |= (*c >> 6) & 0x3;
+               LARc[1]  = *c++ & 0x3F;
+               LARc[2]  = (*c >> 3) & 0x1F;
+               LARc[3]  = (*c++ & 0x7) << 2;
+               LARc[3] |= (*c >> 6) & 0x3;
+               LARc[4]  = (*c >> 2) & 0xF;
+               LARc[5]  = (*c++ & 0x3) << 2;
+               LARc[5] |= (*c >> 6) & 0x3;
+               LARc[6]  = (*c >> 3) & 0x7;
+               LARc[7]  = *c++ & 0x7;
+               Nc[0]  = (*c >> 1) & 0x7F;
+               bc[0]  = (*c++ & 0x1) << 1;
+               bc[0] |= (*c >> 7) & 0x1;
+               Mc[0]  = (*c >> 5) & 0x3;
+               xmaxc[0]  = (*c++ & 0x1F) << 1;
+               xmaxc[0] |= (*c >> 7) & 0x1;
+               xmc[0]  = (*c >> 4) & 0x7;
+               xmc[1]  = (*c >> 1) & 0x7;
+               xmc[2]  = (*c++ & 0x1) << 2;
+               xmc[2] |= (*c >> 6) & 0x3;
+               xmc[3]  = (*c >> 3) & 0x7;
+               xmc[4]  = *c++ & 0x7;
+               xmc[5]  = (*c >> 5) & 0x7;
+               xmc[6]  = (*c >> 2) & 0x7;
+               xmc[7]  = (*c++ & 0x3) << 1;            /* 10 */
+               xmc[7] |= (*c >> 7) & 0x1;
+               xmc[8]  = (*c >> 4) & 0x7;
+               xmc[9]  = (*c >> 1) & 0x7;
+               xmc[10]  = (*c++ & 0x1) << 2;
+               xmc[10] |= (*c >> 6) & 0x3;
+               xmc[11]  = (*c >> 3) & 0x7;
+               xmc[12]  = *c++ & 0x7;
+               Nc[1]  = (*c >> 1) & 0x7F;
+               bc[1]  = (*c++ & 0x1) << 1;
+               bc[1] |= (*c >> 7) & 0x1;
+               Mc[1]  = (*c >> 5) & 0x3;
+               xmaxc[1]  = (*c++ & 0x1F) << 1;
+               xmaxc[1] |= (*c >> 7) & 0x1;
+               xmc[13]  = (*c >> 4) & 0x7;
+               xmc[14]  = (*c >> 1) & 0x7;
+               xmc[15]  = (*c++ & 0x1) << 2;
+               xmc[15] |= (*c >> 6) & 0x3;
+               xmc[16]  = (*c >> 3) & 0x7;
+               xmc[17]  = *c++ & 0x7;
+               xmc[18]  = (*c >> 5) & 0x7;
+               xmc[19]  = (*c >> 2) & 0x7;
+               xmc[20]  = (*c++ & 0x3) << 1;
+               xmc[20] |= (*c >> 7) & 0x1;
+               xmc[21]  = (*c >> 4) & 0x7;
+               xmc[22]  = (*c >> 1) & 0x7;
+               xmc[23]  = (*c++ & 0x1) << 2;
+               xmc[23] |= (*c >> 6) & 0x3;
+               xmc[24]  = (*c >> 3) & 0x7;
+               xmc[25]  = *c++ & 0x7;
+               Nc[2]  = (*c >> 1) & 0x7F;
+               bc[2]  = (*c++ & 0x1) << 1;             /* 20 */
+               bc[2] |= (*c >> 7) & 0x1;
+               Mc[2]  = (*c >> 5) & 0x3;
+               xmaxc[2]  = (*c++ & 0x1F) << 1;
+               xmaxc[2] |= (*c >> 7) & 0x1;
+               xmc[26]  = (*c >> 4) & 0x7;
+               xmc[27]  = (*c >> 1) & 0x7;
+               xmc[28]  = (*c++ & 0x1) << 2;
+               xmc[28] |= (*c >> 6) & 0x3;
+               xmc[29]  = (*c >> 3) & 0x7;
+               xmc[30]  = *c++ & 0x7;
+               xmc[31]  = (*c >> 5) & 0x7;
+               xmc[32]  = (*c >> 2) & 0x7;
+               xmc[33]  = (*c++ & 0x3) << 1;
+               xmc[33] |= (*c >> 7) & 0x1;
+               xmc[34]  = (*c >> 4) & 0x7;
+               xmc[35]  = (*c >> 1) & 0x7;
+               xmc[36]  = (*c++ & 0x1) << 2;
+               xmc[36] |= (*c >> 6) & 0x3;
+               xmc[37]  = (*c >> 3) & 0x7;
+               xmc[38]  = *c++ & 0x7;
+               Nc[3]  = (*c >> 1) & 0x7F;
+               bc[3]  = (*c++ & 0x1) << 1;
+               bc[3] |= (*c >> 7) & 0x1;
+               Mc[3]  = (*c >> 5) & 0x3;
+               xmaxc[3]  = (*c++ & 0x1F) << 1;
+               xmaxc[3] |= (*c >> 7) & 0x1;
+               xmc[39]  = (*c >> 4) & 0x7;
+               xmc[40]  = (*c >> 1) & 0x7;
+               xmc[41]  = (*c++ & 0x1) << 2;
+               xmc[41] |= (*c >> 6) & 0x3;
+               xmc[42]  = (*c >> 3) & 0x7;
+               xmc[43]  = *c++ & 0x7;                  /* 30  */
+               xmc[44]  = (*c >> 5) & 0x7;
+               xmc[45]  = (*c >> 2) & 0x7;
+               xmc[46]  = (*c++ & 0x3) << 1;
+               xmc[46] |= (*c >> 7) & 0x1;
+               xmc[47]  = (*c >> 4) & 0x7;
+               xmc[48]  = (*c >> 1) & 0x7;
+               xmc[49]  = (*c++ & 0x1) << 2;
+               xmc[49] |= (*c >> 6) & 0x3;
+               xmc[50]  = (*c >> 3) & 0x7;
+               xmc[51]  = *c & 0x7;                    /* 33 */
+       }
+
+       Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
+
+       return 0;
+}
index 17045540fc5398fc820ecd830841e8403c9daeeb..3b331b9de0e9bbe492848ca746ffd9edc59b4f9f 100644 (file)
@@ -1,27 +1,27 @@
-/*\r
- * gsm_destroy.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include "gsm.h"\r
-#include "config.h"\r
-#include "proto.h"\r
-\r
-#ifdef HAS_STDLIB_H\r
-#      include <stdlib.h>\r
-#else\r
-#      ifdef   HAS_MALLOC_H\r
-#              include         <malloc.h>\r
-#      else\r
-               extern void free();\r
-#      endif\r
-#endif\r
-\r
-void gsm_destroy P1((S), gsm S)\r
-{\r
-       if (S) free((char *)S);\r
-}\r
+/*
+ * gsm_destroy.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include "gsm.h"
+#include "config.h"
+#include "proto.h"
+
+#ifdef HAS_STDLIB_H
+#      include <stdlib.h>
+#else
+#      ifdef   HAS_MALLOC_H
+#              include         <malloc.h>
+#      else
+               extern void free();
+#      endif
+#endif
+
+void gsm_destroy P1((S), gsm S)
+{
+       if (S) free((char *)S);
+}
index 927a05ea243cdd8c2e354fe0df1bb83a64dbcc69..6876e13c5be8979d971517ae288bd4532dac37b2 100644 (file)
-/*\r
- * gsm_encode.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include "private.h"\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)\r
-{\r
-       word            LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];\r
-\r
-       Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);\r
-\r
-\r
-       /*      variable        size\r
-\r
-               GSM_MAGIC       4\r
-\r
-               LARc[0]         6\r
-               LARc[1]         6\r
-               LARc[2]         5\r
-               LARc[3]         5\r
-               LARc[4]         4\r
-               LARc[5]         4\r
-               LARc[6]         3\r
-               LARc[7]         3\r
-\r
-               Nc[0]           7\r
-               bc[0]           2\r
-               Mc[0]           2\r
-               xmaxc[0]        6\r
-               xmc[0]          3\r
-               xmc[1]          3\r
-               xmc[2]          3\r
-               xmc[3]          3\r
-               xmc[4]          3\r
-               xmc[5]          3\r
-               xmc[6]          3\r
-               xmc[7]          3\r
-               xmc[8]          3\r
-               xmc[9]          3\r
-               xmc[10]         3\r
-               xmc[11]         3\r
-               xmc[12]         3\r
-\r
-               Nc[1]           7\r
-               bc[1]           2\r
-               Mc[1]           2\r
-               xmaxc[1]        6\r
-               xmc[13]         3\r
-               xmc[14]         3\r
-               xmc[15]         3\r
-               xmc[16]         3\r
-               xmc[17]         3\r
-               xmc[18]         3\r
-               xmc[19]         3\r
-               xmc[20]         3\r
-               xmc[21]         3\r
-               xmc[22]         3\r
-               xmc[23]         3\r
-               xmc[24]         3\r
-               xmc[25]         3\r
-\r
-               Nc[2]           7\r
-               bc[2]           2\r
-               Mc[2]           2\r
-               xmaxc[2]        6\r
-               xmc[26]         3\r
-               xmc[27]         3\r
-               xmc[28]         3\r
-               xmc[29]         3\r
-               xmc[30]         3\r
-               xmc[31]         3\r
-               xmc[32]         3\r
-               xmc[33]         3\r
-               xmc[34]         3\r
-               xmc[35]         3\r
-               xmc[36]         3\r
-               xmc[37]         3\r
-               xmc[38]         3\r
-\r
-               Nc[3]           7\r
-               bc[3]           2\r
-               Mc[3]           2\r
-               xmaxc[3]        6\r
-               xmc[39]         3\r
-               xmc[40]         3\r
-               xmc[41]         3\r
-               xmc[42]         3\r
-               xmc[43]         3\r
-               xmc[44]         3\r
-               xmc[45]         3\r
-               xmc[46]         3\r
-               xmc[47]         3\r
-               xmc[48]         3\r
-               xmc[49]         3\r
-               xmc[50]         3\r
-               xmc[51]         3\r
-       */\r
-\r
-#ifdef WAV49\r
-\r
-       if (s->wav_fmt) {\r
-               s->frame_index = !s->frame_index;\r
-               if (s->frame_index) {\r
-\r
-                       uword sr;\r
-\r
-                       sr = 0;\r
-                       sr = sr >> 6 | LARc[0] << 10;\r
-                       sr = sr >> 6 | LARc[1] << 10;\r
-                       *c++ = sr >> 4;\r
-                       sr = sr >> 5 | LARc[2] << 11;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 5 | LARc[3] << 11;\r
-                       sr = sr >> 4 | LARc[4] << 12;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 4 | LARc[5] << 12;\r
-                       sr = sr >> 3 | LARc[6] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | LARc[7] << 13;\r
-                       sr = sr >> 7 | Nc[0] << 9;\r
-                       *c++ = sr >> 5;\r
-                       sr = sr >> 2 | bc[0] << 14;\r
-                       sr = sr >> 2 | Mc[0] << 14;\r
-                       sr = sr >> 6 | xmaxc[0] << 10;\r
-                       *c++ = sr >> 3;\r
-                       sr = sr >> 3 | xmc[0] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[1] << 13;\r
-                       sr = sr >> 3 | xmc[2] << 13;\r
-                       sr = sr >> 3 | xmc[3] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[4] << 13;\r
-                       sr = sr >> 3 | xmc[5] << 13;\r
-                       sr = sr >> 3 | xmc[6] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[7] << 13;\r
-                       sr = sr >> 3 | xmc[8] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[9] << 13;\r
-                       sr = sr >> 3 | xmc[10] << 13;\r
-                       sr = sr >> 3 | xmc[11] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[12] << 13;\r
-                       sr = sr >> 7 | Nc[1] << 9;\r
-                       *c++ = sr >> 5;\r
-                       sr = sr >> 2 | bc[1] << 14;\r
-                       sr = sr >> 2 | Mc[1] << 14;\r
-                       sr = sr >> 6 | xmaxc[1] << 10;\r
-                       *c++ = sr >> 3;\r
-                       sr = sr >> 3 | xmc[13] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[14] << 13;\r
-                       sr = sr >> 3 | xmc[15] << 13;\r
-                       sr = sr >> 3 | xmc[16] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[17] << 13;\r
-                       sr = sr >> 3 | xmc[18] << 13;\r
-                       sr = sr >> 3 | xmc[19] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[20] << 13;\r
-                       sr = sr >> 3 | xmc[21] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[22] << 13;\r
-                       sr = sr >> 3 | xmc[23] << 13;\r
-                       sr = sr >> 3 | xmc[24] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[25] << 13;\r
-                       sr = sr >> 7 | Nc[2] << 9;\r
-                       *c++ = sr >> 5;\r
-                       sr = sr >> 2 | bc[2] << 14;\r
-                       sr = sr >> 2 | Mc[2] << 14;\r
-                       sr = sr >> 6 | xmaxc[2] << 10;\r
-                       *c++ = sr >> 3;\r
-                       sr = sr >> 3 | xmc[26] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[27] << 13;\r
-                       sr = sr >> 3 | xmc[28] << 13;\r
-                       sr = sr >> 3 | xmc[29] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[30] << 13;\r
-                       sr = sr >> 3 | xmc[31] << 13;\r
-                       sr = sr >> 3 | xmc[32] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[33] << 13;\r
-                       sr = sr >> 3 | xmc[34] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[35] << 13;\r
-                       sr = sr >> 3 | xmc[36] << 13;\r
-                       sr = sr >> 3 | xmc[37] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[38] << 13;\r
-                       sr = sr >> 7 | Nc[3] << 9;\r
-                       *c++ = sr >> 5;\r
-                       sr = sr >> 2 | bc[3] << 14;\r
-                       sr = sr >> 2 | Mc[3] << 14;\r
-                       sr = sr >> 6 | xmaxc[3] << 10;\r
-                       *c++ = sr >> 3;\r
-                       sr = sr >> 3 | xmc[39] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[40] << 13;\r
-                       sr = sr >> 3 | xmc[41] << 13;\r
-                       sr = sr >> 3 | xmc[42] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[43] << 13;\r
-                       sr = sr >> 3 | xmc[44] << 13;\r
-                       sr = sr >> 3 | xmc[45] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[46] << 13;\r
-                       sr = sr >> 3 | xmc[47] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[48] << 13;\r
-                       sr = sr >> 3 | xmc[49] << 13;\r
-                       sr = sr >> 3 | xmc[50] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[51] << 13;\r
-                       sr = sr >> 4;\r
-                       *c = sr >> 8;\r
-                       s->frame_chain = *c;\r
-               }\r
-               else {\r
-                       uword sr;\r
-\r
-                       sr = 0;\r
-                       sr = sr >> 4 | s->frame_chain << 12;\r
-                       sr = sr >> 6 | LARc[0] << 10;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 6 | LARc[1] << 10;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 5 | LARc[2] << 11;\r
-                       sr = sr >> 5 | LARc[3] << 11;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 4 | LARc[4] << 12;\r
-                       sr = sr >> 4 | LARc[5] << 12;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | LARc[6] << 13;\r
-                       sr = sr >> 3 | LARc[7] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 7 | Nc[0] << 9;\r
-                       sr = sr >> 2 | bc[0] << 14;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 2 | Mc[0] << 14;\r
-                       sr = sr >> 6 | xmaxc[0] << 10;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[0] << 13;\r
-                       sr = sr >> 3 | xmc[1] << 13;\r
-                       sr = sr >> 3 | xmc[2] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[3] << 13;\r
-                       sr = sr >> 3 | xmc[4] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[5] << 13;\r
-                       sr = sr >> 3 | xmc[6] << 13;\r
-                       sr = sr >> 3 | xmc[7] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[8] << 13;\r
-                       sr = sr >> 3 | xmc[9] << 13;\r
-                       sr = sr >> 3 | xmc[10] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[11] << 13;\r
-                       sr = sr >> 3 | xmc[12] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 7 | Nc[1] << 9;\r
-                       sr = sr >> 2 | bc[1] << 14;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 2 | Mc[1] << 14;\r
-                       sr = sr >> 6 | xmaxc[1] << 10;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[13] << 13;\r
-                       sr = sr >> 3 | xmc[14] << 13;\r
-                       sr = sr >> 3 | xmc[15] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[16] << 13;\r
-                       sr = sr >> 3 | xmc[17] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[18] << 13;\r
-                       sr = sr >> 3 | xmc[19] << 13;\r
-                       sr = sr >> 3 | xmc[20] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[21] << 13;\r
-                       sr = sr >> 3 | xmc[22] << 13;\r
-                       sr = sr >> 3 | xmc[23] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[24] << 13;\r
-                       sr = sr >> 3 | xmc[25] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 7 | Nc[2] << 9;\r
-                       sr = sr >> 2 | bc[2] << 14;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 2 | Mc[2] << 14;\r
-                       sr = sr >> 6 | xmaxc[2] << 10;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[26] << 13;\r
-                       sr = sr >> 3 | xmc[27] << 13;\r
-                       sr = sr >> 3 | xmc[28] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[29] << 13;\r
-                       sr = sr >> 3 | xmc[30] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[31] << 13;\r
-                       sr = sr >> 3 | xmc[32] << 13;\r
-                       sr = sr >> 3 | xmc[33] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[34] << 13;\r
-                       sr = sr >> 3 | xmc[35] << 13;\r
-                       sr = sr >> 3 | xmc[36] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[37] << 13;\r
-                       sr = sr >> 3 | xmc[38] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 7 | Nc[3] << 9;\r
-                       sr = sr >> 2 | bc[3] << 14;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 2 | Mc[3] << 14;\r
-                       sr = sr >> 6 | xmaxc[3] << 10;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[39] << 13;\r
-                       sr = sr >> 3 | xmc[40] << 13;\r
-                       sr = sr >> 3 | xmc[41] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[42] << 13;\r
-                       sr = sr >> 3 | xmc[43] << 13;\r
-                       *c++ = sr >> 8;\r
-                       sr = sr >> 3 | xmc[44] << 13;\r
-                       sr = sr >> 3 | xmc[45] << 13;\r
-                       sr = sr >> 3 | xmc[46] << 13;\r
-                       *c++ = sr >> 7;\r
-                       sr = sr >> 3 | xmc[47] << 13;\r
-                       sr = sr >> 3 | xmc[48] << 13;\r
-                       sr = sr >> 3 | xmc[49] << 13;\r
-                       *c++ = sr >> 6;\r
-                       sr = sr >> 3 | xmc[50] << 13;\r
-                       sr = sr >> 3 | xmc[51] << 13;\r
-                       *c++ = sr >> 8;\r
-               }\r
-       }\r
-\r
-       else\r
-\r
-#endif /* WAV49 */\r
-       {\r
-\r
-               *c++ =   ((GSM_MAGIC & 0xF) << 4)               /* 1 */\r
-                      | ((LARc[0] >> 2) & 0xF);\r
-               *c++ =   ((LARc[0] & 0x3) << 6)\r
-                      | (LARc[1] & 0x3F);\r
-               *c++ =   ((LARc[2] & 0x1F) << 3)\r
-                      | ((LARc[3] >> 2) & 0x7);\r
-               *c++ =   ((LARc[3] & 0x3) << 6)\r
-                      | ((LARc[4] & 0xF) << 2)\r
-                      | ((LARc[5] >> 2) & 0x3);\r
-               *c++ =   ((LARc[5] & 0x3) << 6)\r
-                      | ((LARc[6] & 0x7) << 3)\r
-                      | (LARc[7] & 0x7);\r
-               *c++ =   ((Nc[0] & 0x7F) << 1)\r
-                      | ((bc[0] >> 1) & 0x1);\r
-               *c++ =   ((bc[0] & 0x1) << 7)\r
-                      | ((Mc[0] & 0x3) << 5)\r
-                      | ((xmaxc[0] >> 1) & 0x1F);\r
-               *c++ =   ((xmaxc[0] & 0x1) << 7)\r
-                      | ((xmc[0] & 0x7) << 4)\r
-                      | ((xmc[1] & 0x7) << 1)\r
-                      | ((xmc[2] >> 2) & 0x1);\r
-               *c++ =   ((xmc[2] & 0x3) << 6)\r
-                      | ((xmc[3] & 0x7) << 3)\r
-                      | (xmc[4] & 0x7);\r
-               *c++ =   ((xmc[5] & 0x7) << 5)                  /* 10 */\r
-                      | ((xmc[6] & 0x7) << 2)\r
-                      | ((xmc[7] >> 1) & 0x3);\r
-               *c++ =   ((xmc[7] & 0x1) << 7)\r
-                      | ((xmc[8] & 0x7) << 4)\r
-                      | ((xmc[9] & 0x7) << 1)\r
-                      | ((xmc[10] >> 2) & 0x1);\r
-               *c++ =   ((xmc[10] & 0x3) << 6)\r
-                      | ((xmc[11] & 0x7) << 3)\r
-                      | (xmc[12] & 0x7);\r
-               *c++ =   ((Nc[1] & 0x7F) << 1)\r
-                      | ((bc[1] >> 1) & 0x1);\r
-               *c++ =   ((bc[1] & 0x1) << 7)\r
-                      | ((Mc[1] & 0x3) << 5)\r
-                      | ((xmaxc[1] >> 1) & 0x1F);\r
-               *c++ =   ((xmaxc[1] & 0x1) << 7)\r
-                      | ((xmc[13] & 0x7) << 4)\r
-                      | ((xmc[14] & 0x7) << 1)\r
-                      | ((xmc[15] >> 2) & 0x1);\r
-               *c++ =   ((xmc[15] & 0x3) << 6)\r
-                      | ((xmc[16] & 0x7) << 3)\r
-                      | (xmc[17] & 0x7);\r
-               *c++ =   ((xmc[18] & 0x7) << 5)\r
-                      | ((xmc[19] & 0x7) << 2)\r
-                      | ((xmc[20] >> 1) & 0x3);\r
-               *c++ =   ((xmc[20] & 0x1) << 7)\r
-                      | ((xmc[21] & 0x7) << 4)\r
-                      | ((xmc[22] & 0x7) << 1)\r
-                      | ((xmc[23] >> 2) & 0x1);\r
-               *c++ =   ((xmc[23] & 0x3) << 6)\r
-                      | ((xmc[24] & 0x7) << 3)\r
-                      | (xmc[25] & 0x7);\r
-               *c++ =   ((Nc[2] & 0x7F) << 1)                  /* 20 */\r
-                      | ((bc[2] >> 1) & 0x1);\r
-               *c++ =   ((bc[2] & 0x1) << 7)\r
-                      | ((Mc[2] & 0x3) << 5)\r
-                      | ((xmaxc[2] >> 1) & 0x1F);\r
-               *c++ =   ((xmaxc[2] & 0x1) << 7)\r
-                      | ((xmc[26] & 0x7) << 4)\r
-                      | ((xmc[27] & 0x7) << 1)\r
-                      | ((xmc[28] >> 2) & 0x1);\r
-               *c++ =   ((xmc[28] & 0x3) << 6)\r
-                      | ((xmc[29] & 0x7) << 3)\r
-                      | (xmc[30] & 0x7);\r
-               *c++ =   ((xmc[31] & 0x7) << 5)\r
-                      | ((xmc[32] & 0x7) << 2)\r
-                      | ((xmc[33] >> 1) & 0x3);\r
-               *c++ =   ((xmc[33] & 0x1) << 7)\r
-                      | ((xmc[34] & 0x7) << 4)\r
-                      | ((xmc[35] & 0x7) << 1)\r
-                      | ((xmc[36] >> 2) & 0x1);\r
-               *c++ =   ((xmc[36] & 0x3) << 6)\r
-                      | ((xmc[37] & 0x7) << 3)\r
-                      | (xmc[38] & 0x7);\r
-               *c++ =   ((Nc[3] & 0x7F) << 1)\r
-                      | ((bc[3] >> 1) & 0x1);\r
-               *c++ =   ((bc[3] & 0x1) << 7)\r
-                      | ((Mc[3] & 0x3) << 5)\r
-                      | ((xmaxc[3] >> 1) & 0x1F);\r
-               *c++ =   ((xmaxc[3] & 0x1) << 7)\r
-                      | ((xmc[39] & 0x7) << 4)\r
-                      | ((xmc[40] & 0x7) << 1)\r
-                      | ((xmc[41] >> 2) & 0x1);\r
-               *c++ =   ((xmc[41] & 0x3) << 6)                 /* 30 */\r
-                      | ((xmc[42] & 0x7) << 3)\r
-                      | (xmc[43] & 0x7);\r
-               *c++ =   ((xmc[44] & 0x7) << 5)\r
-                      | ((xmc[45] & 0x7) << 2)\r
-                      | ((xmc[46] >> 1) & 0x3);\r
-               *c++ =   ((xmc[46] & 0x1) << 7)\r
-                      | ((xmc[47] & 0x7) << 4)\r
-                      | ((xmc[48] & 0x7) << 1)\r
-                      | ((xmc[49] >> 2) & 0x1);\r
-               *c++ =   ((xmc[49] & 0x3) << 6)\r
-                      | ((xmc[50] & 0x7) << 3)\r
-                      | (xmc[51] & 0x7);\r
-\r
-       }\r
-}\r
+/*
+ * gsm_encode.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include "private.h"
+#include "gsm.h"
+#include "proto.h"
+
+void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
+{
+       word            LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+       Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);
+
+
+       /*      variable        size
+
+               GSM_MAGIC       4
+
+               LARc[0]         6
+               LARc[1]         6
+               LARc[2]         5
+               LARc[3]         5
+               LARc[4]         4
+               LARc[5]         4
+               LARc[6]         3
+               LARc[7]         3
+
+               Nc[0]           7
+               bc[0]           2
+               Mc[0]           2
+               xmaxc[0]        6
+               xmc[0]          3
+               xmc[1]          3
+               xmc[2]          3
+               xmc[3]          3
+               xmc[4]          3
+               xmc[5]          3
+               xmc[6]          3
+               xmc[7]          3
+               xmc[8]          3
+               xmc[9]          3
+               xmc[10]         3
+               xmc[11]         3
+               xmc[12]         3
+
+               Nc[1]           7
+               bc[1]           2
+               Mc[1]           2
+               xmaxc[1]        6
+               xmc[13]         3
+               xmc[14]         3
+               xmc[15]         3
+               xmc[16]         3
+               xmc[17]         3
+               xmc[18]         3
+               xmc[19]         3
+               xmc[20]         3
+               xmc[21]         3
+               xmc[22]         3
+               xmc[23]         3
+               xmc[24]         3
+               xmc[25]         3
+
+               Nc[2]           7
+               bc[2]           2
+               Mc[2]           2
+               xmaxc[2]        6
+               xmc[26]         3
+               xmc[27]         3
+               xmc[28]         3
+               xmc[29]         3
+               xmc[30]         3
+               xmc[31]         3
+               xmc[32]         3
+               xmc[33]         3
+               xmc[34]         3
+               xmc[35]         3
+               xmc[36]         3
+               xmc[37]         3
+               xmc[38]         3
+
+               Nc[3]           7
+               bc[3]           2
+               Mc[3]           2
+               xmaxc[3]        6
+               xmc[39]         3
+               xmc[40]         3
+               xmc[41]         3
+               xmc[42]         3
+               xmc[43]         3
+               xmc[44]         3
+               xmc[45]         3
+               xmc[46]         3
+               xmc[47]         3
+               xmc[48]         3
+               xmc[49]         3
+               xmc[50]         3
+               xmc[51]         3
+       */
+
+#ifdef WAV49
+
+       if (s->wav_fmt) {
+               s->frame_index = !s->frame_index;
+               if (s->frame_index) {
+
+                       uword sr;
+
+                       sr = 0;
+                       sr = sr >> 6 | LARc[0] << 10;
+                       sr = sr >> 6 | LARc[1] << 10;
+                       *c++ = sr >> 4;
+                       sr = sr >> 5 | LARc[2] << 11;
+                       *c++ = sr >> 7;
+                       sr = sr >> 5 | LARc[3] << 11;
+                       sr = sr >> 4 | LARc[4] << 12;
+                       *c++ = sr >> 6;
+                       sr = sr >> 4 | LARc[5] << 12;
+                       sr = sr >> 3 | LARc[6] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | LARc[7] << 13;
+                       sr = sr >> 7 | Nc[0] << 9;
+                       *c++ = sr >> 5;
+                       sr = sr >> 2 | bc[0] << 14;
+                       sr = sr >> 2 | Mc[0] << 14;
+                       sr = sr >> 6 | xmaxc[0] << 10;
+                       *c++ = sr >> 3;
+                       sr = sr >> 3 | xmc[0] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[1] << 13;
+                       sr = sr >> 3 | xmc[2] << 13;
+                       sr = sr >> 3 | xmc[3] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[4] << 13;
+                       sr = sr >> 3 | xmc[5] << 13;
+                       sr = sr >> 3 | xmc[6] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[7] << 13;
+                       sr = sr >> 3 | xmc[8] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[9] << 13;
+                       sr = sr >> 3 | xmc[10] << 13;
+                       sr = sr >> 3 | xmc[11] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[12] << 13;
+                       sr = sr >> 7 | Nc[1] << 9;
+                       *c++ = sr >> 5;
+                       sr = sr >> 2 | bc[1] << 14;
+                       sr = sr >> 2 | Mc[1] << 14;
+                       sr = sr >> 6 | xmaxc[1] << 10;
+                       *c++ = sr >> 3;
+                       sr = sr >> 3 | xmc[13] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[14] << 13;
+                       sr = sr >> 3 | xmc[15] << 13;
+                       sr = sr >> 3 | xmc[16] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[17] << 13;
+                       sr = sr >> 3 | xmc[18] << 13;
+                       sr = sr >> 3 | xmc[19] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[20] << 13;
+                       sr = sr >> 3 | xmc[21] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[22] << 13;
+                       sr = sr >> 3 | xmc[23] << 13;
+                       sr = sr >> 3 | xmc[24] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[25] << 13;
+                       sr = sr >> 7 | Nc[2] << 9;
+                       *c++ = sr >> 5;
+                       sr = sr >> 2 | bc[2] << 14;
+                       sr = sr >> 2 | Mc[2] << 14;
+                       sr = sr >> 6 | xmaxc[2] << 10;
+                       *c++ = sr >> 3;
+                       sr = sr >> 3 | xmc[26] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[27] << 13;
+                       sr = sr >> 3 | xmc[28] << 13;
+                       sr = sr >> 3 | xmc[29] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[30] << 13;
+                       sr = sr >> 3 | xmc[31] << 13;
+                       sr = sr >> 3 | xmc[32] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[33] << 13;
+                       sr = sr >> 3 | xmc[34] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[35] << 13;
+                       sr = sr >> 3 | xmc[36] << 13;
+                       sr = sr >> 3 | xmc[37] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[38] << 13;
+                       sr = sr >> 7 | Nc[3] << 9;
+                       *c++ = sr >> 5;
+                       sr = sr >> 2 | bc[3] << 14;
+                       sr = sr >> 2 | Mc[3] << 14;
+                       sr = sr >> 6 | xmaxc[3] << 10;
+                       *c++ = sr >> 3;
+                       sr = sr >> 3 | xmc[39] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[40] << 13;
+                       sr = sr >> 3 | xmc[41] << 13;
+                       sr = sr >> 3 | xmc[42] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[43] << 13;
+                       sr = sr >> 3 | xmc[44] << 13;
+                       sr = sr >> 3 | xmc[45] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[46] << 13;
+                       sr = sr >> 3 | xmc[47] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[48] << 13;
+                       sr = sr >> 3 | xmc[49] << 13;
+                       sr = sr >> 3 | xmc[50] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[51] << 13;
+                       sr = sr >> 4;
+                       *c = sr >> 8;
+                       s->frame_chain = *c;
+               }
+               else {
+                       uword sr;
+
+                       sr = 0;
+                       sr = sr >> 4 | s->frame_chain << 12;
+                       sr = sr >> 6 | LARc[0] << 10;
+                       *c++ = sr >> 6;
+                       sr = sr >> 6 | LARc[1] << 10;
+                       *c++ = sr >> 8;
+                       sr = sr >> 5 | LARc[2] << 11;
+                       sr = sr >> 5 | LARc[3] << 11;
+                       *c++ = sr >> 6;
+                       sr = sr >> 4 | LARc[4] << 12;
+                       sr = sr >> 4 | LARc[5] << 12;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | LARc[6] << 13;
+                       sr = sr >> 3 | LARc[7] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 7 | Nc[0] << 9;
+                       sr = sr >> 2 | bc[0] << 14;
+                       *c++ = sr >> 7;
+                       sr = sr >> 2 | Mc[0] << 14;
+                       sr = sr >> 6 | xmaxc[0] << 10;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[0] << 13;
+                       sr = sr >> 3 | xmc[1] << 13;
+                       sr = sr >> 3 | xmc[2] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[3] << 13;
+                       sr = sr >> 3 | xmc[4] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[5] << 13;
+                       sr = sr >> 3 | xmc[6] << 13;
+                       sr = sr >> 3 | xmc[7] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[8] << 13;
+                       sr = sr >> 3 | xmc[9] << 13;
+                       sr = sr >> 3 | xmc[10] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[11] << 13;
+                       sr = sr >> 3 | xmc[12] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 7 | Nc[1] << 9;
+                       sr = sr >> 2 | bc[1] << 14;
+                       *c++ = sr >> 7;
+                       sr = sr >> 2 | Mc[1] << 14;
+                       sr = sr >> 6 | xmaxc[1] << 10;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[13] << 13;
+                       sr = sr >> 3 | xmc[14] << 13;
+                       sr = sr >> 3 | xmc[15] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[16] << 13;
+                       sr = sr >> 3 | xmc[17] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[18] << 13;
+                       sr = sr >> 3 | xmc[19] << 13;
+                       sr = sr >> 3 | xmc[20] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[21] << 13;
+                       sr = sr >> 3 | xmc[22] << 13;
+                       sr = sr >> 3 | xmc[23] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[24] << 13;
+                       sr = sr >> 3 | xmc[25] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 7 | Nc[2] << 9;
+                       sr = sr >> 2 | bc[2] << 14;
+                       *c++ = sr >> 7;
+                       sr = sr >> 2 | Mc[2] << 14;
+                       sr = sr >> 6 | xmaxc[2] << 10;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[26] << 13;
+                       sr = sr >> 3 | xmc[27] << 13;
+                       sr = sr >> 3 | xmc[28] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[29] << 13;
+                       sr = sr >> 3 | xmc[30] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[31] << 13;
+                       sr = sr >> 3 | xmc[32] << 13;
+                       sr = sr >> 3 | xmc[33] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[34] << 13;
+                       sr = sr >> 3 | xmc[35] << 13;
+                       sr = sr >> 3 | xmc[36] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[37] << 13;
+                       sr = sr >> 3 | xmc[38] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 7 | Nc[3] << 9;
+                       sr = sr >> 2 | bc[3] << 14;
+                       *c++ = sr >> 7;
+                       sr = sr >> 2 | Mc[3] << 14;
+                       sr = sr >> 6 | xmaxc[3] << 10;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[39] << 13;
+                       sr = sr >> 3 | xmc[40] << 13;
+                       sr = sr >> 3 | xmc[41] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[42] << 13;
+                       sr = sr >> 3 | xmc[43] << 13;
+                       *c++ = sr >> 8;
+                       sr = sr >> 3 | xmc[44] << 13;
+                       sr = sr >> 3 | xmc[45] << 13;
+                       sr = sr >> 3 | xmc[46] << 13;
+                       *c++ = sr >> 7;
+                       sr = sr >> 3 | xmc[47] << 13;
+                       sr = sr >> 3 | xmc[48] << 13;
+                       sr = sr >> 3 | xmc[49] << 13;
+                       *c++ = sr >> 6;
+                       sr = sr >> 3 | xmc[50] << 13;
+                       sr = sr >> 3 | xmc[51] << 13;
+                       *c++ = sr >> 8;
+               }
+       }
+
+       else
+
+#endif /* WAV49 */
+       {
+
+               *c++ =   ((GSM_MAGIC & 0xF) << 4)               /* 1 */
+                      | ((LARc[0] >> 2) & 0xF);
+               *c++ =   ((LARc[0] & 0x3) << 6)
+                      | (LARc[1] & 0x3F);
+               *c++ =   ((LARc[2] & 0x1F) << 3)
+                      | ((LARc[3] >> 2) & 0x7);
+               *c++ =   ((LARc[3] & 0x3) << 6)
+                      | ((LARc[4] & 0xF) << 2)
+                      | ((LARc[5] >> 2) & 0x3);
+               *c++ =   ((LARc[5] & 0x3) << 6)
+                      | ((LARc[6] & 0x7) << 3)
+                      | (LARc[7] & 0x7);
+               *c++ =   ((Nc[0] & 0x7F) << 1)
+                      | ((bc[0] >> 1) & 0x1);
+               *c++ =   ((bc[0] & 0x1) << 7)
+                      | ((Mc[0] & 0x3) << 5)
+                      | ((xmaxc[0] >> 1) & 0x1F);
+               *c++ =   ((xmaxc[0] & 0x1) << 7)
+                      | ((xmc[0] & 0x7) << 4)
+                      | ((xmc[1] & 0x7) << 1)
+                      | ((xmc[2] >> 2) & 0x1);
+               *c++ =   ((xmc[2] & 0x3) << 6)
+                      | ((xmc[3] & 0x7) << 3)
+                      | (xmc[4] & 0x7);
+               *c++ =   ((xmc[5] & 0x7) << 5)                  /* 10 */
+                      | ((xmc[6] & 0x7) << 2)
+                      | ((xmc[7] >> 1) & 0x3);
+               *c++ =   ((xmc[7] & 0x1) << 7)
+                      | ((xmc[8] & 0x7) << 4)
+                      | ((xmc[9] & 0x7) << 1)
+                      | ((xmc[10] >> 2) & 0x1);
+               *c++ =   ((xmc[10] & 0x3) << 6)
+                      | ((xmc[11] & 0x7) << 3)
+                      | (xmc[12] & 0x7);
+               *c++ =   ((Nc[1] & 0x7F) << 1)
+                      | ((bc[1] >> 1) & 0x1);
+               *c++ =   ((bc[1] & 0x1) << 7)
+                      | ((Mc[1] & 0x3) << 5)
+                      | ((xmaxc[1] >> 1) & 0x1F);
+               *c++ =   ((xmaxc[1] & 0x1) << 7)
+                      | ((xmc[13] & 0x7) << 4)
+                      | ((xmc[14] & 0x7) << 1)
+                      | ((xmc[15] >> 2) & 0x1);
+               *c++ =   ((xmc[15] & 0x3) << 6)
+                      | ((xmc[16] & 0x7) << 3)
+                      | (xmc[17] & 0x7);
+               *c++ =   ((xmc[18] & 0x7) << 5)
+                      | ((xmc[19] & 0x7) << 2)
+                      | ((xmc[20] >> 1) & 0x3);
+               *c++ =   ((xmc[20] & 0x1) << 7)
+                      | ((xmc[21] & 0x7) << 4)
+                      | ((xmc[22] & 0x7) << 1)
+                      | ((xmc[23] >> 2) & 0x1);
+               *c++ =   ((xmc[23] & 0x3) << 6)
+                      | ((xmc[24] & 0x7) << 3)
+                      | (xmc[25] & 0x7);
+               *c++ =   ((Nc[2] & 0x7F) << 1)                  /* 20 */
+                      | ((bc[2] >> 1) & 0x1);
+               *c++ =   ((bc[2] & 0x1) << 7)
+                      | ((Mc[2] & 0x3) << 5)
+                      | ((xmaxc[2] >> 1) & 0x1F);
+               *c++ =   ((xmaxc[2] & 0x1) << 7)
+                      | ((xmc[26] & 0x7) << 4)
+                      | ((xmc[27] & 0x7) << 1)
+                      | ((xmc[28] >> 2) & 0x1);
+               *c++ =   ((xmc[28] & 0x3) << 6)
+                      | ((xmc[29] & 0x7) << 3)
+                      | (xmc[30] & 0x7);
+               *c++ =   ((xmc[31] & 0x7) << 5)
+                      | ((xmc[32] & 0x7) << 2)
+                      | ((xmc[33] >> 1) & 0x3);
+               *c++ =   ((xmc[33] & 0x1) << 7)
+                      | ((xmc[34] & 0x7) << 4)
+                      | ((xmc[35] & 0x7) << 1)
+                      | ((xmc[36] >> 2) & 0x1);
+               *c++ =   ((xmc[36] & 0x3) << 6)
+                      | ((xmc[37] & 0x7) << 3)
+                      | (xmc[38] & 0x7);
+               *c++ =   ((Nc[3] & 0x7F) << 1)
+                      | ((bc[3] >> 1) & 0x1);
+               *c++ =   ((bc[3] & 0x1) << 7)
+                      | ((Mc[3] & 0x3) << 5)
+                      | ((xmaxc[3] >> 1) & 0x1F);
+               *c++ =   ((xmaxc[3] & 0x1) << 7)
+                      | ((xmc[39] & 0x7) << 4)
+                      | ((xmc[40] & 0x7) << 1)
+                      | ((xmc[41] >> 2) & 0x1);
+               *c++ =   ((xmc[41] & 0x3) << 6)                 /* 30 */
+                      | ((xmc[42] & 0x7) << 3)
+                      | (xmc[43] & 0x7);
+               *c++ =   ((xmc[44] & 0x7) << 5)
+                      | ((xmc[45] & 0x7) << 2)
+                      | ((xmc[46] >> 1) & 0x3);
+               *c++ =   ((xmc[46] & 0x1) << 7)
+                      | ((xmc[47] & 0x7) << 4)
+                      | ((xmc[48] & 0x7) << 1)
+                      | ((xmc[49] >> 2) & 0x1);
+               *c++ =   ((xmc[49] & 0x3) << 6)
+                      | ((xmc[50] & 0x7) << 3)
+                      | (xmc[51] & 0x7);
+
+       }
+}
index 2646ef4e2444ea35663322048242b5339a0cff3e..135b61f202e6ca48e1da0f0d8870b17f72ad438a 100644 (file)
-/*\r
- * gsm_lpc.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-#undef P\r
-\r
-/*\r
- *  4.2.4 .. 4.2.7 LPC ANALYSIS SECTION\r
- */\r
-\r
-/* 4.2.4 */\r
-\r
-\r
-static void Autocorrelation P2((s, L_ACF),\r
-       word     * s,           /* [0..159]     IN/OUT  */\r
-       longword * L_ACF)       /* [0..8]       OUT     */\r
-/*\r
- *  The goal is to compute the array L_ACF[k].  The signal s[i] must\r
- *  be scaled in order to avoid an overflow situation.\r
- */\r
-{\r
-       register int    k, i;\r
-\r
-       word            temp, smax, scalauto;\r
-\r
-#ifdef USE_FLOAT_MUL\r
-       float           float_s[160];\r
-#endif\r
-\r
-       /*  Dynamic scaling of the array  s[0..159]\r
-        */\r
-\r
-       /*  Search for the maximum.\r
-        */\r
-       smax = 0;\r
-       for (k = 0; k <= 159; k++) {\r
-               temp = GSM_ABS( s[k] );\r
-               if (temp > smax) smax = temp;\r
-       }\r
-\r
-       /*  Computation of the scaling factor.\r
-        */\r
-       if (smax == 0) scalauto = 0;\r
-       else {\r
-               assert(smax > 0);\r
-               scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */\r
-       }\r
-\r
-       /*  Scaling of the array s[0...159]\r
-        */\r
-\r
-       if (scalauto > 0) {\r
-\r
-# ifdef USE_FLOAT_MUL\r
-#   define SCALE(n)    \\r
-       case n: for (k = 0; k <= 159; k++) \\r
-                       float_s[k] = (float)    \\r
-                               (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\\r
-               break;\r
-# else \r
-#   define SCALE(n)    \\r
-       case n: for (k = 0; k <= 159; k++) \\r
-                       s[k] = (word) GSM_MULT_R( s[k], 16384 >> (n-1) );\\r
-               break;\r
-# endif /* USE_FLOAT_MUL */\r
-\r
-               switch (scalauto) {\r
-               SCALE(1)\r
-               SCALE(2)\r
-               SCALE(3)\r
-               SCALE(4)\r
-               }\r
-# undef        SCALE\r
-       }\r
-# ifdef        USE_FLOAT_MUL\r
-       else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];\r
-# endif\r
-\r
-       /*  Compute the L_ACF[..].\r
-        */\r
-       {\r
-# ifdef        USE_FLOAT_MUL\r
-               register float * sp = float_s;\r
-               register float   sl = *sp;\r
-\r
-#              define STEP(k)   L_ACF[k] += (longword)(sl * sp[ -(k) ]);\r
-# else\r
-               word  * sp = s;\r
-               word    sl = *sp;\r
-\r
-#              define STEP(k)   L_ACF[k] += ((longword)sl * sp[ -(k) ]);\r
-# endif\r
-\r
-#      define NEXTI     sl = *++sp\r
-\r
-\r
-       for (k = 9; k--; L_ACF[k] = 0) ;\r
-\r
-       STEP (0);\r
-       NEXTI;\r
-       STEP(0); STEP(1);\r
-       NEXTI;\r
-       STEP(0); STEP(1); STEP(2);\r
-       NEXTI;\r
-       STEP(0); STEP(1); STEP(2); STEP(3);\r
-       NEXTI;\r
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);\r
-       NEXTI;\r
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);\r
-       NEXTI;\r
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);\r
-       NEXTI;\r
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);\r
-\r
-       for (i = 8; i <= 159; i++) {\r
-\r
-               NEXTI;\r
-\r
-               STEP(0);\r
-               STEP(1); STEP(2); STEP(3); STEP(4);\r
-               STEP(5); STEP(6); STEP(7); STEP(8);\r
-       }\r
-\r
-       for (k = 9; k--; L_ACF[k] <<= 1) ; \r
-\r
-       }\r
-       /*   Rescaling of the array s[0..159]\r
-        */\r
-       if (scalauto > 0) {\r
-               assert(scalauto <= 4); \r
-               for (k = 160; k--; *s++ <<= scalauto) ;\r
-       }\r
-}\r
-\r
-#if defined(USE_FLOAT_MUL) && defined(FAST)\r
-\r
-static void Fast_Autocorrelation P2((s, L_ACF),\r
-       word * s,               /* [0..159]     IN/OUT  */\r
-       longword * L_ACF)       /* [0..8]       OUT     */\r
-{\r
-       register int    k, i;\r
-       float f_L_ACF[9];\r
-       float scale;\r
-\r
-       float          s_f[160];\r
-       register float *sf = s_f;\r
-\r
-       for (i = 0; i < 160; ++i) sf[i] = s[i];\r
-       for (k = 0; k <= 8; k++) {\r
-               register float L_temp2 = 0;\r
-               register float *sfl = sf - k;\r
-               for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];\r
-               f_L_ACF[k] = L_temp2;\r
-       }\r
-       scale = MAX_LONGWORD / f_L_ACF[0];\r
-\r
-       for (k = 0; k <= 8; k++) {\r
-               L_ACF[k] = f_L_ACF[k] * scale;\r
-       }\r
-}\r
-#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */\r
-\r
-/* 4.2.5 */\r
-\r
-static void Reflection_coefficients P2( (L_ACF, r),\r
-       longword        * L_ACF,                /* 0...8        IN      */\r
-       register word   * r                     /* 0...7        OUT     */\r
-)\r
-{\r
-       register int    i, m, n;\r
-       register word   temp;\r
-       register longword ltmp;\r
-       word            ACF[9]; /* 0..8 */\r
-       word            P[  9]; /* 0..8 */\r
-       word            K[  9]; /* 2..8 */\r
-\r
-       /*  Schur recursion with 16 bits arithmetic.\r
-        */\r
-\r
-       if (L_ACF[0] == 0) {\r
-               for (i = 8; i--; *r++ = 0) ;\r
-               return;\r
-       }\r
-\r
-       assert( L_ACF[0] != 0 );\r
-       temp = gsm_norm( L_ACF[0] );\r
-\r
-       assert(temp >= 0 && temp < 32);\r
-\r
-       /* ? overflow ? */\r
-       for (i = 0; i <= 8; i++) ACF[i] = (word) SASR( L_ACF[i] << temp, 16 );\r
-\r
-       /*   Initialize array P[..] and K[..] for the recursion.\r
-        */\r
-\r
-       for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];\r
-       for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];\r
-\r
-       /*   Compute reflection coefficients\r
-        */\r
-       for (n = 1; n <= 8; n++, r++) {\r
-\r
-               temp = P[1];\r
-               temp = GSM_ABS(temp);\r
-               if (P[0] < temp) {\r
-                       for (i = n; i <= 8; i++) *r++ = 0;\r
-                       return;\r
-               }\r
-\r
-               *r = gsm_div( temp, P[0] );\r
-\r
-               assert(*r >= 0);\r
-               if (P[1] > 0) *r = -*r;         /* r[n] = sub(0, r[n]) */\r
-               assert (*r != MIN_WORD);\r
-               if (n == 8) return; \r
-\r
-               /*  Schur recursion\r
-                */\r
-               temp = (word) GSM_MULT_R( P[1], *r );\r
-               P[0] = (word) GSM_ADD( P[0], temp );\r
-\r
-               for (m = 1; m <= 8 - n; m++) {\r
-                       temp     = (word) GSM_MULT_R( K[ m   ],    *r );\r
-                       P[m]     = (word) GSM_ADD(    P[ m+1 ],  temp );\r
-\r
-                       temp     = (word) GSM_MULT_R( P[ m+1 ],    *r );\r
-                       K[m]     = (word) GSM_ADD(    K[ m   ],  temp );\r
-               }\r
-       }\r
-}\r
-\r
-/* 4.2.6 */\r
-\r
-static void Transformation_to_Log_Area_Ratios P1((r),\r
-       register word   * r                     /* 0..7    IN/OUT */\r
-)\r
-/*\r
- *  The following scaling for r[..] and LAR[..] has been used:\r
- *\r
- *  r[..]   = integer( real_r[..]*32768. ); -1 <= real_r < 1.\r
- *  LAR[..] = integer( real_LAR[..] * 16384 );\r
- *  with -1.625 <= real_LAR <= 1.625\r
- */\r
-{\r
-       register word   temp;\r
-       register int    i;\r
-\r
-\r
-       /* Computation of the LAR[0..7] from the r[0..7]\r
-        */\r
-       for (i = 1; i <= 8; i++, r++) {\r
-\r
-               temp = *r;\r
-               temp = GSM_ABS(temp);\r
-               assert(temp >= 0);\r
-\r
-               if (temp < 22118) {\r
-                       temp >>= 1;\r
-               } else if (temp < 31130) {\r
-                       assert( temp >= 11059 );\r
-                       temp -= 11059;\r
-               } else {\r
-                       assert( temp >= 26112 );\r
-                       temp -= 26112;\r
-                       temp <<= 2;\r
-               }\r
-\r
-               *r = *r < 0 ? -temp : temp;\r
-               assert( *r != MIN_WORD );\r
-       }\r
-}\r
-\r
-/* 4.2.7 */\r
-\r
-static void Quantization_and_coding P1((LAR),\r
-       register word * LAR     /* [0..7]       IN/OUT  */\r
-)\r
-{\r
-       register word   temp;\r
-       longword        ltmp;\r
-\r
-\r
-       /*  This procedure needs four tables; the following equations\r
-        *  give the optimum scaling for the constants:\r
-        *  \r
-        *  A[0..7] = integer( real_A[0..7] * 1024 )\r
-        *  B[0..7] = integer( real_B[0..7] *  512 )\r
-        *  MAC[0..7] = maximum of the LARc[0..7]\r
-        *  MIC[0..7] = minimum of the LARc[0..7]\r
-        */\r
-\r
-#      undef STEP\r
-#      define  STEP( A, B, MAC, MIC )          \\r
-               temp = (word)GSM_MULT( A,   *LAR );     \\r
-               temp = (word) GSM_ADD(  temp,   B );    \\r
-               temp = (word) GSM_ADD(  temp, 256 );    \\r
-               temp = (word)SASR(     temp,   9 );     \\r
-               *LAR  =  temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \\r
-               LAR++;\r
-\r
-       STEP(  20480,     0,  31, -32 );\r
-       STEP(  20480,     0,  31, -32 );\r
-       STEP(  20480,  2048,  15, -16 );\r
-       STEP(  20480, -2560,  15, -16 );\r
-\r
-       STEP(  13964,    94,   7,  -8 );\r
-       STEP(  15360, -1792,   7,  -8 );\r
-       STEP(   8534,  -341,   3,  -4 );\r
-       STEP(   9036, -1144,   3,  -4 );\r
-\r
-#      undef   STEP\r
-}\r
-\r
-void Gsm_LPC_Analysis P3((S, s,LARc),\r
-       struct gsm_state *S,\r
-       word             * s,           /* 0..159 signals       IN/OUT  */\r
-        word            * LARc)        /* 0..7   LARc's        OUT     */\r
-{\r
-       longword        L_ACF[9];\r
-\r
-#if defined(USE_FLOAT_MUL) && defined(FAST)\r
-       if (S->fast) Fast_Autocorrelation (s,     L_ACF );\r
-       else\r
-#endif\r
-       Autocorrelation                   (s,     L_ACF );\r
-       Reflection_coefficients           (L_ACF, LARc  );\r
-       Transformation_to_Log_Area_Ratios (LARc);\r
-       Quantization_and_coding           (LARc);\r
-}\r
+/*
+ * gsm_lpc.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+#undef P
+
+/*
+ *  4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
+ */
+
+/* 4.2.4 */
+
+
+static void Autocorrelation P2((s, L_ACF),
+       word     * s,           /* [0..159]     IN/OUT  */
+       longword * L_ACF)       /* [0..8]       OUT     */
+/*
+ *  The goal is to compute the array L_ACF[k].  The signal s[i] must
+ *  be scaled in order to avoid an overflow situation.
+ */
+{
+       register int    k, i;
+
+       word            temp, smax, scalauto;
+
+#ifdef USE_FLOAT_MUL
+       float           float_s[160];
+#endif
+
+       /*  Dynamic scaling of the array  s[0..159]
+        */
+
+       /*  Search for the maximum.
+        */
+       smax = 0;
+       for (k = 0; k <= 159; k++) {
+               temp = GSM_ABS( s[k] );
+               if (temp > smax) smax = temp;
+       }
+
+       /*  Computation of the scaling factor.
+        */
+       if (smax == 0) scalauto = 0;
+       else {
+               assert(smax > 0);
+               scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */
+       }
+
+       /*  Scaling of the array s[0...159]
+        */
+
+       if (scalauto > 0) {
+
+# ifdef USE_FLOAT_MUL
+#   define SCALE(n)    \
+       case n: for (k = 0; k <= 159; k++) \
+                       float_s[k] = (float)    \
+                               (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\
+               break;
+# else 
+#   define SCALE(n)    \
+       case n: for (k = 0; k <= 159; k++) \
+                       s[k] = (word) GSM_MULT_R( s[k], 16384 >> (n-1) );\
+               break;
+# endif /* USE_FLOAT_MUL */
+
+               switch (scalauto) {
+               SCALE(1)
+               SCALE(2)
+               SCALE(3)
+               SCALE(4)
+               }
+# undef        SCALE
+       }
+# ifdef        USE_FLOAT_MUL
+       else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
+# endif
+
+       /*  Compute the L_ACF[..].
+        */
+       {
+# ifdef        USE_FLOAT_MUL
+               register float * sp = float_s;
+               register float   sl = *sp;
+
+#              define STEP(k)   L_ACF[k] += (longword)(sl * sp[ -(k) ]);
+# else
+               word  * sp = s;
+               word    sl = *sp;
+
+#              define STEP(k)   L_ACF[k] += ((longword)sl * sp[ -(k) ]);
+# endif
+
+#      define NEXTI     sl = *++sp
+
+
+       for (k = 9; k--; L_ACF[k] = 0) ;
+
+       STEP (0);
+       NEXTI;
+       STEP(0); STEP(1);
+       NEXTI;
+       STEP(0); STEP(1); STEP(2);
+       NEXTI;
+       STEP(0); STEP(1); STEP(2); STEP(3);
+       NEXTI;
+       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);
+       NEXTI;
+       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
+       NEXTI;
+       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
+       NEXTI;
+       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
+
+       for (i = 8; i <= 159; i++) {
+
+               NEXTI;
+
+               STEP(0);
+               STEP(1); STEP(2); STEP(3); STEP(4);
+               STEP(5); STEP(6); STEP(7); STEP(8);
+       }
+
+       for (k = 9; k--; L_ACF[k] <<= 1) ; 
+
+       }
+       /*   Rescaling of the array s[0..159]
+        */
+       if (scalauto > 0) {
+               assert(scalauto <= 4); 
+               for (k = 160; k--; *s++ <<= scalauto) ;
+       }
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Autocorrelation P2((s, L_ACF),
+       word * s,               /* [0..159]     IN/OUT  */
+       longword * L_ACF)       /* [0..8]       OUT     */
+{
+       register int    k, i;
+       float f_L_ACF[9];
+       float scale;
+
+       float          s_f[160];
+       register float *sf = s_f;
+
+       for (i = 0; i < 160; ++i) sf[i] = s[i];
+       for (k = 0; k <= 8; k++) {
+               register float L_temp2 = 0;
+               register float *sfl = sf - k;
+               for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];
+               f_L_ACF[k] = L_temp2;
+       }
+       scale = MAX_LONGWORD / f_L_ACF[0];
+
+       for (k = 0; k <= 8; k++) {
+               L_ACF[k] = f_L_ACF[k] * scale;
+       }
+}
+#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */
+
+/* 4.2.5 */
+
+static void Reflection_coefficients P2( (L_ACF, r),
+       longword        * L_ACF,                /* 0...8        IN      */
+       register word   * r                     /* 0...7        OUT     */
+)
+{
+       register int    i, m, n;
+       register word   temp;
+       register longword ltmp;
+       word            ACF[9]; /* 0..8 */
+       word            P[  9]; /* 0..8 */
+       word            K[  9]; /* 2..8 */
+
+       /*  Schur recursion with 16 bits arithmetic.
+        */
+
+       if (L_ACF[0] == 0) {
+               for (i = 8; i--; *r++ = 0) ;
+               return;
+       }
+
+       assert( L_ACF[0] != 0 );
+       temp = gsm_norm( L_ACF[0] );
+
+       assert(temp >= 0 && temp < 32);
+
+       /* ? overflow ? */
+       for (i = 0; i <= 8; i++) ACF[i] = (word) SASR( L_ACF[i] << temp, 16 );
+
+       /*   Initialize array P[..] and K[..] for the recursion.
+        */
+
+       for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];
+       for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];
+
+       /*   Compute reflection coefficients
+        */
+       for (n = 1; n <= 8; n++, r++) {
+
+               temp = P[1];
+               temp = GSM_ABS(temp);
+               if (P[0] < temp) {
+                       for (i = n; i <= 8; i++) *r++ = 0;
+                       return;
+               }
+
+               *r = gsm_div( temp, P[0] );
+
+               assert(*r >= 0);
+               if (P[1] > 0) *r = -*r;         /* r[n] = sub(0, r[n]) */
+               assert (*r != MIN_WORD);
+               if (n == 8) return; 
+
+               /*  Schur recursion
+                */
+               temp = (word) GSM_MULT_R( P[1], *r );
+               P[0] = (word) GSM_ADD( P[0], temp );
+
+               for (m = 1; m <= 8 - n; m++) {
+                       temp     = (word) GSM_MULT_R( K[ m   ],    *r );
+                       P[m]     = (word) GSM_ADD(    P[ m+1 ],  temp );
+
+                       temp     = (word) GSM_MULT_R( P[ m+1 ],    *r );
+                       K[m]     = (word) GSM_ADD(    K[ m   ],  temp );
+               }
+       }
+}
+
+/* 4.2.6 */
+
+static void Transformation_to_Log_Area_Ratios P1((r),
+       register word   * r                     /* 0..7    IN/OUT */
+)
+/*
+ *  The following scaling for r[..] and LAR[..] has been used:
+ *
+ *  r[..]   = integer( real_r[..]*32768. ); -1 <= real_r < 1.
+ *  LAR[..] = integer( real_LAR[..] * 16384 );
+ *  with -1.625 <= real_LAR <= 1.625
+ */
+{
+       register word   temp;
+       register int    i;
+
+
+       /* Computation of the LAR[0..7] from the r[0..7]
+        */
+       for (i = 1; i <= 8; i++, r++) {
+
+               temp = *r;
+               temp = GSM_ABS(temp);
+               assert(temp >= 0);
+
+               if (temp < 22118) {
+                       temp >>= 1;
+               } else if (temp < 31130) {
+                       assert( temp >= 11059 );
+                       temp -= 11059;
+               } else {
+                       assert( temp >= 26112 );
+                       temp -= 26112;
+                       temp <<= 2;
+               }
+
+               *r = *r < 0 ? -temp : temp;
+               assert( *r != MIN_WORD );
+       }
+}
+
+/* 4.2.7 */
+
+static void Quantization_and_coding P1((LAR),
+       register word * LAR     /* [0..7]       IN/OUT  */
+)
+{
+       register word   temp;
+       longword        ltmp;
+
+
+       /*  This procedure needs four tables; the following equations
+        *  give the optimum scaling for the constants:
+        *  
+        *  A[0..7] = integer( real_A[0..7] * 1024 )
+        *  B[0..7] = integer( real_B[0..7] *  512 )
+        *  MAC[0..7] = maximum of the LARc[0..7]
+        *  MIC[0..7] = minimum of the LARc[0..7]
+        */
+
+#      undef STEP
+#      define  STEP( A, B, MAC, MIC )          \
+               temp = (word)GSM_MULT( A,   *LAR );     \
+               temp = (word) GSM_ADD(  temp,   B );    \
+               temp = (word) GSM_ADD(  temp, 256 );    \
+               temp = (word)SASR(     temp,   9 );     \
+               *LAR  =  temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \
+               LAR++;
+
+       STEP(  20480,     0,  31, -32 );
+       STEP(  20480,     0,  31, -32 );
+       STEP(  20480,  2048,  15, -16 );
+       STEP(  20480, -2560,  15, -16 );
+
+       STEP(  13964,    94,   7,  -8 );
+       STEP(  15360, -1792,   7,  -8 );
+       STEP(   8534,  -341,   3,  -4 );
+       STEP(   9036, -1144,   3,  -4 );
+
+#      undef   STEP
+}
+
+void Gsm_LPC_Analysis P3((S, s,LARc),
+       struct gsm_state *S,
+       word             * s,           /* 0..159 signals       IN/OUT  */
+        word            * LARc)        /* 0..7   LARc's        OUT     */
+{
+       longword        L_ACF[9];
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+       if (S->fast) Fast_Autocorrelation (s,     L_ACF );
+       else
+#endif
+       Autocorrelation                   (s,     L_ACF );
+       Reflection_coefficients           (L_ACF, LARc  );
+       Transformation_to_Log_Area_Ratios (LARc);
+       Quantization_and_coding           (LARc);
+}
index f87072592b0f0826844b0652137a9d531ef5c03b..dd64da4c7e1316de15aff51e88b90fb9e01dcd6d 100644 (file)
@@ -1,70 +1,70 @@
-/*\r
- * gsm_option.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-int gsm_option P3((r, opt, val), gsm r, int opt, int * val)\r
-{\r
-       int     result = -1;\r
-\r
-       switch (opt) {\r
-       case GSM_OPT_LTP_CUT:\r
-#ifdef         LTP_CUT\r
-               result = r->ltp_cut;\r
-               if (val) r->ltp_cut = *val;\r
-#endif\r
-               break;\r
-\r
-       case GSM_OPT_VERBOSE:\r
-#ifndef        NDEBUG\r
-               result = r->verbose;\r
-               if (val) r->verbose = *val;\r
-#endif\r
-               break;\r
-\r
-       case GSM_OPT_FAST:\r
-\r
-#if    defined(FAST) && defined(USE_FLOAT_MUL)\r
-               result = r->fast;\r
-               if (val) r->fast = !!*val;\r
-#endif\r
-               break;\r
-\r
-       case GSM_OPT_FRAME_CHAIN:\r
-\r
-#ifdef WAV49\r
-               result = r->frame_chain;\r
-               if (val) r->frame_chain = *val;\r
-#endif\r
-               break;\r
-\r
-       case GSM_OPT_FRAME_INDEX:\r
-\r
-#ifdef WAV49\r
-               result = r->frame_index;\r
-               if (val) r->frame_index = *val;\r
-#endif\r
-               break;\r
-\r
-       case GSM_OPT_WAV49:\r
-\r
-#ifdef WAV49 \r
-               result = r->wav_fmt;\r
-               if (val) r->wav_fmt = !!*val;\r
-#endif\r
-               break;\r
-\r
-       default:\r
-               break;\r
-       }\r
-       return result;\r
-}\r
+/*
+ * gsm_option.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_option P3((r, opt, val), gsm r, int opt, int * val)
+{
+       int     result = -1;
+
+       switch (opt) {
+       case GSM_OPT_LTP_CUT:
+#ifdef         LTP_CUT
+               result = r->ltp_cut;
+               if (val) r->ltp_cut = *val;
+#endif
+               break;
+
+       case GSM_OPT_VERBOSE:
+#ifndef        NDEBUG
+               result = r->verbose;
+               if (val) r->verbose = *val;
+#endif
+               break;
+
+       case GSM_OPT_FAST:
+
+#if    defined(FAST) && defined(USE_FLOAT_MUL)
+               result = r->fast;
+               if (val) r->fast = !!*val;
+#endif
+               break;
+
+       case GSM_OPT_FRAME_CHAIN:
+
+#ifdef WAV49
+               result = r->frame_chain;
+               if (val) r->frame_chain = *val;
+#endif
+               break;
+
+       case GSM_OPT_FRAME_INDEX:
+
+#ifdef WAV49
+               result = r->frame_index;
+               if (val) r->frame_index = *val;
+#endif
+               break;
+
+       case GSM_OPT_WAV49:
+
+#ifdef WAV49 
+               result = r->wav_fmt;
+               if (val) r->wav_fmt = !!*val;
+#endif
+               break;
+
+       default:
+               break;
+       }
+       return result;
+}
index 3239fef52c9d27b72ed1dea16da335b1b1398fb0..aabd14a42ffe8d77bd8e50aea9fcf3c94e2f3c7c 100644 (file)
-/*\r
- * long_term.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-/*\r
- *  4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION\r
- */\r
-\r
-\r
-/*\r
- * This module computes the LTP gain (bc) and the LTP lag (Nc)\r
- * for the long term analysis filter.   This is done by calculating a\r
- * maximum of the cross-correlation function between the current\r
- * sub-segment short term residual signal d[0..39] (output of\r
- * the short term analysis filter; for simplification the index\r
- * of this array begins at 0 and ends at 39 for each sub-segment of the\r
- * RPE-LTP analysis) and the previous reconstructed short term\r
- * residual signal dp[ -120 .. -1 ].  A dynamic scaling must be\r
- * performed to avoid overflow.\r
- */\r
-\r
- /* The next procedure exists in six versions.  First two integer\r
-  * version (if USE_FLOAT_MUL is not defined); then four floating\r
-  * point versions, twice with proper scaling (USE_FLOAT_MUL defined),\r
-  * once without (USE_FLOAT_MUL and FAST defined, and fast run-time\r
-  * option used).  Every pair has first a Cut version (see the -C\r
-  * option to toast or the LTP_CUT option to gsm_option()), then the\r
-  * uncut one.  (For a detailed explanation of why this is altogether\r
-  * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered\r
-  * Harmful''.)\r
-  */\r
-\r
-#ifndef  USE_FLOAT_MUL\r
-\r
-#ifdef LTP_CUT\r
-\r
-static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),\r
-\r
-       struct gsm_state * st,\r
-\r
-       register word   * d,            /* [0..39]      IN      */\r
-       register word   * dp,           /* [-120..-1]   IN      */\r
-       word            * bc_out,       /*              OUT     */\r
-       word            * Nc_out        /*              OUT     */\r
-)\r
-{\r
-       register int    k, lambda;\r
-       word            Nc, bc;\r
-       word            wt[40];\r
-\r
-       longword        L_result;\r
-       longword        L_max, L_power;\r
-       word            R, S, dmax, scal, best_k;\r
-       word            ltp_cut;\r
-\r
-       register word   temp, wt_k;\r
-\r
-       /*  Search of the optimum scaling of d[0..39].\r
-        */\r
-       dmax = 0;\r
-       for (k = 0; k <= 39; k++) {\r
-               temp = d[k];\r
-               temp = GSM_ABS( temp );\r
-               if (temp > dmax) {\r
-                       dmax = temp;\r
-                       best_k = k;\r
-               }\r
-       }\r
-       temp = 0;\r
-       if (dmax == 0) scal = 0;\r
-       else {\r
-               assert(dmax > 0);\r
-               temp = gsm_norm( (longword)dmax << 16 );\r
-       }\r
-       if (temp > 6) scal = 0;\r
-       else scal = 6 - temp;\r
-       assert(scal >= 0);\r
-\r
-       /* Search for the maximum cross-correlation and coding of the LTP lag\r
-        */\r
-       L_max = 0;\r
-       Nc    = 40;     /* index for the maximum cross-correlation */\r
-       wt_k  = SASR(d[best_k], scal);\r
-\r
-       for (lambda = 40; lambda <= 120; lambda++) {\r
-               L_result = (longword)wt_k * dp[best_k - lambda];\r
-               if (L_result > L_max) {\r
-                       Nc    = lambda;\r
-                       L_max = L_result;\r
-               }\r
-       }\r
-       *Nc_out = Nc;\r
-       L_max <<= 1;\r
-\r
-       /*  Rescaling of L_max\r
-        */\r
-       assert(scal <= 100 && scal >= -100);\r
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */\r
-\r
-       assert( Nc <= 120 && Nc >= 40);\r
-\r
-       /*   Compute the power of the reconstructed short term residual\r
-        *   signal dp[..]\r
-        */\r
-       L_power = 0;\r
-       for (k = 0; k <= 39; k++) {\r
-\r
-               register longword L_temp;\r
-\r
-               L_temp   = SASR( dp[k - Nc], 3 );\r
-               L_power += L_temp * L_temp;\r
-       }\r
-       L_power <<= 1;  /* from L_MULT */\r
-\r
-       /*  Normalization of L_max and L_power\r
-        */\r
-\r
-       if (L_max <= 0)  {\r
-               *bc_out = 0;\r
-               return;\r
-       }\r
-       if (L_max >= L_power) {\r
-               *bc_out = 3;\r
-               return;\r
-       }\r
-\r
-       temp = gsm_norm( L_power );\r
-\r
-       R = SASR( L_max   << temp, 16 );\r
-       S = SASR( L_power << temp, 16 );\r
-\r
-       /*  Coding of the LTP gain\r
-        */\r
-\r
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the\r
-        *  quantization of the LTP gain b to get the coded version bc.\r
-        */\r
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
-       *bc_out = bc;\r
-}\r
-\r
-#endif         /* LTP_CUT */\r
-\r
-static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),\r
-       register word   * d,            /* [0..39]      IN      */\r
-       register word   * dp,           /* [-120..-1]   IN      */\r
-       word            * bc_out,       /*              OUT     */\r
-       word            * Nc_out        /*              OUT     */\r
-)\r
-{\r
-       register int    k, lambda;\r
-       word            Nc, bc;\r
-       word            wt[40];\r
-\r
-       longword        L_max, L_power;\r
-       word            R, S, dmax, scal;\r
-       register word   temp;\r
-\r
-       /*  Search of the optimum scaling of d[0..39].\r
-        */\r
-       dmax = 0;\r
-\r
-       for (k = 0; k <= 39; k++) {\r
-               temp = d[k];\r
-               temp = GSM_ABS( temp );\r
-               if (temp > dmax) dmax = temp;\r
-       }\r
-\r
-       temp = 0;\r
-       if (dmax == 0) scal = 0;\r
-       else {\r
-               assert(dmax > 0);\r
-               temp = gsm_norm( (longword)dmax << 16 );\r
-       }\r
-\r
-       if (temp > 6) scal = 0;\r
-       else scal = 6 - temp;\r
-\r
-       assert(scal >= 0);\r
-\r
-       /*  Initialization of a working array wt\r
-        */\r
-\r
-       for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal );\r
-\r
-       /* Search for the maximum cross-correlation and coding of the LTP lag\r
-        */\r
-       L_max = 0;\r
-       Nc    = 40;     /* index for the maximum cross-correlation */\r
-\r
-       for (lambda = 40; lambda <= 120; lambda++) {\r
-\r
-# undef STEP\r
-#              define STEP(k)  (longword)wt[k] * dp[k - lambda]\r
-\r
-               register longword L_result;\r
-\r
-               L_result  = STEP(0)  ; L_result += STEP(1) ;\r
-               L_result += STEP(2)  ; L_result += STEP(3) ;\r
-               L_result += STEP(4)  ; L_result += STEP(5)  ;\r
-               L_result += STEP(6)  ; L_result += STEP(7)  ;\r
-               L_result += STEP(8)  ; L_result += STEP(9)  ;\r
-               L_result += STEP(10) ; L_result += STEP(11) ;\r
-               L_result += STEP(12) ; L_result += STEP(13) ;\r
-               L_result += STEP(14) ; L_result += STEP(15) ;\r
-               L_result += STEP(16) ; L_result += STEP(17) ;\r
-               L_result += STEP(18) ; L_result += STEP(19) ;\r
-               L_result += STEP(20) ; L_result += STEP(21) ;\r
-               L_result += STEP(22) ; L_result += STEP(23) ;\r
-               L_result += STEP(24) ; L_result += STEP(25) ;\r
-               L_result += STEP(26) ; L_result += STEP(27) ;\r
-               L_result += STEP(28) ; L_result += STEP(29) ;\r
-               L_result += STEP(30) ; L_result += STEP(31) ;\r
-               L_result += STEP(32) ; L_result += STEP(33) ;\r
-               L_result += STEP(34) ; L_result += STEP(35) ;\r
-               L_result += STEP(36) ; L_result += STEP(37) ;\r
-               L_result += STEP(38) ; L_result += STEP(39) ;\r
-\r
-               if (L_result > L_max) {\r
-\r
-                       Nc    = lambda;\r
-                       L_max = L_result;\r
-               }\r
-       }\r
-\r
-       *Nc_out = Nc;\r
-\r
-       L_max <<= 1;\r
-\r
-       /*  Rescaling of L_max\r
-        */\r
-       assert(scal <= 100 && scal >=  -100);\r
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */\r
-\r
-       assert( Nc <= 120 && Nc >= 40);\r
-\r
-       /*   Compute the power of the reconstructed short term residual\r
-        *   signal dp[..]\r
-        */\r
-       L_power = 0;\r
-       for (k = 0; k <= 39; k++) {\r
-\r
-               register longword L_temp;\r
-\r
-               L_temp   = SASR( dp[k - Nc], 3 );\r
-               L_power += L_temp * L_temp;\r
-       }\r
-       L_power <<= 1;  /* from L_MULT */\r
-\r
-       /*  Normalization of L_max and L_power\r
-        */\r
-\r
-       if (L_max <= 0)  {\r
-               *bc_out = 0;\r
-               return;\r
-       }\r
-       if (L_max >= L_power) {\r
-               *bc_out = 3;\r
-               return;\r
-       }\r
-\r
-       temp = gsm_norm( L_power );\r
-\r
-       R = (word) SASR( L_max   << temp, 16 );\r
-       S = (word) SASR( L_power << temp, 16 );\r
-\r
-       /*  Coding of the LTP gain\r
-        */\r
-\r
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the\r
-        *  quantization of the LTP gain b to get the coded version bc.\r
-        */\r
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
-       *bc_out = bc;\r
-}\r
-\r
-#else  /* USE_FLOAT_MUL */\r
-\r
-#ifdef LTP_CUT\r
-\r
-static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),\r
-       struct gsm_state * st,          /*              IN      */\r
-       register word   * d,            /* [0..39]      IN      */\r
-       register word   * dp,           /* [-120..-1]   IN      */\r
-       word            * bc_out,       /*              OUT     */\r
-       word            * Nc_out        /*              OUT     */\r
-)\r
-{\r
-       register int    k, lambda;\r
-       word            Nc, bc;\r
-       word            ltp_cut;\r
-\r
-       float           wt_float[40];\r
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
-       longword        L_max, L_power;\r
-       word            R, S, dmax, scal;\r
-       register word   temp;\r
-\r
-       /*  Search of the optimum scaling of d[0..39].\r
-        */\r
-       dmax = 0;\r
-\r
-       for (k = 0; k <= 39; k++) {\r
-               temp = d[k];\r
-               temp = GSM_ABS( temp );\r
-               if (temp > dmax) dmax = temp;\r
-       }\r
-\r
-       temp = 0;\r
-       if (dmax == 0) scal = 0;\r
-       else {\r
-               assert(dmax > 0);\r
-               temp = gsm_norm( (longword)dmax << 16 );\r
-       }\r
-\r
-       if (temp > 6) scal = 0;\r
-       else scal = 6 - temp;\r
-\r
-       assert(scal >= 0);\r
-       ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; \r
-\r
-\r
-       /*  Initialization of a working array wt\r
-        */\r
-\r
-       for (k = 0; k < 40; k++) {\r
-               register word w = SASR( d[k], scal );\r
-               if (w < 0 ? w > -ltp_cut : w < ltp_cut) {\r
-                       wt_float[k] = 0.0;\r
-               }\r
-               else {\r
-                       wt_float[k] =  w;\r
-               }\r
-       }\r
-       for (k = -120; k <  0; k++) dp_float[k] =  dp[k];\r
-\r
-       /* Search for the maximum cross-correlation and coding of the LTP lag\r
-        */\r
-       L_max = 0;\r
-       Nc    = 40;     /* index for the maximum cross-correlation */\r
-\r
-       for (lambda = 40; lambda <= 120; lambda += 9) {\r
-\r
-               /*  Calculate L_result for l = lambda .. lambda + 9.\r
-                */\r
-               register float *lp = dp_float - lambda;\r
-\r
-               register float  W;\r
-               register float  a = lp[-8], b = lp[-7], c = lp[-6],\r
-                               d = lp[-5], e = lp[-4], f = lp[-3],\r
-                               g = lp[-2], h = lp[-1];\r
-               register float  E; \r
-               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,\r
-                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;\r
-\r
-#              undef STEP\r
-#              define  STEP(K, a, b, c, d, e, f, g, h) \\r
-                       if ((W = wt_float[K]) != 0.0) { \\r
-                       E = W * a; S8 += E;             \\r
-                       E = W * b; S7 += E;             \\r
-                       E = W * c; S6 += E;             \\r
-                       E = W * d; S5 += E;             \\r
-                       E = W * e; S4 += E;             \\r
-                       E = W * f; S3 += E;             \\r
-                       E = W * g; S2 += E;             \\r
-                       E = W * h; S1 += E;             \\r
-                       a  = lp[K];                     \\r
-                       E = W * a; S0 += E; } else (a = lp[K])\r
-\r
-#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)\r
-#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)\r
-#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)\r
-#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)\r
-#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)\r
-#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)\r
-#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)\r
-#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)\r
-\r
-               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);\r
-               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);\r
-\r
-               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);\r
-               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);\r
-\r
-               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);\r
-               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);\r
-\r
-               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);\r
-               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);\r
-\r
-               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);\r
-               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);\r
-\r
-               if (S0 > L_max) { L_max = S0; Nc = lambda;     }\r
-               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }\r
-               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }\r
-               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }\r
-               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }\r
-               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }\r
-               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }\r
-               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }\r
-               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }\r
-\r
-       }\r
-       *Nc_out = Nc;\r
-\r
-       L_max <<= 1;\r
-\r
-       /*  Rescaling of L_max\r
-        */\r
-       assert(scal <= 100 && scal >=  -100);\r
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */\r
-\r
-       assert( Nc <= 120 && Nc >= 40);\r
-\r
-       /*   Compute the power of the reconstructed short term residual\r
-        *   signal dp[..]\r
-        */\r
-       L_power = 0;\r
-       for (k = 0; k <= 39; k++) {\r
-\r
-               register longword L_temp;\r
-\r
-               L_temp   = SASR( dp[k - Nc], 3 );\r
-               L_power += L_temp * L_temp;\r
-       }\r
-       L_power <<= 1;  /* from L_MULT */\r
-\r
-       /*  Normalization of L_max and L_power\r
-        */\r
-\r
-       if (L_max <= 0)  {\r
-               *bc_out = 0;\r
-               return;\r
-       }\r
-       if (L_max >= L_power) {\r
-               *bc_out = 3;\r
-               return;\r
-       }\r
-\r
-       temp = gsm_norm( L_power );\r
-\r
-       R = SASR( L_max   << temp, 16 );\r
-       S = SASR( L_power << temp, 16 );\r
-\r
-       /*  Coding of the LTP gain\r
-        */\r
-\r
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the\r
-        *  quantization of the LTP gain b to get the coded version bc.\r
-        */\r
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
-       *bc_out = bc;\r
-}\r
-\r
-#endif /* LTP_CUT */\r
-\r
-static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),\r
-       register word   * d,            /* [0..39]      IN      */\r
-       register word   * dp,           /* [-120..-1]   IN      */\r
-       word            * bc_out,       /*              OUT     */\r
-       word            * Nc_out        /*              OUT     */\r
-)\r
-{\r
-       register int    k, lambda;\r
-       word            Nc, bc;\r
-\r
-       float           wt_float[40];\r
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
-       longword        L_max, L_power;\r
-       word            R, S, dmax, scal;\r
-       register word   temp;\r
-\r
-       /*  Search of the optimum scaling of d[0..39].\r
-        */\r
-       dmax = 0;\r
-\r
-       for (k = 0; k <= 39; k++) {\r
-               temp = d[k];\r
-               temp = GSM_ABS( temp );\r
-               if (temp > dmax) dmax = temp;\r
-       }\r
-\r
-       temp = 0;\r
-       if (dmax == 0) scal = 0;\r
-       else {\r
-               assert(dmax > 0);\r
-               temp = gsm_norm( (longword)dmax << 16 );\r
-       }\r
-\r
-       if (temp > 6) scal = 0;\r
-       else scal = 6 - temp;\r
-\r
-       assert(scal >= 0);\r
-\r
-       /*  Initialization of a working array wt\r
-        */\r
-\r
-       for (k =    0; k < 40; k++) wt_float[k] =  SASR( d[k], scal );\r
-       for (k = -120; k <  0; k++) dp_float[k] =  dp[k];\r
-\r
-       /* Search for the maximum cross-correlation and coding of the LTP lag\r
-        */\r
-       L_max = 0;\r
-       Nc    = 40;     /* index for the maximum cross-correlation */\r
-\r
-       for (lambda = 40; lambda <= 120; lambda += 9) {\r
-\r
-               /*  Calculate L_result for l = lambda .. lambda + 9.\r
-                */\r
-               register float *lp = dp_float - lambda;\r
-\r
-               register float  W;\r
-               register float  a = lp[-8], b = lp[-7], c = lp[-6],\r
-                               d = lp[-5], e = lp[-4], f = lp[-3],\r
-                               g = lp[-2], h = lp[-1];\r
-               register float  E; \r
-               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,\r
-                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;\r
-\r
-#              undef STEP\r
-#              define  STEP(K, a, b, c, d, e, f, g, h) \\r
-                       W = wt_float[K];                \\r
-                       E = W * a; S8 += E;             \\r
-                       E = W * b; S7 += E;             \\r
-                       E = W * c; S6 += E;             \\r
-                       E = W * d; S5 += E;             \\r
-                       E = W * e; S4 += E;             \\r
-                       E = W * f; S3 += E;             \\r
-                       E = W * g; S2 += E;             \\r
-                       E = W * h; S1 += E;             \\r
-                       a  = lp[K];                     \\r
-                       E = W * a; S0 += E\r
-\r
-#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)\r
-#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)\r
-#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)\r
-#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)\r
-#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)\r
-#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)\r
-#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)\r
-#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)\r
-\r
-               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);\r
-               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);\r
-\r
-               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);\r
-               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);\r
-\r
-               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);\r
-               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);\r
-\r
-               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);\r
-               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);\r
-\r
-               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);\r
-               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);\r
-\r
-               if (S0 > L_max) { L_max = S0; Nc = lambda;     }\r
-               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }\r
-               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }\r
-               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }\r
-               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }\r
-               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }\r
-               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }\r
-               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }\r
-               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }\r
-       }\r
-       *Nc_out = Nc;\r
-\r
-       L_max <<= 1;\r
-\r
-       /*  Rescaling of L_max\r
-        */\r
-       assert(scal <= 100 && scal >=  -100);\r
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */\r
-\r
-       assert( Nc <= 120 && Nc >= 40);\r
-\r
-       /*   Compute the power of the reconstructed short term residual\r
-        *   signal dp[..]\r
-        */\r
-       L_power = 0;\r
-       for (k = 0; k <= 39; k++) {\r
-\r
-               register longword L_temp;\r
-\r
-               L_temp   = SASR( dp[k - Nc], 3 );\r
-               L_power += L_temp * L_temp;\r
-       }\r
-       L_power <<= 1;  /* from L_MULT */\r
-\r
-       /*  Normalization of L_max and L_power\r
-        */\r
-\r
-       if (L_max <= 0)  {\r
-               *bc_out = 0;\r
-               return;\r
-       }\r
-       if (L_max >= L_power) {\r
-               *bc_out = 3;\r
-               return;\r
-       }\r
-\r
-       temp = gsm_norm( L_power );\r
-\r
-       R = SASR( L_max   << temp, 16 );\r
-       S = SASR( L_power << temp, 16 );\r
-\r
-       /*  Coding of the LTP gain\r
-        */\r
-\r
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the\r
-        *  quantization of the LTP gain b to get the coded version bc.\r
-        */\r
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
-       *bc_out = bc;\r
-}\r
-\r
-#ifdef FAST\r
-#ifdef LTP_CUT\r
-\r
-static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st,\r
-                                                       d,dp,bc_out,Nc_out),\r
-       struct gsm_state * st,          /*              IN      */\r
-       register word   * d,            /* [0..39]      IN      */\r
-       register word   * dp,           /* [-120..-1]   IN      */\r
-       word            * bc_out,       /*              OUT     */\r
-       word            * Nc_out        /*              OUT     */\r
-)\r
-{\r
-       register int    k, lambda;\r
-       register float  wt_float;\r
-       word            Nc, bc;\r
-       word            wt_max, best_k, ltp_cut;\r
-\r
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
-       register float  L_result, L_max, L_power;\r
-\r
-       wt_max = 0;\r
-\r
-       for (k = 0; k < 40; ++k) {\r
-               if      ( d[k] > wt_max) wt_max =  d[best_k = k];\r
-               else if (-d[k] > wt_max) wt_max = -d[best_k = k];\r
-       }\r
-\r
-       assert(wt_max >= 0);\r
-       wt_float = (float)wt_max;\r
-\r
-       for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];\r
-\r
-       /* Search for the maximum cross-correlation and coding of the LTP lag\r
-        */\r
-       L_max = 0;\r
-       Nc    = 40;     /* index for the maximum cross-correlation */\r
-\r
-       for (lambda = 40; lambda <= 120; lambda++) {\r
-               L_result = wt_float * dp_float[best_k - lambda];\r
-               if (L_result > L_max) {\r
-                       Nc    = lambda;\r
-                       L_max = L_result;\r
-               }\r
-       }\r
-\r
-       *Nc_out = Nc;\r
-       if (L_max <= 0.)  {\r
-               *bc_out = 0;\r
-               return;\r
-       }\r
-\r
-       /*  Compute the power of the reconstructed short term residual\r
-        *  signal dp[..]\r
-        */\r
-       dp_float -= Nc;\r
-       L_power = 0;\r
-       for (k = 0; k < 40; ++k) {\r
-               register float f = dp_float[k];\r
-               L_power += f * f;\r
-       }\r
-\r
-       if (L_max >= L_power) {\r
-               *bc_out = 3;\r
-               return;\r
-       }\r
-\r
-       /*  Coding of the LTP gain\r
-        *  Table 4.3a must be used to obtain the level DLB[i] for the\r
-        *  quantization of the LTP gain b to get the coded version bc.\r
-        */\r
-       lambda = L_max / L_power * 32768.;\r
-       for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;\r
-       *bc_out = bc;\r
-}\r
-\r
-#endif /* LTP_CUT */\r
-\r
-static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),\r
-       register word   * d,            /* [0..39]      IN      */\r
-       register word   * dp,           /* [-120..-1]   IN      */\r
-       word            * bc_out,       /*              OUT     */\r
-       word            * Nc_out        /*              OUT     */\r
-)\r
-{\r
-       register int    k, lambda;\r
-       word            Nc, bc;\r
-\r
-       float           wt_float[40];\r
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
-       register float  L_max, L_power;\r
-\r
-       for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k];\r
-       for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];\r
-\r
-       /* Search for the maximum cross-correlation and coding of the LTP lag\r
-        */\r
-       L_max = 0;\r
-       Nc    = 40;     /* index for the maximum cross-correlation */\r
-\r
-       for (lambda = 40; lambda <= 120; lambda += 9) {\r
-\r
-               /*  Calculate L_result for l = lambda .. lambda + 9.\r
-                */\r
-               register float *lp = dp_float - lambda;\r
-\r
-               register float  W;\r
-               register float  a = lp[-8], b = lp[-7], c = lp[-6],\r
-                               d = lp[-5], e = lp[-4], f = lp[-3],\r
-                               g = lp[-2], h = lp[-1];\r
-               register float  E; \r
-               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,\r
-                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;\r
-\r
-#              undef STEP\r
-#              define  STEP(K, a, b, c, d, e, f, g, h) \\r
-                       W = wt_float[K];                \\r
-                       E = W * a; S8 += E;             \\r
-                       E = W * b; S7 += E;             \\r
-                       E = W * c; S6 += E;             \\r
-                       E = W * d; S5 += E;             \\r
-                       E = W * e; S4 += E;             \\r
-                       E = W * f; S3 += E;             \\r
-                       E = W * g; S2 += E;             \\r
-                       E = W * h; S1 += E;             \\r
-                       a  = lp[K];                     \\r
-                       E = W * a; S0 += E\r
-\r
-#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)\r
-#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)\r
-#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)\r
-#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)\r
-#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)\r
-#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)\r
-#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)\r
-#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)\r
-\r
-               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);\r
-               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);\r
-\r
-               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);\r
-               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);\r
-\r
-               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);\r
-               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);\r
-\r
-               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);\r
-               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);\r
-\r
-               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);\r
-               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);\r
-\r
-               if (S0 > L_max) { L_max = S0; Nc = lambda;     }\r
-               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }\r
-               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }\r
-               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }\r
-               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }\r
-               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }\r
-               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }\r
-               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }\r
-               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }\r
-       }\r
-       *Nc_out = Nc;\r
-\r
-       if (L_max <= 0.)  {\r
-               *bc_out = 0;\r
-               return;\r
-       }\r
-\r
-       /*  Compute the power of the reconstructed short term residual\r
-        *  signal dp[..]\r
-        */\r
-       dp_float -= Nc;\r
-       L_power = 0;\r
-       for (k = 0; k < 40; ++k) {\r
-               register float f = dp_float[k];\r
-               L_power += f * f;\r
-       }\r
-\r
-       if (L_max >= L_power) {\r
-               *bc_out = 3;\r
-               return;\r
-       }\r
-\r
-       /*  Coding of the LTP gain\r
-        *  Table 4.3a must be used to obtain the level DLB[i] for the\r
-        *  quantization of the LTP gain b to get the coded version bc.\r
-        */\r
-       lambda = L_max / L_power * 32768.;\r
-       for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;\r
-       *bc_out = bc;\r
-}\r
-\r
-#endif /* FAST          */\r
-#endif /* USE_FLOAT_MUL */\r
-\r
-\r
-/* 4.2.12 */\r
-\r
-static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e),\r
-       word            bc,     /*                                      IN  */\r
-       word            Nc,     /*                                      IN  */\r
-       register word   * dp,   /* previous d   [-120..-1]              IN  */\r
-       register word   * d,    /* d            [0..39]                 IN  */\r
-       register word   * dpp,  /* estimate     [0..39]                 OUT */\r
-       register word   * e     /* long term res. signal [0..39]        OUT */\r
-)\r
-/*\r
- *  In this part, we have to decode the bc parameter to compute\r
- *  the samples of the estimate dpp[0..39].  The decoding of bc needs the\r
- *  use of table 4.3b.  The long term residual signal e[0..39]\r
- *  is then calculated to be fed to the RPE encoding section.\r
- */\r
-{\r
-       register int      k;\r
-       register longword ltmp;\r
-\r
-#      undef STEP\r
-#      define STEP(BP)                                 \\r
-       for (k = 0; k <= 39; k++) {                     \\r
-               dpp[k]  = (word) GSM_MULT_R( BP, dp[k - Nc]);   \\r
-               e[k]    = (word) GSM_SUB( d[k], dpp[k] );       \\r
-       }\r
-\r
-       switch (bc) {\r
-       case 0: STEP(  3277 ); break;\r
-       case 1: STEP( 11469 ); break;\r
-       case 2: STEP( 21299 ); break;\r
-       case 3: STEP( 32767 ); break; \r
-       }\r
-}\r
-\r
-void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc),  /* 4x for 160 samples */\r
-\r
-       struct gsm_state        * S,\r
-\r
-       word    * d,    /* [0..39]   residual signal    IN      */\r
-       word    * dp,   /* [-120..-1] d'                IN      */\r
-\r
-       word    * e,    /* [0..39]                      OUT     */\r
-       word    * dpp,  /* [0..39]                      OUT     */\r
-       word    * Nc,   /* correlation lag              OUT     */\r
-       word    * bc    /* gain factor                  OUT     */\r
-)\r
-{\r
-       assert( d  ); assert( dp ); assert( e  );\r
-       assert( dpp); assert( Nc ); assert( bc );\r
-\r
-#if defined(FAST) && defined(USE_FLOAT_MUL)\r
-       if (S->fast) \r
-#if   defined (LTP_CUT)\r
-               if (S->ltp_cut)\r
-                       Cut_Fast_Calculation_of_the_LTP_parameters(S,\r
-                               d, dp, bc, Nc);\r
-               else\r
-#endif /* LTP_CUT */\r
-                       Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );\r
-       else \r
-#endif /* FAST & USE_FLOAT_MUL */\r
-#ifdef LTP_CUT\r
-               if (S->ltp_cut)\r
-                       Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);\r
-               else\r
-#endif\r
-                       Calculation_of_the_LTP_parameters(d, dp, bc, Nc);\r
-\r
-       Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );\r
-}\r
-\r
-/* 4.3.2 */\r
-void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),\r
-       struct gsm_state        * S,\r
-\r
-       word                    Ncr,\r
-       word                    bcr,\r
-       register word           * erp,     /* [0..39]                    IN */\r
-       register word           * drp      /* [-120..-1] IN, [-120..40] OUT */\r
-)\r
-/*\r
- *  This procedure uses the bcr and Ncr parameter to realize the\r
- *  long term synthesis filtering.  The decoding of bcr needs\r
- *  table 4.3b.\r
- */\r
-{\r
-       register longword       ltmp;   /* for ADD */\r
-       register int            k;\r
-       word                    brp, drpp, Nr;\r
-\r
-       /*  Check the limits of Nr.\r
-        */\r
-       Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;\r
-       S->nrp = Nr;\r
-       assert(Nr >= 40 && Nr <= 120);\r
-\r
-       /*  Decoding of the LTP gain bcr\r
-        */\r
-       brp = gsm_QLB[ bcr ];\r
-\r
-       /*  Computation of the reconstructed short term residual \r
-        *  signal drp[0..39]\r
-        */\r
-       assert(brp != MIN_WORD);\r
-\r
-       for (k = 0; k <= 39; k++) {\r
-               drpp   = (word) GSM_MULT_R( brp, drp[ k - Nr ] );\r
-               drp[k] = (word) GSM_ADD( erp[k], drpp );\r
-       }\r
-\r
-       /*\r
-        *  Update of the reconstructed short term residual signal\r
-        *  drp[ -1..-120 ]\r
-        */\r
-\r
-       for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];\r
-}\r
+/*
+ * long_term.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*
+ *  4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
+ */
+
+
+/*
+ * This module computes the LTP gain (bc) and the LTP lag (Nc)
+ * for the long term analysis filter.   This is done by calculating a
+ * maximum of the cross-correlation function between the current
+ * sub-segment short term residual signal d[0..39] (output of
+ * the short term analysis filter; for simplification the index
+ * of this array begins at 0 and ends at 39 for each sub-segment of the
+ * RPE-LTP analysis) and the previous reconstructed short term
+ * residual signal dp[ -120 .. -1 ].  A dynamic scaling must be
+ * performed to avoid overflow.
+ */
+
+ /* The next procedure exists in six versions.  First two integer
+  * version (if USE_FLOAT_MUL is not defined); then four floating
+  * point versions, twice with proper scaling (USE_FLOAT_MUL defined),
+  * once without (USE_FLOAT_MUL and FAST defined, and fast run-time
+  * option used).  Every pair has first a Cut version (see the -C
+  * option to toast or the LTP_CUT option to gsm_option()), then the
+  * uncut one.  (For a detailed explanation of why this is altogether
+  * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered
+  * Harmful''.)
+  */
+
+#ifndef  USE_FLOAT_MUL
+
+#ifdef LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+
+       struct gsm_state * st,
+
+       register word   * d,            /* [0..39]      IN      */
+       register word   * dp,           /* [-120..-1]   IN      */
+       word            * bc_out,       /*              OUT     */
+       word            * Nc_out        /*              OUT     */
+)
+{
+       register int    k, lambda;
+       word            Nc, bc;
+       word            wt[40];
+
+       longword        L_result;
+       longword        L_max, L_power;
+       word            R, S, dmax, scal, best_k;
+       word            ltp_cut;
+
+       register word   temp, wt_k;
+
+       /*  Search of the optimum scaling of d[0..39].
+        */
+       dmax = 0;
+       for (k = 0; k <= 39; k++) {
+               temp = d[k];
+               temp = GSM_ABS( temp );
+               if (temp > dmax) {
+                       dmax = temp;
+                       best_k = k;
+               }
+       }
+       temp = 0;
+       if (dmax == 0) scal = 0;
+       else {
+               assert(dmax > 0);
+               temp = gsm_norm( (longword)dmax << 16 );
+       }
+       if (temp > 6) scal = 0;
+       else scal = 6 - temp;
+       assert(scal >= 0);
+
+       /* Search for the maximum cross-correlation and coding of the LTP lag
+        */
+       L_max = 0;
+       Nc    = 40;     /* index for the maximum cross-correlation */
+       wt_k  = SASR(d[best_k], scal);
+
+       for (lambda = 40; lambda <= 120; lambda++) {
+               L_result = (longword)wt_k * dp[best_k - lambda];
+               if (L_result > L_max) {
+                       Nc    = lambda;
+                       L_max = L_result;
+               }
+       }
+       *Nc_out = Nc;
+       L_max <<= 1;
+
+       /*  Rescaling of L_max
+        */
+       assert(scal <= 100 && scal >= -100);
+       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+
+       assert( Nc <= 120 && Nc >= 40);
+
+       /*   Compute the power of the reconstructed short term residual
+        *   signal dp[..]
+        */
+       L_power = 0;
+       for (k = 0; k <= 39; k++) {
+
+               register longword L_temp;
+
+               L_temp   = SASR( dp[k - Nc], 3 );
+               L_power += L_temp * L_temp;
+       }
+       L_power <<= 1;  /* from L_MULT */
+
+       /*  Normalization of L_max and L_power
+        */
+
+       if (L_max <= 0)  {
+               *bc_out = 0;
+               return;
+       }
+       if (L_max >= L_power) {
+               *bc_out = 3;
+               return;
+       }
+
+       temp = gsm_norm( L_power );
+
+       R = SASR( L_max   << temp, 16 );
+       S = SASR( L_power << temp, 16 );
+
+       /*  Coding of the LTP gain
+        */
+
+       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  quantization of the LTP gain b to get the coded version bc.
+        */
+       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+       *bc_out = bc;
+}
+
+#endif         /* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+       register word   * d,            /* [0..39]      IN      */
+       register word   * dp,           /* [-120..-1]   IN      */
+       word            * bc_out,       /*              OUT     */
+       word            * Nc_out        /*              OUT     */
+)
+{
+       register int    k, lambda;
+       word            Nc, bc;
+       word            wt[40];
+
+       longword        L_max, L_power;
+       word            R, S, dmax, scal;
+       register word   temp;
+
+       /*  Search of the optimum scaling of d[0..39].
+        */
+       dmax = 0;
+
+       for (k = 0; k <= 39; k++) {
+               temp = d[k];
+               temp = GSM_ABS( temp );
+               if (temp > dmax) dmax = temp;
+       }
+
+       temp = 0;
+       if (dmax == 0) scal = 0;
+       else {
+               assert(dmax > 0);
+               temp = gsm_norm( (longword)dmax << 16 );
+       }
+
+       if (temp > 6) scal = 0;
+       else scal = 6 - temp;
+
+       assert(scal >= 0);
+
+       /*  Initialization of a working array wt
+        */
+
+       for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal );
+
+       /* Search for the maximum cross-correlation and coding of the LTP lag
+        */
+       L_max = 0;
+       Nc    = 40;     /* index for the maximum cross-correlation */
+
+       for (lambda = 40; lambda <= 120; lambda++) {
+
+# undef STEP
+#              define STEP(k)  (longword)wt[k] * dp[k - lambda]
+
+               register longword L_result;
+
+               L_result  = STEP(0)  ; L_result += STEP(1) ;
+               L_result += STEP(2)  ; L_result += STEP(3) ;
+               L_result += STEP(4)  ; L_result += STEP(5)  ;
+               L_result += STEP(6)  ; L_result += STEP(7)  ;
+               L_result += STEP(8)  ; L_result += STEP(9)  ;
+               L_result += STEP(10) ; L_result += STEP(11) ;
+               L_result += STEP(12) ; L_result += STEP(13) ;
+               L_result += STEP(14) ; L_result += STEP(15) ;
+               L_result += STEP(16) ; L_result += STEP(17) ;
+               L_result += STEP(18) ; L_result += STEP(19) ;
+               L_result += STEP(20) ; L_result += STEP(21) ;
+               L_result += STEP(22) ; L_result += STEP(23) ;
+               L_result += STEP(24) ; L_result += STEP(25) ;
+               L_result += STEP(26) ; L_result += STEP(27) ;
+               L_result += STEP(28) ; L_result += STEP(29) ;
+               L_result += STEP(30) ; L_result += STEP(31) ;
+               L_result += STEP(32) ; L_result += STEP(33) ;
+               L_result += STEP(34) ; L_result += STEP(35) ;
+               L_result += STEP(36) ; L_result += STEP(37) ;
+               L_result += STEP(38) ; L_result += STEP(39) ;
+
+               if (L_result > L_max) {
+
+                       Nc    = lambda;
+                       L_max = L_result;
+               }
+       }
+
+       *Nc_out = Nc;
+
+       L_max <<= 1;
+
+       /*  Rescaling of L_max
+        */
+       assert(scal <= 100 && scal >=  -100);
+       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+
+       assert( Nc <= 120 && Nc >= 40);
+
+       /*   Compute the power of the reconstructed short term residual
+        *   signal dp[..]
+        */
+       L_power = 0;
+       for (k = 0; k <= 39; k++) {
+
+               register longword L_temp;
+
+               L_temp   = SASR( dp[k - Nc], 3 );
+               L_power += L_temp * L_temp;
+       }
+       L_power <<= 1;  /* from L_MULT */
+
+       /*  Normalization of L_max and L_power
+        */
+
+       if (L_max <= 0)  {
+               *bc_out = 0;
+               return;
+       }
+       if (L_max >= L_power) {
+               *bc_out = 3;
+               return;
+       }
+
+       temp = gsm_norm( L_power );
+
+       R = (word) SASR( L_max   << temp, 16 );
+       S = (word) SASR( L_power << temp, 16 );
+
+       /*  Coding of the LTP gain
+        */
+
+       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  quantization of the LTP gain b to get the coded version bc.
+        */
+       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+       *bc_out = bc;
+}
+
+#else  /* USE_FLOAT_MUL */
+
+#ifdef LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+       struct gsm_state * st,          /*              IN      */
+       register word   * d,            /* [0..39]      IN      */
+       register word   * dp,           /* [-120..-1]   IN      */
+       word            * bc_out,       /*              OUT     */
+       word            * Nc_out        /*              OUT     */
+)
+{
+       register int    k, lambda;
+       word            Nc, bc;
+       word            ltp_cut;
+
+       float           wt_float[40];
+       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+
+       longword        L_max, L_power;
+       word            R, S, dmax, scal;
+       register word   temp;
+
+       /*  Search of the optimum scaling of d[0..39].
+        */
+       dmax = 0;
+
+       for (k = 0; k <= 39; k++) {
+               temp = d[k];
+               temp = GSM_ABS( temp );
+               if (temp > dmax) dmax = temp;
+       }
+
+       temp = 0;
+       if (dmax == 0) scal = 0;
+       else {
+               assert(dmax > 0);
+               temp = gsm_norm( (longword)dmax << 16 );
+       }
+
+       if (temp > 6) scal = 0;
+       else scal = 6 - temp;
+
+       assert(scal >= 0);
+       ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; 
+
+
+       /*  Initialization of a working array wt
+        */
+
+       for (k = 0; k < 40; k++) {
+               register word w = SASR( d[k], scal );
+               if (w < 0 ? w > -ltp_cut : w < ltp_cut) {
+                       wt_float[k] = 0.0;
+               }
+               else {
+                       wt_float[k] =  w;
+               }
+       }
+       for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+       /* Search for the maximum cross-correlation and coding of the LTP lag
+        */
+       L_max = 0;
+       Nc    = 40;     /* index for the maximum cross-correlation */
+
+       for (lambda = 40; lambda <= 120; lambda += 9) {
+
+               /*  Calculate L_result for l = lambda .. lambda + 9.
+                */
+               register float *lp = dp_float - lambda;
+
+               register float  W;
+               register float  a = lp[-8], b = lp[-7], c = lp[-6],
+                               d = lp[-5], e = lp[-4], f = lp[-3],
+                               g = lp[-2], h = lp[-1];
+               register float  E; 
+               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#              undef STEP
+#              define  STEP(K, a, b, c, d, e, f, g, h) \
+                       if ((W = wt_float[K]) != 0.0) { \
+                       E = W * a; S8 += E;             \
+                       E = W * b; S7 += E;             \
+                       E = W * c; S6 += E;             \
+                       E = W * d; S5 += E;             \
+                       E = W * e; S4 += E;             \
+                       E = W * f; S3 += E;             \
+                       E = W * g; S2 += E;             \
+                       E = W * h; S1 += E;             \
+                       a  = lp[K];                     \
+                       E = W * a; S0 += E; } else (a = lp[K])
+
+#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)
+#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)
+#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)
+#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)
+#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)
+#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)
+#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)
+#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)
+
+               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+               if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+
+       }
+       *Nc_out = Nc;
+
+       L_max <<= 1;
+
+       /*  Rescaling of L_max
+        */
+       assert(scal <= 100 && scal >=  -100);
+       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+
+       assert( Nc <= 120 && Nc >= 40);
+
+       /*   Compute the power of the reconstructed short term residual
+        *   signal dp[..]
+        */
+       L_power = 0;
+       for (k = 0; k <= 39; k++) {
+
+               register longword L_temp;
+
+               L_temp   = SASR( dp[k - Nc], 3 );
+               L_power += L_temp * L_temp;
+       }
+       L_power <<= 1;  /* from L_MULT */
+
+       /*  Normalization of L_max and L_power
+        */
+
+       if (L_max <= 0)  {
+               *bc_out = 0;
+               return;
+       }
+       if (L_max >= L_power) {
+               *bc_out = 3;
+               return;
+       }
+
+       temp = gsm_norm( L_power );
+
+       R = SASR( L_max   << temp, 16 );
+       S = SASR( L_power << temp, 16 );
+
+       /*  Coding of the LTP gain
+        */
+
+       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  quantization of the LTP gain b to get the coded version bc.
+        */
+       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+       *bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+       register word   * d,            /* [0..39]      IN      */
+       register word   * dp,           /* [-120..-1]   IN      */
+       word            * bc_out,       /*              OUT     */
+       word            * Nc_out        /*              OUT     */
+)
+{
+       register int    k, lambda;
+       word            Nc, bc;
+
+       float           wt_float[40];
+       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+
+       longword        L_max, L_power;
+       word            R, S, dmax, scal;
+       register word   temp;
+
+       /*  Search of the optimum scaling of d[0..39].
+        */
+       dmax = 0;
+
+       for (k = 0; k <= 39; k++) {
+               temp = d[k];
+               temp = GSM_ABS( temp );
+               if (temp > dmax) dmax = temp;
+       }
+
+       temp = 0;
+       if (dmax == 0) scal = 0;
+       else {
+               assert(dmax > 0);
+               temp = gsm_norm( (longword)dmax << 16 );
+       }
+
+       if (temp > 6) scal = 0;
+       else scal = 6 - temp;
+
+       assert(scal >= 0);
+
+       /*  Initialization of a working array wt
+        */
+
+       for (k =    0; k < 40; k++) wt_float[k] =  SASR( d[k], scal );
+       for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+       /* Search for the maximum cross-correlation and coding of the LTP lag
+        */
+       L_max = 0;
+       Nc    = 40;     /* index for the maximum cross-correlation */
+
+       for (lambda = 40; lambda <= 120; lambda += 9) {
+
+               /*  Calculate L_result for l = lambda .. lambda + 9.
+                */
+               register float *lp = dp_float - lambda;
+
+               register float  W;
+               register float  a = lp[-8], b = lp[-7], c = lp[-6],
+                               d = lp[-5], e = lp[-4], f = lp[-3],
+                               g = lp[-2], h = lp[-1];
+               register float  E; 
+               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#              undef STEP
+#              define  STEP(K, a, b, c, d, e, f, g, h) \
+                       W = wt_float[K];                \
+                       E = W * a; S8 += E;             \
+                       E = W * b; S7 += E;             \
+                       E = W * c; S6 += E;             \
+                       E = W * d; S5 += E;             \
+                       E = W * e; S4 += E;             \
+                       E = W * f; S3 += E;             \
+                       E = W * g; S2 += E;             \
+                       E = W * h; S1 += E;             \
+                       a  = lp[K];                     \
+                       E = W * a; S0 += E
+
+#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)
+#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)
+#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)
+#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)
+#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)
+#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)
+#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)
+#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)
+
+               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+               if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+       }
+       *Nc_out = Nc;
+
+       L_max <<= 1;
+
+       /*  Rescaling of L_max
+        */
+       assert(scal <= 100 && scal >=  -100);
+       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+
+       assert( Nc <= 120 && Nc >= 40);
+
+       /*   Compute the power of the reconstructed short term residual
+        *   signal dp[..]
+        */
+       L_power = 0;
+       for (k = 0; k <= 39; k++) {
+
+               register longword L_temp;
+
+               L_temp   = SASR( dp[k - Nc], 3 );
+               L_power += L_temp * L_temp;
+       }
+       L_power <<= 1;  /* from L_MULT */
+
+       /*  Normalization of L_max and L_power
+        */
+
+       if (L_max <= 0)  {
+               *bc_out = 0;
+               return;
+       }
+       if (L_max >= L_power) {
+               *bc_out = 3;
+               return;
+       }
+
+       temp = gsm_norm( L_power );
+
+       R = SASR( L_max   << temp, 16 );
+       S = SASR( L_power << temp, 16 );
+
+       /*  Coding of the LTP gain
+        */
+
+       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  quantization of the LTP gain b to get the coded version bc.
+        */
+       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+       *bc_out = bc;
+}
+
+#ifdef FAST
+#ifdef LTP_CUT
+
+static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st,
+                                                       d,dp,bc_out,Nc_out),
+       struct gsm_state * st,          /*              IN      */
+       register word   * d,            /* [0..39]      IN      */
+       register word   * dp,           /* [-120..-1]   IN      */
+       word            * bc_out,       /*              OUT     */
+       word            * Nc_out        /*              OUT     */
+)
+{
+       register int    k, lambda;
+       register float  wt_float;
+       word            Nc, bc;
+       word            wt_max, best_k, ltp_cut;
+
+       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+
+       register float  L_result, L_max, L_power;
+
+       wt_max = 0;
+
+       for (k = 0; k < 40; ++k) {
+               if      ( d[k] > wt_max) wt_max =  d[best_k = k];
+               else if (-d[k] > wt_max) wt_max = -d[best_k = k];
+       }
+
+       assert(wt_max >= 0);
+       wt_float = (float)wt_max;
+
+       for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+       /* Search for the maximum cross-correlation and coding of the LTP lag
+        */
+       L_max = 0;
+       Nc    = 40;     /* index for the maximum cross-correlation */
+
+       for (lambda = 40; lambda <= 120; lambda++) {
+               L_result = wt_float * dp_float[best_k - lambda];
+               if (L_result > L_max) {
+                       Nc    = lambda;
+                       L_max = L_result;
+               }
+       }
+
+       *Nc_out = Nc;
+       if (L_max <= 0.)  {
+               *bc_out = 0;
+               return;
+       }
+
+       /*  Compute the power of the reconstructed short term residual
+        *  signal dp[..]
+        */
+       dp_float -= Nc;
+       L_power = 0;
+       for (k = 0; k < 40; ++k) {
+               register float f = dp_float[k];
+               L_power += f * f;
+       }
+
+       if (L_max >= L_power) {
+               *bc_out = 3;
+               return;
+       }
+
+       /*  Coding of the LTP gain
+        *  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  quantization of the LTP gain b to get the coded version bc.
+        */
+       lambda = L_max / L_power * 32768.;
+       for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+       *bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+       register word   * d,            /* [0..39]      IN      */
+       register word   * dp,           /* [-120..-1]   IN      */
+       word            * bc_out,       /*              OUT     */
+       word            * Nc_out        /*              OUT     */
+)
+{
+       register int    k, lambda;
+       word            Nc, bc;
+
+       float           wt_float[40];
+       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+
+       register float  L_max, L_power;
+
+       for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k];
+       for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+       /* Search for the maximum cross-correlation and coding of the LTP lag
+        */
+       L_max = 0;
+       Nc    = 40;     /* index for the maximum cross-correlation */
+
+       for (lambda = 40; lambda <= 120; lambda += 9) {
+
+               /*  Calculate L_result for l = lambda .. lambda + 9.
+                */
+               register float *lp = dp_float - lambda;
+
+               register float  W;
+               register float  a = lp[-8], b = lp[-7], c = lp[-6],
+                               d = lp[-5], e = lp[-4], f = lp[-3],
+                               g = lp[-2], h = lp[-1];
+               register float  E; 
+               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#              undef STEP
+#              define  STEP(K, a, b, c, d, e, f, g, h) \
+                       W = wt_float[K];                \
+                       E = W * a; S8 += E;             \
+                       E = W * b; S7 += E;             \
+                       E = W * c; S6 += E;             \
+                       E = W * d; S5 += E;             \
+                       E = W * e; S4 += E;             \
+                       E = W * f; S3 += E;             \
+                       E = W * g; S2 += E;             \
+                       E = W * h; S1 += E;             \
+                       a  = lp[K];                     \
+                       E = W * a; S0 += E
+
+#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)
+#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)
+#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)
+#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)
+#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)
+#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)
+#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)
+#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)
+
+               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+               if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+       }
+       *Nc_out = Nc;
+
+       if (L_max <= 0.)  {
+               *bc_out = 0;
+               return;
+       }
+
+       /*  Compute the power of the reconstructed short term residual
+        *  signal dp[..]
+        */
+       dp_float -= Nc;
+       L_power = 0;
+       for (k = 0; k < 40; ++k) {
+               register float f = dp_float[k];
+               L_power += f * f;
+       }
+
+       if (L_max >= L_power) {
+               *bc_out = 3;
+               return;
+       }
+
+       /*  Coding of the LTP gain
+        *  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  quantization of the LTP gain b to get the coded version bc.
+        */
+       lambda = L_max / L_power * 32768.;
+       for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+       *bc_out = bc;
+}
+
+#endif /* FAST          */
+#endif /* USE_FLOAT_MUL */
+
+
+/* 4.2.12 */
+
+static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e),
+       word            bc,     /*                                      IN  */
+       word            Nc,     /*                                      IN  */
+       register word   * dp,   /* previous d   [-120..-1]              IN  */
+       register word   * d,    /* d            [0..39]                 IN  */
+       register word   * dpp,  /* estimate     [0..39]                 OUT */
+       register word   * e     /* long term res. signal [0..39]        OUT */
+)
+/*
+ *  In this part, we have to decode the bc parameter to compute
+ *  the samples of the estimate dpp[0..39].  The decoding of bc needs the
+ *  use of table 4.3b.  The long term residual signal e[0..39]
+ *  is then calculated to be fed to the RPE encoding section.
+ */
+{
+       register int      k;
+       register longword ltmp;
+
+#      undef STEP
+#      define STEP(BP)                                 \
+       for (k = 0; k <= 39; k++) {                     \
+               dpp[k]  = (word) GSM_MULT_R( BP, dp[k - Nc]);   \
+               e[k]    = (word) GSM_SUB( d[k], dpp[k] );       \
+       }
+
+       switch (bc) {
+       case 0: STEP(  3277 ); break;
+       case 1: STEP( 11469 ); break;
+       case 2: STEP( 21299 ); break;
+       case 3: STEP( 32767 ); break; 
+       }
+}
+
+void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc),  /* 4x for 160 samples */
+
+       struct gsm_state        * S,
+
+       word    * d,    /* [0..39]   residual signal    IN      */
+       word    * dp,   /* [-120..-1] d'                IN      */
+
+       word    * e,    /* [0..39]                      OUT     */
+       word    * dpp,  /* [0..39]                      OUT     */
+       word    * Nc,   /* correlation lag              OUT     */
+       word    * bc    /* gain factor                  OUT     */
+)
+{
+       assert( d  ); assert( dp ); assert( e  );
+       assert( dpp); assert( Nc ); assert( bc );
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+       if (S->fast) 
+#if   defined (LTP_CUT)
+               if (S->ltp_cut)
+                       Cut_Fast_Calculation_of_the_LTP_parameters(S,
+                               d, dp, bc, Nc);
+               else
+#endif /* LTP_CUT */
+                       Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
+       else 
+#endif /* FAST & USE_FLOAT_MUL */
+#ifdef LTP_CUT
+               if (S->ltp_cut)
+                       Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);
+               else
+#endif
+                       Calculation_of_the_LTP_parameters(d, dp, bc, Nc);
+
+       Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );
+}
+
+/* 4.3.2 */
+void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),
+       struct gsm_state        * S,
+
+       word                    Ncr,
+       word                    bcr,
+       register word           * erp,     /* [0..39]                    IN */
+       register word           * drp      /* [-120..-1] IN, [-120..40] OUT */
+)
+/*
+ *  This procedure uses the bcr and Ncr parameter to realize the
+ *  long term synthesis filtering.  The decoding of bcr needs
+ *  table 4.3b.
+ */
+{
+       register longword       ltmp;   /* for ADD */
+       register int            k;
+       word                    brp, drpp, Nr;
+
+       /*  Check the limits of Nr.
+        */
+       Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;
+       S->nrp = Nr;
+       assert(Nr >= 40 && Nr <= 120);
+
+       /*  Decoding of the LTP gain bcr
+        */
+       brp = gsm_QLB[ bcr ];
+
+       /*  Computation of the reconstructed short term residual 
+        *  signal drp[0..39]
+        */
+       assert(brp != MIN_WORD);
+
+       for (k = 0; k <= 39; k++) {
+               drpp   = (word) GSM_MULT_R( brp, drp[ k - Nr ] );
+               drp[k] = (word) GSM_ADD( erp[k], drpp );
+       }
+
+       /*
+        *  Update of the reconstructed short term residual signal
+        *  drp[ -1..-120 ]
+        */
+
+       for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];
+}
index bebc7c33c28df33e90ef81b89836ef929c37cc8d..b1a7089f677248461a0581993c41da9c36386fb1 100644 (file)
-/*\r
- * preprocess.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include       <stdio.h>\r
-#include       <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include       "gsm.h"\r
-#include       "proto.h"\r
-\r
-/*     4.2.0 .. 4.2.3  PREPROCESSING SECTION\r
- *  \r
- *     After A-law to linear conversion (or directly from the\r
- *     Ato D converter) the following scaling is assumed for\r
- *     input to the RPE-LTP algorithm:\r
- *\r
- *      in:  0.1.....................12\r
- *          S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*\r
- *\r
- *     Where S is the sign bit, v a valid bit, and * a "don't care" bit.\r
- *     The original signal is called sop[..]\r
- *\r
- *      out:   0.1................... 12 \r
- *          S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0\r
- */\r
-\r
-\r
-void Gsm_Preprocess P3((S, s, so),\r
-       struct gsm_state * S,\r
-       word             * s,\r
-       word             * so )         /* [0..159]     IN/OUT  */\r
-{\r
-\r
-       word       z1 = S->z1;\r
-       longword L_z2 = S->L_z2;\r
-       word       mp = S->mp;\r
-\r
-       word            s1;\r
-       longword      L_s2;\r
-\r
-       longword      L_temp;\r
-\r
-       word            msp, lsp;\r
-       word            SO;\r
-\r
-       longword        ltmp;           /* for   ADD */\r
-       ulongword       utmp;           /* for L_ADD */\r
-\r
-       register int            k = 160;\r
-\r
-       while (k--) {\r
-\r
-       /*  4.2.1   Downscaling of the input signal\r
-        */\r
-               SO = SASR( *s, 3 ) << 2;\r
-               s++;\r
-\r
-               assert (SO >= -0x4000); /* downscaled by     */\r
-               assert (SO <=  0x3FFC); /* previous routine. */\r
-\r
-\r
-       /*  4.2.2   Offset compensation\r
-        * \r
-        *  This part implements a high-pass filter and requires extended\r
-        *  arithmetic precision for the recursive part of this filter.\r
-        *  The input of this procedure is the array so[0...159] and the\r
-        *  output the array sof[ 0...159 ].\r
-        */\r
-               /*   Compute the non-recursive part\r
-                */\r
-\r
-               s1 = SO - z1;                   /* s1 = gsm_sub( *so, z1 ); */\r
-               z1 = SO;\r
-\r
-               assert(s1 != MIN_WORD);\r
-\r
-               /*   Compute the recursive part\r
-                */\r
-               L_s2 = s1;\r
-               L_s2 <<= 15;\r
-\r
-               /*   Execution of a 31 bv 16 bits multiplication\r
-                */\r
-\r
-               msp = (word) SASR( L_z2, 15 );\r
-               lsp = (word) (L_z2-((longword)msp<<15)); /* gsm_L_sub(L_z2,(msp<<15)); */\r
-\r
-               L_s2  += GSM_MULT_R( lsp, 32735 );\r
-               L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/\r
-               L_z2   = GSM_L_ADD( L_temp, L_s2 );\r
-\r
-               /*    Compute sof[k] with rounding\r
-                */\r
-               L_temp = GSM_L_ADD( L_z2, 16384 );\r
-\r
-       /*   4.2.3  Preemphasis\r
-        */\r
-\r
-               msp   = (word) GSM_MULT_R( mp, -28180 );\r
-               mp    = (word) SASR( L_temp, 15 );\r
-               *so++ = (word) GSM_ADD( mp, msp );\r
-       }\r
-\r
-       S->z1   = z1;\r
-       S->L_z2 = L_z2;\r
-       S->mp   = mp;\r
-}\r
+/*
+ * preprocess.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include       <stdio.h>
+#include       <assert.h>
+
+#include "private.h"
+
+#include       "gsm.h"
+#include       "proto.h"
+
+/*     4.2.0 .. 4.2.3  PREPROCESSING SECTION
+ *  
+ *     After A-law to linear conversion (or directly from the
+ *     Ato D converter) the following scaling is assumed for
+ *     input to the RPE-LTP algorithm:
+ *
+ *      in:  0.1.....................12
+ *          S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
+ *
+ *     Where S is the sign bit, v a valid bit, and * a "don't care" bit.
+ *     The original signal is called sop[..]
+ *
+ *      out:   0.1................... 12 
+ *          S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
+ */
+
+
+void Gsm_Preprocess P3((S, s, so),
+       struct gsm_state * S,
+       word             * s,
+       word             * so )         /* [0..159]     IN/OUT  */
+{
+
+       word       z1 = S->z1;
+       longword L_z2 = S->L_z2;
+       word       mp = S->mp;
+
+       word            s1;
+       longword      L_s2;
+
+       longword      L_temp;
+
+       word            msp, lsp;
+       word            SO;
+
+       longword        ltmp;           /* for   ADD */
+       ulongword       utmp;           /* for L_ADD */
+
+       register int            k = 160;
+
+       while (k--) {
+
+       /*  4.2.1   Downscaling of the input signal
+        */
+               SO = SASR( *s, 3 ) << 2;
+               s++;
+
+               assert (SO >= -0x4000); /* downscaled by     */
+               assert (SO <=  0x3FFC); /* previous routine. */
+
+
+       /*  4.2.2   Offset compensation
+        * 
+        *  This part implements a high-pass filter and requires extended
+        *  arithmetic precision for the recursive part of this filter.
+        *  The input of this procedure is the array so[0...159] and the
+        *  output the array sof[ 0...159 ].
+        */
+               /*   Compute the non-recursive part
+                */
+
+               s1 = SO - z1;                   /* s1 = gsm_sub( *so, z1 ); */
+               z1 = SO;
+
+               assert(s1 != MIN_WORD);
+
+               /*   Compute the recursive part
+                */
+               L_s2 = s1;
+               L_s2 <<= 15;
+
+               /*   Execution of a 31 bv 16 bits multiplication
+                */
+
+               msp = (word) SASR( L_z2, 15 );
+               lsp = (word) (L_z2-((longword)msp<<15)); /* gsm_L_sub(L_z2,(msp<<15)); */
+
+               L_s2  += GSM_MULT_R( lsp, 32735 );
+               L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
+               L_z2   = GSM_L_ADD( L_temp, L_s2 );
+
+               /*    Compute sof[k] with rounding
+                */
+               L_temp = GSM_L_ADD( L_z2, 16384 );
+
+       /*   4.2.3  Preemphasis
+        */
+
+               msp   = (word) GSM_MULT_R( mp, -28180 );
+               mp    = (word) SASR( L_temp, 15 );
+               *so++ = (word) GSM_ADD( mp, msp );
+       }
+
+       S->z1   = z1;
+       S->L_z2 = L_z2;
+       S->mp   = mp;
+}
index f5648a24a31fd119e16f8ac955c22554f979a402..c6cb05146f47f4b91f46ba9d84242805ef4c0f8b 100644 (file)
-/*\r
- * rpe.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-/*  4.2.13 .. 4.2.17  RPE ENCODING SECTION\r
- */\r
-\r
-/* 4.2.13 */\r
-\r
-static void Weighting_filter P2((e, x),\r
-       register word   * e,            /* signal [-5..0.39.44] IN  */\r
-       word            * x             /* signal [0..39]       OUT */\r
-)\r
-/*\r
- *  The coefficients of the weighting filter are stored in a table\r
- *  (see table 4.4).  The following scaling is used:\r
- *\r
- *     H[0..10] = integer( real_H[ 0..10] * 8192 ); \r
- */\r
-{\r
-       /* word                 wt[ 50 ]; */\r
-\r
-       register longword       L_result;\r
-       register int            k /* , i */ ;\r
-\r
-       /*  Initialization of a temporary working array wt[0...49]\r
-        */\r
-\r
-       /* for (k =  0; k <=  4; k++) wt[k] = 0;\r
-        * for (k =  5; k <= 44; k++) wt[k] = *e++;\r
-        * for (k = 45; k <= 49; k++) wt[k] = 0;\r
-        *\r
-        *  (e[-5..-1] and e[40..44] are allocated by the caller,\r
-        *  are initially zero and are not written anywhere.)\r
-        */\r
-       e -= 5;\r
-\r
-       /*  Compute the signal x[0..39]\r
-        */ \r
-       for (k = 0; k <= 39; k++) {\r
-\r
-               L_result = 8192 >> 1;\r
-\r
-               /* for (i = 0; i <= 10; i++) {\r
-                *      L_temp   = GSM_L_MULT( wt[k+i], gsm_H[i] );\r
-                *      L_result = GSM_L_ADD( L_result, L_temp );\r
-                * }\r
-                */\r
-\r
-#undef STEP\r
-#define        STEP( i, H )    (e[ k + i ] * (longword)H)\r
-\r
-               /*  Every one of these multiplications is done twice --\r
-                *  but I don't see an elegant way to optimize this. \r
-                *  Do you?\r
-                */\r
-\r
-#ifdef STUPID_COMPILER\r
-               L_result += STEP(       0,      -134 ) ;\r
-               L_result += STEP(       1,      -374 )  ;\r
-                      /* + STEP(       2,      0    )  */\r
-               L_result += STEP(       3,      2054 ) ;\r
-               L_result += STEP(       4,      5741 ) ;\r
-               L_result += STEP(       5,      8192 ) ;\r
-               L_result += STEP(       6,      5741 ) ;\r
-               L_result += STEP(       7,      2054 ) ;\r
-                      /* + STEP(       8,      0    )  */\r
-               L_result += STEP(       9,      -374 ) ;\r
-               L_result += STEP(       10,     -134 ) ;\r
-#else\r
-               L_result +=\r
-                 STEP( 0,      -134 ) \r
-               + STEP( 1,      -374 ) \r
-            /* + STEP( 2,      0    )  */\r
-               + STEP( 3,      2054 ) \r
-               + STEP( 4,      5741 ) \r
-               + STEP( 5,      8192 ) \r
-               + STEP( 6,      5741 ) \r
-               + STEP( 7,      2054 ) \r
-            /* + STEP( 8,      0    )  */\r
-               + STEP( 9,      -374 ) \r
-               + STEP(10,      -134 )\r
-               ;\r
-#endif\r
-\r
-               /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)\r
-                * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)\r
-                *\r
-                * x[k] = SASR( L_result, 16 );\r
-                */\r
-\r
-               /* 2 adds vs. >>16 => 14, minus one shift to compensate for\r
-                * those we lost when replacing L_MULT by '*'.\r
-                */\r
-\r
-               L_result = SASR( L_result, 13 );\r
-               x[k] =  (word) ((  L_result < MIN_WORD ? MIN_WORD\r
-                       : (L_result > MAX_WORD ? MAX_WORD : L_result )));\r
-       }\r
-}\r
-\r
-/* 4.2.14 */\r
-\r
-static void RPE_grid_selection P3((x,xM,Mc_out),\r
-       word            * x,            /* [0..39]              IN  */ \r
-       word            * xM,           /* [0..12]              OUT */\r
-       word            * Mc_out        /*                      OUT */\r
-)\r
-/*\r
- *  The signal x[0..39] is used to select the RPE grid which is\r
- *  represented by Mc.\r
- */\r
-{\r
-       /* register word        temp1;  */\r
-       register int            /* m, */  i;\r
-       register longword       L_result, L_temp;\r
-       longword                EM;     /* xxx should be L_EM? */\r
-       word                    Mc;\r
-\r
-       longword                L_common_0_3;\r
-\r
-       EM = 0;\r
-       Mc = 0;\r
-\r
-       /* for (m = 0; m <= 3; m++) {\r
-        *      L_result = 0;\r
-        *\r
-        *\r
-        *      for (i = 0; i <= 12; i++) {\r
-        *\r
-        *              temp1    = SASR( x[m + 3*i], 2 );\r
-        *\r
-        *              assert(temp1 != MIN_WORD);\r
-        *\r
-        *              L_temp   = GSM_L_MULT( temp1, temp1 );\r
-        *              L_result = GSM_L_ADD( L_temp, L_result );\r
-        *      }\r
-        * \r
-        *      if (L_result > EM) {\r
-        *              Mc = m;\r
-        *              EM = L_result;\r
-        *      }\r
-        * }\r
-        */\r
-\r
-#undef STEP\r
-#define        STEP( m, i )            L_temp = SASR( x[m + 3 * i], 2 );       \\r
-                               L_result += L_temp * L_temp;\r
-\r
-       /* common part of 0 and 3 */\r
-\r
-       L_result = 0;\r
-       STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );\r
-       STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );\r
-       STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);\r
-       L_common_0_3 = L_result;\r
-\r
-       /* i = 0 */\r
-\r
-       STEP( 0, 0 );\r
-       L_result <<= 1; /* implicit in L_MULT */\r
-       EM = L_result;\r
-\r
-       /* i = 1 */\r
-\r
-       L_result = 0;\r
-       STEP( 1, 0 );\r
-       STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );\r
-       STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );\r
-       STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);\r
-       L_result <<= 1;\r
-       if (L_result > EM) {\r
-               Mc = 1;\r
-               EM = L_result;\r
-       }\r
-\r
-       /* i = 2 */\r
-\r
-       L_result = 0;\r
-       STEP( 2, 0 );\r
-       STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );\r
-       STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );\r
-       STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);\r
-       L_result <<= 1;\r
-       if (L_result > EM) {\r
-               Mc = 2;\r
-               EM = L_result;\r
-       }\r
-\r
-       /* i = 3 */\r
-\r
-       L_result = L_common_0_3;\r
-       STEP( 3, 12 );\r
-       L_result <<= 1;\r
-       if (L_result > EM) {\r
-               Mc = 3;\r
-               EM = L_result;\r
-       }\r
-\r
-       /**/\r
-\r
-       /*  Down-sampling by a factor 3 to get the selected xM[0..12]\r
-        *  RPE sequence.\r
-        */\r
-       for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];\r
-       *Mc_out = Mc;\r
-}\r
-\r
-/* 4.12.15 */\r
-\r
-static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out),\r
-       word            xmaxc,          /* IN   */\r
-       word            * exp_out,      /* OUT  */\r
-       word            * mant_out )    /* OUT  */\r
-{\r
-       word    exp, mant;\r
-\r
-       /* Compute exponent and mantissa of the decoded version of xmaxc\r
-        */\r
-\r
-       exp = 0;\r
-       if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1;\r
-       mant = xmaxc - (exp << 3);\r
-\r
-       if (mant == 0) {\r
-               exp  = -4;\r
-               mant = 7;\r
-       }\r
-       else {\r
-               while (mant <= 7) {\r
-                       mant = mant << 1 | 1;\r
-                       exp--;\r
-               }\r
-               mant -= 8;\r
-       }\r
-\r
-       assert( exp  >= -4 && exp <= 6 );\r
-       assert( mant >= 0 && mant <= 7 );\r
-\r
-       *exp_out  = exp;\r
-       *mant_out = mant;\r
-}\r
-\r
-static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out),\r
-       word            * xM,           /* [0..12]              IN      */\r
-\r
-       word            * xMc,          /* [0..12]              OUT     */\r
-       word            * mant_out,     /*                      OUT     */\r
-       word            * exp_out,      /*                      OUT     */\r
-       word            * xmaxc_out     /*                      OUT     */\r
-)\r
-{\r
-       int     i, itest;\r
-\r
-       word    xmax, xmaxc, temp, temp1, temp2;\r
-       word    exp, mant;\r
-\r
-\r
-       /*  Find the maximum absolute value xmax of xM[0..12].\r
-        */\r
-\r
-       xmax = 0;\r
-       for (i = 0; i <= 12; i++) {\r
-               temp = xM[i];\r
-               temp = GSM_ABS(temp);\r
-               if (temp > xmax) xmax = temp;\r
-       }\r
-\r
-       /*  Qantizing and coding of xmax to get xmaxc.\r
-        */\r
-\r
-       exp   = 0;\r
-       temp  = SASR( xmax, 9 );\r
-       itest = 0;\r
-\r
-       for (i = 0; i <= 5; i++) {\r
-\r
-               itest |= (temp <= 0);\r
-               temp = SASR( temp, 1 );\r
-\r
-               assert(exp <= 5);\r
-               if (itest == 0) exp++;          /* exp = add (exp, 1) */\r
-       }\r
-\r
-       assert(exp <= 6 && exp >= 0);\r
-       temp = exp + 5;\r
-\r
-       assert(temp <= 11 && temp >= 0);\r
-       xmaxc = gsm_add( SASR(xmax, temp), exp << 3 );\r
-\r
-       /*   Quantizing and coding of the xM[0..12] RPE sequence\r
-        *   to get the xMc[0..12]\r
-        */\r
-\r
-       APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant );\r
-\r
-       /*  This computation uses the fact that the decoded version of xmaxc\r
-        *  can be calculated by using the exponent and the mantissa part of\r
-        *  xmaxc (logarithmic table).\r
-        *  So, this method avoids any division and uses only a scaling\r
-        *  of the RPE samples by a function of the exponent.  A direct \r
-        *  multiplication by the inverse of the mantissa (NRFAC[0..7]\r
-        *  found in table 4.5) gives the 3 bit coded version xMc[0..12]\r
-        *  of the RPE samples.\r
-        */\r
-\r
-\r
-       /* Direct computation of xMc[0..12] using table 4.5\r
-        */\r
-\r
-       assert( exp <= 4096 && exp >= -4096);\r
-       assert( mant >= 0 && mant <= 7 ); \r
-\r
-       temp1 = 6 - exp;                /* normalization by the exponent */\r
-       temp2 = gsm_NRFAC[ mant ];      /* inverse mantissa              */\r
-\r
-       for (i = 0; i <= 12; i++) {\r
-\r
-               assert(temp1 >= 0 && temp1 < 16);\r
-\r
-               temp = xM[i] << temp1;\r
-               temp = (word) GSM_MULT( temp, temp2 );\r
-               temp = SASR(temp, 12);\r
-               xMc[i] = temp + 4;              /* see note below */\r
-       }\r
-\r
-       /*  NOTE: This equation is used to make all the xMc[i] positive.\r
-        */\r
-\r
-       *mant_out  = mant;\r
-       *exp_out   = exp;\r
-       *xmaxc_out = xmaxc;\r
-}\r
-\r
-/* 4.2.16 */\r
-\r
-static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),\r
-       register word   * xMc,  /* [0..12]                      IN      */\r
-       word            mant,\r
-       word            exp,\r
-       register word   * xMp)  /* [0..12]                      OUT     */\r
-/* \r
- *  This part is for decoding the RPE sequence of coded xMc[0..12]\r
- *  samples to obtain the xMp[0..12] array.  Table 4.6 is used to get\r
- *  the mantissa of xmaxc (FAC[0..7]).\r
- */\r
-{\r
-       int     i;\r
-       word    temp, temp1, temp2, temp3;\r
-       longword        ltmp;\r
-\r
-       assert( mant >= 0 && mant <= 7 ); \r
-\r
-       temp1 = gsm_FAC[ mant ];        /* see 4.2-15 for mant */\r
-       temp2 = gsm_sub( 6, exp );      /* see 4.2-15 for exp  */\r
-       temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));\r
-\r
-       for (i = 13; i--;) {\r
-\r
-               assert( *xMc <= 7 && *xMc >= 0 );       /* 3 bit unsigned */\r
-\r
-               /* temp = gsm_sub( *xMc++ << 1, 7 ); */\r
-               temp = (*xMc++ << 1) - 7;               /* restore sign   */\r
-               assert( temp <= 7 && temp >= -7 );      /* 4 bit signed   */\r
-\r
-               temp <<= 12;                            /* 16 bit signed  */\r
-               temp = (word) GSM_MULT_R( temp1, temp );\r
-               temp = (word) GSM_ADD( temp, temp3 );\r
-               *xMp++ = gsm_asr( temp, temp2 );\r
-       }\r
-}\r
-\r
-/* 4.2.17 */\r
-\r
-static void RPE_grid_positioning P3((Mc,xMp,ep),\r
-       word            Mc,             /* grid position        IN      */\r
-       register word   * xMp,          /* [0..12]              IN      */\r
-       register word   * ep            /* [0..39]              OUT     */\r
-)\r
-/*\r
- *  This procedure computes the reconstructed long term residual signal\r
- *  ep[0..39] for the LTP analysis filter.  The inputs are the Mc\r
- *  which is the grid position selection and the xMp[0..12] decoded\r
- *  RPE samples which are upsampled by a factor of 3 by inserting zero\r
- *  values.\r
- */\r
-{\r
-       int     i = 13;\r
-\r
-       assert(0 <= Mc && Mc <= 3);\r
-\r
-        switch (Mc) {\r
-                case 3: *ep++ = 0;\r
-                case 2:  do {\r
-                                *ep++ = 0;\r
-                case 1:         *ep++ = 0;\r
-                case 0:         *ep++ = *xMp++;\r
-                         } while (--i);\r
-        }\r
-        while (++Mc < 4) *ep++ = 0;\r
-\r
-       /*\r
-\r
-       int i, k;\r
-       for (k = 0; k <= 39; k++) ep[k] = 0;\r
-       for (i = 0; i <= 12; i++) {\r
-               ep[ Mc + (3*i) ] = xMp[i];\r
-       }\r
-       */\r
-}\r
-\r
-/* 4.2.18 */\r
-\r
-/*  This procedure adds the reconstructed long term residual signal\r
- *  ep[0..39] to the estimated signal dpp[0..39] from the long term\r
- *  analysis filter to compute the reconstructed short term residual\r
- *  signal dp[-40..-1]; also the reconstructed short term residual\r
- *  array dp[-120..-41] is updated.\r
- */\r
-\r
-#if 0  /* Has been inlined in code.c */\r
-void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp),\r
-       word    * dpp,          /* [0...39]     IN      */\r
-       word    * ep,           /* [0...39]     IN      */\r
-       word    * dp)           /* [-120...-1]  IN/OUT  */\r
-{\r
-       int             k;\r
-\r
-       for (k = 0; k <= 79; k++) \r
-               dp[ -120 + k ] = dp[ -80 + k ];\r
-\r
-       for (k = 0; k <= 39; k++)\r
-               dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );\r
-}\r
-#endif /* Has been inlined in code.c */\r
-\r
-void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc),\r
-\r
-       struct gsm_state * S,\r
-\r
-       word    * e,            /* -5..-1][0..39][40..44        IN/OUT  */\r
-       word    * xmaxc,        /*                              OUT */\r
-       word    * Mc,           /*                              OUT */\r
-       word    * xMc)          /* [0..12]                      OUT */\r
-{\r
-       word    x[40];\r
-       word    xM[13], xMp[13];\r
-       word    mant, exp;\r
-\r
-       Weighting_filter(e, x);\r
-       RPE_grid_selection(x, xM, Mc);\r
-\r
-       APCM_quantization(      xM, xMc, &mant, &exp, xmaxc);\r
-       APCM_inverse_quantization(  xMc,  mant,  exp, xMp);\r
-\r
-       RPE_grid_positioning( *Mc, xMp, e );\r
-\r
-}\r
-\r
-void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp),\r
-       struct gsm_state        * S,\r
-\r
-       word            xmaxcr,\r
-       word            Mcr,\r
-       word            * xMcr,  /* [0..12], 3 bits             IN      */\r
-       word            * erp    /* [0..39]                     OUT     */\r
-)\r
-{\r
-       word    exp, mant;\r
-       word    xMp[ 13 ];\r
-\r
-       APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant );\r
-       APCM_inverse_quantization( xMcr, mant, exp, xMp );\r
-       RPE_grid_positioning( Mcr, xMp, erp );\r
-\r
-}\r
+/*
+ * rpe.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*  4.2.13 .. 4.2.17  RPE ENCODING SECTION
+ */
+
+/* 4.2.13 */
+
+static void Weighting_filter P2((e, x),
+       register word   * e,            /* signal [-5..0.39.44] IN  */
+       word            * x             /* signal [0..39]       OUT */
+)
+/*
+ *  The coefficients of the weighting filter are stored in a table
+ *  (see table 4.4).  The following scaling is used:
+ *
+ *     H[0..10] = integer( real_H[ 0..10] * 8192 ); 
+ */
+{
+       /* word                 wt[ 50 ]; */
+
+       register longword       L_result;
+       register int            k /* , i */ ;
+
+       /*  Initialization of a temporary working array wt[0...49]
+        */
+
+       /* for (k =  0; k <=  4; k++) wt[k] = 0;
+        * for (k =  5; k <= 44; k++) wt[k] = *e++;
+        * for (k = 45; k <= 49; k++) wt[k] = 0;
+        *
+        *  (e[-5..-1] and e[40..44] are allocated by the caller,
+        *  are initially zero and are not written anywhere.)
+        */
+       e -= 5;
+
+       /*  Compute the signal x[0..39]
+        */ 
+       for (k = 0; k <= 39; k++) {
+
+               L_result = 8192 >> 1;
+
+               /* for (i = 0; i <= 10; i++) {
+                *      L_temp   = GSM_L_MULT( wt[k+i], gsm_H[i] );
+                *      L_result = GSM_L_ADD( L_result, L_temp );
+                * }
+                */
+
+#undef STEP
+#define        STEP( i, H )    (e[ k + i ] * (longword)H)
+
+               /*  Every one of these multiplications is done twice --
+                *  but I don't see an elegant way to optimize this. 
+                *  Do you?
+                */
+
+#ifdef STUPID_COMPILER
+               L_result += STEP(       0,      -134 ) ;
+               L_result += STEP(       1,      -374 )  ;
+                      /* + STEP(       2,      0    )  */
+               L_result += STEP(       3,      2054 ) ;
+               L_result += STEP(       4,      5741 ) ;
+               L_result += STEP(       5,      8192 ) ;
+               L_result += STEP(       6,      5741 ) ;
+               L_result += STEP(       7,      2054 ) ;
+                      /* + STEP(       8,      0    )  */
+               L_result += STEP(       9,      -374 ) ;
+               L_result += STEP(       10,     -134 ) ;
+#else
+               L_result +=
+                 STEP( 0,      -134 ) 
+               + STEP( 1,      -374 ) 
+            /* + STEP( 2,      0    )  */
+               + STEP( 3,      2054 ) 
+               + STEP( 4,      5741 ) 
+               + STEP( 5,      8192 ) 
+               + STEP( 6,      5741 ) 
+               + STEP( 7,      2054 ) 
+            /* + STEP( 8,      0    )  */
+               + STEP( 9,      -374 ) 
+               + STEP(10,      -134 )
+               ;
+#endif
+
+               /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)
+                * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)
+                *
+                * x[k] = SASR( L_result, 16 );
+                */
+
+               /* 2 adds vs. >>16 => 14, minus one shift to compensate for
+                * those we lost when replacing L_MULT by '*'.
+                */
+
+               L_result = SASR( L_result, 13 );
+               x[k] =  (word) ((  L_result < MIN_WORD ? MIN_WORD
+                       : (L_result > MAX_WORD ? MAX_WORD : L_result )));
+       }
+}
+
+/* 4.2.14 */
+
+static void RPE_grid_selection P3((x,xM,Mc_out),
+       word            * x,            /* [0..39]              IN  */ 
+       word            * xM,           /* [0..12]              OUT */
+       word            * Mc_out        /*                      OUT */
+)
+/*
+ *  The signal x[0..39] is used to select the RPE grid which is
+ *  represented by Mc.
+ */
+{
+       /* register word        temp1;  */
+       register int            /* m, */  i;
+       register longword       L_result, L_temp;
+       longword                EM;     /* xxx should be L_EM? */
+       word                    Mc;
+
+       longword                L_common_0_3;
+
+       EM = 0;
+       Mc = 0;
+
+       /* for (m = 0; m <= 3; m++) {
+        *      L_result = 0;
+        *
+        *
+        *      for (i = 0; i <= 12; i++) {
+        *
+        *              temp1    = SASR( x[m + 3*i], 2 );
+        *
+        *              assert(temp1 != MIN_WORD);
+        *
+        *              L_temp   = GSM_L_MULT( temp1, temp1 );
+        *              L_result = GSM_L_ADD( L_temp, L_result );
+        *      }
+        * 
+        *      if (L_result > EM) {
+        *              Mc = m;
+        *              EM = L_result;
+        *      }
+        * }
+        */
+
+#undef STEP
+#define        STEP( m, i )            L_temp = SASR( x[m + 3 * i], 2 );       \
+                               L_result += L_temp * L_temp;
+
+       /* common part of 0 and 3 */
+
+       L_result = 0;
+       STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
+       STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
+       STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
+       L_common_0_3 = L_result;
+
+       /* i = 0 */
+
+       STEP( 0, 0 );
+       L_result <<= 1; /* implicit in L_MULT */
+       EM = L_result;
+
+       /* i = 1 */
+
+       L_result = 0;
+       STEP( 1, 0 );
+       STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
+       STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
+       STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
+       L_result <<= 1;
+       if (L_result > EM) {
+               Mc = 1;
+               EM = L_result;
+       }
+
+       /* i = 2 */
+
+       L_result = 0;
+       STEP( 2, 0 );
+       STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
+       STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
+       STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
+       L_result <<= 1;
+       if (L_result > EM) {
+               Mc = 2;
+               EM = L_result;
+       }
+
+       /* i = 3 */
+
+       L_result = L_common_0_3;
+       STEP( 3, 12 );
+       L_result <<= 1;
+       if (L_result > EM) {
+               Mc = 3;
+               EM = L_result;
+       }
+
+       /**/
+
+       /*  Down-sampling by a factor 3 to get the selected xM[0..12]
+        *  RPE sequence.
+        */
+       for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];
+       *Mc_out = Mc;
+}
+
+/* 4.12.15 */
+
+static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out),
+       word            xmaxc,          /* IN   */
+       word            * exp_out,      /* OUT  */
+       word            * mant_out )    /* OUT  */
+{
+       word    exp, mant;
+
+       /* Compute exponent and mantissa of the decoded version of xmaxc
+        */
+
+       exp = 0;
+       if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1;
+       mant = xmaxc - (exp << 3);
+
+       if (mant == 0) {
+               exp  = -4;
+               mant = 7;
+       }
+       else {
+               while (mant <= 7) {
+                       mant = mant << 1 | 1;
+                       exp--;
+               }
+               mant -= 8;
+       }
+
+       assert( exp  >= -4 && exp <= 6 );
+       assert( mant >= 0 && mant <= 7 );
+
+       *exp_out  = exp;
+       *mant_out = mant;
+}
+
+static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out),
+       word            * xM,           /* [0..12]              IN      */
+
+       word            * xMc,          /* [0..12]              OUT     */
+       word            * mant_out,     /*                      OUT     */
+       word            * exp_out,      /*                      OUT     */
+       word            * xmaxc_out     /*                      OUT     */
+)
+{
+       int     i, itest;
+
+       word    xmax, xmaxc, temp, temp1, temp2;
+       word    exp, mant;
+
+
+       /*  Find the maximum absolute value xmax of xM[0..12].
+        */
+
+       xmax = 0;
+       for (i = 0; i <= 12; i++) {
+               temp = xM[i];
+               temp = GSM_ABS(temp);
+               if (temp > xmax) xmax = temp;
+       }
+
+       /*  Qantizing and coding of xmax to get xmaxc.
+        */
+
+       exp   = 0;
+       temp  = SASR( xmax, 9 );
+       itest = 0;
+
+       for (i = 0; i <= 5; i++) {
+
+               itest |= (temp <= 0);
+               temp = SASR( temp, 1 );
+
+               assert(exp <= 5);
+               if (itest == 0) exp++;          /* exp = add (exp, 1) */
+       }
+
+       assert(exp <= 6 && exp >= 0);
+       temp = exp + 5;
+
+       assert(temp <= 11 && temp >= 0);
+       xmaxc = gsm_add( SASR(xmax, temp), exp << 3 );
+
+       /*   Quantizing and coding of the xM[0..12] RPE sequence
+        *   to get the xMc[0..12]
+        */
+
+       APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant );
+
+       /*  This computation uses the fact that the decoded version of xmaxc
+        *  can be calculated by using the exponent and the mantissa part of
+        *  xmaxc (logarithmic table).
+        *  So, this method avoids any division and uses only a scaling
+        *  of the RPE samples by a function of the exponent.  A direct 
+        *  multiplication by the inverse of the mantissa (NRFAC[0..7]
+        *  found in table 4.5) gives the 3 bit coded version xMc[0..12]
+        *  of the RPE samples.
+        */
+
+
+       /* Direct computation of xMc[0..12] using table 4.5
+        */
+
+       assert( exp <= 4096 && exp >= -4096);
+       assert( mant >= 0 && mant <= 7 ); 
+
+       temp1 = 6 - exp;                /* normalization by the exponent */
+       temp2 = gsm_NRFAC[ mant ];      /* inverse mantissa              */
+
+       for (i = 0; i <= 12; i++) {
+
+               assert(temp1 >= 0 && temp1 < 16);
+
+               temp = xM[i] << temp1;
+               temp = (word) GSM_MULT( temp, temp2 );
+               temp = SASR(temp, 12);
+               xMc[i] = temp + 4;              /* see note below */
+       }
+
+       /*  NOTE: This equation is used to make all the xMc[i] positive.
+        */
+
+       *mant_out  = mant;
+       *exp_out   = exp;
+       *xmaxc_out = xmaxc;
+}
+
+/* 4.2.16 */
+
+static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),
+       register word   * xMc,  /* [0..12]                      IN      */
+       word            mant,
+       word            exp,
+       register word   * xMp)  /* [0..12]                      OUT     */
+/* 
+ *  This part is for decoding the RPE sequence of coded xMc[0..12]
+ *  samples to obtain the xMp[0..12] array.  Table 4.6 is used to get
+ *  the mantissa of xmaxc (FAC[0..7]).
+ */
+{
+       int     i;
+       word    temp, temp1, temp2, temp3;
+       longword        ltmp;
+
+       assert( mant >= 0 && mant <= 7 ); 
+
+       temp1 = gsm_FAC[ mant ];        /* see 4.2-15 for mant */
+       temp2 = gsm_sub( 6, exp );      /* see 4.2-15 for exp  */
+       temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));
+
+       for (i = 13; i--;) {
+
+               assert( *xMc <= 7 && *xMc >= 0 );       /* 3 bit unsigned */
+
+               /* temp = gsm_sub( *xMc++ << 1, 7 ); */
+               temp = (*xMc++ << 1) - 7;               /* restore sign   */
+               assert( temp <= 7 && temp >= -7 );      /* 4 bit signed   */
+
+               temp <<= 12;                            /* 16 bit signed  */
+               temp = (word) GSM_MULT_R( temp1, temp );
+               temp = (word) GSM_ADD( temp, temp3 );
+               *xMp++ = gsm_asr( temp, temp2 );
+       }
+}
+
+/* 4.2.17 */
+
+static void RPE_grid_positioning P3((Mc,xMp,ep),
+       word            Mc,             /* grid position        IN      */
+       register word   * xMp,          /* [0..12]              IN      */
+       register word   * ep            /* [0..39]              OUT     */
+)
+/*
+ *  This procedure computes the reconstructed long term residual signal
+ *  ep[0..39] for the LTP analysis filter.  The inputs are the Mc
+ *  which is the grid position selection and the xMp[0..12] decoded
+ *  RPE samples which are upsampled by a factor of 3 by inserting zero
+ *  values.
+ */
+{
+       int     i = 13;
+
+       assert(0 <= Mc && Mc <= 3);
+
+        switch (Mc) {
+                case 3: *ep++ = 0;
+                case 2:  do {
+                                *ep++ = 0;
+                case 1:         *ep++ = 0;
+                case 0:         *ep++ = *xMp++;
+                         } while (--i);
+        }
+        while (++Mc < 4) *ep++ = 0;
+
+       /*
+
+       int i, k;
+       for (k = 0; k <= 39; k++) ep[k] = 0;
+       for (i = 0; i <= 12; i++) {
+               ep[ Mc + (3*i) ] = xMp[i];
+       }
+       */
+}
+
+/* 4.2.18 */
+
+/*  This procedure adds the reconstructed long term residual signal
+ *  ep[0..39] to the estimated signal dpp[0..39] from the long term
+ *  analysis filter to compute the reconstructed short term residual
+ *  signal dp[-40..-1]; also the reconstructed short term residual
+ *  array dp[-120..-41] is updated.
+ */
+
+#if 0  /* Has been inlined in code.c */
+void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp),
+       word    * dpp,          /* [0...39]     IN      */
+       word    * ep,           /* [0...39]     IN      */
+       word    * dp)           /* [-120...-1]  IN/OUT  */
+{
+       int             k;
+
+       for (k = 0; k <= 79; k++) 
+               dp[ -120 + k ] = dp[ -80 + k ];
+
+       for (k = 0; k <= 39; k++)
+               dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );
+}
+#endif /* Has been inlined in code.c */
+
+void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc),
+
+       struct gsm_state * S,
+
+       word    * e,            /* -5..-1][0..39][40..44        IN/OUT  */
+       word    * xmaxc,        /*                              OUT */
+       word    * Mc,           /*                              OUT */
+       word    * xMc)          /* [0..12]                      OUT */
+{
+       word    x[40];
+       word    xM[13], xMp[13];
+       word    mant, exp;
+
+       Weighting_filter(e, x);
+       RPE_grid_selection(x, xM, Mc);
+
+       APCM_quantization(      xM, xMc, &mant, &exp, xmaxc);
+       APCM_inverse_quantization(  xMc,  mant,  exp, xMp);
+
+       RPE_grid_positioning( *Mc, xMp, e );
+
+}
+
+void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp),
+       struct gsm_state        * S,
+
+       word            xmaxcr,
+       word            Mcr,
+       word            * xMcr,  /* [0..12], 3 bits             IN      */
+       word            * erp    /* [0..39]                     OUT     */
+)
+{
+       word    exp, mant;
+       word    xMp[ 13 ];
+
+       APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant );
+       APCM_inverse_quantization( xMcr, mant, exp, xMp );
+       RPE_grid_positioning( Mcr, xMp, erp );
+
+}
index efb0b7b4884ce95e9ac4df216f295b960a7e40d4..b953d5b262dfc27c0048deffdf56a012c23a5707 100644 (file)
-/*\r
- * short_term.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-/*\r
- *  SHORT TERM ANALYSIS FILTERING SECTION\r
- */\r
-\r
-/* 4.2.8 */\r
-\r
-static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),\r
-       word    * LARc,         /* coded log area ratio [0..7]  IN      */\r
-       word    * LARpp)        /* out: decoded ..                      */\r
-{\r
-       register word   temp1 /* , temp2 */;\r
-       register long   ltmp;   /* for GSM_ADD */\r
-\r
-       /*  This procedure requires for efficient implementation\r
-        *  two tables.\r
-        *\r
-        *  INVA[1..8] = integer( (32768 * 8) / real_A[1..8])\r
-        *  MIC[1..8]  = minimum value of the LARc[1..8]\r
-        */\r
-\r
-       /*  Compute the LARpp[1..8]\r
-        */\r
-\r
-       /*      for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {\r
-        *\r
-        *              temp1  = GSM_ADD( *LARc, *MIC ) << 10;\r
-        *              temp2  = *B << 1;\r
-        *              temp1  = GSM_SUB( temp1, temp2 );\r
-        *\r
-        *              assert(*INVA != MIN_WORD);\r
-        *\r
-        *              temp1  = GSM_MULT_R( *INVA, temp1 );\r
-        *              *LARpp = GSM_ADD( temp1, temp1 );\r
-        *      }\r
-        */\r
-\r
-#undef STEP\r
-#define        STEP( B, MIC, INVA )    \\r
-               temp1    = (word) GSM_ADD( *LARc++, MIC ) << 10;        \\r
-               temp1    = (word) GSM_SUB( temp1, B << 1 );             \\r
-               temp1    = (word) GSM_MULT_R( INVA, temp1 );            \\r
-               *LARpp++ = (word) GSM_ADD( temp1, temp1 );\r
-\r
-       STEP(      0,  -32,  13107 );\r
-       STEP(      0,  -32,  13107 );\r
-       STEP(   2048,  -16,  13107 );\r
-       STEP(  -2560,  -16,  13107 );\r
-\r
-       STEP(     94,   -8,  19223 );\r
-       STEP(  -1792,   -8,  17476 );\r
-       STEP(   -341,   -4,  31454 );\r
-       STEP(  -1144,   -4,  29708 );\r
-\r
-       /* NOTE: the addition of *MIC is used to restore\r
-        *       the sign of *LARc.\r
-        */\r
-}\r
-\r
-/* 4.2.9 */\r
-/* Computation of the quantized reflection coefficients \r
- */\r
-\r
-/* 4.2.9.1  Interpolation of the LARpp[1..8] to get the LARp[1..8]\r
- */\r
-\r
-/*\r
- *  Within each frame of 160 analyzed speech samples the short term\r
- *  analysis and synthesis filters operate with four different sets of\r
- *  coefficients, derived from the previous set of decoded LARs(LARpp(j-1))\r
- *  and the actual set of decoded LARs (LARpp(j))\r
- *\r
- * (Initial value: LARpp(j-1)[1..8] = 0.)\r
- */\r
-\r
-static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),\r
-       register word * LARpp_j_1,\r
-       register word * LARpp_j,\r
-       register word * LARp)\r
-{\r
-       register int    i;\r
-       register longword ltmp;\r
-\r
-       for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {\r
-               *LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));\r
-               *LARp = (word) GSM_ADD( *LARp,  SASR( *LARpp_j_1, 1));\r
-       }\r
-}\r
-\r
-static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),\r
-       register word * LARpp_j_1,\r
-       register word * LARpp_j,\r
-       register word * LARp)\r
-{\r
-       register int i;\r
-       register longword ltmp;\r
-       for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {\r
-               *LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));\r
-       }\r
-}\r
-\r
-static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),\r
-       register word * LARpp_j_1,\r
-       register word * LARpp_j,\r
-       register word * LARp)\r
-{\r
-       register int i;\r
-       register longword ltmp;\r
-\r
-       for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {\r
-               *LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));\r
-               *LARp = (word) GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));\r
-       }\r
-}\r
-\r
-\r
-static void Coefficients_40_159 P2((LARpp_j, LARp),\r
-       register word * LARpp_j,\r
-       register word * LARp)\r
-{\r
-       register int i;\r
-\r
-       for (i = 1; i <= 8; i++, LARp++, LARpp_j++)\r
-               *LARp = *LARpp_j;\r
-}\r
-\r
-/* 4.2.9.2 */\r
-\r
-static void LARp_to_rp P1((LARp),\r
-       register word * LARp)   /* [0..7] IN/OUT  */\r
-/*\r
- *  The input of this procedure is the interpolated LARp[0..7] array.\r
- *  The reflection coefficients, rp[i], are used in the analysis\r
- *  filter and in the synthesis filter.\r
- */\r
-{\r
-       register int            i;\r
-       register word           temp;\r
-       register longword       ltmp;\r
-\r
-       for (i = 1; i <= 8; i++, LARp++) {\r
-\r
-               /* temp = GSM_ABS( *LARp );\r
-                *\r
-                * if (temp < 11059) temp <<= 1;\r
-                * else if (temp < 20070) temp += 11059;\r
-                * else temp = GSM_ADD( temp >> 2, 26112 );\r
-                *\r
-                * *LARp = *LARp < 0 ? -temp : temp;\r
-                */\r
-\r
-               if (*LARp < 0) {\r
-                       temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);\r
-                       *LARp = - ((temp < 11059) ? temp << 1\r
-                               : ((temp < 20070) ? temp + 11059\r
-                               :  (word) GSM_ADD( temp >> 2, 26112 )));\r
-               } else {\r
-                       temp  = *LARp;\r
-                       *LARp =    (temp < 11059) ? temp << 1\r
-                               : ((temp < 20070) ? temp + 11059\r
-                               :  (word) GSM_ADD( temp >> 2, 26112 ));\r
-               }\r
-       }\r
-}\r
-\r
-\r
-/* 4.2.10 */\r
-static void Short_term_analysis_filtering P4((S,rp,k_n,s),\r
-       struct gsm_state * S,\r
-       register word   * rp,   /* [0..7]       IN      */\r
-       register int    k_n,    /*   k_end - k_start    */\r
-       register word   * s     /* [0..n-1]     IN/OUT  */\r
-)\r
-/*\r
- *  This procedure computes the short term residual signal d[..] to be fed\r
- *  to the RPE-LTP loop from the s[..] signal and from the local rp[..]\r
- *  array (quantized reflection coefficients).  As the call of this\r
- *  procedure can be done in many ways (see the interpolation of the LAR\r
- *  coefficient), it is assumed that the computation begins with index\r
- *  k_start (for arrays d[..] and s[..]) and stops with index k_end\r
- *  (k_start and k_end are defined in 4.2.9.1).  This procedure also\r
- *  needs to keep the array u[0..7] in memory for each call.\r
- */\r
-{\r
-       register word           * u = S->u;\r
-       register int            i;\r
-       register word           di, zzz, ui, sav, rpi;\r
-       register longword       ltmp;\r
-\r
-       for (; k_n--; s++) {\r
-\r
-               di = sav = *s;\r
-\r
-               for (i = 0; i < 8; i++) {               /* YYY */\r
-\r
-                       ui    = u[i];\r
-                       rpi   = rp[i];\r
-                       u[i]  = sav;\r
-\r
-                       zzz   = (word) GSM_MULT_R(rpi, di);\r
-                       sav   = (word) GSM_ADD(   ui,  zzz);\r
-\r
-                       zzz   = (word) GSM_MULT_R(rpi, ui);\r
-                       di    = (word) GSM_ADD(   di,  zzz );\r
-               }\r
-\r
-               *s = di;\r
-       }\r
-}\r
-\r
-#if defined(USE_FLOAT_MUL) && defined(FAST)\r
-\r
-static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s),\r
-       struct gsm_state * S,\r
-       register word   * rp,   /* [0..7]       IN      */\r
-       register int    k_n,    /*   k_end - k_start    */\r
-       register word   * s     /* [0..n-1]     IN/OUT  */\r
-)\r
-{\r
-       register word           * u = S->u;\r
-       register int            i;\r
-\r
-       float     uf[8],\r
-                rpf[8];\r
-\r
-       register float scalef = 3.0517578125e-5;\r
-       register float          sav, di, temp;\r
-\r
-       for (i = 0; i < 8; ++i) {\r
-               uf[i]  = u[i];\r
-               rpf[i] = rp[i] * scalef;\r
-       }\r
-       for (; k_n--; s++) {\r
-               sav = di = *s;\r
-               for (i = 0; i < 8; ++i) {\r
-                       register float rpfi = rpf[i];\r
-                       register float ufi  = uf[i];\r
-\r
-                       uf[i] = sav;\r
-                       temp  = rpfi * di + ufi;\r
-                       di   += rpfi * ufi;\r
-                       sav   = temp;\r
-               }\r
-               *s = di;\r
-       }\r
-       for (i = 0; i < 8; ++i) u[i] = uf[i];\r
-}\r
-#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */\r
-\r
-static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),\r
-       struct gsm_state * S,\r
-       register word   * rrp,  /* [0..7]       IN      */\r
-       register int    k,      /* k_end - k_start      */\r
-       register word   * wt,   /* [0..k-1]     IN      */\r
-       register word   * sr    /* [0..k-1]     OUT     */\r
-)\r
-{\r
-       register word           * v = S->v;\r
-       register int            i;\r
-       register word           sri, tmp1, tmp2;\r
-       register longword       ltmp;   /* for GSM_ADD  & GSM_SUB */\r
-\r
-       while (k--) {\r
-               sri = *wt++;\r
-               for (i = 8; i--;) {\r
-\r
-                       /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );\r
-                        */\r
-                       tmp1 = rrp[i];\r
-                       tmp2 = v[i];\r
-                       tmp2 = (word) ( tmp1 == MIN_WORD && tmp2 == MIN_WORD\r
-                               ? MAX_WORD\r
-                               : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2\r
-                                            + 16384) >> 15)) ;\r
-\r
-                       sri  = (word) GSM_SUB( sri, tmp2 );\r
-\r
-                       /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );\r
-                        */\r
-                       tmp1  = (word) ( tmp1 == MIN_WORD && sri == MIN_WORD\r
-                               ? MAX_WORD\r
-                               : 0x0FFFF & (( (longword)tmp1 * (longword)sri\r
-                                            + 16384) >> 15)) ;\r
-\r
-                       v[i+1] = (word) GSM_ADD( v[i], tmp1);\r
-               }\r
-               *sr++ = v[0] = sri;\r
-       }\r
-}\r
-\r
-\r
-#if defined(FAST) && defined(USE_FLOAT_MUL)\r
-\r
-static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),\r
-       struct gsm_state * S,\r
-       register word   * rrp,  /* [0..7]       IN      */\r
-       register int    k,      /* k_end - k_start      */\r
-       register word   * wt,   /* [0..k-1]     IN      */\r
-       register word   * sr    /* [0..k-1]     OUT     */\r
-)\r
-{\r
-       register word           * v = S->v;\r
-       register int            i;\r
-\r
-       float va[9], rrpa[8];\r
-       register float scalef = 3.0517578125e-5, temp;\r
-\r
-       for (i = 0; i < 8; ++i) {\r
-               va[i]   = v[i];\r
-               rrpa[i] = (float)rrp[i] * scalef;\r
-       }\r
-       while (k--) {\r
-               register float sri = *wt++;\r
-               for (i = 8; i--;) {\r
-                       sri -= rrpa[i] * va[i];\r
-                       if     (sri < -32768.) sri = -32768.;\r
-                       else if (sri > 32767.) sri =  32767.;\r
-\r
-                       temp = va[i] + rrpa[i] * sri;\r
-                       if     (temp < -32768.) temp = -32768.;\r
-                       else if (temp > 32767.) temp =  32767.;\r
-                       va[i+1] = temp;\r
-               }\r
-               *sr++ = va[0] = sri;\r
-       }\r
-       for (i = 0; i < 9; ++i) v[i] = va[i];\r
-}\r
-\r
-#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */\r
-\r
-void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),\r
-\r
-       struct gsm_state * S,\r
-\r
-       word    * LARc,         /* coded log area ratio [0..7]  IN      */\r
-       word    * s             /* signal [0..159]              IN/OUT  */\r
-)\r
-{\r
-       word            * LARpp_j       = S->LARpp[ S->j      ];\r
-       word            * LARpp_j_1     = S->LARpp[ S->j ^= 1 ];\r
-\r
-       word            LARp[8];\r
-\r
-#undef FILTER\r
-#if    defined(FAST) && defined(USE_FLOAT_MUL)\r
-#      define  FILTER  (* (S->fast                     \\r
-                          ? Fast_Short_term_analysis_filtering \\r
-                          : Short_term_analysis_filtering      ))\r
-\r
-#else\r
-#      define  FILTER  Short_term_analysis_filtering\r
-#endif\r
-\r
-       Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );\r
-\r
-       Coefficients_0_12(  LARpp_j_1, LARpp_j, LARp );\r
-       LARp_to_rp( LARp );\r
-       FILTER( S, LARp, 13, s);\r
-\r
-       Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);\r
-       LARp_to_rp( LARp );\r
-       FILTER( S, LARp, 14, s + 13);\r
-\r
-       Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);\r
-       LARp_to_rp( LARp );\r
-       FILTER( S, LARp, 13, s + 27);\r
-\r
-       Coefficients_40_159( LARpp_j, LARp);\r
-       LARp_to_rp( LARp );\r
-       FILTER( S, LARp, 120, s + 40);\r
-}\r
-\r
-void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),\r
-       struct gsm_state * S,\r
-\r
-       word    * LARcr,        /* received log area ratios [0..7] IN  */\r
-       word    * wt,           /* received d [0..159]             IN  */\r
-\r
-       word    * s             /* signal   s [0..159]            OUT  */\r
-)\r
-{\r
-       word            * LARpp_j       = S->LARpp[ S->j     ];\r
-       word            * LARpp_j_1     = S->LARpp[ S->j ^=1 ];\r
-\r
-       word            LARp[8];\r
-\r
-#undef FILTER\r
-#if    defined(FAST) && defined(USE_FLOAT_MUL)\r
-\r
-#      define  FILTER  (* (S->fast                     \\r
-                          ? Fast_Short_term_synthesis_filtering        \\r
-                          : Short_term_synthesis_filtering     ))\r
-#else\r
-#      define  FILTER  Short_term_synthesis_filtering\r
-#endif\r
-\r
-       Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );\r
-\r
-       Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );\r
-       LARp_to_rp( LARp );\r
-       FILTER( S, LARp, 13, wt, s );\r
-\r
-       Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);\r
-       LARp_to_rp( LARp );\r
-       FILTER( S, LARp, 14, wt + 13, s + 13 );\r
-\r
-       Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);\r
-       LARp_to_rp( LARp );\r
-       FILTER( S, LARp, 13, wt + 27, s + 27 );\r
-\r
-       Coefficients_40_159( LARpp_j, LARp );\r
-       LARp_to_rp( LARp );\r
-       FILTER(S, LARp, 120, wt + 40, s + 40);\r
-}\r
+/*
+ * short_term.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*
+ *  SHORT TERM ANALYSIS FILTERING SECTION
+ */
+
+/* 4.2.8 */
+
+static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
+       word    * LARc,         /* coded log area ratio [0..7]  IN      */
+       word    * LARpp)        /* out: decoded ..                      */
+{
+       register word   temp1 /* , temp2 */;
+       register long   ltmp;   /* for GSM_ADD */
+
+       /*  This procedure requires for efficient implementation
+        *  two tables.
+        *
+        *  INVA[1..8] = integer( (32768 * 8) / real_A[1..8])
+        *  MIC[1..8]  = minimum value of the LARc[1..8]
+        */
+
+       /*  Compute the LARpp[1..8]
+        */
+
+       /*      for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {
+        *
+        *              temp1  = GSM_ADD( *LARc, *MIC ) << 10;
+        *              temp2  = *B << 1;
+        *              temp1  = GSM_SUB( temp1, temp2 );
+        *
+        *              assert(*INVA != MIN_WORD);
+        *
+        *              temp1  = GSM_MULT_R( *INVA, temp1 );
+        *              *LARpp = GSM_ADD( temp1, temp1 );
+        *      }
+        */
+
+#undef STEP
+#define        STEP( B, MIC, INVA )    \
+               temp1    = (word) GSM_ADD( *LARc++, MIC ) << 10;        \
+               temp1    = (word) GSM_SUB( temp1, B << 1 );             \
+               temp1    = (word) GSM_MULT_R( INVA, temp1 );            \
+               *LARpp++ = (word) GSM_ADD( temp1, temp1 );
+
+       STEP(      0,  -32,  13107 );
+       STEP(      0,  -32,  13107 );
+       STEP(   2048,  -16,  13107 );
+       STEP(  -2560,  -16,  13107 );
+
+       STEP(     94,   -8,  19223 );
+       STEP(  -1792,   -8,  17476 );
+       STEP(   -341,   -4,  31454 );
+       STEP(  -1144,   -4,  29708 );
+
+       /* NOTE: the addition of *MIC is used to restore
+        *       the sign of *LARc.
+        */
+}
+
+/* 4.2.9 */
+/* Computation of the quantized reflection coefficients 
+ */
+
+/* 4.2.9.1  Interpolation of the LARpp[1..8] to get the LARp[1..8]
+ */
+
+/*
+ *  Within each frame of 160 analyzed speech samples the short term
+ *  analysis and synthesis filters operate with four different sets of
+ *  coefficients, derived from the previous set of decoded LARs(LARpp(j-1))
+ *  and the actual set of decoded LARs (LARpp(j))
+ *
+ * (Initial value: LARpp(j-1)[1..8] = 0.)
+ */
+
+static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),
+       register word * LARpp_j_1,
+       register word * LARpp_j,
+       register word * LARp)
+{
+       register int    i;
+       register longword ltmp;
+
+       for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
+               *LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
+               *LARp = (word) GSM_ADD( *LARp,  SASR( *LARpp_j_1, 1));
+       }
+}
+
+static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),
+       register word * LARpp_j_1,
+       register word * LARpp_j,
+       register word * LARp)
+{
+       register int i;
+       register longword ltmp;
+       for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+               *LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));
+       }
+}
+
+static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),
+       register word * LARpp_j_1,
+       register word * LARpp_j,
+       register word * LARp)
+{
+       register int i;
+       register longword ltmp;
+
+       for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+               *LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
+               *LARp = (word) GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));
+       }
+}
+
+
+static void Coefficients_40_159 P2((LARpp_j, LARp),
+       register word * LARpp_j,
+       register word * LARp)
+{
+       register int i;
+
+       for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
+               *LARp = *LARpp_j;
+}
+
+/* 4.2.9.2 */
+
+static void LARp_to_rp P1((LARp),
+       register word * LARp)   /* [0..7] IN/OUT  */
+/*
+ *  The input of this procedure is the interpolated LARp[0..7] array.
+ *  The reflection coefficients, rp[i], are used in the analysis
+ *  filter and in the synthesis filter.
+ */
+{
+       register int            i;
+       register word           temp;
+       register longword       ltmp;
+
+       for (i = 1; i <= 8; i++, LARp++) {
+
+               /* temp = GSM_ABS( *LARp );
+                *
+                * if (temp < 11059) temp <<= 1;
+                * else if (temp < 20070) temp += 11059;
+                * else temp = GSM_ADD( temp >> 2, 26112 );
+                *
+                * *LARp = *LARp < 0 ? -temp : temp;
+                */
+
+               if (*LARp < 0) {
+                       temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
+                       *LARp = - ((temp < 11059) ? temp << 1
+                               : ((temp < 20070) ? temp + 11059
+                               :  (word) GSM_ADD( temp >> 2, 26112 )));
+               } else {
+                       temp  = *LARp;
+                       *LARp =    (temp < 11059) ? temp << 1
+                               : ((temp < 20070) ? temp + 11059
+                               :  (word) GSM_ADD( temp >> 2, 26112 ));
+               }
+       }
+}
+
+
+/* 4.2.10 */
+static void Short_term_analysis_filtering P4((S,rp,k_n,s),
+       struct gsm_state * S,
+       register word   * rp,   /* [0..7]       IN      */
+       register int    k_n,    /*   k_end - k_start    */
+       register word   * s     /* [0..n-1]     IN/OUT  */
+)
+/*
+ *  This procedure computes the short term residual signal d[..] to be fed
+ *  to the RPE-LTP loop from the s[..] signal and from the local rp[..]
+ *  array (quantized reflection coefficients).  As the call of this
+ *  procedure can be done in many ways (see the interpolation of the LAR
+ *  coefficient), it is assumed that the computation begins with index
+ *  k_start (for arrays d[..] and s[..]) and stops with index k_end
+ *  (k_start and k_end are defined in 4.2.9.1).  This procedure also
+ *  needs to keep the array u[0..7] in memory for each call.
+ */
+{
+       register word           * u = S->u;
+       register int            i;
+       register word           di, zzz, ui, sav, rpi;
+       register longword       ltmp;
+
+       for (; k_n--; s++) {
+
+               di = sav = *s;
+
+               for (i = 0; i < 8; i++) {               /* YYY */
+
+                       ui    = u[i];
+                       rpi   = rp[i];
+                       u[i]  = sav;
+
+                       zzz   = (word) GSM_MULT_R(rpi, di);
+                       sav   = (word) GSM_ADD(   ui,  zzz);
+
+                       zzz   = (word) GSM_MULT_R(rpi, ui);
+                       di    = (word) GSM_ADD(   di,  zzz );
+               }
+
+               *s = di;
+       }
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s),
+       struct gsm_state * S,
+       register word   * rp,   /* [0..7]       IN      */
+       register int    k_n,    /*   k_end - k_start    */
+       register word   * s     /* [0..n-1]     IN/OUT  */
+)
+{
+       register word           * u = S->u;
+       register int            i;
+
+       float     uf[8],
+                rpf[8];
+
+       register float scalef = 3.0517578125e-5;
+       register float          sav, di, temp;
+
+       for (i = 0; i < 8; ++i) {
+               uf[i]  = u[i];
+               rpf[i] = rp[i] * scalef;
+       }
+       for (; k_n--; s++) {
+               sav = di = *s;
+               for (i = 0; i < 8; ++i) {
+                       register float rpfi = rpf[i];
+                       register float ufi  = uf[i];
+
+                       uf[i] = sav;
+                       temp  = rpfi * di + ufi;
+                       di   += rpfi * ufi;
+                       sav   = temp;
+               }
+               *s = di;
+       }
+       for (i = 0; i < 8; ++i) u[i] = uf[i];
+}
+#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
+
+static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+       struct gsm_state * S,
+       register word   * rrp,  /* [0..7]       IN      */
+       register int    k,      /* k_end - k_start      */
+       register word   * wt,   /* [0..k-1]     IN      */
+       register word   * sr    /* [0..k-1]     OUT     */
+)
+{
+       register word           * v = S->v;
+       register int            i;
+       register word           sri, tmp1, tmp2;
+       register longword       ltmp;   /* for GSM_ADD  & GSM_SUB */
+
+       while (k--) {
+               sri = *wt++;
+               for (i = 8; i--;) {
+
+                       /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
+                        */
+                       tmp1 = rrp[i];
+                       tmp2 = v[i];
+                       tmp2 = (word) ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
+                               ? MAX_WORD
+                               : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
+                                            + 16384) >> 15)) ;
+
+                       sri  = (word) GSM_SUB( sri, tmp2 );
+
+                       /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
+                        */
+                       tmp1  = (word) ( tmp1 == MIN_WORD && sri == MIN_WORD
+                               ? MAX_WORD
+                               : 0x0FFFF & (( (longword)tmp1 * (longword)sri
+                                            + 16384) >> 15)) ;
+
+                       v[i+1] = (word) GSM_ADD( v[i], tmp1);
+               }
+               *sr++ = v[0] = sri;
+       }
+}
+
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+
+static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+       struct gsm_state * S,
+       register word   * rrp,  /* [0..7]       IN      */
+       register int    k,      /* k_end - k_start      */
+       register word   * wt,   /* [0..k-1]     IN      */
+       register word   * sr    /* [0..k-1]     OUT     */
+)
+{
+       register word           * v = S->v;
+       register int            i;
+
+       float va[9], rrpa[8];
+       register float scalef = 3.0517578125e-5, temp;
+
+       for (i = 0; i < 8; ++i) {
+               va[i]   = v[i];
+               rrpa[i] = (float)rrp[i] * scalef;
+       }
+       while (k--) {
+               register float sri = *wt++;
+               for (i = 8; i--;) {
+                       sri -= rrpa[i] * va[i];
+                       if     (sri < -32768.) sri = -32768.;
+                       else if (sri > 32767.) sri =  32767.;
+
+                       temp = va[i] + rrpa[i] * sri;
+                       if     (temp < -32768.) temp = -32768.;
+                       else if (temp > 32767.) temp =  32767.;
+                       va[i+1] = temp;
+               }
+               *sr++ = va[0] = sri;
+       }
+       for (i = 0; i < 9; ++i) v[i] = va[i];
+}
+
+#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */
+
+void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),
+
+       struct gsm_state * S,
+
+       word    * LARc,         /* coded log area ratio [0..7]  IN      */
+       word    * s             /* signal [0..159]              IN/OUT  */
+)
+{
+       word            * LARpp_j       = S->LARpp[ S->j      ];
+       word            * LARpp_j_1     = S->LARpp[ S->j ^= 1 ];
+
+       word            LARp[8];
+
+#undef FILTER
+#if    defined(FAST) && defined(USE_FLOAT_MUL)
+#      define  FILTER  (* (S->fast                     \
+                          ? Fast_Short_term_analysis_filtering \
+                          : Short_term_analysis_filtering      ))
+
+#else
+#      define  FILTER  Short_term_analysis_filtering
+#endif
+
+       Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
+
+       Coefficients_0_12(  LARpp_j_1, LARpp_j, LARp );
+       LARp_to_rp( LARp );
+       FILTER( S, LARp, 13, s);
+
+       Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+       LARp_to_rp( LARp );
+       FILTER( S, LARp, 14, s + 13);
+
+       Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+       LARp_to_rp( LARp );
+       FILTER( S, LARp, 13, s + 27);
+
+       Coefficients_40_159( LARpp_j, LARp);
+       LARp_to_rp( LARp );
+       FILTER( S, LARp, 120, s + 40);
+}
+
+void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),
+       struct gsm_state * S,
+
+       word    * LARcr,        /* received log area ratios [0..7] IN  */
+       word    * wt,           /* received d [0..159]             IN  */
+
+       word    * s             /* signal   s [0..159]            OUT  */
+)
+{
+       word            * LARpp_j       = S->LARpp[ S->j     ];
+       word            * LARpp_j_1     = S->LARpp[ S->j ^=1 ];
+
+       word            LARp[8];
+
+#undef FILTER
+#if    defined(FAST) && defined(USE_FLOAT_MUL)
+
+#      define  FILTER  (* (S->fast                     \
+                          ? Fast_Short_term_synthesis_filtering        \
+                          : Short_term_synthesis_filtering     ))
+#else
+#      define  FILTER  Short_term_synthesis_filtering
+#endif
+
+       Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
+
+       Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
+       LARp_to_rp( LARp );
+       FILTER( S, LARp, 13, wt, s );
+
+       Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+       LARp_to_rp( LARp );
+       FILTER( S, LARp, 14, wt + 13, s + 13 );
+
+       Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+       LARp_to_rp( LARp );
+       FILTER( S, LARp, 13, wt + 27, s + 27 );
+
+       Coefficients_40_159( LARpp_j, LARp );
+       LARp_to_rp( LARp );
+       FILTER(S, LARp, 120, wt + 40, s + 40);
+}
index e54c9bfe5b6f50a44d4cb89ff42a62277316db42..3720786c2eed8da938aa3dd1f888344518ec2022 100644 (file)
@@ -1,64 +1,64 @@
-/*\r
- * table.c\r
- *\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for\r
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-\r
-/*  Most of these tables are inlined at their point of use.\r
- */\r
-\r
-/*  4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP\r
- *      CODER AND DECODER\r
- *\r
- *     (Most of them inlined, so watch out.)\r
- */\r
-\r
-#define        GSM_TABLE_C\r
-#include "private.h"\r
-#include       "gsm.h"\r
-\r
-/*  Table 4.1  Quantization of the Log.-Area Ratios\r
- */\r
-/* i                1      2      3        4      5      6        7       8 */\r
-word gsm_A[8]   = {20480, 20480, 20480,  20480,  13964,  15360,   8534,  9036};\r
-word gsm_B[8]   = {    0,     0,  2048,  -2560,     94,  -1792,   -341, -1144};\r
-word gsm_MIC[8] = { -32,   -32,   -16,    -16,     -8,     -8,     -4,    -4 };\r
-word gsm_MAC[8] = {  31,    31,    15,     15,      7,      7,      3,     3 };\r
-\r
-\r
-/*  Table 4.2  Tabulation  of 1/A[1..8]\r
- */\r
-word gsm_INVA[8]={ 13107, 13107,  13107, 13107,  19223, 17476,  31454, 29708 };\r
-\r
-\r
-/*   Table 4.3a  Decision level of the LTP gain quantizer\r
- */\r
-/*  bc               0         1         2          3                  */\r
-word gsm_DLB[4] = {  6554,    16384,   26214,     32767        };\r
-\r
-\r
-/*   Table 4.3b   Quantization levels of the LTP gain quantizer\r
- */\r
-/* bc                0          1        2          3                  */\r
-word gsm_QLB[4] = {  3277,    11469,   21299,     32767        };\r
-\r
-\r
-/*   Table 4.4  Coefficients of the weighting filter\r
- */\r
-/* i               0      1   2    3   4      5      6     7   8   9    10  */\r
-word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };\r
-\r
-\r
-/*   Table 4.5          Normalized inverse mantissa used to compute xM/xmax \r
- */\r
-/* i                   0        1    2      3      4      5     6      7   */\r
-word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };\r
-\r
-\r
-/*   Table 4.6  Normalized direct mantissa used to compute xM/xmax\r
- */\r
-/* i                  0      1       2      3      4      5      6      7   */\r
-word gsm_FAC[8]        = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };\r
+/*
+ * table.c
+ *
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+/*  Most of these tables are inlined at their point of use.
+ */
+
+/*  4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP
+ *      CODER AND DECODER
+ *
+ *     (Most of them inlined, so watch out.)
+ */
+
+#define        GSM_TABLE_C
+#include "private.h"
+#include       "gsm.h"
+
+/*  Table 4.1  Quantization of the Log.-Area Ratios
+ */
+/* i                1      2      3        4      5      6        7       8 */
+word gsm_A[8]   = {20480, 20480, 20480,  20480,  13964,  15360,   8534,  9036};
+word gsm_B[8]   = {    0,     0,  2048,  -2560,     94,  -1792,   -341, -1144};
+word gsm_MIC[8] = { -32,   -32,   -16,    -16,     -8,     -8,     -4,    -4 };
+word gsm_MAC[8] = {  31,    31,    15,     15,      7,      7,      3,     3 };
+
+
+/*  Table 4.2  Tabulation  of 1/A[1..8]
+ */
+word gsm_INVA[8]={ 13107, 13107,  13107, 13107,  19223, 17476,  31454, 29708 };
+
+
+/*   Table 4.3a  Decision level of the LTP gain quantizer
+ */
+/*  bc               0         1         2          3                  */
+word gsm_DLB[4] = {  6554,    16384,   26214,     32767        };
+
+
+/*   Table 4.3b   Quantization levels of the LTP gain quantizer
+ */
+/* bc                0          1        2          3                  */
+word gsm_QLB[4] = {  3277,    11469,   21299,     32767        };
+
+
+/*   Table 4.4  Coefficients of the weighting filter
+ */
+/* i               0      1   2    3   4      5      6     7   8   9    10  */
+word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
+
+
+/*   Table 4.5          Normalized inverse mantissa used to compute xM/xmax 
+ */
+/* i                   0        1    2      3      4      5     6      7   */
+word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
+
+
+/*   Table 4.6  Normalized direct mantissa used to compute xM/xmax
+ */
+/* i                  0      1       2      3      4      5      6      7   */
+word gsm_FAC[8]        = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };