diff options
author | Henri Herscher <henri@oreka.org> | 2006-11-10 02:50:26 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2006-11-10 02:50:26 +0000 |
commit | 4fc16507815bc36b055aa4cc8b4160e318ad1dc3 (patch) | |
tree | 8069cf251a5b64894796edd1af66e6374a561821 /orkbasecxx/filters | |
parent | 3801002d76f57d2d4828a0bea289af7099af8455 (diff) |
GSM code from Berlin Technische Universitaet is now included directly in the orkbasecxx dll build instead of leveraging libsndfile because of linking problems under Linux.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@350 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/filters')
19 files changed, 19537 insertions, 0 deletions
diff --git a/orkbasecxx/filters/gsm/gsm610/COPYRIGHT b/orkbasecxx/filters/gsm/gsm610/COPYRIGHT new file mode 100644 index 0000000..eba0e52 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/COPYRIGHT @@ -0,0 +1,16 @@ +Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, +Technische Universitaet Berlin + +Any use of this software is permitted provided that this notice is not +removed and that neither the authors nor the Technische Universitaet Berlin +are deemed to have made any representations as to the suitability of this +software for any purpose nor are held responsible for any defects of +this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + +As a matter of courtesy, the authors request to be informed about uses +this software has found, about bugs in this software, and about any +improvements that may be of general interest. + +Berlin, 28.11.1994 +Jutta Degener +Carsten Bormann diff --git a/orkbasecxx/filters/gsm/gsm610/add.c b/orkbasecxx/filters/gsm/gsm610/add.c new file mode 100644 index 0000000..607b5a2 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/add.c @@ -0,0 +1,248 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*
+ * See private.h for the more commonly used macro versions.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+#include "gsm.h"
+
+#define saturate(x) \
+ ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
+
+word gsm_add ( word a, word b)
+{
+ longword sum = (longword)a + (longword)b;
+ return saturate(sum);
+}
+
+word gsm_sub ( word a, word b)
+{
+ longword diff = (longword)a - (longword)b;
+ return saturate(diff);
+}
+
+word gsm_mult ( word a, word b)
+{
+ if (a == MIN_WORD && b == MIN_WORD)
+ return MAX_WORD;
+
+ return SASR_L( (longword)a * (longword)b, 15 );
+}
+
+word gsm_mult_r ( word a, word b)
+{
+ if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
+ else {
+ longword prod = (longword)a * (longword)b + 16384;
+ prod >>= 15;
+ return prod & 0xFFFF;
+ }
+}
+
+word gsm_abs (word a)
+{
+ return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
+}
+
+longword gsm_L_mult (word a, word b)
+{
+ assert( a != MIN_WORD || b != MIN_WORD );
+ return ((longword)a * (longword)b) << 1;
+}
+
+longword gsm_L_add ( longword a, longword b)
+{
+ if (a < 0) {
+ if (b >= 0) return a + b;
+ else {
+ ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
+ return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
+ }
+ }
+ else if (b <= 0) return a + b;
+ else {
+ ulongword A = (ulongword)a + (ulongword)b;
+ return A > MAX_LONGWORD ? MAX_LONGWORD : A;
+ }
+}
+
+longword gsm_L_sub ( longword a, longword b)
+{
+ if (a >= 0) {
+ if (b >= 0) return a - b;
+ else {
+ /* a>=0, b<0 */
+
+ ulongword A = (ulongword)a + -(b + 1);
+ return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
+ }
+ }
+ else if (b <= 0) return a - b;
+ else {
+ /* a<0, b>0 */
+
+ ulongword A = (ulongword)-(a + 1) + b;
+ return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
+ }
+}
+
+static unsigned char const bitoff[ 256 ] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+word gsm_norm (longword a )
+/*
+ * the number of left shifts needed to normalize the 32 bit
+ * variable L_var1 for positive values on the interval
+ *
+ * with minimum of
+ * minimum of 1073741824 (01000000000000000000000000000000) and
+ * maximum of 2147483647 (01111111111111111111111111111111)
+ *
+ *
+ * and for negative values on the interval with
+ * minimum of -2147483648 (-10000000000000000000000000000000) and
+ * maximum of -1073741824 ( -1000000000000000000000000000000).
+ *
+ * in order to normalize the result, the following
+ * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
+ *
+ * (That's 'ffs', only from the left, not the right..)
+ */
+{
+ assert(a != 0);
+
+ if (a < 0) {
+ if (a <= -1073741824) return 0;
+ a = ~a;
+ }
+
+ return a & 0xffff0000
+ ? ( a & 0xff000000
+ ? -1 + bitoff[ 0xFF & (a >> 24) ]
+ : 7 + bitoff[ 0xFF & (a >> 16) ] )
+ : ( a & 0xff00
+ ? 15 + bitoff[ 0xFF & (a >> 8) ]
+ : 23 + bitoff[ 0xFF & a ] );
+}
+
+longword gsm_L_asl (longword a, int n)
+{
+ if (n >= 32) return 0;
+ if (n <= -32) return -(a < 0);
+ if (n < 0) return gsm_L_asr(a, -n);
+ return a << n;
+}
+
+word gsm_asr (word a, int n)
+{
+ if (n >= 16) return -(a < 0);
+ if (n <= -16) return 0;
+ if (n < 0) return a << -n;
+
+ return SASR_W (a, (word) n);
+}
+
+word gsm_asl (word a, int n)
+{
+ if (n >= 16) return 0;
+ if (n <= -16) return -(a < 0);
+ if (n < 0) return gsm_asr(a, -n);
+ return a << n;
+}
+
+longword gsm_L_asr (longword a, int n)
+{
+ if (n >= 32) return -(a < 0);
+ if (n <= -32) return 0;
+ if (n < 0) return a << -n;
+
+ return SASR_L (a, (word) n);
+}
+
+/*
+** word gsm_asr (word a, int n)
+** {
+** if (n >= 16) return -(a < 0);
+** if (n <= -16) return 0;
+** if (n < 0) return a << -n;
+**
+** # ifdef SASR_W
+** return a >> n;
+** # else
+** if (a >= 0) return a >> n;
+** else return -(word)( -(uword)a >> n );
+** # endif
+** }
+**
+*/
+/*
+ * (From p. 46, end of section 4.2.5)
+ *
+ * NOTE: The following lines gives [sic] one correct implementation
+ * of the div(num, denum) arithmetic operation. Compute div
+ * which is the integer division of num by denum: with denum
+ * >= num > 0
+ */
+
+word gsm_div (word num, word denum)
+{
+ longword L_num = num;
+ longword L_denum = denum;
+ word div = 0;
+ int k = 15;
+
+ /* The parameter num sometimes becomes zero.
+ * Although this is explicitly guarded against in 4.2.5,
+ * we assume that the result should then be zero as well.
+ */
+
+ /* assert(num != 0); */
+
+ assert(num >= 0 && denum >= num);
+ if (num == 0)
+ return 0;
+
+ while (k--) {
+ div <<= 1;
+ L_num <<= 1;
+
+ if (L_num >= L_denum) {
+ L_num -= L_denum;
+ div++;
+ }
+ }
+
+ return div;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: a7398579-e2e1-4733-aa2d-4c6efc0c58ff
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/code.c b/orkbasecxx/filters/gsm/gsm610/code.c new file mode 100644 index 0000000..3dc7732 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/code.c @@ -0,0 +1,97 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "config.h"
+
+#include "gsm610_priv.h"
+#include "gsm.h"
+
+/*
+ * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER
+ */
+
+void Gsm_Coder (
+
+ struct gsm_state * State,
+
+ word * s, /* [0..159] samples IN */
+
+/*
+ * The RPE-LTD coder works on a frame by frame basis. The length of
+ * the frame is equal to 160 samples. Some computations are done
+ * once per frame to produce at the output of the coder the
+ * LARc[1..8] parameters which are the coded LAR coefficients and
+ * also to realize the inverse filtering operation for the entire
+ * frame (160 samples of signal d[0..159]). These parts produce at
+ * the output of the coder:
+ */
+
+ word * LARc, /* [0..7] LAR coefficients OUT */
+
+/*
+ * Procedure 4.2.11 to 4.2.18 are to be executed four times per
+ * frame. That means once for each sub-segment RPE-LTP analysis of
+ * 40 samples. These parts produce at the output of the coder:
+ */
+
+ word * Nc, /* [0..3] LTP lag OUT */
+ word * bc, /* [0..3] coded LTP gain OUT */
+ word * Mc, /* [0..3] RPE grid selection OUT */
+ word * xmaxc,/* [0..3] Coded maximum amplitude OUT */
+ word * xMc /* [13*4] normalized RPE samples OUT */
+)
+{
+ int k;
+ word * dp = State->dp0 + 120; /* [ -120...-1 ] */
+ word * dpp = dp; /* [ 0...39 ] */
+
+ word so[160];
+
+ Gsm_Preprocess (State, s, so);
+ Gsm_LPC_Analysis (State, so, LARc);
+ Gsm_Short_Term_Analysis_Filter (State, LARc, so);
+
+ for (k = 0; k <= 3; k++, xMc += 13) {
+
+ Gsm_Long_Term_Predictor ( State,
+ so+k*40, /* d [0..39] IN */
+ dp, /* dp [-120..-1] IN */
+ State->e + 5, /* e [0..39] OUT */
+ dpp, /* dpp [0..39] OUT */
+ Nc++,
+ bc++);
+
+ Gsm_RPE_Encoding ( /*-S,-*/
+ State->e + 5, /* e ][0..39][ IN/OUT */
+ xmaxc++, Mc++, xMc );
+ /*
+ * Gsm_Update_of_reconstructed_short_time_residual_signal
+ * ( dpp, e + 5, dp );
+ */
+
+ { register int i;
+ for (i = 0; i <= 39; i++)
+ dp[ i ] = GSM_ADD( State->e[5 + i], dpp[i] );
+ }
+ dp += 40;
+ dpp += 40;
+
+ }
+ (void)memcpy( (char *)State->dp0, (char *)(State->dp0 + 160),
+ 120 * sizeof(*State->dp0) );
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: ae8ef1b2-5a1e-4263-94cd-42b15dca81a3
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/config.h b/orkbasecxx/filters/gsm/gsm610/config.h new file mode 100644 index 0000000..8c2c059 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/config.h @@ -0,0 +1,33 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */
+#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */
+
+#define HAS_FSTAT 1 /* fstat syscall */
+#define HAS_FCHMOD 1 /* fchmod syscall */
+#define HAS_CHMOD 1 /* chmod syscall */
+#define HAS_FCHOWN 1 /* fchown syscall */
+#define HAS_CHOWN 1 /* chown syscall */
+
+#define HAS_STRING_H 1 /* /usr/include/string.h */
+
+#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */
+#define HAS_UTIME 1 /* POSIX utime(path, times) */
+#define HAS_UTIME_H 1 /* UTIME header file */
+
+#endif /* CONFIG_H */
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 5338dfef-8e59-4f51-af47-627c9ea85353
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/cscope.out b/orkbasecxx/filters/gsm/gsm610/cscope.out new file mode 100644 index 0000000..c6b9268 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/cscope.out @@ -0,0 +1,15350 @@ +cscope 15 c:/sfTrunk/orkbasecxx/filters/gsm/gsm610 0000076221 + @add.c + +11 + ~<¡dio.h +> + +12 + ~<as£¹.h +> + +14 + ~"gsm610_´iv.h +" + +15 + ~"gsm.h +" + +17 + #§tu¿‹ +( +x +) \ + +18 (( +x +è< +MIN_WORD + ? MIN_WORD : (xè> +MAX_WORD + ? MAX_WORD: (x)) + + ) + +20 +wÜd + + $gsm_add + ( +wÜd + +a +, wÜd +b +) + +22 +lÚgwÜd + +sum + = (lÚgwÜd) +a + + (lÚgwÜd) +b +; + +23 + `§tu¿‹ +( +sum +); + +24 + } +} + +26 +wÜd + + $gsm_sub + ( +wÜd + +a +, wÜd +b +) + +28 +lÚgwÜd + +diff + = (lÚgwÜd) +a + - (lÚgwÜd) +b +; + +29 + `§tu¿‹ +( +diff +); + +30 + } +} + +32 +wÜd + + $gsm_muÉ + ( +wÜd + +a +, wÜd +b +) + +34 ià( +a + =ð +MIN_WORD + && +b + == MIN_WORD) + +35 +MAX_WORD +; + +37 + `SASR_L +Ð( +lÚgwÜd +) +a + * (lÚgwÜd) +b +, 15 ); + +38 + } +} + +40 +wÜd + + $gsm_muÉ_r + ( +wÜd + +a +, wÜd +b +) + +42 ià( +b + =ð +MIN_WORD + && +a + =ðMIN_WORDè +MAX_WORD +; + +44 +lÚgwÜd + +´od + = (lÚgwÜd) +a + * (lÚgwÜd) +b + + 16384; + +45 +´od + >>= 15; + +46 +´od + & 0xFFFF; + +48 + } +} + +50 +wÜd + + $gsm_abs + ( +wÜd + +a +) + +52 +a + < 0 ? (¨=ð +MIN_WORD + ? +MAX_WORD + : -a) :‡; + +53 + } +} + +55 +lÚgwÜd + + $gsm_L_muÉ + ( +wÜd + +a +, wÜd +b +) + +57 + `as£¹ +Ð +a + !ð +MIN_WORD + || +b + != MIN_WORD ); + +58 (( +lÚgwÜd +) +a + * (lÚgwÜd) +b +) << 1; + +59 + } +} + +61 +lÚgwÜd + + $gsm_L_add + ( +lÚgwÜd + +a +,†ÚgwÜd +b +) + +63 ià( +a + < 0) { + +64 ià( +b + >ð0è +a + + b; + +66 +ulÚgwÜd + +A + = (ulÚgwÜd)-( +a + + 1è+ (ulÚgwÜd)-( +b + + 1); + +67 +A + >ð +MAX_LONGWORD + ? +MIN_LONGWORD + :-( +lÚgwÜd +)A-2; + +70 ià( +b + <ð0è +a + + b; + +72 +ulÚgwÜd + +A + = (ulÚgwÜd) +a + + (ulÚgwÜd) +b +; + +73 +A + > +MAX_LONGWORD + ? MAX_LONGWORD : A; + +75 + } +} + +77 +lÚgwÜd + + $gsm_L_sub + ( +lÚgwÜd + +a +,†ÚgwÜd +b +) + +79 ià( +a + >= 0) { + +80 ià( +b + >ð0è +a + - b; + +84 +ulÚgwÜd + +A + = (ulÚgwÜd) +a + + -( +b + + 1); + +85 +A + >ð +MAX_LONGWORD + ? MAX_LONGWORD : (A + 1); + +88 ià( +b + <ð0è +a + - b; + +92 +ulÚgwÜd + +A + = (ulÚgwÜd)-( +a + + 1è+ +b +; + +93 +A + >ð +MAX_LONGWORD + ? +MIN_LONGWORD + : -( +lÚgwÜd +)A - 1; + +95 + } +} + +97 cÚ¡ + gb™off +[ 256 ] = { + +116 +wÜd + + $gsm_nÜm + ( +lÚgwÜd + +a + ) + +136 + `as£¹ +( +a + != 0); + +138 ià( +a + < 0) { + +139 ià( +a + <= -1073741824) 0; + +140 +a + = ~a; + +143 +a + & 0xffff0000 + +144 ? ( +a + & 0xff000000 + +145 ? -1 + +b™off +[ 0xFF & ( +a + >> 24) ] + +146 : 7 + +b™off +[ 0xFF & ( +a + >> 16) ] ) + +147 : ( +a + & 0xff00 + +148 ? 15 + +b™off +[ 0xFF & ( +a + >> 8) ] + +149 : 23 + +b™off +[ 0xFF & +a + ] ); + +150 + } +} + +152 +lÚgwÜd + + $gsm_L_a¦ + ( +lÚgwÜd + +a +, +n +) + +154 ià( +n + >= 32) 0; + +155 ià( +n + <ð-32è -( +a + < 0); + +156 ià( +n + < 0è + `gsm_L_a¤ +( +a +, -n); + +157 +a + << +n +; + +158 + } +} + +160 +wÜd + + $gsm_a¤ + ( +wÜd + +a +, +n +) + +162 ià( +n + >ð16è -( +a + < 0); + +163 ià( +n + <= -16) 0; + +164 ià( +n + < 0è +a + << -n; + +166 + `SASR_W + ( +a +, ( +wÜd +è +n +); + +167 + } +} + +169 +wÜd + + $gsm_a¦ + ( +wÜd + +a +, +n +) + +171 ià( +n + >= 16) 0; + +172 ià( +n + <ð-16è -( +a + < 0); + +173 ià( +n + < 0è + `gsm_a¤ +( +a +, -n); + +174 +a + << +n +; + +175 + } +} + +177 +lÚgwÜd + + $gsm_L_a¤ + ( +lÚgwÜd + +a +, +n +) + +179 ià( +n + >ð32è -( +a + < 0); + +180 ià( +n + <= -32) 0; + +181 ià( +n + < 0è +a + << -n; + +183 + `SASR_L + ( +a +, ( +wÜd +è +n +); + +184 + } +} + +211 +wÜd + + $gsm_div + ( +wÜd + +num +, wÜd +d’um +) + +213 +lÚgwÜd + +L_num + = +num +; + +214 +lÚgwÜd + +L_d’um + = +d’um +; + +215 +wÜd + +div + = 0; + +216 +k + = 15; + +225 + `as£¹ +( +num + >ð0 && +d’um + >=‚um); + +226 ià( +num + == 0) + +229 +k +--) { + +230 +div + <<= 1; + +231 +L_num + <<= 1; + +233 ià( +L_num + >ð +L_d’um +) { + +234 +L_num + -ð +L_d’um +; + +235 +div +++; + +239 +div +; + +240 + } +} + + @code.c + +8 + ~<¡dlib.h +> + +9 + ~<¡ršg.h +> + +11 + ~"cÚfig.h +" + +13 + ~"gsm610_´iv.h +" + +14 + ~"gsm.h +" + +20 + $Gsm_Cod” + ( + +22 +gsm_¡©e + * +S‹ +, + +24 +wÜd + * +s +, + +36 +wÜd + * +LARc +, + +44 +wÜd + * +Nc +, + +45 +wÜd + * +bc +, + +46 +wÜd + * +Mc +, + +47 +wÜd + * +xmaxc +, + +48 +wÜd + * +xMc + + +51 +k +; + +52 +wÜd + * +dp + = +S‹ +-> +dp0 + + 120; + +53 +wÜd + * +dµ + = +dp +; + +55 +wÜd + +so +[160]; + +57 + `Gsm_P»´oûss + ( +S‹ +, +s +, +so +); + +58 + `Gsm_LPC_AÇlysis + ( +S‹ +, +so +, +LARc +); + +59 + `Gsm_ShÜt_T”m_AÇlysis_Fž‹r + ( +S‹ +, +LARc +, +so +); + +61 +k + = 0; k <ð3; k++, +xMc + += 13) { + +63 + `Gsm_LÚg_T”m_P»diùÜ + ( +S‹ +, + +64 +so ++ +k +*40, + +65 +dp +, + +66 +S‹ +-> +e + + 5, + +67 +dµ +, + +68 +Nc +++, + +69 +bc +++); + +71 + `Gsm_RPE_Encodšg + ( + +72 +S‹ +-> +e + + 5, + +73 +xmaxc +++, +Mc +++, +xMc + ); + +79 { +i +; + +80 +i + = 0; i <= 39; i++) + +81 +dp +[ +i + ] = + `GSM_ADD +Ð +S‹ +-> +e +[5 + i], +dµ +[i] ); + +83 +dp + += 40; + +84 +dµ + += 40; + +87 () + `memýy +Ð(*) +S‹ +-> +dp0 +, (*)(State->dp0 + 160), + +88 120 * (* +S‹ +-> +dp0 +) ); + +89 + } +} + + @config.h + +7 #iâdef +CONFIG_H + + +8 + #CONFIG_H + + + ) + +10 + #HAS_STDLIB_H + 1 + + ) + +11 + #HAS_FCNTL_H + 1 + + ) + +13 + #HAS_FSTAT + 1 + + ) + +14 + #HAS_FCHMOD + 1 + + ) + +15 + #HAS_CHMOD + 1 + + ) + +16 + #HAS_FCHOWN + 1 + + ) + +17 + #HAS_CHOWN + 1 + + ) + +19 + #HAS_STRING_H + 1 + + ) + +21 + #HAS_UNISTD_H + 1 + + ) + +22 + #HAS_UTIME + 1 + + ) + +23 + #HAS_UTIME_H + 1 + + ) + + @decode.c + +7 + ~<¡dio.h +> + +9 + ~"gsm610_´iv.h +" + +10 + ~"gsm.h +" + +16 + $Po¡´oûssšg + ( + +17 +gsm_¡©e + * +S +, + +18 +wÜd + * +s +) + +20 +k +; + +21 +wÜd + +m¤ + = +S +->msr; + +22 +wÜd + +tmp +; + +24 +k + = 160; k--; +s +++) { + +25 +tmp + = + `GSM_MULT_R +Ð +m¤ +, 28180 ); + +26 +m¤ + = + `GSM_ADD +(* +s +, +tmp +); + +27 * +s + = + `GSM_ADD +( +m¤ +, msr) & 0xFFF8; + +29 +S +-> +m¤ + = msr; + +30 + } +} + +32 + $Gsm_Decod” + ( + +33 +gsm_¡©e + * +S +, + +35 +wÜd + * +LARü +, + +37 +wÜd + * +Nü +, + +38 +wÜd + * +bü +, + +39 +wÜd + * +Mü +, + +40 +wÜd + * +xmaxü +, + +41 +wÜd + * +xMü +, + +43 +wÜd + * +s +) + +45 +j +, +k +; + +46 +wÜd + +”p +[40], +wt +[160]; + +47 +wÜd + * +d½ + = +S +-> +dp0 + + 120; + +49 +j +=0; j <ð3; j++, +xmaxü +++, +bü +++, +Nü +++, +Mü +++, +xMü + += 13) { + +51 + `Gsm_RPE_Decodšg +Ð * +xmaxü +, * +Mü +, +xMü +, +”p + ); + +52 + `Gsm_LÚg_T”m_SyÁhesis_Fž‹ršg +Ð +S +, * +Nü +, * +bü +, +”p +, +d½ + ); + +54 +k + = 0; k <ð39; k++è +wt +[ +j + * 40 + k ] = +d½ +[ k ]; + +57 + `Gsm_ShÜt_T”m_SyÁhesis_Fž‹r +Ð +S +, +LARü +, +wt +, +s + ); + +58 + `Po¡´oûssšg +( +S +, +s +); + +59 + } +} + + @gsm.h + +7 #iâdef +GSM_H + + +8 + #GSM_H + + + ) + +10 + ~<¡dio.h +> + +16 +gsm_¡©e + * + tgsm +; + +17 + tgsm_sigÇl +; + +18 + tgsm_by‹ +; + +19 +gsm_by‹ + + tgsm_äame +[33]; + +21 + #GSM_MAGIC + 0xD + + ) + +23 + #GSM_PATCHLEVEL + 10 + + ) + +24 + #GSM_MINOR + 0 + + ) + +25 + #GSM_MAJOR + 1 + + ) + +27 + #GSM_OPT_VERBOSE + 1 + + ) + +28 + #GSM_OPT_FAST + 2 + + ) + +29 + #GSM_OPT_LTP_CUT + 3 + + ) + +30 + #GSM_OPT_WAV49 + 4 + + ) + +31 + #GSM_OPT_FRAME_INDEX + 5 + + ) + +32 + #GSM_OPT_FRAME_CHAIN + 6 + + ) + +34 +gsm + +gsm_ü—‹ + (); + +37 +gsm_š™ + ( +gsm +); + +39 +gsm_de¡roy + ( +gsm +); + +41 +gsm_´št + ( +FILE + *, +gsm +, +gsm_by‹ + *); + +42 +gsm_ÝtiÚ + ( +gsm +, , *); + +44 +gsm_’code + ( +gsm +, +gsm_sigÇl + *, +gsm_by‹ + *); + +45 +gsm_decode + ( +gsm +, +gsm_by‹ + *, +gsm_sigÇl + *); + +47 +gsm_ex¶ode + ( +gsm +, +gsm_by‹ + *, +gsm_sigÇl + *); + +48 +gsm_im¶ode + ( +gsm +, +gsm_sigÇl + *, +gsm_by‹ + *); + + @gsm610_priv.h + +7 #iâdef +PRIVATE_H + + +8 + #PRIVATE_H + + + ) + +11 + #USE_FLOAT_MUL + + + ) + +12 + #FAST + + + ) + +13 + #WAV49 + + + ) + +18 + twÜd +; + +19 + tlÚgwÜd +; + +21 + tuwÜd +; + +22 + tulÚgwÜd +; + +24 + sgsm_¡©e + + +25 { +wÜd + + mdp0 +[ 280 ] ; + +27 +wÜd + + mz1 +; + +28 +lÚgwÜd + + mL_z2 +; + +29 + mmp +; + +31 +wÜd + + mu +[8] ; + +32 +wÜd + + mLARµ +[2][8] ; + +33 +wÜd + + mj +; + +35 +wÜd + + mÉp_cut +; + +36 +wÜd + + mÄp +; + +37 +wÜd + + mv +[9] ; + +38 +wÜd + + mm¤ +; + +40 + mv”bo£ +; + +41 + mç¡ +; + +43 + mwav_fmt +; + +44 + mäame_šdex +; + +45 + mäame_chaš +; + +48 +wÜd + + me +[50] ; + +51 +gsm_¡©e + + tGSM_STATE + ; + +53 + #MIN_WORD + (-32767 - 1) + + ) + +54 + #MAX_WORD + 32767 + + ) + +56 + #MIN_LONGWORD + (-2147483647 - 1) + + ) + +57 + #MAX_LONGWORD + 2147483647 + + ) + +60 +šlše + +wÜd + + +61 + $SASR_W + ( +wÜd + +x +, wÜd +by +) + +62 { ( +x + >> +by +) ; + +63 + } +} + +65 +šlše + +lÚgwÜd + + +66 + $SASR_L + ( +lÚgwÜd + +x +, +wÜd + +by +) + +67 { ( +x + >> +by +) ; + +68 + } +} + +73 +wÜd + +gsm_muÉ + (wÜd +a +, wÜd +b +) ; + +74 +lÚgwÜd + +gsm_L_muÉ + ( +wÜd + +a +, wÜd +b +) ; + +75 +wÜd + +gsm_muÉ_r + (wÜd +a +, wÜd +b +) ; + +77 +wÜd + +gsm_div + (wÜd +num +, wÜd +d’um +) ; + +79 +wÜd + +gsm_add + (wÜd +a +, wÜd +b + ) ; + +80 +lÚgwÜd + +gsm_L_add + (lÚgwÜd +a +,†ÚgwÜd +b + ) ; + +82 +wÜd + +gsm_sub + (wÜd +a +, wÜd +b +) ; + +83 +lÚgwÜd + +gsm_L_sub + (lÚgwÜd +a +,†ÚgwÜd +b +) ; + +85 +wÜd + +gsm_abs + (wÜd +a +) ; + +87 +wÜd + +gsm_nÜm + ( +lÚgwÜd + +a + ) ; + +89 +lÚgwÜd + +gsm_L_a¦ + (lÚgwÜd +a +, +n +) ; + +90 +wÜd + +gsm_a¦ + (wÜd +a +, +n +) ; + +92 +lÚgwÜd + +gsm_L_a¤ + (lÚgwÜd +a +, +n +) ; + +93 +wÜd + +gsm_a¤ + (wÜd +a +, +n +) ; + +99 +šlše + +lÚgwÜd + + +100 + $GSM_MULT_R + ( +wÜd + +a +, wÜd +b +) + +101 { ((( +lÚgwÜd +è( +a +)è* (ÖÚgwÜdè( +b +)) + 16384) >> 15 ; + +102 + } +} + +104 +šlše + +lÚgwÜd + + +105 + $GSM_MULT + ( +wÜd + +a +, wÜd +b +) + +106 { ((( +lÚgwÜd +è( +a +)è* (ÖÚgwÜdè( +b +))) >> 15 ; + +107 + } +} + +109 +šlše + +lÚgwÜd + + +110 + $GSM_L_MULT + ( +wÜd + +a +, wÜd +b +) + +111 { (( +lÚgwÜd +è( +a +)è* (ÖÚgwÜdè( +b +)) << 1 ; + +112 + } +} + +114 +šlše + +lÚgwÜd + + +115 + $GSM_L_ADD + ( +lÚgwÜd + +a +,†ÚgwÜd +b +) + +116 { +ulÚgwÜd + +utmp + ; + +118 ià( +a + < 0 && +b + < 0) + +119 { +utmp + = ( +ulÚgwÜd +)-(( +a +è+ 1è+ (ulÚgwÜd)-(( +b +) + 1) ; + +120 ( +utmp + >ð( +ulÚgwÜd +è +MAX_LONGWORD +è? +MIN_LONGWORD + : -( +lÚgwÜd +)utmp-2 ; + +123 ià( +a + > 0 && +b + > 0) + +124 { +utmp + = ( +ulÚgwÜd +è +a + + (ulÚgwÜdè +b + ; + +125 ( +utmp + >ð( +ulÚgwÜd +è +MAX_LONGWORD +) ? MAX_LONGWORD : utmp ; + +128 +a + + +b + ; + +129 + } +} + +131 +šlše + +lÚgwÜd + + +132 + $GSM_ADD + ( +wÜd + +a +, wÜd +b +) + +133 { +lÚgwÜd + +Émp + ; + +135 +Émp + = (( +lÚgwÜd +è +a +è+ (ÖÚgwÜdè +b +) ; + +137 ià( +Émp + >ð +MAX_WORD +) + +138 +MAX_WORD + ; + +139 ià( +Émp + <ð +MIN_WORD +) + +140 +MIN_WORD + ; + +142 +Émp + ; + +143 + } +} + +145 +šlše + +lÚgwÜd + + +146 + $GSM_SUB + ( +wÜd + +a +, wÜd +b +) + +147 { +lÚgwÜd + +Émp + ; + +149 +Émp + = (( +lÚgwÜd +è +a +è- (ÖÚgwÜdè +b +) ; + +151 ià( +Émp + >ð +MAX_WORD +) + +152 +Émp + = +MAX_WORD + ; + +153 ià( +Émp + <ð +MIN_WORD +) + +154 +Émp + = +MIN_WORD + ; + +156 +Émp + ; + +157 + } +} + +159 +šlše + +wÜd + + +160 + $GSM_ABS + ( +wÜd + +a +) + +162 ià( +a + > 0) + +163 +a + ; + +164 ià( +a + =ð +MIN_WORD +) + +165 +MAX_WORD + ; + +166 - +a + ; + +167 + } +} + +173 +Gsm_Cod” + ( + +174 +gsm_¡©e + * +S +, + +175 +wÜd + * +s +, + +176 +wÜd + * +LARc +, + +177 +wÜd + * +Nc +, + +178 +wÜd + * +bc +, + +179 +wÜd + * +Mc +, + +180 +wÜd + * +xmaxc +, + +181 +wÜd + * +xMc +) ; + +183 +Gsm_LÚg_T”m_P»diùÜ + ( + +184 +gsm_¡©e + * +S +, + +185 +wÜd + * +d +, + +186 +wÜd + * +dp +, + +187 +wÜd + * +e +, + +188 +wÜd + * +dµ +, + +189 +wÜd + * +Nc +, + +190 +wÜd + * +bc +) ; + +192 +Gsm_LPC_AÇlysis + ( + +193 +gsm_¡©e + * +S +, + +194 +wÜd + * +s +, + +195 +wÜd + * +LARc +) ; + +197 +Gsm_P»´oûss + ( + +198 +gsm_¡©e + * +S +, + +199 +wÜd + * +s +, wÜd * +so +) ; + +201 +Gsm_Encodšg + ( + +202 +gsm_¡©e + * +S +, + +203 +wÜd + * +e +, + +204 +wÜd + * +• +, + +205 +wÜd + * +xmaxc +, + +206 +wÜd + * +Mc +, + +207 +wÜd + * +xMc +) ; + +209 +Gsm_ShÜt_T”m_AÇlysis_Fž‹r + ( + +210 +gsm_¡©e + * +S +, + +211 +wÜd + * +LARc +, + +212 +wÜd + * +d +) ; + +214 +Gsm_Decod” + ( + +215 +gsm_¡©e + * +S +, + +216 +wÜd + * +LARü +, + +217 +wÜd + * +Nü +, + +218 +wÜd + * +bü +, + +219 +wÜd + * +Mü +, + +220 +wÜd + * +xmaxü +, + +221 +wÜd + * +xMü +, + +222 +wÜd + * +s +) ; + +224 +Gsm_Decodšg + ( + +225 +gsm_¡©e + * +S +, + +226 +wÜd + +xmaxü +, + +227 +wÜd + +Mü +, + +228 +wÜd + * +xMü +, + +229 +wÜd + * +”p +) ; + +231 +Gsm_LÚg_T”m_SyÁhesis_Fž‹ršg + ( + +232 +gsm_¡©e +* +S +, + +233 +wÜd + +Nü +, + +234 +wÜd + +bü +, + +235 +wÜd + * +”p +, + +236 +wÜd + * +d½ +) ; + +238 +Gsm_RPE_Decodšg + ( + +240 +wÜd + +xmaxü +, + +241 +wÜd + +Mü +, + +242 +wÜd + * +xMü +, + +243 +wÜd + * +”p +) ; + +245 +Gsm_RPE_Encodšg + ( + +247 +wÜd + * +e +, + +248 +wÜd + * +xmaxc +, + +249 +wÜd + * +Mc +, + +250 +wÜd + * +xMc +) ; + +252 +Gsm_ShÜt_T”m_SyÁhesis_Fž‹r + ( + +253 +gsm_¡©e + * +S +, + +254 +wÜd + * +LARü +, + +255 +wÜd + * +d½ +, + +256 +wÜd + * +s +) ; + +258 +Gsm_Upd©e_of_»cÚ¡ruùed_shÜt_time_»sidu®_sigÇl + ( + +259 +wÜd + * +dµ +, + +260 +wÜd + * +• +, + +261 +wÜd + * +dp +) ; + +266 #iâdef +GSM_TABLE_C + + +268
+wÜd + +gsm_A + [8], +gsm_B + [8], +gsm_MIC + [8], +gsm_MAC + [8] ; + +269
+wÜd + +gsm_INVA + [8] ; + +270
+wÜd + +gsm_DLB + [4], +gsm_QLB + [4] ; + +271
+wÜd + +gsm_H + [11] ; + +272
+wÜd + +gsm_NRFAC + [8] ; + +273
+wÜd + +gsm_FAC + [8] ; + +280 #ifdeà +NDEBUG + + +282 + #gsm_debug_wÜds +( +a +, +b +, +c +, +d +è + + ) + +283 + #gsm_debug_lÚgwÜds +( +a +, +b +, +c +, +d +è + + ) + +284 + #gsm_debug_wÜd +( +a +, +b +è + + ) + +285 + #gsm_debug_lÚgwÜd +( +a +, +b +è + + ) + +289 +gsm_debug_wÜds + (* +Çme +, , , +wÜd + *) ; + +290 +gsm_debug_lÚgwÜds + (* +Çme +, , , +lÚgwÜd + *) ; + +291 +gsm_debug_lÚgwÜd + (* +Çme +, +lÚgwÜd +) ; + +292 +gsm_debug_wÜd + (* +Çme +, +wÜd +) ; + + @gsm_create.c + +7 + ~"cÚfig.h +" + +9 + ~<¡dio.h +> + +10 + ~<¡dlib.h +> + +11 + ~<¡ršg.h +> + +15 + ~"gsm.h +" + +16 + ~"gsm610_´iv.h +" + +18 +gsm + + $gsm_ü—‹ + () + +20 +gsm + +r +; + +22 +r + = + `m®loc + (( +gsm_¡©e +)); + +23 ià(! +r +) „; + +25 + `mem£t +((*) +r +, 0, ( +gsm_¡©e +)); + +26 +r +-> +Äp + = 40; + +28 +r +; + +29 + } +} + +32 + $gsm_š™ + ( +gsm + +¡©e +) + +34 + `mem£t + ( +¡©e +, 0, ( +gsm_¡©e +)) ; + +35 +¡©e +-> +Äp + = 40 ; + +36 + } +} + + @gsm_decode.c + +7 + ~"gsm610_´iv.h +" + +9 + ~"gsm.h +" + +11 + $gsm_decode + ( +gsm + +s +, +gsm_by‹ + * +c +, +gsm_sigÇl + * +rg‘ +) + +13 +wÜd + +LARc +[8], +Nc +[4], +Mc +[4], +bc +[4], +xmaxc +[4], +xmc +[13*4]; + +15 #ifdeà +WAV49 + + +16 ià( +s +-> +wav_fmt +) { + +18 +uwÜd + +¤ + = 0; + +20 +s +-> +äame_šdex + = !s->frame_index; + +21 ià( +s +-> +äame_šdex +) { + +23 +¤ + = * +c +++; + +24 +LARc +[0] = +¤ + & 0x3f; sr >>= 6; + +25 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +26 +LARc +[1] = +¤ + & 0x3f; sr >>= 6; + +27 +¤ + |ð( +uwÜd +)* +c +++ << 4; + +28 +LARc +[2] = +¤ + & 0x1f; sr >>= 5; + +29 +LARc +[3] = +¤ + & 0x1f; sr >>= 5; + +30 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +31 +LARc +[4] = +¤ + & 0xf; sr >>= 4; + +32 +LARc +[5] = +¤ + & 0xf; sr >>= 4; + +33 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +34 +LARc +[6] = +¤ + & 0x7; sr >>= 3; + +35 +LARc +[7] = +¤ + & 0x7; sr >>= 3; + +36 +¤ + |ð( +uwÜd +)* +c +++ << 4; + +37 +Nc +[0] = +¤ + & 0x7f; sr >>= 7; + +38 +bc +[0] = +¤ + & 0x3; sr >>= 2; + +39 +Mc +[0] = +¤ + & 0x3; sr >>= 2; + +40 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +41 +xmaxc +[0] = +¤ + & 0x3f; sr >>= 6; + +42 +xmc +[0] = +¤ + & 0x7; sr >>= 3; + +43 +¤ + = * +c +++; + +44 +xmc +[1] = +¤ + & 0x7; sr >>= 3; + +45 +xmc +[2] = +¤ + & 0x7; sr >>= 3; + +46 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +47 +xmc +[3] = +¤ + & 0x7; sr >>= 3; + +48 +xmc +[4] = +¤ + & 0x7; sr >>= 3; + +49 +xmc +[5] = +¤ + & 0x7; sr >>= 3; + +50 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +51 +xmc +[6] = +¤ + & 0x7; sr >>= 3; + +52 +xmc +[7] = +¤ + & 0x7; sr >>= 3; + +53 +xmc +[8] = +¤ + & 0x7; sr >>= 3; + +54 +¤ + = * +c +++; + +55 +xmc +[9] = +¤ + & 0x7; sr >>= 3; + +56 +xmc +[10] = +¤ + & 0x7; sr >>= 3; + +57 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +58 +xmc +[11] = +¤ + & 0x7; sr >>= 3; + +59 +xmc +[12] = +¤ + & 0x7; sr >>= 3; + +60 +¤ + |ð( +uwÜd +)* +c +++ << 4; + +61 +Nc +[1] = +¤ + & 0x7f; sr >>= 7; + +62 +bc +[1] = +¤ + & 0x3; sr >>= 2; + +63 +Mc +[1] = +¤ + & 0x3; sr >>= 2; + +64 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +65 +xmaxc +[1] = +¤ + & 0x3f; sr >>= 6; + +66 +xmc +[13] = +¤ + & 0x7; sr >>= 3; + +67 +¤ + = * +c +++; + +68 +xmc +[14] = +¤ + & 0x7; sr >>= 3; + +69 +xmc +[15] = +¤ + & 0x7; sr >>= 3; + +70 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +71 +xmc +[16] = +¤ + & 0x7; sr >>= 3; + +72 +xmc +[17] = +¤ + & 0x7; sr >>= 3; + +73 +xmc +[18] = +¤ + & 0x7; sr >>= 3; + +74 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +75 +xmc +[19] = +¤ + & 0x7; sr >>= 3; + +76 +xmc +[20] = +¤ + & 0x7; sr >>= 3; + +77 +xmc +[21] = +¤ + & 0x7; sr >>= 3; + +78 +¤ + = * +c +++; + +79 +xmc +[22] = +¤ + & 0x7; sr >>= 3; + +80 +xmc +[23] = +¤ + & 0x7; sr >>= 3; + +81 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +82 +xmc +[24] = +¤ + & 0x7; sr >>= 3; + +83 +xmc +[25] = +¤ + & 0x7; sr >>= 3; + +84 +¤ + |ð( +uwÜd +)* +c +++ << 4; + +85 +Nc +[2] = +¤ + & 0x7f; sr >>= 7; + +86 +bc +[2] = +¤ + & 0x3; sr >>= 2; + +87 +Mc +[2] = +¤ + & 0x3; sr >>= 2; + +88 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +89 +xmaxc +[2] = +¤ + & 0x3f; sr >>= 6; + +90 +xmc +[26] = +¤ + & 0x7; sr >>= 3; + +91 +¤ + = * +c +++; + +92 +xmc +[27] = +¤ + & 0x7; sr >>= 3; + +93 +xmc +[28] = +¤ + & 0x7; sr >>= 3; + +94 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +95 +xmc +[29] = +¤ + & 0x7; sr >>= 3; + +96 +xmc +[30] = +¤ + & 0x7; sr >>= 3; + +97 +xmc +[31] = +¤ + & 0x7; sr >>= 3; + +98 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +99 +xmc +[32] = +¤ + & 0x7; sr >>= 3; + +100 +xmc +[33] = +¤ + & 0x7; sr >>= 3; + +101 +xmc +[34] = +¤ + & 0x7; sr >>= 3; + +102 +¤ + = * +c +++; + +103 +xmc +[35] = +¤ + & 0x7; sr >>= 3; + +104 +xmc +[36] = +¤ + & 0x7; sr >>= 3; + +105 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +106 +xmc +[37] = +¤ + & 0x7; sr >>= 3; + +107 +xmc +[38] = +¤ + & 0x7; sr >>= 3; + +108 +¤ + |ð( +uwÜd +)* +c +++ << 4; + +109 +Nc +[3] = +¤ + & 0x7f; sr >>= 7; + +110 +bc +[3] = +¤ + & 0x3; sr >>= 2; + +111 +Mc +[3] = +¤ + & 0x3; sr >>= 2; + +112 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +113 +xmaxc +[3] = +¤ + & 0x3f; sr >>= 6; + +114 +xmc +[39] = +¤ + & 0x7; sr >>= 3; + +115 +¤ + = * +c +++; + +116 +xmc +[40] = +¤ + & 0x7; sr >>= 3; + +117 +xmc +[41] = +¤ + & 0x7; sr >>= 3; + +118 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +119 +xmc +[42] = +¤ + & 0x7; sr >>= 3; + +120 +xmc +[43] = +¤ + & 0x7; sr >>= 3; + +121 +xmc +[44] = +¤ + & 0x7; sr >>= 3; + +122 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +123 +xmc +[45] = +¤ + & 0x7; sr >>= 3; + +124 +xmc +[46] = +¤ + & 0x7; sr >>= 3; + +125 +xmc +[47] = +¤ + & 0x7; sr >>= 3; + +126 +¤ + = * +c +++; + +127 +xmc +[48] = +¤ + & 0x7; sr >>= 3; + +128 +xmc +[49] = +¤ + & 0x7; sr >>= 3; + +129 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +130 +xmc +[50] = +¤ + & 0x7; sr >>= 3; + +131 +xmc +[51] = +¤ + & 0x7; sr >>= 3; + +133 +s +-> +äame_chaš + = +¤ + & 0xf; + +136 +¤ + = +s +-> +äame_chaš +; + +137 +¤ + |ð( +uwÜd +)* +c +++ << 4; + +138 +LARc +[0] = +¤ + & 0x3f; sr >>= 6; + +139 +LARc +[1] = +¤ + & 0x3f; sr >>= 6; + +140 +¤ + = * +c +++; + +141 +LARc +[2] = +¤ + & 0x1f; sr >>= 5; + +142 +¤ + |ð( +uwÜd +)* +c +++ << 3; + +143 +LARc +[3] = +¤ + & 0x1f; sr >>= 5; + +144 +LARc +[4] = +¤ + & 0xf; sr >>= 4; + +145 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +146 +LARc +[5] = +¤ + & 0xf; sr >>= 4; + +147 +LARc +[6] = +¤ + & 0x7; sr >>= 3; + +148 +LARc +[7] = +¤ + & 0x7; sr >>= 3; + +149 +¤ + = * +c +++; + +150 +Nc +[0] = +¤ + & 0x7f; sr >>= 7; + +151 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +152 +bc +[0] = +¤ + & 0x3; sr >>= 2; + +153 +Mc +[0] = +¤ + & 0x3; sr >>= 2; + +154 +¤ + |ð( +uwÜd +)* +c +++ << 5; + +155 +xmaxc +[0] = +¤ + & 0x3f; sr >>= 6; + +156 +xmc +[0] = +¤ + & 0x7; sr >>= 3; + +157 +xmc +[1] = +¤ + & 0x7; sr >>= 3; + +158 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +159 +xmc +[2] = +¤ + & 0x7; sr >>= 3; + +160 +xmc +[3] = +¤ + & 0x7; sr >>= 3; + +161 +xmc +[4] = +¤ + & 0x7; sr >>= 3; + +162 +¤ + = * +c +++; + +163 +xmc +[5] = +¤ + & 0x7; sr >>= 3; + +164 +xmc +[6] = +¤ + & 0x7; sr >>= 3; + +165 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +166 +xmc +[7] = +¤ + & 0x7; sr >>= 3; + +167 +xmc +[8] = +¤ + & 0x7; sr >>= 3; + +168 +xmc +[9] = +¤ + & 0x7; sr >>= 3; + +169 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +170 +xmc +[10] = +¤ + & 0x7; sr >>= 3; + +171 +xmc +[11] = +¤ + & 0x7; sr >>= 3; + +172 +xmc +[12] = +¤ + & 0x7; sr >>= 3; + +173 +¤ + = * +c +++; + +174 +Nc +[1] = +¤ + & 0x7f; sr >>= 7; + +175 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +176 +bc +[1] = +¤ + & 0x3; sr >>= 2; + +177 +Mc +[1] = +¤ + & 0x3; sr >>= 2; + +178 +¤ + |ð( +uwÜd +)* +c +++ << 5; + +179 +xmaxc +[1] = +¤ + & 0x3f; sr >>= 6; + +180 +xmc +[13] = +¤ + & 0x7; sr >>= 3; + +181 +xmc +[14] = +¤ + & 0x7; sr >>= 3; + +182 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +183 +xmc +[15] = +¤ + & 0x7; sr >>= 3; + +184 +xmc +[16] = +¤ + & 0x7; sr >>= 3; + +185 +xmc +[17] = +¤ + & 0x7; sr >>= 3; + +186 +¤ + = * +c +++; + +187 +xmc +[18] = +¤ + & 0x7; sr >>= 3; + +188 +xmc +[19] = +¤ + & 0x7; sr >>= 3; + +189 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +190 +xmc +[20] = +¤ + & 0x7; sr >>= 3; + +191 +xmc +[21] = +¤ + & 0x7; sr >>= 3; + +192 +xmc +[22] = +¤ + & 0x7; sr >>= 3; + +193 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +194 +xmc +[23] = +¤ + & 0x7; sr >>= 3; + +195 +xmc +[24] = +¤ + & 0x7; sr >>= 3; + +196 +xmc +[25] = +¤ + & 0x7; sr >>= 3; + +197 +¤ + = * +c +++; + +198 +Nc +[2] = +¤ + & 0x7f; sr >>= 7; + +199 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +200 +bc +[2] = +¤ + & 0x3; sr >>= 2; + +201 +Mc +[2] = +¤ + & 0x3; sr >>= 2; + +202 +¤ + |ð( +uwÜd +)* +c +++ << 5; + +203 +xmaxc +[2] = +¤ + & 0x3f; sr >>= 6; + +204 +xmc +[26] = +¤ + & 0x7; sr >>= 3; + +205 +xmc +[27] = +¤ + & 0x7; sr >>= 3; + +206 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +207 +xmc +[28] = +¤ + & 0x7; sr >>= 3; + +208 +xmc +[29] = +¤ + & 0x7; sr >>= 3; + +209 +xmc +[30] = +¤ + & 0x7; sr >>= 3; + +210 +¤ + = * +c +++; + +211 +xmc +[31] = +¤ + & 0x7; sr >>= 3; + +212 +xmc +[32] = +¤ + & 0x7; sr >>= 3; + +213 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +214 +xmc +[33] = +¤ + & 0x7; sr >>= 3; + +215 +xmc +[34] = +¤ + & 0x7; sr >>= 3; + +216 +xmc +[35] = +¤ + & 0x7; sr >>= 3; + +217 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +218 +xmc +[36] = +¤ + & 0x7; sr >>= 3; + +219 +xmc +[37] = +¤ + & 0x7; sr >>= 3; + +220 +xmc +[38] = +¤ + & 0x7; sr >>= 3; + +221 +¤ + = * +c +++; + +222 +Nc +[3] = +¤ + & 0x7f; sr >>= 7; + +223 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +224 +bc +[3] = +¤ + & 0x3; sr >>= 2; + +225 +Mc +[3] = +¤ + & 0x3; sr >>= 2; + +226 +¤ + |ð( +uwÜd +)* +c +++ << 5; + +227 +xmaxc +[3] = +¤ + & 0x3f; sr >>= 6; + +228 +xmc +[39] = +¤ + & 0x7; sr >>= 3; + +229 +xmc +[40] = +¤ + & 0x7; sr >>= 3; + +230 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +231 +xmc +[41] = +¤ + & 0x7; sr >>= 3; + +232 +xmc +[42] = +¤ + & 0x7; sr >>= 3; + +233 +xmc +[43] = +¤ + & 0x7; sr >>= 3; + +234 +¤ + = * +c +++; + +235 +xmc +[44] = +¤ + & 0x7; sr >>= 3; + +236 +xmc +[45] = +¤ + & 0x7; sr >>= 3; + +237 +¤ + |ð( +uwÜd +)* +c +++ << 2; + +238 +xmc +[46] = +¤ + & 0x7; sr >>= 3; + +239 +xmc +[47] = +¤ + & 0x7; sr >>= 3; + +240 +xmc +[48] = +¤ + & 0x7; sr >>= 3; + +241 +¤ + |ð( +uwÜd +)* +c +++ << 1; + +242 +xmc +[49] = +¤ + & 0x7; sr >>= 3; + +243 +xmc +[50] = +¤ + & 0x7; sr >>= 3; + +244 +xmc +[51] = +¤ + & 0x7; sr >>= 3; + +252 ià(((* +c + >> 4è& 0x0Fè!ð +GSM_MAGIC +) -1; + +254 +LARc +[0] = (* +c +++ & 0xF) << 2; + +255 +LARc +[0] |ð(* +c + >> 6) & 0x3; + +256 +LARc +[1] = * +c +++ & 0x3F; + +257 +LARc +[2] = (* +c + >> 3) & 0x1F; + +258 +LARc +[3] = (* +c +++ & 0x7) << 2; + +259 +LARc +[3] |ð(* +c + >> 6) & 0x3; + +260 +LARc +[4] = (* +c + >> 2) & 0xF; + +261 +LARc +[5] = (* +c +++ & 0x3) << 2; + +262 +LARc +[5] |ð(* +c + >> 6) & 0x3; + +263 +LARc +[6] = (* +c + >> 3) & 0x7; + +264 +LARc +[7] = * +c +++ & 0x7; + +265 +Nc +[0] = (* +c + >> 1) & 0x7F; + +266 +bc +[0] = (* +c +++ & 0x1) << 1; + +267 +bc +[0] |ð(* +c + >> 7) & 0x1; + +268 +Mc +[0] = (* +c + >> 5) & 0x3; + +269 +xmaxc +[0] = (* +c +++ & 0x1F) << 1; + +270 +xmaxc +[0] |ð(* +c + >> 7) & 0x1; + +271 +xmc +[0] = (* +c + >> 4) & 0x7; + +272 +xmc +[1] = (* +c + >> 1) & 0x7; + +273 +xmc +[2] = (* +c +++ & 0x1) << 2; + +274 +xmc +[2] |ð(* +c + >> 6) & 0x3; + +275 +xmc +[3] = (* +c + >> 3) & 0x7; + +276 +xmc +[4] = * +c +++ & 0x7; + +277 +xmc +[5] = (* +c + >> 5) & 0x7; + +278 +xmc +[6] = (* +c + >> 2) & 0x7; + +279 +xmc +[7] = (* +c +++ & 0x3) << 1; + +280 +xmc +[7] |ð(* +c + >> 7) & 0x1; + +281 +xmc +[8] = (* +c + >> 4) & 0x7; + +282 +xmc +[9] = (* +c + >> 1) & 0x7; + +283 +xmc +[10] = (* +c +++ & 0x1) << 2; + +284 +xmc +[10] |ð(* +c + >> 6) & 0x3; + +285 +xmc +[11] = (* +c + >> 3) & 0x7; + +286 +xmc +[12] = * +c +++ & 0x7; + +287 +Nc +[1] = (* +c + >> 1) & 0x7F; + +288 +bc +[1] = (* +c +++ & 0x1) << 1; + +289 +bc +[1] |ð(* +c + >> 7) & 0x1; + +290 +Mc +[1] = (* +c + >> 5) & 0x3; + +291 +xmaxc +[1] = (* +c +++ & 0x1F) << 1; + +292 +xmaxc +[1] |ð(* +c + >> 7) & 0x1; + +293 +xmc +[13] = (* +c + >> 4) & 0x7; + +294 +xmc +[14] = (* +c + >> 1) & 0x7; + +295 +xmc +[15] = (* +c +++ & 0x1) << 2; + +296 +xmc +[15] |ð(* +c + >> 6) & 0x3; + +297 +xmc +[16] = (* +c + >> 3) & 0x7; + +298 +xmc +[17] = * +c +++ & 0x7; + +299 +xmc +[18] = (* +c + >> 5) & 0x7; + +300 +xmc +[19] = (* +c + >> 2) & 0x7; + +301 +xmc +[20] = (* +c +++ & 0x3) << 1; + +302 +xmc +[20] |ð(* +c + >> 7) & 0x1; + +303 +xmc +[21] = (* +c + >> 4) & 0x7; + +304 +xmc +[22] = (* +c + >> 1) & 0x7; + +305 +xmc +[23] = (* +c +++ & 0x1) << 2; + +306 +xmc +[23] |ð(* +c + >> 6) & 0x3; + +307 +xmc +[24] = (* +c + >> 3) & 0x7; + +308 +xmc +[25] = * +c +++ & 0x7; + +309 +Nc +[2] = (* +c + >> 1) & 0x7F; + +310 +bc +[2] = (* +c +++ & 0x1) << 1; + +311 +bc +[2] |ð(* +c + >> 7) & 0x1; + +312 +Mc +[2] = (* +c + >> 5) & 0x3; + +313 +xmaxc +[2] = (* +c +++ & 0x1F) << 1; + +314 +xmaxc +[2] |ð(* +c + >> 7) & 0x1; + +315 +xmc +[26] = (* +c + >> 4) & 0x7; + +316 +xmc +[27] = (* +c + >> 1) & 0x7; + +317 +xmc +[28] = (* +c +++ & 0x1) << 2; + +318 +xmc +[28] |ð(* +c + >> 6) & 0x3; + +319 +xmc +[29] = (* +c + >> 3) & 0x7; + +320 +xmc +[30] = * +c +++ & 0x7; + +321 +xmc +[31] = (* +c + >> 5) & 0x7; + +322 +xmc +[32] = (* +c + >> 2) & 0x7; + +323 +xmc +[33] = (* +c +++ & 0x3) << 1; + +324 +xmc +[33] |ð(* +c + >> 7) & 0x1; + +325 +xmc +[34] = (* +c + >> 4) & 0x7; + +326 +xmc +[35] = (* +c + >> 1) & 0x7; + +327 +xmc +[36] = (* +c +++ & 0x1) << 2; + +328 +xmc +[36] |ð(* +c + >> 6) & 0x3; + +329 +xmc +[37] = (* +c + >> 3) & 0x7; + +330 +xmc +[38] = * +c +++ & 0x7; + +331 +Nc +[3] = (* +c + >> 1) & 0x7F; + +332 +bc +[3] = (* +c +++ & 0x1) << 1; + +333 +bc +[3] |ð(* +c + >> 7) & 0x1; + +334 +Mc +[3] = (* +c + >> 5) & 0x3; + +335 +xmaxc +[3] = (* +c +++ & 0x1F) << 1; + +336 +xmaxc +[3] |ð(* +c + >> 7) & 0x1; + +337 +xmc +[39] = (* +c + >> 4) & 0x7; + +338 +xmc +[40] = (* +c + >> 1) & 0x7; + +339 +xmc +[41] = (* +c +++ & 0x1) << 2; + +340 +xmc +[41] |ð(* +c + >> 6) & 0x3; + +341 +xmc +[42] = (* +c + >> 3) & 0x7; + +342 +xmc +[43] = * +c +++ & 0x7; + +343 +xmc +[44] = (* +c + >> 5) & 0x7; + +344 +xmc +[45] = (* +c + >> 2) & 0x7; + +345 +xmc +[46] = (* +c +++ & 0x3) << 1; + +346 +xmc +[46] |ð(* +c + >> 7) & 0x1; + +347 +xmc +[47] = (* +c + >> 4) & 0x7; + +348 +xmc +[48] = (* +c + >> 1) & 0x7; + +349 +xmc +[49] = (* +c +++ & 0x1) << 2; + +350 +xmc +[49] |ð(* +c + >> 6) & 0x3; + +351 +xmc +[50] = (* +c + >> 3) & 0x7; + +352 +xmc +[51] = * +c + & 0x7; + +355 + `Gsm_Decod” +( +s +, +LARc +, +Nc +, +bc +, +Mc +, +xmaxc +, +xmc +, +rg‘ +); + +358 + } +} + + @gsm_destroy.c + +7 + ~"gsm.h +" + +8 + ~"cÚfig.h +" + +10 #ifdef +HAS_STDLIB_H + + +11 + ~<¡dlib.h +> + +13 #ifdef +HAS_MALLOC_H + + +14 + ~<m®loc.h +> + +16
+ä“ +(); + +20 + $gsm_de¡roy + ( +gsm + +S +) + +22 ià( +S +è + `ä“ +((*)S); + +23 + } +} + + @gsm_encode.c + +7 + ~"gsm610_´iv.h +" + +8 + ~"gsm.h +" + +10 + $gsm_’code + ( +gsm + +s +, +gsm_sigÇl + * +sourû +, +gsm_by‹ + * +c +) + +12 +wÜd + +LARc +[8], +Nc +[4], +Mc +[4], +bc +[4], +xmaxc +[4], +xmc +[13*4]; + +14 + `Gsm_Cod” +( +s +, +sourû +, +LARc +, +Nc +, +bc +, +Mc +, +xmaxc +, +xmc +); + +103 #ifdeà +WAV49 + + +105 ià( +s +-> +wav_fmt +) { + +106 +s +-> +äame_šdex + = !s->frame_index; + +107 ià( +s +-> +äame_šdex +) { + +109 +uwÜd + +¤ +; + +111 +¤ + = 0; + +112 +¤ + = s¸>> 6 | +LARc +[0] << 10; + +113 +¤ + = s¸>> 6 | +LARc +[1] << 10; + +114 * +c +++ = +¤ + >> 4; + +115 +¤ + = s¸>> 5 | +LARc +[2] << 11; + +116 * +c +++ = +¤ + >> 7; + +117 +¤ + = s¸>> 5 | +LARc +[3] << 11; + +118 +¤ + = s¸>> 4 | +LARc +[4] << 12; + +119 * +c +++ = +¤ + >> 6; + +120 +¤ + = s¸>> 4 | +LARc +[5] << 12; + +121 +¤ + = s¸>> 3 | +LARc +[6] << 13; + +122 * +c +++ = +¤ + >> 7; + +123 +¤ + = s¸>> 3 | +LARc +[7] << 13; + +124 +¤ + = s¸>> 7 | +Nc +[0] << 9; + +125 * +c +++ = +¤ + >> 5; + +126 +¤ + = s¸>> 2 | +bc +[0] << 14; + +127 +¤ + = s¸>> 2 | +Mc +[0] << 14; + +128 +¤ + = s¸>> 6 | +xmaxc +[0] << 10; + +129 * +c +++ = +¤ + >> 3; + +130 +¤ + = s¸>> 3 | +xmc +[0] << 13; + +131 * +c +++ = +¤ + >> 8; + +132 +¤ + = s¸>> 3 | +xmc +[1] << 13; + +133 +¤ + = s¸>> 3 | +xmc +[2] << 13; + +134 +¤ + = s¸>> 3 | +xmc +[3] << 13; + +135 * +c +++ = +¤ + >> 7; + +136 +¤ + = s¸>> 3 | +xmc +[4] << 13; + +137 +¤ + = s¸>> 3 | +xmc +[5] << 13; + +138 +¤ + = s¸>> 3 | +xmc +[6] << 13; + +139 * +c +++ = +¤ + >> 6; + +140 +¤ + = s¸>> 3 | +xmc +[7] << 13; + +141 +¤ + = s¸>> 3 | +xmc +[8] << 13; + +142 * +c +++ = +¤ + >> 8; + +143 +¤ + = s¸>> 3 | +xmc +[9] << 13; + +144 +¤ + = s¸>> 3 | +xmc +[10] << 13; + +145 +¤ + = s¸>> 3 | +xmc +[11] << 13; + +146 * +c +++ = +¤ + >> 7; + +147 +¤ + = s¸>> 3 | +xmc +[12] << 13; + +148 +¤ + = s¸>> 7 | +Nc +[1] << 9; + +149 * +c +++ = +¤ + >> 5; + +150 +¤ + = s¸>> 2 | +bc +[1] << 14; + +151 +¤ + = s¸>> 2 | +Mc +[1] << 14; + +152 +¤ + = s¸>> 6 | +xmaxc +[1] << 10; + +153 * +c +++ = +¤ + >> 3; + +154 +¤ + = s¸>> 3 | +xmc +[13] << 13; + +155 * +c +++ = +¤ + >> 8; + +156 +¤ + = s¸>> 3 | +xmc +[14] << 13; + +157 +¤ + = s¸>> 3 | +xmc +[15] << 13; + +158 +¤ + = s¸>> 3 | +xmc +[16] << 13; + +159 * +c +++ = +¤ + >> 7; + +160 +¤ + = s¸>> 3 | +xmc +[17] << 13; + +161 +¤ + = s¸>> 3 | +xmc +[18] << 13; + +162 +¤ + = s¸>> 3 | +xmc +[19] << 13; + +163 * +c +++ = +¤ + >> 6; + +164 +¤ + = s¸>> 3 | +xmc +[20] << 13; + +165 +¤ + = s¸>> 3 | +xmc +[21] << 13; + +166 * +c +++ = +¤ + >> 8; + +167 +¤ + = s¸>> 3 | +xmc +[22] << 13; + +168 +¤ + = s¸>> 3 | +xmc +[23] << 13; + +169 +¤ + = s¸>> 3 | +xmc +[24] << 13; + +170 * +c +++ = +¤ + >> 7; + +171 +¤ + = s¸>> 3 | +xmc +[25] << 13; + +172 +¤ + = s¸>> 7 | +Nc +[2] << 9; + +173 * +c +++ = +¤ + >> 5; + +174 +¤ + = s¸>> 2 | +bc +[2] << 14; + +175 +¤ + = s¸>> 2 | +Mc +[2] << 14; + +176 +¤ + = s¸>> 6 | +xmaxc +[2] << 10; + +177 * +c +++ = +¤ + >> 3; + +178 +¤ + = s¸>> 3 | +xmc +[26] << 13; + +179 * +c +++ = +¤ + >> 8; + +180 +¤ + = s¸>> 3 | +xmc +[27] << 13; + +181 +¤ + = s¸>> 3 | +xmc +[28] << 13; + +182 +¤ + = s¸>> 3 | +xmc +[29] << 13; + +183 * +c +++ = +¤ + >> 7; + +184 +¤ + = s¸>> 3 | +xmc +[30] << 13; + +185 +¤ + = s¸>> 3 | +xmc +[31] << 13; + +186 +¤ + = s¸>> 3 | +xmc +[32] << 13; + +187 * +c +++ = +¤ + >> 6; + +188 +¤ + = s¸>> 3 | +xmc +[33] << 13; + +189 +¤ + = s¸>> 3 | +xmc +[34] << 13; + +190 * +c +++ = +¤ + >> 8; + +191 +¤ + = s¸>> 3 | +xmc +[35] << 13; + +192 +¤ + = s¸>> 3 | +xmc +[36] << 13; + +193 +¤ + = s¸>> 3 | +xmc +[37] << 13; + +194 * +c +++ = +¤ + >> 7; + +195 +¤ + = s¸>> 3 | +xmc +[38] << 13; + +196 +¤ + = s¸>> 7 | +Nc +[3] << 9; + +197 * +c +++ = +¤ + >> 5; + +198 +¤ + = s¸>> 2 | +bc +[3] << 14; + +199 +¤ + = s¸>> 2 | +Mc +[3] << 14; + +200 +¤ + = s¸>> 6 | +xmaxc +[3] << 10; + +201 * +c +++ = +¤ + >> 3; + +202 +¤ + = s¸>> 3 | +xmc +[39] << 13; + +203 * +c +++ = +¤ + >> 8; + +204 +¤ + = s¸>> 3 | +xmc +[40] << 13; + +205 +¤ + = s¸>> 3 | +xmc +[41] << 13; + +206 +¤ + = s¸>> 3 | +xmc +[42] << 13; + +207 * +c +++ = +¤ + >> 7; + +208 +¤ + = s¸>> 3 | +xmc +[43] << 13; + +209 +¤ + = s¸>> 3 | +xmc +[44] << 13; + +210 +¤ + = s¸>> 3 | +xmc +[45] << 13; + +211 * +c +++ = +¤ + >> 6; + +212 +¤ + = s¸>> 3 | +xmc +[46] << 13; + +213 +¤ + = s¸>> 3 | +xmc +[47] << 13; + +214 * +c +++ = +¤ + >> 8; + +215 +¤ + = s¸>> 3 | +xmc +[48] << 13; + +216 +¤ + = s¸>> 3 | +xmc +[49] << 13; + +217 +¤ + = s¸>> 3 | +xmc +[50] << 13; + +218 * +c +++ = +¤ + >> 7; + +219 +¤ + = s¸>> 3 | +xmc +[51] << 13; + +220 +¤ + = sr >> 4; + +221 * +c + = +¤ + >> 8; + +222 +s +-> +äame_chaš + = * +c +; + +225 +uwÜd + +¤ +; + +227 +¤ + = 0; + +228 +¤ + = s¸>> 4 | +s +-> +äame_chaš + << 12; + +229 +¤ + = s¸>> 6 | +LARc +[0] << 10; + +230 * +c +++ = +¤ + >> 6; + +231 +¤ + = s¸>> 6 | +LARc +[1] << 10; + +232 * +c +++ = +¤ + >> 8; + +233 +¤ + = s¸>> 5 | +LARc +[2] << 11; + +234 +¤ + = s¸>> 5 | +LARc +[3] << 11; + +235 * +c +++ = +¤ + >> 6; + +236 +¤ + = s¸>> 4 | +LARc +[4] << 12; + +237 +¤ + = s¸>> 4 | +LARc +[5] << 12; + +238 * +c +++ = +¤ + >> 6; + +239 +¤ + = s¸>> 3 | +LARc +[6] << 13; + +240 +¤ + = s¸>> 3 | +LARc +[7] << 13; + +241 * +c +++ = +¤ + >> 8; + +242 +¤ + = s¸>> 7 | +Nc +[0] << 9; + +243 +¤ + = s¸>> 2 | +bc +[0] << 14; + +244 * +c +++ = +¤ + >> 7; + +245 +¤ + = s¸>> 2 | +Mc +[0] << 14; + +246 +¤ + = s¸>> 6 | +xmaxc +[0] << 10; + +247 * +c +++ = +¤ + >> 7; + +248 +¤ + = s¸>> 3 | +xmc +[0] << 13; + +249 +¤ + = s¸>> 3 | +xmc +[1] << 13; + +250 +¤ + = s¸>> 3 | +xmc +[2] << 13; + +251 * +c +++ = +¤ + >> 6; + +252 +¤ + = s¸>> 3 | +xmc +[3] << 13; + +253 +¤ + = s¸>> 3 | +xmc +[4] << 13; + +254 * +c +++ = +¤ + >> 8; + +255 +¤ + = s¸>> 3 | +xmc +[5] << 13; + +256 +¤ + = s¸>> 3 | +xmc +[6] << 13; + +257 +¤ + = s¸>> 3 | +xmc +[7] << 13; + +258 * +c +++ = +¤ + >> 7; + +259 +¤ + = s¸>> 3 | +xmc +[8] << 13; + +260 +¤ + = s¸>> 3 | +xmc +[9] << 13; + +261 +¤ + = s¸>> 3 | +xmc +[10] << 13; + +262 * +c +++ = +¤ + >> 6; + +263 +¤ + = s¸>> 3 | +xmc +[11] << 13; + +264 +¤ + = s¸>> 3 | +xmc +[12] << 13; + +265 * +c +++ = +¤ + >> 8; + +266 +¤ + = s¸>> 7 | +Nc +[1] << 9; + +267 +¤ + = s¸>> 2 | +bc +[1] << 14; + +268 * +c +++ = +¤ + >> 7; + +269 +¤ + = s¸>> 2 | +Mc +[1] << 14; + +270 +¤ + = s¸>> 6 | +xmaxc +[1] << 10; + +271 * +c +++ = +¤ + >> 7; + +272 +¤ + = s¸>> 3 | +xmc +[13] << 13; + +273 +¤ + = s¸>> 3 | +xmc +[14] << 13; + +274 +¤ + = s¸>> 3 | +xmc +[15] << 13; + +275 * +c +++ = +¤ + >> 6; + +276 +¤ + = s¸>> 3 | +xmc +[16] << 13; + +277 +¤ + = s¸>> 3 | +xmc +[17] << 13; + +278 * +c +++ = +¤ + >> 8; + +279 +¤ + = s¸>> 3 | +xmc +[18] << 13; + +280 +¤ + = s¸>> 3 | +xmc +[19] << 13; + +281 +¤ + = s¸>> 3 | +xmc +[20] << 13; + +282 * +c +++ = +¤ + >> 7; + +283 +¤ + = s¸>> 3 | +xmc +[21] << 13; + +284 +¤ + = s¸>> 3 | +xmc +[22] << 13; + +285 +¤ + = s¸>> 3 | +xmc +[23] << 13; + +286 * +c +++ = +¤ + >> 6; + +287 +¤ + = s¸>> 3 | +xmc +[24] << 13; + +288 +¤ + = s¸>> 3 | +xmc +[25] << 13; + +289 * +c +++ = +¤ + >> 8; + +290 +¤ + = s¸>> 7 | +Nc +[2] << 9; + +291 +¤ + = s¸>> 2 | +bc +[2] << 14; + +292 * +c +++ = +¤ + >> 7; + +293 +¤ + = s¸>> 2 | +Mc +[2] << 14; + +294 +¤ + = s¸>> 6 | +xmaxc +[2] << 10; + +295 * +c +++ = +¤ + >> 7; + +296 +¤ + = s¸>> 3 | +xmc +[26] << 13; + +297 +¤ + = s¸>> 3 | +xmc +[27] << 13; + +298 +¤ + = s¸>> 3 | +xmc +[28] << 13; + +299 * +c +++ = +¤ + >> 6; + +300 +¤ + = s¸>> 3 | +xmc +[29] << 13; + +301 +¤ + = s¸>> 3 | +xmc +[30] << 13; + +302 * +c +++ = +¤ + >> 8; + +303 +¤ + = s¸>> 3 | +xmc +[31] << 13; + +304 +¤ + = s¸>> 3 | +xmc +[32] << 13; + +305 +¤ + = s¸>> 3 | +xmc +[33] << 13; + +306 * +c +++ = +¤ + >> 7; + +307 +¤ + = s¸>> 3 | +xmc +[34] << 13; + +308 +¤ + = s¸>> 3 | +xmc +[35] << 13; + +309 +¤ + = s¸>> 3 | +xmc +[36] << 13; + +310 * +c +++ = +¤ + >> 6; + +311 +¤ + = s¸>> 3 | +xmc +[37] << 13; + +312 +¤ + = s¸>> 3 | +xmc +[38] << 13; + +313 * +c +++ = +¤ + >> 8; + +314 +¤ + = s¸>> 7 | +Nc +[3] << 9; + +315 +¤ + = s¸>> 2 | +bc +[3] << 14; + +316 * +c +++ = +¤ + >> 7; + +317 +¤ + = s¸>> 2 | +Mc +[3] << 14; + +318 +¤ + = s¸>> 6 | +xmaxc +[3] << 10; + +319 * +c +++ = +¤ + >> 7; + +320 +¤ + = s¸>> 3 | +xmc +[39] << 13; + +321 +¤ + = s¸>> 3 | +xmc +[40] << 13; + +322 +¤ + = s¸>> 3 | +xmc +[41] << 13; + +323 * +c +++ = +¤ + >> 6; + +324 +¤ + = s¸>> 3 | +xmc +[42] << 13; + +325 +¤ + = s¸>> 3 | +xmc +[43] << 13; + +326 * +c +++ = +¤ + >> 8; + +327 +¤ + = s¸>> 3 | +xmc +[44] << 13; + +328 +¤ + = s¸>> 3 | +xmc +[45] << 13; + +329 +¤ + = s¸>> 3 | +xmc +[46] << 13; + +330 * +c +++ = +¤ + >> 7; + +331 +¤ + = s¸>> 3 | +xmc +[47] << 13; + +332 +¤ + = s¸>> 3 | +xmc +[48] << 13; + +333 +¤ + = s¸>> 3 | +xmc +[49] << 13; + +334 * +c +++ = +¤ + >> 6; + +335 +¤ + = s¸>> 3 | +xmc +[50] << 13; + +336 +¤ + = s¸>> 3 | +xmc +[51] << 13; + +337 * +c +++ = +¤ + >> 8; + +346 * +c +++ = (( +GSM_MAGIC + & 0xF) << 4) + +347 | (( +LARc +[0] >> 2) & 0xF); + +348 * +c +++ = (( +LARc +[0] & 0x3) << 6) + +349 | ( +LARc +[1] & 0x3F); + +350 * +c +++ = (( +LARc +[2] & 0x1F) << 3) + +351 | (( +LARc +[3] >> 2) & 0x7); + +352 * +c +++ = (( +LARc +[3] & 0x3) << 6) + +353 | (( +LARc +[4] & 0xF) << 2) + +354 | (( +LARc +[5] >> 2) & 0x3); + +355 * +c +++ = (( +LARc +[5] & 0x3) << 6) + +356 | (( +LARc +[6] & 0x7) << 3) + +357 | ( +LARc +[7] & 0x7); + +358 * +c +++ = (( +Nc +[0] & 0x7F) << 1) + +359 | (( +bc +[0] >> 1) & 0x1); + +360 * +c +++ = (( +bc +[0] & 0x1) << 7) + +361 | (( +Mc +[0] & 0x3) << 5) + +362 | (( +xmaxc +[0] >> 1) & 0x1F); + +363 * +c +++ = (( +xmaxc +[0] & 0x1) << 7) + +364 | (( +xmc +[0] & 0x7) << 4) + +365 | (( +xmc +[1] & 0x7) << 1) + +366 | (( +xmc +[2] >> 2) & 0x1); + +367 * +c +++ = (( +xmc +[2] & 0x3) << 6) + +368 | (( +xmc +[3] & 0x7) << 3) + +369 | ( +xmc +[4] & 0x7); + +370 * +c +++ = (( +xmc +[5] & 0x7) << 5) + +371 | (( +xmc +[6] & 0x7) << 2) + +372 | (( +xmc +[7] >> 1) & 0x3); + +373 * +c +++ = (( +xmc +[7] & 0x1) << 7) + +374 | (( +xmc +[8] & 0x7) << 4) + +375 | (( +xmc +[9] & 0x7) << 1) + +376 | (( +xmc +[10] >> 2) & 0x1); + +377 * +c +++ = (( +xmc +[10] & 0x3) << 6) + +378 | (( +xmc +[11] & 0x7) << 3) + +379 | ( +xmc +[12] & 0x7); + +380 * +c +++ = (( +Nc +[1] & 0x7F) << 1) + +381 | (( +bc +[1] >> 1) & 0x1); + +382 * +c +++ = (( +bc +[1] & 0x1) << 7) + +383 | (( +Mc +[1] & 0x3) << 5) + +384 | (( +xmaxc +[1] >> 1) & 0x1F); + +385 * +c +++ = (( +xmaxc +[1] & 0x1) << 7) + +386 | (( +xmc +[13] & 0x7) << 4) + +387 | (( +xmc +[14] & 0x7) << 1) + +388 | (( +xmc +[15] >> 2) & 0x1); + +389 * +c +++ = (( +xmc +[15] & 0x3) << 6) + +390 | (( +xmc +[16] & 0x7) << 3) + +391 | ( +xmc +[17] & 0x7); + +392 * +c +++ = (( +xmc +[18] & 0x7) << 5) + +393 | (( +xmc +[19] & 0x7) << 2) + +394 | (( +xmc +[20] >> 1) & 0x3); + +395 * +c +++ = (( +xmc +[20] & 0x1) << 7) + +396 | (( +xmc +[21] & 0x7) << 4) + +397 | (( +xmc +[22] & 0x7) << 1) + +398 | (( +xmc +[23] >> 2) & 0x1); + +399 * +c +++ = (( +xmc +[23] & 0x3) << 6) + +400 | (( +xmc +[24] & 0x7) << 3) + +401 | ( +xmc +[25] & 0x7); + +402 * +c +++ = (( +Nc +[2] & 0x7F) << 1) + +403 | (( +bc +[2] >> 1) & 0x1); + +404 * +c +++ = (( +bc +[2] & 0x1) << 7) + +405 | (( +Mc +[2] & 0x3) << 5) + +406 | (( +xmaxc +[2] >> 1) & 0x1F); + +407 * +c +++ = (( +xmaxc +[2] & 0x1) << 7) + +408 | (( +xmc +[26] & 0x7) << 4) + +409 | (( +xmc +[27] & 0x7) << 1) + +410 | (( +xmc +[28] >> 2) & 0x1); + +411 * +c +++ = (( +xmc +[28] & 0x3) << 6) + +412 | (( +xmc +[29] & 0x7) << 3) + +413 | ( +xmc +[30] & 0x7); + +414 * +c +++ = (( +xmc +[31] & 0x7) << 5) + +415 | (( +xmc +[32] & 0x7) << 2) + +416 | (( +xmc +[33] >> 1) & 0x3); + +417 * +c +++ = (( +xmc +[33] & 0x1) << 7) + +418 | (( +xmc +[34] & 0x7) << 4) + +419 | (( +xmc +[35] & 0x7) << 1) + +420 | (( +xmc +[36] >> 2) & 0x1); + +421 * +c +++ = (( +xmc +[36] & 0x3) << 6) + +422 | (( +xmc +[37] & 0x7) << 3) + +423 | ( +xmc +[38] & 0x7); + +424 * +c +++ = (( +Nc +[3] & 0x7F) << 1) + +425 | (( +bc +[3] >> 1) & 0x1); + +426 * +c +++ = (( +bc +[3] & 0x1) << 7) + +427 | (( +Mc +[3] & 0x3) << 5) + +428 | (( +xmaxc +[3] >> 1) & 0x1F); + +429 * +c +++ = (( +xmaxc +[3] & 0x1) << 7) + +430 | (( +xmc +[39] & 0x7) << 4) + +431 | (( +xmc +[40] & 0x7) << 1) + +432 | (( +xmc +[41] >> 2) & 0x1); + +433 * +c +++ = (( +xmc +[41] & 0x3) << 6) + +434 | (( +xmc +[42] & 0x7) << 3) + +435 | ( +xmc +[43] & 0x7); + +436 * +c +++ = (( +xmc +[44] & 0x7) << 5) + +437 | (( +xmc +[45] & 0x7) << 2) + +438 | (( +xmc +[46] >> 1) & 0x3); + +439 * +c +++ = (( +xmc +[46] & 0x1) << 7) + +440 | (( +xmc +[47] & 0x7) << 4) + +441 | (( +xmc +[48] & 0x7) << 1) + +442 | (( +xmc +[49] >> 2) & 0x1); + +443 * +c +++ = (( +xmc +[49] & 0x3) << 6) + +444 | (( +xmc +[50] & 0x7) << 3) + +445 | ( +xmc +[51] & 0x7); + +448 + } +} + + @gsm_option.c + +7 + ~"gsm610_´iv.h +" + +9 + ~"gsm.h +" + +11 + $gsm_ÝtiÚ + ( +gsm + +r +, +Ýt +, * +v® +) + +13 +»suÉ + = -1; + +15 +Ýt +) { + +16 +GSM_OPT_LTP_CUT +: + +17 #ifdeà +LTP_CUT + + +18 +»suÉ + = +r +-> +Ép_cut +; + +19 ià( +v® +è +r +-> +Ép_cut + = *val; + +23 +GSM_OPT_VERBOSE +: + +24 #iâdef +NDEBUG + + +25 +»suÉ + = +r +-> +v”bo£ +; + +26 ià( +v® +è +r +-> +v”bo£ + = *val; + +30 +GSM_OPT_FAST +: + +32 #if + `defšed +( +FAST +è&& defšed( +USE_FLOAT_MUL +) + +33 +»suÉ + = +r +-> +ç¡ +; + +34 ià( +v® +è +r +-> +ç¡ + = !!*val; + +38 +GSM_OPT_FRAME_CHAIN +: + +40 #ifdeà +WAV49 + + +41 +»suÉ + = +r +-> +äame_chaš +; + +42 ià( +v® +è +r +-> +äame_chaš + = *val; + +46 +GSM_OPT_FRAME_INDEX +: + +48 #ifdeà +WAV49 + + +49 +»suÉ + = +r +-> +äame_šdex +; + +50 ià( +v® +è +r +-> +äame_šdex + = *val; + +54 +GSM_OPT_WAV49 +: + +56 #ifdeà +WAV49 + + +57 +»suÉ + = +r +-> +wav_fmt +; + +58 ià( +v® +è +r +-> +wav_fmt + = !!*val; + +65 +»suÉ +; + +66 + } +} + + @long_term.c + +7 + ~<¡dio.h +> + +8 + ~<as£¹.h +> + +10 + ~"gsm610_´iv.h +" + +12 + ~"gsm.h +" + +42 #iâdeà +USE_FLOAT_MUL + + +44 #ifdef +LTP_CUT + + +46 + $Cut_C®cuÏtiÚ_of_the_LTP_·¿m‘”s + ( + +48 +gsm_¡©e + * +¡ +, + +50 +wÜd + * +d +, + +51 +wÜd + * +dp +, + +52 +wÜd + * +bc_out +, + +53 +wÜd + * +Nc_out + + +56 +k +, +Ïmbda +; + +57 +wÜd + +Nc +, +bc +; + +58 +wÜd + +wt +[40]; + +60 +lÚgwÜd + +L_»suÉ +; + +61 +lÚgwÜd + +L_max +, +L_pow” +; + +62 +wÜd + +R +, +S +, +dmax +, +sÿl +, +be¡_k +; + +63 +wÜd + +Ép_cut +; + +65 +wÜd + +‹mp +, +wt_k +; + +69 +dmax + = 0; + +70 +k + = 0; k <= 39; k++) { + +71 +‹mp + = +d +[ +k +]; + +72 +‹mp + = + `GSM_ABS +(emp ); + +73 ià( +‹mp + > +dmax +) { + +74 +dmax + = +‹mp +; + +75 +be¡_k + = +k +; + +78 +‹mp + = 0; + +79 ià( +dmax + =ð0è +sÿl + = 0; + +81 + `as£¹ +( +dmax + > 0); + +82 +‹mp + = + `gsm_nÜm +Ð( +lÚgwÜd +) +dmax + << 16 ); + +84 ià( +‹mp + > 6è +sÿl + = 0; + +85 +sÿl + = 6 - +‹mp +; + +86 + `as£¹ +( +sÿl + >= 0); + +90 +L_max + = 0; + +91 +Nc + = 40; + +92 +wt_k + = + `SASR_W +( +d +[ +be¡_k +], +sÿl +); + +94 +Ïmbda + = 40;†ambda <= 120;†ambda++) { + +95 +L_»suÉ + = ( +lÚgwÜd +) +wt_k + * +dp +[ +be¡_k + - +Ïmbda +]; + +96 ià( +L_»suÉ + > +L_max +) { + +97 +Nc + = +Ïmbda +; + +98 +L_max + = +L_»suÉ +; + +101 * +Nc_out + = +Nc +; + +102 +L_max + <<= 1; + +106 + `as£¹ +( +sÿl + <= 100 && scal >= -100); + +107 +L_max + = L_max >> (6 - +sÿl +); + +109 + `as£¹ +Ð +Nc + <= 120 && Nc >= 40); + +114 +L_pow” + = 0; + +115 +k + = 0; k <= 39; k++) { + +117 +lÚgwÜd + +L_‹mp +; + +119 +L_‹mp + = + `SASR_W +Ð +dp +[ +k + - +Nc +], 3 ); + +120 +L_pow” + +ð +L_‹mp + * L_temp; + +122 +L_pow” + <<= 1; + +127 ià( +L_max + <= 0) { + +128 * +bc_out + = 0; + +131 ià( +L_max + >ð +L_pow” +) { + +132 * +bc_out + = 3; + +136 +‹mp + = + `gsm_nÜm +Ð +L_pow” + ); + +138 +R + = + `SASR +Ð +L_max + << +‹mp +, 16 ); + +139 +S + = + `SASR +Ð +L_pow” + << +‹mp +, 16 ); + +147 +bc + = 0; bø<ð2; bc++èià( +R + <ð + `gsm_muÉ +( +S +, +gsm_DLB +[bc])) ; + +148 * +bc_out + = +bc +; + +149 + } +} + +153 + $C®cuÏtiÚ_of_the_LTP_·¿m‘”s + ( + +154 +wÜd + * +d +, + +155 +wÜd + * +dp +, + +156 +wÜd + * +bc_out +, + +157 +wÜd + * +Nc_out + + +160 +k +, +Ïmbda +; + +161 +wÜd + +Nc +, +bc +; + +162 +wÜd + +wt +[40]; + +164 +lÚgwÜd + +L_max +, +L_pow” +; + +165 +wÜd + +R +, +S +, +dmax +, +sÿl +; + +166 +wÜd + +‹mp +; + +170 +dmax + = 0; + +172 +k + = 0; k <= 39; k++) { + +173 +‹mp + = +d +[ +k +]; + +174 +‹mp + = + `GSM_ABS +(emp ); + +175 ià( +‹mp + > +dmax +) dmax =emp; + +178 +‹mp + = 0; + +179 ià( +dmax + =ð0è +sÿl + = 0; + +181 + `as£¹ +( +dmax + > 0); + +182 +‹mp + = + `gsm_nÜm +Ð( +lÚgwÜd +) +dmax + << 16 ); + +185 ià( +‹mp + > 6è +sÿl + = 0; + +186 +sÿl + = 6 - +‹mp +; + +188 + `as£¹ +( +sÿl + >= 0); + +193 +k + = 0; k <ð39; k++è +wt +[k] = + `SASR_W +Ð +d +[k], +sÿl + ); + +197 +L_max + = 0; + +198 +Nc + = 40; + +200 +Ïmbda + = 40;†ambda <= 120;†ambda++) { + +202 #undeà +STEP + + +203 + #STEP +( +k +è( +lÚgwÜd +) +wt +[k] * +dp +[k - +Ïmbda +] + + ) + +205 +lÚgwÜd + +L_»suÉ +; + +207 +L_»suÉ + = + `STEP +(0) ; L_result += STEP(1) ; + +208 +L_»suÉ + +ð + `STEP +(2) ; L_result += STEP(3) ; + +209 +L_»suÉ + +ð + `STEP +(4) ; L_result += STEP(5) ; + +210 +L_»suÉ + +ð + `STEP +(6) ; L_result += STEP(7) ; + +211 +L_»suÉ + +ð + `STEP +(8) ; L_result += STEP(9) ; + +212 +L_»suÉ + +ð + `STEP +(10) ; L_result += STEP(11) ; + +213 +L_»suÉ + +ð + `STEP +(12) ; L_result += STEP(13) ; + +214 +L_»suÉ + +ð + `STEP +(14) ; L_result += STEP(15) ; + +215 +L_»suÉ + +ð + `STEP +(16) ; L_result += STEP(17) ; + +216 +L_»suÉ + +ð + `STEP +(18) ; L_result += STEP(19) ; + +217 +L_»suÉ + +ð + `STEP +(20) ; L_result += STEP(21) ; + +218 +L_»suÉ + +ð + `STEP +(22) ; L_result += STEP(23) ; + +219 +L_»suÉ + +ð + `STEP +(24) ; L_result += STEP(25) ; + +220 +L_»suÉ + +ð + `STEP +(26) ; L_result += STEP(27) ; + +221 +L_»suÉ + +ð + `STEP +(28) ; L_result += STEP(29) ; + +222 +L_»suÉ + +ð + `STEP +(30) ; L_result += STEP(31) ; + +223 +L_»suÉ + +ð + `STEP +(32) ; L_result += STEP(33) ; + +224 +L_»suÉ + +ð + `STEP +(34) ; L_result += STEP(35) ; + +225 +L_»suÉ + +ð + `STEP +(36) ; L_result += STEP(37) ; + +226 +L_»suÉ + +ð + `STEP +(38) ; L_result += STEP(39) ; + +228 ià( +L_»suÉ + > +L_max +) { + +230 +Nc + = +Ïmbda +; + +231 +L_max + = +L_»suÉ +; + +235 * +Nc_out + = +Nc +; + +237 +L_max + <<= 1; + +241 + `as£¹ +( +sÿl + <= 100 && scal >= -100); + +242 +L_max + = L_max >> (6 - +sÿl +); + +244 + `as£¹ +Ð +Nc + <= 120 && Nc >= 40); + +249 +L_pow” + = 0; + +250 +k + = 0; k <= 39; k++) { + +252 +lÚgwÜd + +L_‹mp +; + +254 +L_‹mp + = + `SASR_W +Ð +dp +[ +k + - +Nc +], 3 ); + +255 +L_pow” + +ð +L_‹mp + * L_temp; + +257 +L_pow” + <<= 1; + +262 ià( +L_max + <= 0) { + +263 * +bc_out + = 0; + +266 ià( +L_max + >ð +L_pow” +) { + +267 * +bc_out + = 3; + +271 +‹mp + = + `gsm_nÜm +Ð +L_pow” + ); + +273 +R + = + `SASR_L +Ð +L_max + << +‹mp +, 16 ); + +274 +S + = + `SASR_L +Ð +L_pow” + << +‹mp +, 16 ); + +282 +bc + = 0; bø<ð2; bc++èià( +R + <ð + `gsm_muÉ +( +S +, +gsm_DLB +[bc])) ; + +283 * +bc_out + = +bc +; + +284 + } +} + +288 #ifdef +LTP_CUT + + +290 + $Cut_C®cuÏtiÚ_of_the_LTP_·¿m‘”s + ( + +291 +gsm_¡©e + * +¡ +, + +292 +wÜd + * +d +, + +293 +wÜd + * +dp +, + +294 +wÜd + * +bc_out +, + +295 +wÜd + * +Nc_out + + +298 +k +, +Ïmbda +; + +299 +wÜd + +Nc +, +bc +; + +300 +wÜd + +Ép_cut +; + +302 +wt_æßt +[40]; + +303 +dp_æßt_ba£ +[120], * +dp_æßt + = dp_float_base + 120; + +305 +lÚgwÜd + +L_max +, +L_pow” +; + +306 +wÜd + +R +, +S +, +dmax +, +sÿl +; + +307 +wÜd + +‹mp +; + +311 +dmax + = 0; + +313 +k + = 0; k <= 39; k++) { + +314 +‹mp + = +d +[ +k +]; + +315 +‹mp + = + `GSM_ABS +(emp ); + +316 ià( +‹mp + > +dmax +) dmax =emp; + +319 +‹mp + = 0; + +320 ià( +dmax + =ð0è +sÿl + = 0; + +322 + `as£¹ +( +dmax + > 0); + +323 +‹mp + = + `gsm_nÜm +Ð( +lÚgwÜd +) +dmax + << 16 ); + +326 ià( +‹mp + > 6è +sÿl + = 0; + +327 +sÿl + = 6 - +‹mp +; + +329 + `as£¹ +( +sÿl + >= 0); + +330 +Ép_cut + = ( +lÚgwÜd +) + `SASR_W +( +dmax +, +sÿl +è* +¡ +->ltp_cut / 100; + +336 +k + = 0; k < 40; k++) { + +337 +wÜd + +w + = + `SASR_W +Ð +d +[ +k +], +sÿl + ); + +338 ià( +w + < 0 ? w > - +Ép_cut + : w <†tp_cut) { + +339 +wt_æßt +[ +k +] = 0.0; + +342 +wt_æßt +[ +k +] = +w +; + +345 +k + = -120; k < 0; k++è +dp_æßt +[k] = +dp +[k]; + +349 +L_max + = 0; + +350 +Nc + = 40; + +352 +Ïmbda + = 40;†ambda <= 120;†ambda += 9) { + +356 * +Í + = +dp_æßt + - +Ïmbda +; + +358 +W +; + +359 +a + = +Í +[-8], +b + =†p[-7], +c + =†p[-6], + +360 +d + = +Í +[-5], +e + =†p[-4], +f + =†p[-3], + +361 +g + = +Í +[-2], +h + =†p[-1]; + +362 +E +; + +363 +S0 + = 0, +S1 + = 0, +S2 + = 0, +S3 + = 0, +S4 + = 0, + +364 +S5 + = 0, +S6 + = 0, +S7 + = 0, +S8 + = 0; + +366 #undeà +STEP + + +367 + #STEP +( +K +, +a +, +b +, +c +, +d +, +e +, +f +, +g +, +h +) \ + +368 ià(( +W + = +wt_æßt +[ +K +]) != 0.0) { \ + +369 +E + = +W + * +a +; +S8 + += E; \ + +370 +E + = +W + * +b +; +S7 + += E; \ + +371 +E + = +W + * +c +; +S6 + += E; \ + +372 +E + = +W + * +d +; +S5 + += E; \ + +373 +E + = +W + * +e +; +S4 + += E; \ + +374 +E + = +W + * +f +; +S3 + += E; \ + +375 +E + = +W + * +g +; +S2 + += E; \ + +376 +E + = +W + * +h +; +S1 + += E; \ + +377 +a + = +Í +[ +K +]; \ + +378 +E + = +W + * +a +; +S0 + +ðE; } × = +Í +[ +K +]) + + ) + +380 + #STEP_A +( +K +è + `STEP +(K, +a +, +b +, +c +, +d +, +e +, +f +, +g +, +h +) + + ) + +381 + #STEP_B +( +K +è + `STEP +(K, +b +, +c +, +d +, +e +, +f +, +g +, +h +, +a +) + + ) + +382 + #STEP_C +( +K +è + `STEP +(K, +c +, +d +, +e +, +f +, +g +, +h +, +a +, +b +) + + ) + +383 + #STEP_D +( +K +è + `STEP +(K, +d +, +e +, +f +, +g +, +h +, +a +, +b +, +c +) + + ) + +384 + #STEP_E +( +K +è + `STEP +(K, +e +, +f +, +g +, +h +, +a +, +b +, +c +, +d +) + + ) + +385 + #STEP_F +( +K +è + `STEP +(K, +f +, +g +, +h +, +a +, +b +, +c +, +d +, +e +) + + ) + +386 + #STEP_G +( +K +è + `STEP +(K, +g +, +h +, +a +, +b +, +c +, +d +, +e +, +f +) + + ) + +387 + #STEP_H +( +K +è + `STEP +(K, +h +, +a +, +b +, +c +, +d +, +e +, +f +, +g +) + + ) + +389 + `STEP_A +Ð0); + `STEP_B +Ð1); + `STEP_C +Ð2); + `STEP_D +( 3); + +390 + `STEP_E +Ð4); + `STEP_F +Ð5); + `STEP_G +Ð6); + `STEP_H +( 7); + +392 + `STEP_A +Ð8); + `STEP_B +Ð9); + `STEP_C +(10); + `STEP_D +(11); + +393 + `STEP_E +(12); + `STEP_F +(13); + `STEP_G +(14); + `STEP_H +(15); + +395 + `STEP_A +(16); + `STEP_B +(17); + `STEP_C +(18); + `STEP_D +(19); + +396 + `STEP_E +(20); + `STEP_F +(21); + `STEP_G +(22); + `STEP_H +(23); + +398 + `STEP_A +(24); + `STEP_B +(25); + `STEP_C +(26); + `STEP_D +(27); + +399 + `STEP_E +(28); + `STEP_F +(29); + `STEP_G +(30); + `STEP_H +(31); + +401 + `STEP_A +(32); + `STEP_B +(33); + `STEP_C +(34); + `STEP_D +(35); + +402 + `STEP_E +(36); + `STEP_F +(37); + `STEP_G +(38); + `STEP_H +(39); + +404 ià( +S0 + > +L_max +è{ L_max = S0; +Nc + = +Ïmbda +; } + +405 ià( +S1 + > +L_max +è{ L_max = S1; +Nc + = +Ïmbda + + 1; } + +406 ià( +S2 + > +L_max +è{ L_max = S2; +Nc + = +Ïmbda + + 2; } + +407 ià( +S3 + > +L_max +è{ L_max = S3; +Nc + = +Ïmbda + + 3; } + +408 ià( +S4 + > +L_max +è{ L_max = S4; +Nc + = +Ïmbda + + 4; } + +409 ià( +S5 + > +L_max +è{ L_max = S5; +Nc + = +Ïmbda + + 5; } + +410 ià( +S6 + > +L_max +è{ L_max = S6; +Nc + = +Ïmbda + + 6; } + +411 ià( +S7 + > +L_max +è{ L_max = S7; +Nc + = +Ïmbda + + 7; } + +412 ià( +S8 + > +L_max +è{ L_max = S8; +Nc + = +Ïmbda + + 8; } + +415 * +Nc_out + = +Nc +; + +417 +L_max + <<= 1; + +421 + `as£¹ +( +sÿl + <= 100 && scal >= -100); + +422 +L_max + = L_max >> (6 - +sÿl +); + +424 + `as£¹ +Ð +Nc + <= 120 && Nc >= 40); + +429 +L_pow” + = 0; + +430 +k + = 0; k <= 39; k++) { + +432 +lÚgwÜd + +L_‹mp +; + +434 +L_‹mp + = + `SASR_W +Ð +dp +[ +k + - +Nc +], 3 ); + +435 +L_pow” + +ð +L_‹mp + * L_temp; + +437 +L_pow” + <<= 1; + +442 ià( +L_max + <= 0) { + +443 * +bc_out + = 0; + +446 ià( +L_max + >ð +L_pow” +) { + +447 * +bc_out + = 3; + +451 +‹mp + = + `gsm_nÜm +Ð +L_pow” + ); + +453 +R + = + `SASR +Ð +L_max + << +‹mp +, 16 ); + +454 +S + = + `SASR +Ð +L_pow” + << +‹mp +, 16 ); + +462 +bc + = 0; bø<ð2; bc++èià( +R + <ð + `gsm_muÉ +( +S +, +gsm_DLB +[bc])) ; + +463 * +bc_out + = +bc +; + +464 + } +} + +468 + $C®cuÏtiÚ_of_the_LTP_·¿m‘”s + ( + +469 +wÜd + * +dš +, + +470 +wÜd + * +dp +, + +471 +wÜd + * +bc_out +, + +472 +wÜd + * +Nc_out + + +475 +k +, +Ïmbda +; + +476 +wÜd + +Nc +, +bc +; + +478 +wt_æßt +[40]; + +479 +dp_æßt_ba£ +[120], * +dp_æßt + = dp_float_base + 120; + +481 +lÚgwÜd + +L_max +, +L_pow” +; + +482 +wÜd + +R +, +S +, +dmax +, +sÿl +; + +483 +wÜd + +‹mp +; + +487 +dmax + = 0; + +489 +k + = 0; k <= 39; k++) { + +490 +‹mp + = +dš + [ +k +] ; + +491 +‹mp + = + `GSM_ABS + (temp) ; + +492 ià( +‹mp + > +dmax +) dmax =emp; + +495 +‹mp + = 0; + +496 ià( +dmax + =ð0è +sÿl + = 0; + +498 + `as£¹ +( +dmax + > 0); + +499 +‹mp + = + `gsm_nÜm +Ð( +lÚgwÜd +) +dmax + << 16 ); + +502 ià( +‹mp + > 6è +sÿl + = 0; + +503 +sÿl + = 6 - +‹mp +; + +505 + `as£¹ +( +sÿl + >= 0); + +510 +k + = 0; k < 40; k++è +wt_æßt +[k] = + `SASR_W + ( +dš + [k], +sÿl +) ; + +511 +k + = -120; k < 0; k++è +dp_æßt +[k] = +dp +[k]; + +515 +L_max + = 0; + +516 +Nc + = 40; + +518 +Ïmbda + = 40;†ambda <= 120;†ambda += 9) { + +522 * +Í + = +dp_æßt + - +Ïmbda +; + +524 +W +; + +525 +a + = +Í +[-8], +b + =†p[-7], +c + =†p[-6], + +526 +d + = +Í +[-5], +e + =†p[-4], +f + =†p[-3], + +527 +g + = +Í +[-2], +h + =†p[-1]; + +528 +E +; + +529 +S0 + = 0, +S1 + = 0, +S2 + = 0, +S3 + = 0, +S4 + = 0, + +530 +S5 + = 0, +S6 + = 0, +S7 + = 0, +S8 + = 0; + +532 #undeà +STEP + + +533 + #STEP +( +K +, +a +, +b +, +c +, +d +, +e +, +f +, +g +, +h +) \ + +534 +W + = +wt_æßt +[ +K +]; \ + +535 +E + = +W + * +a +; +S8 + += E; \ + +536 +E + = +W + * +b +; +S7 + += E; \ + +537 +E + = +W + * +c +; +S6 + += E; \ + +538 +E + = +W + * +d +; +S5 + += E; \ + +539 +E + = +W + * +e +; +S4 + += E; \ + +540 +E + = +W + * +f +; +S3 + += E; \ + +541 +E + = +W + * +g +; +S2 + += E; \ + +542 +E + = +W + * +h +; +S1 + += E; \ + +543 +a + = +Í +[ +K +]; \ + +544 +E + = +W + * +a +; +S0 + +ð + ) +E + +546 + #STEP_A +( +K +è + `STEP +(K, +a +, +b +, +c +, +d +, +e +, +f +, +g +, +h +) + + ) + +547 + #STEP_B +( +K +è + `STEP +(K, +b +, +c +, +d +, +e +, +f +, +g +, +h +, +a +) + + ) + +548 + #STEP_C +( +K +è + `STEP +(K, +c +, +d +, +e +, +f +, +g +, +h +, +a +, +b +) + + ) + +549 + #STEP_D +( +K +è + `STEP +(K, +d +, +e +, +f +, +g +, +h +, +a +, +b +, +c +) + + ) + +550 + #STEP_E +( +K +è + `STEP +(K, +e +, +f +, +g +, +h +, +a +, +b +, +c +, +d +) + + ) + +551 + #STEP_F +( +K +è + `STEP +(K, +f +, +g +, +h +, +a +, +b +, +c +, +d +, +e +) + + ) + +552 + #STEP_G +( +K +è + `STEP +(K, +g +, +h +, +a +, +b +, +c +, +d +, +e +, +f +) + + ) + +553 + #STEP_H +( +K +è + `STEP +(K, +h +, +a +, +b +, +c +, +d +, +e +, +f +, +g +) + + ) + +555 + `STEP_A +Ð0); + `STEP_B +Ð1); + `STEP_C +Ð2); + `STEP_D +( 3); + +556 + `STEP_E +Ð4); + `STEP_F +Ð5); + `STEP_G +Ð6); + `STEP_H +( 7); + +558 + `STEP_A +Ð8); + `STEP_B +Ð9); + `STEP_C +(10); + `STEP_D +(11); + +559 + `STEP_E +(12); + `STEP_F +(13); + `STEP_G +(14); + `STEP_H +(15); + +561 + `STEP_A +(16); + `STEP_B +(17); + `STEP_C +(18); + `STEP_D +(19); + +562 + `STEP_E +(20); + `STEP_F +(21); + `STEP_G +(22); + `STEP_H +(23); + +564 + `STEP_A +(24); + `STEP_B +(25); + `STEP_C +(26); + `STEP_D +(27); + +565 + `STEP_E +(28); + `STEP_F +(29); + `STEP_G +(30); + `STEP_H +(31); + +567 + `STEP_A +(32); + `STEP_B +(33); + `STEP_C +(34); + `STEP_D +(35); + +568 + `STEP_E +(36); + `STEP_F +(37); + `STEP_G +(38); + `STEP_H +(39); + +570 ià( +S0 + > +L_max +è{ L_max = S0; +Nc + = +Ïmbda +; } + +571 ià( +S1 + > +L_max +è{ L_max = S1; +Nc + = +Ïmbda + + 1; } + +572 ià( +S2 + > +L_max +è{ L_max = S2; +Nc + = +Ïmbda + + 2; } + +573 ià( +S3 + > +L_max +è{ L_max = S3; +Nc + = +Ïmbda + + 3; } + +574 ià( +S4 + > +L_max +è{ L_max = S4; +Nc + = +Ïmbda + + 4; } + +575 ià( +S5 + > +L_max +è{ L_max = S5; +Nc + = +Ïmbda + + 5; } + +576 ià( +S6 + > +L_max +è{ L_max = S6; +Nc + = +Ïmbda + + 6; } + +577 ià( +S7 + > +L_max +è{ L_max = S7; +Nc + = +Ïmbda + + 7; } + +578 ià( +S8 + > +L_max +è{ L_max = S8; +Nc + = +Ïmbda + + 8; } + +580 * +Nc_out + = +Nc +; + +582 +L_max + <<= 1; + +586 + `as£¹ +( +sÿl + <= 100 && scal >= -100); + +587 +L_max + = L_max >> (6 - +sÿl +); + +589 + `as£¹ +Ð +Nc + <= 120 && Nc >= 40); + +594 +L_pow” + = 0; + +595 +k + = 0; k <= 39; k++) { + +597 +lÚgwÜd + +L_‹mp +; + +599 +L_‹mp + = + `SASR_W +Ð +dp +[ +k + - +Nc +], 3 ); + +600 +L_pow” + +ð +L_‹mp + * L_temp; + +602 +L_pow” + <<= 1; + +607 ià( +L_max + <= 0) { + +608 * +bc_out + = 0; + +611 ià( +L_max + >ð +L_pow” +) { + +612 * +bc_out + = 3; + +616 +‹mp + = + `gsm_nÜm +Ð +L_pow” + ); + +618 +R + = + `SASR_L + ( +L_max + << +‹mp +, 16 ); + +619 +S + = + `SASR_L + ( +L_pow” + << +‹mp +, 16 ); + +627 +bc + = 0; bø<ð2; bc++èià( +R + <ð + `gsm_muÉ +( +S +, +gsm_DLB +[bc])) ; + +628 * +bc_out + = +bc +; + +629 + } +} + +631 #ifdef +FAST + + +632 #ifdef +LTP_CUT + + +634 + $Cut_Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s + ( + +635 +gsm_¡©e + * +¡ +, + +636 +wÜd + * +d +, + +637 +wÜd + * +dp +, + +638 +wÜd + * +bc_out +, + +639 +wÜd + * +Nc_out + + +642 +k +, +Ïmbda +; + +643 +wt_æßt +; + +644 +wÜd + +Nc +, +bc +; + +645 +wÜd + +wt_max +, +be¡_k +, +Ép_cut +; + +647 +dp_æßt_ba£ +[120], * +dp_æßt + = dp_float_base + 120; + +649 +L_»suÉ +, +L_max +, +L_pow” +; + +651 +wt_max + = 0; + +653 +k + = 0; k < 40; ++k) { + +654 iàÐ +d +[ +k +] > +wt_max +èwt_max = d[ +be¡_k + = k]; + +655 ià(- +d +[ +k +] > +wt_max +èwt_max = -d[ +be¡_k + = k]; + +658 + `as£¹ +( +wt_max + >= 0); + +659 +wt_æßt + = () +wt_max +; + +661 +k + = -120; k < 0; ++kè +dp_æßt +[k] = () +dp +[k]; + +665 +L_max + = 0; + +666 +Nc + = 40; + +668 +Ïmbda + = 40;†ambda <= 120;†ambda++) { + +669 +L_»suÉ + = +wt_æßt + * +dp_æßt +[ +be¡_k + - +Ïmbda +]; + +670 ià( +L_»suÉ + > +L_max +) { + +671 +Nc + = +Ïmbda +; + +672 +L_max + = +L_»suÉ +; + +676 * +Nc_out + = +Nc +; + +677 ià( +L_max + <= 0.) { + +678 * +bc_out + = 0; + +685 +dp_æßt + -ð +Nc +; + +686 +L_pow” + = 0; + +687 +k + = 0; k < 40; ++k) { + +688 +f + = +dp_æßt +[ +k +]; + +689 +L_pow” + +ð +f + * f; + +692 ià( +L_max + >ð +L_pow” +) { + +693 * +bc_out + = 3; + +701 +Ïmbda + = +L_max + / +L_pow” + * 32768.; + +702 +bc + = 0; bø<ð2; ++bcèià( +Ïmbda + <ð +gsm_DLB +[bc]) ; + +703 * +bc_out + = +bc +; + +704 + } +} + +708 + $Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s + ( + +709 +wÜd + * +dš +, + +710 +wÜd + * +dp +, + +711 +wÜd + * +bc_out +, + +712 +wÜd + * +Nc_out + + +715 +k +, +Ïmbda +; + +716 +wÜd + +Nc +, +bc +; + +718 +wt_æßt +[40]; + +719 +dp_æßt_ba£ +[120], * +dp_æßt + = dp_float_base + 120; + +721 +L_max +, +L_pow” +; + +723 +k + = 0; k < 40; ++kè +wt_æßt +[k] = (è +dš + [k] ; + +724 +k + = -120; k < 0; ++kè +dp_æßt +[k] = (è +dp + [k] ; + +728 +L_max + = 0; + +729 +Nc + = 40; + +731 +Ïmbda + = 40;†ambda <= 120;†ambda += 9) { + +735 * +Í + = +dp_æßt + - +Ïmbda +; + +737 +W +; + +738 +a + = +Í +[-8], +b + =†p[-7], +c + =†p[-6], + +739 +d + = +Í +[-5], +e + =†p[-4], +f + =†p[-3], + +740 +g + = +Í +[-2], +h + =†p[-1]; + +741 +E +; + +742 +S0 + = 0, +S1 + = 0, +S2 + = 0, +S3 + = 0, +S4 + = 0, + +743 +S5 + = 0, +S6 + = 0, +S7 + = 0, +S8 + = 0; + +745 #undeà +STEP + + +746 + #STEP +( +K +, +a +, +b +, +c +, +d +, +e +, +f +, +g +, +h +) \ + +747 +W + = +wt_æßt +[ +K +]; \ + +748 +E + = +W + * +a +; +S8 + += E; \ + +749 +E + = +W + * +b +; +S7 + += E; \ + +750 +E + = +W + * +c +; +S6 + += E; \ + +751 +E + = +W + * +d +; +S5 + += E; \ + +752 +E + = +W + * +e +; +S4 + += E; \ + +753 +E + = +W + * +f +; +S3 + += E; \ + +754 +E + = +W + * +g +; +S2 + += E; \ + +755 +E + = +W + * +h +; +S1 + += E; \ + +756 +a + = +Í +[ +K +]; \ + +757 +E + = +W + * +a +; +S0 + +ð + ) +E + +759 + #STEP_A +( +K +è + `STEP +(K, +a +, +b +, +c +, +d +, +e +, +f +, +g +, +h +) + + ) + +760 + #STEP_B +( +K +è + `STEP +(K, +b +, +c +, +d +, +e +, +f +, +g +, +h +, +a +) + + ) + +761 + #STEP_C +( +K +è + `STEP +(K, +c +, +d +, +e +, +f +, +g +, +h +, +a +, +b +) + + ) + +762 + #STEP_D +( +K +è + `STEP +(K, +d +, +e +, +f +, +g +, +h +, +a +, +b +, +c +) + + ) + +763 + #STEP_E +( +K +è + `STEP +(K, +e +, +f +, +g +, +h +, +a +, +b +, +c +, +d +) + + ) + +764 + #STEP_F +( +K +è + `STEP +(K, +f +, +g +, +h +, +a +, +b +, +c +, +d +, +e +) + + ) + +765 + #STEP_G +( +K +è + `STEP +(K, +g +, +h +, +a +, +b +, +c +, +d +, +e +, +f +) + + ) + +766 + #STEP_H +( +K +è + `STEP +(K, +h +, +a +, +b +, +c +, +d +, +e +, +f +, +g +) + + ) + +768 + `STEP_A +Ð0); + `STEP_B +Ð1); + `STEP_C +Ð2); + `STEP_D +( 3); + +769 + `STEP_E +Ð4); + `STEP_F +Ð5); + `STEP_G +Ð6); + `STEP_H +( 7); + +771 + `STEP_A +Ð8); + `STEP_B +Ð9); + `STEP_C +(10); + `STEP_D +(11); + +772 + `STEP_E +(12); + `STEP_F +(13); + `STEP_G +(14); + `STEP_H +(15); + +774 + `STEP_A +(16); + `STEP_B +(17); + `STEP_C +(18); + `STEP_D +(19); + +775 + `STEP_E +(20); + `STEP_F +(21); + `STEP_G +(22); + `STEP_H +(23); + +777 + `STEP_A +(24); + `STEP_B +(25); + `STEP_C +(26); + `STEP_D +(27); + +778 + `STEP_E +(28); + `STEP_F +(29); + `STEP_G +(30); + `STEP_H +(31); + +780 + `STEP_A +(32); + `STEP_B +(33); + `STEP_C +(34); + `STEP_D +(35); + +781 + `STEP_E +(36); + `STEP_F +(37); + `STEP_G +(38); + `STEP_H +(39); + +783 ià( +S0 + > +L_max +è{ L_max = S0; +Nc + = +Ïmbda +; } + +784 ià( +S1 + > +L_max +è{ L_max = S1; +Nc + = +Ïmbda + + 1; } + +785 ià( +S2 + > +L_max +è{ L_max = S2; +Nc + = +Ïmbda + + 2; } + +786 ià( +S3 + > +L_max +è{ L_max = S3; +Nc + = +Ïmbda + + 3; } + +787 ià( +S4 + > +L_max +è{ L_max = S4; +Nc + = +Ïmbda + + 4; } + +788 ià( +S5 + > +L_max +è{ L_max = S5; +Nc + = +Ïmbda + + 5; } + +789 ià( +S6 + > +L_max +è{ L_max = S6; +Nc + = +Ïmbda + + 6; } + +790 ià( +S7 + > +L_max +è{ L_max = S7; +Nc + = +Ïmbda + + 7; } + +791 ià( +S8 + > +L_max +è{ L_max = S8; +Nc + = +Ïmbda + + 8; } + +793 * +Nc_out + = +Nc +; + +795 ià( +L_max + <= 0.) { + +796 * +bc_out + = 0; + +803 +dp_æßt + -ð +Nc +; + +804 +L_pow” + = 0; + +805 +k + = 0; k < 40; ++k) { + +806 +f + = +dp_æßt +[ +k +]; + +807 +L_pow” + +ð +f + * f; + +810 ià( +L_max + >ð +L_pow” +) { + +811 * +bc_out + = 3; + +819 +Ïmbda + = +L_max + / +L_pow” + * 32768.; + +820 +bc + = 0; bø<ð2; ++bcèià( +Ïmbda + <ð +gsm_DLB +[bc]) ; + +821 * +bc_out + = +bc +; + +822 + } +} + +830 + $LÚg_‹rm_ª®ysis_fž‹ršg + ( + +831 +wÜd + +bc +, + +832 +wÜd + +Nc +, + +833 +wÜd + * +dp +, + +834 +wÜd + * +d +, + +835 +wÜd + * +dµ +, + +836 +wÜd + * +e + + +845 +k +; + +847 #undeà +STEP + + +848 + #STEP +( +BP +) \ + +849 +k + = 0; k <= 39; k++) { \ + +850 +dµ +[ +k +] = + `GSM_MULT_R +Ð +BP +, +dp +[k - +Nc +]); \ + +851 +e +[ +k +] = + `GSM_SUB +Ð +d +[k], +dµ +[k] ); \ + +852 } + + ) + +854 +bc +) { + +855 0: + `STEP +( 3277 ); ; + +856 1: + `STEP +( 11469 ); ; + +857 2: + `STEP +( 21299 ); ; + +858 3: + `STEP +( 32767 ); ; + +860 + } +} + +862 + $Gsm_LÚg_T”m_P»diùÜ + ( + +864 +gsm_¡©e + * +S +, + +866 +wÜd + * +d +, + +867 +wÜd + * +dp +, + +869 +wÜd + * +e +, + +870 +wÜd + * +dµ +, + +871 +wÜd + * +Nc +, + +872 +wÜd + * +bc + + +875 + `as£¹ +Ð +d + );‡s£¹Ð +dp + );‡s£¹Ð +e + ); + +876 + `as£¹ +Ð +dµ +);‡s£¹Ð +Nc + );‡s£¹Ð +bc + ); + +878 #ià + `defšed +( +FAST +è&& defšed( +USE_FLOAT_MUL +) + +879 ià( +S +-> +ç¡ +) + +880 #ià + `defšed + ( +LTP_CUT +) + +881 ià( +S +-> +Ép_cut +) + +882 + `Cut_Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s +( +S +, + +883 +d +, +dp +, +bc +, +Nc +); + +886 + `Fa¡_C®cuÏtiÚ_of_the_LTP_·¿m‘”s +( +d +, +dp +, +bc +, +Nc + ); + +889 #ifdeà +LTP_CUT + + +890 ià( +S +-> +Ép_cut +) + +891 + `Cut_C®cuÏtiÚ_of_the_LTP_·¿m‘”s +( +S +, +d +, +dp +, +bc +, +Nc +); + +894 + `C®cuÏtiÚ_of_the_LTP_·¿m‘”s +( +d +, +dp +, +bc +, +Nc +); + +896 + `LÚg_‹rm_ª®ysis_fž‹ršg +Ð* +bc +, * +Nc +, +dp +, +d +, +dµ +, +e + ); + +897 + } +} + +900 + $Gsm_LÚg_T”m_SyÁhesis_Fž‹ršg + ( + +901 +gsm_¡©e + * +S +, + +903 +wÜd + +Nü +, + +904 +wÜd + +bü +, + +905 +wÜd + * +”p +, + +906 +wÜd + * +d½ + + +914 +k +; + +915 +wÜd + +b½ +, +d½p +, +Nr +; + +919 +Nr + = +Nü + < 40 || Nü > 120 ? +S +-> +Äp + : Ncr; + +920 +S +-> +Äp + = +Nr +; + +921 + `as£¹ +( +Nr + >= 40 && Nr <= 120); + +925 +b½ + = +gsm_QLB +[ +bü + ]; + +930 + `as£¹ +( +b½ + !ð +MIN_WORD +); + +932 +k + = 0; k <= 39; k++) { + +933 +d½p + = + `GSM_MULT_R +Ð +b½ +, +d½ +[ +k + - +Nr + ] ); + +934 +d½ +[ +k +] = + `GSM_ADD +Ð +”p +[k], +d½p + ); + +942 +k + = 0; k <ð119; k++è +d½ +[ -120 + k ] = drp[ -80 + k ]; + +943 + } +} + + @lpc.c + +7 + ~<¡dio.h +> + +8 + ~<as£¹.h +> + +10 + ~"gsm610_´iv.h +" + +12 + ~"gsm.h +" + +21 + $AutocÜ»ÏtiÚ + ( + +22 +wÜd + * +s +, + +23 +lÚgwÜd + * +L_ACF +) + +29 +k +, +i +; + +31 +wÜd + +‹mp +, +smax +, +sÿÏuto +; + +33 #ifdef +USE_FLOAT_MUL + + +34 +æßt_s +[160]; + +42 +smax + = 0; + +43 +k + = 0; k <= 159; k++) { + +44 +‹mp + = + `GSM_ABS +Ð +s +[ +k +] ); + +45 ià( +‹mp + > +smax +) smax =emp; + +50 ià( +smax + =ð0è +sÿÏuto + = 0; + +52 + `as£¹ +( +smax + > 0); + +53 +sÿÏuto + = 4 - + `gsm_nÜm +Ð( +lÚgwÜd +) +smax + << 16 ); + +59 ià( +sÿÏuto + > 0) { + +61 #ifdeà +USE_FLOAT_MUL + + +62 + #SCALE +( +n +) \ + +63 +n +: +k + = 0; k <= 159; k++) \ + +64 +æßt_s +[ +k +] = () \ + +65 ( +s +[ +k +] = + `GSM_MULT_R +(s[k], 16384 >> ( +n +-1)));\ + +66 ; + + ) + +68 + #SCALE +( +n +) \ + +69 +n +: +k + = 0; k <= 159; k++) \ + +70 +s +[ +k +] = + `GSM_MULT_R +Ðs[k], 16384 >> ( +n +-1) );\ + +71 ; + + ) + +74 +sÿÏuto +) { + +75 + `SCALE +(1) + +76 + `SCALE +(2) + +77 + `SCALE +(3) + +78 + `SCALE +(4) + +80 #undeà +SCALE + + +82 #ifdef +USE_FLOAT_MUL + + +83 +k + = 0; k <ð159; k++è +æßt_s +[k] = (è +s +[k]; + +89 #ifdef +USE_FLOAT_MUL + + +90 * +¥ + = +æßt_s +; + +91 +¦ + = * +¥ +; + +93 + #STEP +( +k +è +L_ACF +[k] +ð( +lÚgwÜd +)( +¦ + * +¥ +[ -(kè]); + + ) + +95 +wÜd + * +¥ + = +s +; + +96 +wÜd + +¦ + = * +¥ +; + +98 + #STEP +( +k +è +L_ACF +[k] +ð(( +lÚgwÜd +) +¦ + * +¥ +[ -(kè]); + + ) + +101 + #NEXTI + +¦ + = *++ +¥ + + + ) + +104 +k + = 9; k--; +L_ACF +[k] = 0) ; + +106 + `STEP + (0); + +107 +NEXTI +; + +108 + `STEP +(0); STEP(1); + +109 +NEXTI +; + +110 + `STEP +(0); STEP(1); STEP(2); + +111 +NEXTI +; + +112 + `STEP +(0); STEP(1); STEP(2); STEP(3); + +113 +NEXTI +; + +114 + `STEP +(0); STEP(1); STEP(2); STEP(3); STEP(4); + +115 +NEXTI +; + +116 + `STEP +(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); + +117 +NEXTI +; + +118 + `STEP +(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); + +119 +NEXTI +; + +120 + `STEP +(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7); + +122 +i + = 8; i <= 159; i++) { + +124 +NEXTI +; + +126 + `STEP +(0); + +127 + `STEP +(1); STEP(2); STEP(3); STEP(4); + +128 + `STEP +(5); STEP(6); STEP(7); STEP(8); + +131 +k + = 9; k--; +L_ACF +[k] <<= 1) ; + +136 ià( +sÿÏuto + > 0) { + +137 + `as£¹ +( +sÿÏuto + <= 4); + +138 +k + = 160; k--; * +s +++ <<ð +sÿÏuto +) ; + +140 + } +} + +142 #ià +defšed +( +USE_FLOAT_MUL +è&& defšed( +FAST +) + +144 + $Fa¡_AutocÜ»ÏtiÚ + ( + +145 +wÜd + * +s +, + +146 +lÚgwÜd + * +L_ACF +) + +148 +k +, +i +; + +149 +f_L_ACF +[9]; + +150 +sÿË +; + +152 +s_f +[160]; + +153 * +sf + = +s_f +; + +155 +i + = 0; i < 160; ++iè +sf +[i] = +s +[i]; + +156 +k + = 0; k <= 8; k++) { + +157 +L_‹mp2 + = 0; + +158 * +sæ + = +sf + - +k +; + +159 +i + = +k +; i < 160; ++iè +L_‹mp2 + +ð +sf +[i] * +sæ +[i]; + +160 +f_L_ACF +[ +k +] = +L_‹mp2 +; + +162 +sÿË + = +MAX_LONGWORD + / +f_L_ACF +[0]; + +164 +k + = 0; k <= 8; k++) { + +165 +L_ACF +[ +k +] = +f_L_ACF +[k] * +sÿË +; + +167 + } +} + +172 + $ReæeùiÚ_cÛffic›Ás + ( + +173 +lÚgwÜd + * +L_ACF +, + +174 +wÜd + * +r + + +177 +i +, +m +, +n +; + +178 +wÜd + +‹mp +; + +179 +wÜd + +ACF +[9]; + +180 +wÜd + +P +[ 9]; + +181 +wÜd + +K +[ 9]; + +186 ià( +L_ACF +[0] == 0) { + +187 +i + = 8; i--; * +r +++ = 0) ; + +191 + `as£¹ +Ð +L_ACF +[0] != 0 ); + +192 +‹mp + = + `gsm_nÜm +Ð +L_ACF +[0] ); + +194 + `as£¹ +( +‹mp + >= 0 &&emp < 32); + +197 +i + = 0; i <ð8; i++è +ACF +[i] = + `SASR_L +Ð +L_ACF +[i] << +‹mp +, 16 ); + +202 +i + = 1; i <ð7; i++è +K +[ i ] = +ACF +[ i ]; + +203 +i + = 0; i <ð8; i++è +P +[ i ] = +ACF +[ i ]; + +207 +n + = 1;‚ <ð8;‚++, +r +++) { + +209 +‹mp + = +P +[1]; + +210 +‹mp + = + `GSM_ABS +(temp); + +211 ià( +P +[0] < +‹mp +) { + +212 +i + = +n +; i <ð8; i++è* +r +++ = 0; + +216 * +r + = + `gsm_div +Ð +‹mp +, +P +[0] ); + +218 + `as£¹ +(* +r + >= 0); + +219 ià( +P +[1] > 0è* +r + = -*r; + +220 + `as£¹ + (* +r + !ð +MIN_WORD +); + +221 ià( +n + == 8) ; + +225 +‹mp + = + `GSM_MULT_R +Ð +P +[1], * +r + ); + +226 +P +[0] = + `GSM_ADD +ÐP[0], +‹mp + ); + +228 +m + = 1; m <ð8 - +n +; m++) { + +229 +‹mp + = + `GSM_MULT_R +Ð +K +[ +m + ], * +r + ); + +230 +P +[ +m +] = + `GSM_ADD +ÐP[ m+1 ], +‹mp + ); + +232 +‹mp + = + `GSM_MULT_R +Ð +P +[ +m ++1 ], * +r + ); + +233 +K +[ +m +] = + `GSM_ADD +ÐK[ m ], +‹mp + ); + +236 + } +} + +240 + $T¿nsfÜm©iÚ_to_Log_A»a_R©ios + ( + +241 +wÜd + * +r + + +251 +wÜd + +‹mp +; + +252 +i +; + +257 +i + = 1; i <ð8; i++, +r +++) { + +259 +‹mp + = * +r +; + +260 +‹mp + = + `GSM_ABS +(temp); + +261 + `as£¹ +( +‹mp + >= 0); + +263 ià( +‹mp + < 22118) { + +264 +‹mp + >>= 1; + +265 } ià( +‹mp + < 31130) { + +266 + `as£¹ +Ð +‹mp + >= 11059 ); + +267 +‹mp + -= 11059; + +269 + `as£¹ +Ð +‹mp + >= 26112 ); + +270 +‹mp + -= 26112; + +271 +‹mp + <<= 2; + +274 * +r + = *¸< 0 ? - +‹mp + :emp; + +275 + `as£¹ +Ð* +r + !ð +MIN_WORD + ); + +277 + } +} + +281 + $Quªtiz©iÚ_ªd_codšg + ( + +282 +wÜd + * +LAR + + +285 +wÜd + +‹mp +; + +296 #undeà +STEP + + +297 + #STEP +Ð +A +, +B +, +MAC +, +MIC + ) \ + +298 +‹mp + = + `GSM_MULT +Ð +A +, * +LAR + ); \ + +299 +‹mp + = + `GSM_ADD +Ћmp, +B + ); \ + +300 +‹mp + = + `GSM_ADD +(emp, 256 ); \ + +301 +‹mp + = + `SASR_W +(emp, 9 ); \ + +302 * +LAR + = +‹mp +> +MAC + ? MAC - +MIC + : (temp<MIC ? 0 :emp - MIC); \ + +303 +LAR +++; + + ) + +305 + `STEP +( 20480, 0, 31, -32 ); + +306 + `STEP +( 20480, 0, 31, -32 ); + +307 + `STEP +( 20480, 2048, 15, -16 ); + +308 + `STEP +( 20480, -2560, 15, -16 ); + +310 + `STEP +( 13964, 94, 7, -8 ); + +311 + `STEP +( 15360, -1792, 7, -8 ); + +312 + `STEP +( 8534, -341, 3, -4 ); + +313 + `STEP +( 9036, -1144, 3, -4 ); + +315 #undeà +STEP + + +316 + } +} + +318 + $Gsm_LPC_AÇlysis + ( + +319 +gsm_¡©e + * +S +, + +320 +wÜd + * +s +, + +321 +wÜd + * +LARc +) + +323 +lÚgwÜd + +L_ACF +[9]; + +325 #ià + `defšed +( +USE_FLOAT_MUL +è&& defšed( +FAST +) + +326 ià( +S +-> +ç¡ +è + `Fa¡_AutocÜ»ÏtiÚ + ( +s +, +L_ACF + ); + +329 + `AutocÜ»ÏtiÚ + ( +s +, +L_ACF + ); + +330 + `ReæeùiÚ_cÛffic›Ás + ( +L_ACF +, +LARc + ); + +331 + `T¿nsfÜm©iÚ_to_Log_A»a_R©ios + ( +LARc +); + +332 + `Quªtiz©iÚ_ªd_codšg + ( +LARc +); + +333 + } +} + + @preprocess.c + +7 + ~<¡dio.h +> + +8 + ~<as£¹.h +> + +10 + ~"gsm610_´iv.h +" + +12 + ~"gsm.h +" + +31 + $Gsm_P»´oûss + ( + +32 +gsm_¡©e + * +S +, + +33 +wÜd + * +s +, + +34 +wÜd + * +so + ) + +37 +wÜd + +z1 + = +S +->z1; + +38 +lÚgwÜd + +L_z2 + = +S +->L_z2; + +39 +wÜd + +mp + = +S +->mp; + +41 +wÜd + +s1 +; + +42 +lÚgwÜd + +L_s2 +; + +44 +lÚgwÜd + +L_‹mp +; + +46 +wÜd + +m¥ +, +l¥ +; + +47 +wÜd + +SO +; + +49 +k + = 160; + +51 +k +--) { + +55 +SO + = + `SASR_W +Ð* +s +, 3 ) << 2; + +56 +s +++; + +58 + `as£¹ + ( +SO + >= -0x4000); + +59 + `as£¹ + ( +SO + <= 0x3FFC); + +72 +s1 + = +SO + - +z1 +; + +73 +z1 + = +SO +; + +75 + `as£¹ +( +s1 + !ð +MIN_WORD +); + +79 +L_s2 + = +s1 +; + +80 +L_s2 + <<= 15; + +85 +m¥ + = + `SASR_L +Ð +L_z2 +, 15 ); + +86 +l¥ + = +L_z2 +-(( +lÚgwÜd +) +m¥ +<<15); + +88 +L_s2 + +ð + `GSM_MULT_R +Ð +l¥ +, 32735 ); + +89 +L_‹mp + = ( +lÚgwÜd +) +m¥ + * 32735; + +90 +L_z2 + = + `GSM_L_ADD +Ð +L_‹mp +, +L_s2 + ); + +94 +L_‹mp + = + `GSM_L_ADD +Ð +L_z2 +, 16384 ); + +99 +m¥ + = + `GSM_MULT_R +Ð +mp +, -28180 ); + +100 +mp + = + `SASR_L +Ð +L_‹mp +, 15 ); + +101 * +so +++ = + `GSM_ADD +Ð +mp +, +m¥ + ); + +104 +S +-> +z1 + = z1; + +105 +S +-> +L_z2 + = L_z2; + +106 +S +-> +mp + = mp; + +107 + } +} + + @rpe.c + +7 + ~<¡dio.h +> + +8 + ~<as£¹.h +> + +10 + ~"gsm610_´iv.h +" + +12 + ~"gsm.h +" + +19 + $Weightšg_fž‹r + ( + +20 +wÜd + * +e +, + +21 +wÜd + * +x + + +32 +lÚgwÜd + +L_»suÉ +; + +33 +k + ; + +45 +e + -= 5; + +49 +k + = 0; k <= 39; k++) { + +51 +L_»suÉ + = 8192 >> 1; + +59 #undeà +STEP + + +60 + #STEP +Ð +i +, +H + ) ( +e +[ +k + + i ] * ( +lÚgwÜd +)H) + + ) + +67 #ifdef +STUPID_COMPILER + + +68 +L_»suÉ + +ð + `STEP +( 0, -134 ) ; + +69 +L_»suÉ + +ð + `STEP +( 1, -374 ) ; + +71 +L_»suÉ + +ð + `STEP +( 3, 2054 ) ; + +72 +L_»suÉ + +ð + `STEP +( 4, 5741 ) ; + +73 +L_»suÉ + +ð + `STEP +( 5, 8192 ) ; + +74 +L_»suÉ + +ð + `STEP +( 6, 5741 ) ; + +75 +L_»suÉ + +ð + `STEP +( 7, 2054 ) ; + +77 +L_»suÉ + +ð + `STEP +( 9, -374 ) ; + +78 +L_»suÉ + +ð + `STEP +( 10, -134 ) ; + +80 +L_»suÉ + += + +81 + `STEP +( 0, -134 ) + +82 + + `STEP +( 1, -374 ) + +84 + + `STEP +( 3, 2054 ) + +85 + + `STEP +( 4, 5741 ) + +86 + + `STEP +( 5, 8192 ) + +87 + + `STEP +( 6, 5741 ) + +88 + + `STEP +( 7, 2054 ) + +90 + + `STEP +( 9, -374 ) + +91 + + `STEP +(10, -134 ) + +105 +L_»suÉ + = + `SASR_L +( L_result, 13 ); + +106 +x +[ +k +] = ( +L_»suÉ + < +MIN_WORD + ? MIN_WORD + +107 : ( +L_»suÉ + > +MAX_WORD + ? MAX_WORD : L_result )); + +109 + } +} + +113 + $RPE_grid_£ËùiÚ + ( + +114 +wÜd + * +x +, + +115 +wÜd + * +xM +, + +116 +wÜd + * +Mc_out + + +124 +i +; + +125 +lÚgwÜd + +L_»suÉ +, +L_‹mp +; + +126 +lÚgwÜd + +EM +; + +127 +wÜd + +Mc +; + +129 +lÚgwÜd + +L_commÚ_0_3 +; + +131 +EM + = 0; + +132 +Mc + = 0; + +155 #undeà +STEP + + +156 + #STEP +Ð +m +, +i + ) +L_‹mp + = + `SASR_W +Ð +x +[m + 3 * i], 2 ); \ + +157 +L_»suÉ + +ð +L_‹mp + * L_‹mp; + + ) + +161 +L_»suÉ + = 0; + +162 + `STEP +( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 ); + +163 + `STEP +( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 ); + +164 + `STEP +( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12); + +165 +L_commÚ_0_3 + = +L_»suÉ +; + +169 + `STEP +( 0, 0 ); + +170 +L_»suÉ + <<= 1; + +171 +EM + = +L_»suÉ +; + +175 +L_»suÉ + = 0; + +176 + `STEP +( 1, 0 ); + +177 + `STEP +( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 ); + +178 + `STEP +( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 ); + +179 + `STEP +( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12); + +180 +L_»suÉ + <<= 1; + +181 ià( +L_»suÉ + > +EM +) { + +182 +Mc + = 1; + +183 +EM + = +L_»suÉ +; + +188 +L_»suÉ + = 0; + +189 + `STEP +( 2, 0 ); + +190 + `STEP +( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 ); + +191 + `STEP +( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 ); + +192 + `STEP +( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12); + +193 +L_»suÉ + <<= 1; + +194 ià( +L_»suÉ + > +EM +) { + +195 +Mc + = 2; + +196 +EM + = +L_»suÉ +; + +201 +L_»suÉ + = +L_commÚ_0_3 +; + +202 + `STEP +( 3, 12 ); + +203 +L_»suÉ + <<= 1; + +204 ià( +L_»suÉ + > +EM +) { + +205 +Mc + = 3; + +206 +EM + = +L_»suÉ +; + +214 +i + = 0; i <ð12; i ++è +xM +[i] = +x +[ +Mc + + 3*i]; + +215 * +Mc_out + = +Mc +; + +216 + } +} + +220 + $APCM_quªtiz©iÚ_xmaxc_to_exp_mªt + ( + +221 +wÜd + +xmaxc +, + +222 +wÜd + * +expÚ_out +, + +223 +wÜd + * +mªt_out + ) + +225 +wÜd + +expÚ +, +mªt +; + +230 +expÚ + = 0; + +231 ià( +xmaxc + > 15è +expÚ + = + `SASR_W +(xmaxc, 3) - 1; + +232 +mªt + = +xmaxc + - ( +expÚ + << 3); + +234 ià( +mªt + == 0) { + +235 +expÚ + = -4; + +236 +mªt + = 7; + +239 +mªt + <= 7) { + +240 +mªt + = mant << 1 | 1; + +241 +expÚ +--; + +243 +mªt + -= 8; + +246 + `as£¹ +Ð +expÚ + >= -4 &&ƒxpon <= 6 ); + +247 + `as£¹ +Ð +mªt + >= 0 && mant <= 7 ); + +249 * +expÚ_out + = +expÚ +; + +250 * +mªt_out + = +mªt +; + +251 + } +} + +253 + $APCM_quªtiz©iÚ + ( + +254 +wÜd + * +xM +, + +255 +wÜd + * +xMc +, + +256 +wÜd + * +mªt_out +, + +257 +wÜd + * +expÚ_out +, + +258 +wÜd + * +xmaxc_out + + +261 +i +, +™e¡ +; + +263 +wÜd + +xmax +, +xmaxc +, +‹mp +, +‹mp1 +, +‹mp2 +; + +264 +wÜd + +expÚ +, +mªt +; + +270 +xmax + = 0; + +271 +i + = 0; i <= 12; i++) { + +272 +‹mp + = +xM +[ +i +]; + +273 +‹mp + = + `GSM_ABS +(temp); + +274 ià( +‹mp + > +xmax +) xmax =emp; + +280 +expÚ + = 0; + +281 +‹mp + = + `SASR_W +Ð +xmax +, 9 ); + +282 +™e¡ + = 0; + +284 +i + = 0; i <= 5; i++) { + +286 +™e¡ + |ð( +‹mp + <= 0); + +287 +‹mp + = + `SASR_W +(emp, 1 ); + +289 + `as£¹ +( +expÚ + <= 5); + +290 ià( +™e¡ + =ð0è +expÚ +++; + +293 + `as£¹ +( +expÚ + <= 6 &&ƒxpon >= 0); + +294 +‹mp + = +expÚ + + 5; + +296 + `as£¹ +( +‹mp + <= 11 &&emp >= 0); + +297 +xmaxc + = + `gsm_add +Ð + `SASR_W +( +xmax +, +‹mp +), ( +wÜd +è( +expÚ + << 3) ); + +303 + `APCM_quªtiz©iÚ_xmaxc_to_exp_mªt +Ð +xmaxc +, & +expÚ +, & +mªt + ); + +319 + `as£¹ +Ð +expÚ + <= 4096 &&ƒxpon >= -4096); + +320 + `as£¹ +Ð +mªt + >= 0 && mant <= 7 ); + +322 +‹mp1 + = 6 - +expÚ +; + +323 +‹mp2 + = +gsm_NRFAC +[ +mªt + ]; + +325 +i + = 0; i <= 12; i++) { + +327 + `as£¹ +( +‹mp1 + >= 0 &&emp1 < 16); + +329 +‹mp + = +xM +[ +i +] << +‹mp1 +; + +330 +‹mp + = + `GSM_MULT +Ћmp, +‹mp2 + ); + +331 +‹mp + = + `SASR_W +(temp, 12); + +332 +xMc +[ +i +] = +‹mp + + 4; + +338 * +mªt_out + = +mªt +; + +339 * +expÚ_out + = +expÚ +; + +340 * +xmaxc_out + = +xmaxc +; + +341 + } +} + +345 + $APCM_šv”£_quªtiz©iÚ + ( + +346 +wÜd + * +xMc +, + +347 +wÜd + +mªt +, + +348 +wÜd + +expÚ +, + +349 +wÜd + * +xMp +) + +356 +i +; + +357 +wÜd + +‹mp +, +‹mp1 +, +‹mp2 +, +‹mp3 +; + +359 + `as£¹ +Ð +mªt + >= 0 && mant <= 7 ); + +361 +‹mp1 + = +gsm_FAC +[ +mªt + ]; + +362 +‹mp2 + = + `gsm_sub +Ð6, +expÚ + ); + +363 +‹mp3 + = + `gsm_a¦ +Ð1, + `gsm_sub +Ð +‹mp2 +, 1 )); + +365 +i + = 13; i--;) { + +367 + `as£¹ +Ð* +xMc + <= 7 && *xMc >= 0 ); + +370 +‹mp + = (* +xMc +++ << 1) - 7; + +371 + `as£¹ +Ð +‹mp + <= 7 &&emp >= -7 ); + +373 +‹mp + <<= 12; + +374 +‹mp + = + `GSM_MULT_R +Ð +‹mp1 +,emp ); + +375 +‹mp + = + `GSM_ADD +Ћmp, +‹mp3 + ); + +376 * +xMp +++ = + `gsm_a¤ +Ð +‹mp +, +‹mp2 + ); + +378 + } +} + +382 + $RPE_grid_pos™iÚšg + ( + +383 +wÜd + +Mc +, + +384 +wÜd + * +xMp +, + +385 +wÜd + * +• + + +395 +i + = 13; + +397 + `as£¹ +(0 <ð +Mc + && Mc <= 3); + +399 +Mc +) { + +400 3: * +• +++ = 0; + +402 * +• +++ = 0; + +403 1: * +• +++ = 0; + +404 0: * +• +++ = * +xMp +++; + +405 } -- +i +); + +407 ++ +Mc + < 4è* +• +++ = 0; + +417 + } +} + +429 + $Gsm_Upd©e_of_»cÚ¡ruùed_shÜt_time_»sidu®_sigÇl + ( + +430 +wÜd + * +dµ +, + +431 +wÜd + * +• +, + +432 +wÜd + * +dp +) + +434 +k +; + +436 +k + = 0; k <= 79; k++) + +437 +dp +[ -120 + +k + ] = dp[ -80 + k ]; + +439 +k + = 0; k <= 39; k++) + +440 +dp +[ -40 + +k + ] = + `gsm_add +Ð +• +[k], +dµ +[k] ); + +441 + } +} + +444 + $Gsm_RPE_Encodšg + ( + +447 +wÜd + * +e +, + +448 +wÜd + * +xmaxc +, + +449 +wÜd + * +Mc +, + +450 +wÜd + * +xMc +) + +452 +wÜd + +x +[40]; + +453 +wÜd + +xM +[13], +xMp +[13]; + +454 +wÜd + +mªt +, +expÚ +; + +456 + `Weightšg_fž‹r +( +e +, +x +); + +457 + `RPE_grid_£ËùiÚ +( +x +, +xM +, +Mc +); + +459 + `APCM_quªtiz©iÚ +Ð +xM +, +xMc +, & +mªt +, & +expÚ +, +xmaxc +); + +460 + `APCM_šv”£_quªtiz©iÚ +Ð +xMc +, +mªt +, +expÚ +, +xMp +); + +462 + `RPE_grid_pos™iÚšg +Ð* +Mc +, +xMp +, +e + ); + +464 + } +} + +466 + $Gsm_RPE_Decodšg + ( + +469 +wÜd + +xmaxü +, + +470 +wÜd + +Mü +, + +471 +wÜd + * +xMü +, + +472 +wÜd + * +”p + + +475 +wÜd + +expÚ +, +mªt +; + +476 +wÜd + +xMp +[ 13 ]; + +478 + `APCM_quªtiz©iÚ_xmaxc_to_exp_mªt +Ð +xmaxü +, & +expÚ +, & +mªt + ); + +479 + `APCM_šv”£_quªtiz©iÚ +Ð +xMü +, +mªt +, +expÚ +, +xMp + ); + +480 + `RPE_grid_pos™iÚšg +Ð +Mü +, +xMp +, +”p + ); + +482 + } +} + + @short_term.c + +7 + ~<¡dio.h +> + +8 + ~<as£¹.h +> + +10 + ~"gsm610_´iv.h +" + +12 + ~"gsm.h +" + +20 + $Decodšg_of_the_coded_Log_A»a_R©ios + ( + +21 +wÜd + * +LARc +, + +22 +wÜd + * +LARµ +) + +24 +wÜd + +‹mp1 + ; + +49 #undeà +STEP + + +50 + #STEP +Ð +B +, +MIC +, +INVA + ) \ + +51 +‹mp1 + = + `GSM_ADD +Ð* +LARc +++, +MIC + ) << 10; \ + +52 +‹mp1 + = + `GSM_SUB +Ћmp1, +B + << 1 ); \ + +53 +‹mp1 + = + `GSM_MULT_R +Ð +INVA +,emp1 ); \ + +54 * +LARµ +++ = + `GSM_ADD +Ð +‹mp1 +,emp1 ); + + ) + +56 + `STEP +( 0, -32, 13107 ); + +57 + `STEP +( 0, -32, 13107 ); + +58 + `STEP +( 2048, -16, 13107 ); + +59 + `STEP +( -2560, -16, 13107 ); + +61 + `STEP +( 94, -8, 19223 ); + +62 + `STEP +( -1792, -8, 17476 ); + +63 + `STEP +( -341, -4, 31454 ); + +64 + `STEP +( -1144, -4, 29708 ); + +69 + } +} + +87 + $CÛffic›Ás_0_12 + ( + +88 +wÜd + * +LARµ_j_1 +, + +89 +wÜd + * +LARµ_j +, + +90 +wÜd + * +LARp +) + +92 +i +; + +94 +i + = 1; i <ð8; i++, +LARp +++, +LARµ_j_1 +++, +LARµ_j +++) { + +95 * +LARp + = + `GSM_ADD +Ð + `SASR_W +Ð* +LARµ_j_1 +, 2 ), SASR_WÐ* +LARµ_j +, 2 )); + +96 * +LARp + = + `GSM_ADD +Ð*LARp, + `SASR_W +Ð* +LARµ_j_1 +, 1)); + +98 + } +} + +100 + $CÛffic›Ás_13_26 + ( + +101 +wÜd + * +LARµ_j_1 +, + +102 +wÜd + * +LARµ_j +, + +103 +wÜd + * +LARp +) + +105 +i +; + +106 +i + = 1; i <ð8; i++, +LARµ_j_1 +++, +LARµ_j +++, +LARp +++) { + +107 * +LARp + = + `GSM_ADD +Ð + `SASR_W +Ð* +LARµ_j_1 +, 1), SASR_WÐ* +LARµ_j +, 1 )); + +109 + } +} + +111 + $CÛffic›Ás_27_39 + ( + +112 +wÜd + * +LARµ_j_1 +, + +113 +wÜd + * +LARµ_j +, + +114 +wÜd + * +LARp +) + +116 +i +; + +118 +i + = 1; i <ð8; i++, +LARµ_j_1 +++, +LARµ_j +++, +LARp +++) { + +119 * +LARp + = + `GSM_ADD +Ð + `SASR_W +Ð* +LARµ_j_1 +, 2 ), SASR_WÐ* +LARµ_j +, 2 )); + +120 * +LARp + = + `GSM_ADD +Ð*LARp, + `SASR_W +Ð* +LARµ_j +, 1 )); + +122 + } +} + +125 + $CÛffic›Ás_40_159 + ( + +126 +wÜd + * +LARµ_j +, + +127 +wÜd + * +LARp +) + +129 +i +; + +131 +i + = 1; i <ð8; i++, +LARp +++, +LARµ_j +++) + +132 * +LARp + = * +LARµ_j +; + +133 + } +} + +137 + $LARp_to_½ + ( + +138 +wÜd + * +LARp +) + +145 +i +; + +146 +wÜd + +‹mp +; + +148 +i + = 1; i <ð8; i++, +LARp +++) { + +159 ià(* +LARp + < 0) { + +160 +‹mp + = * +LARp + =ð +MIN_WORD + ? +MAX_WORD + : -(*LARp); + +161 * +LARp + = - (( +‹mp + < 11059) ?emp << 1 + +162 : (( +‹mp + < 20070) ?emp + 11059 + +163 : + `GSM_ADD +Ð( +wÜd +è( +‹mp + >> 2), (word) 26112 ))); + +165 +‹mp + = * +LARp +; + +166 * +LARp + = ( +‹mp + < 11059) ?emp << 1 + +167 : (( +‹mp + < 20070) ?emp + 11059 + +168 : + `GSM_ADD +Ð( +wÜd +è( +‹mp + >> 2), (word) 26112 )); + +171 + } +} + +175 + $ShÜt_‹rm_ª®ysis_fž‹ršg + ( + +176 +gsm_¡©e + * +S +, + +177 +wÜd + * +½ +, + +178 +k_n +, + +179 +wÜd + * +s + + +192 +wÜd + * +u + = +S +->u; + +193 +i +; + +194 +wÜd + +di +, +zzz +, +ui +, +§v +, +½i +; + +196 ; +k_n +--; +s +++) { + +198 +di + = +§v + = * +s +; + +200 +i + = 0; i < 8; i++) { + +202 +ui + = +u +[ +i +]; + +203 +½i + = +½ +[ +i +]; + +204 +u +[ +i +] = +§v +; + +206 +zzz + = + `GSM_MULT_R +( +½i +, +di +); + +207 +§v + = + `GSM_ADD +Ð +ui +, +zzz +); + +209 +zzz + = + `GSM_MULT_R +( +½i +, +ui +); + +210 +di + = + `GSM_ADD +Ðdi, +zzz + ); + +213 * +s + = +di +; + +215 + } +} + +217 #ià +defšed +( +USE_FLOAT_MUL +è&& defšed( +FAST +) + +219 + $Fa¡_ShÜt_‹rm_ª®ysis_fž‹ršg + ( + +220 +gsm_¡©e + * +S +, + +221 +wÜd + * +½ +, + +222 +k_n +, + +223 +wÜd + * +s + + +226 +wÜd + * +u + = +S +->u; + +227 +i +; + +229 +uf +[8], + +230 +½f +[8]; + +232 +sÿËf + = 3.0517578125e-5; + +233 +§v +, +di +, +‹mp +; + +235 +i + = 0; i < 8; ++i) { + +236 +uf +[ +i +] = +u +[i]; + +237 +½f +[ +i +] = +½ +[i] * +sÿËf +; + +239 ; +k_n +--; +s +++) { + +240 +§v + = +di + = * +s +; + +241 +i + = 0; i < 8; ++i) { + +242 +½fi + = +½f +[ +i +]; + +243 +ufi + = +uf +[ +i +]; + +245 +uf +[ +i +] = +§v +; + +246 +‹mp + = +½fi + * +di + + +ufi +; + +247 +di + +ð +½fi + * +ufi +; + +248 +§v + = +‹mp +; + +250 * +s + = +di +; + +252 +i + = 0; i < 8; ++iè +u +[i] = +uf +[i]; + +253 + } +} + +256 + $ShÜt_‹rm_syÁhesis_fž‹ršg + ( + +257 +gsm_¡©e + * +S +, + +258 +wÜd + * +¼p +, + +259 +k +, + +260 +wÜd + * +wt +, + +261 +wÜd + * +¤ + + +264 +wÜd + * +v + = +S +->v; + +265 +i +; + +266 +wÜd + +¤i +, +tmp1 +, +tmp2 +; + +268 +k +--) { + +269 +¤i + = * +wt +++; + +270 +i + = 8; i--;) { + +274 +tmp1 + = +¼p +[ +i +]; + +275 +tmp2 + = +v +[ +i +]; + +276 +tmp2 + = ( +tmp1 + =ð +MIN_WORD + &&mp2 == MIN_WORD + +277 ? +MAX_WORD + + +278 : 0x0FFFF & (Ð( +lÚgwÜd +) +tmp1 + * (lÚgwÜd) +tmp2 + + +281 +¤i + = + `GSM_SUB +Фi, +tmp2 + ); + +285 +tmp1 + = (mp1 =ð +MIN_WORD + && +¤i + == MIN_WORD + +286 ? +MAX_WORD + + +287 : 0x0FFFF & (Ð( +lÚgwÜd +) +tmp1 + * (lÚgwÜd) +¤i + + +290 +v +[ +i ++1] = + `GSM_ADD +Ðv[i], +tmp1 +); + +292 * +¤ +++ = +v +[0] = +¤i +; + +294 + } +} + +297 #ià +defšed +( +FAST +è&& defšed( +USE_FLOAT_MUL +) + +299 + $Fa¡_ShÜt_‹rm_syÁhesis_fž‹ršg + ( + +300 +gsm_¡©e + * +S +, + +301 +wÜd + * +¼p +, + +302 +k +, + +303 +wÜd + * +wt +, + +304 +wÜd + * +¤ + + +307 +wÜd + * +v + = +S +->v; + +308 +i +; + +310 +va +[9], +¼· +[8]; + +311 +sÿËf + = 3.0517578125e-5, +‹mp +; + +313 +i + = 0; i < 8; ++i) { + +314 +va +[ +i +] = +v +[i]; + +315 +¼· +[ +i +] = () +¼p +[i] * +sÿËf +; + +317 +k +--) { + +318 +¤i + = * +wt +++; + +319 +i + = 8; i--;) { + +320 +¤i + -ð +¼· +[ +i +] * +va +[i]; + +321 ià( +¤i + < -32768.) sri = -32768.; + +322 ià( +¤i + > 32767.) sri = 32767.; + +324 +‹mp + = +va +[ +i +] + +¼· +[i] * +¤i +; + +325 ià( +‹mp + < -32768.)emp = -32768.; + +326 ià( +‹mp + > 32767.)emp = 32767.; + +327 +va +[ +i ++1] = +‹mp +; + +329 * +¤ +++ = +va +[0] = +¤i +; + +331 +i + = 0; i < 9; ++iè +v +[i] = +va +[i]; + +332 + } +} + +336 + $Gsm_ShÜt_T”m_AÇlysis_Fž‹r + ( + +338 +gsm_¡©e + * +S +, + +340 +wÜd + * +LARc +, + +341 +wÜd + * +s + + +344 +wÜd + * +LARµ_j + = +S +-> +LARµ +[ S-> +j + ]; + +345 +wÜd + * +LARµ_j_1 + = +S +-> +LARµ +[ S-> +j + ^= 1 ]; + +347 +wÜd + +LARp +[8]; + +349 #undeà +FILTER + + +350 #ià + `defšed +( +FAST +è&& defšed( +USE_FLOAT_MUL +) + +351 + #FILTER + (* ( +S +-> +ç¡ + \ + +352 ? +Fa¡_ShÜt_‹rm_ª®ysis_fž‹ršg + \ + +353 : +ShÜt_‹rm_ª®ysis_fž‹ršg + )) + + ) + +356 + #FILTER + +ShÜt_‹rm_ª®ysis_fž‹ršg + + + ) + +359 + `Decodšg_of_the_coded_Log_A»a_R©ios +Ð +LARc +, +LARµ_j + ); + +361 + `CÛffic›Ás_0_12 +Ð +LARµ_j_1 +, +LARµ_j +, +LARp + ); + +362 + `LARp_to_½ +Ð +LARp + ); + +363 + `FILTER +Ð +S +, +LARp +, 13, +s +); + +365 + `CÛffic›Ás_13_26 +Ð +LARµ_j_1 +, +LARµ_j +, +LARp +); + +366 + `LARp_to_½ +Ð +LARp + ); + +367 + `FILTER +Ð +S +, +LARp +, 14, +s + + 13); + +369 + `CÛffic›Ás_27_39 +Ð +LARµ_j_1 +, +LARµ_j +, +LARp +); + +370 + `LARp_to_½ +Ð +LARp + ); + +371 + `FILTER +Ð +S +, +LARp +, 13, +s + + 27); + +373 + `CÛffic›Ás_40_159 +Ð +LARµ_j +, +LARp +); + +374 + `LARp_to_½ +Ð +LARp + ); + +375 + `FILTER +Ð +S +, +LARp +, 120, +s + + 40); + +376 + } +} + +378 + $Gsm_ShÜt_T”m_SyÁhesis_Fž‹r + ( + +379 +gsm_¡©e + * +S +, + +381 +wÜd + * +LARü +, + +382 +wÜd + * +wt +, + +384 +wÜd + * +s + + +387 +wÜd + * +LARµ_j + = +S +-> +LARµ +[ S-> +j + ]; + +388 +wÜd + * +LARµ_j_1 + = +S +-> +LARµ +[ S-> +j + ^=1 ]; + +390 +wÜd + +LARp +[8]; + +392 #undeà +FILTER + + +393 #ià + `defšed +( +FAST +è&& defšed( +USE_FLOAT_MUL +) + +395 + #FILTER + (* ( +S +-> +ç¡ + \ + +396 ? +Fa¡_ShÜt_‹rm_syÁhesis_fž‹ršg + \ + +397 : +ShÜt_‹rm_syÁhesis_fž‹ršg + )) + + ) + +399 + #FILTER + +ShÜt_‹rm_syÁhesis_fž‹ršg + + + ) + +402 + `Decodšg_of_the_coded_Log_A»a_R©ios +Ð +LARü +, +LARµ_j + ); + +404 + `CÛffic›Ás_0_12 +Ð +LARµ_j_1 +, +LARµ_j +, +LARp + ); + +405 + `LARp_to_½ +Ð +LARp + ); + +406 + `FILTER +Ð +S +, +LARp +, 13, +wt +, +s + ); + +408 + `CÛffic›Ás_13_26 +Ð +LARµ_j_1 +, +LARµ_j +, +LARp +); + +409 + `LARp_to_½ +Ð +LARp + ); + +410 + `FILTER +Ð +S +, +LARp +, 14, +wt + + 13, +s + + 13 ); + +412 + `CÛffic›Ás_27_39 +Ð +LARµ_j_1 +, +LARµ_j +, +LARp +); + +413 + `LARp_to_½ +Ð +LARp + ); + +414 + `FILTER +Ð +S +, +LARp +, 13, +wt + + 27, +s + + 27 ); + +416 + `CÛffic›Ás_40_159 +Ð +LARµ_j +, +LARp + ); + +417 + `LARp_to_½ +Ð +LARp + ); + +418 + `FILTER +( +S +, +LARp +, 120, +wt + + 40, +s + + 40); + +419 + } +} + + @table.c + +16 + #GSM_TABLE_C + + + ) + +17 + ~"gsm610_´iv.h +" + +18 + ~"gsm.h +" + +23 +wÜd + + ggsm_A +[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036}; + +24 +wÜd + + ggsm_B +[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144}; + +25 +wÜd + + ggsm_MIC +[8] = { -32, -32, -16, -16, -8, -8, -4, -4 }; + +26 +wÜd + + ggsm_MAC +[8] = { 31, 31, 15, 15, 7, 7, 3, 3 }; + +31 +wÜd + + ggsm_INVA +[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 }; + +37 +wÜd + + ggsm_DLB +[4] = { 6554, 16384, 26214, 32767 }; + +43 +wÜd + + ggsm_QLB +[4] = { 3277, 11469, 21299, 32767 }; + +49 +wÜd + + ggsm_H +[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 }; + +55 +wÜd + + ggsm_NRFAC +[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; + +61 +wÜd + + ggsm_FAC +[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; + + @ +1 +. +0 +17 +175 +add.c +code.c +config.h +decode.c +gsm.h +gsm610_priv.h +gsm_create.c +gsm_decode.c +gsm_destroy.c +gsm_encode.c +gsm_option.c +long_term.c +lpc.c +preprocess.c +rpe.c +short_term.c +table.c diff --git a/orkbasecxx/filters/gsm/gsm610/decode.c b/orkbasecxx/filters/gsm/gsm610/decode.c new file mode 100644 index 0000000..b4334ac --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/decode.c @@ -0,0 +1,67 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+
+#include "gsm610_priv.h"
+#include "gsm.h"
+
+/*
+ * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER
+ */
+
+static void Postprocessing (
+ struct gsm_state * S,
+ register word * s)
+{
+ register int k;
+ register word msr = S->msr;
+ register word tmp;
+
+ for (k = 160; k--; s++) {
+ tmp = GSM_MULT_R( msr, 28180 );
+ msr = GSM_ADD(*s, tmp); /* Deemphasis */
+ *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */
+ }
+ S->msr = msr;
+}
+
+void Gsm_Decoder (
+ struct gsm_state * S,
+
+ word * LARcr, /* [0..7] IN */
+
+ word * Ncr, /* [0..3] IN */
+ word * bcr, /* [0..3] IN */
+ word * Mcr, /* [0..3] IN */
+ word * xmaxcr, /* [0..3] IN */
+ word * xMcr, /* [0..13*4] IN */
+
+ word * s) /* [0..159] OUT */
+{
+ int j, k;
+ word erp[40], wt[160];
+ word * drp = S->dp0 + 120;
+
+ for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {
+
+ Gsm_RPE_Decoding( /*-S,-*/ *xmaxcr, *Mcr, xMcr, erp );
+ Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );
+
+ for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ];
+ }
+
+ Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );
+ Postprocessing(S, s);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 11ae5b90-2e8b-400b-ac64-a69a1fc6cc41
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm.h b/orkbasecxx/filters/gsm/gsm610/gsm.h new file mode 100644 index 0000000..e63bd64 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/gsm.h @@ -0,0 +1,58 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#ifndef GSM_H
+#define GSM_H
+
+#include <stdio.h> /* for FILE * */
+
+/*
+ * Interface
+ */
+
+typedef struct gsm_state * gsm;
+typedef short gsm_signal; /* signed 16 bit */
+typedef unsigned char gsm_byte;
+typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */
+
+#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */
+
+#define GSM_PATCHLEVEL 10
+#define GSM_MINOR 0
+#define GSM_MAJOR 1
+
+#define GSM_OPT_VERBOSE 1
+#define GSM_OPT_FAST 2
+#define GSM_OPT_LTP_CUT 3
+#define GSM_OPT_WAV49 4
+#define GSM_OPT_FRAME_INDEX 5
+#define GSM_OPT_FRAME_CHAIN 6
+
+gsm gsm_create (void);
+
+/* Added for libsndfile : May 6, 2002 */
+void gsm_init (gsm);
+
+void gsm_destroy (gsm);
+
+int gsm_print (FILE *, gsm, gsm_byte *);
+int gsm_option (gsm, int, int *);
+
+void gsm_encode (gsm, gsm_signal *, gsm_byte *);
+int gsm_decode (gsm, gsm_byte *, gsm_signal *);
+
+int gsm_explode (gsm, gsm_byte *, gsm_signal *);
+void gsm_implode (gsm, gsm_signal *, gsm_byte *);
+
+#endif /* GSM_H */
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 8cfc7698-5433-4b6f-aeca-967c6fda4dec
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm610_priv.h b/orkbasecxx/filters/gsm/gsm610/gsm610_priv.h new file mode 100644 index 0000000..fac74aa --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/gsm610_priv.h @@ -0,0 +1,304 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#ifndef PRIVATE_H
+#define PRIVATE_H
+
+/* Added by Erik de Castro Lopo */
+#define USE_FLOAT_MUL
+#define FAST
+#define WAV49
+/* Added by Erik de Castro Lopo */
+
+
+
+typedef short word; /* 16 bit signed int */
+typedef int longword; /* 32 bit signed int */
+
+typedef unsigned short uword; /* unsigned word */
+typedef unsigned int ulongword; /* unsigned longword */
+
+struct gsm_state
+{ word dp0[ 280 ] ;
+
+ word z1; /* preprocessing.c, Offset_com. */
+ longword L_z2; /* Offset_com. */
+ int mp; /* Preemphasis */
+
+ word u[8] ; /* short_term_aly_filter.c */
+ word LARpp[2][8] ; /* */
+ word j; /* */
+
+ word ltp_cut; /* long_term.c, LTP crosscorr. */
+ word nrp; /* 40 */ /* long_term.c, synthesis */
+ word v[9] ; /* short_term.c, synthesis */
+ word msr; /* decoder.c, Postprocessing */
+
+ char verbose; /* only used if !NDEBUG */
+ char fast; /* only used if FAST */
+
+ char wav_fmt; /* only used if WAV49 defined */
+ unsigned char frame_index; /* odd/even chaining */
+ unsigned char frame_chain; /* half-byte to carry forward */
+
+ /* Moved here from code.c where it was defined as static */
+ word e[50] ;
+} ;
+
+typedef struct gsm_state GSM_STATE ;
+
+#define MIN_WORD (-32767 - 1)
+#define MAX_WORD 32767
+
+#define MIN_LONGWORD (-2147483647 - 1)
+#define MAX_LONGWORD 2147483647
+
+/* Signed arithmetic shift right. */
+static inline word
+SASR_W (word x, word by)
+{ return (x >> by) ;
+} /* SASR */
+
+static inline longword
+SASR_L (longword x, word by)
+{ return (x >> by) ;
+} /* SASR */
+
+/*
+ * Prototypes from add.c
+ */
+word gsm_mult (word a, word b) ;
+longword gsm_L_mult (word a, word b) ;
+word gsm_mult_r (word a, word b) ;
+
+word gsm_div (word num, word denum) ;
+
+word gsm_add (word a, word b ) ;
+longword gsm_L_add (longword a, longword b ) ;
+
+word gsm_sub (word a, word b) ;
+longword gsm_L_sub (longword a, longword b) ;
+
+word gsm_abs (word a) ;
+
+word gsm_norm (longword a ) ;
+
+longword gsm_L_asl (longword a, int n) ;
+word gsm_asl (word a, int n) ;
+
+longword gsm_L_asr (longword a, int n) ;
+word gsm_asr (word a, int n) ;
+
+/*
+ * Inlined functions from add.h
+ */
+
+static inline longword
+GSM_MULT_R (word a, word b)
+{ return (((longword) (a)) * ((longword) (b)) + 16384) >> 15 ;
+} /* GSM_MULT_R */
+
+static inline longword
+GSM_MULT (word a, word b)
+{ return (((longword) (a)) * ((longword) (b))) >> 15 ;
+} /* GSM_MULT */
+
+static inline longword
+GSM_L_MULT (word a, word b)
+{ return ((longword) (a)) * ((longword) (b)) << 1 ;
+} /* GSM_L_MULT */
+
+static inline longword
+GSM_L_ADD (longword a, longword b)
+{ ulongword utmp ;
+
+ if (a < 0 && b < 0)
+ { utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1) ;
+ return (utmp >= (ulongword) MAX_LONGWORD) ? MIN_LONGWORD : -(longword)utmp-2 ;
+ } ;
+
+ if (a > 0 && b > 0)
+ { utmp = (ulongword) a + (ulongword) b ;
+ return (utmp >= (ulongword) MAX_LONGWORD) ? MAX_LONGWORD : utmp ;
+ } ;
+
+ return a + b ;
+} /* GSM_L_ADD */
+
+static inline longword
+GSM_ADD (word a, word b)
+{ longword ltmp ;
+
+ ltmp = ((longword) a) + ((longword) b) ;
+
+ if (ltmp >= MAX_WORD)
+ return MAX_WORD ;
+ if (ltmp <= MIN_WORD)
+ return MIN_WORD ;
+
+ return ltmp ;
+} /* GSM_ADD */
+
+static inline longword
+GSM_SUB (word a, word b)
+{ longword ltmp ;
+
+ ltmp = ((longword) a) - ((longword) b) ;
+
+ if (ltmp >= MAX_WORD)
+ ltmp = MAX_WORD ;
+ else if (ltmp <= MIN_WORD)
+ ltmp = MIN_WORD ;
+
+ return ltmp ;
+} /* GSM_SUB */
+
+static inline word
+GSM_ABS (word a)
+{
+ if (a > 0)
+ return a ;
+ if (a == MIN_WORD)
+ return MAX_WORD ;
+ return -a ;
+} /* GSM_ADD */
+
+
+/*
+ * More prototypes from implementations..
+ */
+void Gsm_Coder (
+ struct gsm_state * S,
+ word * s, /* [0..159] samples IN */
+ word * LARc, /* [0..7] LAR coefficients OUT */
+ word * Nc, /* [0..3] LTP lag OUT */
+ word * bc, /* [0..3] coded LTP gain OUT */
+ word * Mc, /* [0..3] RPE grid selection OUT */
+ word * xmaxc,/* [0..3] Coded maximum amplitude OUT */
+ word * xMc) ;/* [13*4] normalized RPE samples OUT */
+
+void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */
+ struct gsm_state * S,
+ word * d, /* [0..39] residual signal IN */
+ word * dp, /* [-120..-1] d' IN */
+ word * e, /* [0..40] OUT */
+ word * dpp, /* [0..40] OUT */
+ word * Nc, /* correlation lag OUT */
+ word * bc) ; /* gain factor OUT */
+
+void Gsm_LPC_Analysis (
+ struct gsm_state * S,
+ word * s, /* 0..159 signals IN/OUT */
+ word * LARc) ; /* 0..7 LARc's OUT */
+
+void Gsm_Preprocess (
+ struct gsm_state * S,
+ word * s, word * so) ;
+
+void Gsm_Encoding (
+ struct gsm_state * S,
+ word * e,
+ word * ep,
+ word * xmaxc,
+ word * Mc,
+ word * xMc) ;
+
+void Gsm_Short_Term_Analysis_Filter (
+ struct gsm_state * S,
+ word * LARc, /* coded log area ratio [0..7] IN */
+ word * d) ; /* st res. signal [0..159] IN/OUT */
+
+void Gsm_Decoder (
+ struct gsm_state * S,
+ word * LARcr, /* [0..7] IN */
+ word * Ncr, /* [0..3] IN */
+ word * bcr, /* [0..3] IN */
+ word * Mcr, /* [0..3] IN */
+ word * xmaxcr, /* [0..3] IN */
+ word * xMcr, /* [0..13*4] IN */
+ word * s) ; /* [0..159] OUT */
+
+void Gsm_Decoding (
+ struct gsm_state * S,
+ word xmaxcr,
+ word Mcr,
+ word * xMcr, /* [0..12] IN */
+ word * erp) ; /* [0..39] OUT */
+
+void Gsm_Long_Term_Synthesis_Filtering (
+ struct gsm_state* S,
+ word Ncr,
+ word bcr,
+ word * erp, /* [0..39] IN */
+ word * drp) ; /* [-120..-1] IN, [0..40] OUT */
+
+void Gsm_RPE_Decoding (
+ /*-struct gsm_state *S,-*/
+ word xmaxcr,
+ word Mcr,
+ word * xMcr, /* [0..12], 3 bits IN */
+ word * erp) ; /* [0..39] OUT */
+
+void Gsm_RPE_Encoding (
+ /*-struct gsm_state * S,-*/
+ word * e, /* -5..-1][0..39][40..44 IN/OUT */
+ word * xmaxc, /* OUT */
+ word * Mc, /* OUT */
+ word * xMc) ; /* [0..12] OUT */
+
+void Gsm_Short_Term_Synthesis_Filter (
+ struct gsm_state * S,
+ word * LARcr, /* log area ratios [0..7] IN */
+ word * drp, /* received d [0...39] IN */
+ word * s) ; /* signal s [0..159] OUT */
+
+void Gsm_Update_of_reconstructed_short_time_residual_signal (
+ word * dpp, /* [0...39] IN */
+ word * ep, /* [0...39] IN */
+ word * dp) ; /* [-120...-1] IN/OUT */
+
+/*
+ * Tables from table.c
+ */
+#ifndef GSM_TABLE_C
+
+extern word gsm_A [8], gsm_B [8], gsm_MIC [8], gsm_MAC [8] ;
+extern word gsm_INVA [8] ;
+extern word gsm_DLB [4], gsm_QLB [4] ;
+extern word gsm_H [11] ;
+extern word gsm_NRFAC [8] ;
+extern word gsm_FAC [8] ;
+
+#endif /* GSM_TABLE_C */
+
+/*
+ * Debugging
+ */
+#ifdef NDEBUG
+
+# define gsm_debug_words(a, b, c, d) /* nil */
+# define gsm_debug_longwords(a, b, c, d) /* nil */
+# define gsm_debug_word(a, b) /* nil */
+# define gsm_debug_longword(a, b) /* nil */
+
+#else /* !NDEBUG => DEBUG */
+
+ void gsm_debug_words (char * name, int, int, word *) ;
+ void gsm_debug_longwords (char * name, int, int, longword *) ;
+ void gsm_debug_longword (char * name, longword) ;
+ void gsm_debug_word (char * name, word) ;
+
+#endif /* !NDEBUG */
+
+#endif /* PRIVATE_H */
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 8bc5fdf2-e8c8-4686-9bd7-a30b512bef0c
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_create.c b/orkbasecxx/filters/gsm/gsm610/gsm_create.c new file mode 100644 index 0000000..f89be2f --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/gsm_create.c @@ -0,0 +1,44 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+#include "gsm.h"
+#include "gsm610_priv.h"
+
+gsm gsm_create (void)
+{
+ gsm r;
+
+ r = malloc (sizeof(struct gsm_state));
+ if (!r) return r;
+
+ memset((char *)r, 0, sizeof (struct gsm_state));
+ r->nrp = 40;
+
+ return r;
+}
+
+/* Added for libsndfile : May 6, 2002. Not sure if it works. */
+void gsm_init (gsm state)
+{
+ memset (state, 0, sizeof (struct gsm_state)) ;
+ state->nrp = 40 ;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 9fedb6b3-ed99-40c2-aac1-484c536261fe
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_decode.c b/orkbasecxx/filters/gsm/gsm610/gsm_decode.c new file mode 100644 index 0000000..9679c11 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/gsm_decode.c @@ -0,0 +1,366 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target)
+{
+ word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+#ifdef WAV49
+ if (s->wav_fmt) {
+
+ uword sr = 0;
+
+ s->frame_index = !s->frame_index;
+ if (s->frame_index) {
+
+ sr = *c++;
+ LARc[0] = sr & 0x3f; sr >>= 6;
+ sr |= (uword)*c++ << 2;
+ LARc[1] = sr & 0x3f; sr >>= 6;
+ sr |= (uword)*c++ << 4;
+ LARc[2] = sr & 0x1f; sr >>= 5;
+ LARc[3] = sr & 0x1f; sr >>= 5;
+ sr |= (uword)*c++ << 2;
+ LARc[4] = sr & 0xf; sr >>= 4;
+ LARc[5] = sr & 0xf; sr >>= 4;
+ sr |= (uword)*c++ << 2; /* 5 */
+ LARc[6] = sr & 0x7; sr >>= 3;
+ LARc[7] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 4;
+ Nc[0] = sr & 0x7f; sr >>= 7;
+ bc[0] = sr & 0x3; sr >>= 2;
+ Mc[0] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 1;
+ xmaxc[0] = sr & 0x3f; sr >>= 6;
+ xmc[0] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[1] = sr & 0x7; sr >>= 3;
+ xmc[2] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[3] = sr & 0x7; sr >>= 3;
+ xmc[4] = sr & 0x7; sr >>= 3;
+ xmc[5] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1; /* 10 */
+ xmc[6] = sr & 0x7; sr >>= 3;
+ xmc[7] = sr & 0x7; sr >>= 3;
+ xmc[8] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[9] = sr & 0x7; sr >>= 3;
+ xmc[10] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[11] = sr & 0x7; sr >>= 3;
+ xmc[12] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 4;
+ Nc[1] = sr & 0x7f; sr >>= 7;
+ bc[1] = sr & 0x3; sr >>= 2;
+ Mc[1] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 1;
+ xmaxc[1] = sr & 0x3f; sr >>= 6;
+ xmc[13] = sr & 0x7; sr >>= 3;
+ sr = *c++; /* 15 */
+ xmc[14] = sr & 0x7; sr >>= 3;
+ xmc[15] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[16] = sr & 0x7; sr >>= 3;
+ xmc[17] = sr & 0x7; sr >>= 3;
+ xmc[18] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[19] = sr & 0x7; sr >>= 3;
+ xmc[20] = sr & 0x7; sr >>= 3;
+ xmc[21] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[22] = sr & 0x7; sr >>= 3;
+ xmc[23] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[24] = sr & 0x7; sr >>= 3;
+ xmc[25] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 4; /* 20 */
+ Nc[2] = sr & 0x7f; sr >>= 7;
+ bc[2] = sr & 0x3; sr >>= 2;
+ Mc[2] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 1;
+ xmaxc[2] = sr & 0x3f; sr >>= 6;
+ xmc[26] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[27] = sr & 0x7; sr >>= 3;
+ xmc[28] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[29] = sr & 0x7; sr >>= 3;
+ xmc[30] = sr & 0x7; sr >>= 3;
+ xmc[31] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[32] = sr & 0x7; sr >>= 3;
+ xmc[33] = sr & 0x7; sr >>= 3;
+ xmc[34] = sr & 0x7; sr >>= 3;
+ sr = *c++; /* 25 */
+ xmc[35] = sr & 0x7; sr >>= 3;
+ xmc[36] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[37] = sr & 0x7; sr >>= 3;
+ xmc[38] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 4;
+ Nc[3] = sr & 0x7f; sr >>= 7;
+ bc[3] = sr & 0x3; sr >>= 2;
+ Mc[3] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 1;
+ xmaxc[3] = sr & 0x3f; sr >>= 6;
+ xmc[39] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[40] = sr & 0x7; sr >>= 3;
+ xmc[41] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2; /* 30 */
+ xmc[42] = sr & 0x7; sr >>= 3;
+ xmc[43] = sr & 0x7; sr >>= 3;
+ xmc[44] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[45] = sr & 0x7; sr >>= 3;
+ xmc[46] = sr & 0x7; sr >>= 3;
+ xmc[47] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[48] = sr & 0x7; sr >>= 3;
+ xmc[49] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[50] = sr & 0x7; sr >>= 3;
+ xmc[51] = sr & 0x7; sr >>= 3;
+
+ s->frame_chain = sr & 0xf;
+ }
+ else {
+ sr = s->frame_chain;
+ sr |= (uword)*c++ << 4; /* 1 */
+ LARc[0] = sr & 0x3f; sr >>= 6;
+ LARc[1] = sr & 0x3f; sr >>= 6;
+ sr = *c++;
+ LARc[2] = sr & 0x1f; sr >>= 5;
+ sr |= (uword)*c++ << 3;
+ LARc[3] = sr & 0x1f; sr >>= 5;
+ LARc[4] = sr & 0xf; sr >>= 4;
+ sr |= (uword)*c++ << 2;
+ LARc[5] = sr & 0xf; sr >>= 4;
+ LARc[6] = sr & 0x7; sr >>= 3;
+ LARc[7] = sr & 0x7; sr >>= 3;
+ sr = *c++; /* 5 */
+ Nc[0] = sr & 0x7f; sr >>= 7;
+ sr |= (uword)*c++ << 1;
+ bc[0] = sr & 0x3; sr >>= 2;
+ Mc[0] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 5;
+ xmaxc[0] = sr & 0x3f; sr >>= 6;
+ xmc[0] = sr & 0x7; sr >>= 3;
+ xmc[1] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[2] = sr & 0x7; sr >>= 3;
+ xmc[3] = sr & 0x7; sr >>= 3;
+ xmc[4] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[5] = sr & 0x7; sr >>= 3;
+ xmc[6] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2; /* 10 */
+ xmc[7] = sr & 0x7; sr >>= 3;
+ xmc[8] = sr & 0x7; sr >>= 3;
+ xmc[9] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[10] = sr & 0x7; sr >>= 3;
+ xmc[11] = sr & 0x7; sr >>= 3;
+ xmc[12] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ Nc[1] = sr & 0x7f; sr >>= 7;
+ sr |= (uword)*c++ << 1;
+ bc[1] = sr & 0x3; sr >>= 2;
+ Mc[1] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 5;
+ xmaxc[1] = sr & 0x3f; sr >>= 6;
+ xmc[13] = sr & 0x7; sr >>= 3;
+ xmc[14] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1; /* 15 */
+ xmc[15] = sr & 0x7; sr >>= 3;
+ xmc[16] = sr & 0x7; sr >>= 3;
+ xmc[17] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[18] = sr & 0x7; sr >>= 3;
+ xmc[19] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[20] = sr & 0x7; sr >>= 3;
+ xmc[21] = sr & 0x7; sr >>= 3;
+ xmc[22] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[23] = sr & 0x7; sr >>= 3;
+ xmc[24] = sr & 0x7; sr >>= 3;
+ xmc[25] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ Nc[2] = sr & 0x7f; sr >>= 7;
+ sr |= (uword)*c++ << 1; /* 20 */
+ bc[2] = sr & 0x3; sr >>= 2;
+ Mc[2] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 5;
+ xmaxc[2] = sr & 0x3f; sr >>= 6;
+ xmc[26] = sr & 0x7; sr >>= 3;
+ xmc[27] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[28] = sr & 0x7; sr >>= 3;
+ xmc[29] = sr & 0x7; sr >>= 3;
+ xmc[30] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ xmc[31] = sr & 0x7; sr >>= 3;
+ xmc[32] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[33] = sr & 0x7; sr >>= 3;
+ xmc[34] = sr & 0x7; sr >>= 3;
+ xmc[35] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1; /* 25 */
+ xmc[36] = sr & 0x7; sr >>= 3;
+ xmc[37] = sr & 0x7; sr >>= 3;
+ xmc[38] = sr & 0x7; sr >>= 3;
+ sr = *c++;
+ Nc[3] = sr & 0x7f; sr >>= 7;
+ sr |= (uword)*c++ << 1;
+ bc[3] = sr & 0x3; sr >>= 2;
+ Mc[3] = sr & 0x3; sr >>= 2;
+ sr |= (uword)*c++ << 5;
+ xmaxc[3] = sr & 0x3f; sr >>= 6;
+ xmc[39] = sr & 0x7; sr >>= 3;
+ xmc[40] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[41] = sr & 0x7; sr >>= 3;
+ xmc[42] = sr & 0x7; sr >>= 3;
+ xmc[43] = sr & 0x7; sr >>= 3;
+ sr = *c++; /* 30 */
+ xmc[44] = sr & 0x7; sr >>= 3;
+ xmc[45] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 2;
+ xmc[46] = sr & 0x7; sr >>= 3;
+ xmc[47] = sr & 0x7; sr >>= 3;
+ xmc[48] = sr & 0x7; sr >>= 3;
+ sr |= (uword)*c++ << 1;
+ xmc[49] = sr & 0x7; sr >>= 3;
+ xmc[50] = sr & 0x7; sr >>= 3;
+ xmc[51] = sr & 0x7; sr >>= 3;
+ }
+ }
+ else
+#endif
+ {
+ /* GSM_MAGIC = (*c >> 4) & 0xF; */
+
+ if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+
+ LARc[0] = (*c++ & 0xF) << 2; /* 1 */
+ LARc[0] |= (*c >> 6) & 0x3;
+ LARc[1] = *c++ & 0x3F;
+ LARc[2] = (*c >> 3) & 0x1F;
+ LARc[3] = (*c++ & 0x7) << 2;
+ LARc[3] |= (*c >> 6) & 0x3;
+ LARc[4] = (*c >> 2) & 0xF;
+ LARc[5] = (*c++ & 0x3) << 2;
+ LARc[5] |= (*c >> 6) & 0x3;
+ LARc[6] = (*c >> 3) & 0x7;
+ LARc[7] = *c++ & 0x7;
+ Nc[0] = (*c >> 1) & 0x7F;
+ bc[0] = (*c++ & 0x1) << 1;
+ bc[0] |= (*c >> 7) & 0x1;
+ Mc[0] = (*c >> 5) & 0x3;
+ xmaxc[0] = (*c++ & 0x1F) << 1;
+ xmaxc[0] |= (*c >> 7) & 0x1;
+ xmc[0] = (*c >> 4) & 0x7;
+ xmc[1] = (*c >> 1) & 0x7;
+ xmc[2] = (*c++ & 0x1) << 2;
+ xmc[2] |= (*c >> 6) & 0x3;
+ xmc[3] = (*c >> 3) & 0x7;
+ xmc[4] = *c++ & 0x7;
+ xmc[5] = (*c >> 5) & 0x7;
+ xmc[6] = (*c >> 2) & 0x7;
+ xmc[7] = (*c++ & 0x3) << 1; /* 10 */
+ xmc[7] |= (*c >> 7) & 0x1;
+ xmc[8] = (*c >> 4) & 0x7;
+ xmc[9] = (*c >> 1) & 0x7;
+ xmc[10] = (*c++ & 0x1) << 2;
+ xmc[10] |= (*c >> 6) & 0x3;
+ xmc[11] = (*c >> 3) & 0x7;
+ xmc[12] = *c++ & 0x7;
+ Nc[1] = (*c >> 1) & 0x7F;
+ bc[1] = (*c++ & 0x1) << 1;
+ bc[1] |= (*c >> 7) & 0x1;
+ Mc[1] = (*c >> 5) & 0x3;
+ xmaxc[1] = (*c++ & 0x1F) << 1;
+ xmaxc[1] |= (*c >> 7) & 0x1;
+ xmc[13] = (*c >> 4) & 0x7;
+ xmc[14] = (*c >> 1) & 0x7;
+ xmc[15] = (*c++ & 0x1) << 2;
+ xmc[15] |= (*c >> 6) & 0x3;
+ xmc[16] = (*c >> 3) & 0x7;
+ xmc[17] = *c++ & 0x7;
+ xmc[18] = (*c >> 5) & 0x7;
+ xmc[19] = (*c >> 2) & 0x7;
+ xmc[20] = (*c++ & 0x3) << 1;
+ xmc[20] |= (*c >> 7) & 0x1;
+ xmc[21] = (*c >> 4) & 0x7;
+ xmc[22] = (*c >> 1) & 0x7;
+ xmc[23] = (*c++ & 0x1) << 2;
+ xmc[23] |= (*c >> 6) & 0x3;
+ xmc[24] = (*c >> 3) & 0x7;
+ xmc[25] = *c++ & 0x7;
+ Nc[2] = (*c >> 1) & 0x7F;
+ bc[2] = (*c++ & 0x1) << 1; /* 20 */
+ bc[2] |= (*c >> 7) & 0x1;
+ Mc[2] = (*c >> 5) & 0x3;
+ xmaxc[2] = (*c++ & 0x1F) << 1;
+ xmaxc[2] |= (*c >> 7) & 0x1;
+ xmc[26] = (*c >> 4) & 0x7;
+ xmc[27] = (*c >> 1) & 0x7;
+ xmc[28] = (*c++ & 0x1) << 2;
+ xmc[28] |= (*c >> 6) & 0x3;
+ xmc[29] = (*c >> 3) & 0x7;
+ xmc[30] = *c++ & 0x7;
+ xmc[31] = (*c >> 5) & 0x7;
+ xmc[32] = (*c >> 2) & 0x7;
+ xmc[33] = (*c++ & 0x3) << 1;
+ xmc[33] |= (*c >> 7) & 0x1;
+ xmc[34] = (*c >> 4) & 0x7;
+ xmc[35] = (*c >> 1) & 0x7;
+ xmc[36] = (*c++ & 0x1) << 2;
+ xmc[36] |= (*c >> 6) & 0x3;
+ xmc[37] = (*c >> 3) & 0x7;
+ xmc[38] = *c++ & 0x7;
+ Nc[3] = (*c >> 1) & 0x7F;
+ bc[3] = (*c++ & 0x1) << 1;
+ bc[3] |= (*c >> 7) & 0x1;
+ Mc[3] = (*c >> 5) & 0x3;
+ xmaxc[3] = (*c++ & 0x1F) << 1;
+ xmaxc[3] |= (*c >> 7) & 0x1;
+ xmc[39] = (*c >> 4) & 0x7;
+ xmc[40] = (*c >> 1) & 0x7;
+ xmc[41] = (*c++ & 0x1) << 2;
+ xmc[41] |= (*c >> 6) & 0x3;
+ xmc[42] = (*c >> 3) & 0x7;
+ xmc[43] = *c++ & 0x7; /* 30 */
+ xmc[44] = (*c >> 5) & 0x7;
+ xmc[45] = (*c >> 2) & 0x7;
+ xmc[46] = (*c++ & 0x3) << 1;
+ xmc[46] |= (*c >> 7) & 0x1;
+ xmc[47] = (*c >> 4) & 0x7;
+ xmc[48] = (*c >> 1) & 0x7;
+ xmc[49] = (*c++ & 0x1) << 2;
+ xmc[49] |= (*c >> 6) & 0x3;
+ xmc[50] = (*c >> 3) & 0x7;
+ xmc[51] = *c & 0x7; /* 33 */
+ }
+
+ Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
+
+ return 0;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 6a9b6628-821c-4a96-84c1-485ebd35f170
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_destroy.c b/orkbasecxx/filters/gsm/gsm610/gsm_destroy.c new file mode 100644 index 0000000..7af9800 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/gsm_destroy.c @@ -0,0 +1,31 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm.h"
+#include "config.h"
+
+#ifdef HAS_STDLIB_H
+# include <stdlib.h>
+#else
+# ifdef HAS_MALLOC_H
+# include <malloc.h>
+# else
+ extern void free();
+# endif
+#endif
+
+void gsm_destroy (gsm S)
+{
+ if (S) free((char *)S);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: f423d09b-6ccc-47e0-9b18-ee1cf7a8e473
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_encode.c b/orkbasecxx/filters/gsm/gsm610/gsm_encode.c new file mode 100644 index 0000000..a3e4389 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/gsm_encode.c @@ -0,0 +1,456 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm610_priv.h"
+#include "gsm.h"
+
+void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c)
+{
+ word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+ Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);
+
+
+ /* variable size
+
+ GSM_MAGIC 4
+
+ LARc[0] 6
+ LARc[1] 6
+ LARc[2] 5
+ LARc[3] 5
+ LARc[4] 4
+ LARc[5] 4
+ LARc[6] 3
+ LARc[7] 3
+
+ Nc[0] 7
+ bc[0] 2
+ Mc[0] 2
+ xmaxc[0] 6
+ xmc[0] 3
+ xmc[1] 3
+ xmc[2] 3
+ xmc[3] 3
+ xmc[4] 3
+ xmc[5] 3
+ xmc[6] 3
+ xmc[7] 3
+ xmc[8] 3
+ xmc[9] 3
+ xmc[10] 3
+ xmc[11] 3
+ xmc[12] 3
+
+ Nc[1] 7
+ bc[1] 2
+ Mc[1] 2
+ xmaxc[1] 6
+ xmc[13] 3
+ xmc[14] 3
+ xmc[15] 3
+ xmc[16] 3
+ xmc[17] 3
+ xmc[18] 3
+ xmc[19] 3
+ xmc[20] 3
+ xmc[21] 3
+ xmc[22] 3
+ xmc[23] 3
+ xmc[24] 3
+ xmc[25] 3
+
+ Nc[2] 7
+ bc[2] 2
+ Mc[2] 2
+ xmaxc[2] 6
+ xmc[26] 3
+ xmc[27] 3
+ xmc[28] 3
+ xmc[29] 3
+ xmc[30] 3
+ xmc[31] 3
+ xmc[32] 3
+ xmc[33] 3
+ xmc[34] 3
+ xmc[35] 3
+ xmc[36] 3
+ xmc[37] 3
+ xmc[38] 3
+
+ Nc[3] 7
+ bc[3] 2
+ Mc[3] 2
+ xmaxc[3] 6
+ xmc[39] 3
+ xmc[40] 3
+ xmc[41] 3
+ xmc[42] 3
+ xmc[43] 3
+ xmc[44] 3
+ xmc[45] 3
+ xmc[46] 3
+ xmc[47] 3
+ xmc[48] 3
+ xmc[49] 3
+ xmc[50] 3
+ xmc[51] 3
+ */
+
+#ifdef WAV49
+
+ if (s->wav_fmt) {
+ s->frame_index = !s->frame_index;
+ if (s->frame_index) {
+
+ uword sr;
+
+ sr = 0;
+ sr = sr >> 6 | LARc[0] << 10;
+ sr = sr >> 6 | LARc[1] << 10;
+ *c++ = sr >> 4;
+ sr = sr >> 5 | LARc[2] << 11;
+ *c++ = sr >> 7;
+ sr = sr >> 5 | LARc[3] << 11;
+ sr = sr >> 4 | LARc[4] << 12;
+ *c++ = sr >> 6;
+ sr = sr >> 4 | LARc[5] << 12;
+ sr = sr >> 3 | LARc[6] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | LARc[7] << 13;
+ sr = sr >> 7 | Nc[0] << 9;
+ *c++ = sr >> 5;
+ sr = sr >> 2 | bc[0] << 14;
+ sr = sr >> 2 | Mc[0] << 14;
+ sr = sr >> 6 | xmaxc[0] << 10;
+ *c++ = sr >> 3;
+ sr = sr >> 3 | xmc[0] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[1] << 13;
+ sr = sr >> 3 | xmc[2] << 13;
+ sr = sr >> 3 | xmc[3] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[4] << 13;
+ sr = sr >> 3 | xmc[5] << 13;
+ sr = sr >> 3 | xmc[6] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[7] << 13;
+ sr = sr >> 3 | xmc[8] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[9] << 13;
+ sr = sr >> 3 | xmc[10] << 13;
+ sr = sr >> 3 | xmc[11] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[12] << 13;
+ sr = sr >> 7 | Nc[1] << 9;
+ *c++ = sr >> 5;
+ sr = sr >> 2 | bc[1] << 14;
+ sr = sr >> 2 | Mc[1] << 14;
+ sr = sr >> 6 | xmaxc[1] << 10;
+ *c++ = sr >> 3;
+ sr = sr >> 3 | xmc[13] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[14] << 13;
+ sr = sr >> 3 | xmc[15] << 13;
+ sr = sr >> 3 | xmc[16] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[17] << 13;
+ sr = sr >> 3 | xmc[18] << 13;
+ sr = sr >> 3 | xmc[19] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[20] << 13;
+ sr = sr >> 3 | xmc[21] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[22] << 13;
+ sr = sr >> 3 | xmc[23] << 13;
+ sr = sr >> 3 | xmc[24] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[25] << 13;
+ sr = sr >> 7 | Nc[2] << 9;
+ *c++ = sr >> 5;
+ sr = sr >> 2 | bc[2] << 14;
+ sr = sr >> 2 | Mc[2] << 14;
+ sr = sr >> 6 | xmaxc[2] << 10;
+ *c++ = sr >> 3;
+ sr = sr >> 3 | xmc[26] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[27] << 13;
+ sr = sr >> 3 | xmc[28] << 13;
+ sr = sr >> 3 | xmc[29] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[30] << 13;
+ sr = sr >> 3 | xmc[31] << 13;
+ sr = sr >> 3 | xmc[32] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[33] << 13;
+ sr = sr >> 3 | xmc[34] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[35] << 13;
+ sr = sr >> 3 | xmc[36] << 13;
+ sr = sr >> 3 | xmc[37] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[38] << 13;
+ sr = sr >> 7 | Nc[3] << 9;
+ *c++ = sr >> 5;
+ sr = sr >> 2 | bc[3] << 14;
+ sr = sr >> 2 | Mc[3] << 14;
+ sr = sr >> 6 | xmaxc[3] << 10;
+ *c++ = sr >> 3;
+ sr = sr >> 3 | xmc[39] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[40] << 13;
+ sr = sr >> 3 | xmc[41] << 13;
+ sr = sr >> 3 | xmc[42] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[43] << 13;
+ sr = sr >> 3 | xmc[44] << 13;
+ sr = sr >> 3 | xmc[45] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[46] << 13;
+ sr = sr >> 3 | xmc[47] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[48] << 13;
+ sr = sr >> 3 | xmc[49] << 13;
+ sr = sr >> 3 | xmc[50] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[51] << 13;
+ sr = sr >> 4;
+ *c = sr >> 8;
+ s->frame_chain = *c;
+ }
+ else {
+ uword sr;
+
+ sr = 0;
+ sr = sr >> 4 | s->frame_chain << 12;
+ sr = sr >> 6 | LARc[0] << 10;
+ *c++ = sr >> 6;
+ sr = sr >> 6 | LARc[1] << 10;
+ *c++ = sr >> 8;
+ sr = sr >> 5 | LARc[2] << 11;
+ sr = sr >> 5 | LARc[3] << 11;
+ *c++ = sr >> 6;
+ sr = sr >> 4 | LARc[4] << 12;
+ sr = sr >> 4 | LARc[5] << 12;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | LARc[6] << 13;
+ sr = sr >> 3 | LARc[7] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 7 | Nc[0] << 9;
+ sr = sr >> 2 | bc[0] << 14;
+ *c++ = sr >> 7;
+ sr = sr >> 2 | Mc[0] << 14;
+ sr = sr >> 6 | xmaxc[0] << 10;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[0] << 13;
+ sr = sr >> 3 | xmc[1] << 13;
+ sr = sr >> 3 | xmc[2] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[3] << 13;
+ sr = sr >> 3 | xmc[4] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[5] << 13;
+ sr = sr >> 3 | xmc[6] << 13;
+ sr = sr >> 3 | xmc[7] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[8] << 13;
+ sr = sr >> 3 | xmc[9] << 13;
+ sr = sr >> 3 | xmc[10] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[11] << 13;
+ sr = sr >> 3 | xmc[12] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 7 | Nc[1] << 9;
+ sr = sr >> 2 | bc[1] << 14;
+ *c++ = sr >> 7;
+ sr = sr >> 2 | Mc[1] << 14;
+ sr = sr >> 6 | xmaxc[1] << 10;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[13] << 13;
+ sr = sr >> 3 | xmc[14] << 13;
+ sr = sr >> 3 | xmc[15] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[16] << 13;
+ sr = sr >> 3 | xmc[17] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[18] << 13;
+ sr = sr >> 3 | xmc[19] << 13;
+ sr = sr >> 3 | xmc[20] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[21] << 13;
+ sr = sr >> 3 | xmc[22] << 13;
+ sr = sr >> 3 | xmc[23] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[24] << 13;
+ sr = sr >> 3 | xmc[25] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 7 | Nc[2] << 9;
+ sr = sr >> 2 | bc[2] << 14;
+ *c++ = sr >> 7;
+ sr = sr >> 2 | Mc[2] << 14;
+ sr = sr >> 6 | xmaxc[2] << 10;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[26] << 13;
+ sr = sr >> 3 | xmc[27] << 13;
+ sr = sr >> 3 | xmc[28] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[29] << 13;
+ sr = sr >> 3 | xmc[30] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[31] << 13;
+ sr = sr >> 3 | xmc[32] << 13;
+ sr = sr >> 3 | xmc[33] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[34] << 13;
+ sr = sr >> 3 | xmc[35] << 13;
+ sr = sr >> 3 | xmc[36] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[37] << 13;
+ sr = sr >> 3 | xmc[38] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 7 | Nc[3] << 9;
+ sr = sr >> 2 | bc[3] << 14;
+ *c++ = sr >> 7;
+ sr = sr >> 2 | Mc[3] << 14;
+ sr = sr >> 6 | xmaxc[3] << 10;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[39] << 13;
+ sr = sr >> 3 | xmc[40] << 13;
+ sr = sr >> 3 | xmc[41] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[42] << 13;
+ sr = sr >> 3 | xmc[43] << 13;
+ *c++ = sr >> 8;
+ sr = sr >> 3 | xmc[44] << 13;
+ sr = sr >> 3 | xmc[45] << 13;
+ sr = sr >> 3 | xmc[46] << 13;
+ *c++ = sr >> 7;
+ sr = sr >> 3 | xmc[47] << 13;
+ sr = sr >> 3 | xmc[48] << 13;
+ sr = sr >> 3 | xmc[49] << 13;
+ *c++ = sr >> 6;
+ sr = sr >> 3 | xmc[50] << 13;
+ sr = sr >> 3 | xmc[51] << 13;
+ *c++ = sr >> 8;
+ }
+ }
+
+ else
+
+#endif /* WAV49 */
+ {
+
+ *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */
+ | ((LARc[0] >> 2) & 0xF);
+ *c++ = ((LARc[0] & 0x3) << 6)
+ | (LARc[1] & 0x3F);
+ *c++ = ((LARc[2] & 0x1F) << 3)
+ | ((LARc[3] >> 2) & 0x7);
+ *c++ = ((LARc[3] & 0x3) << 6)
+ | ((LARc[4] & 0xF) << 2)
+ | ((LARc[5] >> 2) & 0x3);
+ *c++ = ((LARc[5] & 0x3) << 6)
+ | ((LARc[6] & 0x7) << 3)
+ | (LARc[7] & 0x7);
+ *c++ = ((Nc[0] & 0x7F) << 1)
+ | ((bc[0] >> 1) & 0x1);
+ *c++ = ((bc[0] & 0x1) << 7)
+ | ((Mc[0] & 0x3) << 5)
+ | ((xmaxc[0] >> 1) & 0x1F);
+ *c++ = ((xmaxc[0] & 0x1) << 7)
+ | ((xmc[0] & 0x7) << 4)
+ | ((xmc[1] & 0x7) << 1)
+ | ((xmc[2] >> 2) & 0x1);
+ *c++ = ((xmc[2] & 0x3) << 6)
+ | ((xmc[3] & 0x7) << 3)
+ | (xmc[4] & 0x7);
+ *c++ = ((xmc[5] & 0x7) << 5) /* 10 */
+ | ((xmc[6] & 0x7) << 2)
+ | ((xmc[7] >> 1) & 0x3);
+ *c++ = ((xmc[7] & 0x1) << 7)
+ | ((xmc[8] & 0x7) << 4)
+ | ((xmc[9] & 0x7) << 1)
+ | ((xmc[10] >> 2) & 0x1);
+ *c++ = ((xmc[10] & 0x3) << 6)
+ | ((xmc[11] & 0x7) << 3)
+ | (xmc[12] & 0x7);
+ *c++ = ((Nc[1] & 0x7F) << 1)
+ | ((bc[1] >> 1) & 0x1);
+ *c++ = ((bc[1] & 0x1) << 7)
+ | ((Mc[1] & 0x3) << 5)
+ | ((xmaxc[1] >> 1) & 0x1F);
+ *c++ = ((xmaxc[1] & 0x1) << 7)
+ | ((xmc[13] & 0x7) << 4)
+ | ((xmc[14] & 0x7) << 1)
+ | ((xmc[15] >> 2) & 0x1);
+ *c++ = ((xmc[15] & 0x3) << 6)
+ | ((xmc[16] & 0x7) << 3)
+ | (xmc[17] & 0x7);
+ *c++ = ((xmc[18] & 0x7) << 5)
+ | ((xmc[19] & 0x7) << 2)
+ | ((xmc[20] >> 1) & 0x3);
+ *c++ = ((xmc[20] & 0x1) << 7)
+ | ((xmc[21] & 0x7) << 4)
+ | ((xmc[22] & 0x7) << 1)
+ | ((xmc[23] >> 2) & 0x1);
+ *c++ = ((xmc[23] & 0x3) << 6)
+ | ((xmc[24] & 0x7) << 3)
+ | (xmc[25] & 0x7);
+ *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */
+ | ((bc[2] >> 1) & 0x1);
+ *c++ = ((bc[2] & 0x1) << 7)
+ | ((Mc[2] & 0x3) << 5)
+ | ((xmaxc[2] >> 1) & 0x1F);
+ *c++ = ((xmaxc[2] & 0x1) << 7)
+ | ((xmc[26] & 0x7) << 4)
+ | ((xmc[27] & 0x7) << 1)
+ | ((xmc[28] >> 2) & 0x1);
+ *c++ = ((xmc[28] & 0x3) << 6)
+ | ((xmc[29] & 0x7) << 3)
+ | (xmc[30] & 0x7);
+ *c++ = ((xmc[31] & 0x7) << 5)
+ | ((xmc[32] & 0x7) << 2)
+ | ((xmc[33] >> 1) & 0x3);
+ *c++ = ((xmc[33] & 0x1) << 7)
+ | ((xmc[34] & 0x7) << 4)
+ | ((xmc[35] & 0x7) << 1)
+ | ((xmc[36] >> 2) & 0x1);
+ *c++ = ((xmc[36] & 0x3) << 6)
+ | ((xmc[37] & 0x7) << 3)
+ | (xmc[38] & 0x7);
+ *c++ = ((Nc[3] & 0x7F) << 1)
+ | ((bc[3] >> 1) & 0x1);
+ *c++ = ((bc[3] & 0x1) << 7)
+ | ((Mc[3] & 0x3) << 5)
+ | ((xmaxc[3] >> 1) & 0x1F);
+ *c++ = ((xmaxc[3] & 0x1) << 7)
+ | ((xmc[39] & 0x7) << 4)
+ | ((xmc[40] & 0x7) << 1)
+ | ((xmc[41] >> 2) & 0x1);
+ *c++ = ((xmc[41] & 0x3) << 6) /* 30 */
+ | ((xmc[42] & 0x7) << 3)
+ | (xmc[43] & 0x7);
+ *c++ = ((xmc[44] & 0x7) << 5)
+ | ((xmc[45] & 0x7) << 2)
+ | ((xmc[46] >> 1) & 0x3);
+ *c++ = ((xmc[46] & 0x1) << 7)
+ | ((xmc[47] & 0x7) << 4)
+ | ((xmc[48] & 0x7) << 1)
+ | ((xmc[49] >> 2) & 0x1);
+ *c++ = ((xmc[49] & 0x3) << 6)
+ | ((xmc[50] & 0x7) << 3)
+ | (xmc[51] & 0x7);
+
+ }
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: cfe9c43d-d97c-4216-b5e5-ccd6a25b582b
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/gsm_option.c b/orkbasecxx/filters/gsm/gsm610/gsm_option.c new file mode 100644 index 0000000..09c5ea0 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/gsm_option.c @@ -0,0 +1,74 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+int gsm_option (gsm r, int opt, int * val)
+{
+ int result = -1;
+
+ switch (opt) {
+ case GSM_OPT_LTP_CUT:
+#ifdef LTP_CUT
+ result = r->ltp_cut;
+ if (val) r->ltp_cut = *val;
+#endif
+ break;
+
+ case GSM_OPT_VERBOSE:
+#ifndef NDEBUG
+ result = r->verbose;
+ if (val) r->verbose = *val;
+#endif
+ break;
+
+ case GSM_OPT_FAST:
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+ result = r->fast;
+ if (val) r->fast = !!*val;
+#endif
+ break;
+
+ case GSM_OPT_FRAME_CHAIN:
+
+#ifdef WAV49
+ result = r->frame_chain;
+ if (val) r->frame_chain = *val;
+#endif
+ break;
+
+ case GSM_OPT_FRAME_INDEX:
+
+#ifdef WAV49
+ result = r->frame_index;
+ if (val) r->frame_index = *val;
+#endif
+ break;
+
+ case GSM_OPT_WAV49:
+
+#ifdef WAV49
+ result = r->wav_fmt;
+ if (val) r->wav_fmt = !!*val;
+#endif
+ break;
+
+ default:
+ break;
+ }
+ return result;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 963ff156-506f-4359-9145-371e9060b030
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/long_term.c b/orkbasecxx/filters/gsm/gsm610/long_term.c new file mode 100644 index 0000000..706b8a9 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/long_term.c @@ -0,0 +1,951 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+/*
+ * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
+ */
+
+
+/*
+ * This module computes the LTP gain (bc) and the LTP lag (Nc)
+ * for the long term analysis filter. This is done by calculating a
+ * maximum of the cross-correlation function between the current
+ * sub-segment short term residual signal d[0..39] (output of
+ * the short term analysis filter; for simplification the index
+ * of this array begins at 0 and ends at 39 for each sub-segment of the
+ * RPE-LTP analysis) and the previous reconstructed short term
+ * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be
+ * performed to avoid overflow.
+ */
+
+ /* The next procedure exists in six versions. First two integer
+ * version (if USE_FLOAT_MUL is not defined); then four floating
+ * point versions, twice with proper scaling (USE_FLOAT_MUL defined),
+ * once without (USE_FLOAT_MUL and FAST defined, and fast run-time
+ * option used). Every pair has first a Cut version (see the -C
+ * option to toast or the LTP_CUT option to gsm_option()), then the
+ * uncut one. (For a detailed explanation of why this is altogether
+ * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered
+ * Harmful''.)
+ */
+
+#ifndef USE_FLOAT_MUL
+
+#ifdef LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters (
+
+ struct gsm_state * st,
+
+ register word * d, /* [0..39] IN */
+ register word * dp, /* [-120..-1] IN */
+ word * bc_out, /* OUT */
+ word * Nc_out /* OUT */
+)
+{
+ register int k, lambda;
+ word Nc, bc;
+ word wt[40];
+
+ longword L_result;
+ longword L_max, L_power;
+ word R, S, dmax, scal, best_k;
+ word ltp_cut;
+
+ register word temp, wt_k;
+
+ /* Search of the optimum scaling of d[0..39].
+ */
+ dmax = 0;
+ for (k = 0; k <= 39; k++) {
+ temp = d[k];
+ temp = GSM_ABS( temp );
+ if (temp > dmax) {
+ dmax = temp;
+ best_k = k;
+ }
+ }
+ temp = 0;
+ if (dmax == 0) scal = 0;
+ else {
+ assert(dmax > 0);
+ temp = gsm_norm( (longword)dmax << 16 );
+ }
+ if (temp > 6) scal = 0;
+ else scal = 6 - temp;
+ assert(scal >= 0);
+
+ /* Search for the maximum cross-correlation and coding of the LTP lag
+ */
+ L_max = 0;
+ Nc = 40; /* index for the maximum cross-correlation */
+ wt_k = SASR_W(d[best_k], scal);
+
+ for (lambda = 40; lambda <= 120; lambda++) {
+ L_result = (longword)wt_k * dp[best_k - lambda];
+ if (L_result > L_max) {
+ Nc = lambda;
+ L_max = L_result;
+ }
+ }
+ *Nc_out = Nc;
+ L_max <<= 1;
+
+ /* Rescaling of L_max
+ */
+ assert(scal <= 100 && scal >= -100);
+ L_max = L_max >> (6 - scal); /* sub(6, scal) */
+
+ assert( Nc <= 120 && Nc >= 40);
+
+ /* Compute the power of the reconstructed short term residual
+ * signal dp[..]
+ */
+ L_power = 0;
+ for (k = 0; k <= 39; k++) {
+
+ register longword L_temp;
+
+ L_temp = SASR_W( dp[k - Nc], 3 );
+ L_power += L_temp * L_temp;
+ }
+ L_power <<= 1; /* from L_MULT */
+
+ /* Normalization of L_max and L_power
+ */
+
+ if (L_max <= 0) {
+ *bc_out = 0;
+ return;
+ }
+ if (L_max >= L_power) {
+ *bc_out = 3;
+ return;
+ }
+
+ temp = gsm_norm( L_power );
+
+ R = SASR( L_max << temp, 16 );
+ S = SASR( L_power << temp, 16 );
+
+ /* Coding of the LTP gain
+ */
+
+ /* Table 4.3a must be used to obtain the level DLB[i] for the
+ * quantization of the LTP gain b to get the coded version bc.
+ */
+ for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+ *bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters (
+ register word * d, /* [0..39] IN */
+ register word * dp, /* [-120..-1] IN */
+ word * bc_out, /* OUT */
+ word * Nc_out /* OUT */
+)
+{
+ register int k, lambda;
+ word Nc, bc;
+ word wt[40];
+
+ longword L_max, L_power;
+ word R, S, dmax, scal;
+ register word temp;
+
+ /* Search of the optimum scaling of d[0..39].
+ */
+ dmax = 0;
+
+ for (k = 0; k <= 39; k++) {
+ temp = d[k];
+ temp = GSM_ABS( temp );
+ if (temp > dmax) dmax = temp;
+ }
+
+ temp = 0;
+ if (dmax == 0) scal = 0;
+ else {
+ assert(dmax > 0);
+ temp = gsm_norm( (longword)dmax << 16 );
+ }
+
+ if (temp > 6) scal = 0;
+ else scal = 6 - temp;
+
+ assert(scal >= 0);
+
+ /* Initialization of a working array wt
+ */
+
+ for (k = 0; k <= 39; k++) wt[k] = SASR_W( d[k], scal );
+
+ /* Search for the maximum cross-correlation and coding of the LTP lag
+ */
+ L_max = 0;
+ Nc = 40; /* index for the maximum cross-correlation */
+
+ for (lambda = 40; lambda <= 120; lambda++) {
+
+# undef STEP
+# define STEP(k) (longword)wt[k] * dp[k - lambda]
+
+ register longword L_result;
+
+ L_result = STEP(0) ; L_result += STEP(1) ;
+ L_result += STEP(2) ; L_result += STEP(3) ;
+ L_result += STEP(4) ; L_result += STEP(5) ;
+ L_result += STEP(6) ; L_result += STEP(7) ;
+ L_result += STEP(8) ; L_result += STEP(9) ;
+ L_result += STEP(10) ; L_result += STEP(11) ;
+ L_result += STEP(12) ; L_result += STEP(13) ;
+ L_result += STEP(14) ; L_result += STEP(15) ;
+ L_result += STEP(16) ; L_result += STEP(17) ;
+ L_result += STEP(18) ; L_result += STEP(19) ;
+ L_result += STEP(20) ; L_result += STEP(21) ;
+ L_result += STEP(22) ; L_result += STEP(23) ;
+ L_result += STEP(24) ; L_result += STEP(25) ;
+ L_result += STEP(26) ; L_result += STEP(27) ;
+ L_result += STEP(28) ; L_result += STEP(29) ;
+ L_result += STEP(30) ; L_result += STEP(31) ;
+ L_result += STEP(32) ; L_result += STEP(33) ;
+ L_result += STEP(34) ; L_result += STEP(35) ;
+ L_result += STEP(36) ; L_result += STEP(37) ;
+ L_result += STEP(38) ; L_result += STEP(39) ;
+
+ if (L_result > L_max) {
+
+ Nc = lambda;
+ L_max = L_result;
+ }
+ }
+
+ *Nc_out = Nc;
+
+ L_max <<= 1;
+
+ /* Rescaling of L_max
+ */
+ assert(scal <= 100 && scal >= -100);
+ L_max = L_max >> (6 - scal); /* sub(6, scal) */
+
+ assert( Nc <= 120 && Nc >= 40);
+
+ /* Compute the power of the reconstructed short term residual
+ * signal dp[..]
+ */
+ L_power = 0;
+ for (k = 0; k <= 39; k++) {
+
+ register longword L_temp;
+
+ L_temp = SASR_W( dp[k - Nc], 3 );
+ L_power += L_temp * L_temp;
+ }
+ L_power <<= 1; /* from L_MULT */
+
+ /* Normalization of L_max and L_power
+ */
+
+ if (L_max <= 0) {
+ *bc_out = 0;
+ return;
+ }
+ if (L_max >= L_power) {
+ *bc_out = 3;
+ return;
+ }
+
+ temp = gsm_norm( L_power );
+
+ R = SASR_L( L_max << temp, 16 );
+ S = SASR_L( L_power << temp, 16 );
+
+ /* Coding of the LTP gain
+ */
+
+ /* Table 4.3a must be used to obtain the level DLB[i] for the
+ * quantization of the LTP gain b to get the coded version bc.
+ */
+ for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+ *bc_out = bc;
+}
+
+#else /* USE_FLOAT_MUL */
+
+#ifdef LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters (
+ struct gsm_state * st, /* IN */
+ register word * d, /* [0..39] IN */
+ register word * dp, /* [-120..-1] IN */
+ word * bc_out, /* OUT */
+ word * Nc_out /* OUT */
+)
+{
+ register int k, lambda;
+ word Nc, bc;
+ word ltp_cut;
+
+ float wt_float[40];
+ float dp_float_base[120], * dp_float = dp_float_base + 120;
+
+ longword L_max, L_power;
+ word R, S, dmax, scal;
+ register word temp;
+
+ /* Search of the optimum scaling of d[0..39].
+ */
+ dmax = 0;
+
+ for (k = 0; k <= 39; k++) {
+ temp = d[k];
+ temp = GSM_ABS( temp );
+ if (temp > dmax) dmax = temp;
+ }
+
+ temp = 0;
+ if (dmax == 0) scal = 0;
+ else {
+ assert(dmax > 0);
+ temp = gsm_norm( (longword)dmax << 16 );
+ }
+
+ if (temp > 6) scal = 0;
+ else scal = 6 - temp;
+
+ assert(scal >= 0);
+ ltp_cut = (longword)SASR_W(dmax, scal) * st->ltp_cut / 100;
+
+
+ /* Initialization of a working array wt
+ */
+
+ for (k = 0; k < 40; k++) {
+ register word w = SASR_W( d[k], scal );
+ if (w < 0 ? w > -ltp_cut : w < ltp_cut) {
+ wt_float[k] = 0.0;
+ }
+ else {
+ wt_float[k] = w;
+ }
+ }
+ for (k = -120; k < 0; k++) dp_float[k] = dp[k];
+
+ /* Search for the maximum cross-correlation and coding of the LTP lag
+ */
+ L_max = 0;
+ Nc = 40; /* index for the maximum cross-correlation */
+
+ for (lambda = 40; lambda <= 120; lambda += 9) {
+
+ /* Calculate L_result for l = lambda .. lambda + 9.
+ */
+ register float *lp = dp_float - lambda;
+
+ register float W;
+ register float a = lp[-8], b = lp[-7], c = lp[-6],
+ d = lp[-5], e = lp[-4], f = lp[-3],
+ g = lp[-2], h = lp[-1];
+ register float E;
+ register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+ S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+# undef STEP
+# define STEP(K, a, b, c, d, e, f, g, h) \
+ if ((W = wt_float[K]) != 0.0) { \
+ E = W * a; S8 += E; \
+ E = W * b; S7 += E; \
+ E = W * c; S6 += E; \
+ E = W * d; S5 += E; \
+ E = W * e; S4 += E; \
+ E = W * f; S3 += E; \
+ E = W * g; S2 += E; \
+ E = W * h; S1 += E; \
+ a = lp[K]; \
+ E = W * a; S0 += E; } else (a = lp[K])
+
+# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)
+# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)
+# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)
+# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)
+# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)
+# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)
+# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)
+# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)
+
+ STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+ STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+ STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+ STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+ STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+ STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+ STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+ STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+ STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+ STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+ if (S0 > L_max) { L_max = S0; Nc = lambda; }
+ if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+ if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+ if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+ if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+ if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+ if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+ if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+ if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+
+ }
+ *Nc_out = Nc;
+
+ L_max <<= 1;
+
+ /* Rescaling of L_max
+ */
+ assert(scal <= 100 && scal >= -100);
+ L_max = L_max >> (6 - scal); /* sub(6, scal) */
+
+ assert( Nc <= 120 && Nc >= 40);
+
+ /* Compute the power of the reconstructed short term residual
+ * signal dp[..]
+ */
+ L_power = 0;
+ for (k = 0; k <= 39; k++) {
+
+ register longword L_temp;
+
+ L_temp = SASR_W( dp[k - Nc], 3 );
+ L_power += L_temp * L_temp;
+ }
+ L_power <<= 1; /* from L_MULT */
+
+ /* Normalization of L_max and L_power
+ */
+
+ if (L_max <= 0) {
+ *bc_out = 0;
+ return;
+ }
+ if (L_max >= L_power) {
+ *bc_out = 3;
+ return;
+ }
+
+ temp = gsm_norm( L_power );
+
+ R = SASR( L_max << temp, 16 );
+ S = SASR( L_power << temp, 16 );
+
+ /* Coding of the LTP gain
+ */
+
+ /* Table 4.3a must be used to obtain the level DLB[i] for the
+ * quantization of the LTP gain b to get the coded version bc.
+ */
+ for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+ *bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters (
+ register word * din, /* [0..39] IN */
+ register word * dp, /* [-120..-1] IN */
+ word * bc_out, /* OUT */
+ word * Nc_out /* OUT */
+)
+{
+ register int k, lambda;
+ word Nc, bc;
+
+ float wt_float[40];
+ float dp_float_base[120], * dp_float = dp_float_base + 120;
+
+ longword L_max, L_power;
+ word R, S, dmax, scal;
+ register word temp;
+
+ /* Search of the optimum scaling of d[0..39].
+ */
+ dmax = 0;
+
+ for (k = 0; k <= 39; k++) {
+ temp = din [k] ;
+ temp = GSM_ABS (temp) ;
+ if (temp > dmax) dmax = temp;
+ }
+
+ temp = 0;
+ if (dmax == 0) scal = 0;
+ else {
+ assert(dmax > 0);
+ temp = gsm_norm( (longword)dmax << 16 );
+ }
+
+ if (temp > 6) scal = 0;
+ else scal = 6 - temp;
+
+ assert(scal >= 0);
+
+ /* Initialization of a working array wt
+ */
+
+ for (k = 0; k < 40; k++) wt_float[k] = SASR_W (din [k], scal) ;
+ for (k = -120; k < 0; k++) dp_float[k] = dp[k];
+
+ /* Search for the maximum cross-correlation and coding of the LTP lag
+ */
+ L_max = 0;
+ Nc = 40; /* index for the maximum cross-correlation */
+
+ for (lambda = 40; lambda <= 120; lambda += 9) {
+
+ /* Calculate L_result for l = lambda .. lambda + 9.
+ */
+ register float *lp = dp_float - lambda;
+
+ register float W;
+ register float a = lp[-8], b = lp[-7], c = lp[-6],
+ d = lp[-5], e = lp[-4], f = lp[-3],
+ g = lp[-2], h = lp[-1];
+ register float E;
+ register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+ S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+# undef STEP
+# define STEP(K, a, b, c, d, e, f, g, h) \
+ W = wt_float[K]; \
+ E = W * a; S8 += E; \
+ E = W * b; S7 += E; \
+ E = W * c; S6 += E; \
+ E = W * d; S5 += E; \
+ E = W * e; S4 += E; \
+ E = W * f; S3 += E; \
+ E = W * g; S2 += E; \
+ E = W * h; S1 += E; \
+ a = lp[K]; \
+ E = W * a; S0 += E
+
+# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)
+# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)
+# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)
+# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)
+# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)
+# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)
+# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)
+# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)
+
+ STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+ STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+ STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+ STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+ STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+ STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+ STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+ STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+ STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+ STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+ if (S0 > L_max) { L_max = S0; Nc = lambda; }
+ if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+ if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+ if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+ if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+ if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+ if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+ if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+ if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+ }
+ *Nc_out = Nc;
+
+ L_max <<= 1;
+
+ /* Rescaling of L_max
+ */
+ assert(scal <= 100 && scal >= -100);
+ L_max = L_max >> (6 - scal); /* sub(6, scal) */
+
+ assert( Nc <= 120 && Nc >= 40);
+
+ /* Compute the power of the reconstructed short term residual
+ * signal dp[..]
+ */
+ L_power = 0;
+ for (k = 0; k <= 39; k++) {
+
+ register longword L_temp;
+
+ L_temp = SASR_W( dp[k - Nc], 3 );
+ L_power += L_temp * L_temp;
+ }
+ L_power <<= 1; /* from L_MULT */
+
+ /* Normalization of L_max and L_power
+ */
+
+ if (L_max <= 0) {
+ *bc_out = 0;
+ return;
+ }
+ if (L_max >= L_power) {
+ *bc_out = 3;
+ return;
+ }
+
+ temp = gsm_norm( L_power );
+
+ R = SASR_L ( L_max << temp, 16 );
+ S = SASR_L ( L_power << temp, 16 );
+
+ /* Coding of the LTP gain
+ */
+
+ /* Table 4.3a must be used to obtain the level DLB[i] for the
+ * quantization of the LTP gain b to get the coded version bc.
+ */
+ for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+ *bc_out = bc;
+}
+
+#ifdef FAST
+#ifdef LTP_CUT
+
+static void Cut_Fast_Calculation_of_the_LTP_parameters (
+ struct gsm_state * st, /* IN */
+ register word * d, /* [0..39] IN */
+ register word * dp, /* [-120..-1] IN */
+ word * bc_out, /* OUT */
+ word * Nc_out /* OUT */
+)
+{
+ register int k, lambda;
+ register float wt_float;
+ word Nc, bc;
+ word wt_max, best_k, ltp_cut;
+
+ float dp_float_base[120], * dp_float = dp_float_base + 120;
+
+ register float L_result, L_max, L_power;
+
+ wt_max = 0;
+
+ for (k = 0; k < 40; ++k) {
+ if ( d[k] > wt_max) wt_max = d[best_k = k];
+ else if (-d[k] > wt_max) wt_max = -d[best_k = k];
+ }
+
+ assert(wt_max >= 0);
+ wt_float = (float)wt_max;
+
+ for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+ /* Search for the maximum cross-correlation and coding of the LTP lag
+ */
+ L_max = 0;
+ Nc = 40; /* index for the maximum cross-correlation */
+
+ for (lambda = 40; lambda <= 120; lambda++) {
+ L_result = wt_float * dp_float[best_k - lambda];
+ if (L_result > L_max) {
+ Nc = lambda;
+ L_max = L_result;
+ }
+ }
+
+ *Nc_out = Nc;
+ if (L_max <= 0.) {
+ *bc_out = 0;
+ return;
+ }
+
+ /* Compute the power of the reconstructed short term residual
+ * signal dp[..]
+ */
+ dp_float -= Nc;
+ L_power = 0;
+ for (k = 0; k < 40; ++k) {
+ register float f = dp_float[k];
+ L_power += f * f;
+ }
+
+ if (L_max >= L_power) {
+ *bc_out = 3;
+ return;
+ }
+
+ /* Coding of the LTP gain
+ * Table 4.3a must be used to obtain the level DLB[i] for the
+ * quantization of the LTP gain b to get the coded version bc.
+ */
+ lambda = L_max / L_power * 32768.;
+ for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+ *bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Fast_Calculation_of_the_LTP_parameters (
+ register word * din, /* [0..39] IN */
+ register word * dp, /* [-120..-1] IN */
+ word * bc_out, /* OUT */
+ word * Nc_out /* OUT */
+)
+{
+ register int k, lambda;
+ word Nc, bc;
+
+ float wt_float[40];
+ float dp_float_base[120], * dp_float = dp_float_base + 120;
+
+ register float L_max, L_power;
+
+ for (k = 0; k < 40; ++k) wt_float[k] = (float) din [k] ;
+ for (k = -120; k < 0; ++k) dp_float[k] = (float) dp [k] ;
+
+ /* Search for the maximum cross-correlation and coding of the LTP lag
+ */
+ L_max = 0;
+ Nc = 40; /* index for the maximum cross-correlation */
+
+ for (lambda = 40; lambda <= 120; lambda += 9) {
+
+ /* Calculate L_result for l = lambda .. lambda + 9.
+ */
+ register float *lp = dp_float - lambda;
+
+ register float W;
+ register float a = lp[-8], b = lp[-7], c = lp[-6],
+ d = lp[-5], e = lp[-4], f = lp[-3],
+ g = lp[-2], h = lp[-1];
+ register float E;
+ register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+ S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+# undef STEP
+# define STEP(K, a, b, c, d, e, f, g, h) \
+ W = wt_float[K]; \
+ E = W * a; S8 += E; \
+ E = W * b; S7 += E; \
+ E = W * c; S6 += E; \
+ E = W * d; S5 += E; \
+ E = W * e; S4 += E; \
+ E = W * f; S3 += E; \
+ E = W * g; S2 += E; \
+ E = W * h; S1 += E; \
+ a = lp[K]; \
+ E = W * a; S0 += E
+
+# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)
+# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)
+# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)
+# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)
+# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)
+# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)
+# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)
+# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)
+
+ STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+ STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+ STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+ STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+ STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+ STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+ STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+ STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+ STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+ STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+ if (S0 > L_max) { L_max = S0; Nc = lambda; }
+ if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+ if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+ if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+ if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+ if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+ if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+ if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+ if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+ }
+ *Nc_out = Nc;
+
+ if (L_max <= 0.) {
+ *bc_out = 0;
+ return;
+ }
+
+ /* Compute the power of the reconstructed short term residual
+ * signal dp[..]
+ */
+ dp_float -= Nc;
+ L_power = 0;
+ for (k = 0; k < 40; ++k) {
+ register float f = dp_float[k];
+ L_power += f * f;
+ }
+
+ if (L_max >= L_power) {
+ *bc_out = 3;
+ return;
+ }
+
+ /* Coding of the LTP gain
+ * Table 4.3a must be used to obtain the level DLB[i] for the
+ * quantization of the LTP gain b to get the coded version bc.
+ */
+ lambda = L_max / L_power * 32768.;
+ for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+ *bc_out = bc;
+}
+
+#endif /* FAST */
+#endif /* USE_FLOAT_MUL */
+
+
+/* 4.2.12 */
+
+static void Long_term_analysis_filtering (
+ word bc, /* IN */
+ word Nc, /* IN */
+ register word * dp, /* previous d [-120..-1] IN */
+ register word * d, /* d [0..39] IN */
+ register word * dpp, /* estimate [0..39] OUT */
+ register word * e /* long term res. signal [0..39] OUT */
+)
+/*
+ * In this part, we have to decode the bc parameter to compute
+ * the samples of the estimate dpp[0..39]. The decoding of bc needs the
+ * use of table 4.3b. The long term residual signal e[0..39]
+ * is then calculated to be fed to the RPE encoding section.
+ */
+{
+ register int k;
+
+# undef STEP
+# define STEP(BP) \
+ for (k = 0; k <= 39; k++) { \
+ dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \
+ e[k] = GSM_SUB( d[k], dpp[k] ); \
+ }
+
+ switch (bc) {
+ case 0: STEP( 3277 ); break;
+ case 1: STEP( 11469 ); break;
+ case 2: STEP( 21299 ); break;
+ case 3: STEP( 32767 ); break;
+ }
+}
+
+void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */
+
+ struct gsm_state * S,
+
+ word * d, /* [0..39] residual signal IN */
+ word * dp, /* [-120..-1] d' IN */
+
+ word * e, /* [0..39] OUT */
+ word * dpp, /* [0..39] OUT */
+ word * Nc, /* correlation lag OUT */
+ word * bc /* gain factor OUT */
+)
+{
+ assert( d ); assert( dp ); assert( e );
+ assert( dpp); assert( Nc ); assert( bc );
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+ if (S->fast)
+#if defined (LTP_CUT)
+ if (S->ltp_cut)
+ Cut_Fast_Calculation_of_the_LTP_parameters(S,
+ d, dp, bc, Nc);
+ else
+#endif /* LTP_CUT */
+ Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
+ else
+#endif /* FAST & USE_FLOAT_MUL */
+#ifdef LTP_CUT
+ if (S->ltp_cut)
+ Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);
+ else
+#endif
+ Calculation_of_the_LTP_parameters(d, dp, bc, Nc);
+
+ Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );
+}
+
+/* 4.3.2 */
+void Gsm_Long_Term_Synthesis_Filtering (
+ struct gsm_state * S,
+
+ word Ncr,
+ word bcr,
+ register word * erp, /* [0..39] IN */
+ register word * drp /* [-120..-1] IN, [-120..40] OUT */
+)
+/*
+ * This procedure uses the bcr and Ncr parameter to realize the
+ * long term synthesis filtering. The decoding of bcr needs
+ * table 4.3b.
+ */
+{
+ register int k;
+ word brp, drpp, Nr;
+
+ /* Check the limits of Nr.
+ */
+ Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;
+ S->nrp = Nr;
+ assert(Nr >= 40 && Nr <= 120);
+
+ /* Decoding of the LTP gain bcr
+ */
+ brp = gsm_QLB[ bcr ];
+
+ /* Computation of the reconstructed short term residual
+ * signal drp[0..39]
+ */
+ assert(brp != MIN_WORD);
+
+ for (k = 0; k <= 39; k++) {
+ drpp = GSM_MULT_R( brp, drp[ k - Nr ] );
+ drp[k] = GSM_ADD( erp[k], drpp );
+ }
+
+ /*
+ * Update of the reconstructed short term residual signal
+ * drp[ -1..-120 ]
+ */
+
+ for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: b369b90d-0284-42a0-87b0-99a25bbd93ac
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/lpc.c b/orkbasecxx/filters/gsm/gsm610/lpc.c new file mode 100644 index 0000000..d537cb6 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/lpc.c @@ -0,0 +1,341 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+/*
+ * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
+ */
+
+/* 4.2.4 */
+
+
+static void Autocorrelation (
+ word * s, /* [0..159] IN/OUT */
+ longword * L_ACF) /* [0..8] OUT */
+/*
+ * The goal is to compute the array L_ACF[k]. The signal s[i] must
+ * be scaled in order to avoid an overflow situation.
+ */
+{
+ register int k, i;
+
+ word temp, smax, scalauto;
+
+#ifdef USE_FLOAT_MUL
+ float float_s[160];
+#endif
+
+ /* Dynamic scaling of the array s[0..159]
+ */
+
+ /* Search for the maximum.
+ */
+ smax = 0;
+ for (k = 0; k <= 159; k++) {
+ temp = GSM_ABS( s[k] );
+ if (temp > smax) smax = temp;
+ }
+
+ /* Computation of the scaling factor.
+ */
+ if (smax == 0) scalauto = 0;
+ else {
+ assert(smax > 0);
+ scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */
+ }
+
+ /* Scaling of the array s[0...159]
+ */
+
+ if (scalauto > 0) {
+
+# ifdef USE_FLOAT_MUL
+# define SCALE(n) \
+ case n: for (k = 0; k <= 159; k++) \
+ float_s[k] = (float) \
+ (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\
+ break;
+# else
+# define SCALE(n) \
+ case n: for (k = 0; k <= 159; k++) \
+ s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\
+ break;
+# endif /* USE_FLOAT_MUL */
+
+ switch (scalauto) {
+ SCALE(1)
+ SCALE(2)
+ SCALE(3)
+ SCALE(4)
+ }
+# undef SCALE
+ }
+# ifdef USE_FLOAT_MUL
+ else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
+# endif
+
+ /* Compute the L_ACF[..].
+ */
+ {
+# ifdef USE_FLOAT_MUL
+ register float * sp = float_s;
+ register float sl = *sp;
+
+# define STEP(k) L_ACF[k] += (longword)(sl * sp[ -(k) ]);
+# else
+ word * sp = s;
+ word sl = *sp;
+
+# define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]);
+# endif
+
+# define NEXTI sl = *++sp
+
+
+ for (k = 9; k--; L_ACF[k] = 0) ;
+
+ STEP (0);
+ NEXTI;
+ STEP(0); STEP(1);
+ NEXTI;
+ STEP(0); STEP(1); STEP(2);
+ NEXTI;
+ STEP(0); STEP(1); STEP(2); STEP(3);
+ NEXTI;
+ STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);
+ NEXTI;
+ STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
+ NEXTI;
+ STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
+ NEXTI;
+ STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
+
+ for (i = 8; i <= 159; i++) {
+
+ NEXTI;
+
+ STEP(0);
+ STEP(1); STEP(2); STEP(3); STEP(4);
+ STEP(5); STEP(6); STEP(7); STEP(8);
+ }
+
+ for (k = 9; k--; L_ACF[k] <<= 1) ;
+
+ }
+ /* Rescaling of the array s[0..159]
+ */
+ if (scalauto > 0) {
+ assert(scalauto <= 4);
+ for (k = 160; k--; *s++ <<= scalauto) ;
+ }
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Autocorrelation (
+ word * s, /* [0..159] IN/OUT */
+ longword * L_ACF) /* [0..8] OUT */
+{
+ register int k, i;
+ float f_L_ACF[9];
+ float scale;
+
+ float s_f[160];
+ register float *sf = s_f;
+
+ for (i = 0; i < 160; ++i) sf[i] = s[i];
+ for (k = 0; k <= 8; k++) {
+ register float L_temp2 = 0;
+ register float *sfl = sf - k;
+ for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];
+ f_L_ACF[k] = L_temp2;
+ }
+ scale = MAX_LONGWORD / f_L_ACF[0];
+
+ for (k = 0; k <= 8; k++) {
+ L_ACF[k] = f_L_ACF[k] * scale;
+ }
+}
+#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */
+
+/* 4.2.5 */
+
+static void Reflection_coefficients (
+ longword * L_ACF, /* 0...8 IN */
+ register word * r /* 0...7 OUT */
+)
+{
+ register int i, m, n;
+ register word temp;
+ word ACF[9]; /* 0..8 */
+ word P[ 9]; /* 0..8 */
+ word K[ 9]; /* 2..8 */
+
+ /* Schur recursion with 16 bits arithmetic.
+ */
+
+ if (L_ACF[0] == 0) {
+ for (i = 8; i--; *r++ = 0) ;
+ return;
+ }
+
+ assert( L_ACF[0] != 0 );
+ temp = gsm_norm( L_ACF[0] );
+
+ assert(temp >= 0 && temp < 32);
+
+ /* ? overflow ? */
+ for (i = 0; i <= 8; i++) ACF[i] = SASR_L( L_ACF[i] << temp, 16 );
+
+ /* Initialize array P[..] and K[..] for the recursion.
+ */
+
+ for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];
+ for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];
+
+ /* Compute reflection coefficients
+ */
+ for (n = 1; n <= 8; n++, r++) {
+
+ temp = P[1];
+ temp = GSM_ABS(temp);
+ if (P[0] < temp) {
+ for (i = n; i <= 8; i++) *r++ = 0;
+ return;
+ }
+
+ *r = gsm_div( temp, P[0] );
+
+ assert(*r >= 0);
+ if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */
+ assert (*r != MIN_WORD);
+ if (n == 8) return;
+
+ /* Schur recursion
+ */
+ temp = GSM_MULT_R( P[1], *r );
+ P[0] = GSM_ADD( P[0], temp );
+
+ for (m = 1; m <= 8 - n; m++) {
+ temp = GSM_MULT_R( K[ m ], *r );
+ P[m] = GSM_ADD( P[ m+1 ], temp );
+
+ temp = GSM_MULT_R( P[ m+1 ], *r );
+ K[m] = GSM_ADD( K[ m ], temp );
+ }
+ }
+}
+
+/* 4.2.6 */
+
+static void Transformation_to_Log_Area_Ratios (
+ register word * r /* 0..7 IN/OUT */
+)
+/*
+ * The following scaling for r[..] and LAR[..] has been used:
+ *
+ * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1.
+ * LAR[..] = integer( real_LAR[..] * 16384 );
+ * with -1.625 <= real_LAR <= 1.625
+ */
+{
+ register word temp;
+ register int i;
+
+
+ /* Computation of the LAR[0..7] from the r[0..7]
+ */
+ for (i = 1; i <= 8; i++, r++) {
+
+ temp = *r;
+ temp = GSM_ABS(temp);
+ assert(temp >= 0);
+
+ if (temp < 22118) {
+ temp >>= 1;
+ } else if (temp < 31130) {
+ assert( temp >= 11059 );
+ temp -= 11059;
+ } else {
+ assert( temp >= 26112 );
+ temp -= 26112;
+ temp <<= 2;
+ }
+
+ *r = *r < 0 ? -temp : temp;
+ assert( *r != MIN_WORD );
+ }
+}
+
+/* 4.2.7 */
+
+static void Quantization_and_coding (
+ register word * LAR /* [0..7] IN/OUT */
+)
+{
+ register word temp;
+
+ /* This procedure needs four tables; the following equations
+ * give the optimum scaling for the constants:
+ *
+ * A[0..7] = integer( real_A[0..7] * 1024 )
+ * B[0..7] = integer( real_B[0..7] * 512 )
+ * MAC[0..7] = maximum of the LARc[0..7]
+ * MIC[0..7] = minimum of the LARc[0..7]
+ */
+
+# undef STEP
+# define STEP( A, B, MAC, MIC ) \
+ temp = GSM_MULT( A, *LAR ); \
+ temp = GSM_ADD( temp, B ); \
+ temp = GSM_ADD( temp, 256 ); \
+ temp = SASR_W( temp, 9 ); \
+ *LAR = temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \
+ LAR++;
+
+ STEP( 20480, 0, 31, -32 );
+ STEP( 20480, 0, 31, -32 );
+ STEP( 20480, 2048, 15, -16 );
+ STEP( 20480, -2560, 15, -16 );
+
+ STEP( 13964, 94, 7, -8 );
+ STEP( 15360, -1792, 7, -8 );
+ STEP( 8534, -341, 3, -4 );
+ STEP( 9036, -1144, 3, -4 );
+
+# undef STEP
+}
+
+void Gsm_LPC_Analysis (
+ struct gsm_state *S,
+ word * s, /* 0..159 signals IN/OUT */
+ word * LARc) /* 0..7 LARc's OUT */
+{
+ longword L_ACF[9];
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+ if (S->fast) Fast_Autocorrelation (s, L_ACF );
+ else
+#endif
+ Autocorrelation (s, L_ACF );
+ Reflection_coefficients (L_ACF, LARc );
+ Transformation_to_Log_Area_Ratios (LARc);
+ Quantization_and_coding (LARc);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 63146664-a002-4e1e-8b7b-f0cc8a6a53da
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/preprocess.c b/orkbasecxx/filters/gsm/gsm610/preprocess.c new file mode 100644 index 0000000..e826f0f8 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/preprocess.c @@ -0,0 +1,115 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION
+ *
+ * After A-law to linear conversion (or directly from the
+ * Ato D converter) the following scaling is assumed for
+ * input to the RPE-LTP algorithm:
+ *
+ * in: 0.1.....................12
+ * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
+ *
+ * Where S is the sign bit, v a valid bit, and * a "don't care" bit.
+ * The original signal is called sop[..]
+ *
+ * out: 0.1................... 12
+ * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
+ */
+
+
+void Gsm_Preprocess (
+ struct gsm_state * S,
+ word * s,
+ word * so ) /* [0..159] IN/OUT */
+{
+
+ word z1 = S->z1;
+ longword L_z2 = S->L_z2;
+ word mp = S->mp;
+
+ word s1;
+ longword L_s2;
+
+ longword L_temp;
+
+ word msp, lsp;
+ word SO;
+
+ register int k = 160;
+
+ while (k--) {
+
+ /* 4.2.1 Downscaling of the input signal
+ */
+ SO = SASR_W( *s, 3 ) << 2;
+ s++;
+
+ assert (SO >= -0x4000); /* downscaled by */
+ assert (SO <= 0x3FFC); /* previous routine. */
+
+
+ /* 4.2.2 Offset compensation
+ *
+ * This part implements a high-pass filter and requires extended
+ * arithmetic precision for the recursive part of this filter.
+ * The input of this procedure is the array so[0...159] and the
+ * output the array sof[ 0...159 ].
+ */
+ /* Compute the non-recursive part
+ */
+
+ s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */
+ z1 = SO;
+
+ assert(s1 != MIN_WORD);
+
+ /* Compute the recursive part
+ */
+ L_s2 = s1;
+ L_s2 <<= 15;
+
+ /* Execution of a 31 bv 16 bits multiplication
+ */
+
+ msp = SASR_L( L_z2, 15 );
+ lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */
+
+ L_s2 += GSM_MULT_R( lsp, 32735 );
+ L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
+ L_z2 = GSM_L_ADD( L_temp, L_s2 );
+
+ /* Compute sof[k] with rounding
+ */
+ L_temp = GSM_L_ADD( L_z2, 16384 );
+
+ /* 4.2.3 Preemphasis
+ */
+
+ msp = GSM_MULT_R( mp, -28180 );
+ mp = SASR_L( L_temp, 15 );
+ *so++ = GSM_ADD( mp, msp );
+ }
+
+ S->z1 = z1;
+ S->L_z2 = L_z2;
+ S->mp = mp;
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: b760b0d9-3a05-4da3-9dc9-441ffb905d87
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/rpe.c b/orkbasecxx/filters/gsm/gsm610/rpe.c new file mode 100644 index 0000000..901d2f7 --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/rpe.c @@ -0,0 +1,490 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION
+ */
+
+/* 4.2.13 */
+
+static void Weighting_filter (
+ register word * e, /* signal [-5..0.39.44] IN */
+ word * x /* signal [0..39] OUT */
+)
+/*
+ * The coefficients of the weighting filter are stored in a table
+ * (see table 4.4). The following scaling is used:
+ *
+ * H[0..10] = integer( real_H[ 0..10] * 8192 );
+ */
+{
+ /* word wt[ 50 ]; */
+
+ register longword L_result;
+ register int k /* , i */ ;
+
+ /* Initialization of a temporary working array wt[0...49]
+ */
+
+ /* for (k = 0; k <= 4; k++) wt[k] = 0;
+ * for (k = 5; k <= 44; k++) wt[k] = *e++;
+ * for (k = 45; k <= 49; k++) wt[k] = 0;
+ *
+ * (e[-5..-1] and e[40..44] are allocated by the caller,
+ * are initially zero and are not written anywhere.)
+ */
+ e -= 5;
+
+ /* Compute the signal x[0..39]
+ */
+ for (k = 0; k <= 39; k++) {
+
+ L_result = 8192 >> 1;
+
+ /* for (i = 0; i <= 10; i++) {
+ * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] );
+ * L_result = GSM_L_ADD( L_result, L_temp );
+ * }
+ */
+
+#undef STEP
+#define STEP( i, H ) (e[ k + i ] * (longword)H)
+
+ /* Every one of these multiplications is done twice --
+ * but I don't see an elegant way to optimize this.
+ * Do you?
+ */
+
+#ifdef STUPID_COMPILER
+ L_result += STEP( 0, -134 ) ;
+ L_result += STEP( 1, -374 ) ;
+ /* + STEP( 2, 0 ) */
+ L_result += STEP( 3, 2054 ) ;
+ L_result += STEP( 4, 5741 ) ;
+ L_result += STEP( 5, 8192 ) ;
+ L_result += STEP( 6, 5741 ) ;
+ L_result += STEP( 7, 2054 ) ;
+ /* + STEP( 8, 0 ) */
+ L_result += STEP( 9, -374 ) ;
+ L_result += STEP( 10, -134 ) ;
+#else
+ L_result +=
+ STEP( 0, -134 )
+ + STEP( 1, -374 )
+ /* + STEP( 2, 0 ) */
+ + STEP( 3, 2054 )
+ + STEP( 4, 5741 )
+ + STEP( 5, 8192 )
+ + STEP( 6, 5741 )
+ + STEP( 7, 2054 )
+ /* + STEP( 8, 0 ) */
+ + STEP( 9, -374 )
+ + STEP(10, -134 )
+ ;
+#endif
+
+ /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)
+ * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)
+ *
+ * x[k] = SASR( L_result, 16 );
+ */
+
+ /* 2 adds vs. >>16 => 14, minus one shift to compensate for
+ * those we lost when replacing L_MULT by '*'.
+ */
+
+ L_result = SASR_L( L_result, 13 );
+ x[k] = ( L_result < MIN_WORD ? MIN_WORD
+ : (L_result > MAX_WORD ? MAX_WORD : L_result ));
+ }
+}
+
+/* 4.2.14 */
+
+static void RPE_grid_selection (
+ word * x, /* [0..39] IN */
+ word * xM, /* [0..12] OUT */
+ word * Mc_out /* OUT */
+)
+/*
+ * The signal x[0..39] is used to select the RPE grid which is
+ * represented by Mc.
+ */
+{
+ /* register word temp1; */
+ register int /* m, */ i;
+ register longword L_result, L_temp;
+ longword EM; /* xxx should be L_EM? */
+ word Mc;
+
+ longword L_common_0_3;
+
+ EM = 0;
+ Mc = 0;
+
+ /* for (m = 0; m <= 3; m++) {
+ * L_result = 0;
+ *
+ *
+ * for (i = 0; i <= 12; i++) {
+ *
+ * temp1 = SASR_W( x[m + 3*i], 2 );
+ *
+ * assert(temp1 != MIN_WORD);
+ *
+ * L_temp = GSM_L_MULT( temp1, temp1 );
+ * L_result = GSM_L_ADD( L_temp, L_result );
+ * }
+ *
+ * if (L_result > EM) {
+ * Mc = m;
+ * EM = L_result;
+ * }
+ * }
+ */
+
+#undef STEP
+#define STEP( m, i ) L_temp = SASR_W( x[m + 3 * i], 2 ); \
+ L_result += L_temp * L_temp;
+
+ /* common part of 0 and 3 */
+
+ L_result = 0;
+ STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
+ STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
+ STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
+ L_common_0_3 = L_result;
+
+ /* i = 0 */
+
+ STEP( 0, 0 );
+ L_result <<= 1; /* implicit in L_MULT */
+ EM = L_result;
+
+ /* i = 1 */
+
+ L_result = 0;
+ STEP( 1, 0 );
+ STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
+ STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
+ STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
+ L_result <<= 1;
+ if (L_result > EM) {
+ Mc = 1;
+ EM = L_result;
+ }
+
+ /* i = 2 */
+
+ L_result = 0;
+ STEP( 2, 0 );
+ STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
+ STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
+ STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
+ L_result <<= 1;
+ if (L_result > EM) {
+ Mc = 2;
+ EM = L_result;
+ }
+
+ /* i = 3 */
+
+ L_result = L_common_0_3;
+ STEP( 3, 12 );
+ L_result <<= 1;
+ if (L_result > EM) {
+ Mc = 3;
+ EM = L_result;
+ }
+
+ /**/
+
+ /* Down-sampling by a factor 3 to get the selected xM[0..12]
+ * RPE sequence.
+ */
+ for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];
+ *Mc_out = Mc;
+}
+
+/* 4.12.15 */
+
+static void APCM_quantization_xmaxc_to_exp_mant (
+ word xmaxc, /* IN */
+ word * expon_out, /* OUT */
+ word * mant_out ) /* OUT */
+{
+ word expon, mant;
+
+ /* Compute expononent and mantissa of the decoded version of xmaxc
+ */
+
+ expon = 0;
+ if (xmaxc > 15) expon = SASR_W(xmaxc, 3) - 1;
+ mant = xmaxc - (expon << 3);
+
+ if (mant == 0) {
+ expon = -4;
+ mant = 7;
+ }
+ else {
+ while (mant <= 7) {
+ mant = mant << 1 | 1;
+ expon--;
+ }
+ mant -= 8;
+ }
+
+ assert( expon >= -4 && expon <= 6 );
+ assert( mant >= 0 && mant <= 7 );
+
+ *expon_out = expon;
+ *mant_out = mant;
+}
+
+static void APCM_quantization (
+ word * xM, /* [0..12] IN */
+ word * xMc, /* [0..12] OUT */
+ word * mant_out, /* OUT */
+ word * expon_out, /* OUT */
+ word * xmaxc_out /* OUT */
+)
+{
+ int i, itest;
+
+ word xmax, xmaxc, temp, temp1, temp2;
+ word expon, mant;
+
+
+ /* Find the maximum absolute value xmax of xM[0..12].
+ */
+
+ xmax = 0;
+ for (i = 0; i <= 12; i++) {
+ temp = xM[i];
+ temp = GSM_ABS(temp);
+ if (temp > xmax) xmax = temp;
+ }
+
+ /* Qantizing and coding of xmax to get xmaxc.
+ */
+
+ expon = 0;
+ temp = SASR_W( xmax, 9 );
+ itest = 0;
+
+ for (i = 0; i <= 5; i++) {
+
+ itest |= (temp <= 0);
+ temp = SASR_W( temp, 1 );
+
+ assert(expon <= 5);
+ if (itest == 0) expon++; /* expon = add (expon, 1) */
+ }
+
+ assert(expon <= 6 && expon >= 0);
+ temp = expon + 5;
+
+ assert(temp <= 11 && temp >= 0);
+ xmaxc = gsm_add( SASR_W(xmax, temp), (word) (expon << 3) );
+
+ /* Quantizing and coding of the xM[0..12] RPE sequence
+ * to get the xMc[0..12]
+ */
+
+ APCM_quantization_xmaxc_to_exp_mant( xmaxc, &expon, &mant );
+
+ /* This computation uses the fact that the decoded version of xmaxc
+ * can be calculated by using the expononent and the mantissa part of
+ * xmaxc (logarithmic table).
+ * So, this method avoids any division and uses only a scaling
+ * of the RPE samples by a function of the expononent. A direct
+ * multiplication by the inverse of the mantissa (NRFAC[0..7]
+ * found in table 4.5) gives the 3 bit coded version xMc[0..12]
+ * of the RPE samples.
+ */
+
+
+ /* Direct computation of xMc[0..12] using table 4.5
+ */
+
+ assert( expon <= 4096 && expon >= -4096);
+ assert( mant >= 0 && mant <= 7 );
+
+ temp1 = 6 - expon; /* normalization by the expononent */
+ temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */
+
+ for (i = 0; i <= 12; i++) {
+
+ assert(temp1 >= 0 && temp1 < 16);
+
+ temp = xM[i] << temp1;
+ temp = GSM_MULT( temp, temp2 );
+ temp = SASR_W(temp, 12);
+ xMc[i] = temp + 4; /* see note below */
+ }
+
+ /* NOTE: This equation is used to make all the xMc[i] positive.
+ */
+
+ *mant_out = mant;
+ *expon_out = expon;
+ *xmaxc_out = xmaxc;
+}
+
+/* 4.2.16 */
+
+static void APCM_inverse_quantization (
+ register word * xMc, /* [0..12] IN */
+ word mant,
+ word expon,
+ register word * xMp) /* [0..12] OUT */
+/*
+ * This part is for decoding the RPE sequence of coded xMc[0..12]
+ * samples to obtain the xMp[0..12] array. Table 4.6 is used to get
+ * the mantissa of xmaxc (FAC[0..7]).
+ */
+{
+ int i;
+ word temp, temp1, temp2, temp3;
+
+ assert( mant >= 0 && mant <= 7 );
+
+ temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */
+ temp2 = gsm_sub( 6, expon ); /* see 4.2-15 for exp */
+ temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));
+
+ for (i = 13; i--;) {
+
+ assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */
+
+ /* temp = gsm_sub( *xMc++ << 1, 7 ); */
+ temp = (*xMc++ << 1) - 7; /* restore sign */
+ assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */
+
+ temp <<= 12; /* 16 bit signed */
+ temp = GSM_MULT_R( temp1, temp );
+ temp = GSM_ADD( temp, temp3 );
+ *xMp++ = gsm_asr( temp, temp2 );
+ }
+}
+
+/* 4.2.17 */
+
+static void RPE_grid_positioning (
+ word Mc, /* grid position IN */
+ register word * xMp, /* [0..12] IN */
+ register word * ep /* [0..39] OUT */
+)
+/*
+ * This procedure computes the reconstructed long term residual signal
+ * ep[0..39] for the LTP analysis filter. The inputs are the Mc
+ * which is the grid position selection and the xMp[0..12] decoded
+ * RPE samples which are upsampled by a factor of 3 by inserting zero
+ * values.
+ */
+{
+ int i = 13;
+
+ assert(0 <= Mc && Mc <= 3);
+
+ switch (Mc) {
+ case 3: *ep++ = 0;
+ case 2: do {
+ *ep++ = 0;
+ case 1: *ep++ = 0;
+ case 0: *ep++ = *xMp++;
+ } while (--i);
+ }
+ while (++Mc < 4) *ep++ = 0;
+
+ /*
+
+ int i, k;
+ for (k = 0; k <= 39; k++) ep[k] = 0;
+ for (i = 0; i <= 12; i++) {
+ ep[ Mc + (3*i) ] = xMp[i];
+ }
+ */
+}
+
+/* 4.2.18 */
+
+/* This procedure adds the reconstructed long term residual signal
+ * ep[0..39] to the estimated signal dpp[0..39] from the long term
+ * analysis filter to compute the reconstructed short term residual
+ * signal dp[-40..-1]; also the reconstructed short term residual
+ * array dp[-120..-41] is updated.
+ */
+
+#if 0 /* Has been inlined in code.c */
+void Gsm_Update_of_reconstructed_short_time_residual_signal (
+ word * dpp, /* [0...39] IN */
+ word * ep, /* [0...39] IN */
+ word * dp) /* [-120...-1] IN/OUT */
+{
+ int k;
+
+ for (k = 0; k <= 79; k++)
+ dp[ -120 + k ] = dp[ -80 + k ];
+
+ for (k = 0; k <= 39; k++)
+ dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );
+}
+#endif /* Has been inlined in code.c */
+
+void Gsm_RPE_Encoding (
+ /*-struct gsm_state * S,-*/
+
+ word * e, /* -5..-1][0..39][40..44 IN/OUT */
+ word * xmaxc, /* OUT */
+ word * Mc, /* OUT */
+ word * xMc) /* [0..12] OUT */
+{
+ word x[40];
+ word xM[13], xMp[13];
+ word mant, expon;
+
+ Weighting_filter(e, x);
+ RPE_grid_selection(x, xM, Mc);
+
+ APCM_quantization( xM, xMc, &mant, &expon, xmaxc);
+ APCM_inverse_quantization( xMc, mant, expon, xMp);
+
+ RPE_grid_positioning( *Mc, xMp, e );
+
+}
+
+void Gsm_RPE_Decoding (
+ /*-struct gsm_state * S,-*/
+
+ word xmaxcr,
+ word Mcr,
+ word * xMcr, /* [0..12], 3 bits IN */
+ word * erp /* [0..39] OUT */
+)
+{
+ word expon, mant;
+ word xMp[ 13 ];
+
+ APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &expon, &mant );
+ APCM_inverse_quantization( xMcr, mant, expon, xMp );
+ RPE_grid_positioning( Mcr, xMp, erp );
+
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 82005b9e-1560-4e94-9ddb-00cb14867295
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/short_term.c b/orkbasecxx/filters/gsm/gsm610/short_term.c new file mode 100644 index 0000000..ac0c09a --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/short_term.c @@ -0,0 +1,427 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+/*
+ * SHORT TERM ANALYSIS FILTERING SECTION
+ */
+
+/* 4.2.8 */
+
+static void Decoding_of_the_coded_Log_Area_Ratios (
+ word * LARc, /* coded log area ratio [0..7] IN */
+ word * LARpp) /* out: decoded .. */
+{
+ register word temp1 /* , temp2 */;
+
+ /* This procedure requires for efficient implementation
+ * two tables.
+ *
+ * INVA[1..8] = integer( (32768 * 8) / real_A[1..8])
+ * MIC[1..8] = minimum value of the LARc[1..8]
+ */
+
+ /* Compute the LARpp[1..8]
+ */
+
+ /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {
+ *
+ * temp1 = GSM_ADD( *LARc, *MIC ) << 10;
+ * temp2 = *B << 1;
+ * temp1 = GSM_SUB( temp1, temp2 );
+ *
+ * assert(*INVA != MIN_WORD);
+ *
+ * temp1 = GSM_MULT_R( *INVA, temp1 );
+ * *LARpp = GSM_ADD( temp1, temp1 );
+ * }
+ */
+
+#undef STEP
+#define STEP( B, MIC, INVA ) \
+ temp1 = GSM_ADD( *LARc++, MIC ) << 10; \
+ temp1 = GSM_SUB( temp1, B << 1 ); \
+ temp1 = GSM_MULT_R( INVA, temp1 ); \
+ *LARpp++ = GSM_ADD( temp1, temp1 );
+
+ STEP( 0, -32, 13107 );
+ STEP( 0, -32, 13107 );
+ STEP( 2048, -16, 13107 );
+ STEP( -2560, -16, 13107 );
+
+ STEP( 94, -8, 19223 );
+ STEP( -1792, -8, 17476 );
+ STEP( -341, -4, 31454 );
+ STEP( -1144, -4, 29708 );
+
+ /* NOTE: the addition of *MIC is used to restore
+ * the sign of *LARc.
+ */
+}
+
+/* 4.2.9 */
+/* Computation of the quantized reflection coefficients
+ */
+
+/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8]
+ */
+
+/*
+ * Within each frame of 160 analyzed speech samples the short term
+ * analysis and synthesis filters operate with four different sets of
+ * coefficients, derived from the previous set of decoded LARs(LARpp(j-1))
+ * and the actual set of decoded LARs (LARpp(j))
+ *
+ * (Initial value: LARpp(j-1)[1..8] = 0.)
+ */
+
+static void Coefficients_0_12 (
+ register word * LARpp_j_1,
+ register word * LARpp_j,
+ register word * LARp)
+{
+ register int i;
+
+ for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
+ *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
+ *LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j_1, 1));
+ }
+}
+
+static void Coefficients_13_26 (
+ register word * LARpp_j_1,
+ register word * LARpp_j,
+ register word * LARp)
+{
+ register int i;
+ for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+ *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 1), SASR_W( *LARpp_j, 1 ));
+ }
+}
+
+static void Coefficients_27_39 (
+ register word * LARpp_j_1,
+ register word * LARpp_j,
+ register word * LARp)
+{
+ register int i;
+
+ for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+ *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
+ *LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j, 1 ));
+ }
+}
+
+
+static void Coefficients_40_159 (
+ register word * LARpp_j,
+ register word * LARp)
+{
+ register int i;
+
+ for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
+ *LARp = *LARpp_j;
+}
+
+/* 4.2.9.2 */
+
+static void LARp_to_rp (
+ register word * LARp) /* [0..7] IN/OUT */
+/*
+ * The input of this procedure is the interpolated LARp[0..7] array.
+ * The reflection coefficients, rp[i], are used in the analysis
+ * filter and in the synthesis filter.
+ */
+{
+ register int i;
+ register word temp;
+
+ for (i = 1; i <= 8; i++, LARp++) {
+
+ /* temp = GSM_ABS( *LARp );
+ *
+ * if (temp < 11059) temp <<= 1;
+ * else if (temp < 20070) temp += 11059;
+ * else temp = GSM_ADD( temp >> 2, 26112 );
+ *
+ * *LARp = *LARp < 0 ? -temp : temp;
+ */
+
+ if (*LARp < 0) {
+ temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
+ *LARp = - ((temp < 11059) ? temp << 1
+ : ((temp < 20070) ? temp + 11059
+ : GSM_ADD( (word) (temp >> 2), (word) 26112 )));
+ } else {
+ temp = *LARp;
+ *LARp = (temp < 11059) ? temp << 1
+ : ((temp < 20070) ? temp + 11059
+ : GSM_ADD( (word) (temp >> 2), (word) 26112 ));
+ }
+ }
+}
+
+
+/* 4.2.10 */
+static void Short_term_analysis_filtering (
+ struct gsm_state * S,
+ register word * rp, /* [0..7] IN */
+ register int k_n, /* k_end - k_start */
+ register word * s /* [0..n-1] IN/OUT */
+)
+/*
+ * This procedure computes the short term residual signal d[..] to be fed
+ * to the RPE-LTP loop from the s[..] signal and from the local rp[..]
+ * array (quantized reflection coefficients). As the call of this
+ * procedure can be done in many ways (see the interpolation of the LAR
+ * coefficient), it is assumed that the computation begins with index
+ * k_start (for arrays d[..] and s[..]) and stops with index k_end
+ * (k_start and k_end are defined in 4.2.9.1). This procedure also
+ * needs to keep the array u[0..7] in memory for each call.
+ */
+{
+ register word * u = S->u;
+ register int i;
+ register word di, zzz, ui, sav, rpi;
+
+ for (; k_n--; s++) {
+
+ di = sav = *s;
+
+ for (i = 0; i < 8; i++) { /* YYY */
+
+ ui = u[i];
+ rpi = rp[i];
+ u[i] = sav;
+
+ zzz = GSM_MULT_R(rpi, di);
+ sav = GSM_ADD( ui, zzz);
+
+ zzz = GSM_MULT_R(rpi, ui);
+ di = GSM_ADD( di, zzz );
+ }
+
+ *s = di;
+ }
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Short_term_analysis_filtering (
+ struct gsm_state * S,
+ register word * rp, /* [0..7] IN */
+ register int k_n, /* k_end - k_start */
+ register word * s /* [0..n-1] IN/OUT */
+)
+{
+ register word * u = S->u;
+ register int i;
+
+ float uf[8],
+ rpf[8];
+
+ register float scalef = 3.0517578125e-5;
+ register float sav, di, temp;
+
+ for (i = 0; i < 8; ++i) {
+ uf[i] = u[i];
+ rpf[i] = rp[i] * scalef;
+ }
+ for (; k_n--; s++) {
+ sav = di = *s;
+ for (i = 0; i < 8; ++i) {
+ register float rpfi = rpf[i];
+ register float ufi = uf[i];
+
+ uf[i] = sav;
+ temp = rpfi * di + ufi;
+ di += rpfi * ufi;
+ sav = temp;
+ }
+ *s = di;
+ }
+ for (i = 0; i < 8; ++i) u[i] = uf[i];
+}
+#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
+
+static void Short_term_synthesis_filtering (
+ struct gsm_state * S,
+ register word * rrp, /* [0..7] IN */
+ register int k, /* k_end - k_start */
+ register word * wt, /* [0..k-1] IN */
+ register word * sr /* [0..k-1] OUT */
+)
+{
+ register word * v = S->v;
+ register int i;
+ register word sri, tmp1, tmp2;
+
+ while (k--) {
+ sri = *wt++;
+ for (i = 8; i--;) {
+
+ /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
+ */
+ tmp1 = rrp[i];
+ tmp2 = v[i];
+ tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
+ ? MAX_WORD
+ : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
+ + 16384) >> 15)) ;
+
+ sri = GSM_SUB( sri, tmp2 );
+
+ /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
+ */
+ tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD
+ ? MAX_WORD
+ : 0x0FFFF & (( (longword)tmp1 * (longword)sri
+ + 16384) >> 15)) ;
+
+ v[i+1] = GSM_ADD( v[i], tmp1);
+ }
+ *sr++ = v[0] = sri;
+ }
+}
+
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+
+static void Fast_Short_term_synthesis_filtering (
+ struct gsm_state * S,
+ register word * rrp, /* [0..7] IN */
+ register int k, /* k_end - k_start */
+ register word * wt, /* [0..k-1] IN */
+ register word * sr /* [0..k-1] OUT */
+)
+{
+ register word * v = S->v;
+ register int i;
+
+ float va[9], rrpa[8];
+ register float scalef = 3.0517578125e-5, temp;
+
+ for (i = 0; i < 8; ++i) {
+ va[i] = v[i];
+ rrpa[i] = (float)rrp[i] * scalef;
+ }
+ while (k--) {
+ register float sri = *wt++;
+ for (i = 8; i--;) {
+ sri -= rrpa[i] * va[i];
+ if (sri < -32768.) sri = -32768.;
+ else if (sri > 32767.) sri = 32767.;
+
+ temp = va[i] + rrpa[i] * sri;
+ if (temp < -32768.) temp = -32768.;
+ else if (temp > 32767.) temp = 32767.;
+ va[i+1] = temp;
+ }
+ *sr++ = va[0] = sri;
+ }
+ for (i = 0; i < 9; ++i) v[i] = va[i];
+}
+
+#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */
+
+void Gsm_Short_Term_Analysis_Filter (
+
+ struct gsm_state * S,
+
+ word * LARc, /* coded log area ratio [0..7] IN */
+ word * s /* signal [0..159] IN/OUT */
+)
+{
+ word * LARpp_j = S->LARpp[ S->j ];
+ word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ];
+
+ word LARp[8];
+
+#undef FILTER
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+# define FILTER (* (S->fast \
+ ? Fast_Short_term_analysis_filtering \
+ : Short_term_analysis_filtering ))
+
+#else
+# define FILTER Short_term_analysis_filtering
+#endif
+
+ Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
+
+ Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
+ LARp_to_rp( LARp );
+ FILTER( S, LARp, 13, s);
+
+ Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+ LARp_to_rp( LARp );
+ FILTER( S, LARp, 14, s + 13);
+
+ Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+ LARp_to_rp( LARp );
+ FILTER( S, LARp, 13, s + 27);
+
+ Coefficients_40_159( LARpp_j, LARp);
+ LARp_to_rp( LARp );
+ FILTER( S, LARp, 120, s + 40);
+}
+
+void Gsm_Short_Term_Synthesis_Filter (
+ struct gsm_state * S,
+
+ word * LARcr, /* received log area ratios [0..7] IN */
+ word * wt, /* received d [0..159] IN */
+
+ word * s /* signal s [0..159] OUT */
+)
+{
+ word * LARpp_j = S->LARpp[ S->j ];
+ word * LARpp_j_1 = S->LARpp[ S->j ^=1 ];
+
+ word LARp[8];
+
+#undef FILTER
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+
+# define FILTER (* (S->fast \
+ ? Fast_Short_term_synthesis_filtering \
+ : Short_term_synthesis_filtering ))
+#else
+# define FILTER Short_term_synthesis_filtering
+#endif
+
+ Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
+
+ Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
+ LARp_to_rp( LARp );
+ FILTER( S, LARp, 13, wt, s );
+
+ Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+ LARp_to_rp( LARp );
+ FILTER( S, LARp, 14, wt + 13, s + 13 );
+
+ Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+ LARp_to_rp( LARp );
+ FILTER( S, LARp, 13, wt + 27, s + 27 );
+
+ Coefficients_40_159( LARpp_j, LARp );
+ LARp_to_rp( LARp );
+ FILTER(S, LARp, 120, wt + 40, s + 40);
+}
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 019ac7ba-c6dd-4540-abf0-8644b6c4a633
+*/
+
diff --git a/orkbasecxx/filters/gsm/gsm610/table.c b/orkbasecxx/filters/gsm/gsm610/table.c new file mode 100644 index 0000000..7da3eea --- /dev/null +++ b/orkbasecxx/filters/gsm/gsm610/table.c @@ -0,0 +1,69 @@ +/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* Most of these tables are inlined at their point of use.
+ */
+
+/* 4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP
+ * CODER AND DECODER
+ *
+ * (Most of them inlined, so watch out.)
+ */
+
+#define GSM_TABLE_C
+#include "gsm610_priv.h"
+#include "gsm.h"
+
+/* Table 4.1 Quantization of the Log.-Area Ratios
+ */
+/* i 1 2 3 4 5 6 7 8 */
+word gsm_A[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036};
+word gsm_B[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144};
+word gsm_MIC[8] = { -32, -32, -16, -16, -8, -8, -4, -4 };
+word gsm_MAC[8] = { 31, 31, 15, 15, 7, 7, 3, 3 };
+
+
+/* Table 4.2 Tabulation of 1/A[1..8]
+ */
+word gsm_INVA[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 };
+
+
+/* Table 4.3a Decision level of the LTP gain quantizer
+ */
+/* bc 0 1 2 3 */
+word gsm_DLB[4] = { 6554, 16384, 26214, 32767 };
+
+
+/* Table 4.3b Quantization levels of the LTP gain quantizer
+ */
+/* bc 0 1 2 3 */
+word gsm_QLB[4] = { 3277, 11469, 21299, 32767 };
+
+
+/* Table 4.4 Coefficients of the weighting filter
+ */
+/* i 0 1 2 3 4 5 6 7 8 9 10 */
+word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
+
+
+/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax
+ */
+/* i 0 1 2 3 4 5 6 7 */
+word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
+
+
+/* Table 4.6 Normalized direct mantissa used to compute xM/xmax
+ */
+/* i 0 1 2 3 4 5 6 7 */
+word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };
+/*
+** Do not edit or modify anything in this comment block.
+** The arch-tag line is a file identity tag for the GNU Arch
+** revision control system.
+**
+** arch-tag: 8957c531-e6b0-4097-9202-da7ca42729ca
+*/
+
|