summaryrefslogtreecommitdiff
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
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
-rw-r--r--orkbasecxx/OrkBase.dsp92
-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
20 files changed, 19627 insertions, 2 deletions
diff --git a/orkbasecxx/OrkBase.dsp b/orkbasecxx/OrkBase.dsp
index b3d2a89..091eec8 100644
--- a/orkbasecxx/OrkBase.dsp
+++ b/orkbasecxx/OrkBase.dsp
@@ -42,7 +42,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /Ob0 /I "." /I "C:\devExt\libsndfile\src" /I "C:\devExt\boost\boost_1_32_0" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /D "BUILD_ORKBASE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /Ob0 /I "." /I "./filters/gsm" /I "./filters/gsm/gsm610" /I "C:\devExt\libsndfile\src" /I "C:\devExt\boost\boost_1_32_0" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /D "BUILD_ORKBASE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D inline=__inline /FD /c
# SUBTRACT CPP /YX /Yc /Yu
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
@@ -73,7 +73,7 @@ PostBuild_Cmds=copy Release\OrkBase.dll ..\OrkAudio\OrkBase.dll
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "C:\devExt\libsndfile\src" /I "C:\devExt\boost\boost_1_32_0" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /D "BUILD_ORKBASE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "./filters/gsm" /I "./filters/gsm/gsm610" /I "C:\devExt\libsndfile\src" /I "C:\devExt\boost\boost_1_32_0" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /D "BUILD_ORKBASE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D inline=__inline /FR /FD /GZ /c
# SUBTRACT CPP /YX /Yc /Yu
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
@@ -310,6 +310,94 @@ SOURCE=.\audiofile\PcmFile.cpp
SOURCE=.\audiofile\PcmFile.h
# End Source File
# End Group
+# Begin Group "filters"
+
+# PROP Default_Filter ""
+# Begin Group "gsm"
+
+# PROP Default_Filter ""
+# Begin Group "gsm610"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\add.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\code.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\config.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\decode.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\gsm.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\gsm610_priv.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\gsm_create.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\gsm_decode.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\gsm_destroy.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\gsm_encode.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\gsm_option.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\long_term.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\lpc.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\preprocess.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\rpe.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\short_term.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\gsm610\table.c
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\filters\gsm\GsmFilters.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\filters\gsm\GsmFilters.h
+# End Source File
+# End Group
+# End Group
# Begin Source File
SOURCE=.\AudioCapture.cpp
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
+*/
+