update gsm codec based on codecs from open h323.
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@171 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
342e73399e
commit
07920c0a94
|
@ -1,51 +1,38 @@
|
|||
/*
|
||||
* config.h
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*$Header$*/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
#if 0
|
||||
efine SIGHANDLER_T int /* signal handlers are void */
|
||||
efine HAS_SYSV_SIGNAL 1 /* sigs not blocked/reset? */
|
||||
#endif
|
||||
/*efine SIGHANDLER_T int * signal handlers are void */
|
||||
/*efine HAS_SYSV_SIGNAL 1 * sigs not blocked/reset? */
|
||||
|
||||
#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */
|
||||
#if 0
|
||||
efine HAS_LIMITS_H 1 /* /usr/include/limits.h */
|
||||
#endif
|
||||
/*efine HAS_LIMITS_H 1 * /usr/include/limits.h */
|
||||
#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */
|
||||
#if 0
|
||||
efine HAS_ERRNO_DECL 1 /* errno.h declares errno */
|
||||
#endif
|
||||
/*efine HAS_ERRNO_DECL 1 * errno.h declares errno */
|
||||
|
||||
#define HAS_FSTAT 1 /* fstat syscall */
|
||||
#define HAS_FCHMOD 1 /* fchmod syscall */
|
||||
#define HAS_CHMOD 1 /* chmod syscall */
|
||||
#define HAS_FCHOWN 1 /* fchown syscall */
|
||||
#define HAS_CHOWN 1 /* chown syscall */
|
||||
#if 0
|
||||
efine HAS__FSETMODE 1 /* _fsetmode -- set file mode */
|
||||
#endif
|
||||
/*efine HAS__FSETMODE 1 * _fsetmode -- set file mode */
|
||||
|
||||
#define HAS_STRING_H 1 /* /usr/include/string.h */
|
||||
#if 0
|
||||
efine HAS_STRINGS_H 1 /* /usr/include/strings.h */
|
||||
#endif
|
||||
/*efine HAS_STRINGS_H 1 * /usr/include/strings.h */
|
||||
|
||||
#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */
|
||||
#define HAS_UTIME 1 /* POSIX utime(path, times) */
|
||||
#if 0
|
||||
efine HAS_UTIMES 1 /* use utimes() syscall instead */
|
||||
#endif
|
||||
/*efine HAS_UTIMES 1 * use utimes() syscall instead */
|
||||
#define HAS_UTIME_H 1 /* UTIME header file */
|
||||
#if 0
|
||||
efine HAS_UTIMBUF 1 /* struct utimbuf */
|
||||
efine HAS_UTIMEUSEC 1 /* microseconds in utimbuf? */
|
||||
#endif
|
||||
/*efine HAS_UTIMBUF 1 * struct utimbuf */
|
||||
/*efine HAS_UTIMEUSEC 1 * microseconds in utimbuf? */
|
||||
|
||||
#endif /* CONFIG_H */
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* gsm.h
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*$Header$*/
|
||||
|
||||
#ifndef GSM_H
|
||||
#define GSM_H
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* private.h
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*$Header$*/
|
||||
|
||||
#ifndef PRIVATE_H
|
||||
#define PRIVATE_H
|
||||
|
@ -98,49 +99,6 @@ extern word gsm_asr P((word a, int n));
|
|||
# define GSM_L_MULT(a, b) /* word a, word b */ \
|
||||
(((longword)(a) * (longword)(b)) << 1)
|
||||
|
||||
#if defined(__GNUC__) && defined(__i386__)
|
||||
|
||||
static __inline__ int GSM_L_ADD(int a, int b)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
|
||||
"addl %2,%0; jno 0f; movl $0x7fffffff,%0; adcl $0,%0; 0:"
|
||||
: "=r" (a)
|
||||
: "0" (a), "ir" (b)
|
||||
: "cc"
|
||||
);
|
||||
return(a);
|
||||
}
|
||||
|
||||
static __inline__ short GSM_ADD(short a, short b)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
"addw %2,%0; jno 0f; movw $0x7fff,%0; adcw $0,%0; 0:"
|
||||
: "=r" (a)
|
||||
: "0" (a), "ir" (b)
|
||||
: "cc"
|
||||
);
|
||||
return(a);
|
||||
}
|
||||
|
||||
static __inline__ short GSM_SUB(short a, short b)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
"subw %2,%0; jno 0f; movw $0x7fff,%0; adcw $0,%0; 0:"
|
||||
: "=r" (a)
|
||||
: "0" (a), "ir" (b)
|
||||
: "cc"
|
||||
);
|
||||
return(a);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#ifdef WIN32
|
||||
#define inline __inline
|
||||
#define __inline__ __inline
|
||||
#endif
|
||||
|
||||
# define GSM_L_ADD(a, b) \
|
||||
( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \
|
||||
: (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \
|
||||
|
@ -149,21 +107,20 @@ static __inline__ short GSM_SUB(short a, short b)
|
|||
: (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \
|
||||
? MAX_LONGWORD : utmp))
|
||||
|
||||
static inline word GSM_ADD(a, b)
|
||||
{
|
||||
register longword ltmp;
|
||||
ltmp = (longword) (a) + (longword) (b);
|
||||
return (word)((ulongword) (ltmp - MIN_WORD) > MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp);
|
||||
};
|
||||
/*
|
||||
* # define GSM_ADD(a, b) \
|
||||
* ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \
|
||||
* ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
|
||||
*/
|
||||
/* Nonportable, but faster: */
|
||||
|
||||
static inline word GSM_SUB(a, b)
|
||||
{
|
||||
register longword ltmp;
|
||||
ltmp = (longword) (a) - (longword) (b);
|
||||
return (word)(ltmp >= MAX_WORD ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp);
|
||||
};
|
||||
#define GSM_ADD(a, b) \
|
||||
((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \
|
||||
MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp)
|
||||
|
||||
#endif
|
||||
# define GSM_SUB(a, b) \
|
||||
((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \
|
||||
? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
|
||||
|
||||
# define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* proto.h
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*$Header$*/
|
||||
|
||||
#ifndef PROTO_H
|
||||
#define PROTO_H
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* unproto.h
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*$Header$*/
|
||||
|
||||
#ifdef PROTO_H /* sic */
|
||||
#undef PROTO_H
|
||||
|
|
|
@ -156,10 +156,6 @@
|
|||
RelativePath=".\src\code.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\debug.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\decode.c"
|
||||
>
|
||||
|
@ -181,29 +177,17 @@
|
|||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\gsm_explode.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\gsm_implode.c"
|
||||
RelativePath=".\src\gsm_lpc.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\gsm_option.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\gsm_print.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\long_term.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\lpc.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\preprocess.c"
|
||||
>
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* add.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
/*
|
||||
* See private.h for the more commonly used macro versions.
|
||||
|
@ -23,19 +24,19 @@
|
|||
word gsm_add P2((a,b), word a, word b)
|
||||
{
|
||||
longword sum = (longword)a + (longword)b;
|
||||
return (word)saturate(sum);
|
||||
return (word) saturate(sum);
|
||||
}
|
||||
|
||||
word gsm_sub P2((a,b), word a, word b)
|
||||
{
|
||||
longword diff = (longword)a - (longword)b;
|
||||
return (word)saturate(diff);
|
||||
return (word) saturate(diff);
|
||||
}
|
||||
|
||||
word gsm_mult P2((a,b), word a, word b)
|
||||
{
|
||||
if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;
|
||||
else return (word)SASR( (longword)a * (longword)b, 15 );
|
||||
else return (word) SASR( (longword)a * (longword)b, 15 );
|
||||
}
|
||||
|
||||
word gsm_mult_r P2((a,b), word a, word b)
|
||||
|
@ -44,7 +45,7 @@ word gsm_mult_r P2((a,b), word a, word b)
|
|||
else {
|
||||
longword prod = (longword)a * (longword)b + 16384;
|
||||
prod >>= 15;
|
||||
return (word)(prod & 0xFFFF);
|
||||
return (word) (prod & 0xFFFF);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
/*
|
||||
* code.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAS_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
# include "proto.h"
|
||||
#include "proto.h"
|
||||
extern char * memcpy P((char *, char *, int));
|
||||
#endif
|
||||
|
||||
|
@ -85,8 +86,9 @@ void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),
|
|||
*/
|
||||
|
||||
{ register int i;
|
||||
register longword ltmp;
|
||||
for (i = 0; i <= 39; i++)
|
||||
dp[ i ] = GSM_ADD( e[5 + i], dpp[i] );
|
||||
dp[ i ] = (word) GSM_ADD( e[5 + i], dpp[i] );
|
||||
}
|
||||
dp += 40;
|
||||
dpp += 40;
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "private.h"
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
/* If NDEBUG _is_ defined and no debugging should be performed,
|
||||
* calls to functions in this module are #defined to nothing
|
||||
* in private.h.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "proto.h"
|
||||
|
||||
void gsm_debug_words P4( (name, from, to, ptr),
|
||||
char * name,
|
||||
int from,
|
||||
int to,
|
||||
word * ptr)
|
||||
{
|
||||
int nprinted = 0;
|
||||
|
||||
fprintf( stderr, "%s [%d .. %d]: ", name, from, to );
|
||||
while (from <= to) {
|
||||
fprintf(stderr, "%d ", ptr[ from ] );
|
||||
from++;
|
||||
if (nprinted++ >= 7) {
|
||||
nprinted = 0;
|
||||
if (from < to) putc('\n', stderr);
|
||||
}
|
||||
}
|
||||
putc('\n', stderr);
|
||||
}
|
||||
|
||||
void gsm_debug_longwords P4( (name, from, to, ptr),
|
||||
char * name,
|
||||
int from,
|
||||
int to,
|
||||
longword * ptr)
|
||||
{
|
||||
int nprinted = 0;
|
||||
|
||||
fprintf( stderr, "%s [%d .. %d]: ", name, from, to );
|
||||
while (from <= to) {
|
||||
|
||||
fprintf(stderr, "%d ", ptr[ from ] );
|
||||
from++;
|
||||
if (nprinted++ >= 7) {
|
||||
nprinted = 0;
|
||||
if (from < to) putc('\n', stderr);
|
||||
}
|
||||
}
|
||||
putc('\n', stderr);
|
||||
}
|
||||
|
||||
void gsm_debug_longword P2( (name, value),
|
||||
char * name,
|
||||
longword value )
|
||||
{
|
||||
fprintf(stderr, "%s: %d\n", name, (long)value );
|
||||
}
|
||||
|
||||
void gsm_debug_word P2( (name, value),
|
||||
char * name,
|
||||
word value )
|
||||
{
|
||||
fprintf(stderr, "%s: %d\n", name, (long)value);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* decode.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -22,12 +23,13 @@ static void Postprocessing P2((S,s),
|
|||
{
|
||||
register int k;
|
||||
register word msr = S->msr;
|
||||
register longword ltmp; /* for GSM_ADD */
|
||||
register word tmp;
|
||||
|
||||
for (k = 160; k--; s++) {
|
||||
tmp = (word)GSM_MULT_R( msr, 28180 );
|
||||
msr = GSM_ADD(*s, tmp); /* Deemphasis */
|
||||
*s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */
|
||||
tmp = (word) GSM_MULT_R( msr, 28180 );
|
||||
msr = (word) GSM_ADD(*s, tmp); /* Deemphasis */
|
||||
*s = (word) GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */
|
||||
}
|
||||
S->msr = msr;
|
||||
}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* gsm_create.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
static char const ident[] = "$Header$";
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* gsm_decode.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "private.h"
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* gsm_destroy.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "gsm.h"
|
||||
#include "config.h"
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* gsm_encode.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "private.h"
|
||||
#include "gsm.h"
|
||||
|
|
|
@ -1,417 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "private.h"
|
||||
#include "gsm.h"
|
||||
#include "proto.h"
|
||||
|
||||
int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
|
||||
{
|
||||
# define LARc target
|
||||
# define Nc *((gsm_signal (*) [17])(target + 8))
|
||||
# define bc *((gsm_signal (*) [17])(target + 9))
|
||||
# define Mc *((gsm_signal (*) [17])(target + 10))
|
||||
# define xmaxc *((gsm_signal (*) [17])(target + 11))
|
||||
|
||||
|
||||
#ifdef WAV49
|
||||
if (s->wav_fmt) {
|
||||
|
||||
uword sr = 0;
|
||||
|
||||
if (s->frame_index == 1) {
|
||||
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (target + 12)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (target + 29 - 13)
|
||||
|
||||
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;
|
||||
|
||||
#undef xmc
|
||||
#define xmc (target + 46 - 26)
|
||||
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (target + 63 - 39)
|
||||
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (target + 12)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (target + 29 - 13)
|
||||
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (target + 46 - 26)
|
||||
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;
|
||||
|
||||
#undef xmc
|
||||
#define xmc (target + 63 - 39)
|
||||
|
||||
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;
|
||||
|
||||
#undef xmc
|
||||
#define xmc (target + 12)
|
||||
|
||||
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;
|
||||
|
||||
#undef xmc
|
||||
#define xmc (target + 29 - 13)
|
||||
|
||||
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;
|
||||
|
||||
#undef xmc
|
||||
#define xmc (target + 46 - 26)
|
||||
|
||||
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;
|
||||
|
||||
#undef xmc
|
||||
#define xmc (target + 63 - 39)
|
||||
|
||||
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 */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,515 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "private.h"
|
||||
|
||||
#include "gsm.h"
|
||||
#include "proto.h"
|
||||
|
||||
void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
|
||||
{
|
||||
/* variable size index
|
||||
|
||||
GSM_MAGIC 4 -
|
||||
|
||||
LARc[0] 6 0
|
||||
LARc[1] 6 1
|
||||
LARc[2] 5 2
|
||||
LARc[3] 5 3
|
||||
LARc[4] 4 4
|
||||
LARc[5] 4 5
|
||||
LARc[6] 3 6
|
||||
LARc[7] 3 7
|
||||
|
||||
Nc[0] 7 8
|
||||
bc[0] 2 9
|
||||
Mc[0] 2 10
|
||||
xmaxc[0] 6 11
|
||||
xmc[0] 3 12
|
||||
xmc[1] 3 13
|
||||
xmc[2] 3 14
|
||||
xmc[3] 3 15
|
||||
xmc[4] 3 16
|
||||
xmc[5] 3 17
|
||||
xmc[6] 3 18
|
||||
xmc[7] 3 19
|
||||
xmc[8] 3 20
|
||||
xmc[9] 3 21
|
||||
xmc[10] 3 22
|
||||
xmc[11] 3 23
|
||||
xmc[12] 3 24
|
||||
|
||||
Nc[1] 7 25
|
||||
bc[1] 2 26
|
||||
Mc[1] 2 27
|
||||
xmaxc[1] 6 28
|
||||
xmc[13] 3 29
|
||||
xmc[14] 3 30
|
||||
xmc[15] 3 31
|
||||
xmc[16] 3 32
|
||||
xmc[17] 3 33
|
||||
xmc[18] 3 34
|
||||
xmc[19] 3 35
|
||||
xmc[20] 3 36
|
||||
xmc[21] 3 37
|
||||
xmc[22] 3 38
|
||||
xmc[23] 3 39
|
||||
xmc[24] 3 40
|
||||
xmc[25] 3 41
|
||||
|
||||
Nc[2] 7 42
|
||||
bc[2] 2 43
|
||||
Mc[2] 2 44
|
||||
xmaxc[2] 6 45
|
||||
xmc[26] 3 46
|
||||
xmc[27] 3 47
|
||||
xmc[28] 3 48
|
||||
xmc[29] 3 49
|
||||
xmc[30] 3 50
|
||||
xmc[31] 3 51
|
||||
xmc[32] 3 52
|
||||
xmc[33] 3 53
|
||||
xmc[34] 3 54
|
||||
xmc[35] 3 55
|
||||
xmc[36] 3 56
|
||||
xmc[37] 3 57
|
||||
xmc[38] 3 58
|
||||
|
||||
Nc[3] 7 59
|
||||
bc[3] 2 60
|
||||
Mc[3] 2 61
|
||||
xmaxc[3] 6 62
|
||||
xmc[39] 3 63
|
||||
xmc[40] 3 64
|
||||
xmc[41] 3 65
|
||||
xmc[42] 3 66
|
||||
xmc[43] 3 67
|
||||
xmc[44] 3 68
|
||||
xmc[45] 3 69
|
||||
xmc[46] 3 70
|
||||
xmc[47] 3 71
|
||||
xmc[48] 3 72
|
||||
xmc[49] 3 73
|
||||
xmc[50] 3 74
|
||||
xmc[51] 3 75
|
||||
*/
|
||||
|
||||
/* There are 76 parameters per frame. The first eight are
|
||||
* unique. The remaining 68 are four identical subframes of
|
||||
* 17 parameters each. gsm_implode converts from a representation
|
||||
* of these parameters as values in one array of signed words
|
||||
* to the "packed" version of a GSM frame.
|
||||
*/
|
||||
|
||||
# define LARc source
|
||||
# define Nc *((gsm_signal (*) [17])(source + 8))
|
||||
# define bc *((gsm_signal (*) [17])(source + 9))
|
||||
# define Mc *((gsm_signal (*) [17])(source + 10))
|
||||
# define xmaxc *((gsm_signal (*) [17])(source + 11))
|
||||
|
||||
#ifdef WAV49
|
||||
if (s->wav_fmt) {
|
||||
|
||||
uword sr = 0;
|
||||
if (s->frame_index == 0) {
|
||||
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 12)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 29 - 13)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 46 - 26)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 63 - 39)
|
||||
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 12)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 29 - 13)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 46 - 26)
|
||||
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;
|
||||
#undef xmc
|
||||
#define xmc (source + 63 - 39)
|
||||
|
||||
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
|
||||
{
|
||||
|
||||
*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)
|
||||
|
||||
#undef xmc
|
||||
#define xmc (source + 12)
|
||||
|
||||
| ((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)
|
||||
|
||||
#undef xmc
|
||||
#define xmc (source + 29 - 13)
|
||||
|
||||
| ((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)
|
||||
|
||||
#undef xmc
|
||||
#define xmc (source + 46 - 26)
|
||||
|
||||
| ((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)
|
||||
|
||||
#undef xmc
|
||||
#define xmc (source + 63 - 39)
|
||||
|
||||
| ((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);
|
||||
}
|
||||
}
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* gsm_lpc.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
@ -14,10 +15,6 @@
|
|||
#include "gsm.h"
|
||||
#include "proto.h"
|
||||
|
||||
#ifdef K6OPT
|
||||
#include "k6opt.h"
|
||||
#endif
|
||||
|
||||
#undef P
|
||||
|
||||
/*
|
||||
|
@ -48,19 +45,12 @@ static void Autocorrelation P2((s, L_ACF),
|
|||
|
||||
/* Search for the maximum.
|
||||
*/
|
||||
#ifndef K6OPT
|
||||
smax = 0;
|
||||
for (k = 0; k <= 159; k++) {
|
||||
temp = GSM_ABS( s[k] );
|
||||
if (temp > smax) smax = temp;
|
||||
}
|
||||
#else
|
||||
{
|
||||
longword lmax;
|
||||
lmax = k6maxmin(s,160,NULL);
|
||||
smax = (lmax > MAX_WORD) ? MAX_WORD : lmax;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Computation of the scaling factor.
|
||||
*/
|
||||
if (smax == 0) scalauto = 0;
|
||||
|
@ -73,7 +63,6 @@ static void Autocorrelation P2((s, L_ACF),
|
|||
*/
|
||||
|
||||
if (scalauto > 0) {
|
||||
# ifndef K6OPT
|
||||
|
||||
# ifdef USE_FLOAT_MUL
|
||||
# define SCALE(n) \
|
||||
|
@ -84,7 +73,7 @@ static void Autocorrelation P2((s, L_ACF),
|
|||
# else
|
||||
# define SCALE(n) \
|
||||
case n: for (k = 0; k <= 159; k++) \
|
||||
s[k] = (word)GSM_MULT_R( s[k], 16384 >> (n-1) );\
|
||||
s[k] = (word) GSM_MULT_R( s[k], 16384 >> (n-1) );\
|
||||
break;
|
||||
# endif /* USE_FLOAT_MUL */
|
||||
|
||||
|
@ -95,10 +84,6 @@ static void Autocorrelation P2((s, L_ACF),
|
|||
SCALE(4)
|
||||
}
|
||||
# undef SCALE
|
||||
|
||||
# else /* K6OPT */
|
||||
k6vsraw(s,160,scalauto);
|
||||
# endif
|
||||
}
|
||||
# ifdef USE_FLOAT_MUL
|
||||
else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
|
||||
|
@ -106,7 +91,6 @@ static void Autocorrelation P2((s, L_ACF),
|
|||
|
||||
/* Compute the L_ACF[..].
|
||||
*/
|
||||
#ifndef K6OPT
|
||||
{
|
||||
# ifdef USE_FLOAT_MUL
|
||||
register float * sp = float_s;
|
||||
|
@ -153,24 +137,11 @@ static void Autocorrelation P2((s, L_ACF),
|
|||
for (k = 9; k--; L_ACF[k] <<= 1) ;
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
{
|
||||
int k;
|
||||
for (k=0; k<9; k++) {
|
||||
L_ACF[k] = 2*k6iprod(s,s+k,160-k);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Rescaling of the array s[0..159]
|
||||
*/
|
||||
if (scalauto > 0) {
|
||||
assert(scalauto <= 4);
|
||||
#ifndef K6OPT
|
||||
for (k = 160; k--; *s++ <<= scalauto) ;
|
||||
# else /* K6OPT */
|
||||
k6vsllw(s,160,scalauto);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -211,6 +182,7 @@ static void Reflection_coefficients P2( (L_ACF, r),
|
|||
{
|
||||
register int i, m, n;
|
||||
register word temp;
|
||||
register longword ltmp;
|
||||
word ACF[9]; /* 0..8 */
|
||||
word P[ 9]; /* 0..8 */
|
||||
word K[ 9]; /* 2..8 */
|
||||
|
@ -229,7 +201,7 @@ static void Reflection_coefficients P2( (L_ACF, r),
|
|||
assert(temp >= 0 && temp < 32);
|
||||
|
||||
/* ? overflow ? */
|
||||
for (i = 0; i <= 8; i++) ACF[i] = (word)SASR( L_ACF[i] << temp, 16 );
|
||||
for (i = 0; i <= 8; i++) ACF[i] = (word) SASR( L_ACF[i] << temp, 16 );
|
||||
|
||||
/* Initialize array P[..] and K[..] for the recursion.
|
||||
*/
|
||||
|
@ -257,15 +229,15 @@ static void Reflection_coefficients P2( (L_ACF, r),
|
|||
|
||||
/* Schur recursion
|
||||
*/
|
||||
temp = (word)GSM_MULT_R( P[1], *r );
|
||||
P[0] = GSM_ADD( P[0], temp );
|
||||
temp = (word) GSM_MULT_R( P[1], *r );
|
||||
P[0] = (word) GSM_ADD( P[0], temp );
|
||||
|
||||
for (m = 1; m <= 8 - n; m++) {
|
||||
temp = (word)GSM_MULT_R( K[ m ], *r );
|
||||
P[m] = GSM_ADD( P[ m+1 ], temp );
|
||||
temp = (word) GSM_MULT_R( K[ m ], *r );
|
||||
P[m] = (word) GSM_ADD( P[ m+1 ], temp );
|
||||
|
||||
temp = (word)GSM_MULT_R( P[ m+1 ], *r );
|
||||
K[m] = GSM_ADD( K[ m ], temp );
|
||||
temp = (word) GSM_MULT_R( P[ m+1 ], *r );
|
||||
K[m] = (word) GSM_ADD( K[ m ], temp );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -318,6 +290,7 @@ static void Quantization_and_coding P1((LAR),
|
|||
)
|
||||
{
|
||||
register word temp;
|
||||
longword ltmp;
|
||||
|
||||
|
||||
/* This procedure needs four tables; the following equations
|
||||
|
@ -332,8 +305,8 @@ static void Quantization_and_coding P1((LAR),
|
|||
# undef STEP
|
||||
# define STEP( A, B, MAC, MIC ) \
|
||||
temp = (word)GSM_MULT( A, *LAR ); \
|
||||
temp = GSM_ADD( temp, B ); \
|
||||
temp = GSM_ADD( temp, 256 ); \
|
||||
temp = (word) GSM_ADD( temp, B ); \
|
||||
temp = (word) GSM_ADD( temp, 256 ); \
|
||||
temp = (word)SASR( temp, 9 ); \
|
||||
*LAR = temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \
|
||||
LAR++;
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* gsm_option.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include "private.h"
|
||||
|
||||
|
|
|
@ -1,167 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "private.h"
|
||||
|
||||
#include "gsm.h"
|
||||
#include "proto.h"
|
||||
|
||||
int gsm_print P3((f, s, c), FILE * f, gsm s, gsm_byte * c)
|
||||
{
|
||||
word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
|
||||
|
||||
/* 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 */
|
||||
|
||||
fprintf(f,
|
||||
"LARc:\t%2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d\n",
|
||||
LARc[0],LARc[1],LARc[2],LARc[3],LARc[4],LARc[5],LARc[6],LARc[7]);
|
||||
|
||||
fprintf(f, "#1: Nc %4.4d bc %d Mc %d xmaxc %d\n",
|
||||
Nc[0], bc[0], Mc[0], xmaxc[0]);
|
||||
fprintf(f,
|
||||
"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
|
||||
xmc[0],xmc[1],xmc[2],xmc[3],xmc[4],xmc[5],xmc[6],
|
||||
xmc[7],xmc[8],xmc[9],xmc[10],xmc[11],xmc[12] );
|
||||
|
||||
fprintf(f, "#2: Nc %4.4d bc %d Mc %d xmaxc %d\n",
|
||||
Nc[1], bc[1], Mc[1], xmaxc[1]);
|
||||
fprintf(f,
|
||||
"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
|
||||
xmc[13+0],xmc[13+1],xmc[13+2],xmc[13+3],xmc[13+4],xmc[13+5],
|
||||
xmc[13+6], xmc[13+7],xmc[13+8],xmc[13+9],xmc[13+10],xmc[13+11],
|
||||
xmc[13+12] );
|
||||
|
||||
fprintf(f, "#3: Nc %4.4d bc %d Mc %d xmaxc %d\n",
|
||||
Nc[2], bc[2], Mc[2], xmaxc[2]);
|
||||
fprintf(f,
|
||||
"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
|
||||
xmc[26+0],xmc[26+1],xmc[26+2],xmc[26+3],xmc[26+4],xmc[26+5],
|
||||
xmc[26+6], xmc[26+7],xmc[26+8],xmc[26+9],xmc[26+10],xmc[26+11],
|
||||
xmc[26+12] );
|
||||
|
||||
fprintf(f, "#4: Nc %4.4d bc %d Mc %d xmaxc %d\n",
|
||||
Nc[3], bc[3], Mc[3], xmaxc[3]);
|
||||
fprintf(f,
|
||||
"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
|
||||
xmc[39+0],xmc[39+1],xmc[39+2],xmc[39+3],xmc[39+4],xmc[39+5],
|
||||
xmc[39+6], xmc[39+7],xmc[39+8],xmc[39+9],xmc[39+10],xmc[39+11],
|
||||
xmc[39+12] );
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
/* k6opt.h vector functions optimized for MMX extensions to x86
|
||||
*
|
||||
* Copyright (C) 1999 by Stanley J. Brooks <stabro@megsinet.net>
|
||||
*
|
||||
* 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;
|
||||
* not even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
* A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Chicago, 03.12.1999
|
||||
* Stanley J. Brooks
|
||||
*/
|
||||
|
||||
extern void Weighting_filter P2((e, x),
|
||||
const word * e, /* signal [-5..0.39.44] IN */
|
||||
word * x /* signal [0..39] OUT */
|
||||
)
|
||||
;
|
||||
|
||||
extern longword k6maxcc P3((wt,dp,Nc_out),
|
||||
const word *wt,
|
||||
const word *dp,
|
||||
word * Nc_out /* OUT */
|
||||
)
|
||||
;
|
||||
/*
|
||||
* k6maxmin(p,n,out[])
|
||||
* input p[n] is array of shorts (require n>0)
|
||||
* returns (long) maximum absolute value..
|
||||
* if out!=NULL, also returns out[0] the maximum and out[1] the minimum
|
||||
*/
|
||||
extern longword k6maxmin P3((p,n,out),
|
||||
const word *p,
|
||||
int n,
|
||||
word *out /* out[0] is max, out[1] is min */
|
||||
)
|
||||
;
|
||||
|
||||
extern longword k6iprod P3((p,q,n),
|
||||
const word *p,
|
||||
const word *q,
|
||||
int n
|
||||
)
|
||||
;
|
||||
|
||||
/*
|
||||
* k6vsraw(p,n,bits)
|
||||
* input p[n] is array of shorts (require n>0)
|
||||
* shift/round each to the right by bits>=0 bits.
|
||||
*/
|
||||
extern void k6vsraw P3((p,n,bits),
|
||||
const word *p,
|
||||
int n,
|
||||
int bits
|
||||
)
|
||||
;
|
||||
|
||||
/*
|
||||
* k6vsllw(p,n,bits)
|
||||
* input p[n] is array of shorts (require n>0)
|
||||
* shift each to the left by bits>=0 bits.
|
||||
*/
|
||||
extern void k6vsllw P3((p,n,bits),
|
||||
const word *p,
|
||||
int n,
|
||||
int bits
|
||||
)
|
||||
;
|
||||
|
||||
#if 1 /* there isn't any significant speed gain from mmx here: */
|
||||
extern void Short_term_analysis_filteringx P4((u0,rp0,k_n,s),
|
||||
register word * u0,
|
||||
register word * rp0, /* [0..7] IN */
|
||||
register int k_n, /* k_end - k_start */
|
||||
register word * s /* [0..n-1] IN/OUT */
|
||||
)
|
||||
;
|
||||
/*
|
||||
#define Short_term_analysis_filtering Short_term_analysis_filteringx
|
||||
*/
|
||||
#endif
|
|
@ -1,739 +0,0 @@
|
|||
.file "k6opt.s"
|
||||
.version "01.01"
|
||||
/* gcc2_compiled.: */
|
||||
.section .rodata
|
||||
.align 4
|
||||
.type coefs,@object
|
||||
.size coefs,24
|
||||
coefs:
|
||||
.value -134
|
||||
.value -374
|
||||
.value 0
|
||||
.value 2054
|
||||
.value 5741
|
||||
.value 8192
|
||||
.value 5741
|
||||
.value 2054
|
||||
.value 0
|
||||
.value -374
|
||||
.value -134
|
||||
.value 0
|
||||
.text
|
||||
.align 4
|
||||
/* void Weighting_filter (const short *e, short *x) */
|
||||
.globl Weighting_filter
|
||||
.type Weighting_filter,@function
|
||||
Weighting_filter:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
movl 12(%ebp),%edi
|
||||
movl 8(%ebp),%ebx
|
||||
addl $-10,%ebx
|
||||
emms
|
||||
movl $0x1000,%eax; movd %eax,%mm5 /* for rounding */
|
||||
movq coefs,%mm1
|
||||
movq coefs+8,%mm2
|
||||
movq coefs+16,%mm3
|
||||
xorl %esi,%esi
|
||||
.p2align 2
|
||||
.L21:
|
||||
movq (%ebx,%esi,2),%mm0
|
||||
pmaddwd %mm1,%mm0
|
||||
|
||||
movq 8(%ebx,%esi,2),%mm4
|
||||
pmaddwd %mm2,%mm4
|
||||
paddd %mm4,%mm0
|
||||
|
||||
movq 16(%ebx,%esi,2),%mm4
|
||||
pmaddwd %mm3,%mm4
|
||||
paddd %mm4,%mm0
|
||||
|
||||
movq %mm0,%mm4
|
||||
punpckhdq %mm0,%mm4 /* mm4 has high int32 of mm0 dup'd */
|
||||
paddd %mm4,%mm0;
|
||||
|
||||
paddd %mm5,%mm0 /* add for roundoff */
|
||||
psrad $13,%mm0
|
||||
packssdw %mm0,%mm0
|
||||
movd %mm0,%eax /* ax has result */
|
||||
movw %ax,(%edi,%esi,2)
|
||||
incl %esi
|
||||
cmpl $39,%esi
|
||||
jle .L21
|
||||
emms
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
leave
|
||||
ret
|
||||
.Lfe1:
|
||||
.size Weighting_filter,.Lfe1-Weighting_filter
|
||||
|
||||
.macro ccstep n
|
||||
.if \n
|
||||
movq \n(%edi),%mm1
|
||||
movq \n(%esi),%mm2
|
||||
.else
|
||||
movq (%edi),%mm1
|
||||
movq (%esi),%mm2
|
||||
.endif
|
||||
pmaddwd %mm2,%mm1
|
||||
paddd %mm1,%mm0
|
||||
.endm
|
||||
|
||||
.align 4
|
||||
/* long k6maxcc(const short *wt, const short *dp, short *Nc_out) */
|
||||
.globl k6maxcc
|
||||
.type k6maxcc,@function
|
||||
k6maxcc:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
emms
|
||||
movl 8(%ebp),%edi
|
||||
movl 12(%ebp),%esi
|
||||
movl $0,%edx /* will be maximum inner-product */
|
||||
movl $40,%ebx
|
||||
movl %ebx,%ecx /* will be index of max inner-product */
|
||||
subl $80,%esi
|
||||
.p2align 2
|
||||
.L41:
|
||||
movq (%edi),%mm0
|
||||
movq (%esi),%mm2
|
||||
pmaddwd %mm2,%mm0
|
||||
ccstep 8
|
||||
ccstep 16
|
||||
ccstep 24
|
||||
ccstep 32
|
||||
ccstep 40
|
||||
ccstep 48
|
||||
ccstep 56
|
||||
ccstep 64
|
||||
ccstep 72
|
||||
|
||||
movq %mm0,%mm1
|
||||
punpckhdq %mm0,%mm1 /* mm1 has high int32 of mm0 dup'd */
|
||||
paddd %mm1,%mm0;
|
||||
movd %mm0,%eax /* eax has result */
|
||||
|
||||
cmpl %edx,%eax
|
||||
jle .L40
|
||||
movl %eax,%edx
|
||||
movl %ebx,%ecx
|
||||
.p2align 2
|
||||
.L40:
|
||||
subl $2,%esi
|
||||
incl %ebx
|
||||
cmpl $120,%ebx
|
||||
jle .L41
|
||||
movl 16(%ebp),%eax
|
||||
movw %cx,(%eax)
|
||||
movl %edx,%eax
|
||||
emms
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
leave
|
||||
ret
|
||||
.Lfe2:
|
||||
.size k6maxcc,.Lfe2-k6maxcc
|
||||
|
||||
|
||||
.align 4
|
||||
/* long k6iprod (const short *p, const short *q, int n) */
|
||||
.globl k6iprod
|
||||
.type k6iprod,@function
|
||||
k6iprod:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
emms
|
||||
pxor %mm0,%mm0
|
||||
movl 8(%ebp),%esi
|
||||
movl 12(%ebp),%edi
|
||||
movl 16(%ebp),%eax
|
||||
leal -32(%esi,%eax,2),%edx /* edx = top - 32 */
|
||||
|
||||
cmpl %edx,%esi; ja .L202
|
||||
|
||||
.p2align 2
|
||||
.L201:
|
||||
ccstep 0
|
||||
ccstep 8
|
||||
ccstep 16
|
||||
ccstep 24
|
||||
|
||||
addl $32,%esi
|
||||
addl $32,%edi
|
||||
cmpl %edx,%esi; jbe .L201
|
||||
|
||||
.p2align 2
|
||||
.L202:
|
||||
addl $24,%edx /* now edx = top-8 */
|
||||
cmpl %edx,%esi; ja .L205
|
||||
|
||||
.p2align 2
|
||||
.L203:
|
||||
ccstep 0
|
||||
|
||||
addl $8,%esi
|
||||
addl $8,%edi
|
||||
cmpl %edx,%esi; jbe .L203
|
||||
|
||||
.p2align 2
|
||||
.L205:
|
||||
addl $4,%edx /* now edx = top-4 */
|
||||
cmpl %edx,%esi; ja .L207
|
||||
|
||||
movd (%edi),%mm1
|
||||
movd (%esi),%mm2
|
||||
pmaddwd %mm2,%mm1
|
||||
paddd %mm1,%mm0
|
||||
|
||||
addl $4,%esi
|
||||
addl $4,%edi
|
||||
|
||||
.p2align 2
|
||||
.L207:
|
||||
addl $2,%edx /* now edx = top-2 */
|
||||
cmpl %edx,%esi; ja .L209
|
||||
|
||||
movswl (%edi),%eax
|
||||
movd %eax,%mm1
|
||||
movswl (%esi),%eax
|
||||
movd %eax,%mm2
|
||||
pmaddwd %mm2,%mm1
|
||||
paddd %mm1,%mm0
|
||||
|
||||
.p2align 2
|
||||
.L209:
|
||||
movq %mm0,%mm1
|
||||
punpckhdq %mm0,%mm1 /* mm1 has high int32 of mm0 dup'd */
|
||||
paddd %mm1,%mm0;
|
||||
movd %mm0,%eax /* eax has result */
|
||||
|
||||
emms
|
||||
popl %esi
|
||||
popl %edi
|
||||
leave
|
||||
ret
|
||||
.Lfe3:
|
||||
.size k6iprod,.Lfe3-k6iprod
|
||||
|
||||
|
||||
.align 4
|
||||
/* void k6vsraw P3((short *p, int n, int bits) */
|
||||
.globl k6vsraw
|
||||
.type k6vsraw,@function
|
||||
k6vsraw:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %esi
|
||||
movl 8(%ebp),%esi
|
||||
movl 16(%ebp),%ecx
|
||||
andl %ecx,%ecx; jle .L399
|
||||
movl 12(%ebp),%eax
|
||||
leal -16(%esi,%eax,2),%edx /* edx = top - 16 */
|
||||
emms
|
||||
movd %ecx,%mm3
|
||||
movq ones,%mm2
|
||||
psllw %mm3,%mm2; psrlw $1,%mm2
|
||||
cmpl %edx,%esi; ja .L306
|
||||
|
||||
.p2align 2
|
||||
.L302: /* 8 words per iteration */
|
||||
movq (%esi),%mm0
|
||||
movq 8(%esi),%mm1
|
||||
paddsw %mm2,%mm0
|
||||
psraw %mm3,%mm0;
|
||||
paddsw %mm2,%mm1
|
||||
psraw %mm3,%mm1;
|
||||
movq %mm0,(%esi)
|
||||
movq %mm1,8(%esi)
|
||||
addl $16,%esi
|
||||
cmpl %edx,%esi
|
||||
jbe .L302
|
||||
|
||||
.p2align 2
|
||||
.L306:
|
||||
addl $12,%edx /* now edx = top-4 */
|
||||
cmpl %edx,%esi; ja .L310
|
||||
|
||||
.p2align 2
|
||||
.L308: /* do up to 6 words, two at a time */
|
||||
movd (%esi),%mm0
|
||||
paddsw %mm2,%mm0
|
||||
psraw %mm3,%mm0;
|
||||
movd %mm0,(%esi)
|
||||
addl $4,%esi
|
||||
cmpl %edx,%esi
|
||||
jbe .L308
|
||||
|
||||
.p2align 2
|
||||
.L310:
|
||||
addl $2,%edx /* now edx = top-2 */
|
||||
cmpl %edx,%esi; ja .L315
|
||||
|
||||
movzwl (%esi),%eax
|
||||
movd %eax,%mm0
|
||||
paddsw %mm2,%mm0
|
||||
psraw %mm3,%mm0;
|
||||
movd %mm0,%eax
|
||||
movw %ax,(%esi)
|
||||
|
||||
.p2align 2
|
||||
.L315:
|
||||
emms
|
||||
.L399:
|
||||
popl %esi
|
||||
leave
|
||||
ret
|
||||
.Lfe4:
|
||||
.size k6vsraw,.Lfe4-k6vsraw
|
||||
|
||||
.align 4
|
||||
/* void k6vsllw P3((short *p, int n, int bits) */
|
||||
.globl k6vsllw
|
||||
.type k6vsllw,@function
|
||||
k6vsllw:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %esi
|
||||
movl 8(%ebp),%esi
|
||||
movl 16(%ebp),%ecx
|
||||
andl %ecx,%ecx; jle .L499
|
||||
movl 12(%ebp),%eax
|
||||
leal -16(%esi,%eax,2),%edx /* edx = top - 16 */
|
||||
emms
|
||||
movd %ecx,%mm3
|
||||
cmpl %edx,%esi; ja .L406
|
||||
|
||||
.p2align 2
|
||||
.L402: /* 8 words per iteration */
|
||||
movq (%esi),%mm0
|
||||
movq 8(%esi),%mm1
|
||||
psllw %mm3,%mm0;
|
||||
psllw %mm3,%mm1;
|
||||
movq %mm0,(%esi)
|
||||
movq %mm1,8(%esi)
|
||||
addl $16,%esi
|
||||
cmpl %edx,%esi
|
||||
jbe .L402
|
||||
|
||||
.p2align 2
|
||||
.L406:
|
||||
addl $12,%edx /* now edx = top-4 */
|
||||
cmpl %edx,%esi; ja .L410
|
||||
|
||||
.p2align 2
|
||||
.L408: /* do up to 6 words, two at a time */
|
||||
movd (%esi),%mm0
|
||||
psllw %mm3,%mm0;
|
||||
movd %mm0,(%esi)
|
||||
addl $4,%esi
|
||||
cmpl %edx,%esi
|
||||
jbe .L408
|
||||
|
||||
.p2align 2
|
||||
.L410:
|
||||
addl $2,%edx /* now edx = top-2 */
|
||||
cmpl %edx,%esi; ja .L415
|
||||
|
||||
movzwl (%esi),%eax
|
||||
movd %eax,%mm0
|
||||
psllw %mm3,%mm0;
|
||||
movd %mm0,%eax
|
||||
movw %ax,(%esi)
|
||||
|
||||
.p2align 2
|
||||
.L415:
|
||||
emms
|
||||
.L499:
|
||||
popl %esi
|
||||
leave
|
||||
ret
|
||||
.Lfe5:
|
||||
.size k6vsllw,.Lfe5-k6vsllw
|
||||
|
||||
|
||||
.section .rodata
|
||||
.align 4
|
||||
.type extremes,@object
|
||||
.size extremes,8
|
||||
extremes:
|
||||
.long 0x80008000
|
||||
.long 0x7fff7fff
|
||||
.type ones,@object
|
||||
.size ones,8
|
||||
ones:
|
||||
.long 0x00010001
|
||||
.long 0x00010001
|
||||
|
||||
.text
|
||||
.align 4
|
||||
/* long k6maxmin (const short *p, int n, short *out) */
|
||||
.globl k6maxmin
|
||||
.type k6maxmin,@function
|
||||
k6maxmin:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %esi
|
||||
emms
|
||||
movl 8(%ebp),%esi
|
||||
movl 12(%ebp),%eax
|
||||
leal -8(%esi,%eax,2),%edx
|
||||
|
||||
cmpl %edx,%esi
|
||||
jbe .L52
|
||||
movd extremes,%mm0
|
||||
movd extremes+4,%mm1
|
||||
jmp .L58
|
||||
|
||||
.p2align 2
|
||||
.L52:
|
||||
movq (%esi),%mm0 /* mm0 will be max's */
|
||||
movq %mm0,%mm1 /* mm1 will be min's */
|
||||
addl $8,%esi
|
||||
cmpl %edx,%esi
|
||||
ja .L56
|
||||
|
||||
.p2align 2
|
||||
.L54:
|
||||
movq (%esi),%mm2
|
||||
|
||||
movq %mm2,%mm3
|
||||
pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */
|
||||
movq %mm3,%mm4
|
||||
pand %mm2,%mm3 /* mm3 is mm2 masked to new max's */
|
||||
pandn %mm0,%mm4 /* mm4 is mm0 masked to its max's */
|
||||
por %mm3,%mm4
|
||||
movq %mm4,%mm0 /* now mm0 is updated max's */
|
||||
|
||||
movq %mm1,%mm3
|
||||
pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */
|
||||
pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */
|
||||
pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */
|
||||
por %mm3,%mm2
|
||||
movq %mm2,%mm1 /* now mm1 is updated min's */
|
||||
|
||||
addl $8,%esi
|
||||
cmpl %edx,%esi
|
||||
jbe .L54
|
||||
|
||||
.p2align 2
|
||||
.L56: /* merge down the 4-word max/mins to lower 2 words */
|
||||
|
||||
movq %mm0,%mm2
|
||||
psrlq $32,%mm2
|
||||
movq %mm2,%mm3
|
||||
pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */
|
||||
pand %mm3,%mm2 /* mm2 is mm2 masked to new max's */
|
||||
pandn %mm0,%mm3 /* mm3 is mm0 masked to its max's */
|
||||
por %mm3,%mm2
|
||||
movq %mm2,%mm0 /* now mm0 is updated max's */
|
||||
|
||||
movq %mm1,%mm2
|
||||
psrlq $32,%mm2
|
||||
movq %mm1,%mm3
|
||||
pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */
|
||||
pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */
|
||||
pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */
|
||||
por %mm3,%mm2
|
||||
movq %mm2,%mm1 /* now mm1 is updated min's */
|
||||
|
||||
.p2align 2
|
||||
.L58:
|
||||
addl $4,%edx /* now dx = top-4 */
|
||||
cmpl %edx,%esi
|
||||
ja .L62
|
||||
/* here, there are >= 2 words of input remaining */
|
||||
movd (%esi),%mm2
|
||||
|
||||
movq %mm2,%mm3
|
||||
pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */
|
||||
movq %mm3,%mm4
|
||||
pand %mm2,%mm3 /* mm3 is mm2 masked to new max's */
|
||||
pandn %mm0,%mm4 /* mm4 is mm0 masked to its max's */
|
||||
por %mm3,%mm4
|
||||
movq %mm4,%mm0 /* now mm0 is updated max's */
|
||||
|
||||
movq %mm1,%mm3
|
||||
pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */
|
||||
pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */
|
||||
pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */
|
||||
por %mm3,%mm2
|
||||
movq %mm2,%mm1 /* now mm1 is updated min's */
|
||||
|
||||
addl $4,%esi
|
||||
|
||||
.p2align 2
|
||||
.L62:
|
||||
/* merge down the 2-word max/mins to 1 word */
|
||||
|
||||
movq %mm0,%mm2
|
||||
psrlq $16,%mm2
|
||||
movq %mm2,%mm3
|
||||
pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */
|
||||
pand %mm3,%mm2 /* mm2 is mm2 masked to new max's */
|
||||
pandn %mm0,%mm3 /* mm3 is mm0 masked to its max's */
|
||||
por %mm3,%mm2
|
||||
movd %mm2,%ecx /* cx is max so far */
|
||||
|
||||
movq %mm1,%mm2
|
||||
psrlq $16,%mm2
|
||||
movq %mm1,%mm3
|
||||
pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */
|
||||
pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */
|
||||
pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */
|
||||
por %mm3,%mm2
|
||||
movd %mm2,%eax /* ax is min so far */
|
||||
|
||||
addl $2,%edx /* now dx = top-2 */
|
||||
cmpl %edx,%esi
|
||||
ja .L65
|
||||
|
||||
/* here, there is one word of input left */
|
||||
cmpw (%esi),%cx
|
||||
jge .L64
|
||||
movw (%esi),%cx
|
||||
.p2align 2
|
||||
.L64:
|
||||
cmpw (%esi),%ax
|
||||
jle .L65
|
||||
movw (%esi),%ax
|
||||
|
||||
.p2align 2
|
||||
.L65: /* (finally!) cx is the max, ax the min */
|
||||
movswl %cx,%ecx
|
||||
movswl %ax,%eax
|
||||
|
||||
movl 16(%ebp),%edx /* ptr to output max,min vals */
|
||||
andl %edx,%edx; jz .L77
|
||||
movw %cx,(%edx) /* max */
|
||||
movw %ax,2(%edx) /* min */
|
||||
.p2align 2
|
||||
.L77:
|
||||
/* now calculate max absolute val */
|
||||
negl %eax
|
||||
cmpl %ecx,%eax
|
||||
jge .L81
|
||||
movl %ecx,%eax
|
||||
.p2align 2
|
||||
.L81:
|
||||
emms
|
||||
popl %esi
|
||||
leave
|
||||
ret
|
||||
.Lfe6:
|
||||
.size k6maxmin,.Lfe6-k6maxmin
|
||||
|
||||
/* void Short_term_analysis_filtering (short *u0, const short *rp0, int kn, short *s) */
|
||||
.equiv pm_u0,8
|
||||
.equiv pm_rp0,12
|
||||
.equiv pm_kn,16
|
||||
.equiv pm_s,20
|
||||
.equiv lv_u_top,-4
|
||||
.equiv lv_s_top,-8
|
||||
.equiv lv_rp,-40 /* local version of rp0 with each word twice */
|
||||
.align 4
|
||||
.globl Short_term_analysis_filteringx
|
||||
.type Short_term_analysis_filteringx,@function
|
||||
Short_term_analysis_filteringx:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
subl $40,%esp
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
|
||||
movl pm_rp0(%ebp),%esi;
|
||||
leal lv_rp(%ebp),%edi;
|
||||
cld
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
emms
|
||||
movl $0x4000,%eax;
|
||||
movd %eax,%mm4;
|
||||
punpckldq %mm4,%mm4 /* (0x00004000,0x00004000) for rounding dword product pairs */
|
||||
|
||||
movl pm_u0(%ebp),%eax
|
||||
addl $16,%eax
|
||||
movl %eax,lv_u_top(%ebp) /* UTOP */
|
||||
movl pm_s(%ebp),%edx /* edx is local s ptr throughout below */
|
||||
movl pm_kn(%ebp),%eax
|
||||
leal (%edx,%eax,2),%eax
|
||||
movl %eax,lv_s_top(%ebp)
|
||||
cmpl %eax,%edx
|
||||
jae .L179
|
||||
.p2align 2
|
||||
.L181:
|
||||
leal lv_rp(%ebp),%esi /* RP */
|
||||
movl pm_u0(%ebp),%edi /* U */
|
||||
movw (%edx),%ax /* (0,DI) */
|
||||
roll $16,%eax
|
||||
movw (%edx),%ax /* (DI,DI) */
|
||||
.p2align 2
|
||||
.L185: /* RP is %esi */
|
||||
movl %eax,%ecx
|
||||
movw (%edi),%ax /* (DI,U) */
|
||||
movd (%esi),%mm3 /* mm3 is (0,0,RP,RP) */
|
||||
movw %cx,(%edi)
|
||||
|
||||
movd %eax,%mm2 /* mm2 is (0,0,DI,U) */
|
||||
rorl $16,%eax
|
||||
movd %eax,%mm1 /* mm1 is (0,0,U,DI) */
|
||||
|
||||
movq %mm1,%mm0
|
||||
pmullw %mm3,%mm0
|
||||
pmulhw %mm3,%mm1
|
||||
punpcklwd %mm1,%mm0 /* mm0 is (RP*U,RP*DI) */
|
||||
paddd %mm4,%mm0 /* mm4 is 0x00004000,0x00004000 */
|
||||
psrad $15,%mm0 /* (RP*U,RP*DI) adjusted */
|
||||
packssdw %mm0,%mm0 /* (*,*,RP*U,RP*DI) adjusted and saturated to word */
|
||||
paddsw %mm2,%mm0 /* mm0 is (?,?, DI', U') */
|
||||
movd %mm0,%eax /* (DI,U') */
|
||||
|
||||
addl $2,%edi
|
||||
addl $4,%esi
|
||||
cmpl lv_u_top(%ebp),%edi
|
||||
jb .L185
|
||||
|
||||
rorl $16,%eax
|
||||
movw %ax,(%edx) /* last DI goes to *s */
|
||||
addl $2,%edx /* next s */
|
||||
cmpl lv_s_top(%ebp),%edx
|
||||
jb .L181
|
||||
.p2align 2
|
||||
.L179:
|
||||
emms
|
||||
popl %esi
|
||||
popl %edi
|
||||
leave
|
||||
ret
|
||||
.Lfe7:
|
||||
.size Short_term_analysis_filteringx,.Lfe7-Short_term_analysis_filteringx
|
||||
|
||||
.end
|
||||
|
||||
/* 'as' macro's seem to be case-insensitive */
|
||||
.macro STEP n
|
||||
.if \n
|
||||
movd \n(%esi),%mm3 /* mm3 is (0,0,RP,RP) */
|
||||
.else
|
||||
movd (%esi),%mm3 /* mm3 is (0,0,RP,RP) */
|
||||
.endif
|
||||
movq %mm5,%mm1;
|
||||
movd %mm4,%ecx; movw %cx,%ax /* (DI,U) */
|
||||
psllq $48,%mm1; psrlq $16,%mm4; por %mm1,%mm4
|
||||
psllq $48,%mm0; psrlq $16,%mm5; por %mm0,%mm5
|
||||
|
||||
movd %eax,%mm2 /* mm2 is (0,0,DI,U) */
|
||||
rorl $16,%eax
|
||||
movd %eax,%mm1 /* mm1 is (0,0,U,DI) */
|
||||
|
||||
movq %mm1,%mm0
|
||||
pmullw %mm3,%mm0
|
||||
pmulhw %mm3,%mm1
|
||||
punpcklwd %mm1,%mm0 /* mm0 is (RP*U,RP*DI) */
|
||||
paddd %mm6,%mm0 /* mm6 is 0x00004000,0x00004000 */
|
||||
psrad $15,%mm0 /* (RP*U,RP*DI) adjusted */
|
||||
packssdw %mm0,%mm0 /* (*,*,RP*U,RP*DI) adjusted and saturated to word */
|
||||
paddsw %mm2,%mm0 /* mm0 is (?,?, DI', U') */
|
||||
movd %mm0,%eax /* (DI,U') */
|
||||
.endm
|
||||
|
||||
/* void Short_term_analysis_filtering (short *u0, const short *rp0, int kn, short *s) */
|
||||
.equiv pm_u0,8
|
||||
.equiv pm_rp0,12
|
||||
.equiv pm_kn,16
|
||||
.equiv pm_s,20
|
||||
.equiv lv_rp_top,-4
|
||||
.equiv lv_s_top,-8
|
||||
.equiv lv_rp,-40 /* local version of rp0 with each word twice */
|
||||
.align 4
|
||||
.globl Short_term_analysis_filteringx
|
||||
.type Short_term_analysis_filteringx,@function
|
||||
Short_term_analysis_filteringx:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
subl $56,%esp
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
|
||||
movl pm_rp0(%ebp),%esi;
|
||||
leal lv_rp(%ebp),%edi;
|
||||
cld
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
lodsw; stosw; stosw
|
||||
movl %edi,lv_rp_top(%ebp)
|
||||
emms
|
||||
|
||||
movl $0x4000,%eax;
|
||||
movd %eax,%mm6;
|
||||
punpckldq %mm6,%mm6 /* (0x00004000,0x00004000) for rounding dword product pairs */
|
||||
|
||||
movl pm_u0(%ebp),%ebx
|
||||
movq (%ebx),%mm4; movq 8(%ebx),%mm5 /* the 8 u's */
|
||||
movl pm_s(%ebp),%edx /* edx is local s ptr throughout below */
|
||||
movl pm_kn(%ebp),%eax
|
||||
leal (%edx,%eax,2),%eax
|
||||
movl %eax,lv_s_top(%ebp)
|
||||
cmpl %eax,%edx
|
||||
jae .L179
|
||||
.p2align 2
|
||||
.L181:
|
||||
leal lv_rp(%ebp),%esi /* RP */
|
||||
movw (%edx),%ax /* (0,DI) */
|
||||
roll $16,%eax
|
||||
movw (%edx),%ax /* (DI,DI) */
|
||||
movd %eax,%mm0
|
||||
.p2align 2
|
||||
.L185: /* RP is %esi */
|
||||
step 0
|
||||
step 4
|
||||
step 8
|
||||
step 12
|
||||
/*
|
||||
step 16
|
||||
step 20
|
||||
step 24
|
||||
step 28
|
||||
*/
|
||||
addl $16,%esi
|
||||
cmpl lv_rp_top(%ebp),%esi
|
||||
jb .L185
|
||||
|
||||
rorl $16,%eax
|
||||
movw %ax,(%edx) /* last DI goes to *s */
|
||||
addl $2,%edx /* next s */
|
||||
cmpl lv_s_top(%ebp),%edx
|
||||
jb .L181
|
||||
.L179:
|
||||
movq %mm4,(%ebx); movq %mm5,8(%ebx) /* the 8 u's */
|
||||
emms
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
leave
|
||||
ret
|
||||
.Lfe7:
|
||||
.size Short_term_analysis_filteringx,.Lfe7-Short_term_analysis_filteringx
|
||||
.ident "GCC: (GNU) 2.95.2 19991109 (Debian GNU/Linux)"
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* long_term.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
@ -13,9 +14,7 @@
|
|||
|
||||
#include "gsm.h"
|
||||
#include "proto.h"
|
||||
#ifdef K6OPT
|
||||
#include "k6opt.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
|
||||
*/
|
||||
|
@ -199,9 +198,6 @@ static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
|
|||
|
||||
/* Search for the maximum cross-correlation and coding of the LTP lag
|
||||
*/
|
||||
# ifdef K6OPT
|
||||
L_max = k6maxcc(wt,dp,&Nc);
|
||||
# else
|
||||
L_max = 0;
|
||||
Nc = 40; /* index for the maximum cross-correlation */
|
||||
|
||||
|
@ -239,7 +235,7 @@ static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
|
|||
L_max = L_result;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
*Nc_out = Nc;
|
||||
|
||||
L_max <<= 1;
|
||||
|
@ -278,8 +274,8 @@ static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
|
|||
|
||||
temp = gsm_norm( L_power );
|
||||
|
||||
R = (word)SASR( L_max << temp, 16 );
|
||||
S = (word)SASR( L_power << temp, 16 );
|
||||
R = (word) SASR( L_max << temp, 16 );
|
||||
S = (word) SASR( L_power << temp, 16 );
|
||||
|
||||
/* Coding of the LTP gain
|
||||
*/
|
||||
|
@ -852,12 +848,13 @@ static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e),
|
|||
*/
|
||||
{
|
||||
register int k;
|
||||
register longword ltmp;
|
||||
|
||||
# undef STEP
|
||||
# define STEP(BP) \
|
||||
for (k = 0; k <= 39; k++) { \
|
||||
dpp[k] = (word)GSM_MULT_R( BP, dp[k - Nc]); \
|
||||
e[k] = GSM_SUB( d[k], dpp[k] ); \
|
||||
dpp[k] = (word) GSM_MULT_R( BP, dp[k - Nc]); \
|
||||
e[k] = (word) GSM_SUB( d[k], dpp[k] ); \
|
||||
}
|
||||
|
||||
switch (bc) {
|
||||
|
@ -920,6 +917,7 @@ void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),
|
|||
* table 4.3b.
|
||||
*/
|
||||
{
|
||||
register longword ltmp; /* for ADD */
|
||||
register int k;
|
||||
word brp, drpp, Nr;
|
||||
|
||||
|
@ -939,8 +937,8 @@ void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),
|
|||
assert(brp != MIN_WORD);
|
||||
|
||||
for (k = 0; k <= 39; k++) {
|
||||
drpp = (word)GSM_MULT_R( brp, drp[ k - Nr ] );
|
||||
drp[k] = GSM_ADD( erp[k], drpp );
|
||||
drpp = (word) GSM_MULT_R( brp, drp[ k - Nr ] );
|
||||
drp[k] = (word) GSM_ADD( erp[k], drpp );
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* preprocess.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
@ -42,10 +43,14 @@ void Gsm_Preprocess P3((S, s, so),
|
|||
word mp = S->mp;
|
||||
|
||||
word s1;
|
||||
longword L_s2;
|
||||
|
||||
longword L_temp;
|
||||
|
||||
word msp, lsp;
|
||||
word SO;
|
||||
|
||||
longword ltmp; /* for ADD */
|
||||
ulongword utmp; /* for L_ADD */
|
||||
|
||||
register int k = 160;
|
||||
|
@ -54,8 +59,7 @@ void Gsm_Preprocess P3((S, s, so),
|
|||
|
||||
/* 4.2.1 Downscaling of the input signal
|
||||
*/
|
||||
/* SO = SASR( *s, 3 ) << 2;*/
|
||||
SO = SASR( *s, 1 ) & ~3;
|
||||
SO = SASR( *s, 3 ) << 2;
|
||||
s++;
|
||||
|
||||
assert (SO >= -0x4000); /* downscaled by */
|
||||
|
@ -77,41 +81,21 @@ void Gsm_Preprocess P3((S, s, so),
|
|||
|
||||
assert(s1 != MIN_WORD);
|
||||
|
||||
/* SJB Remark: float might be faster than the mess that follows */
|
||||
|
||||
/* Compute the recursive part
|
||||
*/
|
||||
L_s2 = s1;
|
||||
L_s2 <<= 15;
|
||||
|
||||
/* Execution of a 31 bv 16 bits multiplication
|
||||
*/
|
||||
{
|
||||
word msp;
|
||||
#ifndef __GNUC__
|
||||
word lsp;
|
||||
#endif
|
||||
longword L_s2;
|
||||
longword L_temp;
|
||||
|
||||
L_s2 = s1;
|
||||
L_s2 <<= 15;
|
||||
#ifndef __GNUC__
|
||||
msp = (word)SASR( L_z2, 15 );
|
||||
lsp = (word)(L_z2 & 0x7fff); /* gsm_L_sub(L_z2,(msp<<15)); */
|
||||
|
||||
msp = (word) SASR( L_z2, 15 );
|
||||
lsp = (word) (L_z2-((longword)msp<<15)); /* gsm_L_sub(L_z2,(msp<<15)); */
|
||||
|
||||
L_s2 += GSM_MULT_R( lsp, 32735 );
|
||||
L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
|
||||
L_z2 = GSM_L_ADD( L_temp, L_s2 );
|
||||
/* above does L_z2 = L_z2 * 0x7fd5/0x8000 + L_s2 */
|
||||
#else
|
||||
L_z2 = ((long long)L_z2*32735 + 0x4000)>>15;
|
||||
/* alternate (ansi) version of above line does slightly different rounding:
|
||||
* L_temp = L_z2 >> 9;
|
||||
* L_temp += L_temp >> 5;
|
||||
* L_temp = (++L_temp) >> 1;
|
||||
* L_z2 = L_z2 - L_temp;
|
||||
*/
|
||||
L_z2 = GSM_L_ADD(L_z2,L_s2);
|
||||
#endif
|
||||
|
||||
/* Compute sof[k] with rounding
|
||||
*/
|
||||
L_temp = GSM_L_ADD( L_z2, 16384 );
|
||||
|
@ -119,10 +103,9 @@ void Gsm_Preprocess P3((S, s, so),
|
|||
/* 4.2.3 Preemphasis
|
||||
*/
|
||||
|
||||
msp = (word)GSM_MULT_R( mp, -28180 );
|
||||
mp = (word)SASR( L_temp, 15 );
|
||||
*so++ = GSM_ADD( mp, msp );
|
||||
}
|
||||
msp = (word) GSM_MULT_R( mp, -28180 );
|
||||
mp = (word) SASR( L_temp, 15 );
|
||||
*so++ = (word) GSM_ADD( mp, msp );
|
||||
}
|
||||
|
||||
S->z1 = z1;
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* rpe.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
@ -18,9 +19,7 @@
|
|||
*/
|
||||
|
||||
/* 4.2.13 */
|
||||
#ifdef K6OPT
|
||||
#include "k6opt.h"
|
||||
#else
|
||||
|
||||
static void Weighting_filter P2((e, x),
|
||||
register word * e, /* signal [-5..0.39.44] IN */
|
||||
word * x /* signal [0..39] OUT */
|
||||
|
@ -108,11 +107,10 @@ static void Weighting_filter P2((e, x),
|
|||
*/
|
||||
|
||||
L_result = SASR( L_result, 13 );
|
||||
x[k] = (word)( L_result < MIN_WORD ? MIN_WORD
|
||||
: (L_result > MAX_WORD ? MAX_WORD : L_result ));
|
||||
x[k] = (word) (( L_result < MIN_WORD ? MIN_WORD
|
||||
: (L_result > MAX_WORD ? MAX_WORD : L_result )));
|
||||
}
|
||||
}
|
||||
#endif /* K6OPT */
|
||||
|
||||
/* 4.2.14 */
|
||||
|
||||
|
@ -334,7 +332,7 @@ static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out),
|
|||
assert(temp1 >= 0 && temp1 < 16);
|
||||
|
||||
temp = xM[i] << temp1;
|
||||
temp = (word)GSM_MULT( temp, temp2 );
|
||||
temp = (word) GSM_MULT( temp, temp2 );
|
||||
temp = SASR(temp, 12);
|
||||
xMc[i] = temp + 4; /* see note below */
|
||||
}
|
||||
|
@ -362,6 +360,7 @@ static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),
|
|||
{
|
||||
int i;
|
||||
word temp, temp1, temp2, temp3;
|
||||
longword ltmp;
|
||||
|
||||
assert( mant >= 0 && mant <= 7 );
|
||||
|
||||
|
@ -378,8 +377,8 @@ static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),
|
|||
assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */
|
||||
|
||||
temp <<= 12; /* 16 bit signed */
|
||||
temp = (word)GSM_MULT_R( temp1, temp );
|
||||
temp = GSM_ADD( temp, temp3 );
|
||||
temp = (word) GSM_MULT_R( temp1, temp );
|
||||
temp = (word) GSM_ADD( temp, temp3 );
|
||||
*xMp++ = gsm_asr( temp, temp2 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* short_term.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
@ -13,12 +14,7 @@
|
|||
|
||||
#include "gsm.h"
|
||||
#include "proto.h"
|
||||
#ifdef K6OPT
|
||||
#include "k6opt.h"
|
||||
|
||||
#define Short_term_analysis_filtering Short_term_analysis_filteringx
|
||||
|
||||
#endif
|
||||
/*
|
||||
* SHORT TERM ANALYSIS FILTERING SECTION
|
||||
*/
|
||||
|
@ -30,6 +26,7 @@ static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
|
|||
word * LARpp) /* out: decoded .. */
|
||||
{
|
||||
register word temp1 /* , temp2 */;
|
||||
register long ltmp; /* for GSM_ADD */
|
||||
|
||||
/* This procedure requires for efficient implementation
|
||||
* two tables.
|
||||
|
@ -56,10 +53,10 @@ static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
|
|||
|
||||
#undef STEP
|
||||
#define STEP( B, MIC, INVA ) \
|
||||
temp1 = GSM_ADD( *LARc++, MIC ) << 10; \
|
||||
temp1 = GSM_SUB( temp1, B << 1 ); \
|
||||
temp1 = (word)GSM_MULT_R( INVA, temp1 ); \
|
||||
*LARpp++ = GSM_ADD( temp1, temp1 );
|
||||
temp1 = (word) GSM_ADD( *LARc++, MIC ) << 10; \
|
||||
temp1 = (word) GSM_SUB( temp1, B << 1 ); \
|
||||
temp1 = (word) GSM_MULT_R( INVA, temp1 ); \
|
||||
*LARpp++ = (word) GSM_ADD( temp1, temp1 );
|
||||
|
||||
STEP( 0, -32, 13107 );
|
||||
STEP( 0, -32, 13107 );
|
||||
|
@ -98,10 +95,11 @@ static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),
|
|||
register word * LARp)
|
||||
{
|
||||
register int i;
|
||||
register longword ltmp;
|
||||
|
||||
for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
|
||||
*LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
|
||||
*LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1));
|
||||
*LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
|
||||
*LARp = (word) GSM_ADD( *LARp, SASR( *LARpp_j_1, 1));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,8 +109,9 @@ static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),
|
|||
register word * LARp)
|
||||
{
|
||||
register int i;
|
||||
register longword ltmp;
|
||||
for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
|
||||
*LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));
|
||||
*LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -122,10 +121,11 @@ static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),
|
|||
register word * LARp)
|
||||
{
|
||||
register int i;
|
||||
register longword ltmp;
|
||||
|
||||
for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
|
||||
*LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
|
||||
*LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));
|
||||
*LARp = (word) GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
|
||||
*LARp = (word) GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,6 +152,7 @@ static void LARp_to_rp P1((LARp),
|
|||
{
|
||||
register int i;
|
||||
register word temp;
|
||||
register longword ltmp;
|
||||
|
||||
for (i = 1; i <= 8; i++, LARp++) {
|
||||
|
||||
|
@ -168,28 +169,21 @@ static void LARp_to_rp P1((LARp),
|
|||
temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
|
||||
*LARp = - ((temp < 11059) ? temp << 1
|
||||
: ((temp < 20070) ? temp + 11059
|
||||
: GSM_ADD( temp >> 2, 26112 )));
|
||||
: (word) GSM_ADD( temp >> 2, 26112 )));
|
||||
} else {
|
||||
temp = *LARp;
|
||||
*LARp = (temp < 11059) ? temp << 1
|
||||
: ((temp < 20070) ? temp + 11059
|
||||
: GSM_ADD( temp >> 2, 26112 ));
|
||||
: (word) GSM_ADD( temp >> 2, 26112 ));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 4.2.10 */
|
||||
#ifndef Short_term_analysis_filtering
|
||||
|
||||
/* SJB Remark:
|
||||
* I tried 2 MMX versions of this function, neither is significantly
|
||||
* faster than the C version which follows. MMX might be useful if
|
||||
* one were processing 2 input streams in parallel.
|
||||
*/
|
||||
static void Short_term_analysis_filtering P4((u0,rp0,k_n,s),
|
||||
register word * u0,
|
||||
register word * rp0, /* [0..7] IN */
|
||||
static void Short_term_analysis_filtering P4((S,rp,k_n,s),
|
||||
struct gsm_state * S,
|
||||
register word * rp, /* [0..7] IN */
|
||||
register int k_n, /* k_end - k_start */
|
||||
register word * s /* [0..n-1] IN/OUT */
|
||||
)
|
||||
|
@ -201,45 +195,45 @@ static void Short_term_analysis_filtering P4((u0,rp0,k_n,s),
|
|||
* 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 u0[0..7] in memory for each call.
|
||||
* needs to keep the array u[0..7] in memory for each call.
|
||||
*/
|
||||
{
|
||||
register word * u_top = u0 + 8;
|
||||
register word * s_top = s + k_n;
|
||||
register word * u = S->u;
|
||||
register int i;
|
||||
register word di, zzz, ui, sav, rpi;
|
||||
register longword ltmp;
|
||||
|
||||
while (s < s_top) {
|
||||
register word *u, *rp ;
|
||||
register longword di, u_out;
|
||||
di = u_out = *s;
|
||||
for (rp=rp0, u=u0; u<u_top;) {
|
||||
register longword ui, rpi;
|
||||
ui = *u;
|
||||
*u++ = (word)u_out;
|
||||
rpi = *rp++;
|
||||
u_out = ui + (((rpi*di)+0x4000)>>15);
|
||||
di = di + (((rpi*ui)+0x4000)>>15);
|
||||
/* make the common case fastest: */
|
||||
if ((u_out == (word)u_out) && (di == (word)di)) continue;
|
||||
/* otherwise do slower fixup (saturation) */
|
||||
if (u_out>MAX_WORD) u_out=MAX_WORD;
|
||||
else if (u_out<MIN_WORD) u_out=MIN_WORD;
|
||||
if (di>MAX_WORD) di=MAX_WORD;
|
||||
else if (di<MIN_WORD) di=MIN_WORD;
|
||||
for (; k_n--; s++) {
|
||||
|
||||
di = sav = *s;
|
||||
|
||||
for (i = 0; i < 8; i++) { /* YYY */
|
||||
|
||||
ui = u[i];
|
||||
rpi = rp[i];
|
||||
u[i] = sav;
|
||||
|
||||
zzz = (word) GSM_MULT_R(rpi, di);
|
||||
sav = (word) GSM_ADD( ui, zzz);
|
||||
|
||||
zzz = (word) GSM_MULT_R(rpi, ui);
|
||||
di = (word) GSM_ADD( di, zzz );
|
||||
}
|
||||
*s++ = (word)di;
|
||||
|
||||
*s = di;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(USE_FLOAT_MUL) && defined(FAST)
|
||||
|
||||
static void Fast_Short_term_analysis_filtering P4((u,rp,k_n,s),
|
||||
register word * u;
|
||||
static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s),
|
||||
struct gsm_state * S,
|
||||
register word * rp, /* [0..7] IN */
|
||||
register int k_n, /* k_end - k_start */
|
||||
register word * s /* [0..n-1] IN/OUT */
|
||||
)
|
||||
{
|
||||
register word * u = S->u;
|
||||
register int i;
|
||||
|
||||
float uf[8],
|
||||
|
@ -269,15 +263,6 @@ static void Fast_Short_term_analysis_filtering P4((u,rp,k_n,s),
|
|||
}
|
||||
#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
|
||||
|
||||
/*
|
||||
* SJB Remark: modified Short_term_synthesis_filtering() below
|
||||
* for significant (abt 35%) speedup of decompression.
|
||||
* (gcc-2.95, k6 cpu)
|
||||
* Please don't change this without benchmarking decompression
|
||||
* to see that you haven't harmed speed.
|
||||
* This function burns most of CPU time for untoasting.
|
||||
* Unfortunately, didn't see any good way to benefit from mmx.
|
||||
*/
|
||||
static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
|
||||
struct gsm_state * S,
|
||||
register word * rrp, /* [0..7] IN */
|
||||
|
@ -288,36 +273,34 @@ static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
|
|||
{
|
||||
register word * v = S->v;
|
||||
register int i;
|
||||
register longword sri;
|
||||
register word sri, tmp1, tmp2;
|
||||
register longword ltmp; /* for GSM_ADD & GSM_SUB */
|
||||
|
||||
while (k--) {
|
||||
sri = *wt++;
|
||||
for (i = 8; i--;) {
|
||||
register longword tmp1, tmp2;
|
||||
|
||||
/* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
|
||||
*/
|
||||
tmp1 = rrp[i];
|
||||
tmp2 = v[i];
|
||||
tmp2 = (word) ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
|
||||
? MAX_WORD
|
||||
: 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
|
||||
+ 16384) >> 15)) ;
|
||||
|
||||
sri = (word) GSM_SUB( sri, tmp2 );
|
||||
|
||||
tmp2 = (( tmp1 * tmp2 + 16384) >> 15) ;
|
||||
/* saturation done below */
|
||||
sri -= tmp2;
|
||||
if (sri != (word)sri) {
|
||||
sri = (sri<0)? MIN_WORD:MAX_WORD;
|
||||
}
|
||||
/* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
|
||||
*/
|
||||
tmp1 = (word) ( tmp1 == MIN_WORD && sri == MIN_WORD
|
||||
? MAX_WORD
|
||||
: 0x0FFFF & (( (longword)tmp1 * (longword)sri
|
||||
+ 16384) >> 15)) ;
|
||||
|
||||
tmp1 = (( tmp1 * sri + 16384) >> 15) ;
|
||||
/* saturation done below */
|
||||
tmp1 += v[i];
|
||||
if (tmp1 != (word)tmp1) {
|
||||
tmp1 = (tmp1<0)? MIN_WORD:MAX_WORD;
|
||||
}
|
||||
v[i+1] = (word)tmp1;
|
||||
v[i+1] = (word) GSM_ADD( v[i], tmp1);
|
||||
}
|
||||
*sr++ = v[0] = (word)sri;
|
||||
*sr++ = v[0] = sri;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -388,20 +371,19 @@ void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),
|
|||
|
||||
Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
|
||||
LARp_to_rp( LARp );
|
||||
FILTER( S->u, LARp, 13, s);
|
||||
FILTER( S, LARp, 13, s);
|
||||
|
||||
Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
|
||||
LARp_to_rp( LARp );
|
||||
FILTER( S->u, LARp, 14, s + 13);
|
||||
FILTER( S, LARp, 14, s + 13);
|
||||
|
||||
Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
|
||||
LARp_to_rp( LARp );
|
||||
FILTER( S->u, LARp, 13, s + 27);
|
||||
FILTER( S, LARp, 13, s + 27);
|
||||
|
||||
Coefficients_40_159( LARpp_j, LARp);
|
||||
LARp_to_rp( LARp );
|
||||
FILTER( S->u, LARp, 120, s + 40);
|
||||
|
||||
FILTER( S, LARp, 120, s + 40);
|
||||
}
|
||||
|
||||
void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* table.c
|
||||
*
|
||||
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
|
||||
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
|
||||
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
|
||||
/* Most of these tables are inlined at their point of use.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue