summaryrefslogtreecommitdiff
path: root/orkbasecxx/filters
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-11-10 02:50:26 +0000
committerHenri Herscher <henri@oreka.org>2006-11-10 02:50:26 +0000
commit4fc16507815bc36b055aa4cc8b4160e318ad1dc3 (patch)
tree8069cf251a5b64894796edd1af66e6374a561821 /orkbasecxx/filters
parent3801002d76f57d2d4828a0bea289af7099af8455 (diff)
GSM code from Berlin Technische Universitaet is now included directly in the orkbasecxx dll build instead of leveraging libsndfile because of linking problems under Linux.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@350 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/filters')
-rw-r--r--orkbasecxx/filters/gsm/gsm610/COPYRIGHT16
-rw-r--r--orkbasecxx/filters/gsm/gsm610/add.c248
-rw-r--r--orkbasecxx/filters/gsm/gsm610/code.c97
-rw-r--r--orkbasecxx/filters/gsm/gsm610/config.h33
-rw-r--r--orkbasecxx/filters/gsm/gsm610/cscope.out15350
-rw-r--r--orkbasecxx/filters/gsm/gsm610/decode.c67
-rw-r--r--orkbasecxx/filters/gsm/gsm610/gsm.h58
-rw-r--r--orkbasecxx/filters/gsm/gsm610/gsm610_priv.h304
-rw-r--r--orkbasecxx/filters/gsm/gsm610/gsm_create.c44
-rw-r--r--orkbasecxx/filters/gsm/gsm610/gsm_decode.c366
-rw-r--r--orkbasecxx/filters/gsm/gsm610/gsm_destroy.c31
-rw-r--r--orkbasecxx/filters/gsm/gsm610/gsm_encode.c456
-rw-r--r--orkbasecxx/filters/gsm/gsm610/gsm_option.c74
-rw-r--r--orkbasecxx/filters/gsm/gsm610/long_term.c951
-rw-r--r--orkbasecxx/filters/gsm/gsm610/lpc.c341
-rw-r--r--orkbasecxx/filters/gsm/gsm610/preprocess.c115
-rw-r--r--orkbasecxx/filters/gsm/gsm610/rpe.c490
-rw-r--r--orkbasecxx/filters/gsm/gsm610/short_term.c427
-rw-r--r--orkbasecxx/filters/gsm/gsm610/table.c69
19 files changed, 19537 insertions, 0 deletions
diff --git a/orkbasecxx/filters/gsm/gsm610/COPYRIGHT b/orkbasecxx/filters/gsm/gsm610/COPYRIGHT
new file mode 100644
index 0000000..eba0e52
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener
+Carsten Bormann
diff --git a/orkbasecxx/filters/gsm/gsm610/add.c b/orkbasecxx/filters/gsm/gsm610/add.c
new file mode 100644
index 0000000..607b5a2
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/add.c
@@ -0,0 +1,248 @@
+/*
+ * 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 "gsm610_priv.h"
+#include "gsm.h"
+
+#define saturate(x) \
+ ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
+
+word gsm_add ( word a, word b)
+{
+ longword sum = (longword)a + (longword)b;
+ return saturate(sum);
+}
+
+word gsm_sub ( word a, word b)
+{
+ longword diff = (longword)a - (longword)b;
+ return saturate(diff);
+}
+
+word gsm_mult ( word a, word b)
+{
+ if (a == MIN_WORD && b == MIN_WORD)
+ return MAX_WORD;
+
+ return SASR_L( (longword)a * (longword)b, 15 );
+}
+
+word gsm_mult_r ( 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 prod & 0xFFFF;
+ }
+}
+
+word gsm_abs (word a)
+{
+ return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
+}
+
+longword gsm_L_mult (word a, word b)
+{
+ assert( a != MIN_WORD || b != MIN_WORD );
+ return ((longword)a * (longword)b) << 1;
+}
+
+longword gsm_L_add ( 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 ( 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 (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 (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_asr (word a, int n)
+{
+ if (n >= 16) return -(a < 0);
+ if (n <= -16) return 0;
+ if (n < 0) return a << -n;
+
+ return SASR_W (a, (word) n);
+}
+
+word gsm_asl (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 (longword a, int n)
+{
+ if (n >= 32) return -(a < 0);
+ if (n <= -32) return 0;
+ if (n < 0) return a << -n;
+
+ return SASR_L (a, (word) n);
+}
+
+/*
+** word gsm_asr (word a, int n)
+** {
+** if (n >= 16) return -(a < 0);
+** if (n <= -16) return 0;
+** if (n < 0) return a << -n;
+**
+** # ifdef SASR_W
+** 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 (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;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: a7398579-e2e1-4733-aa2d-4c6efc0c58ff
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/code.c b/orkbasecxx/filters/gsm/gsm610/code.c
new file mode 100644
index 0000000..3dc7732
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/code.c
@@ -0,0 +1,97 @@
+/*
+ * 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 <stdlib.h>
+#include <string.h>
+
+#include "config.h"
+
+#include "gsm610_priv.h"
+#include "gsm.h"
+
+/*
+ * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER
+ */
+
+void Gsm_Coder (
+
+ struct gsm_state * State,
+
+ 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 = State->dp0 + 120; /* [ -120...-1 ] */
+ word * dpp = dp; /* [ 0...39 ] */
+
+ word so[160];
+
+ Gsm_Preprocess (State, s, so);
+ Gsm_LPC_Analysis (State, so, LARc);
+ Gsm_Short_Term_Analysis_Filter (State, LARc, so);
+
+ for (k = 0; k <= 3; k++, xMc += 13) {
+
+ Gsm_Long_Term_Predictor ( State,
+ so+k*40, /* d [0..39] IN */
+ dp, /* dp [-120..-1] IN */
+ State->e + 5, /* e [0..39] OUT */
+ dpp, /* dpp [0..39] OUT */
+ Nc++,
+ bc++);
+
+ Gsm_RPE_Encoding ( /*-S,-*/
+ State->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;
+ for (i = 0; i <= 39; i++)
+ dp[ i ] = GSM_ADD( State->e[5 + i], dpp[i] );
+ }
+ dp += 40;
+ dpp += 40;
+
+ }
+ (void)memcpy( (char *)State->dp0, (char *)(State->dp0 + 160),
+ 120 * sizeof(*State->dp0) );
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: ae8ef1b2-5a1e-4263-94cd-42b15dca81a3
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/config.h b/orkbasecxx/filters/gsm/gsm610/config.h
new file mode 100644
index 0000000..8c2c059
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/config.h
@@ -0,0 +1,33 @@
+/*
+ * 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
+
+#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */
+#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */
+
+#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 */
+
+#define HAS_STRING_H 1 /* /usr/include/string.h */
+
+#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */
+#define HAS_UTIME 1 /* POSIX utime(path, times) */
+#define HAS_UTIME_H 1 /* UTIME header file */
+
+#endif /* CONFIG_H */
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 5338dfef-8e59-4f51-af47-627c9ea85353
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/cscope.out b/orkbasecxx/filters/gsm/gsm610/cscope.out
new file mode 100644
index 0000000..c6b9268
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/cscope.out
@@ -0,0 +1,15350 @@
+cscope 15 c:/sfTrunk/orkbasecxx/filters/gsm/gsm610 0000076221
+ @add.c
+
+11 
+ ~<¡dio.h
+>
+
+12 
+ ~<as£¹.h
+>
+
+14 
+ ~"gsm610_´iv.h
+"
+
+15 
+ ~"gsm.h
+"
+
+17 
+ #§tu¿‹
+(
+x
+) \
+
+18 ((
+x
+è<
+MIN_WORD
+ ? MIN_WORD : (xè>
+MAX_WORD
+ ? MAX_WORD: (x))
+
+ )
+
+20
+wÜd
+
+ $gsm_add
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+22
+lÚgwÜd
+
+sum
+ = (lÚgwÜd)
+a
+ + (lÚgwÜd)
+b
+;
+
+23 
+ `§tu¿‹
+(
+sum
+);
+
+24
+ }
+}
+
+26
+wÜd
+
+ $gsm_sub
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+28
+lÚgwÜd
+
+diff
+ = (lÚgwÜd)
+a
+ - (lÚgwÜd)
+b
+;
+
+29 
+ `§tu¿‹
+(
+diff
+);
+
+30
+ }
+}
+
+32
+wÜd
+
+ $gsm_muÉ
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+34 ià(
+a
+ =ð
+MIN_WORD
+ &&
+b
+ == MIN_WORD)
+
+35 
+MAX_WORD
+;
+
+37 
+ `SASR_L
+Ð(
+lÚgwÜd
+)
+a
+ * (lÚgwÜd)
+b
+, 15 );
+
+38
+ }
+}
+
+40
+wÜd
+
+ $gsm_muÉ_r
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+42 ià(
+b
+ =ð
+MIN_WORD
+ &&
+a
+ =ðMIN_WORDè
+MAX_WORD
+;
+
+44
+lÚgwÜd
+
+´od
+ = (lÚgwÜd)
+a
+ * (lÚgwÜd)
+b
+ + 16384;
+
+45
+´od
+ >>= 15;
+
+46 
+´od
+ & 0xFFFF;
+
+48
+ }
+}
+
+50
+wÜd
+
+ $gsm_abs
+ (
+wÜd
+
+a
+)
+
+52 
+a
+ < 0 ? (¨=ð
+MIN_WORD
+ ?
+MAX_WORD
+ : -a) :‡;
+
+53
+ }
+}
+
+55
+lÚgwÜd
+
+ $gsm_L_muÉ
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+57
+ `as£¹
+a
+ !ð
+MIN_WORD
+ ||
+b
+ != MIN_WORD );
+
+58  ((
+lÚgwÜd
+)
+a
+ * (lÚgwÜd)
+b
+) << 1;
+
+59
+ }
+}
+
+61
+lÚgwÜd
+
+ $gsm_L_add
+ (
+lÚgwÜd
+
+a
+,†ÚgwÜd
+b
+)
+
+63 ià(
+a
+ < 0) {
+
+64 ià(
+b
+ >ð0è
+a
+ + b;
+
+66
+ulÚgwÜd
+
+A
+ = (ulÚgwÜd)-(
+a
+ + 1è+ (ulÚgwÜd)-(
+b
+ + 1);
+
+67 
+A
+ >ð
+MAX_LONGWORD
+ ?
+MIN_LONGWORD
+ :-(
+lÚgwÜd
+)A-2;
+
+70 ià(
+b
+ <ð0è
+a
+ + b;
+
+72
+ulÚgwÜd
+
+A
+ = (ulÚgwÜd)
+a
+ + (ulÚgwÜd)
+b
+;
+
+73 
+A
+ >
+MAX_LONGWORD
+ ? MAX_LONGWORD : A;
+
+75
+ }
+}
+
+77
+lÚgwÜd
+
+ $gsm_L_sub
+ (
+lÚgwÜd
+
+a
+,†ÚgwÜd
+b
+)
+
+79 ià(
+a
+ >= 0) {
+
+80 ià(
+b
+ >ð0è
+a
+ - b;
+
+84
+ulÚgwÜd
+
+A
+ = (ulÚgwÜd)
+a
+ + -(
+b
+ + 1);
+
+85 
+A
+ >ð
+MAX_LONGWORD
+ ? MAX_LONGWORD : (A + 1);
+
+88 ià(
+b
+ <ð0è
+a
+ - b;
+
+92
+ulÚgwÜd
+
+A
+ = (ulÚgwÜd)-(
+a
+ + 1è+
+b
+;
+
+93 
+A
+ >ð
+MAX_LONGWORD
+ ?
+MIN_LONGWORD
+ : -(
+lÚgwÜd
+)A - 1;
+
+95
+ }
+}
+
+97 cÚ¡
+ gb™off
+[ 256 ] = {
+
+116
+wÜd
+
+ $gsm_nÜm
+ (
+lÚgwÜd
+
+a
+ )
+
+136
+ `as£¹
+(
+a
+ != 0);
+
+138 ià(
+a
+ < 0) {
+
+139 ià(
+a
+ <= -1073741824)  0;
+
+140
+a
+ = ~a;
+
+143 
+a
+ & 0xffff0000
+
+144 ? (
+a
+ & 0xff000000
+
+145 ? -1 +
+b™off
+[ 0xFF & (
+a
+ >> 24) ]
+
+146 : 7 +
+b™off
+[ 0xFF & (
+a
+ >> 16) ] )
+
+147 : (
+a
+ & 0xff00
+
+148 ? 15 +
+b™off
+[ 0xFF & (
+a
+ >> 8) ]
+
+149 : 23 +
+b™off
+[ 0xFF &
+a
+ ] );
+
+150
+ }
+}
+
+152
+lÚgwÜd
+
+ $gsm_L_a¦
+ (
+lÚgwÜd
+
+a
+, 
+n
+)
+
+154 ià(
+n
+ >= 32)  0;
+
+155 ià(
+n
+ <ð-32è -(
+a
+ < 0);
+
+156 ià(
+n
+ < 0è
+ `gsm_L_a¤
+(
+a
+, -n);
+
+157 
+a
+ <<
+n
+;
+
+158
+ }
+}
+
+160
+wÜd
+
+ $gsm_a¤
+ (
+wÜd
+
+a
+, 
+n
+)
+
+162 ià(
+n
+ >ð16è -(
+a
+ < 0);
+
+163 ià(
+n
+ <= -16)  0;
+
+164 ià(
+n
+ < 0è
+a
+ << -n;
+
+166 
+ `SASR_W
+ (
+a
+, (
+wÜd
+n
+);
+
+167
+ }
+}
+
+169
+wÜd
+
+ $gsm_a¦
+ (
+wÜd
+
+a
+, 
+n
+)
+
+171 ià(
+n
+ >= 16)  0;
+
+172 ià(
+n
+ <ð-16è -(
+a
+ < 0);
+
+173 ià(
+n
+ < 0è
+ `gsm_a¤
+(
+a
+, -n);
+
+174 
+a
+ <<
+n
+;
+
+175
+ }
+}
+
+177
+lÚgwÜd
+
+ $gsm_L_a¤
+ (
+lÚgwÜd
+
+a
+, 
+n
+)
+
+179 ià(
+n
+ >ð32è -(
+a
+ < 0);
+
+180 ià(
+n
+ <= -32)  0;
+
+181 ià(
+n
+ < 0è
+a
+ << -n;
+
+183 
+ `SASR_L
+ (
+a
+, (
+wÜd
+n
+);
+
+184
+ }
+}
+
+211
+wÜd
+
+ $gsm_div
+ (
+wÜd
+
+num
+, wÜd
+d’um
+)
+
+213
+lÚgwÜd
+
+L_num
+ =
+num
+;
+
+214
+lÚgwÜd
+
+L_d’um
+ =
+d’um
+;
+
+215
+wÜd
+
+div
+ = 0;
+
+216 
+k
+ = 15;
+
+225
+ `as£¹
+(
+num
+ >ð0 &&
+d’um
+ >=‚um);
+
+226 ià(
+num
+ == 0)
+
+229 
+k
+--) {
+
+230
+div
+ <<= 1;
+
+231
+L_num
+ <<= 1;
+
+233 ià(
+L_num
+ >ð
+L_d’um
+) {
+
+234
+L_num
+ -ð
+L_d’um
+;
+
+235
+div
+++;
+
+239 
+div
+;
+
+240
+ }
+}
+
+ @code.c
+
+8 
+ ~<¡dlib.h
+>
+
+9 
+ ~<¡ršg.h
+>
+
+11 
+ ~"cÚfig.h
+"
+
+13 
+ ~"gsm610_´iv.h
+"
+
+14 
+ ~"gsm.h
+"
+
+20 
+ $Gsm_Cod”
+ (
+
+22 
+gsm_¡©e
+ *
+S‹
+,
+
+24
+wÜd
+ *
+s
+,
+
+36
+wÜd
+ *
+LARc
+,
+
+44
+wÜd
+ *
+Nc
+,
+
+45
+wÜd
+ *
+bc
+,
+
+46
+wÜd
+ *
+Mc
+,
+
+47
+wÜd
+ *
+xmaxc
+,
+
+48
+wÜd
+ *
+xMc
+
+
+51 
+k
+;
+
+52
+wÜd
+ *
+dp
+ =
+S‹
+->
+dp0
+ + 120;
+
+53
+wÜd
+ *
+dµ
+ =
+dp
+;
+
+55
+wÜd
+
+so
+[160];
+
+57
+ `Gsm_P»´oûss
+ (
+S‹
+,
+s
+,
+so
+);
+
+58
+ `Gsm_LPC_AÇlysis
+ (
+S‹
+,
+so
+,
+LARc
+);
+
+59
+ `Gsm_ShÜt_T”m_AÇlysis_Fž‹r
+ (
+S‹
+,
+LARc
+,
+so
+);
+
+61 
+k
+ = 0; k <ð3; k++,
+xMc
+ += 13) {
+
+63
+ `Gsm_LÚg_T”m_P»diùÜ
+ (
+S‹
+,
+
+64
+so
++
+k
+*40,
+
+65
+dp
+,
+
+66
+S‹
+->
+e
+ + 5,
+
+67
+dµ
+,
+
+68
+Nc
+++,
+
+69
+bc
+++);
+
+71
+ `Gsm_RPE_Encodšg
+ (
+
+72
+S‹
+->
+e
+ + 5,
+
+73
+xmaxc
+++,
+Mc
+++,
+xMc
+ );
+
+79 { 
+i
+;
+
+80 
+i
+ = 0; i <= 39; i++)
+
+81
+dp
+[
+i
+ ] =
+ `GSM_ADD
+S‹
+->
+e
+[5 + i],
+dµ
+[i] );
+
+83
+dp
+ += 40;
+
+84
+dµ
+ += 40;
+
+87 ()
+ `memýy
+Ð(*)
+S‹
+->
+dp0
+, (*)(State->dp0 + 160),
+
+88 120 * (*
+S‹
+->
+dp0
+) );
+
+89
+ }
+}
+
+ @config.h
+
+7 #iâdef
+CONFIG_H
+
+
+8 
+ #CONFIG_H
+
+
+ )
+
+10 
+ #HAS_STDLIB_H
+ 1
+
+ )
+
+11 
+ #HAS_FCNTL_H
+ 1
+
+ )
+
+13 
+ #HAS_FSTAT
+ 1
+
+ )
+
+14 
+ #HAS_FCHMOD
+ 1
+
+ )
+
+15 
+ #HAS_CHMOD
+ 1
+
+ )
+
+16 
+ #HAS_FCHOWN
+ 1
+
+ )
+
+17 
+ #HAS_CHOWN
+ 1
+
+ )
+
+19 
+ #HAS_STRING_H
+ 1
+
+ )
+
+21 
+ #HAS_UNISTD_H
+ 1
+
+ )
+
+22 
+ #HAS_UTIME
+ 1
+
+ )
+
+23 
+ #HAS_UTIME_H
+ 1
+
+ )
+
+ @decode.c
+
+7 
+ ~<¡dio.h
+>
+
+9 
+ ~"gsm610_´iv.h
+"
+
+10 
+ ~"gsm.h
+"
+
+16 
+ $Po¡´oûssšg
+ (
+
+17 
+gsm_¡©e
+ *
+S
+,
+
+18 
+wÜd
+ *
+s
+)
+
+20 
+k
+;
+
+21 
+wÜd
+
+m¤
+ =
+S
+->msr;
+
+22 
+wÜd
+
+tmp
+;
+
+24 
+k
+ = 160; k--;
+s
+++) {
+
+25
+tmp
+ =
+ `GSM_MULT_R
+m¤
+, 28180 );
+
+26
+m¤
+ =
+ `GSM_ADD
+(*
+s
+,
+tmp
+);
+
+27 *
+s
+ =
+ `GSM_ADD
+(
+m¤
+, msr) & 0xFFF8;
+
+29
+S
+->
+m¤
+ = msr;
+
+30
+ }
+}
+
+32 
+ $Gsm_Decod”
+ (
+
+33 
+gsm_¡©e
+ *
+S
+,
+
+35
+wÜd
+ *
+LARü
+,
+
+37
+wÜd
+ *
+Nü
+,
+
+38
+wÜd
+ *
+bü
+,
+
+39
+wÜd
+ *
+Mü
+,
+
+40
+wÜd
+ *
+xmaxü
+,
+
+41
+wÜd
+ *
+xMü
+,
+
+43
+wÜd
+ *
+s
+)
+
+45 
+j
+,
+k
+;
+
+46
+wÜd
+
+”p
+[40],
+wt
+[160];
+
+47
+wÜd
+ *
+d½
+ =
+S
+->
+dp0
+ + 120;
+
+49 
+j
+=0; j <ð3; j++,
+xmaxü
+++,
+bü
+++,
+Nü
+++,
+Mü
+++,
+xMü
+ += 13) {
+
+51
+ `Gsm_RPE_Decodšg
+Ð *
+xmaxü
+, *
+Mü
+,
+xMü
+,
+”p
+ );
+
+52
+ `Gsm_LÚg_T”m_SyÁhesis_Fž‹ršg
+S
+, *
+Nü
+, *
+bü
+,
+”p
+,
+d½
+ );
+
+54 
+k
+ = 0; k <ð39; k++è
+wt
+[
+j
+ * 40 + k ] =
+d½
+[ k ];
+
+57
+ `Gsm_ShÜt_T”m_SyÁhesis_Fž‹r
+S
+,
+LARü
+,
+wt
+,
+s
+ );
+
+58
+ `Po¡´oûssšg
+(
+S
+,
+s
+);
+
+59
+ }
+}
+
+ @gsm.h
+
+7 #iâdef
+GSM_H
+
+
+8 
+ #GSM_H
+
+
+ )
+
+10 
+ ~<¡dio.h
+>
+
+16 
+gsm_¡©e
+ *
+ tgsm
+;
+
+17 
+ tgsm_sigÇl
+;
+
+18 
+ tgsm_by‹
+;
+
+19 
+gsm_by‹
+
+ tgsm_äame
+[33];
+
+21 
+ #GSM_MAGIC
+ 0xD
+
+ )
+
+23 
+ #GSM_PATCHLEVEL
+ 10
+
+ )
+
+24 
+ #GSM_MINOR
+ 0
+
+ )
+
+25 
+ #GSM_MAJOR
+ 1
+
+ )
+
+27 
+ #GSM_OPT_VERBOSE
+ 1
+
+ )
+
+28 
+ #GSM_OPT_FAST
+ 2
+
+ )
+
+29 
+ #GSM_OPT_LTP_CUT
+ 3
+
+ )
+
+30 
+ #GSM_OPT_WAV49
+ 4
+
+ )
+
+31 
+ #GSM_OPT_FRAME_INDEX
+ 5
+
+ )
+
+32 
+ #GSM_OPT_FRAME_CHAIN
+ 6
+
+ )
+
+34
+gsm
+
+gsm_ü—‹
+ ();
+
+37 
+gsm_š™
+ (
+gsm
+);
+
+39 
+gsm_de¡roy
+ (
+gsm
+);
+
+41 
+gsm_´št
+ (
+FILE
+ *,
+gsm
+,
+gsm_by‹
+ *);
+
+42 
+gsm_ÝtiÚ
+ (
+gsm
+, , *);
+
+44 
+gsm_’code
+ (
+gsm
+,
+gsm_sigÇl
+ *,
+gsm_by‹
+ *);
+
+45 
+gsm_decode
+ (
+gsm
+,
+gsm_by‹
+ *,
+gsm_sigÇl
+ *);
+
+47 
+gsm_ex¶ode
+ (
+gsm
+,
+gsm_by‹
+ *,
+gsm_sigÇl
+ *);
+
+48 
+gsm_im¶ode
+ (
+gsm
+,
+gsm_sigÇl
+ *,
+gsm_by‹
+ *);
+
+ @gsm610_priv.h
+
+7 #iâdef
+PRIVATE_H
+
+
+8 
+ #PRIVATE_H
+
+
+ )
+
+11 
+ #USE_FLOAT_MUL
+
+
+ )
+
+12 
+ #FAST
+
+
+ )
+
+13 
+ #WAV49
+
+
+ )
+
+18 
+ twÜd
+;
+
+19 
+ tlÚgwÜd
+;
+
+21 
+ tuwÜd
+;
+
+22 
+ tulÚgwÜd
+;
+
+24 
+ sgsm_¡©e
+
+
+25 {
+wÜd
+
+ mdp0
+[ 280 ] ;
+
+27
+wÜd
+
+ mz1
+;
+
+28
+lÚgwÜd
+
+ mL_z2
+;
+
+29 
+ mmp
+;
+
+31
+wÜd
+
+ mu
+[8] ;
+
+32
+wÜd
+
+ mLARµ
+[2][8] ;
+
+33
+wÜd
+
+ mj
+;
+
+35
+wÜd
+
+ mÉp_cut
+;
+
+36
+wÜd
+
+ mÄp
+;
+
+37
+wÜd
+
+ mv
+[9] ;
+
+38
+wÜd
+
+ mm¤
+;
+
+40 
+ mv”bo£
+;
+
+41 
+ mç¡
+;
+
+43 
+ mwav_fmt
+;
+
+44 
+ mäame_šdex
+;
+
+45 
+ mäame_chaš
+;
+
+48
+wÜd
+
+ me
+[50] ;
+
+51 
+gsm_¡©e
+
+ tGSM_STATE
+ ;
+
+53 
+ #MIN_WORD
+ (-32767 - 1)
+
+ )
+
+54 
+ #MAX_WORD
+ 32767
+
+ )
+
+56 
+ #MIN_LONGWORD
+ (-2147483647 - 1)
+
+ )
+
+57 
+ #MAX_LONGWORD
+ 2147483647
+
+ )
+
+60 
+šlše
+
+wÜd
+
+
+61
+ $SASR_W
+ (
+wÜd
+
+x
+, wÜd
+by
+)
+
+62 {  (
+x
+ >>
+by
+) ;
+
+63
+ }
+}
+
+65 
+šlše
+
+lÚgwÜd
+
+
+66
+ $SASR_L
+ (
+lÚgwÜd
+
+x
+,
+wÜd
+
+by
+)
+
+67 {  (
+x
+ >>
+by
+) ;
+
+68
+ }
+}
+
+73
+wÜd
+
+gsm_muÉ
+ (wÜd
+a
+, wÜd
+b
+) ;
+
+74
+lÚgwÜd
+
+gsm_L_muÉ
+ (
+wÜd
+
+a
+, wÜd
+b
+) ;
+
+75
+wÜd
+
+gsm_muÉ_r
+ (wÜd
+a
+, wÜd
+b
+) ;
+
+77
+wÜd
+
+gsm_div
+ (wÜd
+num
+, wÜd
+d’um
+) ;
+
+79
+wÜd
+
+gsm_add
+ (wÜd
+a
+, wÜd
+b
+ ) ;
+
+80
+lÚgwÜd
+
+gsm_L_add
+ (lÚgwÜd
+a
+,†ÚgwÜd
+b
+ ) ;
+
+82
+wÜd
+
+gsm_sub
+ (wÜd
+a
+, wÜd
+b
+) ;
+
+83
+lÚgwÜd
+
+gsm_L_sub
+ (lÚgwÜd
+a
+,†ÚgwÜd
+b
+) ;
+
+85
+wÜd
+
+gsm_abs
+ (wÜd
+a
+) ;
+
+87
+wÜd
+
+gsm_nÜm
+ (
+lÚgwÜd
+
+a
+ ) ;
+
+89
+lÚgwÜd
+
+gsm_L_a¦
+ (lÚgwÜd
+a
+, 
+n
+) ;
+
+90
+wÜd
+
+gsm_a¦
+ (wÜd
+a
+, 
+n
+) ;
+
+92
+lÚgwÜd
+
+gsm_L_a¤
+ (lÚgwÜd
+a
+, 
+n
+) ;
+
+93
+wÜd
+
+gsm_a¤
+ (wÜd
+a
+, 
+n
+) ;
+
+99 
+šlše
+
+lÚgwÜd
+
+
+100
+ $GSM_MULT_R
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+101 {  (((
+lÚgwÜd
+è(
+a
+)è* (ÖÚgwÜdè(
+b
+)) + 16384) >> 15 ;
+
+102
+ }
+}
+
+104 
+šlše
+
+lÚgwÜd
+
+
+105
+ $GSM_MULT
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+106 {  (((
+lÚgwÜd
+è(
+a
+)è* (ÖÚgwÜdè(
+b
+))) >> 15 ;
+
+107
+ }
+}
+
+109 
+šlše
+
+lÚgwÜd
+
+
+110
+ $GSM_L_MULT
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+111 {  ((
+lÚgwÜd
+è(
+a
+)è* (ÖÚgwÜdè(
+b
+)) << 1 ;
+
+112
+ }
+}
+
+114 
+šlše
+
+lÚgwÜd
+
+
+115
+ $GSM_L_ADD
+ (
+lÚgwÜd
+
+a
+,†ÚgwÜd
+b
+)
+
+116 {
+ulÚgwÜd
+
+utmp
+ ;
+
+118 ià(
+a
+ < 0 &&
+b
+ < 0)
+
+119 {
+utmp
+ = (
+ulÚgwÜd
+)-((
+a
+è+ 1è+ (ulÚgwÜd)-((
+b
+) + 1) ;
+
+120  (
+utmp
+ >ð(
+ulÚgwÜd
+MAX_LONGWORD
+è?
+MIN_LONGWORD
+ : -(
+lÚgwÜd
+)utmp-2 ;
+
+123 ià(
+a
+ > 0 &&
+b
+ > 0)
+
+124 {
+utmp
+ = (
+ulÚgwÜd
+a
+ + (ulÚgwÜdè
+b
+ ;
+
+125  (
+utmp
+ >ð(
+ulÚgwÜd
+MAX_LONGWORD
+) ? MAX_LONGWORD : utmp ;
+
+128 
+a
+ +
+b
+ ;
+
+129
+ }
+}
+
+131 
+šlše
+
+lÚgwÜd
+
+
+132
+ $GSM_ADD
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+133 {
+lÚgwÜd
+
+Émp
+ ;
+
+135
+Émp
+ = ((
+lÚgwÜd
+a
+è+ (ÖÚgwÜdè
+b
+) ;
+
+137 ià(
+Émp
+ >ð
+MAX_WORD
+)
+
+138 
+MAX_WORD
+ ;
+
+139 ià(
+Émp
+ <ð
+MIN_WORD
+)
+
+140 
+MIN_WORD
+ ;
+
+142 
+Émp
+ ;
+
+143
+ }
+}
+
+145 
+šlše
+
+lÚgwÜd
+
+
+146
+ $GSM_SUB
+ (
+wÜd
+
+a
+, wÜd
+b
+)
+
+147 {
+lÚgwÜd
+
+Émp
+ ;
+
+149
+Émp
+ = ((
+lÚgwÜd
+a
+è- (ÖÚgwÜdè
+b
+) ;
+
+151 ià(
+Émp
+ >ð
+MAX_WORD
+)
+
+152
+Émp
+ =
+MAX_WORD
+ ;
+
+153 ià(
+Émp
+ <ð
+MIN_WORD
+)
+
+154
+Émp
+ =
+MIN_WORD
+ ;
+
+156 
+Émp
+ ;
+
+157
+ }
+}
+
+159 
+šlše
+
+wÜd
+
+
+160
+ $GSM_ABS
+ (
+wÜd
+
+a
+)
+
+162 ià(
+a
+ > 0)
+
+163 
+a
+ ;
+
+164 ià(
+a
+ =ð
+MIN_WORD
+)
+
+165 
+MAX_WORD
+ ;
+
+166  -
+a
+ ;
+
+167
+ }
+}
+
+173 
+Gsm_Cod”
+ (
+
+174 
+gsm_¡©e
+ *
+S
+,
+
+175
+wÜd
+ *
+s
+,
+
+176
+wÜd
+ *
+LARc
+,
+
+177
+wÜd
+ *
+Nc
+,
+
+178
+wÜd
+ *
+bc
+,
+
+179
+wÜd
+ *
+Mc
+,
+
+180
+wÜd
+ *
+xmaxc
+,
+
+181
+wÜd
+ *
+xMc
+) ;
+
+183 
+Gsm_LÚg_T”m_P»diùÜ
+ (
+
+184 
+gsm_¡©e
+ *
+S
+,
+
+185
+wÜd
+ *
+d
+,
+
+186
+wÜd
+ *
+dp
+,
+
+187
+wÜd
+ *
+e
+,
+
+188
+wÜd
+ *
+dµ
+,
+
+189
+wÜd
+ *
+Nc
+,
+
+190
+wÜd
+ *
+bc
+) ;
+
+192 
+Gsm_LPC_AÇlysis
+ (
+
+193 
+gsm_¡©e
+ *
+S
+,
+
+194
+wÜd
+ *
+s
+,
+
+195
+wÜd
+ *
+LARc
+) ;
+
+197 
+Gsm_P»´oûss
+ (
+
+198 
+gsm_¡©e
+ *
+S
+,
+
+199
+wÜd
+ *
+s
+, wÜd *
+so
+) ;
+
+201 
+Gsm_Encodšg
+ (
+
+202 
+gsm_¡©e
+ *
+S
+,
+
+203
+wÜd
+ *
+e
+,
+
+204
+wÜd
+ *
+•
+,
+
+205
+wÜd
+ *
+xmaxc
+,
+
+206
+wÜd
+ *
+Mc
+,
+
+207
+wÜd
+ *
+xMc
+) ;
+
+209 
+Gsm_ShÜt_T”m_AÇlysis_Fž‹r
+ (
+
+210 
+gsm_¡©e
+ *
+S
+,
+
+211
+wÜd
+ *
+LARc
+,
+
+212
+wÜd
+ *
+d
+) ;
+
+214 
+Gsm_Decod”
+ (
+
+215 
+gsm_¡©e
+ *
+S
+,
+
+216
+wÜd
+ *
+LARü
+,
+
+217
+wÜd
+ *
+Nü
+,
+
+218
+wÜd
+ *
+bü
+,
+
+219
+wÜd
+ *
+Mü
+,
+
+220
+wÜd
+ *
+xmaxü
+,
+
+221
+wÜd
+ *
+xMü
+,
+
+222
+wÜd
+ *
+s
+) ;
+
+224 
+Gsm_Decodšg
+ (
+
+225 
+gsm_¡©e
+ *
+S
+,
+
+226
+wÜd
+
+xmaxü
+,
+
+227
+wÜd
+
+Mü
+,
+
+228
+wÜd
+ *
+xMü
+,
+
+229
+wÜd
+ *
+”p
+) ;
+
+231 
+Gsm_LÚg_T”m_SyÁhesis_Fž‹ršg
+ (
+
+232 
+gsm_¡©e
+*
+S
+,
+
+233
+wÜd
+
+Nü
+,
+
+234
+wÜd
+
+bü
+,
+
+235
+wÜd
+ *
+”p
+,
+
+236
+wÜd
+ *
+d½
+) ;
+
+238 
+Gsm_RPE_Decodšg
+ (
+
+240
+wÜd
+
+xmaxü
+,
+
+241
+wÜd
+
+Mü
+,
+
+242
+wÜd
+ *
+xMü
+,
+
+243
+wÜd
+ *
+”p
+) ;
+
+245 
+Gsm_RPE_Encodšg
+ (
+
+247
+wÜd
+ *
+e
+,
+
+248
+wÜd
+ *
+xmaxc
+,
+
+249
+wÜd
+ *
+Mc
+,
+
+250
+wÜd
+ *
+xMc
+) ;
+
+252 
+Gsm_ShÜt_T”m_SyÁhesis_Fž‹r
+ (
+
+253 
+gsm_¡©e
+ *
+S
+,
+
+254
+wÜd
+ *
+LARü
+,
+
+255
+wÜd
+ *
+d½
+,
+
+256
+wÜd
+ *
+s
+) ;
+
+258 
+Gsm_Upd©e_of_»cÚ¡ruùed_shÜt_time_»sidu®_sigÇl
+ (
+
+259
+wÜd
+ *
+dµ
+,
+
+260
+wÜd
+ *
+•
+,
+
+261
+wÜd
+ *
+dp
+) ;
+
+266 #iâdef
+GSM_TABLE_C
+
+
+268
+wÜd
+
+gsm_A
+ [8],
+gsm_B
+ [8],
+gsm_MIC
+ [8],
+gsm_MAC
+ [8] ;
+
+269
+wÜd
+
+gsm_INVA
+ [8] ;
+
+270
+wÜd
+
+gsm_DLB
+ [4],
+gsm_QLB
+ [4] ;
+
+271
+wÜd
+
+gsm_H
+ [11] ;
+
+272
+wÜd
+
+gsm_NRFAC
+ [8] ;
+
+273
+wÜd
+
+gsm_FAC
+ [8] ;
+
+280 #ifdeà
+NDEBUG
+
+
+282 
+ #gsm_debug_wÜds
+(
+a
+,
+b
+,
+c
+,
+d
+
+ )
+
+283 
+ #gsm_debug_lÚgwÜds
+(
+a
+,
+b
+,
+c
+,
+d
+
+ )
+
+284 
+ #gsm_debug_wÜd
+(
+a
+,
+b
+
+ )
+
+285 
+ #gsm_debug_lÚgwÜd
+(
+a
+,
+b
+
+ )
+
+289 
+gsm_debug_wÜds
+ (*
+Çme
+, , ,
+wÜd
+ *) ;
+
+290 
+gsm_debug_lÚgwÜds
+ (*
+Çme
+, , ,
+lÚgwÜd
+ *) ;
+
+291 
+gsm_debug_lÚgwÜd
+ (*
+Çme
+,
+lÚgwÜd
+) ;
+
+292 
+gsm_debug_wÜd
+ (*
+Çme
+,
+wÜd
+) ;
+
+ @gsm_create.c
+
+7 
+ ~"cÚfig.h
+"
+
+9 
+ ~<¡dio.h
+>
+
+10 
+ ~<¡dlib.h
+>
+
+11 
+ ~<¡ršg.h
+>
+
+15 
+ ~"gsm.h
+"
+
+16 
+ ~"gsm610_´iv.h
+"
+
+18
+gsm
+
+ $gsm_ü—‹
+ ()
+
+20
+gsm
+
+r
+;
+
+22
+r
+ =
+ `m®loc
+ ((
+gsm_¡©e
+));
+
+23 ià(!
+r
+) „;
+
+25
+ `mem£t
+((*)
+r
+, 0,  (
+gsm_¡©e
+));
+
+26
+r
+->
+Äp
+ = 40;
+
+28 
+r
+;
+
+29
+ }
+}
+
+32 
+ $gsm_š™
+ (
+gsm
+
+¡©e
+)
+
+34
+ `mem£t
+ (
+¡©e
+, 0,  (
+gsm_¡©e
+)) ;
+
+35
+¡©e
+->
+Äp
+ = 40 ;
+
+36
+ }
+}
+
+ @gsm_decode.c
+
+7 
+ ~"gsm610_´iv.h
+"
+
+9 
+ ~"gsm.h
+"
+
+11 
+ $gsm_decode
+ (
+gsm
+
+s
+,
+gsm_by‹
+ *
+c
+,
+gsm_sigÇl
+ *
+rg‘
+)
+
+13
+wÜd
+
+LARc
+[8],
+Nc
+[4],
+Mc
+[4],
+bc
+[4],
+xmaxc
+[4],
+xmc
+[13*4];
+
+15 #ifdeà
+WAV49
+
+
+16 ià(
+s
+->
+wav_fmt
+) {
+
+18
+uwÜd
+
+ = 0;
+
+20
+s
+->
+äame_šdex
+ = !s->frame_index;
+
+21 ià(
+s
+->
+äame_šdex
+) {
+
+23
+ = *
+c
+++;
+
+24
+LARc
+[0] =
+ & 0x3f; sr >>= 6;
+
+25
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+26
+LARc
+[1] =
+ & 0x3f; sr >>= 6;
+
+27
+ |ð(
+uwÜd
+)*
+c
+++ << 4;
+
+28
+LARc
+[2] =
+ & 0x1f; sr >>= 5;
+
+29
+LARc
+[3] =
+ & 0x1f; sr >>= 5;
+
+30
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+31
+LARc
+[4] =
+ & 0xf; sr >>= 4;
+
+32
+LARc
+[5] =
+ & 0xf; sr >>= 4;
+
+33
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+34
+LARc
+[6] =
+ & 0x7; sr >>= 3;
+
+35
+LARc
+[7] =
+ & 0x7; sr >>= 3;
+
+36
+ |ð(
+uwÜd
+)*
+c
+++ << 4;
+
+37
+Nc
+[0] =
+ & 0x7f; sr >>= 7;
+
+38
+bc
+[0] =
+ & 0x3; sr >>= 2;
+
+39
+Mc
+[0] =
+ & 0x3; sr >>= 2;
+
+40
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+41
+xmaxc
+[0] =
+ & 0x3f; sr >>= 6;
+
+42
+xmc
+[0] =
+ & 0x7; sr >>= 3;
+
+43
+ = *
+c
+++;
+
+44
+xmc
+[1] =
+ & 0x7; sr >>= 3;
+
+45
+xmc
+[2] =
+ & 0x7; sr >>= 3;
+
+46
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+47
+xmc
+[3] =
+ & 0x7; sr >>= 3;
+
+48
+xmc
+[4] =
+ & 0x7; sr >>= 3;
+
+49
+xmc
+[5] =
+ & 0x7; sr >>= 3;
+
+50
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+51
+xmc
+[6] =
+ & 0x7; sr >>= 3;
+
+52
+xmc
+[7] =
+ & 0x7; sr >>= 3;
+
+53
+xmc
+[8] =
+ & 0x7; sr >>= 3;
+
+54
+ = *
+c
+++;
+
+55
+xmc
+[9] =
+ & 0x7; sr >>= 3;
+
+56
+xmc
+[10] =
+ & 0x7; sr >>= 3;
+
+57
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+58
+xmc
+[11] =
+ & 0x7; sr >>= 3;
+
+59
+xmc
+[12] =
+ & 0x7; sr >>= 3;
+
+60
+ |ð(
+uwÜd
+)*
+c
+++ << 4;
+
+61
+Nc
+[1] =
+ & 0x7f; sr >>= 7;
+
+62
+bc
+[1] =
+ & 0x3; sr >>= 2;
+
+63
+Mc
+[1] =
+ & 0x3; sr >>= 2;
+
+64
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+65
+xmaxc
+[1] =
+ & 0x3f; sr >>= 6;
+
+66
+xmc
+[13] =
+ & 0x7; sr >>= 3;
+
+67
+ = *
+c
+++;
+
+68
+xmc
+[14] =
+ & 0x7; sr >>= 3;
+
+69
+xmc
+[15] =
+ & 0x7; sr >>= 3;
+
+70
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+71
+xmc
+[16] =
+ & 0x7; sr >>= 3;
+
+72
+xmc
+[17] =
+ & 0x7; sr >>= 3;
+
+73
+xmc
+[18] =
+ & 0x7; sr >>= 3;
+
+74
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+75
+xmc
+[19] =
+ & 0x7; sr >>= 3;
+
+76
+xmc
+[20] =
+ & 0x7; sr >>= 3;
+
+77
+xmc
+[21] =
+ & 0x7; sr >>= 3;
+
+78
+ = *
+c
+++;
+
+79
+xmc
+[22] =
+ & 0x7; sr >>= 3;
+
+80
+xmc
+[23] =
+ & 0x7; sr >>= 3;
+
+81
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+82
+xmc
+[24] =
+ & 0x7; sr >>= 3;
+
+83
+xmc
+[25] =
+ & 0x7; sr >>= 3;
+
+84
+ |ð(
+uwÜd
+)*
+c
+++ << 4;
+
+85
+Nc
+[2] =
+ & 0x7f; sr >>= 7;
+
+86
+bc
+[2] =
+ & 0x3; sr >>= 2;
+
+87
+Mc
+[2] =
+ & 0x3; sr >>= 2;
+
+88
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+89
+xmaxc
+[2] =
+ & 0x3f; sr >>= 6;
+
+90
+xmc
+[26] =
+ & 0x7; sr >>= 3;
+
+91
+ = *
+c
+++;
+
+92
+xmc
+[27] =
+ & 0x7; sr >>= 3;
+
+93
+xmc
+[28] =
+ & 0x7; sr >>= 3;
+
+94
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+95
+xmc
+[29] =
+ & 0x7; sr >>= 3;
+
+96
+xmc
+[30] =
+ & 0x7; sr >>= 3;
+
+97
+xmc
+[31] =
+ & 0x7; sr >>= 3;
+
+98
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+99
+xmc
+[32] =
+ & 0x7; sr >>= 3;
+
+100
+xmc
+[33] =
+ & 0x7; sr >>= 3;
+
+101
+xmc
+[34] =
+ & 0x7; sr >>= 3;
+
+102
+ = *
+c
+++;
+
+103
+xmc
+[35] =
+ & 0x7; sr >>= 3;
+
+104
+xmc
+[36] =
+ & 0x7; sr >>= 3;
+
+105
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+106
+xmc
+[37] =
+ & 0x7; sr >>= 3;
+
+107
+xmc
+[38] =
+ & 0x7; sr >>= 3;
+
+108
+ |ð(
+uwÜd
+)*
+c
+++ << 4;
+
+109
+Nc
+[3] =
+ & 0x7f; sr >>= 7;
+
+110
+bc
+[3] =
+ & 0x3; sr >>= 2;
+
+111
+Mc
+[3] =
+ & 0x3; sr >>= 2;
+
+112
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+113
+xmaxc
+[3] =
+ & 0x3f; sr >>= 6;
+
+114
+xmc
+[39] =
+ & 0x7; sr >>= 3;
+
+115
+ = *
+c
+++;
+
+116
+xmc
+[40] =
+ & 0x7; sr >>= 3;
+
+117
+xmc
+[41] =
+ & 0x7; sr >>= 3;
+
+118
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+119
+xmc
+[42] =
+ & 0x7; sr >>= 3;
+
+120
+xmc
+[43] =
+ & 0x7; sr >>= 3;
+
+121
+xmc
+[44] =
+ & 0x7; sr >>= 3;
+
+122
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+123
+xmc
+[45] =
+ & 0x7; sr >>= 3;
+
+124
+xmc
+[46] =
+ & 0x7; sr >>= 3;
+
+125
+xmc
+[47] =
+ & 0x7; sr >>= 3;
+
+126
+ = *
+c
+++;
+
+127
+xmc
+[48] =
+ & 0x7; sr >>= 3;
+
+128
+xmc
+[49] =
+ & 0x7; sr >>= 3;
+
+129
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+130
+xmc
+[50] =
+ & 0x7; sr >>= 3;
+
+131
+xmc
+[51] =
+ & 0x7; sr >>= 3;
+
+133
+s
+->
+äame_chaš
+ =
+ & 0xf;
+
+136
+ =
+s
+->
+äame_chaš
+;
+
+137
+ |ð(
+uwÜd
+)*
+c
+++ << 4;
+
+138
+LARc
+[0] =
+ & 0x3f; sr >>= 6;
+
+139
+LARc
+[1] =
+ & 0x3f; sr >>= 6;
+
+140
+ = *
+c
+++;
+
+141
+LARc
+[2] =
+ & 0x1f; sr >>= 5;
+
+142
+ |ð(
+uwÜd
+)*
+c
+++ << 3;
+
+143
+LARc
+[3] =
+ & 0x1f; sr >>= 5;
+
+144
+LARc
+[4] =
+ & 0xf; sr >>= 4;
+
+145
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+146
+LARc
+[5] =
+ & 0xf; sr >>= 4;
+
+147
+LARc
+[6] =
+ & 0x7; sr >>= 3;
+
+148
+LARc
+[7] =
+ & 0x7; sr >>= 3;
+
+149
+ = *
+c
+++;
+
+150
+Nc
+[0] =
+ & 0x7f; sr >>= 7;
+
+151
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+152
+bc
+[0] =
+ & 0x3; sr >>= 2;
+
+153
+Mc
+[0] =
+ & 0x3; sr >>= 2;
+
+154
+ |ð(
+uwÜd
+)*
+c
+++ << 5;
+
+155
+xmaxc
+[0] =
+ & 0x3f; sr >>= 6;
+
+156
+xmc
+[0] =
+ & 0x7; sr >>= 3;
+
+157
+xmc
+[1] =
+ & 0x7; sr >>= 3;
+
+158
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+159
+xmc
+[2] =
+ & 0x7; sr >>= 3;
+
+160
+xmc
+[3] =
+ & 0x7; sr >>= 3;
+
+161
+xmc
+[4] =
+ & 0x7; sr >>= 3;
+
+162
+ = *
+c
+++;
+
+163
+xmc
+[5] =
+ & 0x7; sr >>= 3;
+
+164
+xmc
+[6] =
+ & 0x7; sr >>= 3;
+
+165
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+166
+xmc
+[7] =
+ & 0x7; sr >>= 3;
+
+167
+xmc
+[8] =
+ & 0x7; sr >>= 3;
+
+168
+xmc
+[9] =
+ & 0x7; sr >>= 3;
+
+169
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+170
+xmc
+[10] =
+ & 0x7; sr >>= 3;
+
+171
+xmc
+[11] =
+ & 0x7; sr >>= 3;
+
+172
+xmc
+[12] =
+ & 0x7; sr >>= 3;
+
+173
+ = *
+c
+++;
+
+174
+Nc
+[1] =
+ & 0x7f; sr >>= 7;
+
+175
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+176
+bc
+[1] =
+ & 0x3; sr >>= 2;
+
+177
+Mc
+[1] =
+ & 0x3; sr >>= 2;
+
+178
+ |ð(
+uwÜd
+)*
+c
+++ << 5;
+
+179
+xmaxc
+[1] =
+ & 0x3f; sr >>= 6;
+
+180
+xmc
+[13] =
+ & 0x7; sr >>= 3;
+
+181
+xmc
+[14] =
+ & 0x7; sr >>= 3;
+
+182
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+183
+xmc
+[15] =
+ & 0x7; sr >>= 3;
+
+184
+xmc
+[16] =
+ & 0x7; sr >>= 3;
+
+185
+xmc
+[17] =
+ & 0x7; sr >>= 3;
+
+186
+ = *
+c
+++;
+
+187
+xmc
+[18] =
+ & 0x7; sr >>= 3;
+
+188
+xmc
+[19] =
+ & 0x7; sr >>= 3;
+
+189
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+190
+xmc
+[20] =
+ & 0x7; sr >>= 3;
+
+191
+xmc
+[21] =
+ & 0x7; sr >>= 3;
+
+192
+xmc
+[22] =
+ & 0x7; sr >>= 3;
+
+193
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+194
+xmc
+[23] =
+ & 0x7; sr >>= 3;
+
+195
+xmc
+[24] =
+ & 0x7; sr >>= 3;
+
+196
+xmc
+[25] =
+ & 0x7; sr >>= 3;
+
+197
+ = *
+c
+++;
+
+198
+Nc
+[2] =
+ & 0x7f; sr >>= 7;
+
+199
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+200
+bc
+[2] =
+ & 0x3; sr >>= 2;
+
+201
+Mc
+[2] =
+ & 0x3; sr >>= 2;
+
+202
+ |ð(
+uwÜd
+)*
+c
+++ << 5;
+
+203
+xmaxc
+[2] =
+ & 0x3f; sr >>= 6;
+
+204
+xmc
+[26] =
+ & 0x7; sr >>= 3;
+
+205
+xmc
+[27] =
+ & 0x7; sr >>= 3;
+
+206
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+207
+xmc
+[28] =
+ & 0x7; sr >>= 3;
+
+208
+xmc
+[29] =
+ & 0x7; sr >>= 3;
+
+209
+xmc
+[30] =
+ & 0x7; sr >>= 3;
+
+210
+ = *
+c
+++;
+
+211
+xmc
+[31] =
+ & 0x7; sr >>= 3;
+
+212
+xmc
+[32] =
+ & 0x7; sr >>= 3;
+
+213
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+214
+xmc
+[33] =
+ & 0x7; sr >>= 3;
+
+215
+xmc
+[34] =
+ & 0x7; sr >>= 3;
+
+216
+xmc
+[35] =
+ & 0x7; sr >>= 3;
+
+217
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+218
+xmc
+[36] =
+ & 0x7; sr >>= 3;
+
+219
+xmc
+[37] =
+ & 0x7; sr >>= 3;
+
+220
+xmc
+[38] =
+ & 0x7; sr >>= 3;
+
+221
+ = *
+c
+++;
+
+222
+Nc
+[3] =
+ & 0x7f; sr >>= 7;
+
+223
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+224
+bc
+[3] =
+ & 0x3; sr >>= 2;
+
+225
+Mc
+[3] =
+ & 0x3; sr >>= 2;
+
+226
+ |ð(
+uwÜd
+)*
+c
+++ << 5;
+
+227
+xmaxc
+[3] =
+ & 0x3f; sr >>= 6;
+
+228
+xmc
+[39] =
+ & 0x7; sr >>= 3;
+
+229
+xmc
+[40] =
+ & 0x7; sr >>= 3;
+
+230
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+231
+xmc
+[41] =
+ & 0x7; sr >>= 3;
+
+232
+xmc
+[42] =
+ & 0x7; sr >>= 3;
+
+233
+xmc
+[43] =
+ & 0x7; sr >>= 3;
+
+234
+ = *
+c
+++;
+
+235
+xmc
+[44] =
+ & 0x7; sr >>= 3;
+
+236
+xmc
+[45] =
+ & 0x7; sr >>= 3;
+
+237
+ |ð(
+uwÜd
+)*
+c
+++ << 2;
+
+238
+xmc
+[46] =
+ & 0x7; sr >>= 3;
+
+239
+xmc
+[47] =
+ & 0x7; sr >>= 3;
+
+240
+xmc
+[48] =
+ & 0x7; sr >>= 3;
+
+241
+ |ð(
+uwÜd
+)*
+c
+++ << 1;
+
+242
+xmc
+[49] =
+ & 0x7; sr >>= 3;
+
+243
+xmc
+[50] =
+ & 0x7; sr >>= 3;
+
+244
+xmc
+[51] =
+ & 0x7; sr >>= 3;
+
+252 ià(((*
+c
+ >> 4è& 0x0Fè!ð
+GSM_MAGIC
+)  -1;
+
+254
+LARc
+[0] = (*
+c
+++ & 0xF) << 2;
+
+255
+LARc
+[0] |ð(*
+c
+ >> 6) & 0x3;
+
+256
+LARc
+[1] = *
+c
+++ & 0x3F;
+
+257
+LARc
+[2] = (*
+c
+ >> 3) & 0x1F;
+
+258
+LARc
+[3] = (*
+c
+++ & 0x7) << 2;
+
+259
+LARc
+[3] |ð(*
+c
+ >> 6) & 0x3;
+
+260
+LARc
+[4] = (*
+c
+ >> 2) & 0xF;
+
+261
+LARc
+[5] = (*
+c
+++ & 0x3) << 2;
+
+262
+LARc
+[5] |ð(*
+c
+ >> 6) & 0x3;
+
+263
+LARc
+[6] = (*
+c
+ >> 3) & 0x7;
+
+264
+LARc
+[7] = *
+c
+++ & 0x7;
+
+265
+Nc
+[0] = (*
+c
+ >> 1) & 0x7F;
+
+266
+bc
+[0] = (*
+c
+++ & 0x1) << 1;
+
+267
+bc
+[0] |ð(*
+c
+ >> 7) & 0x1;
+
+268
+Mc
+[0] = (*
+c
+ >> 5) & 0x3;
+
+269
+xmaxc
+[0] = (*
+c
+++ & 0x1F) << 1;
+
+270
+xmaxc
+[0] |ð(*
+c
+ >> 7) & 0x1;
+
+271
+xmc
+[0] = (*
+c
+ >> 4) & 0x7;
+
+272
+xmc
+[1] = (*
+c
+ >> 1) & 0x7;
+
+273
+xmc
+[2] = (*
+c
+++ & 0x1) << 2;
+
+274
+xmc
+[2] |ð(*
+c
+ >> 6) & 0x3;
+
+275
+xmc
+[3] = (*
+c
+ >> 3) & 0x7;
+
+276
+xmc
+[4] = *
+c
+++ & 0x7;
+
+277
+xmc
+[5] = (*
+c
+ >> 5) & 0x7;
+
+278
+xmc
+[6] = (*
+c
+ >> 2) & 0x7;
+
+279
+xmc
+[7] = (*
+c
+++ & 0x3) << 1;
+
+280
+xmc
+[7] |ð(*
+c
+ >> 7) & 0x1;
+
+281
+xmc
+[8] = (*
+c
+ >> 4) & 0x7;
+
+282
+xmc
+[9] = (*
+c
+ >> 1) & 0x7;
+
+283
+xmc
+[10] = (*
+c
+++ & 0x1) << 2;
+
+284
+xmc
+[10] |ð(*
+c
+ >> 6) & 0x3;
+
+285
+xmc
+[11] = (*
+c
+ >> 3) & 0x7;
+
+286
+xmc
+[12] = *
+c
+++ & 0x7;
+
+287
+Nc
+[1] = (*
+c
+ >> 1) & 0x7F;
+
+288
+bc
+[1] = (*
+c
+++ & 0x1) << 1;
+
+289
+bc
+[1] |ð(*
+c
+ >> 7) & 0x1;
+
+290
+Mc
+[1] = (*
+c
+ >> 5) & 0x3;
+
+291
+xmaxc
+[1] = (*
+c
+++ & 0x1F) << 1;
+
+292
+xmaxc
+[1] |ð(*
+c
+ >> 7) & 0x1;
+
+293
+xmc
+[13] = (*
+c
+ >> 4) & 0x7;
+
+294
+xmc
+[14] = (*
+c
+ >> 1) & 0x7;
+
+295
+xmc
+[15] = (*
+c
+++ & 0x1) << 2;
+
+296
+xmc
+[15] |ð(*
+c
+ >> 6) & 0x3;
+
+297
+xmc
+[16] = (*
+c
+ >> 3) & 0x7;
+
+298
+xmc
+[17] = *
+c
+++ & 0x7;
+
+299
+xmc
+[18] = (*
+c
+ >> 5) & 0x7;
+
+300
+xmc
+[19] = (*
+c
+ >> 2) & 0x7;
+
+301
+xmc
+[20] = (*
+c
+++ & 0x3) << 1;
+
+302
+xmc
+[20] |ð(*
+c
+ >> 7) & 0x1;
+
+303
+xmc
+[21] = (*
+c
+ >> 4) & 0x7;
+
+304
+xmc
+[22] = (*
+c
+ >> 1) & 0x7;
+
+305
+xmc
+[23] = (*
+c
+++ & 0x1) << 2;
+
+306
+xmc
+[23] |ð(*
+c
+ >> 6) & 0x3;
+
+307
+xmc
+[24] = (*
+c
+ >> 3) & 0x7;
+
+308
+xmc
+[25] = *
+c
+++ & 0x7;
+
+309
+Nc
+[2] = (*
+c
+ >> 1) & 0x7F;
+
+310
+bc
+[2] = (*
+c
+++ & 0x1) << 1;
+
+311
+bc
+[2] |ð(*
+c
+ >> 7) & 0x1;
+
+312
+Mc
+[2] = (*
+c
+ >> 5) & 0x3;
+
+313
+xmaxc
+[2] = (*
+c
+++ & 0x1F) << 1;
+
+314
+xmaxc
+[2] |ð(*
+c
+ >> 7) & 0x1;
+
+315
+xmc
+[26] = (*
+c
+ >> 4) & 0x7;
+
+316
+xmc
+[27] = (*
+c
+ >> 1) & 0x7;
+
+317
+xmc
+[28] = (*
+c
+++ & 0x1) << 2;
+
+318
+xmc
+[28] |ð(*
+c
+ >> 6) & 0x3;
+
+319
+xmc
+[29] = (*
+c
+ >> 3) & 0x7;
+
+320
+xmc
+[30] = *
+c
+++ & 0x7;
+
+321
+xmc
+[31] = (*
+c
+ >> 5) & 0x7;
+
+322
+xmc
+[32] = (*
+c
+ >> 2) & 0x7;
+
+323
+xmc
+[33] = (*
+c
+++ & 0x3) << 1;
+
+324
+xmc
+[33] |ð(*
+c
+ >> 7) & 0x1;
+
+325
+xmc
+[34] = (*
+c
+ >> 4) & 0x7;
+
+326
+xmc
+[35] = (*
+c
+ >> 1) & 0x7;
+
+327
+xmc
+[36] = (*
+c
+++ & 0x1) << 2;
+
+328
+xmc
+[36] |ð(*
+c
+ >> 6) & 0x3;
+
+329
+xmc
+[37] = (*
+c
+ >> 3) & 0x7;
+
+330
+xmc
+[38] = *
+c
+++ & 0x7;
+
+331
+Nc
+[3] = (*
+c
+ >> 1) & 0x7F;
+
+332
+bc
+[3] = (*
+c
+++ & 0x1) << 1;
+
+333
+bc
+[3] |ð(*
+c
+ >> 7) & 0x1;
+
+334
+Mc
+[3] = (*
+c
+ >> 5) & 0x3;
+
+335
+xmaxc
+[3] = (*
+c
+++ & 0x1F) << 1;
+
+336
+xmaxc
+[3] |ð(*
+c
+ >> 7) & 0x1;
+
+337
+xmc
+[39] = (*
+c
+ >> 4) & 0x7;
+
+338
+xmc
+[40] = (*
+c
+ >> 1) & 0x7;
+
+339
+xmc
+[41] = (*
+c
+++ & 0x1) << 2;
+
+340
+xmc
+[41] |ð(*
+c
+ >> 6) & 0x3;
+
+341
+xmc
+[42] = (*
+c
+ >> 3) & 0x7;
+
+342
+xmc
+[43] = *
+c
+++ & 0x7;
+
+343
+xmc
+[44] = (*
+c
+ >> 5) & 0x7;
+
+344
+xmc
+[45] = (*
+c
+ >> 2) & 0x7;
+
+345
+xmc
+[46] = (*
+c
+++ & 0x3) << 1;
+
+346
+xmc
+[46] |ð(*
+c
+ >> 7) & 0x1;
+
+347
+xmc
+[47] = (*
+c
+ >> 4) & 0x7;
+
+348
+xmc
+[48] = (*
+c
+ >> 1) & 0x7;
+
+349
+xmc
+[49] = (*
+c
+++ & 0x1) << 2;
+
+350
+xmc
+[49] |ð(*
+c
+ >> 6) & 0x3;
+
+351
+xmc
+[50] = (*
+c
+ >> 3) & 0x7;
+
+352
+xmc
+[51] = *
+c
+ & 0x7;
+
+355
+ `Gsm_Decod”
+(
+s
+,
+LARc
+,
+Nc
+,
+bc
+,
+Mc
+,
+xmaxc
+,
+xmc
+,
+rg‘
+);
+
+358
+ }
+}
+
+ @gsm_destroy.c
+
+7 
+ ~"gsm.h
+"
+
+8 
+ ~"cÚfig.h
+"
+
+10 #ifdef
+HAS_STDLIB_H
+
+
+11 
+ ~<¡dlib.h
+>
+
+13 #ifdef
+HAS_MALLOC_H
+
+
+14 
+ ~<m®loc.h
+>
+
+16 
+ä“
+();
+
+20 
+ $gsm_de¡roy
+ (
+gsm
+
+S
+)
+
+22 ià(
+S
+ `ä“
+((*)S);
+
+23
+ }
+}
+
+ @gsm_encode.c
+
+7 
+ ~"gsm610_´iv.h
+"
+
+8 
+ ~"gsm.h
+"
+
+10 
+ $gsm_’code
+ (
+gsm
+
+s
+,
+gsm_sigÇl
+ *
+sourû
+,
+gsm_by‹
+ *
+c
+)
+
+12
+wÜd
+
+LARc
+[8],
+Nc
+[4],
+Mc
+[4],
+bc
+[4],
+xmaxc
+[4],
+xmc
+[13*4];
+
+14
+ `Gsm_Cod”
+(
+s
+,
+sourû
+,
+LARc
+,
+Nc
+,
+bc
+,
+Mc
+,
+xmaxc
+,
+xmc
+);
+
+103 #ifdeà
+WAV49
+
+
+105 ià(
+s
+->
+wav_fmt
+) {
+
+106
+s
+->
+äame_šdex
+ = !s->frame_index;
+
+107 ià(
+s
+->
+äame_šdex
+) {
+
+109
+uwÜd
+
+;
+
+111
+ = 0;
+
+112
+ = s¸>> 6 |
+LARc
+[0] << 10;
+
+113
+ = s¸>> 6 |
+LARc
+[1] << 10;
+
+114 *
+c
+++ =
+ >> 4;
+
+115
+ = s¸>> 5 |
+LARc
+[2] << 11;
+
+116 *
+c
+++ =
+ >> 7;
+
+117
+ = s¸>> 5 |
+LARc
+[3] << 11;
+
+118
+ = s¸>> 4 |
+LARc
+[4] << 12;
+
+119 *
+c
+++ =
+ >> 6;
+
+120
+ = s¸>> 4 |
+LARc
+[5] << 12;
+
+121
+ = s¸>> 3 |
+LARc
+[6] << 13;
+
+122 *
+c
+++ =
+ >> 7;
+
+123
+ = s¸>> 3 |
+LARc
+[7] << 13;
+
+124
+ = s¸>> 7 |
+Nc
+[0] << 9;
+
+125 *
+c
+++ =
+ >> 5;
+
+126
+ = s¸>> 2 |
+bc
+[0] << 14;
+
+127
+ = s¸>> 2 |
+Mc
+[0] << 14;
+
+128
+ = s¸>> 6 |
+xmaxc
+[0] << 10;
+
+129 *
+c
+++ =
+ >> 3;
+
+130
+ = s¸>> 3 |
+xmc
+[0] << 13;
+
+131 *
+c
+++ =
+ >> 8;
+
+132
+ = s¸>> 3 |
+xmc
+[1] << 13;
+
+133
+ = s¸>> 3 |
+xmc
+[2] << 13;
+
+134
+ = s¸>> 3 |
+xmc
+[3] << 13;
+
+135 *
+c
+++ =
+ >> 7;
+
+136
+ = s¸>> 3 |
+xmc
+[4] << 13;
+
+137
+ = s¸>> 3 |
+xmc
+[5] << 13;
+
+138
+ = s¸>> 3 |
+xmc
+[6] << 13;
+
+139 *
+c
+++ =
+ >> 6;
+
+140
+ = s¸>> 3 |
+xmc
+[7] << 13;
+
+141
+ = s¸>> 3 |
+xmc
+[8] << 13;
+
+142 *
+c
+++ =
+ >> 8;
+
+143
+ = s¸>> 3 |
+xmc
+[9] << 13;
+
+144
+ = s¸>> 3 |
+xmc
+[10] << 13;
+
+145
+ = s¸>> 3 |
+xmc
+[11] << 13;
+
+146 *
+c
+++ =
+ >> 7;
+
+147
+ = s¸>> 3 |
+xmc
+[12] << 13;
+
+148
+ = s¸>> 7 |
+Nc
+[1] << 9;
+
+149 *
+c
+++ =
+ >> 5;
+
+150
+ = s¸>> 2 |
+bc
+[1] << 14;
+
+151
+ = s¸>> 2 |
+Mc
+[1] << 14;
+
+152
+ = s¸>> 6 |
+xmaxc
+[1] << 10;
+
+153 *
+c
+++ =
+ >> 3;
+
+154
+ = s¸>> 3 |
+xmc
+[13] << 13;
+
+155 *
+c
+++ =
+ >> 8;
+
+156
+ = s¸>> 3 |
+xmc
+[14] << 13;
+
+157
+ = s¸>> 3 |
+xmc
+[15] << 13;
+
+158
+ = s¸>> 3 |
+xmc
+[16] << 13;
+
+159 *
+c
+++ =
+ >> 7;
+
+160
+ = s¸>> 3 |
+xmc
+[17] << 13;
+
+161
+ = s¸>> 3 |
+xmc
+[18] << 13;
+
+162
+ = s¸>> 3 |
+xmc
+[19] << 13;
+
+163 *
+c
+++ =
+ >> 6;
+
+164
+ = s¸>> 3 |
+xmc
+[20] << 13;
+
+165
+ = s¸>> 3 |
+xmc
+[21] << 13;
+
+166 *
+c
+++ =
+ >> 8;
+
+167
+ = s¸>> 3 |
+xmc
+[22] << 13;
+
+168
+ = s¸>> 3 |
+xmc
+[23] << 13;
+
+169
+ = s¸>> 3 |
+xmc
+[24] << 13;
+
+170 *
+c
+++ =
+ >> 7;
+
+171
+ = s¸>> 3 |
+xmc
+[25] << 13;
+
+172
+ = s¸>> 7 |
+Nc
+[2] << 9;
+
+173 *
+c
+++ =
+ >> 5;
+
+174
+ = s¸>> 2 |
+bc
+[2] << 14;
+
+175
+ = s¸>> 2 |
+Mc
+[2] << 14;
+
+176
+ = s¸>> 6 |
+xmaxc
+[2] << 10;
+
+177 *
+c
+++ =
+ >> 3;
+
+178
+ = s¸>> 3 |
+xmc
+[26] << 13;
+
+179 *
+c
+++ =
+ >> 8;
+
+180
+ = s¸>> 3 |
+xmc
+[27] << 13;
+
+181
+ = s¸>> 3 |
+xmc
+[28] << 13;
+
+182
+ = s¸>> 3 |
+xmc
+[29] << 13;
+
+183 *
+c
+++ =
+ >> 7;
+
+184
+ = s¸>> 3 |
+xmc
+[30] << 13;
+
+185
+ = s¸>> 3 |
+xmc
+[31] << 13;
+
+186
+ = s¸>> 3 |
+xmc
+[32] << 13;
+
+187 *
+c
+++ =
+ >> 6;
+
+188
+ = s¸>> 3 |
+xmc
+[33] << 13;
+
+189
+ = s¸>> 3 |
+xmc
+[34] << 13;
+
+190 *
+c
+++ =
+ >> 8;
+
+191
+ = s¸>> 3 |
+xmc
+[35] << 13;
+
+192
+ = s¸>> 3 |
+xmc
+[36] << 13;
+
+193
+ = s¸>> 3 |
+xmc
+[37] << 13;
+
+194 *
+c
+++ =
+ >> 7;
+
+195
+ = s¸>> 3 |
+xmc
+[38] << 13;
+
+196
+ = s¸>> 7 |
+Nc
+[3] << 9;
+
+197 *
+c
+++ =
+ >> 5;
+
+198
+ = s¸>> 2 |
+bc
+[3] << 14;
+
+199
+ = s¸>> 2 |
+Mc
+[3] << 14;
+
+200
+ = s¸>> 6 |
+xmaxc
+[3] << 10;
+
+201 *
+c
+++ =
+ >> 3;
+
+202
+ = s¸>> 3 |
+xmc
+[39] << 13;
+
+203 *
+c
+++ =
+ >> 8;
+
+204
+ = s¸>> 3 |
+xmc
+[40] << 13;
+
+205
+ = s¸>> 3 |
+xmc
+[41] << 13;
+
+206
+ = s¸>> 3 |
+xmc
+[42] << 13;
+
+207 *
+c
+++ =
+ >> 7;
+
+208
+ = s¸>> 3 |
+xmc
+[43] << 13;
+
+209
+ = s¸>> 3 |
+xmc
+[44] << 13;
+
+210
+ = s¸>> 3 |
+xmc
+[45] << 13;
+
+211 *
+c
+++ =
+ >> 6;
+
+212
+ = s¸>> 3 |
+xmc
+[46] << 13;
+
+213
+ = s¸>> 3 |
+xmc
+[47] << 13;
+
+214 *
+c
+++ =
+ >> 8;
+
+215
+ = s¸>> 3 |
+xmc
+[48] << 13;
+
+216
+ = s¸>> 3 |
+xmc
+[49] << 13;
+
+217
+ = s¸>> 3 |
+xmc
+[50] << 13;
+
+218 *
+c
+++ =
+ >> 7;
+
+219
+ = s¸>> 3 |
+xmc
+[51] << 13;
+
+220
+ = sr >> 4;
+
+221 *
+c
+ =
+ >> 8;
+
+222
+s
+->
+äame_chaš
+ = *
+c
+;
+
+225
+uwÜd
+
+;
+
+227
+ = 0;
+
+228
+ = s¸>> 4 |
+s
+->
+äame_chaš
+ << 12;
+
+229
+ = s¸>> 6 |
+LARc
+[0] << 10;
+
+230 *
+c
+++ =
+ >> 6;
+
+231
+ = s¸>> 6 |
+LARc
+[1] << 10;
+
+232 *
+c
+++ =
+ >> 8;
+
+233
+ = s¸>> 5 |
+LARc
+[2] << 11;
+
+234
+ = s¸>> 5 |
+LARc
+[3] << 11;
+
+235 *
+c
+++ =
+ >> 6;
+
+236
+ = s¸>> 4 |
+LARc
+[4] << 12;
+
+237
+ = s¸>> 4 |
+LARc
+[5] << 12;
+
+238 *
+c
+++ =
+ >> 6;
+
+239
+ = s¸>> 3 |
+LARc
+[6] << 13;
+
+240
+ = s¸>> 3 |
+LARc
+[7] << 13;
+
+241 *
+c
+++ =
+ >> 8;
+
+242
+ = s¸>> 7 |
+Nc
+[0] << 9;
+
+243
+ = s¸>> 2 |
+bc
+[0] << 14;
+
+244 *
+c
+++ =
+ >> 7;
+
+245
+ = s¸>> 2 |
+Mc
+[0] << 14;
+
+246
+ = s¸>> 6 |
+xmaxc
+[0] << 10;
+
+247 *
+c
+++ =
+ >> 7;
+
+248
+ = s¸>> 3 |
+xmc
+[0] << 13;
+
+249
+ = s¸>> 3 |
+xmc
+[1] << 13;
+
+250
+ = s¸>> 3 |
+xmc
+[2] << 13;
+
+251 *
+c
+++ =
+ >> 6;
+
+252
+ = s¸>> 3 |
+xmc
+[3] << 13;
+
+253
+ = s¸>> 3 |
+xmc
+[4] << 13;
+
+254 *
+c
+++ =
+ >> 8;
+
+255
+ = s¸>> 3 |
+xmc
+[5] << 13;
+
+256
+ = s¸>> 3 |
+xmc
+[6] << 13;
+
+257
+ = s¸>> 3 |
+xmc
+[7] << 13;
+
+258 *
+c
+++ =
+ >> 7;
+
+259
+ = s¸>> 3 |
+xmc
+[8] << 13;
+
+260
+ = s¸>> 3 |
+xmc
+[9] << 13;
+
+261
+ = s¸>> 3 |
+xmc
+[10] << 13;
+
+262 *
+c
+++ =
+ >> 6;
+
+263
+ = s¸>> 3 |
+xmc
+[11] << 13;
+
+264
+ = s¸>> 3 |
+xmc
+[12] << 13;
+
+265 *
+c
+++ =
+ >> 8;
+
+266
+ = s¸>> 7 |
+Nc
+[1] << 9;
+
+267
+ = s¸>> 2 |
+bc
+[1] << 14;
+
+268 *
+c
+++ =
+ >> 7;
+
+269
+ = s¸>> 2 |
+Mc
+[1] << 14;
+
+270
+ = s¸>> 6 |
+xmaxc
+[1] << 10;
+
+271 *
+c
+++ =
+ >> 7;
+
+272
+ = s¸>> 3 |
+xmc
+[13] << 13;
+
+273
+ = s¸>> 3 |
+xmc
+[14] << 13;
+
+274
+ = s¸>> 3 |
+xmc
+[15] << 13;
+
+275 *
+c
+++ =
+ >> 6;
+
+276
+ = s¸>> 3 |
+xmc
+[16] << 13;
+
+277
+ = s¸>> 3 |
+xmc
+[17] << 13;
+
+278 *
+c
+++ =
+ >> 8;
+
+279
+ = s¸>> 3 |
+xmc
+[18] << 13;
+
+280
+ = s¸>> 3 |
+xmc
+[19] << 13;
+
+281
+ = s¸>> 3 |
+xmc
+[20] << 13;
+
+282 *
+c
+++ =
+ >> 7;
+
+283
+ = s¸>> 3 |
+xmc
+[21] << 13;
+
+284
+ = s¸>> 3 |
+xmc
+[22] << 13;
+
+285
+ = s¸>> 3 |
+xmc
+[23] << 13;
+
+286 *
+c
+++ =
+ >> 6;
+
+287
+ = s¸>> 3 |
+xmc
+[24] << 13;
+
+288
+ = s¸>> 3 |
+xmc
+[25] << 13;
+
+289 *
+c
+++ =
+ >> 8;
+
+290
+ = s¸>> 7 |
+Nc
+[2] << 9;
+
+291
+ = s¸>> 2 |
+bc
+[2] << 14;
+
+292 *
+c
+++ =
+ >> 7;
+
+293
+ = s¸>> 2 |
+Mc
+[2] << 14;
+
+294
+ = s¸>> 6 |
+xmaxc
+[2] << 10;
+
+295 *
+c
+++ =
+ >> 7;
+
+296
+ = s¸>> 3 |
+xmc
+[26] << 13;
+
+297
+ = s¸>> 3 |
+xmc
+[27] << 13;
+
+298
+ = s¸>> 3 |
+xmc
+[28] << 13;
+
+299 *
+c
+++ =
+ >> 6;
+
+300
+ = s¸>> 3 |
+xmc
+[29] << 13;
+
+301
+ = s¸>> 3 |
+xmc
+[30] << 13;
+
+302 *
+c
+++ =
+ >> 8;
+
+303
+ = s¸>> 3 |
+xmc
+[31] << 13;
+
+304
+ = s¸>> 3 |
+xmc
+[32] << 13;
+
+305
+ = s¸>> 3 |
+xmc
+[33] << 13;
+
+306 *
+c
+++ =
+ >> 7;
+
+307
+ = s¸>> 3 |
+xmc
+[34] << 13;
+
+308
+ = s¸>> 3 |
+xmc
+[35] << 13;
+
+309
+ = s¸>> 3 |
+xmc
+[36] << 13;
+
+310 *
+c
+++ =
+ >> 6;
+
+311
+ = s¸>> 3 |
+xmc
+[37] << 13;
+
+312
+ = s¸>> 3 |
+xmc
+[38] << 13;
+
+313 *
+c
+++ =
+ >> 8;
+
+314
+ = s¸>> 7 |
+Nc
+[3] << 9;
+
+315
+ = s¸>> 2 |
+bc
+[3] << 14;
+
+316 *
+c
+++ =
+ >> 7;
+
+317
+ = s¸>> 2 |
+Mc
+[3] << 14;
+
+318
+ = s¸>> 6 |
+xmaxc
+[3] << 10;
+
+319 *
+c
+++ =
+ >> 7;
+
+320
+ = s¸>> 3 |
+xmc
+[39] << 13;
+
+321
+ = s¸>> 3 |
+xmc
+[40] << 13;
+
+322
+ = s¸>> 3 |
+xmc
+[41] << 13;
+
+323 *
+c
+++ =
+ >> 6;
+
+324
+ = s¸>> 3 |
+xmc
+[42] << 13;
+
+325
+ = s¸>> 3 |
+xmc
+[43] << 13;
+
+326 *
+c
+++ =
+ >> 8;
+
+327
+ = s¸>> 3 |
+xmc
+[44] << 13;
+
+328
+ = s¸>> 3 |
+xmc
+[45] << 13;
+
+329
+ = s¸>> 3 |
+xmc
+[46] << 13;
+
+330 *
+c
+++ =
+ >> 7;
+
+331
+ = s¸>> 3 |
+xmc
+[47] << 13;
+
+332
+ = s¸>> 3 |
+xmc
+[48] << 13;
+
+333
+ = s¸>> 3 |
+xmc
+[49] << 13;
+
+334 *
+c
+++ =
+ >> 6;
+
+335
+ = s¸>> 3 |
+xmc
+[50] << 13;
+
+336
+ = s¸>> 3 |
+xmc
+[51] << 13;
+
+337 *
+c
+++ =
+ >> 8;
+
+346 *
+c
+++ = ((
+GSM_MAGIC
+ & 0xF) << 4)
+
+347 | ((
+LARc
+[0] >> 2) & 0xF);
+
+348 *
+c
+++ = ((
+LARc
+[0] & 0x3) << 6)
+
+349 | (
+LARc
+[1] & 0x3F);
+
+350 *
+c
+++ = ((
+LARc
+[2] & 0x1F) << 3)
+
+351 | ((
+LARc
+[3] >> 2) & 0x7);
+
+352 *
+c
+++ = ((
+LARc
+[3] & 0x3) << 6)
+
+353 | ((
+LARc
+[4] & 0xF) << 2)
+
+354 | ((
+LARc
+[5] >> 2) & 0x3);
+
+355 *
+c
+++ = ((
+LARc
+[5] & 0x3) << 6)
+
+356 | ((
+LARc
+[6] & 0x7) << 3)
+
+357 | (
+LARc
+[7] & 0x7);
+
+358 *
+c
+++ = ((
+Nc
+[0] & 0x7F) << 1)
+
+359 | ((
+bc
+[0] >> 1) & 0x1);
+
+360 *
+c
+++ = ((
+bc
+[0] & 0x1) << 7)
+
+361 | ((
+Mc
+[0] & 0x3) << 5)
+
+362 | ((
+xmaxc
+[0] >> 1) & 0x1F);
+
+363 *
+c
+++ = ((
+xmaxc
+[0] & 0x1) << 7)
+
+364 | ((
+xmc
+[0] & 0x7) << 4)
+
+365 | ((
+xmc
+[1] & 0x7) << 1)
+
+366 | ((
+xmc
+[2] >> 2) & 0x1);
+
+367 *
+c
+++ = ((
+xmc
+[2] & 0x3) << 6)
+
+368 | ((
+xmc
+[3] & 0x7) << 3)
+
+369 | (
+xmc
+[4] & 0x7);
+
+370 *
+c
+++ = ((
+xmc
+[5] & 0x7) << 5)
+
+371 | ((
+xmc
+[6] & 0x7) << 2)
+
+372 | ((
+xmc
+[7] >> 1) & 0x3);
+
+373 *
+c
+++ = ((
+xmc
+[7] & 0x1) << 7)
+
+374 | ((
+xmc
+[8] & 0x7) << 4)
+
+375 | ((
+xmc
+[9] & 0x7) << 1)
+
+376 | ((
+xmc
+[10] >> 2) & 0x1);
+
+377 *
+c
+++ = ((
+xmc
+[10] & 0x3) << 6)
+
+378 | ((
+xmc
+[11] & 0x7) << 3)
+
+379 | (
+xmc
+[12] & 0x7);
+
+380 *
+c
+++ = ((
+Nc
+[1] & 0x7F) << 1)
+
+381 | ((
+bc
+[1] >> 1) & 0x1);
+
+382 *
+c
+++ = ((
+bc
+[1] & 0x1) << 7)
+
+383 | ((
+Mc
+[1] & 0x3) << 5)
+
+384 | ((
+xmaxc
+[1] >> 1) & 0x1F);
+
+385 *
+c
+++ = ((
+xmaxc
+[1] & 0x1) << 7)
+
+386 | ((
+xmc
+[13] & 0x7) << 4)
+
+387 | ((
+xmc
+[14] & 0x7) << 1)
+
+388 | ((
+xmc
+[15] >> 2) & 0x1);
+
+389 *
+c
+++ = ((
+xmc
+[15] & 0x3) << 6)
+
+390 | ((
+xmc
+[16] & 0x7) << 3)
+
+391 | (
+xmc
+[17] & 0x7);
+
+392 *
+c
+++ = ((
+xmc
+[18] & 0x7) << 5)
+
+393 | ((
+xmc
+[19] & 0x7) << 2)
+
+394 | ((
+xmc
+[20] >> 1) & 0x3);
+
+395 *
+c
+++ = ((
+xmc
+[20] & 0x1) << 7)
+
+396 | ((
+xmc
+[21] & 0x7) << 4)
+
+397 | ((
+xmc
+[22] & 0x7) << 1)
+
+398 | ((
+xmc
+[23] >> 2) & 0x1);
+
+399 *
+c
+++ = ((
+xmc
+[23] & 0x3) << 6)
+
+400 | ((
+xmc
+[24] & 0x7) << 3)
+
+401 | (
+xmc
+[25] & 0x7);
+
+402 *
+c
+++ = ((
+Nc
+[2] & 0x7F) << 1)
+
+403 | ((
+bc
+[2] >> 1) & 0x1);
+
+404 *
+c
+++ = ((
+bc
+[2] & 0x1) << 7)
+
+405 | ((
+Mc
+[2] & 0x3) << 5)
+
+406 | ((
+xmaxc
+[2] >> 1) & 0x1F);
+
+407 *
+c
+++ = ((
+xmaxc
+[2] & 0x1) << 7)
+
+408 | ((
+xmc
+[26] & 0x7) << 4)
+
+409 | ((
+xmc
+[27] & 0x7) << 1)
+
+410 | ((
+xmc
+[28] >> 2) & 0x1);
+
+411 *
+c
+++ = ((
+xmc
+[28] & 0x3) << 6)
+
+412 | ((
+xmc
+[29] & 0x7) << 3)
+
+413 | (
+xmc
+[30] & 0x7);
+
+414 *
+c
+++ = ((
+xmc
+[31] & 0x7) << 5)
+
+415 | ((
+xmc
+[32] & 0x7) << 2)
+
+416 | ((
+xmc
+[33] >> 1) & 0x3);
+
+417 *
+c
+++ = ((
+xmc
+[33] & 0x1) << 7)
+
+418 | ((
+xmc
+[34] & 0x7) << 4)
+
+419 | ((
+xmc
+[35] & 0x7) << 1)
+
+420 | ((
+xmc
+[36] >> 2) & 0x1);
+
+421 *
+c
+++ = ((
+xmc
+[36] & 0x3) << 6)
+
+422 | ((
+xmc
+[37] & 0x7) << 3)
+
+423 | (
+xmc
+[38] & 0x7);
+
+424 *
+c
+++ = ((
+Nc
+[3] & 0x7F) << 1)
+
+425 | ((
+bc
+[3] >> 1) & 0x1);
+
+426 *
+c
+++ = ((
+bc
+[3] & 0x1) << 7)
+
+427 | ((
+Mc
+[3] & 0x3) << 5)
+
+428 | ((
+xmaxc
+[3] >> 1) & 0x1F);
+
+429 *
+c
+++ = ((
+xmaxc
+[3] & 0x1) << 7)
+
+430 | ((
+xmc
+[39] & 0x7) << 4)
+
+431 | ((
+xmc
+[40] & 0x7) << 1)
+
+432 | ((
+xmc
+[41] >> 2) & 0x1);
+
+433 *
+c
+++ = ((
+xmc
+[41] & 0x3) << 6)
+
+434 | ((
+xmc
+[42] & 0x7) << 3)
+
+435 | (
+xmc
+[43] & 0x7);
+
+436 *
+c
+++ = ((
+xmc
+[44] & 0x7) << 5)
+
+437 | ((
+xmc
+[45] & 0x7) << 2)
+
+438 | ((
+xmc
+[46] >> 1) & 0x3);
+
+439 *
+c
+++ = ((
+xmc
+[46] & 0x1) << 7)
+
+440 | ((
+xmc
+[47] & 0x7) << 4)
+
+441 | ((
+xmc
+[48] & 0x7) << 1)
+
+442 | ((
+xmc
+[49] >> 2) & 0x1);
+
+443 *
+c
+++ = ((
+xmc
+[49] & 0x3) << 6)
+
+444 | ((
+xmc
+[50] & 0x7) << 3)
+
+445 | (
+xmc
+[51] & 0x7);
+
+448
+ }
+}
+
+ @gsm_option.c
+
+7 
+ ~"gsm610_´iv.h
+"
+
+9 
+ ~"gsm.h
+"
+
+11 
+ $gsm_ÝtiÚ
+ (
+gsm
+
+r
+, 
+Ýt
+, *
+v®
+)
+
+13 
+»suÉ
+ = -1;
+
+15 
+Ýt
+) {
+
+16 
+GSM_OPT_LTP_CUT
+:
+
+17 #ifdeà
+LTP_CUT
+
+
+18
+»suÉ
+ =
+r
+->
+Ép_cut
+;
+
+19 ià(
+v®
+r
+->
+Ép_cut
+ = *val;
+
+23 
+GSM_OPT_VERBOSE
+:
+
+24 #iâdef
+NDEBUG
+
+
+25
+»suÉ
+ =
+r
+->
+v”bo£
+;
+
+26 ià(
+v®
+r
+->
+v”bo£
+ = *val;
+
+30 
+GSM_OPT_FAST
+:
+
+32 #if
+ `defšed
+(
+FAST
+è&& defšed(
+USE_FLOAT_MUL
+)
+
+33
+»suÉ
+ =
+r
+->
+ç¡
+;
+
+34 ià(
+v®
+r
+->
+ç¡
+ = !!*val;
+
+38 
+GSM_OPT_FRAME_CHAIN
+:
+
+40 #ifdeà
+WAV49
+
+
+41
+»suÉ
+ =
+r
+->
+äame_chaš
+;
+
+42 ià(
+v®
+r
+->
+äame_chaš
+ = *val;
+
+46 
+GSM_OPT_FRAME_INDEX
+:
+
+48 #ifdeà
+WAV49
+
+
+49
+»suÉ
+ =
+r
+->
+äame_šdex
+;
+
+50 ià(
+v®
+r
+->
+äame_šdex
+ = *val;
+
+54 
+GSM_OPT_WAV49
+:
+
+56 #ifdeà
+WAV49
+
+
+57
+»suÉ
+ =
+r
+->
+wav_fmt
+;
+
+58 ià(
+v®
+r
+->
+wav_fmt
+ = !!*val;
+
+65 
+»suÉ
+;
+
+66
+ }
+}
+
+ @long_term.c
+
+7 
+ ~<¡dio.h
+>
+
+8 
+ ~<as£¹.h
+>
+
+10 
+ ~"gsm610_´iv.h
+"
+
+12 
+ ~"gsm.h
+"
+
+42 #iâdeà
+USE_FLOAT_MUL
+
+
+44 #ifdef
+LTP_CUT
+
+
+46 
+ $Cut_C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+ (
+
+48 
+gsm_¡©e
+ *
+,
+
+50 
+wÜd
+ *
+d
+,
+
+51 
+wÜd
+ *
+dp
+,
+
+52
+wÜd
+ *
+bc_out
+,
+
+53
+wÜd
+ *
+Nc_out
+
+
+56 
+k
+,
+Ïmbda
+;
+
+57
+wÜd
+
+Nc
+,
+bc
+;
+
+58
+wÜd
+
+wt
+[40];
+
+60
+lÚgwÜd
+
+L_»suÉ
+;
+
+61
+lÚgwÜd
+
+L_max
+,
+L_pow”
+;
+
+62
+wÜd
+
+R
+,
+S
+,
+dmax
+,
+sÿl
+,
+be¡_k
+;
+
+63
+wÜd
+
+Ép_cut
+;
+
+65 
+wÜd
+
+‹mp
+,
+wt_k
+;
+
+69
+dmax
+ = 0;
+
+70 
+k
+ = 0; k <= 39; k++) {
+
+71
+‹mp
+ =
+d
+[
+k
+];
+
+72
+‹mp
+ =
+ `GSM_ABS
+(emp );
+
+73 ià(
+‹mp
+ >
+dmax
+) {
+
+74
+dmax
+ =
+‹mp
+;
+
+75
+be¡_k
+ =
+k
+;
+
+78
+‹mp
+ = 0;
+
+79 ià(
+dmax
+ =ð0è
+sÿl
+ = 0;
+
+81
+ `as£¹
+(
+dmax
+ > 0);
+
+82
+‹mp
+ =
+ `gsm_nÜm
+Ð(
+lÚgwÜd
+)
+dmax
+ << 16 );
+
+84 ià(
+‹mp
+ > 6è
+sÿl
+ = 0;
+
+85
+sÿl
+ = 6 -
+‹mp
+;
+
+86
+ `as£¹
+(
+sÿl
+ >= 0);
+
+90
+L_max
+ = 0;
+
+91
+Nc
+ = 40;
+
+92
+wt_k
+ =
+ `SASR_W
+(
+d
+[
+be¡_k
+],
+sÿl
+);
+
+94 
+Ïmbda
+ = 40;†ambda <= 120;†ambda++) {
+
+95
+L_»suÉ
+ = (
+lÚgwÜd
+)
+wt_k
+ *
+dp
+[
+be¡_k
+ -
+Ïmbda
+];
+
+96 ià(
+L_»suÉ
+ >
+L_max
+) {
+
+97
+Nc
+ =
+Ïmbda
+;
+
+98
+L_max
+ =
+L_»suÉ
+;
+
+101 *
+Nc_out
+ =
+Nc
+;
+
+102
+L_max
+ <<= 1;
+
+106
+ `as£¹
+(
+sÿl
+ <= 100 && scal >= -100);
+
+107
+L_max
+ = L_max >> (6 -
+sÿl
+);
+
+109
+ `as£¹
+Nc
+ <= 120 && Nc >= 40);
+
+114
+L_pow”
+ = 0;
+
+115 
+k
+ = 0; k <= 39; k++) {
+
+117 
+lÚgwÜd
+
+L_‹mp
+;
+
+119
+L_‹mp
+ =
+ `SASR_W
+dp
+[
+k
+ -
+Nc
+], 3 );
+
+120
+L_pow”
+ +ð
+L_‹mp
+ * L_temp;
+
+122
+L_pow”
+ <<= 1;
+
+127 ià(
+L_max
+ <= 0) {
+
+128 *
+bc_out
+ = 0;
+
+131 ià(
+L_max
+ >ð
+L_pow”
+) {
+
+132 *
+bc_out
+ = 3;
+
+136
+‹mp
+ =
+ `gsm_nÜm
+L_pow”
+ );
+
+138
+R
+ =
+ `SASR
+L_max
+ <<
+‹mp
+, 16 );
+
+139
+S
+ =
+ `SASR
+L_pow”
+ <<
+‹mp
+, 16 );
+
+147 
+bc
+ = 0; bø<ð2; bc++èià(
+R
+ <ð
+ `gsm_muÉ
+(
+S
+,
+gsm_DLB
+[bc])) ;
+
+148 *
+bc_out
+ =
+bc
+;
+
+149
+ }
+}
+
+153 
+ $C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+ (
+
+154 
+wÜd
+ *
+d
+,
+
+155 
+wÜd
+ *
+dp
+,
+
+156
+wÜd
+ *
+bc_out
+,
+
+157
+wÜd
+ *
+Nc_out
+
+
+160 
+k
+,
+Ïmbda
+;
+
+161
+wÜd
+
+Nc
+,
+bc
+;
+
+162
+wÜd
+
+wt
+[40];
+
+164
+lÚgwÜd
+
+L_max
+,
+L_pow”
+;
+
+165
+wÜd
+
+R
+,
+S
+,
+dmax
+,
+sÿl
+;
+
+166 
+wÜd
+
+‹mp
+;
+
+170
+dmax
+ = 0;
+
+172 
+k
+ = 0; k <= 39; k++) {
+
+173
+‹mp
+ =
+d
+[
+k
+];
+
+174
+‹mp
+ =
+ `GSM_ABS
+(emp );
+
+175 ià(
+‹mp
+ >
+dmax
+) dmax =emp;
+
+178
+‹mp
+ = 0;
+
+179 ià(
+dmax
+ =ð0è
+sÿl
+ = 0;
+
+181
+ `as£¹
+(
+dmax
+ > 0);
+
+182
+‹mp
+ =
+ `gsm_nÜm
+Ð(
+lÚgwÜd
+)
+dmax
+ << 16 );
+
+185 ià(
+‹mp
+ > 6è
+sÿl
+ = 0;
+
+186
+sÿl
+ = 6 -
+‹mp
+;
+
+188
+ `as£¹
+(
+sÿl
+ >= 0);
+
+193 
+k
+ = 0; k <ð39; k++è
+wt
+[k] =
+ `SASR_W
+d
+[k],
+sÿl
+ );
+
+197
+L_max
+ = 0;
+
+198
+Nc
+ = 40;
+
+200 
+Ïmbda
+ = 40;†ambda <= 120;†ambda++) {
+
+202 #undeà
+STEP
+
+
+203 
+ #STEP
+(
+k
+è(
+lÚgwÜd
+)
+wt
+[k] *
+dp
+[k -
+Ïmbda
+]
+
+ )
+
+205 
+lÚgwÜd
+
+L_»suÉ
+;
+
+207
+L_»suÉ
+ =
+ `STEP
+(0) ; L_result += STEP(1) ;
+
+208
+L_»suÉ
+ +ð
+ `STEP
+(2) ; L_result += STEP(3) ;
+
+209
+L_»suÉ
+ +ð
+ `STEP
+(4) ; L_result += STEP(5) ;
+
+210
+L_»suÉ
+ +ð
+ `STEP
+(6) ; L_result += STEP(7) ;
+
+211
+L_»suÉ
+ +ð
+ `STEP
+(8) ; L_result += STEP(9) ;
+
+212
+L_»suÉ
+ +ð
+ `STEP
+(10) ; L_result += STEP(11) ;
+
+213
+L_»suÉ
+ +ð
+ `STEP
+(12) ; L_result += STEP(13) ;
+
+214
+L_»suÉ
+ +ð
+ `STEP
+(14) ; L_result += STEP(15) ;
+
+215
+L_»suÉ
+ +ð
+ `STEP
+(16) ; L_result += STEP(17) ;
+
+216
+L_»suÉ
+ +ð
+ `STEP
+(18) ; L_result += STEP(19) ;
+
+217
+L_»suÉ
+ +ð
+ `STEP
+(20) ; L_result += STEP(21) ;
+
+218
+L_»suÉ
+ +ð
+ `STEP
+(22) ; L_result += STEP(23) ;
+
+219
+L_»suÉ
+ +ð
+ `STEP
+(24) ; L_result += STEP(25) ;
+
+220
+L_»suÉ
+ +ð
+ `STEP
+(26) ; L_result += STEP(27) ;
+
+221
+L_»suÉ
+ +ð
+ `STEP
+(28) ; L_result += STEP(29) ;
+
+222
+L_»suÉ
+ +ð
+ `STEP
+(30) ; L_result += STEP(31) ;
+
+223
+L_»suÉ
+ +ð
+ `STEP
+(32) ; L_result += STEP(33) ;
+
+224
+L_»suÉ
+ +ð
+ `STEP
+(34) ; L_result += STEP(35) ;
+
+225
+L_»suÉ
+ +ð
+ `STEP
+(36) ; L_result += STEP(37) ;
+
+226
+L_»suÉ
+ +ð
+ `STEP
+(38) ; L_result += STEP(39) ;
+
+228 ià(
+L_»suÉ
+ >
+L_max
+) {
+
+230
+Nc
+ =
+Ïmbda
+;
+
+231
+L_max
+ =
+L_»suÉ
+;
+
+235 *
+Nc_out
+ =
+Nc
+;
+
+237
+L_max
+ <<= 1;
+
+241
+ `as£¹
+(
+sÿl
+ <= 100 && scal >= -100);
+
+242
+L_max
+ = L_max >> (6 -
+sÿl
+);
+
+244
+ `as£¹
+Nc
+ <= 120 && Nc >= 40);
+
+249
+L_pow”
+ = 0;
+
+250 
+k
+ = 0; k <= 39; k++) {
+
+252 
+lÚgwÜd
+
+L_‹mp
+;
+
+254
+L_‹mp
+ =
+ `SASR_W
+dp
+[
+k
+ -
+Nc
+], 3 );
+
+255
+L_pow”
+ +ð
+L_‹mp
+ * L_temp;
+
+257
+L_pow”
+ <<= 1;
+
+262 ià(
+L_max
+ <= 0) {
+
+263 *
+bc_out
+ = 0;
+
+266 ià(
+L_max
+ >ð
+L_pow”
+) {
+
+267 *
+bc_out
+ = 3;
+
+271
+‹mp
+ =
+ `gsm_nÜm
+L_pow”
+ );
+
+273
+R
+ =
+ `SASR_L
+L_max
+ <<
+‹mp
+, 16 );
+
+274
+S
+ =
+ `SASR_L
+L_pow”
+ <<
+‹mp
+, 16 );
+
+282 
+bc
+ = 0; bø<ð2; bc++èià(
+R
+ <ð
+ `gsm_muÉ
+(
+S
+,
+gsm_DLB
+[bc])) ;
+
+283 *
+bc_out
+ =
+bc
+;
+
+284
+ }
+}
+
+288 #ifdef
+LTP_CUT
+
+
+290 
+ $Cut_C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+ (
+
+291 
+gsm_¡©e
+ *
+,
+
+292 
+wÜd
+ *
+d
+,
+
+293 
+wÜd
+ *
+dp
+,
+
+294
+wÜd
+ *
+bc_out
+,
+
+295
+wÜd
+ *
+Nc_out
+
+
+298 
+k
+,
+Ïmbda
+;
+
+299
+wÜd
+
+Nc
+,
+bc
+;
+
+300
+wÜd
+
+Ép_cut
+;
+
+302 
+wt_æßt
+[40];
+
+303 
+dp_æßt_ba£
+[120], *
+dp_æßt
+ = dp_float_base + 120;
+
+305
+lÚgwÜd
+
+L_max
+,
+L_pow”
+;
+
+306
+wÜd
+
+R
+,
+S
+,
+dmax
+,
+sÿl
+;
+
+307 
+wÜd
+
+‹mp
+;
+
+311
+dmax
+ = 0;
+
+313 
+k
+ = 0; k <= 39; k++) {
+
+314
+‹mp
+ =
+d
+[
+k
+];
+
+315
+‹mp
+ =
+ `GSM_ABS
+(emp );
+
+316 ià(
+‹mp
+ >
+dmax
+) dmax =emp;
+
+319
+‹mp
+ = 0;
+
+320 ià(
+dmax
+ =ð0è
+sÿl
+ = 0;
+
+322
+ `as£¹
+(
+dmax
+ > 0);
+
+323
+‹mp
+ =
+ `gsm_nÜm
+Ð(
+lÚgwÜd
+)
+dmax
+ << 16 );
+
+326 ià(
+‹mp
+ > 6è
+sÿl
+ = 0;
+
+327
+sÿl
+ = 6 -
+‹mp
+;
+
+329
+ `as£¹
+(
+sÿl
+ >= 0);
+
+330
+Ép_cut
+ = (
+lÚgwÜd
+)
+ `SASR_W
+(
+dmax
+,
+sÿl
+è*
+->ltp_cut / 100;
+
+336 
+k
+ = 0; k < 40; k++) {
+
+337 
+wÜd
+
+w
+ =
+ `SASR_W
+d
+[
+k
+],
+sÿl
+ );
+
+338 ià(
+w
+ < 0 ? w > -
+Ép_cut
+ : w <†tp_cut) {
+
+339
+wt_æßt
+[
+k
+] = 0.0;
+
+342
+wt_æßt
+[
+k
+] =
+w
+;
+
+345 
+k
+ = -120; k < 0; k++è
+dp_æßt
+[k] =
+dp
+[k];
+
+349
+L_max
+ = 0;
+
+350
+Nc
+ = 40;
+
+352 
+Ïmbda
+ = 40;†ambda <= 120;†ambda += 9) {
+
+356 *
+ =
+dp_æßt
+ -
+Ïmbda
+;
+
+358 
+W
+;
+
+359 
+a
+ =
+[-8],
+b
+ =†p[-7],
+c
+ =†p[-6],
+
+360
+d
+ =
+[-5],
+e
+ =†p[-4],
+f
+ =†p[-3],
+
+361
+g
+ =
+[-2],
+h
+ =†p[-1];
+
+362 
+E
+;
+
+363 
+S0
+ = 0,
+S1
+ = 0,
+S2
+ = 0,
+S3
+ = 0,
+S4
+ = 0,
+
+364
+S5
+ = 0,
+S6
+ = 0,
+S7
+ = 0,
+S8
+ = 0;
+
+366 #undeà
+STEP
+
+
+367 
+ #STEP
+(
+K
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+) \
+
+368 ià((
+W
+ =
+wt_æßt
+[
+K
+]) != 0.0) { \
+
+369
+E
+ =
+W
+ *
+a
+;
+S8
+ += E; \
+
+370
+E
+ =
+W
+ *
+b
+;
+S7
+ += E; \
+
+371
+E
+ =
+W
+ *
+c
+;
+S6
+ += E; \
+
+372
+E
+ =
+W
+ *
+d
+;
+S5
+ += E; \
+
+373
+E
+ =
+W
+ *
+e
+;
+S4
+ += E; \
+
+374
+E
+ =
+W
+ *
+f
+;
+S3
+ += E; \
+
+375
+E
+ =
+W
+ *
+g
+;
+S2
+ += E; \
+
+376
+E
+ =
+W
+ *
+h
+;
+S1
+ += E; \
+
+377
+a
+ =
+[
+K
+]; \
+
+378
+E
+ =
+W
+ *
+a
+;
+S0
+ +ðE; } × =
+[
+K
+])
+
+ )
+
+380 
+ #STEP_A
+(
+K
+ `STEP
+(K,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+)
+
+ )
+
+381 
+ #STEP_B
+(
+K
+ `STEP
+(K,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+)
+
+ )
+
+382 
+ #STEP_C
+(
+K
+ `STEP
+(K,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+)
+
+ )
+
+383 
+ #STEP_D
+(
+K
+ `STEP
+(K,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+)
+
+ )
+
+384 
+ #STEP_E
+(
+K
+ `STEP
+(K,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+)
+
+ )
+
+385 
+ #STEP_F
+(
+K
+ `STEP
+(K,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+)
+
+ )
+
+386 
+ #STEP_G
+(
+K
+ `STEP
+(K,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+)
+
+ )
+
+387 
+ #STEP_H
+(
+K
+ `STEP
+(K,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+)
+
+ )
+
+389
+ `STEP_A
+Ð0);
+ `STEP_B
+Ð1);
+ `STEP_C
+Ð2);
+ `STEP_D
+( 3);
+
+390
+ `STEP_E
+Ð4);
+ `STEP_F
+Ð5);
+ `STEP_G
+Ð6);
+ `STEP_H
+( 7);
+
+392
+ `STEP_A
+Ð8);
+ `STEP_B
+Ð9);
+ `STEP_C
+(10);
+ `STEP_D
+(11);
+
+393
+ `STEP_E
+(12);
+ `STEP_F
+(13);
+ `STEP_G
+(14);
+ `STEP_H
+(15);
+
+395
+ `STEP_A
+(16);
+ `STEP_B
+(17);
+ `STEP_C
+(18);
+ `STEP_D
+(19);
+
+396
+ `STEP_E
+(20);
+ `STEP_F
+(21);
+ `STEP_G
+(22);
+ `STEP_H
+(23);
+
+398
+ `STEP_A
+(24);
+ `STEP_B
+(25);
+ `STEP_C
+(26);
+ `STEP_D
+(27);
+
+399
+ `STEP_E
+(28);
+ `STEP_F
+(29);
+ `STEP_G
+(30);
+ `STEP_H
+(31);
+
+401
+ `STEP_A
+(32);
+ `STEP_B
+(33);
+ `STEP_C
+(34);
+ `STEP_D
+(35);
+
+402
+ `STEP_E
+(36);
+ `STEP_F
+(37);
+ `STEP_G
+(38);
+ `STEP_H
+(39);
+
+404 ià(
+S0
+ >
+L_max
+è{ L_max = S0;
+Nc
+ =
+Ïmbda
+; }
+
+405 ià(
+S1
+ >
+L_max
+è{ L_max = S1;
+Nc
+ =
+Ïmbda
+ + 1; }
+
+406 ià(
+S2
+ >
+L_max
+è{ L_max = S2;
+Nc
+ =
+Ïmbda
+ + 2; }
+
+407 ià(
+S3
+ >
+L_max
+è{ L_max = S3;
+Nc
+ =
+Ïmbda
+ + 3; }
+
+408 ià(
+S4
+ >
+L_max
+è{ L_max = S4;
+Nc
+ =
+Ïmbda
+ + 4; }
+
+409 ià(
+S5
+ >
+L_max
+è{ L_max = S5;
+Nc
+ =
+Ïmbda
+ + 5; }
+
+410 ià(
+S6
+ >
+L_max
+è{ L_max = S6;
+Nc
+ =
+Ïmbda
+ + 6; }
+
+411 ià(
+S7
+ >
+L_max
+è{ L_max = S7;
+Nc
+ =
+Ïmbda
+ + 7; }
+
+412 ià(
+S8
+ >
+L_max
+è{ L_max = S8;
+Nc
+ =
+Ïmbda
+ + 8; }
+
+415 *
+Nc_out
+ =
+Nc
+;
+
+417
+L_max
+ <<= 1;
+
+421
+ `as£¹
+(
+sÿl
+ <= 100 && scal >= -100);
+
+422
+L_max
+ = L_max >> (6 -
+sÿl
+);
+
+424
+ `as£¹
+Nc
+ <= 120 && Nc >= 40);
+
+429
+L_pow”
+ = 0;
+
+430 
+k
+ = 0; k <= 39; k++) {
+
+432 
+lÚgwÜd
+
+L_‹mp
+;
+
+434
+L_‹mp
+ =
+ `SASR_W
+dp
+[
+k
+ -
+Nc
+], 3 );
+
+435
+L_pow”
+ +ð
+L_‹mp
+ * L_temp;
+
+437
+L_pow”
+ <<= 1;
+
+442 ià(
+L_max
+ <= 0) {
+
+443 *
+bc_out
+ = 0;
+
+446 ià(
+L_max
+ >ð
+L_pow”
+) {
+
+447 *
+bc_out
+ = 3;
+
+451
+‹mp
+ =
+ `gsm_nÜm
+L_pow”
+ );
+
+453
+R
+ =
+ `SASR
+L_max
+ <<
+‹mp
+, 16 );
+
+454
+S
+ =
+ `SASR
+L_pow”
+ <<
+‹mp
+, 16 );
+
+462 
+bc
+ = 0; bø<ð2; bc++èià(
+R
+ <ð
+ `gsm_muÉ
+(
+S
+,
+gsm_DLB
+[bc])) ;
+
+463 *
+bc_out
+ =
+bc
+;
+
+464
+ }
+}
+
+468 
+ $C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+ (
+
+469 
+wÜd
+ *
+dš
+,
+
+470 
+wÜd
+ *
+dp
+,
+
+471
+wÜd
+ *
+bc_out
+,
+
+472
+wÜd
+ *
+Nc_out
+
+
+475 
+k
+,
+Ïmbda
+;
+
+476
+wÜd
+
+Nc
+,
+bc
+;
+
+478 
+wt_æßt
+[40];
+
+479 
+dp_æßt_ba£
+[120], *
+dp_æßt
+ = dp_float_base + 120;
+
+481
+lÚgwÜd
+
+L_max
+,
+L_pow”
+;
+
+482
+wÜd
+
+R
+,
+S
+,
+dmax
+,
+sÿl
+;
+
+483 
+wÜd
+
+‹mp
+;
+
+487
+dmax
+ = 0;
+
+489 
+k
+ = 0; k <= 39; k++) {
+
+490
+‹mp
+ =
+dš
+ [
+k
+] ;
+
+491
+‹mp
+ =
+ `GSM_ABS
+ (temp) ;
+
+492 ià(
+‹mp
+ >
+dmax
+) dmax =emp;
+
+495
+‹mp
+ = 0;
+
+496 ià(
+dmax
+ =ð0è
+sÿl
+ = 0;
+
+498
+ `as£¹
+(
+dmax
+ > 0);
+
+499
+‹mp
+ =
+ `gsm_nÜm
+Ð(
+lÚgwÜd
+)
+dmax
+ << 16 );
+
+502 ià(
+‹mp
+ > 6è
+sÿl
+ = 0;
+
+503
+sÿl
+ = 6 -
+‹mp
+;
+
+505
+ `as£¹
+(
+sÿl
+ >= 0);
+
+510 
+k
+ = 0; k < 40; k++è
+wt_æßt
+[k] =
+ `SASR_W
+ (
+dš
+ [k],
+sÿl
+) ;
+
+511 
+k
+ = -120; k < 0; k++è
+dp_æßt
+[k] =
+dp
+[k];
+
+515
+L_max
+ = 0;
+
+516
+Nc
+ = 40;
+
+518 
+Ïmbda
+ = 40;†ambda <= 120;†ambda += 9) {
+
+522 *
+ =
+dp_æßt
+ -
+Ïmbda
+;
+
+524 
+W
+;
+
+525 
+a
+ =
+[-8],
+b
+ =†p[-7],
+c
+ =†p[-6],
+
+526
+d
+ =
+[-5],
+e
+ =†p[-4],
+f
+ =†p[-3],
+
+527
+g
+ =
+[-2],
+h
+ =†p[-1];
+
+528 
+E
+;
+
+529 
+S0
+ = 0,
+S1
+ = 0,
+S2
+ = 0,
+S3
+ = 0,
+S4
+ = 0,
+
+530
+S5
+ = 0,
+S6
+ = 0,
+S7
+ = 0,
+S8
+ = 0;
+
+532 #undeà
+STEP
+
+
+533 
+ #STEP
+(
+K
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+) \
+
+534
+W
+ =
+wt_æßt
+[
+K
+]; \
+
+535
+E
+ =
+W
+ *
+a
+;
+S8
+ += E; \
+
+536
+E
+ =
+W
+ *
+b
+;
+S7
+ += E; \
+
+537
+E
+ =
+W
+ *
+c
+;
+S6
+ += E; \
+
+538
+E
+ =
+W
+ *
+d
+;
+S5
+ += E; \
+
+539
+E
+ =
+W
+ *
+e
+;
+S4
+ += E; \
+
+540
+E
+ =
+W
+ *
+f
+;
+S3
+ += E; \
+
+541
+E
+ =
+W
+ *
+g
+;
+S2
+ += E; \
+
+542
+E
+ =
+W
+ *
+h
+;
+S1
+ += E; \
+
+543
+a
+ =
+[
+K
+]; \
+
+544
+E
+ =
+W
+ *
+a
+;
+S0
+ +ð
+ )
+E
+
+546 
+ #STEP_A
+(
+K
+ `STEP
+(K,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+)
+
+ )
+
+547 
+ #STEP_B
+(
+K
+ `STEP
+(K,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+)
+
+ )
+
+548 
+ #STEP_C
+(
+K
+ `STEP
+(K,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+)
+
+ )
+
+549 
+ #STEP_D
+(
+K
+ `STEP
+(K,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+)
+
+ )
+
+550 
+ #STEP_E
+(
+K
+ `STEP
+(K,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+)
+
+ )
+
+551 
+ #STEP_F
+(
+K
+ `STEP
+(K,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+)
+
+ )
+
+552 
+ #STEP_G
+(
+K
+ `STEP
+(K,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+)
+
+ )
+
+553 
+ #STEP_H
+(
+K
+ `STEP
+(K,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+)
+
+ )
+
+555
+ `STEP_A
+Ð0);
+ `STEP_B
+Ð1);
+ `STEP_C
+Ð2);
+ `STEP_D
+( 3);
+
+556
+ `STEP_E
+Ð4);
+ `STEP_F
+Ð5);
+ `STEP_G
+Ð6);
+ `STEP_H
+( 7);
+
+558
+ `STEP_A
+Ð8);
+ `STEP_B
+Ð9);
+ `STEP_C
+(10);
+ `STEP_D
+(11);
+
+559
+ `STEP_E
+(12);
+ `STEP_F
+(13);
+ `STEP_G
+(14);
+ `STEP_H
+(15);
+
+561
+ `STEP_A
+(16);
+ `STEP_B
+(17);
+ `STEP_C
+(18);
+ `STEP_D
+(19);
+
+562
+ `STEP_E
+(20);
+ `STEP_F
+(21);
+ `STEP_G
+(22);
+ `STEP_H
+(23);
+
+564
+ `STEP_A
+(24);
+ `STEP_B
+(25);
+ `STEP_C
+(26);
+ `STEP_D
+(27);
+
+565
+ `STEP_E
+(28);
+ `STEP_F
+(29);
+ `STEP_G
+(30);
+ `STEP_H
+(31);
+
+567
+ `STEP_A
+(32);
+ `STEP_B
+(33);
+ `STEP_C
+(34);
+ `STEP_D
+(35);
+
+568
+ `STEP_E
+(36);
+ `STEP_F
+(37);
+ `STEP_G
+(38);
+ `STEP_H
+(39);
+
+570 ià(
+S0
+ >
+L_max
+è{ L_max = S0;
+Nc
+ =
+Ïmbda
+; }
+
+571 ià(
+S1
+ >
+L_max
+è{ L_max = S1;
+Nc
+ =
+Ïmbda
+ + 1; }
+
+572 ià(
+S2
+ >
+L_max
+è{ L_max = S2;
+Nc
+ =
+Ïmbda
+ + 2; }
+
+573 ià(
+S3
+ >
+L_max
+è{ L_max = S3;
+Nc
+ =
+Ïmbda
+ + 3; }
+
+574 ià(
+S4
+ >
+L_max
+è{ L_max = S4;
+Nc
+ =
+Ïmbda
+ + 4; }
+
+575 ià(
+S5
+ >
+L_max
+è{ L_max = S5;
+Nc
+ =
+Ïmbda
+ + 5; }
+
+576 ià(
+S6
+ >
+L_max
+è{ L_max = S6;
+Nc
+ =
+Ïmbda
+ + 6; }
+
+577 ià(
+S7
+ >
+L_max
+è{ L_max = S7;
+Nc
+ =
+Ïmbda
+ + 7; }
+
+578 ià(
+S8
+ >
+L_max
+è{ L_max = S8;
+Nc
+ =
+Ïmbda
+ + 8; }
+
+580 *
+Nc_out
+ =
+Nc
+;
+
+582
+L_max
+ <<= 1;
+
+586
+ `as£¹
+(
+sÿl
+ <= 100 && scal >= -100);
+
+587
+L_max
+ = L_max >> (6 -
+sÿl
+);
+
+589
+ `as£¹
+Nc
+ <= 120 && Nc >= 40);
+
+594
+L_pow”
+ = 0;
+
+595 
+k
+ = 0; k <= 39; k++) {
+
+597 
+lÚgwÜd
+
+L_‹mp
+;
+
+599
+L_‹mp
+ =
+ `SASR_W
+dp
+[
+k
+ -
+Nc
+], 3 );
+
+600
+L_pow”
+ +ð
+L_‹mp
+ * L_temp;
+
+602
+L_pow”
+ <<= 1;
+
+607 ià(
+L_max
+ <= 0) {
+
+608 *
+bc_out
+ = 0;
+
+611 ià(
+L_max
+ >ð
+L_pow”
+) {
+
+612 *
+bc_out
+ = 3;
+
+616
+‹mp
+ =
+ `gsm_nÜm
+L_pow”
+ );
+
+618
+R
+ =
+ `SASR_L
+ (
+L_max
+ <<
+‹mp
+, 16 );
+
+619
+S
+ =
+ `SASR_L
+ (
+L_pow”
+ <<
+‹mp
+, 16 );
+
+627 
+bc
+ = 0; bø<ð2; bc++èià(
+R
+ <ð
+ `gsm_muÉ
+(
+S
+,
+gsm_DLB
+[bc])) ;
+
+628 *
+bc_out
+ =
+bc
+;
+
+629
+ }
+}
+
+631 #ifdef
+FAST
+
+
+632 #ifdef
+LTP_CUT
+
+
+634 
+ $Cut_Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+ (
+
+635 
+gsm_¡©e
+ *
+,
+
+636 
+wÜd
+ *
+d
+,
+
+637 
+wÜd
+ *
+dp
+,
+
+638
+wÜd
+ *
+bc_out
+,
+
+639
+wÜd
+ *
+Nc_out
+
+
+642 
+k
+,
+Ïmbda
+;
+
+643 
+wt_æßt
+;
+
+644
+wÜd
+
+Nc
+,
+bc
+;
+
+645
+wÜd
+
+wt_max
+,
+be¡_k
+,
+Ép_cut
+;
+
+647 
+dp_æßt_ba£
+[120], *
+dp_æßt
+ = dp_float_base + 120;
+
+649 
+L_»suÉ
+,
+L_max
+,
+L_pow”
+;
+
+651
+wt_max
+ = 0;
+
+653 
+k
+ = 0; k < 40; ++k) {
+
+654 iàÐ
+d
+[
+k
+] >
+wt_max
+èwt_max = d[
+be¡_k
+ = k];
+
+655 ià(-
+d
+[
+k
+] >
+wt_max
+èwt_max = -d[
+be¡_k
+ = k];
+
+658
+ `as£¹
+(
+wt_max
+ >= 0);
+
+659
+wt_æßt
+ = ()
+wt_max
+;
+
+661 
+k
+ = -120; k < 0; ++kè
+dp_æßt
+[k] = ()
+dp
+[k];
+
+665
+L_max
+ = 0;
+
+666
+Nc
+ = 40;
+
+668 
+Ïmbda
+ = 40;†ambda <= 120;†ambda++) {
+
+669
+L_»suÉ
+ =
+wt_æßt
+ *
+dp_æßt
+[
+be¡_k
+ -
+Ïmbda
+];
+
+670 ià(
+L_»suÉ
+ >
+L_max
+) {
+
+671
+Nc
+ =
+Ïmbda
+;
+
+672
+L_max
+ =
+L_»suÉ
+;
+
+676 *
+Nc_out
+ =
+Nc
+;
+
+677 ià(
+L_max
+ <= 0.) {
+
+678 *
+bc_out
+ = 0;
+
+685
+dp_æßt
+ -ð
+Nc
+;
+
+686
+L_pow”
+ = 0;
+
+687 
+k
+ = 0; k < 40; ++k) {
+
+688 
+f
+ =
+dp_æßt
+[
+k
+];
+
+689
+L_pow”
+ +ð
+f
+ * f;
+
+692 ià(
+L_max
+ >ð
+L_pow”
+) {
+
+693 *
+bc_out
+ = 3;
+
+701
+Ïmbda
+ =
+L_max
+ /
+L_pow”
+ * 32768.;
+
+702 
+bc
+ = 0; bø<ð2; ++bcèià(
+Ïmbda
+ <ð
+gsm_DLB
+[bc]) ;
+
+703 *
+bc_out
+ =
+bc
+;
+
+704
+ }
+}
+
+708 
+ $Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+ (
+
+709 
+wÜd
+ *
+dš
+,
+
+710 
+wÜd
+ *
+dp
+,
+
+711
+wÜd
+ *
+bc_out
+,
+
+712
+wÜd
+ *
+Nc_out
+
+
+715 
+k
+,
+Ïmbda
+;
+
+716
+wÜd
+
+Nc
+,
+bc
+;
+
+718 
+wt_æßt
+[40];
+
+719 
+dp_æßt_ba£
+[120], *
+dp_æßt
+ = dp_float_base + 120;
+
+721 
+L_max
+,
+L_pow”
+;
+
+723 
+k
+ = 0; k < 40; ++kè
+wt_æßt
+[k] = (è
+dš
+ [k] ;
+
+724 
+k
+ = -120; k < 0; ++kè
+dp_æßt
+[k] = (è
+dp
+ [k] ;
+
+728
+L_max
+ = 0;
+
+729
+Nc
+ = 40;
+
+731 
+Ïmbda
+ = 40;†ambda <= 120;†ambda += 9) {
+
+735 *
+ =
+dp_æßt
+ -
+Ïmbda
+;
+
+737 
+W
+;
+
+738 
+a
+ =
+[-8],
+b
+ =†p[-7],
+c
+ =†p[-6],
+
+739
+d
+ =
+[-5],
+e
+ =†p[-4],
+f
+ =†p[-3],
+
+740
+g
+ =
+[-2],
+h
+ =†p[-1];
+
+741 
+E
+;
+
+742 
+S0
+ = 0,
+S1
+ = 0,
+S2
+ = 0,
+S3
+ = 0,
+S4
+ = 0,
+
+743
+S5
+ = 0,
+S6
+ = 0,
+S7
+ = 0,
+S8
+ = 0;
+
+745 #undeà
+STEP
+
+
+746 
+ #STEP
+(
+K
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+) \
+
+747
+W
+ =
+wt_æßt
+[
+K
+]; \
+
+748
+E
+ =
+W
+ *
+a
+;
+S8
+ += E; \
+
+749
+E
+ =
+W
+ *
+b
+;
+S7
+ += E; \
+
+750
+E
+ =
+W
+ *
+c
+;
+S6
+ += E; \
+
+751
+E
+ =
+W
+ *
+d
+;
+S5
+ += E; \
+
+752
+E
+ =
+W
+ *
+e
+;
+S4
+ += E; \
+
+753
+E
+ =
+W
+ *
+f
+;
+S3
+ += E; \
+
+754
+E
+ =
+W
+ *
+g
+;
+S2
+ += E; \
+
+755
+E
+ =
+W
+ *
+h
+;
+S1
+ += E; \
+
+756
+a
+ =
+[
+K
+]; \
+
+757
+E
+ =
+W
+ *
+a
+;
+S0
+ +ð
+ )
+E
+
+759 
+ #STEP_A
+(
+K
+ `STEP
+(K,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+)
+
+ )
+
+760 
+ #STEP_B
+(
+K
+ `STEP
+(K,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+)
+
+ )
+
+761 
+ #STEP_C
+(
+K
+ `STEP
+(K,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+)
+
+ )
+
+762 
+ #STEP_D
+(
+K
+ `STEP
+(K,
+d
+,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+)
+
+ )
+
+763 
+ #STEP_E
+(
+K
+ `STEP
+(K,
+e
+,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+)
+
+ )
+
+764 
+ #STEP_F
+(
+K
+ `STEP
+(K,
+f
+,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+)
+
+ )
+
+765 
+ #STEP_G
+(
+K
+ `STEP
+(K,
+g
+,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+)
+
+ )
+
+766 
+ #STEP_H
+(
+K
+ `STEP
+(K,
+h
+,
+a
+,
+b
+,
+c
+,
+d
+,
+e
+,
+f
+,
+g
+)
+
+ )
+
+768
+ `STEP_A
+Ð0);
+ `STEP_B
+Ð1);
+ `STEP_C
+Ð2);
+ `STEP_D
+( 3);
+
+769
+ `STEP_E
+Ð4);
+ `STEP_F
+Ð5);
+ `STEP_G
+Ð6);
+ `STEP_H
+( 7);
+
+771
+ `STEP_A
+Ð8);
+ `STEP_B
+Ð9);
+ `STEP_C
+(10);
+ `STEP_D
+(11);
+
+772
+ `STEP_E
+(12);
+ `STEP_F
+(13);
+ `STEP_G
+(14);
+ `STEP_H
+(15);
+
+774
+ `STEP_A
+(16);
+ `STEP_B
+(17);
+ `STEP_C
+(18);
+ `STEP_D
+(19);
+
+775
+ `STEP_E
+(20);
+ `STEP_F
+(21);
+ `STEP_G
+(22);
+ `STEP_H
+(23);
+
+777
+ `STEP_A
+(24);
+ `STEP_B
+(25);
+ `STEP_C
+(26);
+ `STEP_D
+(27);
+
+778
+ `STEP_E
+(28);
+ `STEP_F
+(29);
+ `STEP_G
+(30);
+ `STEP_H
+(31);
+
+780
+ `STEP_A
+(32);
+ `STEP_B
+(33);
+ `STEP_C
+(34);
+ `STEP_D
+(35);
+
+781
+ `STEP_E
+(36);
+ `STEP_F
+(37);
+ `STEP_G
+(38);
+ `STEP_H
+(39);
+
+783 ià(
+S0
+ >
+L_max
+è{ L_max = S0;
+Nc
+ =
+Ïmbda
+; }
+
+784 ià(
+S1
+ >
+L_max
+è{ L_max = S1;
+Nc
+ =
+Ïmbda
+ + 1; }
+
+785 ià(
+S2
+ >
+L_max
+è{ L_max = S2;
+Nc
+ =
+Ïmbda
+ + 2; }
+
+786 ià(
+S3
+ >
+L_max
+è{ L_max = S3;
+Nc
+ =
+Ïmbda
+ + 3; }
+
+787 ià(
+S4
+ >
+L_max
+è{ L_max = S4;
+Nc
+ =
+Ïmbda
+ + 4; }
+
+788 ià(
+S5
+ >
+L_max
+è{ L_max = S5;
+Nc
+ =
+Ïmbda
+ + 5; }
+
+789 ià(
+S6
+ >
+L_max
+è{ L_max = S6;
+Nc
+ =
+Ïmbda
+ + 6; }
+
+790 ià(
+S7
+ >
+L_max
+è{ L_max = S7;
+Nc
+ =
+Ïmbda
+ + 7; }
+
+791 ià(
+S8
+ >
+L_max
+è{ L_max = S8;
+Nc
+ =
+Ïmbda
+ + 8; }
+
+793 *
+Nc_out
+ =
+Nc
+;
+
+795 ià(
+L_max
+ <= 0.) {
+
+796 *
+bc_out
+ = 0;
+
+803
+dp_æßt
+ -ð
+Nc
+;
+
+804
+L_pow”
+ = 0;
+
+805 
+k
+ = 0; k < 40; ++k) {
+
+806 
+f
+ =
+dp_æßt
+[
+k
+];
+
+807
+L_pow”
+ +ð
+f
+ * f;
+
+810 ià(
+L_max
+ >ð
+L_pow”
+) {
+
+811 *
+bc_out
+ = 3;
+
+819
+Ïmbda
+ =
+L_max
+ /
+L_pow”
+ * 32768.;
+
+820 
+bc
+ = 0; bø<ð2; ++bcèià(
+Ïmbda
+ <ð
+gsm_DLB
+[bc]) ;
+
+821 *
+bc_out
+ =
+bc
+;
+
+822
+ }
+}
+
+830 
+ $LÚg_‹rm_ª®ysis_fž‹ršg
+ (
+
+831
+wÜd
+
+bc
+,
+
+832
+wÜd
+
+Nc
+,
+
+833 
+wÜd
+ *
+dp
+,
+
+834 
+wÜd
+ *
+d
+,
+
+835 
+wÜd
+ *
+dµ
+,
+
+836 
+wÜd
+ *
+e
+
+
+845 
+k
+;
+
+847 #undeà
+STEP
+
+
+848 
+ #STEP
+(
+BP
+) \
+
+849 
+k
+ = 0; k <= 39; k++) { \
+
+850
+dµ
+[
+k
+] =
+ `GSM_MULT_R
+BP
+,
+dp
+[k -
+Nc
+]); \
+
+851
+e
+[
+k
+] =
+ `GSM_SUB
+d
+[k],
+dµ
+[k] ); \
+
+852 }
+
+ )
+
+854 
+bc
+) {
+
+855 0:
+ `STEP
+( 3277 ); ;
+
+856 1:
+ `STEP
+( 11469 ); ;
+
+857 2:
+ `STEP
+( 21299 ); ;
+
+858 3:
+ `STEP
+( 32767 ); ;
+
+860
+ }
+}
+
+862 
+ $Gsm_LÚg_T”m_P»diùÜ
+ (
+
+864 
+gsm_¡©e
+ *
+S
+,
+
+866
+wÜd
+ *
+d
+,
+
+867
+wÜd
+ *
+dp
+,
+
+869
+wÜd
+ *
+e
+,
+
+870
+wÜd
+ *
+dµ
+,
+
+871
+wÜd
+ *
+Nc
+,
+
+872
+wÜd
+ *
+bc
+
+
+875
+ `as£¹
+d
+ );‡s£¹Ð
+dp
+ );‡s£¹Ð
+e
+ );
+
+876
+ `as£¹
+dµ
+);‡s£¹Ð
+Nc
+ );‡s£¹Ð
+bc
+ );
+
+878 #ià
+ `defšed
+(
+FAST
+è&& defšed(
+USE_FLOAT_MUL
+)
+
+879 ià(
+S
+->
+ç¡
+)
+
+880 #ià
+ `defšed
+ (
+LTP_CUT
+)
+
+881 ià(
+S
+->
+Ép_cut
+)
+
+882
+ `Cut_Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+(
+S
+,
+
+883
+d
+,
+dp
+,
+bc
+,
+Nc
+);
+
+886
+ `Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+(
+d
+,
+dp
+,
+bc
+,
+Nc
+ );
+
+889 #ifdeà
+LTP_CUT
+
+
+890 ià(
+S
+->
+Ép_cut
+)
+
+891
+ `Cut_C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+(
+S
+,
+d
+,
+dp
+,
+bc
+,
+Nc
+);
+
+894
+ `C®cuÏtiÚ_of_the_LTP_·¿m‘”s
+(
+d
+,
+dp
+,
+bc
+,
+Nc
+);
+
+896
+ `LÚg_‹rm_ª®ysis_fž‹ršg
+Ð*
+bc
+, *
+Nc
+,
+dp
+,
+d
+,
+dµ
+,
+e
+ );
+
+897
+ }
+}
+
+900 
+ $Gsm_LÚg_T”m_SyÁhesis_Fž‹ršg
+ (
+
+901 
+gsm_¡©e
+ *
+S
+,
+
+903
+wÜd
+
+Nü
+,
+
+904
+wÜd
+
+bü
+,
+
+905 
+wÜd
+ *
+”p
+,
+
+906 
+wÜd
+ *
+d½
+
+
+914 
+k
+;
+
+915
+wÜd
+
+b½
+,
+d½p
+,
+Nr
+;
+
+919
+Nr
+ =
+Nü
+ < 40 || Nü > 120 ?
+S
+->
+Äp
+ : Ncr;
+
+920
+S
+->
+Äp
+ =
+Nr
+;
+
+921
+ `as£¹
+(
+Nr
+ >= 40 && Nr <= 120);
+
+925
+b½
+ =
+gsm_QLB
+[
+bü
+ ];
+
+930
+ `as£¹
+(
+b½
+ !ð
+MIN_WORD
+);
+
+932 
+k
+ = 0; k <= 39; k++) {
+
+933
+d½p
+ =
+ `GSM_MULT_R
+b½
+,
+d½
+[
+k
+ -
+Nr
+ ] );
+
+934
+d½
+[
+k
+] =
+ `GSM_ADD
+”p
+[k],
+d½p
+ );
+
+942 
+k
+ = 0; k <ð119; k++è
+d½
+[ -120 + k ] = drp[ -80 + k ];
+
+943
+ }
+}
+
+ @lpc.c
+
+7 
+ ~<¡dio.h
+>
+
+8 
+ ~<as£¹.h
+>
+
+10 
+ ~"gsm610_´iv.h
+"
+
+12 
+ ~"gsm.h
+"
+
+21 
+ $AutocÜ»ÏtiÚ
+ (
+
+22
+wÜd
+ *
+s
+,
+
+23
+lÚgwÜd
+ *
+L_ACF
+)
+
+29 
+k
+,
+i
+;
+
+31
+wÜd
+
+‹mp
+,
+smax
+,
+sÿÏuto
+;
+
+33 #ifdef
+USE_FLOAT_MUL
+
+
+34 
+æßt_s
+[160];
+
+42
+smax
+ = 0;
+
+43 
+k
+ = 0; k <= 159; k++) {
+
+44
+‹mp
+ =
+ `GSM_ABS
+s
+[
+k
+] );
+
+45 ià(
+‹mp
+ >
+smax
+) smax =emp;
+
+50 ià(
+smax
+ =ð0è
+sÿÏuto
+ = 0;
+
+52
+ `as£¹
+(
+smax
+ > 0);
+
+53
+sÿÏuto
+ = 4 -
+ `gsm_nÜm
+Ð(
+lÚgwÜd
+)
+smax
+ << 16 );
+
+59 ià(
+sÿÏuto
+ > 0) {
+
+61 #ifdeà
+USE_FLOAT_MUL
+
+
+62 
+ #SCALE
+(
+n
+) \
+
+63 
+n
+: 
+k
+ = 0; k <= 159; k++) \
+
+64
+æßt_s
+[
+k
+] = () \
+
+65 (
+s
+[
+k
+] =
+ `GSM_MULT_R
+(s[k], 16384 >> (
+n
+-1)));\
+
+66 ;
+
+ )
+
+68 
+ #SCALE
+(
+n
+) \
+
+69 
+n
+: 
+k
+ = 0; k <= 159; k++) \
+
+70
+s
+[
+k
+] =
+ `GSM_MULT_R
+Ðs[k], 16384 >> (
+n
+-1) );\
+
+71 ;
+
+ )
+
+74 
+sÿÏuto
+) {
+
+75
+ `SCALE
+(1)
+
+76
+ `SCALE
+(2)
+
+77
+ `SCALE
+(3)
+
+78
+ `SCALE
+(4)
+
+80 #undeà
+SCALE
+
+
+82 #ifdef
+USE_FLOAT_MUL
+
+
+83 
+k
+ = 0; k <ð159; k++è
+æßt_s
+[k] = (è
+s
+[k];
+
+89 #ifdef
+USE_FLOAT_MUL
+
+
+90 *
+ =
+æßt_s
+;
+
+91 
+ = *
+;
+
+93 
+ #STEP
+(
+k
+L_ACF
+[k] +ð(
+lÚgwÜd
+)(
+ *
+[ -(kè]);
+
+ )
+
+95
+wÜd
+ *
+ =
+s
+;
+
+96
+wÜd
+
+ = *
+;
+
+98 
+ #STEP
+(
+k
+L_ACF
+[k] +ð((
+lÚgwÜd
+)
+ *
+[ -(kè]);
+
+ )
+
+101 
+ #NEXTI
+
+ = *++
+
+
+ )
+
+104 
+k
+ = 9; k--;
+L_ACF
+[k] = 0) ;
+
+106
+ `STEP
+ (0);
+
+107
+NEXTI
+;
+
+108
+ `STEP
+(0); STEP(1);
+
+109
+NEXTI
+;
+
+110
+ `STEP
+(0); STEP(1); STEP(2);
+
+111
+NEXTI
+;
+
+112
+ `STEP
+(0); STEP(1); STEP(2); STEP(3);
+
+113
+NEXTI
+;
+
+114
+ `STEP
+(0); STEP(1); STEP(2); STEP(3); STEP(4);
+
+115
+NEXTI
+;
+
+116
+ `STEP
+(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
+
+117
+NEXTI
+;
+
+118
+ `STEP
+(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
+
+119
+NEXTI
+;
+
+120
+ `STEP
+(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
+
+122 
+i
+ = 8; i <= 159; i++) {
+
+124
+NEXTI
+;
+
+126
+ `STEP
+(0);
+
+127
+ `STEP
+(1); STEP(2); STEP(3); STEP(4);
+
+128
+ `STEP
+(5); STEP(6); STEP(7); STEP(8);
+
+131 
+k
+ = 9; k--;
+L_ACF
+[k] <<= 1) ;
+
+136 ià(
+sÿÏuto
+ > 0) {
+
+137
+ `as£¹
+(
+sÿÏuto
+ <= 4);
+
+138 
+k
+ = 160; k--; *
+s
+++ <<ð
+sÿÏuto
+) ;
+
+140
+ }
+}
+
+142 #ià
+defšed
+(
+USE_FLOAT_MUL
+è&& defšed(
+FAST
+)
+
+144 
+ $Fa¡_AutocÜ»ÏtiÚ
+ (
+
+145
+wÜd
+ *
+s
+,
+
+146
+lÚgwÜd
+ *
+L_ACF
+)
+
+148 
+k
+,
+i
+;
+
+149 
+f_L_ACF
+[9];
+
+150 
+sÿË
+;
+
+152 
+s_f
+[160];
+
+153 *
+sf
+ =
+s_f
+;
+
+155 
+i
+ = 0; i < 160; ++iè
+sf
+[i] =
+s
+[i];
+
+156 
+k
+ = 0; k <= 8; k++) {
+
+157 
+L_‹mp2
+ = 0;
+
+158 *
+sæ
+ =
+sf
+ -
+k
+;
+
+159 
+i
+ =
+k
+; i < 160; ++iè
+L_‹mp2
+ +ð
+sf
+[i] *
+sæ
+[i];
+
+160
+f_L_ACF
+[
+k
+] =
+L_‹mp2
+;
+
+162
+sÿË
+ =
+MAX_LONGWORD
+ /
+f_L_ACF
+[0];
+
+164 
+k
+ = 0; k <= 8; k++) {
+
+165
+L_ACF
+[
+k
+] =
+f_L_ACF
+[k] *
+sÿË
+;
+
+167
+ }
+}
+
+172 
+ $ReæeùiÚ_cÛffic›Ás
+ (
+
+173
+lÚgwÜd
+ *
+L_ACF
+,
+
+174 
+wÜd
+ *
+r
+
+
+177 
+i
+,
+m
+,
+n
+;
+
+178 
+wÜd
+
+‹mp
+;
+
+179
+wÜd
+
+ACF
+[9];
+
+180
+wÜd
+
+P
+[ 9];
+
+181
+wÜd
+
+K
+[ 9];
+
+186 ià(
+L_ACF
+[0] == 0) {
+
+187 
+i
+ = 8; i--; *
+r
+++ = 0) ;
+
+191
+ `as£¹
+L_ACF
+[0] != 0 );
+
+192
+‹mp
+ =
+ `gsm_nÜm
+L_ACF
+[0] );
+
+194
+ `as£¹
+(
+‹mp
+ >= 0 &&emp < 32);
+
+197 
+i
+ = 0; i <ð8; i++è
+ACF
+[i] =
+ `SASR_L
+L_ACF
+[i] <<
+‹mp
+, 16 );
+
+202 
+i
+ = 1; i <ð7; i++è
+K
+[ i ] =
+ACF
+[ i ];
+
+203 
+i
+ = 0; i <ð8; i++è
+P
+[ i ] =
+ACF
+[ i ];
+
+207 
+n
+ = 1;‚ <ð8;‚++,
+r
+++) {
+
+209
+‹mp
+ =
+P
+[1];
+
+210
+‹mp
+ =
+ `GSM_ABS
+(temp);
+
+211 ià(
+P
+[0] <
+‹mp
+) {
+
+212 
+i
+ =
+n
+; i <ð8; i++è*
+r
+++ = 0;
+
+216 *
+r
+ =
+ `gsm_div
+‹mp
+,
+P
+[0] );
+
+218
+ `as£¹
+(*
+r
+ >= 0);
+
+219 ià(
+P
+[1] > 0è*
+r
+ = -*r;
+
+220
+ `as£¹
+ (*
+r
+ !ð
+MIN_WORD
+);
+
+221 ià(
+n
+ == 8) ;
+
+225
+‹mp
+ =
+ `GSM_MULT_R
+P
+[1], *
+r
+ );
+
+226
+P
+[0] =
+ `GSM_ADD
+ÐP[0],
+‹mp
+ );
+
+228 
+m
+ = 1; m <ð8 -
+n
+; m++) {
+
+229
+‹mp
+ =
+ `GSM_MULT_R
+K
+[
+m
+ ], *
+r
+ );
+
+230
+P
+[
+m
+] =
+ `GSM_ADD
+ÐP[ m+1 ],
+‹mp
+ );
+
+232
+‹mp
+ =
+ `GSM_MULT_R
+P
+[
+m
++1 ], *
+r
+ );
+
+233
+K
+[
+m
+] =
+ `GSM_ADD
+ÐK[ m ],
+‹mp
+ );
+
+236
+ }
+}
+
+240 
+ $T¿nsfÜm©iÚ_to_Log_A»a_R©ios
+ (
+
+241 
+wÜd
+ *
+r
+
+
+251 
+wÜd
+
+‹mp
+;
+
+252 
+i
+;
+
+257 
+i
+ = 1; i <ð8; i++,
+r
+++) {
+
+259
+‹mp
+ = *
+r
+;
+
+260
+‹mp
+ =
+ `GSM_ABS
+(temp);
+
+261
+ `as£¹
+(
+‹mp
+ >= 0);
+
+263 ià(
+‹mp
+ < 22118) {
+
+264
+‹mp
+ >>= 1;
+
+265 } ià(
+‹mp
+ < 31130) {
+
+266
+ `as£¹
+‹mp
+ >= 11059 );
+
+267
+‹mp
+ -= 11059;
+
+269
+ `as£¹
+‹mp
+ >= 26112 );
+
+270
+‹mp
+ -= 26112;
+
+271
+‹mp
+ <<= 2;
+
+274 *
+r
+ = *¸< 0 ? -
+‹mp
+ :emp;
+
+275
+ `as£¹
+Ð*
+r
+ !ð
+MIN_WORD
+ );
+
+277
+ }
+}
+
+281 
+ $Quªtiz©iÚ_ªd_codšg
+ (
+
+282 
+wÜd
+ *
+LAR
+
+
+285 
+wÜd
+
+‹mp
+;
+
+296 #undeà
+STEP
+
+
+297 
+ #STEP
+A
+,
+B
+,
+MAC
+,
+MIC
+ ) \
+
+298
+‹mp
+ =
+ `GSM_MULT
+A
+, *
+LAR
+ ); \
+
+299
+‹mp
+ =
+ `GSM_ADD
+Ћmp,
+B
+ ); \
+
+300
+‹mp
+ =
+ `GSM_ADD
+(emp, 256 ); \
+
+301
+‹mp
+ =
+ `SASR_W
+(emp, 9 ); \
+
+302 *
+LAR
+ =
+‹mp
+>
+MAC
+ ? MAC -
+MIC
+ : (temp<MIC ? 0 :emp - MIC); \
+
+303
+LAR
+++;
+
+ )
+
+305
+ `STEP
+( 20480, 0, 31, -32 );
+
+306
+ `STEP
+( 20480, 0, 31, -32 );
+
+307
+ `STEP
+( 20480, 2048, 15, -16 );
+
+308
+ `STEP
+( 20480, -2560, 15, -16 );
+
+310
+ `STEP
+( 13964, 94, 7, -8 );
+
+311
+ `STEP
+( 15360, -1792, 7, -8 );
+
+312
+ `STEP
+( 8534, -341, 3, -4 );
+
+313
+ `STEP
+( 9036, -1144, 3, -4 );
+
+315 #undeà
+STEP
+
+
+316
+ }
+}
+
+318 
+ $Gsm_LPC_AÇlysis
+ (
+
+319 
+gsm_¡©e
+ *
+S
+,
+
+320
+wÜd
+ *
+s
+,
+
+321
+wÜd
+ *
+LARc
+)
+
+323
+lÚgwÜd
+
+L_ACF
+[9];
+
+325 #ià
+ `defšed
+(
+USE_FLOAT_MUL
+è&& defšed(
+FAST
+)
+
+326 ià(
+S
+->
+ç¡
+ `Fa¡_AutocÜ»ÏtiÚ
+ (
+s
+,
+L_ACF
+ );
+
+329
+ `AutocÜ»ÏtiÚ
+ (
+s
+,
+L_ACF
+ );
+
+330
+ `ReæeùiÚ_cÛffic›Ás
+ (
+L_ACF
+,
+LARc
+ );
+
+331
+ `T¿nsfÜm©iÚ_to_Log_A»a_R©ios
+ (
+LARc
+);
+
+332
+ `Quªtiz©iÚ_ªd_codšg
+ (
+LARc
+);
+
+333
+ }
+}
+
+ @preprocess.c
+
+7 
+ ~<¡dio.h
+>
+
+8 
+ ~<as£¹.h
+>
+
+10 
+ ~"gsm610_´iv.h
+"
+
+12 
+ ~"gsm.h
+"
+
+31 
+ $Gsm_P»´oûss
+ (
+
+32 
+gsm_¡©e
+ *
+S
+,
+
+33
+wÜd
+ *
+s
+,
+
+34
+wÜd
+ *
+so
+ )
+
+37
+wÜd
+
+z1
+ =
+S
+->z1;
+
+38
+lÚgwÜd
+
+L_z2
+ =
+S
+->L_z2;
+
+39
+wÜd
+
+mp
+ =
+S
+->mp;
+
+41
+wÜd
+
+s1
+;
+
+42
+lÚgwÜd
+
+L_s2
+;
+
+44
+lÚgwÜd
+
+L_‹mp
+;
+
+46
+wÜd
+
+m¥
+,
+l¥
+;
+
+47
+wÜd
+
+SO
+;
+
+49 
+k
+ = 160;
+
+51 
+k
+--) {
+
+55
+SO
+ =
+ `SASR_W
+Ð*
+s
+, 3 ) << 2;
+
+56
+s
+++;
+
+58
+ `as£¹
+ (
+SO
+ >= -0x4000);
+
+59
+ `as£¹
+ (
+SO
+ <= 0x3FFC);
+
+72
+s1
+ =
+SO
+ -
+z1
+;
+
+73
+z1
+ =
+SO
+;
+
+75
+ `as£¹
+(
+s1
+ !ð
+MIN_WORD
+);
+
+79
+L_s2
+ =
+s1
+;
+
+80
+L_s2
+ <<= 15;
+
+85
+m¥
+ =
+ `SASR_L
+L_z2
+, 15 );
+
+86
+l¥
+ =
+L_z2
+-((
+lÚgwÜd
+)
+m¥
+<<15);
+
+88
+L_s2
+ +ð
+ `GSM_MULT_R
+l¥
+, 32735 );
+
+89
+L_‹mp
+ = (
+lÚgwÜd
+)
+m¥
+ * 32735;
+
+90
+L_z2
+ =
+ `GSM_L_ADD
+L_‹mp
+,
+L_s2
+ );
+
+94
+L_‹mp
+ =
+ `GSM_L_ADD
+L_z2
+, 16384 );
+
+99
+m¥
+ =
+ `GSM_MULT_R
+mp
+, -28180 );
+
+100
+mp
+ =
+ `SASR_L
+L_‹mp
+, 15 );
+
+101 *
+so
+++ =
+ `GSM_ADD
+mp
+,
+m¥
+ );
+
+104
+S
+->
+z1
+ = z1;
+
+105
+S
+->
+L_z2
+ = L_z2;
+
+106
+S
+->
+mp
+ = mp;
+
+107
+ }
+}
+
+ @rpe.c
+
+7 
+ ~<¡dio.h
+>
+
+8 
+ ~<as£¹.h
+>
+
+10 
+ ~"gsm610_´iv.h
+"
+
+12 
+ ~"gsm.h
+"
+
+19 
+ $Weightšg_fž‹r
+ (
+
+20 
+wÜd
+ *
+e
+,
+
+21
+wÜd
+ *
+x
+
+
+32 
+lÚgwÜd
+
+L_»suÉ
+;
+
+33 
+k
+ ;
+
+45
+e
+ -= 5;
+
+49 
+k
+ = 0; k <= 39; k++) {
+
+51
+L_»suÉ
+ = 8192 >> 1;
+
+59 #undeà
+STEP
+
+
+60 
+ #STEP
+i
+,
+H
+ ) (
+e
+[
+k
+ + i ] * (
+lÚgwÜd
+)H)
+
+ )
+
+67 #ifdef
+STUPID_COMPILER
+
+
+68
+L_»suÉ
+ +ð
+ `STEP
+( 0, -134 ) ;
+
+69
+L_»suÉ
+ +ð
+ `STEP
+( 1, -374 ) ;
+
+71
+L_»suÉ
+ +ð
+ `STEP
+( 3, 2054 ) ;
+
+72
+L_»suÉ
+ +ð
+ `STEP
+( 4, 5741 ) ;
+
+73
+L_»suÉ
+ +ð
+ `STEP
+( 5, 8192 ) ;
+
+74
+L_»suÉ
+ +ð
+ `STEP
+( 6, 5741 ) ;
+
+75
+L_»suÉ
+ +ð
+ `STEP
+( 7, 2054 ) ;
+
+77
+L_»suÉ
+ +ð
+ `STEP
+( 9, -374 ) ;
+
+78
+L_»suÉ
+ +ð
+ `STEP
+( 10, -134 ) ;
+
+80
+L_»suÉ
+ +=
+
+81
+ `STEP
+( 0, -134 )
+
+82 +
+ `STEP
+( 1, -374 )
+
+84 +
+ `STEP
+( 3, 2054 )
+
+85 +
+ `STEP
+( 4, 5741 )
+
+86 +
+ `STEP
+( 5, 8192 )
+
+87 +
+ `STEP
+( 6, 5741 )
+
+88 +
+ `STEP
+( 7, 2054 )
+
+90 +
+ `STEP
+( 9, -374 )
+
+91 +
+ `STEP
+(10, -134 )
+
+105
+L_»suÉ
+ =
+ `SASR_L
+( L_result, 13 );
+
+106
+x
+[
+k
+] = (
+L_»suÉ
+ <
+MIN_WORD
+ ? MIN_WORD
+
+107 : (
+L_»suÉ
+ >
+MAX_WORD
+ ? MAX_WORD : L_result ));
+
+109
+ }
+}
+
+113 
+ $RPE_grid_£ËùiÚ
+ (
+
+114
+wÜd
+ *
+x
+,
+
+115
+wÜd
+ *
+xM
+,
+
+116
+wÜd
+ *
+Mc_out
+
+
+124 
+i
+;
+
+125 
+lÚgwÜd
+
+L_»suÉ
+,
+L_‹mp
+;
+
+126
+lÚgwÜd
+
+EM
+;
+
+127
+wÜd
+
+Mc
+;
+
+129
+lÚgwÜd
+
+L_commÚ_0_3
+;
+
+131
+EM
+ = 0;
+
+132
+Mc
+ = 0;
+
+155 #undeà
+STEP
+
+
+156 
+ #STEP
+m
+,
+i
+ )
+L_‹mp
+ =
+ `SASR_W
+x
+[m + 3 * i], 2 ); \
+
+157
+L_»suÉ
+ +ð
+L_‹mp
+ * L_‹mp;
+
+ )
+
+161
+L_»suÉ
+ = 0;
+
+162
+ `STEP
+( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
+
+163
+ `STEP
+( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
+
+164
+ `STEP
+( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
+
+165
+L_commÚ_0_3
+ =
+L_»suÉ
+;
+
+169
+ `STEP
+( 0, 0 );
+
+170
+L_»suÉ
+ <<= 1;
+
+171
+EM
+ =
+L_»suÉ
+;
+
+175
+L_»suÉ
+ = 0;
+
+176
+ `STEP
+( 1, 0 );
+
+177
+ `STEP
+( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
+
+178
+ `STEP
+( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
+
+179
+ `STEP
+( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
+
+180
+L_»suÉ
+ <<= 1;
+
+181 ià(
+L_»suÉ
+ >
+EM
+) {
+
+182
+Mc
+ = 1;
+
+183
+EM
+ =
+L_»suÉ
+;
+
+188
+L_»suÉ
+ = 0;
+
+189
+ `STEP
+( 2, 0 );
+
+190
+ `STEP
+( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
+
+191
+ `STEP
+( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
+
+192
+ `STEP
+( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
+
+193
+L_»suÉ
+ <<= 1;
+
+194 ià(
+L_»suÉ
+ >
+EM
+) {
+
+195
+Mc
+ = 2;
+
+196
+EM
+ =
+L_»suÉ
+;
+
+201
+L_»suÉ
+ =
+L_commÚ_0_3
+;
+
+202
+ `STEP
+( 3, 12 );
+
+203
+L_»suÉ
+ <<= 1;
+
+204 ià(
+L_»suÉ
+ >
+EM
+) {
+
+205
+Mc
+ = 3;
+
+206
+EM
+ =
+L_»suÉ
+;
+
+214 
+i
+ = 0; i <ð12; i ++è
+xM
+[i] =
+x
+[
+Mc
+ + 3*i];
+
+215 *
+Mc_out
+ =
+Mc
+;
+
+216
+ }
+}
+
+220 
+ $APCM_quªtiz©iÚ_xmaxc_to_exp_mªt
+ (
+
+221
+wÜd
+
+xmaxc
+,
+
+222
+wÜd
+ *
+expÚ_out
+,
+
+223
+wÜd
+ *
+mªt_out
+ )
+
+225
+wÜd
+
+expÚ
+,
+mªt
+;
+
+230
+expÚ
+ = 0;
+
+231 ià(
+xmaxc
+ > 15è
+expÚ
+ =
+ `SASR_W
+(xmaxc, 3) - 1;
+
+232
+mªt
+ =
+xmaxc
+ - (
+expÚ
+ << 3);
+
+234 ià(
+mªt
+ == 0) {
+
+235
+expÚ
+ = -4;
+
+236
+mªt
+ = 7;
+
+239 
+mªt
+ <= 7) {
+
+240
+mªt
+ = mant << 1 | 1;
+
+241
+expÚ
+--;
+
+243
+mªt
+ -= 8;
+
+246
+ `as£¹
+expÚ
+ >= -4 &&ƒxpon <= 6 );
+
+247
+ `as£¹
+mªt
+ >= 0 && mant <= 7 );
+
+249 *
+expÚ_out
+ =
+expÚ
+;
+
+250 *
+mªt_out
+ =
+mªt
+;
+
+251
+ }
+}
+
+253 
+ $APCM_quªtiz©iÚ
+ (
+
+254
+wÜd
+ *
+xM
+,
+
+255
+wÜd
+ *
+xMc
+,
+
+256
+wÜd
+ *
+mªt_out
+,
+
+257
+wÜd
+ *
+expÚ_out
+,
+
+258
+wÜd
+ *
+xmaxc_out
+
+
+261 
+i
+,
+™e¡
+;
+
+263
+wÜd
+
+xmax
+,
+xmaxc
+,
+‹mp
+,
+‹mp1
+,
+‹mp2
+;
+
+264
+wÜd
+
+expÚ
+,
+mªt
+;
+
+270
+xmax
+ = 0;
+
+271 
+i
+ = 0; i <= 12; i++) {
+
+272
+‹mp
+ =
+xM
+[
+i
+];
+
+273
+‹mp
+ =
+ `GSM_ABS
+(temp);
+
+274 ià(
+‹mp
+ >
+xmax
+) xmax =emp;
+
+280
+expÚ
+ = 0;
+
+281
+‹mp
+ =
+ `SASR_W
+xmax
+, 9 );
+
+282
+™e¡
+ = 0;
+
+284 
+i
+ = 0; i <= 5; i++) {
+
+286
+™e¡
+ |ð(
+‹mp
+ <= 0);
+
+287
+‹mp
+ =
+ `SASR_W
+(emp, 1 );
+
+289
+ `as£¹
+(
+expÚ
+ <= 5);
+
+290 ià(
+™e¡
+ =ð0è
+expÚ
+++;
+
+293
+ `as£¹
+(
+expÚ
+ <= 6 &&ƒxpon >= 0);
+
+294
+‹mp
+ =
+expÚ
+ + 5;
+
+296
+ `as£¹
+(
+‹mp
+ <= 11 &&emp >= 0);
+
+297
+xmaxc
+ =
+ `gsm_add
+ `SASR_W
+(
+xmax
+,
+‹mp
+), (
+wÜd
+è(
+expÚ
+ << 3) );
+
+303
+ `APCM_quªtiz©iÚ_xmaxc_to_exp_mªt
+xmaxc
+, &
+expÚ
+, &
+mªt
+ );
+
+319
+ `as£¹
+expÚ
+ <= 4096 &&ƒxpon >= -4096);
+
+320
+ `as£¹
+mªt
+ >= 0 && mant <= 7 );
+
+322
+‹mp1
+ = 6 -
+expÚ
+;
+
+323
+‹mp2
+ =
+gsm_NRFAC
+[
+mªt
+ ];
+
+325 
+i
+ = 0; i <= 12; i++) {
+
+327
+ `as£¹
+(
+‹mp1
+ >= 0 &&emp1 < 16);
+
+329
+‹mp
+ =
+xM
+[
+i
+] <<
+‹mp1
+;
+
+330
+‹mp
+ =
+ `GSM_MULT
+Ћmp,
+‹mp2
+ );
+
+331
+‹mp
+ =
+ `SASR_W
+(temp, 12);
+
+332
+xMc
+[
+i
+] =
+‹mp
+ + 4;
+
+338 *
+mªt_out
+ =
+mªt
+;
+
+339 *
+expÚ_out
+ =
+expÚ
+;
+
+340 *
+xmaxc_out
+ =
+xmaxc
+;
+
+341
+ }
+}
+
+345 
+ $APCM_šv”£_quªtiz©iÚ
+ (
+
+346 
+wÜd
+ *
+xMc
+,
+
+347
+wÜd
+
+mªt
+,
+
+348
+wÜd
+
+expÚ
+,
+
+349 
+wÜd
+ *
+xMp
+)
+
+356 
+i
+;
+
+357
+wÜd
+
+‹mp
+,
+‹mp1
+,
+‹mp2
+,
+‹mp3
+;
+
+359
+ `as£¹
+mªt
+ >= 0 && mant <= 7 );
+
+361
+‹mp1
+ =
+gsm_FAC
+[
+mªt
+ ];
+
+362
+‹mp2
+ =
+ `gsm_sub
+Ð6,
+expÚ
+ );
+
+363
+‹mp3
+ =
+ `gsm_a¦
+Ð1,
+ `gsm_sub
+‹mp2
+, 1 ));
+
+365 
+i
+ = 13; i--;) {
+
+367
+ `as£¹
+Ð*
+xMc
+ <= 7 && *xMc >= 0 );
+
+370
+‹mp
+ = (*
+xMc
+++ << 1) - 7;
+
+371
+ `as£¹
+‹mp
+ <= 7 &&emp >= -7 );
+
+373
+‹mp
+ <<= 12;
+
+374
+‹mp
+ =
+ `GSM_MULT_R
+‹mp1
+,emp );
+
+375
+‹mp
+ =
+ `GSM_ADD
+Ћmp,
+‹mp3
+ );
+
+376 *
+xMp
+++ =
+ `gsm_a¤
+‹mp
+,
+‹mp2
+ );
+
+378
+ }
+}
+
+382 
+ $RPE_grid_pos™iÚšg
+ (
+
+383
+wÜd
+
+Mc
+,
+
+384 
+wÜd
+ *
+xMp
+,
+
+385 
+wÜd
+ *
+•
+
+
+395 
+i
+ = 13;
+
+397
+ `as£¹
+(0 <ð
+Mc
+ && Mc <= 3);
+
+399 
+Mc
+) {
+
+400 3: *
+•
+++ = 0;
+
+402 *
+•
+++ = 0;
+
+403 1: *
+•
+++ = 0;
+
+404 0: *
+•
+++ = *
+xMp
+++;
+
+405 } --
+i
+);
+
+407 ++
+Mc
+ < 4è*
+•
+++ = 0;
+
+417
+ }
+}
+
+429 
+ $Gsm_Upd©e_of_»cÚ¡ruùed_shÜt_time_»sidu®_sigÇl
+ (
+
+430
+wÜd
+ *
+dµ
+,
+
+431
+wÜd
+ *
+•
+,
+
+432
+wÜd
+ *
+dp
+)
+
+434 
+k
+;
+
+436 
+k
+ = 0; k <= 79; k++)
+
+437
+dp
+[ -120 +
+k
+ ] = dp[ -80 + k ];
+
+439 
+k
+ = 0; k <= 39; k++)
+
+440
+dp
+[ -40 +
+k
+ ] =
+ `gsm_add
+•
+[k],
+dµ
+[k] );
+
+441
+ }
+}
+
+444 
+ $Gsm_RPE_Encodšg
+ (
+
+447
+wÜd
+ *
+e
+,
+
+448
+wÜd
+ *
+xmaxc
+,
+
+449
+wÜd
+ *
+Mc
+,
+
+450
+wÜd
+ *
+xMc
+)
+
+452
+wÜd
+
+x
+[40];
+
+453
+wÜd
+
+xM
+[13],
+xMp
+[13];
+
+454
+wÜd
+
+mªt
+,
+expÚ
+;
+
+456
+ `Weightšg_fž‹r
+(
+e
+,
+x
+);
+
+457
+ `RPE_grid_£ËùiÚ
+(
+x
+,
+xM
+,
+Mc
+);
+
+459
+ `APCM_quªtiz©iÚ
+xM
+,
+xMc
+, &
+mªt
+, &
+expÚ
+,
+xmaxc
+);
+
+460
+ `APCM_šv”£_quªtiz©iÚ
+xMc
+,
+mªt
+,
+expÚ
+,
+xMp
+);
+
+462
+ `RPE_grid_pos™iÚšg
+Ð*
+Mc
+,
+xMp
+,
+e
+ );
+
+464
+ }
+}
+
+466 
+ $Gsm_RPE_Decodšg
+ (
+
+469
+wÜd
+
+xmaxü
+,
+
+470
+wÜd
+
+Mü
+,
+
+471
+wÜd
+ *
+xMü
+,
+
+472
+wÜd
+ *
+”p
+
+
+475
+wÜd
+
+expÚ
+,
+mªt
+;
+
+476
+wÜd
+
+xMp
+[ 13 ];
+
+478
+ `APCM_quªtiz©iÚ_xmaxc_to_exp_mªt
+xmaxü
+, &
+expÚ
+, &
+mªt
+ );
+
+479
+ `APCM_šv”£_quªtiz©iÚ
+xMü
+,
+mªt
+,
+expÚ
+,
+xMp
+ );
+
+480
+ `RPE_grid_pos™iÚšg
+Mü
+,
+xMp
+,
+”p
+ );
+
+482
+ }
+}
+
+ @short_term.c
+
+7 
+ ~<¡dio.h
+>
+
+8 
+ ~<as£¹.h
+>
+
+10 
+ ~"gsm610_´iv.h
+"
+
+12 
+ ~"gsm.h
+"
+
+20 
+ $Decodšg_of_the_coded_Log_A»a_R©ios
+ (
+
+21
+wÜd
+ *
+LARc
+,
+
+22
+wÜd
+ *
+LARµ
+)
+
+24 
+wÜd
+
+‹mp1
+ ;
+
+49 #undeà
+STEP
+
+
+50 
+ #STEP
+B
+,
+MIC
+,
+INVA
+ ) \
+
+51
+‹mp1
+ =
+ `GSM_ADD
+Ð*
+LARc
+++,
+MIC
+ ) << 10; \
+
+52
+‹mp1
+ =
+ `GSM_SUB
+Ћmp1,
+B
+ << 1 ); \
+
+53
+‹mp1
+ =
+ `GSM_MULT_R
+INVA
+,emp1 ); \
+
+54 *
+LARµ
+++ =
+ `GSM_ADD
+‹mp1
+,emp1 );
+
+ )
+
+56
+ `STEP
+( 0, -32, 13107 );
+
+57
+ `STEP
+( 0, -32, 13107 );
+
+58
+ `STEP
+( 2048, -16, 13107 );
+
+59
+ `STEP
+( -2560, -16, 13107 );
+
+61
+ `STEP
+( 94, -8, 19223 );
+
+62
+ `STEP
+( -1792, -8, 17476 );
+
+63
+ `STEP
+( -341, -4, 31454 );
+
+64
+ `STEP
+( -1144, -4, 29708 );
+
+69
+ }
+}
+
+87 
+ $CÛffic›Ás_0_12
+ (
+
+88 
+wÜd
+ *
+LARµ_j_1
+,
+
+89 
+wÜd
+ *
+LARµ_j
+,
+
+90 
+wÜd
+ *
+LARp
+)
+
+92 
+i
+;
+
+94 
+i
+ = 1; i <ð8; i++,
+LARp
+++,
+LARµ_j_1
+++,
+LARµ_j
+++) {
+
+95 *
+LARp
+ =
+ `GSM_ADD
+ `SASR_W
+Ð*
+LARµ_j_1
+, 2 ), SASR_WÐ*
+LARµ_j
+, 2 ));
+
+96 *
+LARp
+ =
+ `GSM_ADD
+Ð*LARp,
+ `SASR_W
+Ð*
+LARµ_j_1
+, 1));
+
+98
+ }
+}
+
+100 
+ $CÛffic›Ás_13_26
+ (
+
+101 
+wÜd
+ *
+LARµ_j_1
+,
+
+102 
+wÜd
+ *
+LARµ_j
+,
+
+103 
+wÜd
+ *
+LARp
+)
+
+105 
+i
+;
+
+106 
+i
+ = 1; i <ð8; i++,
+LARµ_j_1
+++,
+LARµ_j
+++,
+LARp
+++) {
+
+107 *
+LARp
+ =
+ `GSM_ADD
+ `SASR_W
+Ð*
+LARµ_j_1
+, 1), SASR_WÐ*
+LARµ_j
+, 1 ));
+
+109
+ }
+}
+
+111 
+ $CÛffic›Ás_27_39
+ (
+
+112 
+wÜd
+ *
+LARµ_j_1
+,
+
+113 
+wÜd
+ *
+LARµ_j
+,
+
+114 
+wÜd
+ *
+LARp
+)
+
+116 
+i
+;
+
+118 
+i
+ = 1; i <ð8; i++,
+LARµ_j_1
+++,
+LARµ_j
+++,
+LARp
+++) {
+
+119 *
+LARp
+ =
+ `GSM_ADD
+ `SASR_W
+Ð*
+LARµ_j_1
+, 2 ), SASR_WÐ*
+LARµ_j
+, 2 ));
+
+120 *
+LARp
+ =
+ `GSM_ADD
+Ð*LARp,
+ `SASR_W
+Ð*
+LARµ_j
+, 1 ));
+
+122
+ }
+}
+
+125 
+ $CÛffic›Ás_40_159
+ (
+
+126 
+wÜd
+ *
+LARµ_j
+,
+
+127 
+wÜd
+ *
+LARp
+)
+
+129 
+i
+;
+
+131 
+i
+ = 1; i <ð8; i++,
+LARp
+++,
+LARµ_j
+++)
+
+132 *
+LARp
+ = *
+LARµ_j
+;
+
+133
+ }
+}
+
+137 
+ $LARp_to_½
+ (
+
+138 
+wÜd
+ *
+LARp
+)
+
+145 
+i
+;
+
+146 
+wÜd
+
+‹mp
+;
+
+148 
+i
+ = 1; i <ð8; i++,
+LARp
+++) {
+
+159 ià(*
+LARp
+ < 0) {
+
+160
+‹mp
+ = *
+LARp
+ =ð
+MIN_WORD
+ ?
+MAX_WORD
+ : -(*LARp);
+
+161 *
+LARp
+ = - ((
+‹mp
+ < 11059) ?emp << 1
+
+162 : ((
+‹mp
+ < 20070) ?emp + 11059
+
+163 :
+ `GSM_ADD
+Ð(
+wÜd
+è(
+‹mp
+ >> 2), (word) 26112 )));
+
+165
+‹mp
+ = *
+LARp
+;
+
+166 *
+LARp
+ = (
+‹mp
+ < 11059) ?emp << 1
+
+167 : ((
+‹mp
+ < 20070) ?emp + 11059
+
+168 :
+ `GSM_ADD
+Ð(
+wÜd
+è(
+‹mp
+ >> 2), (word) 26112 ));
+
+171
+ }
+}
+
+175 
+ $ShÜt_‹rm_ª®ysis_fž‹ršg
+ (
+
+176 
+gsm_¡©e
+ *
+S
+,
+
+177 
+wÜd
+ *
+,
+
+178 
+k_n
+,
+
+179 
+wÜd
+ *
+s
+
+
+192 
+wÜd
+ *
+u
+ =
+S
+->u;
+
+193 
+i
+;
+
+194 
+wÜd
+
+di
+,
+zzz
+,
+ui
+,
+§v
+,
+½i
+;
+
+196 ;
+k_n
+--;
+s
+++) {
+
+198
+di
+ =
+§v
+ = *
+s
+;
+
+200 
+i
+ = 0; i < 8; i++) {
+
+202
+ui
+ =
+u
+[
+i
+];
+
+203
+½i
+ =
+[
+i
+];
+
+204
+u
+[
+i
+] =
+§v
+;
+
+206
+zzz
+ =
+ `GSM_MULT_R
+(
+½i
+,
+di
+);
+
+207
+§v
+ =
+ `GSM_ADD
+ui
+,
+zzz
+);
+
+209
+zzz
+ =
+ `GSM_MULT_R
+(
+½i
+,
+ui
+);
+
+210
+di
+ =
+ `GSM_ADD
+Ðdi,
+zzz
+ );
+
+213 *
+s
+ =
+di
+;
+
+215
+ }
+}
+
+217 #ià
+defšed
+(
+USE_FLOAT_MUL
+è&& defšed(
+FAST
+)
+
+219 
+ $Fa¡_ShÜt_‹rm_ª®ysis_fž‹ršg
+ (
+
+220 
+gsm_¡©e
+ *
+S
+,
+
+221 
+wÜd
+ *
+,
+
+222 
+k_n
+,
+
+223 
+wÜd
+ *
+s
+
+
+226 
+wÜd
+ *
+u
+ =
+S
+->u;
+
+227 
+i
+;
+
+229 
+uf
+[8],
+
+230
+½f
+[8];
+
+232 
+sÿËf
+ = 3.0517578125e-5;
+
+233 
+§v
+,
+di
+,
+‹mp
+;
+
+235 
+i
+ = 0; i < 8; ++i) {
+
+236
+uf
+[
+i
+] =
+u
+[i];
+
+237
+½f
+[
+i
+] =
+[i] *
+sÿËf
+;
+
+239 ;
+k_n
+--;
+s
+++) {
+
+240
+§v
+ =
+di
+ = *
+s
+;
+
+241 
+i
+ = 0; i < 8; ++i) {
+
+242 
+½fi
+ =
+½f
+[
+i
+];
+
+243 
+ufi
+ =
+uf
+[
+i
+];
+
+245
+uf
+[
+i
+] =
+§v
+;
+
+246
+‹mp
+ =
+½fi
+ *
+di
+ +
+ufi
+;
+
+247
+di
+ +ð
+½fi
+ *
+ufi
+;
+
+248
+§v
+ =
+‹mp
+;
+
+250 *
+s
+ =
+di
+;
+
+252 
+i
+ = 0; i < 8; ++iè
+u
+[i] =
+uf
+[i];
+
+253
+ }
+}
+
+256 
+ $ShÜt_‹rm_syÁhesis_fž‹ršg
+ (
+
+257 
+gsm_¡©e
+ *
+S
+,
+
+258 
+wÜd
+ *
+¼p
+,
+
+259 
+k
+,
+
+260 
+wÜd
+ *
+wt
+,
+
+261 
+wÜd
+ *
+
+
+264 
+wÜd
+ *
+v
+ =
+S
+->v;
+
+265 
+i
+;
+
+266 
+wÜd
+
+¤i
+,
+tmp1
+,
+tmp2
+;
+
+268 
+k
+--) {
+
+269
+¤i
+ = *
+wt
+++;
+
+270 
+i
+ = 8; i--;) {
+
+274
+tmp1
+ =
+¼p
+[
+i
+];
+
+275
+tmp2
+ =
+v
+[
+i
+];
+
+276
+tmp2
+ = (
+tmp1
+ =ð
+MIN_WORD
+ &&mp2 == MIN_WORD
+
+277 ?
+MAX_WORD
+
+
+278 : 0x0FFFF & (Ð(
+lÚgwÜd
+)
+tmp1
+ * (lÚgwÜd)
+tmp2
+
+
+281
+¤i
+ =
+ `GSM_SUB
+Фi,
+tmp2
+ );
+
+285
+tmp1
+ = (mp1 =ð
+MIN_WORD
+ &&
+¤i
+ == MIN_WORD
+
+286 ?
+MAX_WORD
+
+
+287 : 0x0FFFF & (Ð(
+lÚgwÜd
+)
+tmp1
+ * (lÚgwÜd)
+¤i
+
+
+290
+v
+[
+i
++1] =
+ `GSM_ADD
+Ðv[i],
+tmp1
+);
+
+292 *
+++ =
+v
+[0] =
+¤i
+;
+
+294
+ }
+}
+
+297 #ià
+defšed
+(
+FAST
+è&& defšed(
+USE_FLOAT_MUL
+)
+
+299 
+ $Fa¡_ShÜt_‹rm_syÁhesis_fž‹ršg
+ (
+
+300 
+gsm_¡©e
+ *
+S
+,
+
+301 
+wÜd
+ *
+¼p
+,
+
+302 
+k
+,
+
+303 
+wÜd
+ *
+wt
+,
+
+304 
+wÜd
+ *
+
+
+307 
+wÜd
+ *
+v
+ =
+S
+->v;
+
+308 
+i
+;
+
+310 
+va
+[9],
+¼·
+[8];
+
+311 
+sÿËf
+ = 3.0517578125e-5,
+‹mp
+;
+
+313 
+i
+ = 0; i < 8; ++i) {
+
+314
+va
+[
+i
+] =
+v
+[i];
+
+315
+¼·
+[
+i
+] = ()
+¼p
+[i] *
+sÿËf
+;
+
+317 
+k
+--) {
+
+318 
+¤i
+ = *
+wt
+++;
+
+319 
+i
+ = 8; i--;) {
+
+320
+¤i
+ -ð
+¼·
+[
+i
+] *
+va
+[i];
+
+321 ià(
+¤i
+ < -32768.) sri = -32768.;
+
+322 ià(
+¤i
+ > 32767.) sri = 32767.;
+
+324
+‹mp
+ =
+va
+[
+i
+] +
+¼·
+[i] *
+¤i
+;
+
+325 ià(
+‹mp
+ < -32768.)emp = -32768.;
+
+326 ià(
+‹mp
+ > 32767.)emp = 32767.;
+
+327
+va
+[
+i
++1] =
+‹mp
+;
+
+329 *
+++ =
+va
+[0] =
+¤i
+;
+
+331 
+i
+ = 0; i < 9; ++iè
+v
+[i] =
+va
+[i];
+
+332
+ }
+}
+
+336 
+ $Gsm_ShÜt_T”m_AÇlysis_Fž‹r
+ (
+
+338 
+gsm_¡©e
+ *
+S
+,
+
+340
+wÜd
+ *
+LARc
+,
+
+341
+wÜd
+ *
+s
+
+
+344
+wÜd
+ *
+LARµ_j
+ =
+S
+->
+LARµ
+[ S->
+j
+ ];
+
+345
+wÜd
+ *
+LARµ_j_1
+ =
+S
+->
+LARµ
+[ S->
+j
+ ^= 1 ];
+
+347
+wÜd
+
+LARp
+[8];
+
+349 #undeà
+FILTER
+
+
+350 #ià
+ `defšed
+(
+FAST
+è&& defšed(
+USE_FLOAT_MUL
+)
+
+351 
+ #FILTER
+ (* (
+S
+->
+ç¡
+ \
+
+352 ?
+Fa¡_ShÜt_‹rm_ª®ysis_fž‹ršg
+ \
+
+353 :
+ShÜt_‹rm_ª®ysis_fž‹ršg
+ ))
+
+ )
+
+356 
+ #FILTER
+
+ShÜt_‹rm_ª®ysis_fž‹ršg
+
+
+ )
+
+359
+ `Decodšg_of_the_coded_Log_A»a_R©ios
+LARc
+,
+LARµ_j
+ );
+
+361
+ `CÛffic›Ás_0_12
+LARµ_j_1
+,
+LARµ_j
+,
+LARp
+ );
+
+362
+ `LARp_to_½
+LARp
+ );
+
+363
+ `FILTER
+S
+,
+LARp
+, 13,
+s
+);
+
+365
+ `CÛffic›Ás_13_26
+LARµ_j_1
+,
+LARµ_j
+,
+LARp
+);
+
+366
+ `LARp_to_½
+LARp
+ );
+
+367
+ `FILTER
+S
+,
+LARp
+, 14,
+s
+ + 13);
+
+369
+ `CÛffic›Ás_27_39
+LARµ_j_1
+,
+LARµ_j
+,
+LARp
+);
+
+370
+ `LARp_to_½
+LARp
+ );
+
+371
+ `FILTER
+S
+,
+LARp
+, 13,
+s
+ + 27);
+
+373
+ `CÛffic›Ás_40_159
+LARµ_j
+,
+LARp
+);
+
+374
+ `LARp_to_½
+LARp
+ );
+
+375
+ `FILTER
+S
+,
+LARp
+, 120,
+s
+ + 40);
+
+376
+ }
+}
+
+378 
+ $Gsm_ShÜt_T”m_SyÁhesis_Fž‹r
+ (
+
+379 
+gsm_¡©e
+ *
+S
+,
+
+381
+wÜd
+ *
+LARü
+,
+
+382
+wÜd
+ *
+wt
+,
+
+384
+wÜd
+ *
+s
+
+
+387
+wÜd
+ *
+LARµ_j
+ =
+S
+->
+LARµ
+[ S->
+j
+ ];
+
+388
+wÜd
+ *
+LARµ_j_1
+ =
+S
+->
+LARµ
+[ S->
+j
+ ^=1 ];
+
+390
+wÜd
+
+LARp
+[8];
+
+392 #undeà
+FILTER
+
+
+393 #ià
+ `defšed
+(
+FAST
+è&& defšed(
+USE_FLOAT_MUL
+)
+
+395 
+ #FILTER
+ (* (
+S
+->
+ç¡
+ \
+
+396 ?
+Fa¡_ShÜt_‹rm_syÁhesis_fž‹ršg
+ \
+
+397 :
+ShÜt_‹rm_syÁhesis_fž‹ršg
+ ))
+
+ )
+
+399 
+ #FILTER
+
+ShÜt_‹rm_syÁhesis_fž‹ršg
+
+
+ )
+
+402
+ `Decodšg_of_the_coded_Log_A»a_R©ios
+LARü
+,
+LARµ_j
+ );
+
+404
+ `CÛffic›Ás_0_12
+LARµ_j_1
+,
+LARµ_j
+,
+LARp
+ );
+
+405
+ `LARp_to_½
+LARp
+ );
+
+406
+ `FILTER
+S
+,
+LARp
+, 13,
+wt
+,
+s
+ );
+
+408
+ `CÛffic›Ás_13_26
+LARµ_j_1
+,
+LARµ_j
+,
+LARp
+);
+
+409
+ `LARp_to_½
+LARp
+ );
+
+410
+ `FILTER
+S
+,
+LARp
+, 14,
+wt
+ + 13,
+s
+ + 13 );
+
+412
+ `CÛffic›Ás_27_39
+LARµ_j_1
+,
+LARµ_j
+,
+LARp
+);
+
+413
+ `LARp_to_½
+LARp
+ );
+
+414
+ `FILTER
+S
+,
+LARp
+, 13,
+wt
+ + 27,
+s
+ + 27 );
+
+416
+ `CÛffic›Ás_40_159
+LARµ_j
+,
+LARp
+ );
+
+417
+ `LARp_to_½
+LARp
+ );
+
+418
+ `FILTER
+(
+S
+,
+LARp
+, 120,
+wt
+ + 40,
+s
+ + 40);
+
+419
+ }
+}
+
+ @table.c
+
+16 
+ #GSM_TABLE_C
+
+
+ )
+
+17 
+ ~"gsm610_´iv.h
+"
+
+18 
+ ~"gsm.h
+"
+
+23
+wÜd
+
+ ggsm_A
+[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036};
+
+24
+wÜd
+
+ ggsm_B
+[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144};
+
+25
+wÜd
+
+ ggsm_MIC
+[8] = { -32, -32, -16, -16, -8, -8, -4, -4 };
+
+26
+wÜd
+
+ ggsm_MAC
+[8] = { 31, 31, 15, 15, 7, 7, 3, 3 };
+
+31
+wÜd
+
+ ggsm_INVA
+[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 };
+
+37
+wÜd
+
+ ggsm_DLB
+[4] = { 6554, 16384, 26214, 32767 };
+
+43
+wÜd
+
+ ggsm_QLB
+[4] = { 3277, 11469, 21299, 32767 };
+
+49
+wÜd
+
+ ggsm_H
+[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
+
+55
+wÜd
+
+ ggsm_NRFAC
+[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
+
+61
+wÜd
+
+ ggsm_FAC
+[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };
+
+ @
+1
+.
+0
+17
+175
+add.c
+code.c
+config.h
+decode.c
+gsm.h
+gsm610_priv.h
+gsm_create.c
+gsm_decode.c
+gsm_destroy.c
+gsm_encode.c
+gsm_option.c
+long_term.c
+lpc.c
+preprocess.c
+rpe.c
+short_term.c
+table.c
diff --git a/orkbasecxx/filters/gsm/gsm610/decode.c b/orkbasecxx/filters/gsm/gsm610/decode.c
new file mode 100644
index 0000000..b4334ac
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/decode.c
@@ -0,0 +1,67 @@
+/*
+ * 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 "gsm610_priv.h"
+#include "gsm.h"
+
+/*
+ * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER
+ */
+
+static void Postprocessing (
+ struct gsm_state * S,
+ register word * s)
+{
+ register int k;
+ register word msr = S->msr;
+ register word tmp;
+
+ for (k = 160; k--; s++) {
+ tmp = GSM_MULT_R( msr, 28180 );
+ msr = GSM_ADD(*s, tmp); /* Deemphasis */
+ *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */
+ }
+ S->msr = msr;
+}
+
+void Gsm_Decoder (
+ 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);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 11ae5b90-2e8b-400b-ac64-a69a1fc6cc41
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm.h b/orkbasecxx/filters/gsm/gsm610/gsm.h
new file mode 100644
index 0000000..e63bd64
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/gsm.h
@@ -0,0 +1,58 @@
+/*
+ * 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
+
+#include <stdio.h> /* for FILE * */
+
+/*
+ * 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
+
+gsm gsm_create (void);
+
+/* Added for libsndfile : May 6, 2002 */
+void gsm_init (gsm);
+
+void gsm_destroy (gsm);
+
+int gsm_print (FILE *, gsm, gsm_byte *);
+int gsm_option (gsm, int, int *);
+
+void gsm_encode (gsm, gsm_signal *, gsm_byte *);
+int gsm_decode (gsm, gsm_byte *, gsm_signal *);
+
+int gsm_explode (gsm, gsm_byte *, gsm_signal *);
+void gsm_implode (gsm, gsm_signal *, gsm_byte *);
+
+#endif /* GSM_H */
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 8cfc7698-5433-4b6f-aeca-967c6fda4dec
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm610_priv.h b/orkbasecxx/filters/gsm/gsm610/gsm610_priv.h
new file mode 100644
index 0000000..fac74aa
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/gsm610_priv.h
@@ -0,0 +1,304 @@
+/*
+ * 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
+
+/* Added by Erik de Castro Lopo */
+#define USE_FLOAT_MUL
+#define FAST
+#define WAV49
+/* Added by Erik de Castro Lopo */
+
+
+
+typedef short word; /* 16 bit signed int */
+typedef int longword; /* 32 bit signed int */
+
+typedef unsigned short uword; /* unsigned word */
+typedef unsigned int 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 */
+
+ /* Moved here from code.c where it was defined as static */
+ word e[50] ;
+} ;
+
+typedef struct gsm_state GSM_STATE ;
+
+#define MIN_WORD (-32767 - 1)
+#define MAX_WORD 32767
+
+#define MIN_LONGWORD (-2147483647 - 1)
+#define MAX_LONGWORD 2147483647
+
+/* Signed arithmetic shift right. */
+static inline word
+SASR_W (word x, word by)
+{ return (x >> by) ;
+} /* SASR */
+
+static inline longword
+SASR_L (longword x, word by)
+{ return (x >> by) ;
+} /* SASR */
+
+/*
+ * Prototypes from add.c
+ */
+word gsm_mult (word a, word b) ;
+longword gsm_L_mult (word a, word b) ;
+word gsm_mult_r (word a, word b) ;
+
+word gsm_div (word num, word denum) ;
+
+word gsm_add (word a, word b ) ;
+longword gsm_L_add (longword a, longword b ) ;
+
+word gsm_sub (word a, word b) ;
+longword gsm_L_sub (longword a, longword b) ;
+
+word gsm_abs (word a) ;
+
+word gsm_norm (longword a ) ;
+
+longword gsm_L_asl (longword a, int n) ;
+word gsm_asl (word a, int n) ;
+
+longword gsm_L_asr (longword a, int n) ;
+word gsm_asr (word a, int n) ;
+
+/*
+ * Inlined functions from add.h
+ */
+
+static inline longword
+GSM_MULT_R (word a, word b)
+{ return (((longword) (a)) * ((longword) (b)) + 16384) >> 15 ;
+} /* GSM_MULT_R */
+
+static inline longword
+GSM_MULT (word a, word b)
+{ return (((longword) (a)) * ((longword) (b))) >> 15 ;
+} /* GSM_MULT */
+
+static inline longword
+GSM_L_MULT (word a, word b)
+{ return ((longword) (a)) * ((longword) (b)) << 1 ;
+} /* GSM_L_MULT */
+
+static inline longword
+GSM_L_ADD (longword a, longword b)
+{ ulongword utmp ;
+
+ if (a < 0 && b < 0)
+ { utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1) ;
+ return (utmp >= (ulongword) MAX_LONGWORD) ? MIN_LONGWORD : -(longword)utmp-2 ;
+ } ;
+
+ if (a > 0 && b > 0)
+ { utmp = (ulongword) a + (ulongword) b ;
+ return (utmp >= (ulongword) MAX_LONGWORD) ? MAX_LONGWORD : utmp ;
+ } ;
+
+ return a + b ;
+} /* GSM_L_ADD */
+
+static inline longword
+GSM_ADD (word a, word b)
+{ longword ltmp ;
+
+ ltmp = ((longword) a) + ((longword) b) ;
+
+ if (ltmp >= MAX_WORD)
+ return MAX_WORD ;
+ if (ltmp <= MIN_WORD)
+ return MIN_WORD ;
+
+ return ltmp ;
+} /* GSM_ADD */
+
+static inline longword
+GSM_SUB (word a, word b)
+{ longword ltmp ;
+
+ ltmp = ((longword) a) - ((longword) b) ;
+
+ if (ltmp >= MAX_WORD)
+ ltmp = MAX_WORD ;
+ else if (ltmp <= MIN_WORD)
+ ltmp = MIN_WORD ;
+
+ return ltmp ;
+} /* GSM_SUB */
+
+static inline word
+GSM_ABS (word a)
+{
+ if (a > 0)
+ return a ;
+ if (a == MIN_WORD)
+ return MAX_WORD ;
+ return -a ;
+} /* GSM_ADD */
+
+
+/*
+ * More prototypes from implementations..
+ */
+void Gsm_Coder (
+ 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 */
+
+void Gsm_Long_Term_Predictor ( /* 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 */
+
+void Gsm_LPC_Analysis (
+ struct gsm_state * S,
+ word * s, /* 0..159 signals IN/OUT */
+ word * LARc) ; /* 0..7 LARc's OUT */
+
+void Gsm_Preprocess (
+ struct gsm_state * S,
+ word * s, word * so) ;
+
+void Gsm_Encoding (
+ struct gsm_state * S,
+ word * e,
+ word * ep,
+ word * xmaxc,
+ word * Mc,
+ word * xMc) ;
+
+void Gsm_Short_Term_Analysis_Filter (
+ struct gsm_state * S,
+ word * LARc, /* coded log area ratio [0..7] IN */
+ word * d) ; /* st res. signal [0..159] IN/OUT */
+
+void Gsm_Decoder (
+ 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 */
+
+void Gsm_Decoding (
+ struct gsm_state * S,
+ word xmaxcr,
+ word Mcr,
+ word * xMcr, /* [0..12] IN */
+ word * erp) ; /* [0..39] OUT */
+
+void Gsm_Long_Term_Synthesis_Filtering (
+ 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 (
+ /*-struct gsm_state *S,-*/
+ word xmaxcr,
+ word Mcr,
+ word * xMcr, /* [0..12], 3 bits IN */
+ word * erp) ; /* [0..39] OUT */
+
+void Gsm_RPE_Encoding (
+ /*-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 */
+
+void Gsm_Short_Term_Synthesis_Filter (
+ 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 */
+
+void Gsm_Update_of_reconstructed_short_time_residual_signal (
+ 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 */
+
+ void gsm_debug_words (char * name, int, int, word *) ;
+ void gsm_debug_longwords (char * name, int, int, longword *) ;
+ void gsm_debug_longword (char * name, longword) ;
+ void gsm_debug_word (char * name, word) ;
+
+#endif /* !NDEBUG */
+
+#endif /* PRIVATE_H */
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 8bc5fdf2-e8c8-4686-9bd7-a30b512bef0c
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_create.c b/orkbasecxx/filters/gsm/gsm610/gsm_create.c
new file mode 100644
index 0000000..f89be2f
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/gsm_create.c
@@ -0,0 +1,44 @@
+/*
+ * 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"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+#include "gsm.h"
+#include "gsm610_priv.h"
+
+gsm gsm_create (void)
+{
+ gsm r;
+
+ r = malloc (sizeof(struct gsm_state));
+ if (!r) return r;
+
+ memset((char *)r, 0, sizeof (struct gsm_state));
+ r->nrp = 40;
+
+ return r;
+}
+
+/* Added for libsndfile : May 6, 2002. Not sure if it works. */
+void gsm_init (gsm state)
+{
+ memset (state, 0, sizeof (struct gsm_state)) ;
+ state->nrp = 40 ;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 9fedb6b3-ed99-40c2-aac1-484c536261fe
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_decode.c b/orkbasecxx/filters/gsm/gsm610/gsm_decode.c
new file mode 100644
index 0000000..9679c11
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/gsm_decode.c
@@ -0,0 +1,366 @@
+/*
+ * 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 "gsm610_priv.h"
+
+#include "gsm.h"
+
+int gsm_decode (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;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 6a9b6628-821c-4a96-84c1-485ebd35f170
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_destroy.c b/orkbasecxx/filters/gsm/gsm610/gsm_destroy.c
new file mode 100644
index 0000000..7af9800
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/gsm_destroy.c
@@ -0,0 +1,31 @@
+/*
+ * 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"
+
+#ifdef HAS_STDLIB_H
+# include <stdlib.h>
+#else
+# ifdef HAS_MALLOC_H
+# include <malloc.h>
+# else
+ extern void free();
+# endif
+#endif
+
+void gsm_destroy (gsm S)
+{
+ if (S) free((char *)S);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: f423d09b-6ccc-47e0-9b18-ee1cf7a8e473
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_encode.c b/orkbasecxx/filters/gsm/gsm610/gsm_encode.c
new file mode 100644
index 0000000..a3e4389
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/gsm_encode.c
@@ -0,0 +1,456 @@
+/*
+ * 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 "gsm610_priv.h"
+#include "gsm.h"
+
+void gsm_encode (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);
+
+ }
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: cfe9c43d-d97c-4216-b5e5-ccd6a25b582b
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_option.c b/orkbasecxx/filters/gsm/gsm610/gsm_option.c
new file mode 100644
index 0000000..09c5ea0
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/gsm_option.c
@@ -0,0 +1,74 @@
+/*
+ * 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 "gsm610_priv.h"
+
+#include "gsm.h"
+
+int gsm_option (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;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 963ff156-506f-4359-9145-371e9060b030
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/long_term.c b/orkbasecxx/filters/gsm/gsm610/long_term.c
new file mode 100644
index 0000000..706b8a9
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/long_term.c
@@ -0,0 +1,951 @@
+/*
+ * 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 "gsm610_priv.h"
+
+#include "gsm.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 (
+
+ 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_W(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_W( 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 (
+ 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_W( 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_W( 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( L_max << temp, 16 );
+ S = SASR_L( 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 (
+ 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_W(dmax, scal) * st->ltp_cut / 100;
+
+
+ /* Initialization of a working array wt
+ */
+
+ for (k = 0; k < 40; k++) {
+ register word w = SASR_W( 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_W( 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 (
+ register word * din, /* [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 = din [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_W (din [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_W( 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 ( L_max << temp, 16 );
+ S = SASR_L ( 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 (
+ 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 (
+ register word * din, /* [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) din [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 (
+ 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;
+
+# undef STEP
+# define STEP(BP) \
+ for (k = 0; k <= 39; k++) { \
+ dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \
+ e[k] = 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 ( /* 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 (
+ 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 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 = GSM_MULT_R( brp, drp[ k - Nr ] );
+ drp[k] = 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 ];
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: b369b90d-0284-42a0-87b0-99a25bbd93ac
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/lpc.c b/orkbasecxx/filters/gsm/gsm610/lpc.c
new file mode 100644
index 0000000..d537cb6
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/lpc.c
@@ -0,0 +1,341 @@
+/*
+ * 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 "gsm610_priv.h"
+
+#include "gsm.h"
+
+/*
+ * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
+ */
+
+/* 4.2.4 */
+
+
+static void Autocorrelation (
+ 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] = 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 (
+ 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 (
+ longword * L_ACF, /* 0...8 IN */
+ register word * r /* 0...7 OUT */
+)
+{
+ register int i, m, n;
+ register word temp;
+ 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] = SASR_L( 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 = GSM_MULT_R( P[1], *r );
+ P[0] = GSM_ADD( P[0], temp );
+
+ for (m = 1; m <= 8 - n; m++) {
+ temp = GSM_MULT_R( K[ m ], *r );
+ P[m] = GSM_ADD( P[ m+1 ], temp );
+
+ temp = GSM_MULT_R( P[ m+1 ], *r );
+ K[m] = GSM_ADD( K[ m ], temp );
+ }
+ }
+}
+
+/* 4.2.6 */
+
+static void Transformation_to_Log_Area_Ratios (
+ 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 (
+ register word * LAR /* [0..7] IN/OUT */
+)
+{
+ register word temp;
+
+ /* 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 = GSM_MULT( A, *LAR ); \
+ temp = GSM_ADD( temp, B ); \
+ temp = GSM_ADD( temp, 256 ); \
+ temp = SASR_W( 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 (
+ 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);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 63146664-a002-4e1e-8b7b-f0cc8a6a53da
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/preprocess.c b/orkbasecxx/filters/gsm/gsm610/preprocess.c
new file mode 100644
index 0000000..e826f0f8
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/preprocess.c
@@ -0,0 +1,115 @@
+/*
+ * 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 "gsm610_priv.h"
+
+#include "gsm.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 (
+ 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;
+
+ register int k = 160;
+
+ while (k--) {
+
+ /* 4.2.1 Downscaling of the input signal
+ */
+ SO = SASR_W( *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 = SASR_L( L_z2, 15 );
+ lsp = 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 = GSM_MULT_R( mp, -28180 );
+ mp = SASR_L( L_temp, 15 );
+ *so++ = GSM_ADD( mp, msp );
+ }
+
+ S->z1 = z1;
+ S->L_z2 = L_z2;
+ S->mp = mp;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: b760b0d9-3a05-4da3-9dc9-441ffb905d87
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/rpe.c b/orkbasecxx/filters/gsm/gsm610/rpe.c
new file mode 100644
index 0000000..901d2f7
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/rpe.c
@@ -0,0 +1,490 @@
+/*
+ * 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 "gsm610_priv.h"
+
+#include "gsm.h"
+
+/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION
+ */
+
+/* 4.2.13 */
+
+static void Weighting_filter (
+ 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( L_result, 13 );
+ x[k] = ( L_result < MIN_WORD ? MIN_WORD
+ : (L_result > MAX_WORD ? MAX_WORD : L_result ));
+ }
+}
+
+/* 4.2.14 */
+
+static void RPE_grid_selection (
+ 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_W( 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_W( 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 (
+ word xmaxc, /* IN */
+ word * expon_out, /* OUT */
+ word * mant_out ) /* OUT */
+{
+ word expon, mant;
+
+ /* Compute expononent and mantissa of the decoded version of xmaxc
+ */
+
+ expon = 0;
+ if (xmaxc > 15) expon = SASR_W(xmaxc, 3) - 1;
+ mant = xmaxc - (expon << 3);
+
+ if (mant == 0) {
+ expon = -4;
+ mant = 7;
+ }
+ else {
+ while (mant <= 7) {
+ mant = mant << 1 | 1;
+ expon--;
+ }
+ mant -= 8;
+ }
+
+ assert( expon >= -4 && expon <= 6 );
+ assert( mant >= 0 && mant <= 7 );
+
+ *expon_out = expon;
+ *mant_out = mant;
+}
+
+static void APCM_quantization (
+ word * xM, /* [0..12] IN */
+ word * xMc, /* [0..12] OUT */
+ word * mant_out, /* OUT */
+ word * expon_out, /* OUT */
+ word * xmaxc_out /* OUT */
+)
+{
+ int i, itest;
+
+ word xmax, xmaxc, temp, temp1, temp2;
+ word expon, 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.
+ */
+
+ expon = 0;
+ temp = SASR_W( xmax, 9 );
+ itest = 0;
+
+ for (i = 0; i <= 5; i++) {
+
+ itest |= (temp <= 0);
+ temp = SASR_W( temp, 1 );
+
+ assert(expon <= 5);
+ if (itest == 0) expon++; /* expon = add (expon, 1) */
+ }
+
+ assert(expon <= 6 && expon >= 0);
+ temp = expon + 5;
+
+ assert(temp <= 11 && temp >= 0);
+ xmaxc = gsm_add( SASR_W(xmax, temp), (word) (expon << 3) );
+
+ /* Quantizing and coding of the xM[0..12] RPE sequence
+ * to get the xMc[0..12]
+ */
+
+ APCM_quantization_xmaxc_to_exp_mant( xmaxc, &expon, &mant );
+
+ /* This computation uses the fact that the decoded version of xmaxc
+ * can be calculated by using the expononent 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 expononent. 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( expon <= 4096 && expon >= -4096);
+ assert( mant >= 0 && mant <= 7 );
+
+ temp1 = 6 - expon; /* normalization by the expononent */
+ temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */
+
+ for (i = 0; i <= 12; i++) {
+
+ assert(temp1 >= 0 && temp1 < 16);
+
+ temp = xM[i] << temp1;
+ temp = GSM_MULT( temp, temp2 );
+ temp = SASR_W(temp, 12);
+ xMc[i] = temp + 4; /* see note below */
+ }
+
+ /* NOTE: This equation is used to make all the xMc[i] positive.
+ */
+
+ *mant_out = mant;
+ *expon_out = expon;
+ *xmaxc_out = xmaxc;
+}
+
+/* 4.2.16 */
+
+static void APCM_inverse_quantization (
+ register word * xMc, /* [0..12] IN */
+ word mant,
+ word expon,
+ 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;
+
+ assert( mant >= 0 && mant <= 7 );
+
+ temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */
+ temp2 = gsm_sub( 6, expon ); /* 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 = GSM_MULT_R( temp1, temp );
+ temp = GSM_ADD( temp, temp3 );
+ *xMp++ = gsm_asr( temp, temp2 );
+ }
+}
+
+/* 4.2.17 */
+
+static void RPE_grid_positioning (
+ 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 (
+ 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 (
+ /*-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, expon;
+
+ Weighting_filter(e, x);
+ RPE_grid_selection(x, xM, Mc);
+
+ APCM_quantization( xM, xMc, &mant, &expon, xmaxc);
+ APCM_inverse_quantization( xMc, mant, expon, xMp);
+
+ RPE_grid_positioning( *Mc, xMp, e );
+
+}
+
+void Gsm_RPE_Decoding (
+ /*-struct gsm_state * S,-*/
+
+ word xmaxcr,
+ word Mcr,
+ word * xMcr, /* [0..12], 3 bits IN */
+ word * erp /* [0..39] OUT */
+)
+{
+ word expon, mant;
+ word xMp[ 13 ];
+
+ APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &expon, &mant );
+ APCM_inverse_quantization( xMcr, mant, expon, xMp );
+ RPE_grid_positioning( Mcr, xMp, erp );
+
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 82005b9e-1560-4e94-9ddb-00cb14867295
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/short_term.c b/orkbasecxx/filters/gsm/gsm610/short_term.c
new file mode 100644
index 0000000..ac0c09a
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/short_term.c
@@ -0,0 +1,427 @@
+/*
+ * 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 "gsm610_priv.h"
+
+#include "gsm.h"
+
+/*
+ * SHORT TERM ANALYSIS FILTERING SECTION
+ */
+
+/* 4.2.8 */
+
+static void Decoding_of_the_coded_Log_Area_Ratios (
+ word * LARc, /* coded log area ratio [0..7] IN */
+ word * LARpp) /* out: decoded .. */
+{
+ register word temp1 /* , temp2 */;
+
+ /* 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 = GSM_ADD( *LARc++, MIC ) << 10; \
+ temp1 = GSM_SUB( temp1, B << 1 ); \
+ temp1 = GSM_MULT_R( INVA, temp1 ); \
+ *LARpp++ = 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 (
+ register word * LARpp_j_1,
+ register word * LARpp_j,
+ register word * LARp)
+{
+ register int i;
+
+ for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
+ *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
+ *LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j_1, 1));
+ }
+}
+
+static void Coefficients_13_26 (
+ register word * LARpp_j_1,
+ register word * LARpp_j,
+ register word * LARp)
+{
+ register int i;
+ for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+ *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 1), SASR_W( *LARpp_j, 1 ));
+ }
+}
+
+static void Coefficients_27_39 (
+ register word * LARpp_j_1,
+ register word * LARpp_j,
+ register word * LARp)
+{
+ register int i;
+
+ for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+ *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
+ *LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j, 1 ));
+ }
+}
+
+
+static void Coefficients_40_159 (
+ 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 (
+ 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;
+
+ 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
+ : GSM_ADD( (word) (temp >> 2), (word) 26112 )));
+ } else {
+ temp = *LARp;
+ *LARp = (temp < 11059) ? temp << 1
+ : ((temp < 20070) ? temp + 11059
+ : GSM_ADD( (word) (temp >> 2), (word) 26112 ));
+ }
+ }
+}
+
+
+/* 4.2.10 */
+static void Short_term_analysis_filtering (
+ 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;
+
+ for (; k_n--; s++) {
+
+ di = sav = *s;
+
+ for (i = 0; i < 8; i++) { /* YYY */
+
+ ui = u[i];
+ rpi = rp[i];
+ u[i] = sav;
+
+ zzz = GSM_MULT_R(rpi, di);
+ sav = GSM_ADD( ui, zzz);
+
+ zzz = GSM_MULT_R(rpi, ui);
+ di = GSM_ADD( di, zzz );
+ }
+
+ *s = di;
+ }
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Short_term_analysis_filtering (
+ 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 (
+ 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;
+
+ 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 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
+ ? MAX_WORD
+ : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
+ + 16384) >> 15)) ;
+
+ sri = GSM_SUB( sri, tmp2 );
+
+ /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
+ */
+ tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD
+ ? MAX_WORD
+ : 0x0FFFF & (( (longword)tmp1 * (longword)sri
+ + 16384) >> 15)) ;
+
+ v[i+1] = GSM_ADD( v[i], tmp1);
+ }
+ *sr++ = v[0] = sri;
+ }
+}
+
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+
+static void Fast_Short_term_synthesis_filtering (
+ 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 (
+
+ 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 (
+ 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);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 019ac7ba-c6dd-4540-abf0-8644b6c4a633
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/table.c b/orkbasecxx/filters/gsm/gsm610/table.c
new file mode 100644
index 0000000..7da3eea
--- /dev/null
+++ b/orkbasecxx/filters/gsm/gsm610/table.c
@@ -0,0 +1,69 @@
+/*
+ * 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 "gsm610_priv.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 };
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 8957c531-e6b0-4097-9202-da7ca42729ca
+*/
+