Adding mod_voipcodecs using Steve Underwoods voipcodecs library. This isn't default yet.

/b



git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7555 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Brian West 2008-02-08 17:13:54 +00:00
parent cb7bae8c8c
commit 2d29656bf2
64 changed files with 721 additions and 10509 deletions

View File

@ -3,7 +3,7 @@ echo "bootstrap: checking installation..."
BASEDIR=`pwd`;
LIBDIR=${BASEDIR}/libs;
SUBDIRS="codec/g7xx codec/gsm codec/ilbc codec/lpc10 curl iax iksemel voipcodecs \
SUBDIRS="codec/g7xx codec/gsm codec/ilbc curl iax iksemel voipcodecs \
js js/nsprpub libdingaling libedit libresample libsndfile pcre sofia-sip \
speex sqlite srtp xmlrpc-c";

View File

@ -22,9 +22,9 @@ codecs/mod_amr
codecs/mod_g729
codecs/mod_gsm
#codecs/mod_h26x
#codecs/mod_voipcodecs
codecs/mod_ilbc
codecs/mod_l16
#codecs/mod_lpc10
codecs/mod_speex
#dialplans/mod_dialplan_directory
dialplans/mod_dialplan_xml

View File

@ -465,7 +465,6 @@ AC_CONFIG_SUBDIRS(libs/codec/g7xx)
AC_CONFIG_SUBDIRS(libs/voipcodecs)
AC_CONFIG_SUBDIRS(libs/codec/gsm)
AC_CONFIG_SUBDIRS(libs/codec/ilbc)
AC_CONFIG_SUBDIRS(libs/codec/lpc10)
AC_CONFIG_SUBDIRS(libs/curl)
AC_CONFIG_SUBDIRS(libs/iax)
AC_CONFIG_SUBDIRS(libs/iksemel)

View File

@ -1 +0,0 @@
Fri Mar 16 17:14:20 EDT 2007

View File

@ -1,28 +0,0 @@
EXTRA_DIST =
SUBDIRS =
AUTOMAKE_OPTS= gnu
NAME=liblpc10
AM_CFLAGS = $(new_AM_CFLAGS)
AM_CPPFLAGS = $(AM_CFLAGS)
AM_LDFLAGS = $(new_AM_LDFLAGS) -lm
lib_LTLIBRARIES = liblpc10.la
liblpc10_la_SOURCES = src/analys.c src/dcbias.c src/difmag.c src/energy.c src/hp100.c \
src/ivfilt.c src/lpcini.c src/mload.c src/placea.c src/prepro.c src/synths.c \
src/vparms.c src/bsynz.c src/decode.c src/dyptrk.c src/f2clib.c src/invert.c \
src/lpcdec.c src/lpfilt.c src/onset.c src/placev.c src/random.c src/tbdm.c \
src/chanwr.c src/deemp.c src/encode.c src/ham84.c src/irc2pc.c src/lpcenc.c \
src/median.c src/pitsyn.c src/preemp.c src/rcchk.c src/voicin.c
liblpc10_la_CFLAGS = $(AM_CFLAGS)
liblpc10_la_LDFLAGS =
library_includedir = $(prefix)/include
library_include_HEADERS = src/f2c.h src/lpc10.h

View File

View File

@ -1,89 +0,0 @@
Tue Aug 20 16:19:51 CDT 1996
Andy Fingerhut (jaf@arl.wustl.edu)
In release 1.4, there are quite a few hand modifications to the C code
that was automatically created from the Fortran code with f2c. They
are all summarized in change log comments at the beginning of the
changed files. All of the original files from f2c were checked in to
RCS before modification, so it is possible to see exactly what changes
were made, for the extremely curious. That precaution was also for my
benefit, in case I ever recompile the Fortran sources, and want to
make similar changes to that new C source code.
Below is the README file for this directory included with the 1.3
release of the LPC-10 package. A few parts of it are a little out of
date, but it is correct for the most part.
Sun Jul 7 15:30:31 CDT 1996
Andy Fingerhut (jaf@arl.wustl.edu)
To create the LPC-10 library, copy the appropriate makefile to the
proper name for easy use, e.g., for Unix, copy makefile.unx to the
file "Makefile". The file makefile.dos has been used with some
version of the 'nmake' utility that comes with the Microsoft C
compiler (the same one used for Nautilus v1.5a, which I believe
specifies Microsoft C version 7.0 or later).
Then edit the file lpc10.h in the directory above. It should already
be set up to work properly on any Unix compiler for which "int" is 32
bits and "short" is 16 bits, and under the Microsoft C compiler
configured so that "long" is 32 bits and "int" is 16 bits. There must
be a typedef for the two types INT32 and INT16 in that file. You
should choose types that compile to those sizes using your compiler,
because there are places in the LPC-10 code that expect INT16's to
have exactly 16 bits (at least, I *think* they must be no larger), and
INT32's to have exactly 32 bits.
A few notes on how these files were created
-------------------------------------------
(This section is mostly for my benefit, so I can remember what I did.
You don't need to read it if you just want to use this package. It
might be useful to read it if you change the Fortran sources and want
to recreate a usable library of C sources. -- Andy)
These C sources were created automatically from the Fortran sources
using f2c, for the most part. Listed below are the extra
modifications that were made after this automatic conversion. Many of
them were made so that it was not necessary to install f2c in order to
use this LPC-10 coder.
1.
Put all of those files that were necessary for only the coder, rather
than an application that uses the coder, into this subdirectory called
lpc10.
2.
Copied f2c.h from the f2c distribution into this subdirectory. Some
modifications were made to the "typedef" statements in this file, to
explicitly indicate the sizes (in bits) that different integer types
should be. The types INT32 and INT16 must be defined in a file called
lpc10.h in the directory above. Created the file f2clib.c, containing
only the functions pow_ii(), r_sign(), and i_nint() from the f2c
library.
3.
The f2c output originally had a file called contrl_com.c, that defined
a small structure containing a few variables that were used in many
different functions of the LPC10 code. Every file containing
functions that used it defined it as "extern", while contrl_com.c
actually allocated storage for the structure. Bill Dorsey, one of the
lead developers of Nautilus, said that the Microsoft C compiler had
problems either compiling this file, or linking it with all of the
other compiled files, so he just eliminated that file and removed the
"extern" keyword from the one of the files that declared it that way.
The file chosen (arbitrarily) was analys.c.
4.
Copied the makefiles for Unix and Microsoft C from the Nautilus v1.5a
distribution into the lpc10 directory. Modified them to take out
references to Nautilus. These makefiles don't create an executable,
but a library of compiled functions called liblpc10.a (Unix) or
LPC10.LIB (DOS). This library can be used when linking an executable
that calls the functions lpcini_(), lpcenc_(), and lpcdec_().

View File

@ -1,142 +0,0 @@
AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$2])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl the only difference - the LANG selection... and the default FLAGS
AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl -------------------------------------------------------------------------
AC_DEFUN([AX_CFLAGS_GCC_OPTION_NEW], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$1])dnl
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"])
m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl the only difference - the LANG selection... and the default FLAGS
AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_NEW], [dnl
AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"])
m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
AC_DEFUN([AX_CFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1,
[AX_CFLAGS_GCC_OPTION_NEW($@)],[AX_CFLAGS_GCC_OPTION_OLD($@)])])
AC_DEFUN([AX_CXXFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1,
[AX_CXXFLAGS_GCC_OPTION_NEW($@)],[AX_CXXFLAGS_GCC_OPTION_OLD($@)])])

View File

@ -1,140 +0,0 @@
AC_DEFUN([AX_CFLAGS_SUN_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_sun_option_$2])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for sun/cc m4_ifval($2,$2,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "+xstrconst % -xc99=all m4_ifval($2,$2,-option)" dnl Solaris C
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl the only difference - the LANG selection... and the default FLAGS
AC_DEFUN([AX_CXXFLAGS_SUN_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_sun_option_$2])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for sun/cc m4_ifval($2,$2,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "+xstrconst % -xc99=all m4_ifval($2,$2,-option)" dnl Solaris C
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl -----------------------------------------------------------------------
AC_DEFUN([AX_CFLAGS_SUN_OPTION_NEW], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_sun_option_$1])dnl
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for sun/cc m4_ifval($1,$1,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "+xstrconst % -xc99=all m4_ifval($1,$1,-option)" dnl Solaris C
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"])
m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl the only difference - the LANG selection... and the default FLAGS
AC_DEFUN([AX_CXXFLAGS_SUN_OPTION_NEW], [dnl
AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_sun_option_$1])dnl
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for sun/cc m4_ifval($1,$1,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "+xstrconst % -xc99=all m4_ifval($1,$1,-option)" dnl Solaris C
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"])
m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
AC_DEFUN([AX_CFLAGS_SUN_OPTION],[ifelse(m4_regexp([$2],[-]),-1,
[AX_CFLAGS_SUN_OPTION_NEW($@)],[AX_CFLAGS_SUN_OPTION_OLD($@)])])
AC_DEFUN([AX_CXXFLAGS_SUN_OPTION],[ifelse(m4_regexp([$2],[-]),-1,
[AX_CXXFLAGS_SUN_OPTION_NEW($@)],[AX_CXXFLAGS_SUN_OPTION_OLD($@)])])

View File

@ -1,148 +0,0 @@
AC_DEFUN([AX_GCC_ARCHFLAG],
[AC_REQUIRE([AC_PROG_CC])
AC_ARG_WITH(gcc-arch, [AC_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
ax_gcc_arch=$withval, ax_gcc_arch=yes)
AC_MSG_CHECKING([for gcc architecture flag])
AC_MSG_RESULT([])
AC_CACHE_VAL(ax_cv_gcc_archflag,
[
ax_cv_gcc_archflag="unknown"
if test "$GCC" = yes; then
if test "x$ax_gcc_arch" = xyes; then
ax_gcc_arch=""
if test "$cross_compiling" = no; then
case $host_cpu in
i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
AX_GCC_X86_CPUID(0)
AX_GCC_X86_CPUID(1)
case $ax_cv_gcc_x86_cpuid_0 in
*:756e6547:*:*) # Intel
case $ax_cv_gcc_x86_cpuid_1 in
*5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
*5??:*:*:*) ax_gcc_arch=pentium ;;
*6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
*6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
*6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
*6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
*6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
*6??:*:*:*) ax_gcc_arch=pentiumpro ;;
*f3[[347]]:*:*:*|*f4[1347]:*:*:*)
case $host_cpu in
x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
*) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
esac ;;
*f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
esac ;;
*:68747541:*:*) # AMD
case $ax_cv_gcc_x86_cpuid_1 in
*5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
*5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
*5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
*60?:*:*:*) ax_gcc_arch=k7 ;;
*6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
*6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
*67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
*6[[68a]]?:*:*:*)
AX_GCC_X86_CPUID(0x80000006) # L2 cache size
case $ax_cv_gcc_x86_cpuid_0x80000006 in
*:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
*) ax_gcc_arch="athlon-4 athlon k7" ;;
esac ;;
*f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
*f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
*f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
*f??:*:*:*) ax_gcc_arch="k8" ;;
esac ;;
*:746e6543:*:*) # IDT
case $ax_cv_gcc_x86_cpuid_1 in
*54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
*58?:*:*:*) ax_gcc_arch=winchip2 ;;
*6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
*69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
esac ;;
esac
if test x"$ax_gcc_arch" = x; then # fallback
case $host_cpu in
i586*) ax_gcc_arch=pentium ;;
i686*) ax_gcc_arch=pentiumpro ;;
esac
fi
;;
sparc*)
AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
case $cputype in
*ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
*ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
*ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
*supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
*hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
*cypress*) ax_gcc_arch=cypress ;;
esac ;;
alphaev5) ax_gcc_arch=ev5 ;;
alphaev56) ax_gcc_arch=ev56 ;;
alphapca56) ax_gcc_arch="pca56 ev56" ;;
alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
alphaev6) ax_gcc_arch=ev6 ;;
alphaev67) ax_gcc_arch=ev67 ;;
alphaev68) ax_gcc_arch="ev68 ev67" ;;
alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
powerpc*)
cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
case $cputype in
*750*) ax_gcc_arch="750 G3" ;;
*740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
*74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
*74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
*970*) ax_gcc_arch="970 G5 power4";;
*POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
*POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
603ev|8240) ax_gcc_arch="$cputype 603e 603";;
*) ax_gcc_arch=$cputype ;;
esac
ax_gcc_arch="$ax_gcc_arch powerpc"
;;
esac
fi # not cross-compiling
fi # guess arch
if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
for arch in $ax_gcc_arch; do
if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
flags="-mtune=$arch"
# -mcpu=$arch and m$arch generate nonportable code on every arch except
# x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr.
case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
else
flags="-march=$arch -mcpu=$arch -m$arch"
fi
for flag in $flags; do
AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break])
done
test "x$ax_cv_gcc_archflag" = xunknown || break
done
fi
fi # $GCC=yes
])
AC_MSG_CHECKING([for gcc architecture flag])
AC_MSG_RESULT($ax_cv_gcc_archflag)
if test "x$ax_cv_gcc_archflag" = xunknown; then
m4_default([$3],:)
else
m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
fi
])

View File

@ -1,21 +0,0 @@
AC_DEFUN([AX_GCC_X86_CPUID],
[AC_REQUIRE([AC_PROG_CC])
AC_LANG_PUSH([C])
AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
[AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
int op = $1, eax, ebx, ecx, edx;
FILE *f;
__asm__("cpuid"
: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
: "a" (op));
f = fopen("conftest_cpuid", "w"); if (!f) return 1;
fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
fclose(f);
return 0;
])],
[ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
[ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
[ax_cv_gcc_x86_cpuid_$1=unknown])])
AC_LANG_POP([C])
])

View File

@ -1,9 +0,0 @@
AC_DEFUN([AC_PROG_GZIP],[
AC_CHECK_PROGS(gzip,[gzip],no)
export gzip;
if test $gzip = "no" ;
then
AC_MSG_ERROR([Unable to find the gzip application]);
fi
AC_SUBST(gzip)
])

View File

@ -1,9 +0,0 @@
AC_DEFUN([AC_PROG_WGET],[
AC_CHECK_PROGS(wget,[wget],no)
export wget;
if test $wget = "no" ;
then
AC_MSG_ERROR([Unable to find the wget application]);
fi
AC_SUBST(wget)
])

View File

@ -1,120 +0,0 @@
AC_DEFUN([AX_CC_MAXOPT],
[
AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([AX_COMPILER_VENDOR])
AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])],
acx_maxopt_portable=$withval, acx_maxopt_portable=no)
# Try to determine "good" native compiler flags if none specified via CFLAGS
if test "$ac_test_CFLAGS" != "set"; then
CFLAGS=""
case $ax_cv_c_compiler_vendor in
dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
if test "x$acx_maxopt_portable" = xno; then
CFLAGS="$CFLAGS -arch host"
fi;;
sun) CFLAGS="-native -fast -xO5 -dalign -xc99=all"
if test "x$acx_maxopt_portable" = xyes; then
CFLAGS="$CFLAGS -xarch=generic"
fi;;
hp) CFLAGS="+Oall +Optrs_ansi +DSnative"
if test "x$acx_maxopt_portable" = xyes; then
CFLAGS="$CFLAGS +DAportable"
fi;;
ibm) if test "x$acx_maxopt_portable" = xno; then
xlc_opt="-qarch=auto -qtune=auto"
else
xlc_opt="-qtune=auto"
fi
AX_CHECK_COMPILER_FLAGS($xlc_opt,
CFLAGS="-O3 -qansialias -w $xlc_opt",
[CFLAGS="-O3 -qansialias -w"
echo "******************************************************"
echo "* You seem to have the IBM C compiler. It is *"
echo "* recommended for best performance that you use: *"
echo "* *"
echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
echo "* ^^^ ^^^ *"
echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *"
echo "* CPU you have. (Set the CFLAGS environment var. *"
echo "* and re-run configure.) For more info, man cc. *"
echo "******************************************************"])
;;
intel) CFLAGS="-O3 -ansi_alias"
if test "x$acx_maxopt_portable" = xno; then
icc_archflag=unknown
icc_flags=""
case $host_cpu in
i686*|x86_64*)
# icc accepts gcc assembly syntax, so these should work:
AX_GCC_X86_CPUID(0)
AX_GCC_X86_CPUID(1)
case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
*:756e6547:*:*) # Intel
case $ax_cv_gcc_x86_cpuid_1 in
*6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";;
*f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";;
*f??:*:*:*) icc_flags="-xN -xW -xK";;
esac ;;
esac ;;
esac
if test "x$icc_flags" != x; then
for flag in $icc_flags; do
AX_CHECK_COMPILER_FLAGS($flag, [icc_archflag=$flag; break])
done
fi
AC_MSG_CHECKING([for icc architecture flag])
AC_MSG_RESULT($icc_archflag)
if test "x$icc_archflag" != xunknown; then
CFLAGS="$CFLAGS $icc_archflag"
fi
fi
;;
gnu)
# default optimization flags for gcc on all systems
CFLAGS="-O3 -fomit-frame-pointer"
# -malign-double for x86 systems
AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double")
# -fstrict-aliasing for gcc-2.95+
AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing,
CFLAGS="$CFLAGS -fstrict-aliasing")
# note that we enable "unsafe" fp optimization with other compilers, too
AX_CHECK_COMPILER_FLAGS(-ffast-math, CFLAGS="$CFLAGS -ffast-math")
AX_GCC_ARCHFLAG($acx_maxopt_portable)
;;
esac
if test -z "$CFLAGS"; then
echo ""
echo "********************************************************"
echo "* WARNING: Don't know the best CFLAGS for this system *"
echo "* Use ./configure CFLAGS=... to specify your own flags *"
echo "* (otherwise, a default of CFLAGS=-O3 will be used) *"
echo "********************************************************"
echo ""
CFLAGS="-O3"
fi
AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [
echo ""
echo "********************************************************"
echo "* WARNING: The guessed CFLAGS don't seem to work with *"
echo "* your compiler. *"
echo "* Use ./configure CFLAGS=... to specify your own flags *"
echo "********************************************************"
echo ""
CFLAGS=""
])
fi
])

View File

@ -1,94 +0,0 @@
AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_warn_all_ansi])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
# IRIX C compiler:
# -use_readonly_const is the default for IRIX C,
# puts them into .rodata, but they are copied later.
# need to be "-G0 -rdatashared" for strictmode but
# I am not sure what effect that has really. - guidod
for ac_arg dnl
in "-pedantic % -Wall -std=c99 -pedantic" dnl GCC
"-xstrconst % -v -xc99=all" dnl Solaris C
"-std1 % -verbose -w0 -warnprotos -std1" dnl Digital Unix
" % -qlanglvl=ansi -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
" % -ansi -ansiE -fullwarn" dnl IRIX
"+ESlit % +w1 -Aa" dnl HP-UX C
"-Xc % -pvctl[,]fullmsg -Xc" dnl NEC SX-5 (Super-UX 10)
"-h conform % -h msglevel 2 -h conform" dnl Cray C (Unicos)
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl the only difference - the LANG selection... and the default FLAGS
AC_DEFUN([AX_CXXFLAGS_WARN_ALL_ANSI],[dnl
AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all_ansi])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
# IRIX C compiler:
# -use_readonly_const is the default for IRIX C,
# puts them into .rodata, but they are copied later.
# need to be "-G0 -rdatashared" for strictmode but
# I am not sure what effect that has really. - guidod
for ac_arg dnl
in "-pedantic % -Wall -ansi -pedantic" dnl GCC
"-xstrconst % -v -Xc" dnl Solaris C
"-std1 % -verbose -w0 -warnprotos -std1" dnl Digital Unix
" % -qlanglvl=ansi -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
" % -ansi -ansiE -fullwarn" dnl IRIX
"+ESlit % +w1 -Aa" dnl HP-UX C
"-Xc % -pvctl[,]fullmsg -Xc" dnl NEC SX-5 (Super-UX 10)
"-h conform % -h msglevel 2 -h conform" dnl Cray C (Unicos)
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])

View File

@ -1,26 +0,0 @@
AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
AS_LITERAL_IF([$1],
[AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1), [
ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$1"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=yes,
AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=no)
_AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
[ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$1"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=yes,
eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=no)
_AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)
AC_MSG_RESULT($ax_check_compiler_flags)
if test "x$ax_check_compiler_flags" = xyes; then
m4_default([$2], :)
else
m4_default([$3], :)
fi
])dnl AX_CHECK_COMPILER_FLAG

View File

@ -1,15 +0,0 @@
AC_DEFUN([AX_COMPILER_VENDOR],
[
AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
[ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
# note: don't check for gcc first since some other compilers define __GNUC__
for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
#if !($vencpp)
thisisanerror;
#endif
])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
done
])
])

View File

@ -1,127 +0,0 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(liblpc10, 1.0, liblpc10)
AC_CONFIG_AUX_DIR(build)
AM_INIT_AUTOMAKE(liblpc10,1.0)
#Set default language
AC_LANG_C
# Checks for programs.
AC_PROG_CC
AC_PROG_MAKE_SET
AC_PROG_LIBTOOL
AC_PROG_INSTALL
#Check for compiler vendor
AX_COMPILER_VENDOR
# Optimize
AC_ARG_ENABLE(optimization,
[AC_HELP_STRING([--enable-optimization],[Set if you want us to add max optimising compiler flags])],[enable_optimizer="$enableval"],[enable_optimizer="no"])
if test "${enable_optimizer}" = "yes" ; then
AC_DEFINE([OPTIMZER],[],[Enable Optimization.])
AX_CC_MAXOPT
fi
# Enable debugging
AC_ARG_ENABLE(debug,
[AC_HELP_STRING([--enable-debug],[build with debug information])],[enable_debug="$enable_debug"],[enable_debug="yes"])
if test "${enable_debug}" = "yes"; then
AC_DEFINE([DEBUG],[],[Enable extra debugging.])
AX_CFLAGS_WARN_ALL_ANSI
fi
AM_CONDITIONAL([WANT_DEBUG],[test "${enable_debug}" = "yes"])
case "$host" in
*-solaris2*)
if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then
SOLINK="-Bdynamic -dy -G"
new_AM_CFLAGS="-KPIC -DPIC"
new_AM_LDFLAGS="-R${prefix}/lib"
elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then
SOLINK="-Bdynamic -dy -G"
new_AM_CFLAGS="-fPIC"
new_AM_LDFLAGS=""
IN_LINE=inline
fi
DYNAMIC_LIB_EXTEN="so"
;;
*-darwin*)
if test "x${ax_cv_c_compiler_vendor}"="xgnu" ; then
SOLINK="-dynamic -bundle -force-flat-namespace"
new_AM_CFLAGS="-DMACOSX"
new_AM_LDFLAGS=""
fi
DYNAMIC_LIB_EXTEN="dylib"
;;
x86_64-*-linux-gnu)
if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then
SOLINK="-Bdynamic -dy -G"
new_AM_CFLAGS="-KPIC -DPIC"
new_AM_LDFLAGS="-R${prefix}/lib"
elif test "x${ax_cv_c_compiler_vendor}"="xgnu" ; then
SOLINK="-shared -Xlinker -x"
new_AM_CFLAGS="-fPIC"
new_AM_LDFLAGS=""
fi
DYNAMIC_LIB_EXTEN="so"
;;
i*6-*-linux-gnu)
if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then
SOLINK="-Bdynamic -dy -G"
new_AM_CFLAGS="-KPIC -DPIC"
new_AM_LDFLAGS="-R${prefix}/lib"
elif test "x${ax_cv_c_compiler_vendor}"="xgnu" ; then
SOLINK="-shared -Xlinker -x"
new_AM_CFLAGS="-fpic"
new_AM_LDFLAGS=""
fi
DYNAMIC_LIB_EXTEN="so"
;;
x86_64-*-freebsd*|amd64-*-freebsd*)
SOLINK="-shared -Xlinker -x"
new_AM_CFLAGS="-fPIC"
new_AM_LDFLAGS=""
DYNAMIC_LIB_EXTEN="so"
;;
i*6-*-freebsd*)
SOLINK="-shared -Xlinker -x"
new_AM_CFLAGS="-fpic"
new_AM_LDFLAGS=""
DYNAMIC_LIB_EXTEN="so"
;;
esac
# Enable 64 bit build
AC_ARG_ENABLE(64,
[AC_HELP_STRING([--enable-64],[build with 64 bit support])],[enable_64="$enable_64"],[enable_64="no"])
if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then
if test "${enable_64}" = "yes"; then
new_AM_CFLAGS="$new_AM_CFLAGS -m64"
fi
fi
AC_SUBST(new_AM_CFLAGS)
AC_SUBST(new_AM_LDFLAGS)
AC_SUBST(SOLINK)
AC_SUBST(DYNAMIC_LIB_EXTEN)
# Checks for libraries.
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([malloc.h stdlib.h])
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS([floor sqrt])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

View File

@ -1,2 +0,0 @@
#! /bin/sh
./configure "$@" --disable-shared

View File

@ -1,306 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="liblpc10"
ProjectGUID="{FF1D238A-9D59-4850-838E-78182E05736B}"
RootNamespace="liblpc10"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="4"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="4"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\f2c.h"
>
</File>
<File
RelativePath=".\lpc10.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\analys.c"
>
</File>
<File
RelativePath=".\bsynz.c"
>
</File>
<File
RelativePath=".\chanwr.c"
>
</File>
<File
RelativePath=".\dcbias.c"
>
</File>
<File
RelativePath=".\decode.c"
>
</File>
<File
RelativePath=".\deemp.c"
>
</File>
<File
RelativePath=".\difmag.c"
>
</File>
<File
RelativePath=".\dyptrk.c"
>
</File>
<File
RelativePath=".\encode.c"
>
</File>
<File
RelativePath=".\energy.c"
>
</File>
<File
RelativePath=".\f2clib.c"
>
</File>
<File
RelativePath=".\ham84.c"
>
</File>
<File
RelativePath=".\hp100.c"
>
</File>
<File
RelativePath=".\invert.c"
>
</File>
<File
RelativePath=".\irc2pc.c"
>
</File>
<File
RelativePath=".\ivfilt.c"
>
</File>
<File
RelativePath=".\lpcdec.c"
>
</File>
<File
RelativePath=".\lpcenc.c"
>
</File>
<File
RelativePath=".\lpcini.c"
>
</File>
<File
RelativePath=".\lpfilt.c"
>
</File>
<File
RelativePath=".\median.c"
>
</File>
<File
RelativePath=".\mload.c"
>
</File>
<File
RelativePath=".\onset.c"
>
</File>
<File
RelativePath=".\pitsyn.c"
>
</File>
<File
RelativePath=".\placea.c"
>
</File>
<File
RelativePath=".\placev.c"
>
</File>
<File
RelativePath=".\preemp.c"
>
</File>
<File
RelativePath=".\prepro.c"
>
</File>
<File
RelativePath=".\random.c"
>
</File>
<File
RelativePath=".\rcchk.c"
>
</File>
<File
RelativePath=".\synths.c"
>
</File>
<File
RelativePath=".\tbdm.c"
>
</File>
<File
RelativePath=".\voicin.c"
>
</File>
<File
RelativePath=".\vparms.c"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,631 +0,0 @@
/*
$Log: analys.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:16:01 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:29:08 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int analys_(real *speech, integer *voice, integer *pitch, real *rms, real *rc, struct lpc10_encoder_state *st);
/* comlen contrl_ 12 */
/*:ref: preemp_ 14 5 6 6 4 6 6 */
/*:ref: onset_ 14 7 6 4 4 4 4 4 4 */
/*:ref: placev_ 14 11 4 4 4 4 4 4 4 4 4 4 4 */
/*:ref: lpfilt_ 14 4 6 6 4 4 */
/*:ref: ivfilt_ 14 5 6 6 4 4 6 */
/*:ref: tbdm_ 14 8 6 4 4 4 6 4 4 4 */
/*:ref: voicin_ 14 12 4 6 6 4 4 6 6 4 6 4 4 4 */
/*:ref: dyptrk_ 14 6 6 4 4 4 4 4 */
/*:ref: placea_ 14 9 4 4 4 4 4 4 4 4 4 */
/*:ref: dcbias_ 14 3 4 6 6 */
/*:ref: energy_ 14 3 4 6 6 */
/*:ref: mload_ 14 6 4 4 4 6 6 6 */
/*:ref: invert_ 14 4 4 6 6 6 */
/*:ref: rcchk_ 14 3 4 6 6 */
/*:ref: initonset_ 14 0 */
/*:ref: initvoicin_ 14 0 */
/*:ref: initdyptrk_ 14 0 */
/* Rerunning f2c -P may change prototypes or declarations. */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* Table of constant values */
static integer c__10 = 10;
static integer c__181 = 181;
static integer c__720 = 720;
static integer c__3 = 3;
static integer c__90 = 90;
static integer c__156 = 156;
static integer c__307 = 307;
static integer c__462 = 462;
static integer c__312 = 312;
static integer c__60 = 60;
static integer c__1 = 1;
/* ****************************************************************** */
/* ANALYS Version 55 */
/* $Log: analys.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:16:01 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:29:08 jaf
* Initial revision
*
*/
/* Revision 1.9 1996/05/23 19:41:07 jaf */
/* Commented out some unnecessary lines that were reading uninitialized */
/* values. */
/* Revision 1.8 1996/03/27 23:57:55 jaf */
/* Added some comments about which indices of the local buffers INBUF, */
/* LPBUF, etc., get read or modified by some of the subroutine calls. I */
/* just did this while trying to figure out the discrepancy between the */
/* embedded code compiled with all local variables implicitly saved, and */
/* without. */
/* I added some debugging write statements in hopes of finding a problem. */
/* None of them ever printed anything while running with the long input */
/* speech file dam9.spd provided in the distribution. */
/* Revision 1.7 1996/03/27 18:06:20 jaf */
/* Commented out access to MAXOSP, which is just a debugging variable */
/* that was defined in the COMMON block CONTRL in contrl.fh. */
/* Revision 1.6 1996/03/26 19:31:33 jaf */
/* Commented out trace statements. */
/* Revision 1.5 1996/03/21 15:19:35 jaf */
/* Added comments for ENTRY PITDEC. */
/* Revision 1.4 1996/03/19 20:54:27 jaf */
/* Added a line to INITANALYS. See comments there. */
/* Revision 1.3 1996/03/19 20:52:49 jaf */
/* Rearranged the order of the local variables quite a bit, to separate */
/* them into groups of "constants", "locals that don't need to be saved */
/* from one call to the next", and "local that do need to be saved from */
/* one call to the next". */
/* Several locals in the last set should have been given initial values, */
/* but weren't. I gave them all initial values of 0. */
/* Added a separate ENTRY INITANALYS that initializes all local state */
/* that should be, and also calls the corresponding entries of the */
/* subroutines called by ANALYS that also have local state. */
/* There used to be DATA statements in ANALYS. I got rid of most of */
/* them, and added a local logical variable FIRST that calls the entry */
/* INITANALYS on the first call to ANALYS. This is just so that one need */
/* not remember to call INITANALYS first in order for the state to be */
/* initialized. */
/* Revision 1.2 1996/03/11 23:29:32 jaf */
/* Added several comments with my own personal questions about the */
/* Fortran 77 meaning of the parameters passed to the subroutine PREEMP. */
/* Revision 1.1 1996/02/07 14:42:29 jaf */
/* Initial revision */
/* ****************************************************************** */
/* SUBROUTINE ANALYS */
/* Input: */
/* SPEECH */
/* Indices 1 through LFRAME read. */
/* Output: */
/* VOICE */
/* Indices 1 through 2 written. */
/* PITCH */
/* Written in subroutine DYPTRK, and then perhaps read and written */
/* some more. */
/* RMS */
/* Written. */
/* RC */
/* Indices 1 through ORDER written (ORDER defined in contrl.fh). */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITANALYS. */
/* ENTRY PITDEC */
/* Input: */
/* PITCH - Encoded pitch index */
/* Output: */
/* PTAU - Decoded pitch period */
/* This entry has no local state. It accesses a "constant" array */
/* declared in ANALYS. */
/* Subroutine */ int analys_(real *speech, integer *voice, integer
*pitch, real *rms, real *rc, struct lpc10_encoder_state *st)
{
/* Initialized data */
static integer tau[60] = { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,
35,36,37,38,39,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,
74,76,78,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,
140,144,148,152,156 };
static integer buflim[4] = { 181,720,25,720 };
static real precoef = .9375f;
/* System generated locals */
integer i__1;
/* Local variables */
real amdf[60];
integer half;
real abuf[156];
real *bias;
extern /* Subroutine */ int tbdm_(real *, integer *, integer *, integer *,
real *, integer *, integer *, integer *);
integer *awin;
integer midx, ewin[6] /* was [2][3] */;
real ivrc[2], temp;
real *zpre;
integer *vwin;
integer i__, j, lanal;
extern /* Subroutine */ int rcchk_(integer *, real *, real *), mload_(
integer *, integer *, integer *, real *, real *, real *);
real *inbuf, *pebuf;
real *lpbuf, *ivbuf;
real *rcbuf;
integer *osbuf;
extern /* Subroutine */ int onset_(real *, integer *, integer *, integer *
, integer *, integer *, integer *, struct lpc10_encoder_state *);
integer *osptr;
extern /* Subroutine */ placea_(integer *, integer *
, integer *, integer *, integer *, integer *, integer *, integer *
, integer *), dcbias_(integer *, real *, real *), placev_(integer
*, integer *, integer *, integer *, integer *, integer *, integer
*, integer *, integer *, integer *, integer *);
integer ipitch;
integer *obound;
extern /* Subroutine */ int preemp_(real *, real *, integer *, real *,
real *), voicin_(integer *, real *, real *, integer *, integer *,
real *, real *, integer *, real *, integer *, integer *, integer *,
struct lpc10_encoder_state *);
integer *voibuf;
integer mintau;
real *rmsbuf;
extern /* Subroutine */ int lpfilt_(real *, real *, integer *, integer *),
ivfilt_(real *, real *, integer *, integer *, real *), energy_(
integer *, real *, real *), invert_(integer *, real *, real *,
real *);
integer minptr, maxptr;
extern /* Subroutine */ int dyptrk_(real *, integer *, integer *, integer
*, integer *, integer *, struct lpc10_encoder_state *);
real phi[100] /* was [10][10] */, psi[10];
/* $Log: analys.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:16:01 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:29:08 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Arguments to ANALYS */
/* $Log: analys.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:16:01 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:29:08 jaf
* Initial revision
* */
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Arguments to entry PITDEC (below) */
/* Parameters/constants */
/* Constants */
/* NF = Number of frames */
/* AF = Frame in which analysis is done */
/* OSLEN = Length of the onset buffer */
/* LTAU = Number of pitch lags */
/* SBUFL, SBUFH = Start and end index of speech buffers */
/* LBUFL, LBUFH = Start and end index of LPF speech buffer */
/* MINWIN, MAXWIN = Min and Max length of voicing (and analysis) windows
*/
/* PWLEN, PWINH, PWINL = Length, upper and lower limits of pitch window
*/
/* DVWINL, DVWINH = Default lower and upper limits of voicing window */
/* The tables TAU and BUFLIM, and the variable PRECOEF, are not */
/* Fortran PARAMETER's, but they are initialized with DATA */
/* statements, and never modified. Thus, they need not have SAVE */
/* statements for them to keep their values from one invocation to
*/
/* the next. */
/* Local variables that need not be saved */
/* Local state */
/* Data Buffers */
/* INBUF Raw speech (with DC bias removed each frame) */
/* PEBUF Preemphasized speech */
/* LPBUF Low pass speech buffer */
/* IVBUF Inverse filtered speech */
/* OSBUF Indexes of onsets in speech buffers */
/* VWIN Voicing window indices */
/* AWIN Analysis window indices */
/* EWIN Energy window indices */
/* VOIBUF Voicing decisions on windows in VWIN */
/* RMSBUF RMS energy */
/* RCBUF Reflection Coefficients */
/* Pitch is handled separately from the above parameters. */
/* The following variables deal with pitch: */
/* MIDX Encoded initial pitch estimate for analysis frame */
/* IPITCH Initial pitch computed for frame AF (decoded from MIDX) */
/* PITCH The encoded pitch value (index into TAU) for the present */
/* frame (delayed and smoothed by Dyptrack) */
/* Parameter adjustments */
if (speech) {
--speech;
}
if (voice) {
--voice;
}
if (rc) {
--rc;
}
/* Function Body */
/* Calculations are done on future frame due to requirements */
/* of the pitch tracker. Delay RMS and RC's 2 frames to give */
/* current frame parameters on return. */
/* Update all buffers */
inbuf = &(st->inbuf[0]);
pebuf = &(st->pebuf[0]);
lpbuf = &(st->lpbuf[0]);
ivbuf = &(st->ivbuf[0]);
bias = &(st->bias);
osbuf = &(st->osbuf[0]);
osptr = &(st->osptr);
obound = &(st->obound[0]);
vwin = &(st->vwin[0]);
awin = &(st->awin[0]);
voibuf = &(st->voibuf[0]);
rmsbuf = &(st->rmsbuf[0]);
rcbuf = &(st->rcbuf[0]);
zpre = &(st->zpre);
i__1 = 720 - contrl_1.lframe;
for (i__ = 181; i__ <= i__1; ++i__) {
inbuf[i__ - 181] = inbuf[contrl_1.lframe + i__ - 181];
pebuf[i__ - 181] = pebuf[contrl_1.lframe + i__ - 181];
}
i__1 = 540 - contrl_1.lframe;
for (i__ = 229; i__ <= i__1; ++i__) {
ivbuf[i__ - 229] = ivbuf[contrl_1.lframe + i__ - 229];
}
i__1 = 720 - contrl_1.lframe;
for (i__ = 25; i__ <= i__1; ++i__) {
lpbuf[i__ - 25] = lpbuf[contrl_1.lframe + i__ - 25];
}
j = 1;
i__1 = (*osptr) - 1;
for (i__ = 1; i__ <= i__1; ++i__) {
if (osbuf[i__ - 1] > contrl_1.lframe) {
osbuf[j - 1] = osbuf[i__ - 1] - contrl_1.lframe;
++j;
}
}
*osptr = j;
voibuf[0] = voibuf[2];
voibuf[1] = voibuf[3];
for (i__ = 1; i__ <= 2; ++i__) {
vwin[(i__ << 1) - 2] = vwin[(i__ + (1 << 1)) - 2] - contrl_1.lframe;
vwin[(i__ << 1) - 1] = vwin[(i__ + (1 << 1)) - 1] - contrl_1.lframe;
awin[(i__ << 1) - 2] = awin[(i__ + (1 << 1)) - 2] - contrl_1.lframe;
awin[(i__ << 1) - 1] = awin[(i__ + (1 << 1)) - 1] - contrl_1.lframe;
/* EWIN(*,J) is unused for J .NE. AF, so the following shift is
*/
/* unnecessary. It also causes error messages when the C versio
n */
/* of the code created from this by f2c is run with Purify. It
*/
/* correctly complains that uninitialized memory is being read.
*/
/* EWIN(1,I) = EWIN(1,I+1) - LFRAME */
/* EWIN(2,I) = EWIN(2,I+1) - LFRAME */
obound[i__ - 1] = obound[i__];
voibuf[i__ * 2] = voibuf[(i__ + 1) * 2];
voibuf[(i__ << 1) + 1] = voibuf[(i__ + (1 << 1)) + 1];
rmsbuf[i__ - 1] = rmsbuf[i__];
i__1 = contrl_1.order;
for (j = 1; j <= i__1; ++j) {
rcbuf[j + i__ * 10 - 11] = rcbuf[j + (i__ + 1) * 10 - 11];
}
}
/* Copy input speech, scale to sign+12 bit integers */
/* Remove long term DC bias. */
/* If the average value in the frame was over 1/4096 (after current
*/
/* BIAS correction), then subtract that much more from samples in */
/* next frame. If the average value in the frame was under */
/* -1/4096, add 1/4096 more to samples in next frame. In all other
*/
/* cases, keep BIAS the same. */
temp = 0.f;
i__1 = contrl_1.lframe;
for (i__ = 1; i__ <= i__1; ++i__) {
inbuf[720 - contrl_1.lframe + i__ - 181] = speech[i__] * 4096.f -
(*bias);
temp += inbuf[720 - contrl_1.lframe + i__ - 181];
}
if (temp > (real) contrl_1.lframe) {
*bias += 1;
}
if (temp < (real) (-contrl_1.lframe)) {
*bias += -1;
}
/* Place Voicing Window */
i__ = 721 - contrl_1.lframe;
preemp_(&inbuf[i__ - 181], &pebuf[i__ - 181], &contrl_1.lframe, &precoef,
zpre);
onset_(pebuf, osbuf, osptr, &c__10, &c__181, &c__720, &contrl_1.lframe, st);
/* MAXOSP is just a debugging variable. */
/* MAXOSP = MAX( MAXOSP, OSPTR ) */
placev_(osbuf, osptr, &c__10, &obound[2], vwin, &c__3, &contrl_1.lframe,
&c__90, &c__156, &c__307, &c__462);
/* The Pitch Extraction algorithm estimates the pitch for a frame
*/
/* of speech by locating the minimum of the average magnitude difference
*/
/* function (AMDF). The AMDF operates on low-pass, inverse filtered */
/* speech. (The low-pass filter is an 800 Hz, 19 tap, equiripple, FIR
*/
/* filter and the inverse filter is a 2nd-order LPC filter.) The pitch
*/
/* estimate is later refined by dynamic programming (DYPTRK). However,
*/
/* since some of DYPTRK's parameters are a function of the voicing */
/* decisions, a voicing decision must precede the final pitch estimation.
*/
/* See subroutines LPFILT, IVFILT, and TBDM. */
/* LPFILT reads indices LBUFH-LFRAME-29 = 511 through LBUFH = 720 */
/* of INBUF, and writes indices LBUFH+1-LFRAME = 541 through LBUFH
*/
/* = 720 of LPBUF. */
lpfilt_(&inbuf[228], &lpbuf[384], &c__312, &contrl_1.lframe);
/* IVFILT reads indices (PWINH-LFRAME-7) = 353 through PWINH = 540
*/
/* of LPBUF, and writes indices (PWINH-LFRAME+1) = 361 through */
/* PWINH = 540 of IVBUF. */
ivfilt_(&lpbuf[204], ivbuf, &c__312, &contrl_1.lframe, ivrc);
/* TBDM reads indices PWINL = 229 through */
/* (PWINL-1)+MAXWIN+(TAU(LTAU)-TAU(1))/2 = 452 of IVBUF, and writes
*/
/* indices 1 through LTAU = 60 of AMDF. */
tbdm_(ivbuf, &c__156, tau, &c__60, amdf, &minptr, &maxptr, &mintau);
/* Voicing decisions are made for each half frame of input speech.
*/
/* An initial voicing classification is made for each half of the */
/* analysis frame, and the voicing decisions for the present frame */
/* are finalized. See subroutine VOICIN. */
/* The voicing detector (VOICIN) classifies the input signal as */
/* unvoiced (including silence) or voiced using the AMDF windowed */
/* maximum-to-minimum ratio, the zero crossing rate, energy measures, */
/* reflection coefficients, and prediction gains. */
/* The pitch and voicing rules apply smoothing and isolated */
/* corrections to the pitch and voicing estimates and, in the process,
*/
/* introduce two frames of delay into the corrected pitch estimates and
*/
/* voicing decisions. */
for (half = 1; half <= 2; ++half) {
voicin_(&vwin[4], inbuf, lpbuf, buflim, &half, &amdf[minptr - 1], &
amdf[maxptr - 1], &mintau, ivrc, obound, voibuf, &c__3, st);
}
/* Find the minimum cost pitch decision over several frames */
/* given the current voicing decision and the AMDF array */
dyptrk_(amdf, &c__60, &minptr, &voibuf[7], pitch, &midx, st);
ipitch = tau[midx - 1];
/* Place spectrum analysis and energy windows */
placea_(&ipitch, voibuf, &obound[2], &c__3, vwin, awin, ewin, &
contrl_1.lframe, &c__156);
/* Remove short term DC bias over the analysis window, Put result in ABUF
*/
lanal = awin[5] + 1 - awin[4];
dcbias_(&lanal, &pebuf[awin[4] - 181], abuf);
/* ABUF(1:LANAL) is now defined. It is equal to */
/* PEBUF(AWIN(1,AF):AWIN(2,AF)) corrected for short term DC bias. */
/* Compute RMS over integer number of pitch periods within the */
/* analysis window. */
/* Note that in a hardware implementation this computation may be */
/* simplified by using diagonal elements of PHI computed by MLOAD. */
i__1 = ewin[5] - ewin[4] + 1;
energy_(&i__1, &abuf[ewin[4] - awin[4]], &rmsbuf[2]);
/* Matrix load and invert, check RC's for stability */
mload_(&contrl_1.order, &c__1, &lanal, abuf, phi, psi);
invert_(&contrl_1.order, phi, psi, &rcbuf[20]);
rcchk_(&contrl_1.order, &rcbuf[10], &rcbuf[20]);
/* Set return parameters */
voice[1] = voibuf[2];
voice[2] = voibuf[3];
*rms = rmsbuf[0];
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
rc[i__] = rcbuf[i__ - 1];
}
return 0;
} /* analys_ */

View File

@ -1,438 +0,0 @@
/*
$Log: bsynz.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:18:55 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:58 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int bsynz_(real *coef, integer *ip, integer *iv, real *sout, real *rms, real *ratio, real *g2pass, struct lpc10_decoder_state *st);
/* comlen contrl_ 12 */
/*:ref: random_ 4 0 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* ***************************************************************** */
/* BSYNZ Version 54 */
/* $Log: bsynz.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:18:55 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:58 jaf
* Initial revision
*
*/
/* Revision 1.4 1996/03/27 18:11:22 jaf */
/* Changed the range of NOISE printed out in the debugging statements, */
/* even though they are commented out. I didn't discover this until I */
/* tried comparing two different versions of the LPC-10 coder, each with */
/* full tracing enabled. */
/* Revision 1.3 1996/03/26 19:33:23 jaf */
/* Commented out trace statements. */
/* Revision 1.2 1996/03/20 17:12:54 jaf */
/* Added comments about which indices of array arguments are read or */
/* written. */
/* Rearranged local variable declarations to indicate which need to be */
/* saved from one invocation to the next. Added entry INITBSYNZ to */
/* reinitialize the local state variables, if desired. */
/* Revision 1.1 1996/02/07 14:43:15 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Synthesize One Pitch Epoch */
/* Input: */
/* COEF - Predictor coefficients */
/* Indices 1 through ORDER read. */
/* IP - Pitch period (number of samples to synthesize) */
/* IV - Voicing for the current epoch */
/* RMS - Energy for the current epoch */
/* RATIO - Energy slope for plosives */
/* G2PASS- Sharpening factor for 2 pass synthesis */
/* Output: */
/* SOUT - Synthesized speech */
/* Indices 1 through IP written. */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITBSYNZ. */
/* Subroutine */ int bsynz_(real *coef, integer *ip, integer *iv,
real *sout, real *rms, real *ratio, real *g2pass,
struct lpc10_decoder_state *st)
{
/* Initialized data */
integer *ipo;
real *rmso;
static integer kexc[25] = { 8,-16,26,-48,86,-162,294,-502,718,-728,184,
672,-610,-672,184,728,718,502,294,162,86,48,26,16,8 };
real *exc;
real *exc2;
real *lpi1;
real *lpi2;
real *lpi3;
real *hpi1;
real *hpi2;
real *hpi3;
/* System generated locals */
integer i__1, i__2;
real r__1, r__2;
/* Builtin functions */
double sqrt(doublereal);
/* Local variables */
real gain, xssq;
integer i__, j, k;
real noise[166], pulse;
integer px;
real sscale;
extern integer random_(struct lpc10_decoder_state *);
real xy, sum, ssq;
real lpi0, hpi0;
/* $Log: bsynz.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:18:55 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:58 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Arguments */
/* $Log: bsynz.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:18:55 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:58 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Function return value definitions */
/* Parameters/constants */
/* KEXC is not a Fortran PARAMETER, but it is an array initialized
*/
/* with a DATA statement that is never modified. */
/* Local variables that need not be saved */
/* NOISE is declared with range (1:MAXPIT+MAXORD), but only indices
*/
/* ORDER+1 through ORDER+IP are ever used, and I think that IP */
/* .LE. MAXPIT. Why not declare it to be in the range (1:MAXPIT) */
/* and use that range? */
/* Local state */
/* I believe that only indices 1 through ORDER of EXC need to be */
/* saved from one invocation to the next, but we may as well save */
/* the whole array. */
/* None of these local variables were given initial values in the */
/* original code. I'm guessing that 0 is a reasonable initial */
/* value for all of them. */
/* Parameter adjustments */
if (coef) {
--coef;
}
if (sout) {
--sout;
}
/* Function Body */
ipo = &(st->ipo);
exc = &(st->exc[0]);
exc2 = &(st->exc2[0]);
lpi1 = &(st->lpi1);
lpi2 = &(st->lpi2);
lpi3 = &(st->lpi3);
hpi1 = &(st->hpi1);
hpi2 = &(st->hpi2);
hpi3 = &(st->hpi3);
rmso = &(st->rmso_bsynz);
/* MAXPIT+MAXORD=166 */
/* Calculate history scale factor XY and scale filter state */
/* Computing MIN */
r__1 = *rmso / (*rms + 1e-6f);
xy = min(r__1,8.f);
*rmso = *rms;
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
exc2[i__ - 1] = exc2[*ipo + i__ - 1] * xy;
}
*ipo = *ip;
if (*iv == 0) {
/* Generate white noise for unvoiced */
i__1 = *ip;
for (i__ = 1; i__ <= i__1; ++i__) {
exc[contrl_1.order + i__ - 1] = (real) (random_(st) / 64);
}
/* Impulse doublet excitation for plosives */
/* (RANDOM()+32768) is in the range 0 to 2**16-1. Therefore the
*/
/* following expression should be evaluated using integers with
at */
/* least 32 bits (16 isn't enough), and PX should be in the rang
e */
/* ORDER+1+0 through ORDER+1+(IP-2) .EQ. ORDER+IP-1. */
px = (random_(st) + 32768) * (*ip - 1) / 65536 + contrl_1.order + 1;
r__1 = *ratio / 4 * 1.f;
pulse = r__1 * 342;
if (pulse > 2e3f) {
pulse = 2e3f;
}
exc[px - 1] += pulse;
exc[px] -= pulse;
/* Load voiced excitation */
} else {
sscale = (real)sqrt((real) (*ip)) / 6.928f;
i__1 = *ip;
for (i__ = 1; i__ <= i__1; ++i__) {
exc[contrl_1.order + i__ - 1] = 0.f;
if (i__ <= 25) {
exc[contrl_1.order + i__ - 1] = sscale * kexc[i__ - 1];
}
lpi0 = exc[contrl_1.order + i__ - 1];
r__2 = exc[contrl_1.order + i__ - 1] * .125f + *lpi1 * .75f;
r__1 = r__2 + *lpi2 * .125f;
exc[contrl_1.order + i__ - 1] = r__1 + *lpi3 * 0.f;
*lpi3 = *lpi2;
*lpi2 = *lpi1;
*lpi1 = lpi0;
}
i__1 = *ip;
for (i__ = 1; i__ <= i__1; ++i__) {
noise[contrl_1.order + i__ - 1] = random_(st) * 1.f / 64;
hpi0 = noise[contrl_1.order + i__ - 1];
r__2 = noise[contrl_1.order + i__ - 1] * -.125f + *hpi1 * .25f;
r__1 = r__2 + *hpi2 * -.125f;
noise[contrl_1.order + i__ - 1] = r__1 + *hpi3 * 0.f;
*hpi3 = *hpi2;
*hpi2 = *hpi1;
*hpi1 = hpi0;
}
i__1 = *ip;
for (i__ = 1; i__ <= i__1; ++i__) {
exc[contrl_1.order + i__ - 1] += noise[contrl_1.order + i__ - 1];
}
}
/* Synthesis filters: */
/* Modify the excitation with all-zero filter 1 + G*SUM */
xssq = 0.f;
i__1 = *ip;
for (i__ = 1; i__ <= i__1; ++i__) {
k = contrl_1.order + i__;
sum = 0.f;
i__2 = contrl_1.order;
for (j = 1; j <= i__2; ++j) {
sum += coef[j] * exc[k - j - 1];
}
sum *= *g2pass;
exc2[k - 1] = sum + exc[k - 1];
}
/* Synthesize using the all pole filter 1 / (1 - SUM) */
i__1 = *ip;
for (i__ = 1; i__ <= i__1; ++i__) {
k = contrl_1.order + i__;
sum = 0.f;
i__2 = contrl_1.order;
for (j = 1; j <= i__2; ++j) {
sum += coef[j] * exc2[k - j - 1];
}
exc2[k - 1] = sum + exc2[k - 1];
xssq += exc2[k - 1] * exc2[k - 1];
}
/* Save filter history for next epoch */
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
exc[i__ - 1] = exc[*ip + i__ - 1];
exc2[i__ - 1] = exc2[*ip + i__ - 1];
}
/* Apply gain to match RMS */
r__1 = *rms * *rms;
ssq = r__1 * *ip;
gain = (real)sqrt(ssq / xssq);
i__1 = *ip;
for (i__ = 1; i__ <= i__1; ++i__) {
sout[i__] = gain * exc2[contrl_1.order + i__ - 1];
}
return 0;
} /* bsynz_ */

View File

@ -1,226 +0,0 @@
/*
$Log: chanwr.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:20:24 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Revision 1.1 1996/08/19 22:40:31 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int chanwr_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits, struct lpc10_encoder_state *st);
extern int chanrd_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* *********************************************************************** */
/* CHANL Version 49 */
/* $Log: chanwr.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:20:24 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Revision 1.1 1996/08/19 22:40:31 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/21 15:14:57 jaf */
/* Added comments about which indices of argument arrays are read or */
/* written, and about the one bit of local state in CHANWR. CHANRD */
/* has no local state. */
/* Revision 1.2 1996/03/13 18:55:10 jaf */
/* Comments added explaining which of the local variables of this */
/* subroutine need to be saved from one invocation to the next, and which */
/* do not. */
/* Revision 1.1 1996/02/07 14:43:31 jaf */
/* Initial revision */
/* *********************************************************************** */
/* CHANWR: */
/* Place quantized parameters into bitstream */
/* Input: */
/* ORDER - Number of reflection coefficients (not really variable) */
/* IPITV - Quantized pitch/voicing parameter */
/* IRMS - Quantized energy parameter */
/* IRC - Quantized reflection coefficients */
/* Indices 1 through ORDER read. */
/* Output: */
/* IBITS - Serial bitstream */
/* Indices 1 through 54 written. */
/* Bit 54, the SYNC bit, alternates from one call to the next. */
/* Subroutine CHANWR maintains one bit of local state from one call to */
/* the next, in the variable ISYNC. I believe that this one bit is only */
/* intended to allow a receiver to resynchronize its interpretation of */
/* the bit stream, by looking for which of the 54 bits alternates every */
/* frame time. This is just a simple framing mechanism that is not */
/* useful when other, higher overhead framing mechanisms are used to */
/* transmit the coded frames. */
/* I'm not going to make an entry to reinitialize this bit, since it */
/* doesn't help a receiver much to know whether the first sync bit is a 0 */
/* or a 1. It needs to examine several frames in sequence to have */
/* reasonably good assurance that its framing is correct. */
/* CHANRD: */
/* Reconstruct parameters from bitstream */
/* Input: */
/* ORDER - Number of reflection coefficients (not really variable) */
/* IBITS - Serial bitstream */
/* Indices 1 through 53 read (SYNC bit is ignored). */
/* Output: */
/* IPITV - Quantized pitch/voicing parameter */
/* IRMS - Quantized energy parameter */
/* IRC - Quantized reflection coefficients */
/* Indices 1 through ORDER written */
/* Entry CHANRD has no local state. */
/* IBITS is 54 bits of LPC data ordered as follows: */
/* R1-0, R2-0, R3-0, P-0, A-0, */
/* R1-1, R2-1, R3-1, P-1, A-1, */
/* R1-2, R4-0, R3-2, A-2, P-2, R4-1, */
/* R1-3, R2-2, R3-3, R4-2, A-3, */
/* R1-4, R2-3, R3-4, R4-3, A-4, */
/* P-3, R2-4, R7-0, R8-0, P-4, R4-4, */
/* R5-0, R6-0, R7-1,R10-0, R8-1, */
/* R5-1, R6-1, R7-2, R9-0, P-5, */
/* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */
/* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */
/* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv,
integer *irms, integer *irc, integer *ibits,
struct lpc10_encoder_state *st)
{
/* Initialized data */
integer *isync;
static integer bit[10] = { 2,4,8,8,8,8,16,16,16,16 };
static integer iblist[53] = { 13,12,11,1,2,13,12,11,1,2,13,10,11,2,1,10,
13,12,11,10,2,13,12,11,10,2,1,12,7,6,1,10,9,8,7,4,6,9,8,7,5,1,9,8,
4,6,1,5,9,8,7,5,6 };
/* System generated locals */
integer i__1;
/* Local variables */
integer itab[13], i__;
/* Arguments */
/* Parameters/constants */
/* These arrays are not Fortran PARAMETER's, but they are defined */
/* by DATA statements below, and their contents are never altered.
*/
/* Local variables that need not be saved */
/* Local state */
/* ISYNC is only used by CHANWR, not by ENTRY CHANRD. */
/* Parameter adjustments */
--irc;
--ibits;
/* Function Body */
switch(n__) {
case 1: goto L_chanrd;
}
isync = &(st->isync);
/* ***********************************************************************
*/
/* Place quantized parameters into bitstream */
/* ***********************************************************************
*/
/* Place parameters into ITAB */
itab[0] = *ipitv;
itab[1] = *irms;
itab[2] = 0;
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
itab[i__ + 2] = irc[*order + 1 - i__] & 32767;
}
/* Put 54 bits into IBITS array */
for (i__ = 1; i__ <= 53; ++i__) {
ibits[i__] = itab[iblist[i__ - 1] - 1] & 1;
itab[iblist[i__ - 1] - 1] /= 2;
}
ibits[54] = *isync & 1;
*isync = 1 - *isync;
return 0;
/* ***********************************************************************
*/
/* Reconstruct parameters from bitstream */
/* ***********************************************************************
*/
L_chanrd:
/* Reconstruct ITAB */
for (i__ = 1; i__ <= 13; ++i__) {
itab[i__ - 1] = 0;
}
for (i__ = 1; i__ <= 53; ++i__) {
itab[iblist[54 - i__ - 1] - 1] = (itab[iblist[54 - i__ - 1] - 1] << 1)
+ ibits[54 - i__];
}
/* Sign extend RC's */
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
if ((itab[i__ + 2] & bit[i__ - 1]) != 0) {
itab[i__ + 2] -= bit[i__ - 1] << 1;
}
}
/* Restore variables */
*ipitv = itab[0];
*irms = itab[1];
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
irc[i__] = itab[*order + 4 - i__ - 1];
}
return 0;
} /* chanwr_ */
/* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms,
integer *irc, integer *ibits, struct lpc10_encoder_state *st)
{
return chanwr_0_(0, order, ipitv, irms, irc, ibits, st);
}
/* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms,
integer *irc, integer *ibits)
{
return chanwr_0_(1, order, ipitv, irms, irc, ibits, 0);
}

View File

@ -1,96 +0,0 @@
/*
$Log: dcbias.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:40:23 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int dcbias_(integer *len, real *speech, real *sigout);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************* */
/* DCBIAS Version 50 */
/* $Log: dcbias.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:40:23 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/18 21:19:22 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 16:44:53 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:44:21 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Calculate and remove DC bias from buffer. */
/* Input: */
/* LEN - Length of speech buffers */
/* SPEECH - Input speech buffer */
/* Indices 1 through LEN read. */
/* Output: */
/* SIGOUT - Output speech buffer */
/* Indices 1 through LEN written */
/* This subroutine has no local state. */
/* Subroutine */ int dcbias_(integer *len, real *speech, real *sigout)
{
/* System generated locals */
integer i__1;
/* Local variables */
real bias;
integer i__;
/* Arguments */
/* Local variables that need not be saved */
/* Parameter adjustments */
--sigout;
--speech;
/* Function Body */
bias = 0.f;
i__1 = *len;
for (i__ = 1; i__ <= i__1; ++i__) {
bias += speech[i__];
}
bias /= *len;
i__1 = *len;
for (i__ = 1; i__ <= i__1; ++i__) {
sigout[i__] = speech[i__] - bias;
}
return 0;
} /* dcbias_ */

View File

@ -1,604 +0,0 @@
/*
$Log: decode_.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:22:39 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:38 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int decode_(integer *ipitv, integer *irms, integer *irc, integer *voice, integer *pitch, real *rms, real *rc, struct lpc10_decoder_state *st);
/* comlen contrl_ 12 */
/*:ref: ham84_ 14 3 4 4 4 */
/*:ref: median_ 4 3 4 4 4 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* Table of constant values */
static integer c__2 = 2;
/* ***************************************************************** */
/* DECODE Version 54 */
/* $Log: decode_.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:22:39 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:38 jaf
* Initial revision
*
*/
/* Revision 1.5 1996/05/23 20:06:03 jaf */
/* Assigned PITCH a "default" value on the first call, since otherwise it */
/* would be left uninitialized. */
/* Revision 1.4 1996/03/26 19:35:18 jaf */
/* Commented out trace statements. */
/* Revision 1.3 1996/03/21 21:10:50 jaf */
/* Added entry INITDECODE to reinitialize the local state of subroutine */
/* DECODE. */
/* Revision 1.2 1996/03/21 21:04:50 jaf */
/* Determined which local variables should be saved from one invocation */
/* to the next, and guessed initial values for some that should have been */
/* saved, but weren't given initial values. Many of the arrays are */
/* "constants", and many local variables are only used if the "global" */
/* variable CORRP is .TRUE. */
/* Added comments explaining which indices of array arguments are read or */
/* written. */
/* Revision 1.1 1996/02/12 03:21:10 jaf */
/* Initial revision */
/* ***************************************************************** */
/* This subroutine provides error correction and decoding */
/* for all LPC parameters */
/* Input: */
/* IPITV - Index value of pitch */
/* IRMS - Coded Energy */
/* CORRP - Error correction: */
/* If FALSE, parameters are decoded directly with no delay. If TRUE, */
/* most important parameter bits are protected by Hamming code and */
/* median smoothed. This requires an additional frame of delay. */
/* Input/Output: */
/* IRC - Coded Reflection Coefficients */
/* Indices 1 through ORDER always read, then written. */
/* Output: */
/* VOICE - Half frame voicing decisions */
/* Indices 1 through 2 written. */
/* PITCH - Decoded pitch */
/* RMS - Energy */
/* RC - Reflection coefficients */
/* Indices 1 through ORDER written. */
/* NOTE: Zero RC's should be done more directly, but this would affect */
/* coded parameter printout. */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITDECODE. */
/* Subroutine */ int decode_(integer *ipitv, integer *irms,
integer *irc, integer *voice, integer *pitch, real *rms, real *rc,
struct lpc10_decoder_state *st)
{
/* Initialized data */
logical *first;
static integer ethrs = 2048;
static integer ethrs1 = 128;
static integer ethrs2 = 1024;
static integer ethrs3 = 2048;
static integer ivtab[32] = { 24960,24960,24960,24960,25480,25480,25483,
25480,16640,1560,1560,1560,16640,1816,1563,1560,24960,24960,24859,
24856,26001,25881,25915,25913,1560,1560,7800,3640,1561,1561,3643,
3641 };
static real corth[32] /* was [4][8] */ = { 32767.f,10.f,5.f,0.f,
32767.f,8.f,4.f,0.f,32.f,6.4f,3.2f,0.f,32.f,6.4f,3.2f,0.f,32.f,
11.2f,6.4f,0.f,32.f,11.2f,6.4f,0.f,16.f,5.6f,3.2f,0.f,16.f,5.6f,
3.2f,0.f };
static integer detau[128] = { 0,0,0,3,0,3,3,31,0,3,3,21,3,3,29,30,0,3,3,
20,3,25,27,26,3,23,58,22,3,24,28,3,0,3,3,3,3,39,33,32,3,37,35,36,
3,38,34,3,3,42,46,44,50,40,48,3,54,3,56,3,52,3,3,1,0,3,3,108,3,78,
100,104,3,84,92,88,156,80,96,3,3,74,70,72,66,76,68,3,62,3,60,3,64,
3,3,1,3,116,132,112,148,152,3,3,140,3,136,3,144,3,3,1,124,120,128,
3,3,3,3,1,3,3,3,1,3,1,1,1 };
static integer rmst[64] = { 1024,936,856,784,718,656,600,550,502,460,420,
384,352,328,294,270,246,226,206,188,172,158,144,132,120,110,102,
92,84,78,70,64,60,54,50,46,42,38,34,32,30,26,24,22,20,18,17,16,15,
14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };
static integer detab7[32] = { 4,11,18,25,32,39,46,53,60,66,72,77,82,87,92,
96,101,104,108,111,114,115,117,119,121,122,123,124,125,126,127,
127 };
static real descl[8] = { .6953f,.625f,.5781f,.5469f,.5312f,.5391f,.4688f,
.3828f };
integer *ivp2h;
static integer deadd[8] = { 1152,-2816,-1536,-3584,-1280,-2432,768,-1920 }
;
static integer qb[8] = { 511,511,1023,1023,1023,1023,2047,4095 };
static integer nbit[10] = { 8,8,5,5,4,4,4,4,3,2 };
static integer zrc[10] = { 0,0,0,0,0,3,0,2,0,0 };
static integer bit[5] = { 2,4,8,16,32 };
integer *iovoic;
integer *iavgp;
integer *iptold;
integer *erate;
integer *drc;
integer *dpit;
integer *drms;
/* System generated locals */
integer i__1, i__2;
/* Builtin functions */
integer pow_ii(integer *, integer *);
/* Local variables */
extern /* Subroutine */ int ham84_(integer *, integer *, integer *);
integer ipit, iout, i__, icorf, index, ivoic, ixcor, i1, i2, i4;
extern integer median_(integer *, integer *, integer *);
integer ishift, errcnt, lsb;
/* $Log: decode_.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:22:39 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:38 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Arguments */
/* $Log: decode_.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:22:39 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:38 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Function return value definitions */
/* Parameters/constants */
/* The variables below that are not Fortran PARAMETER's are */
/* initialized with DATA statements, and then never modified. */
/* The following are used regardless of CORRP's value. */
/* DETAU, NBIT, QB, DEADD, DETAB7, RMST, DESCL */
/* The following are used only if CORRP is .TRUE. */
/* ETHRS, ETHRS1, ETHRS2, ETHRS3, IVTAB, BIT, CORTH, ZRC */
/* Local variables that need not be saved */
/* The following are used regardless of CORRP's value */
/* The following are used only if CORRP is .TRUE. */
/* Local state */
/* The following are used regardless of CORRP's value */
/* The following are used only if CORRP is .TRUE. */
/* I am guessing the initial values for IVP2H, IOVOIC, DRC, DPIT, */
/* and DRMS. They should be checked to see if they are reasonable.
*/
/* I'm also guessing for ERATE, but I think 0 is the right initial
*/
/* value. */
/* Parameter adjustments */
if (irc) {
--irc;
}
if (voice) {
--voice;
}
if (rc) {
--rc;
}
/* Function Body */
iptold = &(st->iptold);
first = &(st->first);
ivp2h = &(st->ivp2h);
iovoic = &(st->iovoic);
iavgp = &(st->iavgp);
erate = &(st->erate);
drc = &(st->drc[0]);
dpit = &(st->dpit[0]);
drms = &(st->drms[0]);
/* DATA statements for "constants" defined above. */
/* IF (LISTL.GE.3) WRITE(FDEBUG,800) IPITV,IRMS,(IRC(J),J=1,ORDER) */
/* 800 FORMAT(1X,' <<ERRCOR IN>>',T32,6X,I6,I5,T50,10I8) */
/* If no error correction, do pitch and voicing then jump to decode */
i4 = detau[*ipitv];
if (! contrl_1.corrp) {
voice[1] = 1;
voice[2] = 1;
if (*ipitv <= 1) {
voice[1] = 0;
}
if (*ipitv == 0 || *ipitv == 2) {
voice[2] = 0;
}
*pitch = i4;
if (*pitch <= 4) {
*pitch = *iptold;
}
if (voice[1] == 1 && voice[2] == 1) {
*iptold = *pitch;
}
if (voice[1] != voice[2]) {
*pitch = *iptold;
}
goto L900;
}
/* Do error correction pitch and voicing */
if (i4 > 4) {
dpit[0] = i4;
ivoic = 2;
*iavgp = (*iavgp * 15 + i4 + 8) / 16;
} else {
ivoic = i4;
dpit[0] = *iavgp;
}
drms[0] = *irms;
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
drc[i__ * 3 - 3] = irc[i__];
}
/* Determine index to IVTAB from V/UV decision */
/* If error rate is high then use alternate table */
index = (*ivp2h << 4) + (*iovoic << 2) + ivoic + 1;
i1 = ivtab[index - 1];
ipit = i1 & 3;
icorf = i1 / 8;
if (*erate < ethrs) {
icorf /= 64;
}
/* Determine error rate: 4=high 1=low */
ixcor = 4;
if (*erate < ethrs3) {
ixcor = 3;
}
if (*erate < ethrs2) {
ixcor = 2;
}
if (*erate < ethrs1) {
ixcor = 1;
}
/* Voice/unvoice decision determined from bits 0 and 1 of IVTAB */
voice[1] = icorf / 2 & 1;
voice[2] = icorf & 1;
/* Skip decoding on first frame because present data not yet available */
if (*first) {
*first = FALSE_;
/* Assign PITCH a "default" value on the first call, since */
/* otherwise it would be left uninitialized. The two lines
*/
/* below were copied from above, since it seemed like a */
/* reasonable thing to do for the first call. */
*pitch = i4;
if (*pitch <= 4) {
*pitch = *iptold;
}
goto L500;
}
/* If bit 4 of ICORF is set then correct RMS and RC(1) - RC(4). */
/* Determine error rate and correct errors using a Hamming 8,4 code */
/* during transition or unvoiced frame. If IOUT is negative, */
/* more than 1 error occurred, use previous frame's parameters. */
if ((icorf & bit[3]) != 0) {
errcnt = 0;
lsb = drms[1] & 1;
index = (drc[22] << 4) + drms[1] / 2;
ham84_(&index, &iout, &errcnt);
drms[1] = drms[2];
if (iout >= 0) {
drms[1] = (iout << 1) + lsb;
}
for (i__ = 1; i__ <= 4; ++i__) {
if (i__ == 1) {
i1 = ((drc[25] & 7) << 1) + (drc[28] & 1);
} else {
i1 = drc[(9 - i__) * 3 - 2] & 15;
}
i2 = drc[(5 - i__) * 3 - 2] & 31;
lsb = i2 & 1;
index = (i1 << 4) + i2 / 2;
ham84_(&index, &iout, &errcnt);
if (iout >= 0) {
iout = (iout << 1) + lsb;
if ((iout & 16) == 16) {
iout += -32;
}
} else {
iout = drc[(5 - i__) * 3 - 1];
}
drc[(5 - i__) * 3 - 2] = iout;
}
/* Determine error rate */
*erate = (integer)(*erate * .96875f + errcnt * 102);
}
/* Get unsmoothed RMS, RC's, and PITCH */
*irms = drms[1];
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
irc[i__] = drc[i__ * 3 - 2];
}
if (ipit == 1) {
dpit[1] = dpit[2];
}
if (ipit == 3) {
dpit[1] = dpit[0];
}
*pitch = dpit[1];
/* If bit 2 of ICORF is set then smooth RMS and RC's, */
if ((icorf & bit[1]) != 0) {
if ((i__1 = drms[1] - drms[0], (real) abs(i__1)) >= corth[ixcor + 3]
&& (i__2 = drms[1] - drms[2], (real) abs(i__2)) >= corth[
ixcor + 3]) {
*irms = median_(&drms[2], &drms[1], drms);
}
for (i__ = 1; i__ <= 6; ++i__) {
if ((i__1 = drc[i__ * 3 - 2] - drc[i__ * 3 - 3], (real) abs(i__1))
>= corth[ixcor + (i__ + (2 << 2)) - 5] && (i__2 = drc[i__ *
3 - 2] - drc[i__ * 3 - 1], (real) abs(i__2)) >= corth[
ixcor + (i__ + (2 << 2)) - 5]) {
irc[i__] = median_(&drc[i__ * 3 - 1], &drc[i__ * 3 - 2], &drc[
i__ * 3 - 3]);
}
}
}
/* If bit 3 of ICORF is set then smooth pitch */
if ((icorf & bit[2]) != 0) {
if ((i__1 = dpit[1] - dpit[0], (real) abs(i__1)) >= corth[ixcor - 1]
&& (i__2 = dpit[1] - dpit[2], (real) abs(i__2)) >= corth[
ixcor - 1]) {
*pitch = median_(&dpit[2], &dpit[1], dpit);
}
}
/* If bit 5 of ICORF is set then RC(5) - RC(10) are loaded with */
/* values so that after quantization bias is removed in decode */
/* the values will be zero. */
L500:
if ((icorf & bit[4]) != 0) {
i__1 = contrl_1.order;
for (i__ = 5; i__ <= i__1; ++i__) {
irc[i__] = zrc[i__ - 1];
}
}
/* House keeping - one frame delay */
*iovoic = ivoic;
*ivp2h = voice[2];
dpit[2] = dpit[1];
dpit[1] = dpit[0];
drms[2] = drms[1];
drms[1] = drms[0];
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
drc[i__ * 3 - 1] = drc[i__ * 3 - 2];
drc[i__ * 3 - 2] = drc[i__ * 3 - 3];
}
L900:
/* IF (LISTL.GE.3)WRITE(FDEBUG,801)VOICE,PITCH,IRMS,(IRC(J),J=1,ORDER) */
/* 801 FORMAT(1X,'<<ERRCOR OUT>>',T32,2I3,I6,I5,T50,10I8) */
/* Decode RMS */
*irms = rmst[(31 - *irms) * 2];
/* Decode RC(1) and RC(2) from log-area-ratios */
/* Protect from illegal coded value (-16) caused by bit errors */
for (i__ = 1; i__ <= 2; ++i__) {
i2 = irc[i__];
i1 = 0;
if (i2 < 0) {
i1 = 1;
i2 = -i2;
if (i2 > 15) {
i2 = 0;
}
}
i2 = detab7[i2 * 2];
if (i1 == 1) {
i2 = -i2;
}
ishift = 15 - nbit[i__ - 1];
irc[i__] = i2 * pow_ii(&c__2, &ishift);
}
/* Decode RC(3)-RC(10) to sign plus 14 bits */
i__1 = contrl_1.order;
for (i__ = 3; i__ <= i__1; ++i__) {
i2 = irc[i__];
ishift = 15 - nbit[i__ - 1];
i2 *= pow_ii(&c__2, &ishift);
i2 += qb[i__ - 3];
irc[i__] = (integer)(i2 * descl[i__ - 3] + deadd[i__ - 3]);
}
/* IF (LISTL.GE.3) WRITE(FDEBUG,811) IRMS, (IRC(I),I=1,ORDER) */
/* 811 FORMAT(1X,'<<DECODE OUT>>',T45,I4,1X,10I8) */
/* Scale RMS and RC's to reals */
*rms = (real) (*irms);
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
rc[i__] = irc[i__] / 16384.f;
}
return 0;
} /* decode_ */

View File

@ -1,143 +0,0 @@
/*
$Log: deemp.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:23:46 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:34 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int deemp_(real *x, integer *n, struct lpc10_decoder_state *st);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ***************************************************************** */
/* DEEMP Version 48 */
/* $Log: deemp.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:23:46 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:32:34 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/20 15:54:37 jaf */
/* Added comments about which indices of array arguments are read or */
/* written. */
/* Added entry INITDEEMP to reinitialize the local state variables, if */
/* desired. */
/* Revision 1.2 1996/03/14 22:11:13 jaf */
/* Comments added explaining which of the local variables of this */
/* subroutine need to be saved from one invocation to the next, and which */
/* do not. */
/* Revision 1.1 1996/02/07 14:44:53 jaf */
/* Initial revision */
/* ***************************************************************** */
/* De-Emphasize output speech with 1 / ( 1 - .75z**-1 ) */
/* cascaded with 200 Hz high pass filter */
/* ( 1 - 1.9998z**-1 + z**-2 ) / ( 1 - 1.75z**-1 + .78z**-2 ) */
/* WARNING! The coefficients above may be out of date with the code */
/* below. Either that, or some kind of transformation was performed */
/* on the coefficients above to create the code below. */
/* Input: */
/* N - Number of samples */
/* Input/Output: */
/* X - Speech */
/* Indices 1 through N are read before being written. */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITDEEMP. */
/* Subroutine */ int deemp_(real *x, integer *n, struct lpc10_decoder_state *st)
{
/* Initialized data */
real *dei1;
real *dei2;
real *deo1;
real *deo2;
real *deo3;
/* System generated locals */
integer i__1;
real r__1;
/* Local variables */
integer k;
real dei0;
/* Arguments */
/* Local variables that need not be saved */
/* Local state */
/* All of the locals saved below were not given explicit initial */
/* values in the original code. I think 0 is a safe choice. */
/* Parameter adjustments */
if (x) {
--x;
}
/* Function Body */
dei1 = &(st->dei1);
dei2 = &(st->dei2);
deo1 = &(st->deo1);
deo2 = &(st->deo2);
deo3 = &(st->deo3);
i__1 = *n;
for (k = 1; k <= i__1; ++k) {
dei0 = x[k];
r__1 = x[k] - *dei1 * 1.9998f + *dei2;
x[k] = r__1 + *deo1 * 2.5f - *deo2 * 2.0925f + *deo3 * .585f;
*dei2 = *dei1;
*dei1 = dei0;
*deo3 = *deo2;
*deo2 = *deo1;
*deo1 = x[k];
}
return 0;
} /* deemp_ */

View File

@ -1,122 +0,0 @@
/*
$Log: difmag.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:32:31 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int difmag_(real *speech, integer *lpita, integer *tau, integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *maxptr);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************** */
/* DIFMAG Version 49 */
/* $Log: difmag.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:31 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/15 23:09:39 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 14:41:31 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:45:04 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Compute Average Magnitude Difference Function */
/* Inputs: */
/* SPEECH - Low pass filtered speech */
/* Indices MIN_N1 through MAX_N1+LPITA-1 are read, where */
/* MIN_N1 = (MAXLAG - MAX_TAU)/2+1 MAX_TAU = max of TAU(I) for I=1,LTAU
*/
/* MAX_N1 = (MAXLAG - MIN_TAU)/2+1 MIN_TAU = min of TAU(I) for I=1,LTAU
*/
/* LPITA - Length of speech buffer */
/* TAU - Table of lags */
/* Indices 1 through LTAU read. */
/* LTAU - Number of lag values to compute */
/* MAXLAG - Maximum possible lag value */
/* Outputs: */
/* (All of these outputs are also read, but only after being written.) */
/* AMDF - Average Magnitude Difference for each lag in TAU */
/* Indices 1 through LTAU written */
/* MINPTR - Index of minimum AMDF value */
/* MAXPTR - Index of maximum AMDF value */
/* This subroutine has no local state. */
/* Subroutine */ int difmag_(real *speech, integer *lpita, integer *tau,
integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *
maxptr)
{
/* System generated locals */
integer i__1, i__2;
real r__1;
/* Local variables */
integer i__, j, n1, n2;
real sum;
/* Arguments */
/* Local variables that need not be saved */
/* Local state */
/* None */
/* Parameter adjustments */
--amdf;
--tau;
--speech;
/* Function Body */
*minptr = 1;
*maxptr = 1;
i__1 = *ltau;
for (i__ = 1; i__ <= i__1; ++i__) {
n1 = (*maxlag - tau[i__]) / 2 + 1;
n2 = n1 + *lpita - 1;
sum = 0.f;
i__2 = n2;
for (j = n1; j <= i__2; j += 4) {
sum += (r__1 = speech[j] - speech[j + tau[i__]], abs(r__1));
}
amdf[i__] = sum;
if (amdf[i__] < amdf[*minptr]) {
*minptr = i__;
}
if (amdf[i__] > amdf[*maxptr]) {
*maxptr = i__;
}
}
return 0;
} /* difmag_ */

View File

@ -1,389 +0,0 @@
/*
$Log: dyptrk.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:25:29 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:32:26 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int dyptrk_(real *amdf, integer *ltau, integer *minptr, integer *voice, integer *pitch, integer *midx, struct lpc10_encoder_state *st);
/* comlen contrl_ 12 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* ********************************************************************* */
/* DYPTRK Version 52 */
/* $Log: dyptrk.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:25:29 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:32:26 jaf
* Initial revision
*
*/
/* Revision 1.5 1996/03/26 19:35:35 jaf */
/* Commented out trace statements. */
/* Revision 1.4 1996/03/19 18:03:22 jaf */
/* Replaced the initialization "DATA P/60*DEPTH*0/" with "DATA P/120*0/", */
/* because apparently Fortran (or at least f2c) can't handle expressions */
/* like that. */
/* Revision 1.3 1996/03/19 17:38:32 jaf */
/* Added comments about the local variables that should be saved from one */
/* invocation to the next. None of them were given initial values in the */
/* original code, but from my testing, it appears that initializing them */
/* all to 0 works. */
/* Added entry INITDYPTRK to reinitialize these local variables. */
/* Revision 1.2 1996/03/13 16:32:17 jaf */
/* Comments added explaining which of the local variables of this */
/* subroutine need to be saved from one invocation to the next, and which */
/* do not. */
/* WARNING! Some of them that should are never given initial values in */
/* this code. Hopefully, Fortran 77 defines initial values for them, but */
/* even so, giving them explicit initial values is preferable. */
/* Revision 1.1 1996/02/07 14:45:14 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Dynamic Pitch Tracker */
/* Input: */
/* AMDF - Average Magnitude Difference Function array */
/* Indices 1 through LTAU read, and MINPTR */
/* LTAU - Number of lags in AMDF */
/* MINPTR - Location of minimum AMDF value */
/* VOICE - Voicing decision */
/* Output: */
/* PITCH - Smoothed pitch value, 2 frames delayed */
/* MIDX - Initial estimate of current frame pitch */
/* Compile time constant: */
/* DEPTH - Number of frames to trace back */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITDYPTRK. */
/* Subroutine */ int dyptrk_(real *amdf, integer *ltau, integer *
minptr, integer *voice, integer *pitch, integer *midx,
struct lpc10_encoder_state *st)
{
/* Initialized data */
real *s;
integer *p;
integer *ipoint;
real *alphax;
/* System generated locals */
integer i__1;
/* Local variables */
integer pbar;
real sbar;
integer path[2], iptr, i__, j;
real alpha, minsc, maxsc;
/* Arguments */
/* $Log: dyptrk.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:25:29 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:32:26 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Parameters/constants */
/* Local variables that need not be saved */
/* Note that PATH is only used for debugging purposes, and can be */
/* removed. */
/* Local state */
/* It would be a bit more "general" to define S(LTAU), if Fortran */
/* allows the argument of a function to be used as the dimension of
*/
/* a local array variable. */
/* IPOINT is always in the range 0 to DEPTH-1. */
/* WARNING! */
/* In the original version of this subroutine, IPOINT, ALPHAX, */
/* every element of S, and potentially any element of P with the */
/* second index value .NE. IPTR were read without being given */
/* initial values (all indices of P with second index equal to */
/* IPTR are all written before being read in this subroutine). */
/* From examining the code carefully, it appears that all of these
*/
/* should be saved from one invocation to the next. */
/* I've run lpcsim with the "-l 6" option to see all of the */
/* debugging information that is printed out by this subroutine */
/* below, and it appears that S, P, IPOINT, and ALPHAX are all */
/* initialized to 0 (these initial values would likely be different
*/
/* on different platforms, compilers, etc.). Given that the output
*/
/* of the coder sounds reasonable, I'm going to initialize these */
/* variables to 0 explicitly. */
s = &(st->s[0]);
p = &(st->p[0]);
ipoint = &(st->ipoint);
alphax = &(st->alphax);
/* Parameter adjustments */
if (amdf) {
--amdf;
}
/* Function Body */
/* Calculate the confidence factor ALPHA, used as a threshold slope in
*/
/* SEESAW. If unvoiced, set high slope so that every point in P array
*/
/* is marked as a potential pitch frequency. A scaled up version (ALPHAX
)*/
/* is used to maintain arithmetic precision. */
if (*voice == 1) {
*alphax = *alphax * .75f + amdf[*minptr] / 2.f;
} else {
*alphax *= .984375f;
}
alpha = *alphax / 16;
if (*voice == 0 && *alphax < 128.f) {
alpha = 8.f;
}
/* SEESAW: Construct a pitch pointer array and intermediate winner functio
n*/
/* Left to right pass: */
iptr = *ipoint + 1;
p[iptr * 60 - 60] = 1;
i__ = 1;
pbar = 1;
sbar = s[0];
i__1 = *ltau;
for (i__ = 1; i__ <= i__1; ++i__) {
sbar += alpha;
if (sbar < s[i__ - 1]) {
s[i__ - 1] = sbar;
p[i__ + iptr * 60 - 61] = pbar;
} else {
sbar = s[i__ - 1];
p[i__ + iptr * 60 - 61] = i__;
pbar = i__;
}
}
/* Right to left pass: */
i__ = pbar - 1;
sbar = s[i__];
while(i__ >= 1) {
sbar += alpha;
if (sbar < s[i__ - 1]) {
s[i__ - 1] = sbar;
p[i__ + iptr * 60 - 61] = pbar;
} else {
pbar = p[i__ + iptr * 60 - 61];
i__ = pbar;
sbar = s[i__ - 1];
}
--i__;
}
/* Update S using AMDF */
/* Find maximum, minimum, and location of minimum */
s[0] += amdf[1] / 2;
minsc = s[0];
maxsc = minsc;
*midx = 1;
i__1 = *ltau;
for (i__ = 2; i__ <= i__1; ++i__) {
s[i__ - 1] += amdf[i__] / 2;
if (s[i__ - 1] > maxsc) {
maxsc = s[i__ - 1];
}
if (s[i__ - 1] < minsc) {
*midx = i__;
minsc = s[i__ - 1];
}
}
/* Subtract MINSC from S to prevent overflow */
i__1 = *ltau;
for (i__ = 1; i__ <= i__1; ++i__) {
s[i__ - 1] -= minsc;
}
maxsc -= minsc;
/* Use higher octave pitch if significant null there */
j = 0;
for (i__ = 20; i__ <= 40; i__ += 10) {
if (*midx > i__) {
if (s[*midx - i__ - 1] < maxsc / 4) {
j = i__;
}
}
}
*midx -= j;
/* TRACE: look back two frames to find minimum cost pitch estimate */
j = *ipoint;
*pitch = *midx;
for (i__ = 1; i__ <= 2; ++i__) {
j = j % 2 + 1;
*pitch = p[*pitch + j * 60 - 61];
path[i__ - 1] = *pitch;
}
/* The following statement subtracts one from IPOINT, mod DEPTH. I
*/
/* think the author chose to add DEPTH-1, instead of subtracting 1,
*/
/* because then it will work even if MOD doesn't work as desired on
*/
/* negative arguments. */
*ipoint = (*ipoint + 1) % 2;
return 0;
} /* dyptrk_ */

View File

@ -1,364 +0,0 @@
/*
$Log: encode_.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:32:21 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int encode_(integer *voice, integer *pitch, real *rms, real *rc, integer *ipitch, integer *irms, integer *irc);
/* comlen contrl_ 12 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* Table of constant values */
static integer c__2 = 2;
/* ***************************************************************** */
/* ENCODE Version 54 */
/* $Log: encode_.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:21 jaf
* Initial revision
*
*/
/* Revision 1.5 1996/03/26 19:35:50 jaf */
/* Commented out trace statements. */
/* Revision 1.4 1996/03/21 00:26:29 jaf */
/* Added the comment that this subroutine has no local state. */
/* In the last check-in, I forgot to mention that I had added comments */
/* explaining which indices of array arguments are read or written. */
/* Revision 1.3 1996/03/21 00:22:39 jaf */
/* Added comments explaining that all local arrays are effectively */
/* constants. */
/* Revision 1.2 1996/03/13 18:48:33 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:45:29 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Quantize LPC parameters for transmission */
/* INPUTS: */
/* VOICE - Half frame voicing decisions */
/* Indices 1 through 2 read. */
/* PITCH - Pitch */
/* RMS - Energy */
/* RC - Reflection coefficients */
/* Indices 1 through ORDER read. */
/* CORRP - Error Correction: TRUE = yes, FALSE = none */
/* (this is defined in file control.fh) */
/* OUTPUTS: */
/* IPITCH - Coded pitch and voicing */
/* IRMS - Quantized energy */
/* IRC - Quantized reflection coefficients */
/* Indices 1 through MAX(ORDER,2) written. */
/* If CORRP is .TRUE., then indices 1 through 10 written */
/* for unvoiced frames. */
/* This subroutine has no local state. */
/* Subroutine */ int encode_(integer *voice, integer *pitch, real *rms, real *
rc, integer *ipitch, integer *irms, integer *irc)
{
/* Initialized data */
static integer enctab[16] = { 0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15 };
static integer entau[60] = { 19,11,27,25,29,21,23,22,30,14,15,7,39,38,46,
42,43,41,45,37,53,49,51,50,54,52,60,56,58,26,90,88,92,84,86,82,83,
81,85,69,77,73,75,74,78,70,71,67,99,97,113,112,114,98,106,104,108,
100,101,76 };
static integer enadd[8] = { 1920,-768,2432,1280,3584,1536,2816,-1152 };
static real enscl[8] = { .0204f,.0167f,.0145f,.0147f,.0143f,.0135f,.0125f,
.0112f };
static integer enbits[8] = { 6,5,4,4,4,4,3,3 };
static integer entab6[64] = { 0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,
3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,
9,10,10,11,11,12,13,14,15 };
static integer rmst[64] = { 1024,936,856,784,718,656,600,550,502,460,420,
384,352,328,294,270,246,226,206,188,172,158,144,132,120,110,102,
92,84,78,70,64,60,54,50,46,42,38,34,32,30,26,24,22,20,18,17,16,15,
14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };
/* System generated locals */
integer i__1, i__2;
/* Builtin functions */
integer pow_ii(integer *, integer *);
/* Local variables */
integer idel, nbit, i__, j, i2, i3, mrk;
/* $Log: encode_.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:21 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Arguments */
/* $Log: encode_.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:21 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Parameters/constants */
/* These arrays are not Fortran PARAMETER's, but they are defined */
/* by DATA statements below, and their contents are never altered.
*/
/* Local variables that need not be saved */
/* Parameter adjustments */
--irc;
--rc;
--voice;
/* Function Body */
/* Scale RMS and RC's to integers */
*irms = (integer)*rms;
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
irc[i__] = (integer)(rc[i__] * 32768.f);
}
/* IF(LISTL.GE.3)WRITE(FDEBUG,800)VOICE,PITCH,IRMS,(IRC(I),I=1,ORDER) */
/* 800 FORMAT(1X,/,' <<ENCODE IN>>',T32,2I3,I6,I5,T50,10I8) */
/* Encode pitch and voicing */
if (voice[1] != 0 && voice[2] != 0) {
*ipitch = entau[*pitch - 1];
} else {
if (contrl_1.corrp) {
*ipitch = 0;
if (voice[1] != voice[2]) {
*ipitch = 127;
}
} else {
*ipitch = (voice[1] << 1) + voice[2];
}
}
/* Encode RMS by binary table search */
j = 32;
idel = 16;
*irms = min(*irms,1023);
while(idel > 0) {
if (*irms > rmst[j - 1]) {
j -= idel;
}
if (*irms < rmst[j - 1]) {
j += idel;
}
idel /= 2;
}
if (*irms > rmst[j - 1]) {
--j;
}
*irms = 31 - j / 2;
/* Encode RC(1) and (2) as log-area-ratios */
for (i__ = 1; i__ <= 2; ++i__) {
i2 = irc[i__];
mrk = 0;
if (i2 < 0) {
i2 = -i2;
mrk = 1;
}
i2 /= 512;
i2 = min(i2,63);
i2 = entab6[i2];
if (mrk != 0) {
i2 = -i2;
}
irc[i__] = i2;
}
/* Encode RC(3) - (10) linearly, remove bias then scale */
i__1 = contrl_1.order;
for (i__ = 3; i__ <= i__1; ++i__) {
i2 = irc[i__] / 2;
i2 = (integer)((i2 + enadd[contrl_1.order + 1 - i__ - 1]) * enscl[
contrl_1.order + 1 - i__ - 1]);
/* Computing MIN */
i__2 = max(i2,-127);
i2 = min(i__2,127);
nbit = enbits[contrl_1.order + 1 - i__ - 1];
i3 = 0;
if (i2 < 0) {
i3 = -1;
}
i2 /= pow_ii(&c__2, &nbit);
if (i3 == -1) {
--i2;
}
irc[i__] = i2;
}
/* Protect the most significant bits of the most */
/* important parameters during non-voiced frames. */
/* RC(1) - RC(4) are protected using 20 parity bits */
/* replacing RC(5) - RC(10). */
if (contrl_1.corrp) {
if (*ipitch == 0 || *ipitch == 127) {
irc[5] = enctab[(irc[1] & 30) / 2];
irc[6] = enctab[(irc[2] & 30) / 2];
irc[7] = enctab[(irc[3] & 30) / 2];
irc[8] = enctab[(*irms & 30) / 2];
irc[9] = enctab[(irc[4] & 30) / 2] / 2;
irc[10] = enctab[(irc[4] & 30) / 2] & 1;
}
}
/* IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,IPITCH,IRMS,(IRC(J),J=1,ORDER) */
/* 801 FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8) */
return 0;
} /* encode_ */

View File

@ -1,98 +0,0 @@
/*
$Log: energy.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:32:17 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int energy_(integer *len, real *speech, real *rms);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************* */
/* ENERGY Version 50 */
/* $Log: energy.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:17 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/18 21:17:41 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 16:46:02 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:45:40 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Compute RMS energy. */
/* Input: */
/* LEN - Length of speech buffer */
/* SPEECH - Speech buffer */
/* Indices 1 through LEN read. */
/* Output: */
/* RMS - Root Mean Square energy */
/* This subroutine has no local state. */
/* Subroutine */ int energy_(integer *len, real *speech, real *rms)
{
/* System generated locals */
integer i__1;
/* Builtin functions */
double sqrt(doublereal);
/* Local variables */
integer i__;
/* Arguments */
/* Local variables that need not be saved */
/* Parameter adjustments */
--speech;
/* Function Body */
*rms = 0.f;
i__1 = *len;
for (i__ = 1; i__ <= i__1; ++i__) {
*rms += speech[i__] * speech[i__];
}
*rms = (real)sqrt(*rms / *len);
return 0;
} /* energy_ */

View File

@ -1,252 +0,0 @@
/*
$Log: f2c.h,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:26:28 jaf
* Any typedef defining a type that was used in lpc10_encoder_state or
* lpc10_decoder_state struct's was commented out here and added to
* lpc10.h.
*
* Revision 1.1 1996/08/19 22:32:13 jaf
* Initial revision
*
*/
/*
* f2c.h
*
* SCCS ID: @(#)f2c.h 1.2 96/05/19
*/
/* f2c.h -- Standard Fortran to C header file */
/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
- From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
#ifndef F2C_INCLUDE
#define F2C_INCLUDE
#include "lpc10.h"
/*typedef long int integer;*/
/*typedef INT32 integer;*/
/*typedef short int shortint;*/
/*typedef INT16 shortint;*/
/*typedef float real;*/
/* doublereal only used for function arguments to sqrt, exp, etc. */
typedef double doublereal;
/* 32 bits seems wasteful, but there really aren't that many logical
* variables around, and making them 32 bits could avoid word
* alignment problems, perhaps. */
/*typedef long int logical;*/
/*typedef INT32 logical;*/
/* The following types are not used in the translated C code for the
* LPC-10 coder, but they might be needed by the definitions down
* below, so they don't cause compilation errors. */
typedef char *address;
typedef struct { real r, i; } complex;
typedef struct { doublereal r, i; } doublecomplex;
typedef short int shortlogical;
typedef char logical1;
typedef char integer1;
/* typedef long long longint; */ /* system-dependent */
#define TRUE_ (1)
#define FALSE_ (0)
/* Extern is for use with -E */
#ifndef Extern
#define Extern extern
#endif
/* I/O stuff */
#ifdef f2c_i2
/* for -i2 */
typedef short flag;
typedef short ftnlen;
typedef short ftnint;
#else
typedef long int flag;
typedef long int ftnlen;
typedef long int ftnint;
#endif
/*external read, write*/
typedef struct
{ flag cierr;
ftnint ciunit;
flag ciend;
char *cifmt;
ftnint cirec;
} cilist;
/*internal read, write*/
typedef struct
{ flag icierr;
char *iciunit;
flag iciend;
char *icifmt;
ftnint icirlen;
ftnint icirnum;
} icilist;
/*open*/
typedef struct
{ flag oerr;
ftnint ounit;
char *ofnm;
ftnlen ofnmlen;
char *osta;
char *oacc;
char *ofm;
ftnint orl;
char *oblnk;
} olist;
/*close*/
typedef struct
{ flag cerr;
ftnint cunit;
char *csta;
} cllist;
/*rewind, backspace, endfile*/
typedef struct
{ flag aerr;
ftnint aunit;
} alist;
/* inquire */
typedef struct
{ flag inerr;
ftnint inunit;
char *infile;
ftnlen infilen;
ftnint *inex; /*parameters in standard's order*/
ftnint *inopen;
ftnint *innum;
ftnint *innamed;
char *inname;
ftnlen innamlen;
char *inacc;
ftnlen inacclen;
char *inseq;
ftnlen inseqlen;
char *indir;
ftnlen indirlen;
char *infmt;
ftnlen infmtlen;
char *inform;
ftnint informlen;
char *inunf;
ftnlen inunflen;
ftnint *inrecl;
ftnint *innrec;
char *inblank;
ftnlen inblanklen;
} inlist;
#define VOID void
union Multitype { /* for multiple entry points */
integer1 g;
shortint h;
integer i;
/* longint j; */
real r;
doublereal d;
complex c;
doublecomplex z;
};
typedef union Multitype Multitype;
/*typedef long int Long;*/ /* No longer used; formerly in Namelist */
struct Vardesc { /* for Namelist */
char *name;
char *addr;
ftnlen *dims;
int type;
};
typedef struct Vardesc Vardesc;
struct Namelist {
char *name;
Vardesc **vars;
int nvars;
};
typedef struct Namelist Namelist;
#define abs(x) ((x) >= 0 ? (x) : -(x))
#define dabs(x) (doublereal)abs(x)
#define min(a,b) ((a) <= (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))
#define dmin(a,b) (doublereal)min(a,b)
#define dmax(a,b) (doublereal)max(a,b)
/* procedure parameter types for -A and -C++ */
#define F2C_proc_par_types 1
#ifdef __cplusplus
typedef int /* Unknown procedure type */ (*U_fp)(...);
typedef shortint (*J_fp)(...);
typedef integer (*I_fp)(...);
typedef real (*R_fp)(...);
typedef doublereal (*D_fp)(...), (*E_fp)(...);
typedef /* Complex */ VOID (*C_fp)(...);
typedef /* Double Complex */ VOID (*Z_fp)(...);
typedef logical (*L_fp)(...);
typedef shortlogical (*K_fp)(...);
typedef /* Character */ VOID (*H_fp)(...);
typedef /* Subroutine */ int (*S_fp)(...);
#else
typedef int /* Unknown procedure type */ (*U_fp)();
typedef shortint (*J_fp)();
typedef integer (*I_fp)();
typedef real (*R_fp)();
typedef doublereal (*D_fp)(), (*E_fp)();
typedef /* Complex */ VOID (*C_fp)();
typedef /* Double Complex */ VOID (*Z_fp)();
typedef logical (*L_fp)();
typedef shortlogical (*K_fp)();
typedef /* Character */ VOID (*H_fp)();
typedef /* Subroutine */ int (*S_fp)();
#endif
/* E_fp is for real functions when -R is not specified */
typedef VOID C_f; /* complex function */
typedef VOID H_f; /* character function */
typedef VOID Z_f; /* double complex function */
typedef doublereal E_f; /* real function with -R not specified */
/* undef any lower-case symbols that your C compiler predefines, e.g.: */
#ifndef Skip_f2c_Undefs
#undef cray
#undef gcos
#undef mc68010
#undef mc68020
#undef mips
#undef pdp11
#undef sgi
#undef sparc
#undef sun
#undef sun2
#undef sun3
#undef sun4
#undef u370
#undef u3b
#undef u3b2
#undef u3b5
#undef unix
#undef vax
#endif
#endif

View File

@ -1,91 +0,0 @@
/*
$Log: f2clib.c,v $
Revision 1.2 2004/05/05 13:25:38 rjongbloed
Fixed clearly incorrect code (dived by zero) found with an MSVC warning
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.3 2004/02/17 09:21:45 csoutheren
Fix for GM bug 134591
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:32:10 jaf
* Initial revision
*
*/
/*
* f2clib.c
*
* SCCS ID: @(#)f2clib.c 1.2 96/05/19
*/
#include "f2c.h"
#ifdef KR_headers
integer pow_ii(ap, bp) integer *ap, *bp;
#else
integer pow_ii(integer *ap, integer *bp)
#endif
{
integer pow, x, n;
unsigned long u;
x = *ap;
n = *bp;
if (n <= 0) {
if (n == 0 || x == 1)
return 1;
if (x != -1)
return x != 0 ? 1/x : 0;
n = -n;
}
u = n;
for(pow = 1; ; )
{
if(u & 01)
pow *= x;
if(u >>= 1)
x *= x;
else
break;
}
return(pow);
}
#ifdef KR_headers
double r_sign(a,b) real *a, *b;
#else
double r_sign(real *a, real *b)
#endif
{
double x;
x = (*a >= 0 ? *a : - *a);
return( *b >= 0 ? x : -x);
}
#ifdef KR_headers
double floor();
integer i_nint(x) real *x;
#else
#undef abs
#include "math.h"
integer i_nint(real *x)
#endif
{
return (integer)( (*x)>=0 ?
floor(*x + .5) : -(floor(.5 - *x)) );
}

View File

@ -1,115 +0,0 @@
/*
$Log: ham84.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:32:07 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int ham84_(integer *input, integer *output, integer *errcnt);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ***************************************************************** */
/* HAM84 Version 45G */
/* $Log: ham84.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:07 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/21 15:26:00 jaf */
/* Put comment header in standard form. */
/* Revision 1.2 1996/03/13 22:00:13 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:47:04 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Hamming 8,4 Decoder - can correct 1 out of seven bits */
/* and can detect up to two errors. */
/* Input: */
/* INPUT - Seven bit data word, 4 bits parameter and */
/* 4 bits parity information */
/* Input/Output: */
/* ERRCNT - Sums errors detected by Hamming code */
/* Output: */
/* OUTPUT - 4 corrected parameter bits */
/* This subroutine is entered with an eight bit word in INPUT. The 8th */
/* bit is parity and is stripped off. The remaining 7 bits address the */
/* hamming 8,4 table and the output OUTPUT from the table gives the 4 */
/* bits of corrected data. If bit 4 is set, no error was detected. */
/* ERRCNT is the number of errors counted. */
/* This subroutine has no local state. */
/* Subroutine */ int ham84_(integer *input, integer *output, integer *errcnt)
{
/* Initialized data */
static integer dactab[128] = { 16,0,0,3,0,5,14,7,0,9,14,11,14,13,30,14,0,
9,2,7,4,7,7,23,9,25,10,9,12,9,14,7,0,5,2,11,5,21,6,5,8,11,11,27,
12,5,14,11,2,1,18,2,12,5,2,7,12,9,2,11,28,12,12,15,0,3,3,19,4,13,
6,3,8,13,10,3,13,29,14,13,4,1,10,3,20,4,4,7,10,9,26,10,4,13,10,15,
8,1,6,3,6,5,22,6,24,8,8,11,8,13,6,15,1,17,2,1,4,1,6,15,8,1,10,15,
12,15,15,31 };
integer i__, j, parity;
/* Arguments */
/* Parameters/constants */
/* Local variables that need not be saved */
/* Determine parity of input word */
parity = *input & 255;
parity ^= parity / 16;
parity ^= parity / 4;
parity ^= parity / 2;
parity &= 1;
i__ = dactab[*input & 127];
*output = i__ & 15;
j = i__ & 16;
if (j != 0) {
/* No errors detected in seven bits */
if (parity != 0) {
++(*errcnt);
}
} else {
/* One or two errors detected */
++(*errcnt);
if (parity == 0) {
/* Two errors detected */
++(*errcnt);
*output = -1;
}
}
return 0;
} /* ham84_ */

View File

@ -1,158 +0,0 @@
/*
$Log: hp100.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:28:05 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:32:04 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int hp100_(real *speech, integer *start, integer *end,
struct lpc10_encoder_state *st);
extern int inithp100_(void);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************* */
/* HP100 Version 55 */
/* $Log: hp100.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:28:05 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:32:04 jaf
* Initial revision
*
*/
/* Revision 1.6 1996/03/15 16:45:25 jaf */
/* Rearranged a few comments. */
/* Revision 1.5 1996/03/14 23:20:54 jaf */
/* Added comments about when INITHP100 should be used. */
/* Revision 1.4 1996/03/14 23:08:08 jaf */
/* Added an entry named INITHP100 that initializes the local state of */
/* subroutine HP100. */
/* Revision 1.3 1996/03/14 22:09:20 jaf */
/* Comments added explaining which of the local variables of this */
/* subroutine need to be saved from one invocation to the next, and which */
/* do not. */
/* Revision 1.2 1996/02/12 15:05:54 jaf */
/* Added lots of comments explaining why I changed one line, which was a */
/* declaration with initializations. */
/* Revision 1.1 1996/02/07 14:47:12 jaf */
/* Initial revision */
/* ********************************************************************* */
/* 100 Hz High Pass Filter */
/* Jan 92 - corrected typo (1.937148 to 1.935715), */
/* rounded coefficients to 7 places, */
/* corrected and merged gain (.97466**4), */
/* merged numerator into first two sections. */
/* Input: */
/* start, end - Range of samples to filter */
/* Input/Output: */
/* speech(end) - Speech data. */
/* Indices start through end are read and modified. */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITHP100. */
/* Subroutine */ int hp100_(real *speech, integer *start, integer *end,
struct lpc10_encoder_state *st)
{
/* Temporary local copies of variables in lpc10_encoder_state.
I've only created these because it might cause the loop below
to execute a bit faster to access local variables, rather than
variables in the lpc10_encoder_state structure. It is just a
guess that it will be faster. */
real z11;
real z21;
real z12;
real z22;
/* System generated locals */
integer i__1;
/* Local variables */
integer i__;
real si, err;
/* Arguments */
/* Local variables that need not be saved */
/* Local state */
/* Parameter adjustments */
if (speech) {
--speech;
}
/* Function Body */
z11 = st->z11;
z21 = st->z21;
z12 = st->z12;
z22 = st->z22;
i__1 = *end;
for (i__ = *start; i__ <= i__1; ++i__) {
si = speech[i__];
err = si + z11 * 1.859076f - z21 * .8648249f;
si = err - z11 * 2.f + z21;
z21 = z11;
z11 = err;
err = si + z12 * 1.935715f - z22 * .9417004f;
si = err - z12 * 2.f + z22;
z22 = z12;
z12 = err;
speech[i__] = si * .902428f;
}
st->z11 = z11;
st->z21 = z21;
st->z12 = z12;
st->z22 = z22;
return 0;
} /* hp100_ */

View File

@ -1,177 +0,0 @@
/*
$Log: invert.c,v $
Revision 1.1 2004/05/04 11:16:42 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:32:00 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int invert_(integer *order, real *phi, real *psi, real *rc);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* **************************************************************** */
/* INVERT Version 45G */
/* $Log: invert.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:00 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/18 20:52:47 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 16:51:32 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Eliminated a comment from the original, describing a local array X */
/* that appeared nowhere in the code. */
/* Revision 1.1 1996/02/07 14:47:20 jaf */
/* Initial revision */
/* **************************************************************** */
/* Invert a covariance matrix using Choleski decomposition method. */
/* Input: */
/* ORDER - Analysis order */
/* PHI(ORDER,ORDER) - Covariance matrix */
/* Indices (I,J) read, where ORDER .GE. I .GE. J .GE. 1.*/
/* All other indices untouched. */
/* PSI(ORDER) - Column vector to be predicted */
/* Indices 1 through ORDER read. */
/* Output: */
/* RC(ORDER) - Pseudo reflection coefficients */
/* Indices 1 through ORDER written, and then possibly read.
*/
/* Internal: */
/* V(ORDER,ORDER) - Temporary matrix */
/* Same indices written as read from PHI. */
/* Many indices may be read and written again after */
/* initially being copied from PHI, but all indices */
/* are written before being read. */
/* NOTE: Temporary matrix V is not needed and may be replaced */
/* by PHI if the original PHI values do not need to be preserved. */
/* Subroutine */ int invert_(integer *order, real *phi, real *psi, real *rc)
{
/* System generated locals */
integer phi_dim1, phi_offset, i__1, i__2, i__3;
real r__1, r__2;
/* Local variables */
real save;
integer i__, j, k;
real v[100] /* was [10][10] */;
/* Arguments */
/* $Log: invert.c,v $
* Revision 1.1 2004/05/04 11:16:42 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:32:00 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Parameters/constants */
/* Local variables that need not be saved */
/* Decompose PHI into V * D * V' where V is a triangular matrix whose */
/* main diagonal elements are all 1, V' is the transpose of V, and */
/* D is a vector. Here D(n) is stored in location V(n,n). */
/* Parameter adjustments */
--rc;
--psi;
phi_dim1 = *order;
phi_offset = phi_dim1 + 1;
phi -= phi_offset;
/* Function Body */
i__1 = *order;
for (j = 1; j <= i__1; ++j) {
i__2 = *order;
for (i__ = j; i__ <= i__2; ++i__) {
v[i__ + j * 10 - 11] = phi[i__ + j * phi_dim1];
}
i__2 = j - 1;
for (k = 1; k <= i__2; ++k) {
save = v[j + k * 10 - 11] * v[k + k * 10 - 11];
i__3 = *order;
for (i__ = j; i__ <= i__3; ++i__) {
v[i__ + j * 10 - 11] -= v[i__ + k * 10 - 11] * save;
}
}
/* Compute intermediate results, which are similar to RC's */
if ((r__1 = v[j + j * 10 - 11], abs(r__1)) < 1e-10f) {
goto L100;
}
rc[j] = psi[j];
i__2 = j - 1;
for (k = 1; k <= i__2; ++k) {
rc[j] -= rc[k] * v[j + k * 10 - 11];
}
v[j + j * 10 - 11] = 1.f / v[j + j * 10 - 11];
rc[j] *= v[j + j * 10 - 11];
/* Computing MAX */
/* Computing MIN */
r__2 = rc[j];
r__1 = min(r__2,.999f);
rc[j] = max(r__1,-.999f);
}
return 0;
/* Zero out higher order RC's if algorithm terminated early */
L100:
i__1 = *order;
for (i__ = j; i__ <= i__1; ++i__) {
rc[i__] = 0.f;
}
/* Back substitute for PC's (if needed) */
/* 110 DO J = ORDER,1,-1 */
/* PC(J) = RC(J) */
/* DO I = 1,J-1 */
/* PC(J) = PC(J) - PC(I)*V(J,I) */
/* END DO */
/* END DO */
return 0;
} /* invert_ */

View File

@ -1,144 +0,0 @@
/*
$Log: irc2pc.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:31:56 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int irc2pc_(real *rc, real *pc, integer *order, real *gprime, real *g2pass);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ***************************************************************** */
/* IRC2PC Version 48 */
/* $Log: irc2pc.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:56 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/20 15:47:19 jaf */
/* Added comments about which indices of array arguments are read or */
/* written. */
/* Revision 1.2 1996/03/14 16:59:04 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:47:27 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Convert Reflection Coefficients to Predictor Coeficients */
/* Inputs: */
/* RC - Reflection coefficients */
/* Indices 1 through ORDER read. */
/* ORDER - Number of RC's */
/* GPRIME - Excitation modification gain */
/* Outputs: */
/* PC - Predictor coefficients */
/* Indices 1 through ORDER written. */
/* Indices 1 through ORDER-1 are read after being written. */
/* G2PASS - Excitation modification sharpening factor */
/* This subroutine has no local state. */
/* Subroutine */ int irc2pc_(real *rc, real *pc, integer *order, real *gprime,
real *g2pass)
{
/* System generated locals */
integer i__1, i__2;
/* Builtin functions */
double sqrt(doublereal);
/* Local variables */
real temp[10];
integer i__, j;
/* Arguments */
/* $Log: irc2pc.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:56 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Local variables that need not be saved */
/* Parameter adjustments */
--pc;
--rc;
/* Function Body */
*g2pass = 1.f;
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
*g2pass *= 1.f - rc[i__] * rc[i__];
}
*g2pass = (real)(*gprime * sqrt(*g2pass));
pc[1] = rc[1];
i__1 = *order;
for (i__ = 2; i__ <= i__1; ++i__) {
i__2 = i__ - 1;
for (j = 1; j <= i__2; ++j) {
temp[j - 1] = pc[j] - rc[i__] * pc[i__ - j];
}
i__2 = i__ - 1;
for (j = 1; j <= i__2; ++j) {
pc[j] = temp[j - 1];
}
pc[i__] = rc[i__];
}
return 0;
} /* irc2pc_ */

View File

@ -1,125 +0,0 @@
/*
$Log: ivfilt.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:31:53 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real *ivrc);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************* */
/* IVFILT Version 48 */
/* $Log: ivfilt.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:53 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/15 21:36:29 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 00:01:00 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:47:34 jaf */
/* Initial revision */
/* ********************************************************************* */
/* 2nd order inverse filter, speech is decimated 4:1 */
/* Input: */
/* LEN - Length of speech buffers */
/* NSAMP - Number of samples to filter */
/* LPBUF - Low pass filtered speech buffer */
/* Indices LEN-NSAMP-7 through LEN read. */
/* Output: */
/* IVBUF - Inverse filtered speech buffer */
/* Indices LEN-NSAMP+1 through LEN written. */
/* IVRC - Inverse filter reflection coefficients (for voicing) */
/* Indices 1 and 2 both written (also read, but only after writing).
*/
/* This subroutine has no local state. */
/* Subroutine */ int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *
nsamp, real *ivrc)
{
/* System generated locals */
integer i__1;
/* Local variables */
integer i__, j, k;
real r__[3], pc1, pc2;
/* Arguments */
/* Local variables that need not be saved */
/* Local state */
/* None */
/* Calculate Autocorrelations */
/* Parameter adjustments */
--ivbuf;
--lpbuf;
--ivrc;
/* Function Body */
for (i__ = 1; i__ <= 3; ++i__) {
r__[i__ - 1] = 0.f;
k = i__ - (1 << 2);
i__1 = *len;
for (j = (i__ << 2) + *len - *nsamp; j <= i__1; j += 2) {
r__[i__ - 1] += lpbuf[j] * lpbuf[j - k];
}
}
/* Calculate predictor coefficients */
pc1 = 0.f;
pc2 = 0.f;
ivrc[1] = 0.f;
ivrc[2] = 0.f;
if (r__[0] > 1e-10f) {
ivrc[1] = r__[1] / r__[0];
ivrc[2] = (r__[2] - ivrc[1] * r__[1]) / (r__[0] - ivrc[1] * r__[1]);
pc1 = ivrc[1] - ivrc[1] * ivrc[2];
pc2 = ivrc[2];
}
/* Inverse filter LPBUF into IVBUF */
i__1 = *len;
for (i__ = *len + 1 - *nsamp; i__ <= i__1; ++i__) {
ivbuf[i__] = lpbuf[i__] - pc1 * lpbuf[i__ - 4] - pc2 * lpbuf[i__ - 8];
}
return 0;
} /* ivfilt_ */

View File

@ -1,211 +0,0 @@
/*
$Log: lpc10.h,v $
Revision 1.1 2004/05/04 11:30:49 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:11 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:47:31 jaf
* Initial revision
*
*/
#ifndef __LPC10_H__
#define __LPC10_H__
#define LPC10_SAMPLES_PER_FRAME 180
#define LPC10_BITS_IN_COMPRESSED_FRAME 54
typedef short INT16;
typedef int INT32;
/* The initial values for every member of this structure is 0, except
where noted in comments. */
/* These two lines are copied from f2c.h. There should be a more
elegant way of doing this than having the same declarations in two
files. */
typedef float real;
typedef INT32 integer;
typedef INT32 logical;
typedef INT16 shortint;
struct lpc10_encoder_state {
/* State used only by function hp100 */
real z11;
real z21;
real z12;
real z22;
/* State used by function analys */
real inbuf[540], pebuf[540];
real lpbuf[696], ivbuf[312];
real bias;
integer osbuf[10]; /* no initial value necessary */
integer osptr; /* initial value 1 */
integer obound[3];
integer vwin[6] /* was [2][3] */; /* initial value vwin[4] = 307; vwin[5] = 462; */
integer awin[6] /* was [2][3] */; /* initial value awin[4] = 307; awin[5] = 462; */
integer voibuf[8] /* was [2][4] */;
real rmsbuf[3];
real rcbuf[30] /* was [10][3] */;
real zpre;
/* State used by function onset */
real n;
real d__; /* initial value 1.f */
real fpc; /* no initial value necessary */
real l2buf[16];
real l2sum1;
integer l2ptr1; /* initial value 1 */
integer l2ptr2; /* initial value 9 */
integer lasti; /* no initial value necessary */
logical hyst; /* initial value FALSE_ */
/* State used by function voicin */
real dither; /* initial value 20.f */
real snr;
real maxmin;
real voice[6] /* was [2][3] */; /* initial value is probably unnecessary */
integer lbve, lbue, fbve, fbue;
integer ofbue, sfbue;
integer olbue, slbue;
/* Initial values:
lbve = 3000;
fbve = 3000;
fbue = 187;
ofbue = 187;
sfbue = 187;
lbue = 93;
olbue = 93;
slbue = 93;
snr = (real) (fbve / fbue << 6);
*/
/* State used by function dyptrk */
real s[60];
integer p[120] /* was [60][2] */;
integer ipoint;
real alphax;
/* State used by function chanwr */
integer isync;
};
struct lpc10_decoder_state {
/* State used by function decode */
integer iptold; /* initial value 60 */
logical first; /* initial value TRUE_ */
integer ivp2h;
integer iovoic;
integer iavgp; /* initial value 60 */
integer erate;
integer drc[30] /* was [3][10] */;
integer dpit[3];
integer drms[3];
/* State used by function synths */
real buf[360];
integer buflen; /* initial value 180 */
/* State used by function pitsyn */
integer ivoico; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
integer ipito; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
real rmso; /* initial value 1.f */
real rco[10]; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
integer jsamp; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
logical first_pitsyn; /* initial value TRUE_ */
/* State used by function bsynz */
integer ipo;
real exc[166];
real exc2[166];
real lpi1;
real lpi2;
real lpi3;
real hpi1;
real hpi2;
real hpi3;
real rmso_bsynz;
/* State used by function random */
integer j; /* initial value 2 */
integer k; /* initial value 5 */
shortint y[5]; /* initial value { -21161,-8478,30892,-10216,16950 } */
/* State used by function deemp */
real dei1;
real dei2;
real deo1;
real deo2;
real deo3;
};
/*
Calling sequence:
Call create_lpc10_encoder_state(), which returns a pointer to an
already initialized lpc10_encoder_state structure.
lpc10_encode reads indices 0 through (LPC10_SAMPLES_PER_FRAME-1) of
array speech[], and writes indices 0 through
(LPC10_BITS_IN_COMPRESSED_FRAME-1) of array bits[], and both reads
and writes the lpc10_encoder_state structure contents. The
lpc10_encoder_state structure should *not* be initialized for every
frame of encoded speech. Once at the beginning of execution, done
automatically for you by create_lpc10_encoder_state(), is enough.
init_lpc10_encoder_state() reinitializes the lpc10_encoder_state
structure. This might be useful if you are finished processing one
sound sample, and want to reuse the same lpc10_encoder_state
structure to process another sound sample. There might be other
uses as well.
Note that the comments in the lpc10/lpcenc.c file imply that indices
1 through 180 of array speech[] are read. These comments were
written for the Fortran version of the code, before it was
automatically converted to C by the conversion program f2c. f2c
seems to use the convention that the pointers to arrays passed as
function arguments point to the first index used in the Fortran
code, whatever index that might be (usually 1), and then it modifies
the pointer inside of the function, like so:
if (speech) {
--speech;
}
So that the code can access the first value at index 1 and the last
at index 180. This makes the translated C code "closer" to the
original Fortran code.
The calling sequence for the decoder is similar to the encoder. The
only significant difference is that the array bits[] is read
(indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the
array speech[] is written (indices 0 through
(LPC10_SAMPLES_PER_FRAME-1)).
*/
struct lpc10_encoder_state * create_lpc10_encoder_state ();
void init_lpc10_encoder_state (struct lpc10_encoder_state *st);
int lpc10_encode (real *speech, INT32 *bits, struct lpc10_encoder_state *st);
struct lpc10_decoder_state * create_lpc10_decoder_state ();
void init_lpc10_decoder_state (struct lpc10_decoder_state *st);
int lpc10_decode (INT32 *bits, real *speech, struct lpc10_decoder_state *st);
#endif /* __LPC10_H__ */

View File

@ -1,276 +0,0 @@
/*
$Log: lpcdec.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:30:11 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
* all lpc10 functions have more consistent naming with each other.
*
* Revision 1.1 1996/08/19 22:31:48 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int lpcdec_(integer *bits, real *speech);
extern int initlpcdec_(void);
/* comlen contrl_ 12 */
/*:ref: chanrd_ 14 5 4 4 4 4 4 */
/*:ref: decode_ 14 7 4 4 4 4 4 6 6 */
/*:ref: synths_ 14 6 4 4 6 6 6 4 */
/*:ref: initdecode_ 14 0 */
/*:ref: initsynths_ 14 0 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* Table of constant values */
static integer c__10 = 10;
/* ***************************************************************** */
/* $Log: lpcdec.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:30:11 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
* all lpc10 functions have more consistent naming with each other.
*
* Revision 1.1 1996/08/19 22:31:48 jaf
* Initial revision
*
*/
/* Revision 1.1 1996/03/28 00:03:00 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Decode 54 bits to one frame of 180 speech samples. */
/* Input: */
/* BITS - 54 encoded bits, stored 1 per array element. */
/* Indices 1 through 53 read (SYNC bit ignored). */
/* Output: */
/* SPEECH - Speech encoded as real values in the range [-1,+1]. */
/* Indices 1 through 180 written. */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITLPCDEC. */
/* Subroutine */ int lpc10_decode(integer *bits, real *speech,
struct lpc10_decoder_state *st)
{
integer irms, voice[2], pitch, ipitv;
extern /* Subroutine */ int decode_(integer *, integer *, integer *,
integer *, integer *, real *, real *, struct lpc10_decoder_state *);
real rc[10];
extern /* Subroutine */ int chanrd_(integer *, integer *, integer *,
integer *, integer *), synths_(integer *,
integer *, real *, real *, real *, integer *,
struct lpc10_decoder_state *);
integer irc[10], len;
real rms;
/* $Log: lpcdec.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:30:11 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
* all lpc10 functions have more consistent naming with each other.
*
* Revision 1.1 1996/08/19 22:31:48 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Arguments */
/* $Log: lpcdec.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:30:11 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
* all lpc10 functions have more consistent naming with each other.
*
* Revision 1.1 1996/08/19 22:31:48 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Local variables that need not be saved */
/* Uncoded speech parameters */
/* Coded speech parameters */
/* Others */
/* Local state */
/* None */
/* Parameter adjustments */
if (bits) {
--bits;
}
if (speech) {
--speech;
}
/* Function Body */
chanrd_(&c__10, &ipitv, &irms, irc, &bits[1]);
decode_(&ipitv, &irms, irc, voice, &pitch, &rms, rc, st);
synths_(voice, &pitch, &rms, rc, &speech[1], &len, st);
return 0;
} /* lpcdec_ */

View File

@ -1,165 +0,0 @@
/*
$Log: lpcenc.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:31:21 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
* all lpc10 functions have more consistent naming with each other.
*
* Revision 1.1 1996/08/19 22:31:44 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int lpcenc_(real *speech, integer *bits);
extern int initlpcenc_(void);
/*:ref: prepro_ 14 2 6 4 */
/*:ref: analys_ 14 5 6 4 4 6 6 */
/*:ref: encode_ 14 7 4 4 6 6 4 4 4 */
/*:ref: chanwr_ 14 5 4 4 4 4 4 */
/*:ref: initprepro_ 14 0 */
/*:ref: initanalys_ 14 0 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Table of constant values */
static integer c__180 = 180;
static integer c__10 = 10;
/* ***************************************************************** */
/* $Log: lpcenc.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:31:21 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
* all lpc10 functions have more consistent naming with each other.
*
* Revision 1.1 1996/08/19 22:31:44 jaf
* Initial revision
*
*/
/* Revision 1.2 1996/03/28 00:01:22 jaf */
/* Commented out some trace statements. */
/* Revision 1.1 1996/03/28 00:00:27 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Encode one frame of 180 speech samples to 54 bits. */
/* Input: */
/* SPEECH - Speech encoded as real values in the range [-1,+1]. */
/* Indices 1 through 180 read, and modified (by PREPRO). */
/* Output: */
/* BITS - 54 encoded bits, stored 1 per array element. */
/* Indices 1 through 54 written. */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITLPCENC. */
/* Subroutine */ int lpc10_encode(real *speech, integer *bits,
struct lpc10_encoder_state *st)
{
integer irms, voice[2], pitch, ipitv;
real rc[10];
extern /* Subroutine */ int encode_(integer *, integer *, real *, real *,
integer *, integer *, integer *), chanwr_(integer *, integer *,
integer *, integer *, integer *, struct lpc10_encoder_state *),
analys_(real *, integer *,
integer *, real *, real *, struct lpc10_encoder_state *),
prepro_(real *, integer *, struct lpc10_encoder_state *);
integer irc[10];
real rms;
/* Arguments */
/* $Log: lpcenc.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:31:21 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
* all lpc10 functions have more consistent naming with each other.
*
* Revision 1.1 1996/08/19 22:31:44 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Local variables that need not be saved */
/* Uncoded speech parameters */
/* Coded speech parameters */
/* Local state */
/* None */
/* Parameter adjustments */
if (speech) {
--speech;
}
if (bits) {
--bits;
}
/* Function Body */
prepro_(&speech[1], &c__180, st);
analys_(&speech[1], voice, &pitch, &rms, rc, st);
encode_(voice, &pitch, &rms, rc, &ipitv, &irms, irc);
chanwr_(&c__10, &ipitv, &irms, irc, &bits[1], st);
return 0;
} /* lpcenc_ */

View File

@ -1,435 +0,0 @@
/*
$Log: lpcini.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.3 2002/10/10 05:29:04 robertj
Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
Revision 1.2 2001/02/24 14:00:10 rogerh
Select the correct header file for malloc (stdlib.h or malloc.h)
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:35:41 jaf
* Added functions for allocating and initializing lpc10_encoder_state
* and lpc10_decoder_state structures.
*
* Revision 1.1 1996/08/19 22:31:40 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int lpcini_(void);
/* comlen contrl_ 12 */
/*:ref: initlpcenc_ 14 0 */
/*:ref: initlpcdec_ 14 0 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* malloc is now defined in stdlib.h in serveral systems */
#ifdef HAS_STDLIB_H
# include <stdlib.h>
#else
# ifdef HAS_MALLOC_H
# include <malloc.h>
# else
extern char * malloc();
# endif
#endif
/* Common Block Declarations */
struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* ***************************************************************** */
/* $Log: lpcini.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.3 2002/10/10 05:29:04 robertj
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
*
* Revision 1.2 2001/02/24 14:00:10 rogerh
* Select the correct header file for malloc (stdlib.h or malloc.h)
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:35:41 jaf
* Added functions for allocating and initializing lpc10_encoder_state
* and lpc10_decoder_state structures.
*
* Revision 1.1 1996/08/19 22:31:40 jaf
* Initial revision
*
*/
/* Revision 1.1 1996/03/28 00:04:05 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Initialize COMMON block variables used by LPC-10 encoder and decoder, */
/* and call initialization routines for both of them. */
/* Subroutine */ int lpcini_(void)
{
/* $Log: lpcini.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.3 2002/10/10 05:29:04 robertj
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
*
* Revision 1.2 2001/02/24 14:00:10 rogerh
* Select the correct header file for malloc (stdlib.h or malloc.h)
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:35:41 jaf
* Added functions for allocating and initializing lpc10_encoder_state
* and lpc10_decoder_state structures.
*
* Revision 1.1 1996/08/19 22:31:40 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* $Log: lpcini.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.3 2002/10/10 05:29:04 robertj
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
*
* Revision 1.2 2001/02/24 14:00:10 rogerh
* Select the correct header file for malloc (stdlib.h or malloc.h)
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:35:41 jaf
* Added functions for allocating and initializing lpc10_encoder_state
* and lpc10_decoder_state structures.
*
* Revision 1.1 1996/08/19 22:31:40 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
contrl_1.order = 10;
contrl_1.lframe = 180;
contrl_1.corrp = TRUE_;
return 0;
} /* lpcini_ */
/* Allocate memory for, and initialize, the state that needs to be
kept from encoding one frame to the next for a single
LPC-10-compressed audio stream. Return 0 if malloc fails,
otherwise return pointer to new structure. */
struct lpc10_encoder_state *
create_lpc10_encoder_state()
{
struct lpc10_encoder_state *st;
st = (struct lpc10_encoder_state *)
malloc((unsigned) sizeof (struct lpc10_encoder_state));
if (st != 0) {
init_lpc10_encoder_state(st);
}
return (st);
}
void init_lpc10_encoder_state(struct lpc10_encoder_state *st)
{
int i;
lpcini_();
/* State used only by function hp100 */
st->z11 = 0.0f;
st->z21 = 0.0f;
st->z12 = 0.0f;
st->z22 = 0.0f;
/* State used by function analys */
for (i = 0; i < 540; i++) {
st->inbuf[i] = 0.0f;
st->pebuf[i] = 0.0f;
}
for (i = 0; i < 696; i++) {
st->lpbuf[i] = 0.0f;
}
for (i = 0; i < 312; i++) {
st->ivbuf[i] = 0.0f;
}
st->bias = 0.0f;
/* integer osbuf[10]; no initial value necessary */
st->osptr = 1;
for (i = 0; i < 3; i++) {
st->obound[i] = 0;
}
st->vwin[4] = 307;
st->vwin[5] = 462;
st->awin[4] = 307;
st->awin[5] = 462;
for (i = 0; i < 8; i++) {
st->voibuf[i] = 0;
}
for (i = 0; i < 3; i++) {
st->rmsbuf[i] = 0.0f;
}
for (i = 0; i < 30; i++) {
st->rcbuf[i] = 0.0f;
}
st->zpre = 0.0f;
/* State used by function onset */
st->n = 0.0f;
st->d__ = 1.0f;
/* real fpc; no initial value necessary */
for (i = 0; i < 16; i++) {
st->l2buf[i] = 0.0f;
}
st->l2sum1 = 0.0f;
st->l2ptr1 = 1;
st->l2ptr2 = 9;
/* integer lasti; no initial value necessary */
st->hyst = FALSE_;
/* State used by function voicin */
st->dither = 20.0f;
st->maxmin = 0.0f;
for (i = 0; i < 6; i++) {
st->voice[i] = 0.0f;
}
st->lbve = 3000;
st->fbve = 3000;
st->fbue = 187;
st->ofbue = 187;
st->sfbue = 187;
st->lbue = 93;
st->olbue = 93;
st->slbue = 93;
st->snr = (real) (st->fbve / st->fbue << 6);
/* State used by function dyptrk */
for (i = 0; i < 60; i++) {
st->s[i] = 0.0f;
}
for (i = 0; i < 120; i++) {
st->p[i] = 0;
}
st->ipoint = 0;
st->alphax = 0.0f;
/* State used by function chanwr */
st->isync = 0;
}
/* Allocate memory for, and initialize, the state that needs to be
kept from decoding one frame to the next for a single
LPC-10-compressed audio stream. Return 0 if malloc fails,
otherwise return pointer to new structure. */
struct lpc10_decoder_state *
create_lpc10_decoder_state()
{
struct lpc10_decoder_state *st;
st = (struct lpc10_decoder_state *)
malloc((unsigned) sizeof (struct lpc10_decoder_state));
if (st != 0) {
init_lpc10_decoder_state(st);
}
return (st);
}
void init_lpc10_decoder_state(struct lpc10_decoder_state *st)
{
int i;
lpcini_();
/* State used by function decode */
st->iptold = 60;
st->first = TRUE_;
st->ivp2h = 0;
st->iovoic = 0;
st->iavgp = 60;
st->erate = 0;
for (i = 0; i < 30; i++) {
st->drc[i] = 0;
}
for (i = 0; i < 3; i++) {
st->dpit[i] = 0;
st->drms[i] = 0;
}
/* State used by function synths */
for (i = 0; i < 360; i++) {
st->buf[i] = 0.0f;
}
st->buflen = 180;
/* State used by function pitsyn */
/* ivoico; no initial value necessary as long as first_pitsyn is initially TRUE_ */
/* ipito; no initial value necessary as long as first_pitsyn is initially TRUE_ */
st->rmso = 1.0f;
/* rco[10]; no initial value necessary as long as first_pitsyn is initially TRUE_ */
/* integer jsamp; no initial value necessary as long as first_pitsyn is initially TRUE_ */
st->first_pitsyn = TRUE_;
/* State used by function bsynz */
st->ipo = 0;
for (i = 0; i < 166; i++) {
st->exc[i] = 0.0f;
st->exc2[i] = 0.0f;
}
st->lpi1 = 0.0f;
st->lpi2 = 0.0f;
st->lpi3 = 0.0f;
st->hpi1 = 0.0f;
st->hpi2 = 0.0f;
st->hpi3 = 0.0f;
st->rmso_bsynz = 0.0f;
/* State used by function random */
st->j = 2;
st->k = 5;
st->y[0] = (shortint) -21161;
st->y[1] = (shortint) -8478;
st->y[2] = (shortint) 30892;
st->y[3] = (shortint) -10216;
st->y[4] = (shortint) 16950;
/* State used by function deemp */
st->dei1 = 0.0f;
st->dei2 = 0.0f;
st->deo1 = 0.0f;
st->deo2 = 0.0f;
st->deo3 = 0.0f;
}

View File

@ -1,114 +0,0 @@
/*
$Log: lpfilt.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:31:35 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *nsamp);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* *********************************************************************** */
/* LPFILT Version 55 */
/* $Log: lpfilt.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:35 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/15 16:53:49 jaf */
/* Just put comment header in standard form. */
/* Revision 1.2 1996/03/12 23:58:06 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:47:44 jaf */
/* Initial revision */
/* *********************************************************************** */
/* 31 Point Equiripple FIR Low-Pass Filter */
/* Linear phase, delay = 15 samples */
/* Passband: ripple = 0.25 dB, cutoff = 800 Hz */
/* Stopband: atten. = 40. dB, cutoff = 1240 Hz */
/* Inputs: */
/* LEN - Length of speech buffers */
/* NSAMP - Number of samples to filter */
/* INBUF - Input speech buffer */
/* Indices len-nsamp-29 through len are read. */
/* Output: */
/* LPBUF - Low passed speech buffer (must be different array than INBUF) */
/* Indices len+1-nsamp through len are written. */
/* This subroutine has no local state. */
/* Subroutine */ int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *
nsamp)
{
/* System generated locals */
integer i__1;
/* Local variables */
integer j;
real t;
/* Arguments */
/* Parameters/constants */
/* Local variables that need not be saved */
/* Local state */
/* None */
/* Parameter adjustments */
--lpbuf;
--inbuf;
/* Function Body */
i__1 = *len;
for (j = *len + 1 - *nsamp; j <= i__1; ++j) {
t = (inbuf[j] + inbuf[j - 30]) * -.0097201988f;
t += (inbuf[j - 1] + inbuf[j - 29]) * -.0105179986f;
t += (inbuf[j - 2] + inbuf[j - 28]) * -.0083479648f;
t += (inbuf[j - 3] + inbuf[j - 27]) * 5.860774e-4f;
t += (inbuf[j - 4] + inbuf[j - 26]) * .0130892089f;
t += (inbuf[j - 5] + inbuf[j - 25]) * .0217052232f;
t += (inbuf[j - 6] + inbuf[j - 24]) * .0184161253f;
t += (inbuf[j - 7] + inbuf[j - 23]) * 3.39723e-4f;
t += (inbuf[j - 8] + inbuf[j - 22]) * -.0260797087f;
t += (inbuf[j - 9] + inbuf[j - 21]) * -.0455563702f;
t += (inbuf[j - 10] + inbuf[j - 20]) * -.040306855f;
t += (inbuf[j - 11] + inbuf[j - 19]) * 5.029835e-4f;
t += (inbuf[j - 12] + inbuf[j - 18]) * .0729262903f;
t += (inbuf[j - 13] + inbuf[j - 17]) * .1572008878f;
t += (inbuf[j - 14] + inbuf[j - 16]) * .2247288674f;
t += inbuf[j - 15] * .250535965f;
lpbuf[j] = t;
}
return 0;
} /* lpfilt_ */

View File

@ -1,78 +0,0 @@
/*
$Log: median.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:31:31 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern integer median_(integer *d1, integer *d2, integer *d3);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************* */
/* MEDIAN Version 45G */
/* $Log: median.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:31 jaf
* Initial revision
*
*/
/* Revision 1.2 1996/03/14 22:30:22 jaf */
/* Just rearranged the comments and local variable declarations a bit. */
/* Revision 1.1 1996/02/07 14:47:53 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Find median of three values */
/* Input: */
/* D1,D2,D3 - Three input values */
/* Output: */
/* MEDIAN - Median value */
integer median_(integer *d1, integer *d2, integer *d3)
{
/* System generated locals */
integer ret_val;
/* Arguments */
ret_val = *d2;
if (*d2 > *d1 && *d2 > *d3) {
ret_val = *d1;
if (*d3 > *d1) {
ret_val = *d3;
}
} else if (*d2 < *d1 && *d2 < *d3) {
ret_val = *d1;
if (*d3 < *d1) {
ret_val = *d3;
}
}
return ret_val;
} /* median_ */

View File

@ -1,152 +0,0 @@
/*
$Log: mload.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:31:25 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int mload_(integer *order, integer *awins, integer *awinf, real *speech, real *phi, real *psi);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ***************************************************************** */
/* MLOAD Version 48 */
/* $Log: mload.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:25 jaf
* Initial revision
*
*/
/* Revision 1.5 1996/03/27 23:59:51 jaf */
/* Added some more accurate comments about which indices of the argument */
/* array SPEECH are read. I thought that this might be the cause of a */
/* problem I've been having, but it isn't. */
/* Revision 1.4 1996/03/26 19:16:53 jaf */
/* Commented out the code at the end that copied the lower triangular */
/* half of PHI into the upper triangular half (making the resulting */
/* matrix symmetric). The upper triangular half was never used by later */
/* code in subroutine ANALYS. */
/* Revision 1.3 1996/03/18 21:16:00 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 16:47:41 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:48:01 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Load a covariance matrix. */
/* Input: */
/* ORDER - Analysis order */
/* AWINS - Analysis window start */
/* AWINF - Analysis window finish */
/* SPEECH(AWINF) - Speech buffer */
/* Indices MIN(AWINS, AWINF-(ORDER-1)) through */
/* MAX(AWINF, AWINS+(ORDER-1)) read. */
/* As long as (AWINF-AWINS) .GE. (ORDER-1), */
/* this is just indices AWINS through AWINF. */
/* Output: */
/* PHI(ORDER,ORDER) - Covariance matrix */
/* Lower triangular half and diagonal written, and read.*/
/* Upper triangular half untouched. */
/* PSI(ORDER) - Prediction vector */
/* Indices 1 through ORDER written, */
/* and most are read after that. */
/* This subroutine has no local state. */
/* Subroutine */ int mload_(integer *order, integer *awins, integer *awinf,
real *speech, real *phi, real *psi)
{
/* System generated locals */
integer phi_dim1, phi_offset, i__1, i__2;
/* Local variables */
integer c__, i__, r__, start;
/* Arguments */
/* Local variables that need not be saved */
/* Load first column of triangular covariance matrix PHI */
/* Parameter adjustments */
--psi;
phi_dim1 = *order;
phi_offset = phi_dim1 + 1;
phi -= phi_offset;
--speech;
/* Function Body */
start = *awins + *order;
i__1 = *order;
for (r__ = 1; r__ <= i__1; ++r__) {
phi[r__ + phi_dim1] = 0.f;
i__2 = *awinf;
for (i__ = start; i__ <= i__2; ++i__) {
phi[r__ + phi_dim1] += speech[i__ - 1] * speech[i__ - r__];
}
}
/* Load last element of vector PSI */
psi[*order] = 0.f;
i__1 = *awinf;
for (i__ = start; i__ <= i__1; ++i__) {
psi[*order] += speech[i__] * speech[i__ - *order];
}
/* End correct to get additional columns of PHI */
i__1 = *order;
for (r__ = 2; r__ <= i__1; ++r__) {
i__2 = r__;
for (c__ = 2; c__ <= i__2; ++c__) {
phi[r__ + c__ * phi_dim1] = phi[r__ - 1 + (c__ - 1) * phi_dim1] -
speech[*awinf + 1 - r__] * speech[*awinf + 1 - c__] +
speech[start - r__] * speech[start - c__];
}
}
/* End correct to get additional elements of PSI */
i__1 = *order - 1;
for (c__ = 1; c__ <= i__1; ++c__) {
psi[c__] = phi[c__ + 1 + phi_dim1] - speech[start - 1] * speech[start
- 1 - c__] + speech[*awinf] * speech[*awinf - c__];
}
/* Copy lower triangular section into upper (why bother?) */
/* I'm commenting this out, since the upper triangular half of PHI
*/
/* is never used by later code, unless a sufficiently high level of
*/
/* tracing is turned on. */
/* DO R = 1,ORDER */
/* DO C = 1,R-1 */
/* PHI(C,R) = PHI(R,C) */
/* END DO */
/* END DO */
return 0;
} /* mload_ */

View File

@ -1,317 +0,0 @@
/*
$Log: onset.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:37:55 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:31:18 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int onset_(real *pebuf, integer *osbuf, integer *osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *lframe, struct lpc10_encoder_state *st);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Table of constant values */
static real c_b2 = 1.f;
/* ****************************************************************** */
/* ONSET Version 49 */
/* $Log: onset.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:37:55 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:31:18 jaf
* Initial revision
*
*/
/* Revision 1.5 1996/03/15 16:41:01 jaf */
/* Just rearranged INITONSET assignment orders to be consistent with */
/* order of DATA statements in ONSET. */
/* Revision 1.4 1996/03/15 15:48:27 jaf */
/* Changed some comments, and only reordered the DATA statements (their */
/* meaning wasn't changed). */
/* Revision 1.3 1996/03/14 23:53:06 jaf */
/* Added an entry INITONSET that reinitializes the local state variables */
/* of subroutine ONSET. */
/* Rearranged quite a few comments, adding more explaining which */
/* arguments were inputs, and how the modified ones can be changed. */
/* Revision 1.2 1996/03/12 23:53:00 jaf */
/* Lots of comments added about the local state of this subroutine that */
/* must be saved from one invocation to the next. */
/* One constant 180 replaced with LFRAME, which should be "more general", */
/* even though it would probably require many more changes than this to */
/* get this coder to work for other frame sizes. */
/* Revision 1.1 1996/02/07 14:48:09 jaf */
/* Initial revision */
/* ****************************************************************** */
/* Floating point version */
/* Detection of onsets in (or slightly preceding) the futuremost frame */
/* of speech. */
/* Input: */
/* PEBUF(SBUFL:SBUFH) - Preemphasized speech */
/* Indices SBUFH-LFRAME through SBUFH are read. */
/* OSLEN - Maximum number of onsets that can be stored in OSBUF. */
/* SBUFL, SBUFH - Range of PEBUF */
/* LFRAME - length of a frame, in samples */
/* Input/Output: */
/* OSBUF(OSLEN) - Buffer which holds sorted indexes of onsets */
/* Indices A through B are modified, where A */
/* is the original value of OSPTR, and B is the final */
/* value of OSPTR-1. B is at most OSLEN. */
/* OSPTR - Free pointer into OSBUF */
/* Initial value should be .LE. OSLEN+1. */
/* If so, final value grows by one for each new onset */
/* found, and final value will be .LE. OSLEN+1. */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this subroutine, or */
/* reinitialize its state for any other reason, call the ENTRY INITONSET. */
/* Subroutine */ int onset_(real *pebuf, integer *osbuf, integer *
osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *
lframe, struct lpc10_encoder_state *st)
{
/* Initialized data */
real *n;
real *d__;
real *l2buf;
real *l2sum1;
integer *l2ptr1;
integer *l2ptr2;
logical *hyst;
/* System generated locals */
integer pebuf_offset, i__1;
real r__1;
/* Builtin functions */
double r_sign(real *, real *);
/* Local variables */
integer i__;
integer *lasti;
real l2sum2;
real *fpc;
/* Arguments */
/* $Log: onset.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:37:55 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:31:18 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Parameters/constants */
/* Parameters for onset detection algorithm: */
/* L2 Threshold for filtered slope of FPC (function of L2WID!) */
/* L2LAG Lag due to both filters which compute filtered slope of FPC */
/* L2WID Width of the filter which computes the slope of FPC */
/* OSHYST The number of samples of slope(FPC) which must be below */
/* the threshold before a new onset may be declared. */
/* Local variables that need not be saved */
/* Local state */
/* Variables */
/* N, D Numerator and denominator of prediction filters */
/* FPC Current prediction coefs */
/* L2BUF, L2SUM1, L2SUM2 State of slope filter */
/* The only "significant" change I've made is to change L2SUM2 out
*/
/* of the list of local variables that need to be saved, since it */
/* didn't need to be. */
/* L2SUM1 need not be, but avoiding saving it would require a small
*/
/* change to the body of the code. See comments below for an */
/* example of how the code could be changed to avoid saving L2SUM1.
*/
/* FPC and LASTI are saved from one invocation to the next, but */
/* they are not given initial values. This is acceptable, because
*/
/* FPC will be assigned a value the first time that this function */
/* is called after D is initialized to 1, since the formula to */
/* change D will not change it to 0 in one step, and the IF (D */
/* .NE. 0) statement will execute its THEN part, initializing FPC.
*/
/* LASTI's value will not be used until HYST is .TRUE., and */
/* whenever HYST is changed from its initial value of .FALSE., */
/* LASTI is assigned a value. */
/* In a C version of this coder, it would be nice if all of these */
/* saved things, in this and all other subroutines, could be stored
*/
/* in a single struct lpc10_coder_state_t, initialized with a call
*/
/* to a function like lpc10_init(&lpc10_coder_state). In this way,
*/
/* a program that used these functions could conveniently alternate
*/
/* coding more than one distinct audio stream. */
n = &(st->n);
d__ = &(st->d__);
fpc = &(st->fpc);
l2buf = &(st->l2buf[0]);
l2sum1 = &(st->l2sum1);
l2ptr1 = &(st->l2ptr1);
l2ptr2 = &(st->l2ptr2);
lasti = &(st->lasti);
hyst = &(st->hyst);
/* Parameter adjustments */
if (osbuf) {
--osbuf;
}
if (pebuf) {
pebuf_offset = *sbufl;
pebuf -= pebuf_offset;
}
/* Function Body */
/* The following line subtracted a hard-coded "180" from LASTI, */
/* instead of using a variable like LFRAME or a constant like */
/* MAXFRM. I changed it to LFRAME, for "generality". */
if (*hyst) {
*lasti -= *lframe;
}
i__1 = *sbufh;
for (i__ = *sbufh - *lframe + 1; i__ <= i__1; ++i__) {
/* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1.
*/
*n = (pebuf[i__] * pebuf[i__ - 1] + (*n) * 63.f) / 64.f;
/* Computing 2nd power */
r__1 = pebuf[i__ - 1];
*d__ = (r__1 * r__1 + (*d__) * 63.f) / 64.f;
if ((*d__) != 0.f) {
if (abs(*n) > (*d__)) {
*fpc = (real)r_sign(&c_b2, n);
} else {
*fpc = (*n) / (*d__);
}
}
/* Filter FPC */
/* In order to allow L2SUM1 not to be saved from one invocation
of */
/* this subroutine to the next, one could change the sequence of
*/
/* assignments below, up to the IF statement, to the following.
In */
/* addition, the initial value of L2PTR2 should be changed to */
/* L2WID/2 instead of L2WID/2+1. */
/* L2SUM1 = L2BUF(L2PTR2) */
/* L2PTR2 = MOD(L2PTR2,L2WID)+1 */
/* L2SUM1 = L2SUM1 - L2BUF(L2PTR2) + FPC */
/* L2BUF(L2PTR2) = L2SUM1 */
/* * The following lines didn't change from the original: */
/* L2SUM2 = L2BUF(L2PTR1) */
/* L2BUF(L2PTR1) = FPC */
/* L2PTR1 = MOD(L2PTR1,L2WID)+1 */
l2sum2 = l2buf[*l2ptr1 - 1];
*l2sum1 = *l2sum1 - l2buf[*l2ptr2 - 1] + *fpc;
l2buf[*l2ptr2 - 1] = *l2sum1;
l2buf[*l2ptr1 - 1] = *fpc;
*l2ptr1 = *l2ptr1 % 16 + 1;
*l2ptr2 = *l2ptr2 % 16 + 1;
if ((r__1 = *l2sum1 - l2sum2, abs(r__1)) > 1.7f) {
if (! (*hyst)) {
/* Ignore if buffer full */
if (*osptr <= *oslen) {
osbuf[*osptr] = i__ - 9;
++(*osptr);
}
*hyst = TRUE_;
}
*lasti = i__;
/* After one onset detection, at least OSHYST sample times m
ust go */
/* by before another is allowed to occur. */
} else if ((*hyst) && i__ - *lasti >= 10) {
*hyst = FALSE_;
}
}
return 0;
} /* onset_ */

View File

@ -1,567 +0,0 @@
/*
$Log: pitsyn.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:40:12 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:31:12 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int pitsyn_(integer *order, integer *voice, integer *pitch, real *rms, real *rc, integer *lframe, integer *ivuv, integer *ipiti, real *rmsi, real *rci, integer *nout, real *ratio, struct lpc10_decoder_state *st);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ***************************************************************** */
/* PITSYN Version 53 */
/* $Log: pitsyn.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:40:12 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:31:12 jaf
* Initial revision
*
*/
/* Revision 1.2 1996/03/25 18:49:07 jaf */
/* Added commments about which indices of array arguments are read or */
/* written. */
/* Rearranged local variable declarations to indicate which need to be */
/* saved from one invocation to the next. Added entry INITPITSYN to */
/* reinitialize local state variables, if desired. */
/* Added lots of comments about proving that the maximum number of pitch */
/* periods (NOUT) that can be returned is 16. The call to STOP that */
/* could happen if NOUT got too large was removed as a result. */
/* Also proved that the total number of samples returned from N calls, */
/* each with identical values of LFRAME, will always be in the range */
/* N*LFRAME-MAXPIT+1 to N*LFRAME. */
/* Revision 1.1 1996/02/07 14:48:18 jaf */
/* Initial revision */
/* ***************************************************************** */
/* Synthesize a single pitch epoch */
/* Input: */
/* ORDER - Synthesis order (number of RC's) */
/* VOICE - Half frame voicing decisions */
/* Indices 1 through 2 read. */
/* LFRAME - Length of speech buffer */
/* Input/Output: */
/* PITCH - Pitch */
/* This value should be in the range MINPIT (20) to MAXPIT */
/* (156), inclusive. */
/* PITCH can be modified under some conditions. */
/* RMS - Energy (can be modified) */
/* RMS is changed to 1 if the value passed in is less than 1. */
/* RC - Reflection coefficients */
/* Indices 1 through ORDER can be temporarily overwritten with */
/* RCO, and then replaced with original values, under some */
/* conditions. */
/* Output: */
/* IVUV - Pitch epoch voicing decisions */
/* Indices (I) of IVUV, IPITI, and RMSI are written, */
/* and indices (J,I) of RCI are written, */
/* where I ranges from 1 to NOUT, and J ranges from 1 to ORDER. */
/* IPITI - Pitch epoch length */
/* RMSI - Pitch epoch energy */
/* RCI - Pitch epoch RC's */
/* NOUT - Number of pitch periods in this frame */
/* This is at least 0, at least 1 if MAXPIT .LT. LFRAME (this */
/* is currently true on every call), and can never be more than */
/* (LFRAME+MAXPIT-1)/PITCH, which is currently 16 with */
/* LFRAME=180, MAXPIT=156, and PITCH .GE. 20, as SYNTHS */
/* guarantees when it calls this subroutine. */
/* RATIO - Previous to present energy ratio */
/* Always assigned a value. */
/* Subroutine */ int pitsyn_(integer *order, integer *voice,
integer *pitch, real *rms, real *rc, integer *lframe, integer *ivuv,
integer *ipiti, real *rmsi, real *rci, integer *nout, real *ratio,
struct lpc10_decoder_state *st)
{
/* Initialized data */
real *rmso;
logical *first;
/* System generated locals */
integer rci_dim1, rci_offset, i__1, i__2;
real r__1;
/* Builtin functions */
double log(doublereal), exp(doublereal);
/* Local variables */
real alrn, alro, yarc[10], prop;
integer i__, j, vflag, jused, lsamp;
integer *jsamp;
real slope;
integer *ipito;
real uvpit;
integer ip, nl, ivoice;
integer *ivoico;
integer istart;
real *rco;
real xxy;
/* Arguments */
/* $Log: pitsyn.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:40:12 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:31:12 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Local variables that need not be saved */
/* LSAMP is initialized in the IF (FIRST) THEN clause, but it is */
/* not used the first time through, and it is given a value before
*/
/* use whenever FIRST is .FALSE., so it appears unnecessary to */
/* assign it a value when FIRST is .TRUE. */
/* Local state */
/* FIRST - .TRUE. only on first call to PITSYN. */
/* IVOICO - Previous VOICE(2) value. */
/* IPITO - Previous PITCH value. */
/* RMSO - Previous RMS value. */
/* RCO - Previous RC values. */
/* JSAMP - If this routine is called N times with identical values of */
/* LFRAME, then the total length of all pitch periods returned */
/* is always N*LFRAME-JSAMP, and JSAMP is always in the range 0
*/
/* to MAXPIT-1 (see below for why this is so). Thus JSAMP is */
/* the number of samples "left over" from the previous call to */
/* PITSYN, that haven't been "used" in a pitch period returned */
/* from this subroutine. Every time this subroutine is called,
*/
/* it returns pitch periods with a total length of at most */
/* LFRAME+JSAMP. */
/* IVOICO, IPITO, RCO, and JSAMP need not be assigned an initial value */
/* with a DATA statement, because they are always initialized on the */
/* first call to PITSYN. */
/* FIRST and RMSO should be initialized with DATA statements, because */
/* even on the first call, they are used before being initialized. */
/* Parameter adjustments */
if (rc) {
--rc;
}
if (rci) {
rci_dim1 = *order;
rci_offset = rci_dim1 + 1;
rci -= rci_offset;
}
if (voice) {
--voice;
}
if (ivuv) {
--ivuv;
}
if (ipiti) {
--ipiti;
}
if (rmsi) {
--rmsi;
}
/* Function Body */
ivoico = &(st->ivoico);
ipito = &(st->ipito);
rmso = &(st->rmso);
rco = &(st->rco[0]);
jsamp = &(st->jsamp);
first = &(st->first_pitsyn);
if (*rms < 1.f) {
*rms = 1.f;
}
if (*rmso < 1.f) {
*rmso = 1.f;
}
uvpit = 0.f;
*ratio = *rms / (*rmso + 8.f);
if (*first) {
lsamp = 0;
ivoice = voice[2];
if (ivoice == 0) {
*pitch = *lframe / 4;
}
*nout = *lframe / *pitch;
*jsamp = *lframe - *nout * *pitch;
/* SYNTHS only calls this subroutine with PITCH in the range
20 */
/* to 156. LFRAME = MAXFRM = 180, so NOUT is somewhere in th
e */
/* range 1 to 9. */
/* JSAMP is "LFRAME mod PITCH", so it is in the range 0 to */
/* (PITCH-1), or 0 to MAXPIT-1=155, after the first call. */
i__1 = *nout;
for (i__ = 1; i__ <= i__1; ++i__) {
i__2 = *order;
for (j = 1; j <= i__2; ++j) {
rci[j + i__ * rci_dim1] = rc[j];
}
ivuv[i__] = ivoice;
ipiti[i__] = *pitch;
rmsi[i__] = *rms;
}
*first = FALSE_;
} else {
vflag = 0;
lsamp = *lframe + *jsamp;
slope = (*pitch - *ipito) / (real) lsamp;
*nout = 0;
jused = 0;
istart = 1;
if (voice[1] == *ivoico && voice[2] == voice[1]) {
if (voice[2] == 0) {
/* SSUV - - 0 , 0 , 0 */
*pitch = *lframe / 4;
*ipito = *pitch;
if (*ratio > 8.f) {
*rmso = *rms;
}
}
/* SSVC - - 1 , 1 , 1 */
slope = (*pitch - *ipito) / (real) lsamp;
ivoice = voice[2];
} else {
if (*ivoico != 1) {
if (*ivoico == voice[1]) {
/* UV2VC2 - - 0 , 0 , 1 */
nl = lsamp - *lframe / 4;
} else {
/* UV2VC1 - - 0 , 1 , 1 */
nl = lsamp - *lframe * 3 / 4;
}
ipiti[1] = nl / 2;
ipiti[2] = nl - ipiti[1];
ivuv[1] = 0;
ivuv[2] = 0;
rmsi[1] = *rmso;
rmsi[2] = *rmso;
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
rci[i__ + rci_dim1] = rco[i__ - 1];
rci[i__ + (rci_dim1 << 1)] = rco[i__ - 1];
rco[i__ - 1] = rc[i__];
}
slope = 0.f;
*nout = 2;
*ipito = *pitch;
jused = nl;
istart = nl + 1;
ivoice = 1;
} else {
if (*ivoico != voice[1]) {
/* VC2UV1 - - 1 , 0 , 0 */
lsamp = *lframe / 4 + *jsamp;
} else {
/* VC2UV2 - - 1 , 1 , 0 */
lsamp = *lframe * 3 / 4 + *jsamp;
}
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
yarc[i__ - 1] = rc[i__];
rc[i__] = rco[i__ - 1];
}
ivoice = 1;
slope = 0.f;
vflag = 1;
}
}
/* Here is the value of most variables that are used below, depending
on */
/* the values of IVOICO, VOICE(1), and VOICE(2). VOICE(1) and VOICE(2
) */
/* are input arguments, and IVOICO is the value of VOICE(2) on the */
/* previous call (see notes for the IF (NOUT .NE. 0) statement near th
e */
/* end). Each of these three values is either 0 or 1. These three */
/* values below are given as 3-bit long strings, in the order IVOICO,
*/
/* VOICE(1), and VOICE(2). It appears that the code above assumes tha
t */
/* the bit sequences 010 and 101 never occur, but I wonder whether a
*/
/* large enough number of bit errors in the channel could cause such a
*/
/* thing to happen, and if so, could that cause NOUT to ever go over 1
1? */
/* Note that all of the 180 values in the table are really LFRAME, but
*/
/* 180 has fewer characters, and it makes the table a little more */
/* concrete. If LFRAME is ever changed, keep this in mind. Similarly
, */
/* 135's are 3*LFRAME/4, and 45's are LFRAME/4. If LFRAME is not a */
/* multiple of 4, then the 135 for NL-JSAMP is actually LFRAME-LFRAME/
4, */
/* and the 45 for NL-JSAMP is actually LFRAME-3*LFRAME/4. */
/* Note that LSAMP-JSAMP is given as the variable. This was just for
*/
/* brevity, to avoid adding "+JSAMP" to all of the column entries. */
/* Similarly for NL-JSAMP. */
/* Variable | 000 001 011,010 111 110 100,101 */
/* ------------+-------------------------------------------------- */
/* ISTART | 1 NL+1 NL+1 1 1 1 */
/* LSAMP-JSAMP | 180 180 180 180 135 45 */
/* IPITO | 45 PITCH PITCH oldPITCH oldPITCH oldPITCH */
/* SLOPE | 0 0 0 seebelow 0 0 */
/* JUSED | 0 NL NL 0 0 0 */
/* PITCH | 45 PITCH PITCH PITCH PITCH PITCH */
/* NL-JSAMP | -- 135 45 -- -- -- */
/* VFLAG | 0 0 0 0 1 1 */
/* NOUT | 0 2 2 0 0 0 */
/* IVOICE | 0 1 1 1 1 1 */
/* while_loop | once once once once twice twice */
/* ISTART | -- -- -- -- JUSED+1 JUSED+1 */
/* LSAMP-JSAMP | -- -- -- -- 180 180 */
/* IPITO | -- -- -- -- oldPITCH oldPITCH */
/* SLOPE | -- -- -- -- 0 0 */
/* JUSED | -- -- -- -- ?? ?? */
/* PITCH | -- -- -- -- PITCH PITCH */
/* NL-JSAMP | -- -- -- -- -- -- */
/* VFLAG | -- -- -- -- 0 0 */
/* NOUT | -- -- -- -- ?? ?? */
/* IVOICE | -- -- -- -- 0 0 */
/* UVPIT is always 0.0 on the first pass through the DO WHILE (.TRUE.)
*/
/* loop below. */
/* The only possible non-0 value of SLOPE (in column 111) is */
/* (PITCH-IPITO)/FLOAT(LSAMP) */
/* Column 101 is identical to 100. Any good properties we can prove
*/
/* for 100 will also hold for 101. Similarly for 010 and 011. */
/* SYNTHS calls this subroutine with PITCH restricted to the range 20
to */
/* 156. IPITO is similarly restricted to this range, after the first
*/
/* call. IP below is also restricted to this range, given the */
/* definitions of IPITO, SLOPE, UVPIT, and that I is in the range ISTA
RT */
/* to LSAMP. */
while(TRUE_) {
/* JUSED is the total length of all pitch periods curr
ently */
/* in the output arrays, in samples. */
/* An invariant of the DO I = ISTART,LSAMP loop below,
under */
/* the condition that IP is always in the range 1 thro
ugh */
/* MAXPIT, is: */
/* (I - MAXPIT) .LE. JUSED .LE. (I-1) */
/* Note that the final value of I is LSAMP+1, so that
after */
/* the DO loop is complete, we know: */
/* (LSAMP - MAXPIT + 1) .LE. JUSED .LE. LSAMP */
i__1 = lsamp;
for (i__ = istart; i__ <= i__1; ++i__) {
r__1 = *ipito + slope * i__;
ip = (integer)(r__1 + .5f);
if (uvpit != 0.f) {
ip = (integer)uvpit;
}
if (ip <= i__ - jused) {
++(*nout);
/* The following check is no longer nece
ssary, now that */
/* we can prove that NOUT will never go
over 16. */
/* IF (NOUT .GT. 16) STOP 'PITSYN: too many epochs'
*/
ipiti[*nout] = ip;
*pitch = ip;
ivuv[*nout] = ivoice;
jused += ip;
prop = (jused - ip / 2) / (real) lsamp;
i__2 = *order;
for (j = 1; j <= i__2; ++j) {
alro = (real)log((rco[j - 1] + 1) / (1 - rco[j - 1]));
alrn = (real)log((rc[j] + 1) / (1 - rc[j]));
xxy = alro + prop * (alrn - alro);
xxy = (real)exp(xxy);
rci[j + *nout * rci_dim1] = (xxy - 1) / (xxy + 1);
}
rmsi[*nout] = (real)(log(*rmso) + prop * (log(*rms) - log(*rmso)));
rmsi[*nout] = (real)exp(rmsi[*nout]);
}
}
if (vflag != 1) {
goto L100;
}
/* I want to prove what range UVPIT must lie in after
the */
/* assignments to it below. To do this, I must determ
ine */
/* what range (LSAMP-ISTART) must lie in, after the */
/* assignments to ISTART and LSAMP below. */
/* Let oldLSAMP be the value of LSAMP at this point in
the */
/* execution. This is 135+JSAMP in state 110, or 45+J
SAMP in */
/* states 100 or 101. */
/* Given the loop invariant on JUSED above, we know th
at: */
/* (oldLSAMP - MAXPIT + 1) .LE. JUSED .LE. oldLSAMP */
/* ISTART is one more than this. */
/* Let newLSAMP be the value assigned to LSAMP below.
This */
/* is 180+JSAMP. Thus (newLSAMP-oldLSAMP) is either 4
5 or */
/* 135, depending on the state. */
/* Thus, the range of newLSAMP-ISTART is: */
/* (newLSAMP-(oldLSAMP+1)) .LE. newLSAMP-ISTART */
/* .LE. (newLSAMP-(oldLSAMP - MAXPIT + 2)) */
/* or: */
/* 46 .LE. newLSAMP-ISTART .LE. 133+MAXPIT .EQ. 289 */
/* Therefore, UVPIT is in the range 23 to 144 after th
e first */
/* assignment to UVPIT below, and after the conditiona
l */
/* assignment, it is in the range 23 to 90. */
/* The important thing is that it is in the range 20 t
o 156, */
/* so that in the loop above, IP is always in this ran
ge. */
vflag = 0;
istart = jused + 1;
lsamp = *lframe + *jsamp;
slope = 0.f;
ivoice = 0;
uvpit = (real) ((lsamp - istart) / 2);
if (uvpit > 90.f) {
uvpit /= 2;
}
*rmso = *rms;
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
rc[i__] = yarc[i__ - 1];
rco[i__ - 1] = yarc[i__ - 1];
}
}
L100:
*jsamp = lsamp - jused;
}
/* Given that the maximum pitch period MAXPIT .LT. LFRAME (this is
*/
/* currently true on every call, since SYNTHS always sets */
/* LFRAME=180), NOUT will always be .GE. 1 at this point. */
if (*nout != 0) {
*ivoico = voice[2];
*ipito = *pitch;
*rmso = *rms;
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
rco[i__ - 1] = rc[i__];
}
}
return 0;
} /* pitsyn_ */

View File

@ -1,225 +0,0 @@
/*
$Log: placea.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2001/10/16 21:21:14 yurik
Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:31:07 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* *********************************************************************** */
/* PLACEA Version 48 */
/* $Log: placea.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2001/10/16 21:21:14 yurik
* Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:07 jaf
* Initial revision
*
*/
/* Revision 1.5 1996/03/19 20:41:55 jaf */
/* Added some conditions satisfied by the output values in EWIN. */
/* Revision 1.4 1996/03/19 20:24:17 jaf */
/* Added some conditions satisfied by the output values in AWIN. */
/* Revision 1.3 1996/03/18 21:40:04 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 16:43:09 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:48:31 jaf */
/* Initial revision */
/* *********************************************************************** */
/* Input: */
/* IPITCH */
/* VOIBUF */
/* Indices (2,AF-2), (1,AF-1), (2,AF-1), (1,AF), and (2,AF) read.*/
/* All other indices untouched. */
/* OBOUND */
/* AF */
/* VWIN */
/* Indices (1,AF) and (2,AF) read. */
/* All other indices untouched. */
/* LFRAME */
/* MAXWIN */
/* Input/Output: */
/* AWIN */
/* Index (1,AF-1) read. */
/* Indices (1,AF) and (2,AF) written, and then read. */
/* All other indices untouched. */
/* In all cases (except possibly one), the final values will */
/* satisfy the condition: AWIN(2,AF)-AWIN(1,AF)+1 = MAXWIN. */
/* In that other case, */
/* AWIN(1,AF)=VWIN(1,AF) and AWIN(2,AF)=VWIN(2,AF). */
/* Output: */
/* EWIN */
/* Indices (1,AF) and (2,AF) written. */
/* All other indices untouched. */
/* In all cases, the final values will satisfy the condition: */
/* AWIN(1,AF) .LE. EWIN(1,AF) .LE. EWIN(2,AF) .LE. AWIN(2,AF) */
/* In other words, the energy window is a sub-window of */
/* the analysis window. */
/* This subroutine has no local state. */
/* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer *
obound, integer *af, integer *vwin, integer *awin, integer *ewin,
integer *lframe, integer *maxwin)
{
/* System generated locals */
real r__1;
/* Builtin functions */
integer i_nint(real *);
/* Local variables */
logical allv, winv;
integer i__, j, k, l, hrange;
logical ephase;
integer lrange;
/* Arguments */
/* Local variables that need not be saved */
/* Parameter adjustments */
ewin -= 3;
awin -= 3;
vwin -= 3;
--voibuf;
/* Function Body */
lrange = (*af - 2) * *lframe + 1;
hrange = *af * *lframe;
/* Place the Analysis window based on the voicing window */
/* placement, onsets, tentative voicing decision, and pitch. */
/* Case 1: Sustained Voiced Speech */
/* If the five most recent voicing decisions are */
/* voiced, then the window is placed phase-synchronously with the */
/* previous window, as close to the present voicing window if possible.
*/
/* If onsets bound the voicing window, then preference is given to */
/* a phase-synchronous placement which does not overlap these onsets. */
/* Case 2: Voiced Transition */
/* If at least one voicing decision in AF is voicied, and there are no
*/
/* onsets, then the window is placed as in case 1. */
/* Case 3: Unvoiced Speech or Onsets */
/* If both voicing decisions in AF are unvoiced, or there are onsets, */
/* then the window is placed coincident with the voicing window. */
/* Note: During phase-synchronous placement of windows, the length */
/* is not altered from MAXWIN, since this would defeat the purpose */
/* of phase-synchronous placement. */
/* Check for case 1 and case 2 */
allv = voibuf[((*af - 2) << 1) + 2] == 1;
allv = allv && voibuf[((*af - 1) << 1) + 1] == 1;
allv = allv && voibuf[((*af - 1) << 1) + 2] == 1;
allv = allv && voibuf[(*af << 1) + 1] == 1;
allv = allv && voibuf[(*af << 1) + 2] == 1;
winv = voibuf[(*af << 1) + 1] == 1 || voibuf[(*af << 1) + 2] == 1;
if (allv || winv && *obound == 0) {
/* APHASE: Phase synchronous window placement. */
/* Get minimum lower index of the window. */
i__ = (lrange + *ipitch - 1 - awin[((*af - 1) << 1) + 1]) / *ipitch;
i__ *= *ipitch;
i__ += awin[((*af - 1) << 1) + 1];
/* L = the actual length of this frame's analysis window. */
l = *maxwin;
/* Calculate the location where a perfectly centered window would star
t. */
k = (vwin[(*af << 1) + 1] + vwin[(*af << 1) + 2] + 1 - l) / 2;
/* Choose the actual location to be the pitch multiple closest to this
. */
r__1 = (real) (k - i__) / *ipitch;
awin[(*af << 1) + 1] = i__ + i_nint(&r__1) * *ipitch;
awin[(*af << 1) + 2] = awin[(*af << 1) + 1] + l - 1;
/* If there is an onset bounding the right of the voicing window and t
he */
/* analysis window overlaps that, then move the analysis window backwa
rd */
/* to avoid this onset. */
if (*obound >= 2 && awin[(*af << 1) + 2] > vwin[(*af << 1) + 2]) {
awin[(*af << 1) + 1] -= *ipitch;
awin[(*af << 1) + 2] -= *ipitch;
}
/* Similarly for the left of the voicing window. */
if ((*obound == 1 || *obound == 3) && awin[(*af << 1) + 1] < vwin[(*
af << 1) + 1]) {
awin[(*af << 1) + 1] += *ipitch;
awin[(*af << 1) + 2] += *ipitch;
}
/* If this placement puts the analysis window above HRANGE, then */
/* move it backward an integer number of pitch periods. */
while(awin[(*af << 1) + 2] > hrange) {
awin[(*af << 1) + 1] -= *ipitch;
awin[(*af << 1) + 2] -= *ipitch;
}
/* Similarly if the placement puts the analysis window below LRANGE.
*/
while(awin[(*af << 1) + 1] < lrange) {
awin[(*af << 1) + 1] += *ipitch;
awin[(*af << 1) + 2] += *ipitch;
}
/* Make Energy window be phase-synchronous. */
ephase = TRUE_;
/* Case 3 */
} else {
awin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
awin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
ephase = FALSE_;
}
/* RMS is computed over an integer number of pitch periods in the analysis
*/
/*window. When it is not placed phase-synchronously, it is placed as clos
e*/
/* as possible to onsets. */
j = (awin[(*af << 1) + 2] - awin[(*af << 1) + 1] + 1) / *ipitch * *ipitch;
if (j == 0 || ! winv) {
ewin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
ewin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
} else if (! ephase && *obound == 2) {
ewin[(*af << 1) + 1] = awin[(*af << 1) + 2] - j + 1;
ewin[(*af << 1) + 2] = awin[(*af << 1) + 2];
} else {
ewin[(*af << 1) + 1] = awin[(*af << 1) + 1];
ewin[(*af << 1) + 2] = awin[(*af << 1) + 1] + j - 1;
}
return 0;
} /* placea_ */

View File

@ -1,264 +0,0 @@
/*
$Log: placev.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2001/10/16 21:21:14 yurik
Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:31:02 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obound, integer *vwin, integer *af, integer *lframe, integer *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ****************************************************************** */
/* PLACEV Version 48 */
/* $Log: placev.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2001/10/16 21:21:14 yurik
* Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:31:02 jaf
* Initial revision
*
*/
/* Revision 1.6 1996/03/19 20:42:19 jaf */
/* Added some conditions satisfied by the output values in VWIN. */
/* Revision 1.5 1996/03/19 18:37:56 jaf */
/* Strengthened the specification of which indices of VWIN are read and */
/* written. */
/* Revision 1.4 1996/03/15 16:38:33 jaf */
/* One tiny comment added. */
/* Revision 1.3 1996/03/15 16:36:13 jaf */
/* Added comments giving In/Out status of arguments. */
/* Revision 1.2 1996/03/12 23:56:01 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:48:39 jaf */
/* Initial revision */
/* ****************************************************************** */
/* Input: */
/* OSBUF Buffer which holds sorted indexes of onsets */
/* I believe that only indices 1 through OSPTR-1 can be read. */
/* OSLEN */
/* OSPTR Free pointer into OSBUF */
/* AF */
/* LFRAME */
/* MINWIN */
/* MAXWIN */
/* DVWINL */
/* DVWINH (This argument is never used. Should it be?) */
/* Input/Output: */
/* VWIN Buffer of Voicing Window Positions (Modified) */
/* Index (2,AF-1) is read. */
/* Indices (1,AF) and (2,AF) are written, */
/* and then possibly read. */
/* All other indices are unused. */
/* In all cases, the final values will satsify the condition:*/
/* VWIN(2,AF)-VWIN(1,AF)+1 .LE. MAXWIN */
/* I'm not certain yet, but they may also satisfy: */
/* MINWIN .LE. VWIN(2,AF)-VWIN(1,AF)+1 */
/* Output: */
/* OBOUND This variable is set by this procedure and used */
/* in placing analysis windows (PLACEA). Bit 1 */
/* indicates whether an onset bounds the left side */
/* of the voicing window, and bit 2 indicates whether */
/* an onset bounds the right side of the voicing window. */
/* This subroutine has no local state. */
/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen,
integer *obound, integer *vwin, integer *af, integer *lframe, integer
*minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
{
/* System generated locals */
integer i__1, i__2;
/* Local variables */
logical crit;
integer i__, q, osptr1, hrange, lrange;
/* Arguments */
/* Local variables that need not be saved */
/* Variables */
/* LRANGE, HRANGE Range in which window is placed */
/* OSPTR1 OSPTR excluding samples in 3F */
/* Local state */
/* None */
/* Voicing Window Placement */
/* __________________ __________________ ______________ */
/* | | | */
/* | 1F | 2F | 3F ... */
/* |__________________|__________________|______________ */
/* Previous | */
/* Window | */
/* ...________| */
/* | | */
/* ------>| This window's placement range |<------ */
/* | | */
/* There are three cases. Note that these are different from those */
/* given in the LPC-10e phase 1 report. */
/* 1. If there are no onsets in this range, then the voicing window */
/* is centered in the pitch window. If such a placement is not within
*/
/* the window's placement range, then the window is placed in the left-
*/
/* most portion of the placement range. Its length is always MAXWIN. */
/* 2. If the first onset is in 2F and there is sufficient room to place
*/
/* the window immediately before this onset, then the window is placed
*/
/* there, and its length is set to the maximum possible under these */
/* constraints. */
/* "Critical Region Exception": If there is another onset in 2F */
/* such that a window can be placed between the two onsets, the */
/* window is placed there (ie, as in case 3). */
/* 3. Otherwise, the window is placed immediately after the onset. The
*/
/* window's length */
/* is the longest length that can fit in the range under these constraint
s,*/
/* except that the window may be shortened even further to avoid overlapp
ing*/
/* other onsets in the placement range. In any case, the window's length
*/
/* is at least MINWIN. */
/* Note that the values of MINWIN and LFRAME must be chosen such */
/* that case 2 = false implies case 3 = true. This means that */
/* MINWIN <= LFRAME/2. If this were not the case, then a fourth case */
/* would have to be added for when the window cannot fit either before
*/
/* or after the onset. */
/* Note also that onsets which weren't in 2F last time may be in 1F this
*/
/* time, due to the filter delays in computing onsets. The result is tha
t*/
/* occasionally a voicing window will overlap that onset. The only way
*/
/* to circumvent this problem is to add more delay in processing input
*/
/* speech. In the trade-off between delay and window-placement, window
*/
/* placement lost. */
/* Compute the placement range */
/* Parameter adjustments */
--osbuf;
vwin -= 3;
/* Function Body */
/* Computing MAX */
i__1 = vwin[((*af - 1) << 1) + 2] + 1, i__2 = (*af - 2) * *lframe + 1;
lrange = max(i__1,i__2);
hrange = *af * *lframe;
/* Compute OSPTR1, so the following code only looks at relevant onsets. */
for (osptr1 = *osptr - 1; osptr1 >= 1; --osptr1) {
if (osbuf[osptr1] <= hrange) {
goto L90;
}
}
L90:
++osptr1;
/* Check for case 1 first (fast case): */
if (osptr1 <= 1 || osbuf[osptr1 - 1] < lrange) {
/* Computing MAX */
i__1 = vwin[((*af - 1) << 1) + 2] + 1;
vwin[(*af << 1) + 1] = max(i__1,*dvwinl);
vwin[(*af << 1) + 2] = vwin[(*af << 1) + 1] + *maxwin - 1;
*obound = 0;
} else {
/* Search backward in OSBUF for first onset in range. */
/* This code relies on the above check being performed first. */
for (q = osptr1 - 1; q >= 1; --q) {
if (osbuf[q] < lrange) {
goto L100;
}
}
L100:
++q;
/* Check for case 2 (placement before onset): */
/* Check for critical region exception: */
i__1 = osptr1 - 1;
for (i__ = q + 1; i__ <= i__1; ++i__) {
if (osbuf[i__] - osbuf[q] >= *minwin) {
crit = TRUE_;
goto L105;
}
}
crit = FALSE_;
L105:
/* Computing MAX */
i__1 = (*af - 1) * *lframe, i__2 = lrange + *minwin - 1;
if (! crit && osbuf[q] > max(i__1,i__2)) {
vwin[(*af << 1) + 2] = osbuf[q] - 1;
/* Computing MAX */
i__1 = lrange, i__2 = vwin[(*af << 1) + 2] - *maxwin + 1;
vwin[(*af << 1) + 1] = max(i__1,i__2);
*obound = 2;
/* Case 3 (placement after onset) */
} else {
vwin[(*af << 1) + 1] = osbuf[q];
L110:
++q;
if (q >= osptr1) {
goto L120;
}
if (osbuf[q] > vwin[(*af << 1) + 1] + *maxwin) {
goto L120;
}
if (osbuf[q] < vwin[(*af << 1) + 1] + *minwin) {
goto L110;
}
vwin[(*af << 1) + 2] = osbuf[q] - 1;
*obound = 3;
return 0;
L120:
/* Computing MIN */
i__1 = vwin[(*af << 1) + 1] + *maxwin - 1;
vwin[(*af << 1) + 2] = min(i__1,hrange);
*obound = 1;
}
}
return 0;
} /* placev_ */

View File

@ -1,133 +0,0 @@
/*
$Log: preemp.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:30:58 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ******************************************************************* */
/* PREEMP Version 55 */
/* $Log: preemp.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:30:58 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/14 23:16:29 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/11 23:23:34 jaf */
/* Added a bunch of comments to an otherwise simple subroutine. */
/* Revision 1.1 1996/02/07 14:48:48 jaf */
/* Initial revision */
/* ******************************************************************* */
/* Preemphasize speech with a single-zero filter. */
/* (When coef = .9375, preemphasis is as in LPC43.) */
/* Inputs: */
/* NSAMP - Number of samples to filter */
/* INBUF - Input speech buffer */
/* Indices 1 through NSAMP are read. */
/* COEF - Preemphasis coefficient */
/* Input/Output: */
/* Z - Filter state */
/* Output: */
/* PEBUF - Preemphasized speech buffer (can be equal to INBUF) */
/* Indices 1 through NSAMP are modified. */
/* This subroutine has no local state. */
/* Subroutine */ int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *
coef, real *z__)
{
/* System generated locals */
integer i__1;
/* Local variables */
real temp;
integer i__;
/* Arguments */
/* Local variables */
/* None of these need to have their values saved from one */
/* invocation to the next. */
/* Logically, this subroutine computes the output sequence */
/* pebuf(1:nsamp) defined by: */
/* pebuf(i) = inbuf(i) - coef * inbuf(i-1) */
/* where inbuf(0) is defined by the value of z given as input to */
/* this subroutine. */
/* What is this filter's frequency response and phase response? */
/* Why is this filter applied to the speech? */
/* Could it be more efficient to apply multiple filters */
/* simultaneously, by combining them into one equivalent filter? */
/* Are there ever cases when "factoring" one high-order filter into
*/
/* multiple smaller-order filter actually reduces the number of */
/* arithmetic operations needed to perform them? */
/* When I first read this subroutine, I didn't understand why the */
/* variable temp was used. It seemed that the statements in the do
*/
/* loop could be replaced with the following: */
/* pebuf(i) = inbuf(i) - coef * z */
/* z = inbuf(i) */
/* The reason for temp is so that even if pebuf and inbuf are the */
/* same arrays in memory (i.e., they are aliased), then this */
/* subroutine will still work correctly. I didn't realize this */
/* until seeing the comment after PEBUF above that says "(can be */
/* equal to INBUF)". */
/* Parameter adjustments */
--pebuf;
--inbuf;
/* Function Body */
i__1 = *nsamp;
for (i__ = 1; i__ <= i__1; ++i__) {
temp = inbuf[i__] - *coef * *z__;
*z__ = inbuf[i__];
pebuf[i__] = temp;
/* L10: */
}
return 0;
} /* preemp_ */

View File

@ -1,106 +0,0 @@
/*
$Log: prepro.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:40:51 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:30:54 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int prepro_(real *speech, integer *length,
struct lpc10_encoder_state *st)
/*:ref: hp100_ 14 3 6 4 4 */
/*:ref: inithp100_ 14 0 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Table of constant values */
static integer c__1 = 1;
/* ********************************************************************* */
/* PREPRO Version 48 */
/* $Log: prepro.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:40:51 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:30:54 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/14 23:22:56 jaf */
/* Added comments about when INITPREPRO should be used. */
/* Revision 1.2 1996/03/14 23:09:27 jaf */
/* Added an entry named INITPREPRO that initializes the local state of */
/* this subroutine, and those it calls (if any). */
/* Revision 1.1 1996/02/07 14:48:54 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Pre-process input speech: */
/* Inputs: */
/* LENGTH - Number of SPEECH samples */
/* Input/Output: */
/* SPEECH(LENGTH) - Speech data. */
/* Indices 1 through LENGTH are read and modified. */
/* This subroutine has no local state maintained from one call to the */
/* next, but HP100 does. If you want to switch to using a new audio */
/* stream for this filter, or reinitialize its state for any other */
/* reason, call the ENTRY INITPREPRO. */
/* Subroutine */ int prepro_(real *speech, integer *length,
struct lpc10_encoder_state *st)
{
extern /* Subroutine */ int hp100_(real *, integer *, integer *, struct lpc10_encoder_state *);
/* Arguments */
/* High Pass Filter at 100 Hz */
/* Parameter adjustments */
if (speech) {
--speech;
}
/* Function Body */
hp100_(&speech[1], &c__1, length, st);
return 0;
} /* prepro_ */

View File

@ -1,114 +0,0 @@
/*
$Log: random.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:41:32 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:30:49 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern integer random_(struct lpc10_decoder_state *st);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************** */
/* RANDOM Version 49 */
/* $Log: random.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:41:32 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:30:49 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/20 16:13:54 jaf */
/* Rearranged comments a little bit, and added comments explaining that */
/* even though there is local state here, there is no need to create an */
/* ENTRY for reinitializing it. */
/* Revision 1.2 1996/03/14 22:25:29 jaf */
/* Just rearranged the comments and local variable declarations a bit. */
/* Revision 1.1 1996/02/07 14:49:01 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Pseudo random number generator based on Knuth, Vol 2, p. 27. */
/* Function Return: */
/* RANDOM - Integer variable, uniformly distributed over -32768 to 32767 */
/* This subroutine maintains local state from one call to the next. */
/* In the context of the LPC10 coder, there is no reason to reinitialize */
/* this local state when switching between audio streams, because its */
/* results are only used to generate noise for unvoiced frames. */
integer random_(struct lpc10_decoder_state *st)
{
/* Initialized data */
integer *j;
integer *k;
shortint *y;
/* System generated locals */
integer ret_val;
/* Parameters/constants */
/* Local state */
/* The following is a 16 bit 2's complement addition, */
/* with overflow checking disabled */
j = &(st->j);
k = &(st->k);
y = &(st->y[0]);
y[*k - 1] += y[*j - 1];
ret_val = y[*k - 1];
--(*k);
if (*k <= 0) {
*k = 5;
}
--(*j);
if (*j <= 0) {
*j = 5;
}
return ret_val;
} /* random_ */

View File

@ -1,108 +0,0 @@
/*
$Log: rcchk.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:30:41 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int rcchk_(integer *order, real *rc1f, real *rc2f);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************* */
/* RCCHK Version 45G */
/* $Log: rcchk.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:30:41 jaf
* Initial revision
*
*/
/* Revision 1.4 1996/03/27 18:13:47 jaf */
/* Commented out a call to subroutine ERROR. */
/* Revision 1.3 1996/03/18 15:48:53 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 16:55:22 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:49:08 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Check RC's, repeat previous frame's RC's if unstable */
/* Input: */
/* ORDER - Number of RC's */
/* RC1F - Previous frame's RC's */
/* Indices 1 through ORDER may be read. */
/* Input/Output: */
/* RC2F - Present frame's RC's */
/* Indices 1 through ORDER may be read, and written. */
/* This subroutine has no local state. */
/* Subroutine */ int rcchk_(integer *order, real *rc1f, real *rc2f)
{
/* System generated locals */
integer i__1;
real r__1;
/* Local variables */
integer i__;
/* Arguments */
/* Local variables that need not be saved */
/* Parameter adjustments */
--rc2f;
--rc1f;
/* Function Body */
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
if ((r__1 = rc2f[i__], abs(r__1)) > .99f) {
goto L10;
}
}
return 0;
/* Note: In version embedded in other software, all calls to ERROR
*/
/* should probably be removed. */
L10:
/* This call to ERROR is only needed for debugging purposes. */
/* CALL ERROR('RCCHK',2,I) */
i__1 = *order;
for (i__ = 1; i__ <= i__1; ++i__) {
rc2f[i__] = rc1f[i__];
}
return 0;
} /* rcchk_ */

View File

@ -1,395 +0,0 @@
/*
$Log: synths.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:42:59 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:30:33 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int synths_(integer *voice, integer *pitch, real *rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st);
/* comlen contrl_ 12 */
/*:ref: pitsyn_ 14 12 4 4 4 6 6 4 4 4 6 6 4 6 */
/*:ref: irc2pc_ 14 5 6 6 4 6 6 */
/*:ref: bsynz_ 14 7 6 4 4 6 6 6 6 */
/*:ref: deemp_ 14 2 6 4 */
/*:ref: initpitsyn_ 14 0 */
/*:ref: initbsynz_ 14 0 */
/*:ref: initdeemp_ 14 0 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/* Table of constant values */
static real c_b2 = .7f;
/* ***************************************************************** */
/* SYNTHS Version 54 */
/* $Log: synths.c,v $
/* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:42:59 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:30:33 jaf
* Initial revision
*
*/
/* Revision 1.5 1996/03/26 19:31:58 jaf */
/* Commented out trace statements. */
/* Revision 1.4 1996/03/25 19:41:01 jaf */
/* Changed so that MAXFRM samples are always returned in the output array */
/* SPEECH. */
/* This required delaying the returned samples by MAXFRM sample times, */
/* and remembering any "left over" samples returned by PITSYN from one */
/* call of SYNTHS to the next. */
/* Changed size of SPEECH from 2*MAXFRM to MAXFRM. Removed local */
/* variable SOUT. Added local state variables BUF and BUFLEN. */
/* Revision 1.3 1996/03/25 19:20:10 jaf */
/* Added comments about the range of possible return values for argument */
/* K, and increased the size of the arrays filled in by PITSYN from 11 to */
/* 16, as has been already done inside of PITSYN. */
/* Revision 1.2 1996/03/22 00:18:18 jaf */
/* Added comments explaining meanings of input and output parameters, and */
/* indicating which array indices can be read or written. */
/* Added entry INITSYNTHS, which does nothing except call the */
/* corresponding initialization entries for subroutines PITSYN, BSYNZ, */
/* and DEEMP. */
/* Revision 1.1 1996/02/07 14:49:44 jaf */
/* Initial revision */
/* ***************************************************************** */
/* The note below is from the distributed version of the LPC10 coder. */
/* The version of the code below has been modified so that SYNTHS always */
/* has a constant frame length output of MAXFRM. */
/* Also, BSYNZ and DEEMP need not be modified to work on variable */
/* positions within an array. It is only necessary to pass the first */
/* index desired as the array argument. What actually gets passed is the */
/* address of that array position, which the subroutine treats as the */
/* first index of the array. */
/* This technique is used in subroutine ANALYS when calling PREEMP, so it */
/* appears that multiple people wrote different parts of this LPC10 code, */
/* and that they didn't necessarily have equivalent knowledge of Fortran */
/* (not surprising). */
/* NOTE: There is excessive buffering here, BSYNZ and DEEMP should be */
/* changed to operate on variable positions within SOUT. Also, */
/* the output length parameter is bogus, and PITSYN should be */
/* rewritten to allow a constant frame length output. */
/* Input: */
/* VOICE - Half frame voicing decisions */
/* Indices 1 through 2 read. */
/* Input/Output: */
/* PITCH - Pitch */
/* PITCH is restricted to range 20 to 156, inclusive, */
/* before calling subroutine PITSYN, and then PITSYN */
/* can modify it further under some conditions. */
/* RMS - Energy */
/* Only use is for debugging, and passed to PITSYN. */
/* See comments there for how it can be modified. */
/* RC - Reflection coefficients */
/* Indices 1 through ORDER restricted to range -.99 to .99, */
/* before calling subroutine PITSYN, and then PITSYN */
/* can modify it further under some conditions. */
/* Output: */
/* SPEECH - Synthesized speech samples. */
/* Indices 1 through the final value of K are written. */
/* K - Number of samples placed into array SPEECH. */
/* This is always MAXFRM. */
/* Subroutine */ int synths_(integer *voice, integer *pitch, real *
rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st)
{
/* Initialized data */
real *buf;
integer *buflen;
/* System generated locals */
integer i__1;
real r__1, r__2;
/* Local variables */
real rmsi[16];
integer nout, ivuv[16], i__, j;
extern /* Subroutine */ int deemp_(real *, integer *, struct lpc10_decoder_state *);
real ratio;
integer ipiti[16];
extern /* Subroutine */ bsynz_(real *, integer *,
integer *, real *, real *, real *, real *, struct lpc10_decoder_state *), irc2pc_(real *, real *
, integer *, real *, real *);
real g2pass;
real pc[10];
extern /* Subroutine */ int pitsyn_(integer *, integer *, integer *, real
*, real *, integer *, integer *, integer *, real *, real *,
integer *, real *, struct lpc10_decoder_state *);
real rci[160] /* was [10][16] */;
/* $Log: synths.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:42:59 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:30:33 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:03:47 jaf */
/* Removed definitions for any constants that were no longer used. */
/* Revision 1.2 1996/03/26 19:34:33 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:43:51 jaf */
/* Initial revision */
/* LPC Configuration parameters: */
/* Frame size, Prediction order, Pitch period */
/* Arguments */
/* $Log: synths.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:42:59 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_decoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_decoder_state().
*
* Revision 1.1 1996/08/19 22:30:33 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Parameters/constants */
/* Local variables that need not be saved */
/* Local state */
/* BUF is a buffer of speech samples that would have been returned
*/
/* by the older version of SYNTHS, but the newer version doesn't, */
/* so that the newer version can always return MAXFRM samples on */
/* every call. This has the effect of delaying the return of */
/* samples for one additional frame time. */
/* Indices 1 through BUFLEN contain samples that are left over from
*/
/* the last call to SYNTHS. Given the way that PITSYN works, */
/* BUFLEN should always be in the range MAXFRM-MAXPIT+1 through */
/* MAXFRM, inclusive, after a call to SYNTHS is complete. */
/* On the first call to SYNTHS (or the first call after */
/* reinitializing with the entry INITSYNTHS), BUFLEN is MAXFRM, and
*/
/* a frame of silence is always returned. */
/* Parameter adjustments */
if (voice) {
--voice;
}
if (rc) {
--rc;
}
if (speech) {
--speech;
}
/* Function Body */
buf = &(st->buf[0]);
buflen = &(st->buflen);
/* Computing MAX */
i__1 = min(*pitch,156);
*pitch = max(i__1,20);
i__1 = contrl_1.order;
for (i__ = 1; i__ <= i__1; ++i__) {
/* Computing MAX */
/* Computing MIN */
r__2 = rc[i__];
r__1 = min(r__2,.99f);
rc[i__] = max(r__1,-.99f);
}
pitsyn_(&contrl_1.order, &voice[1], pitch, rms, &rc[1], &contrl_1.lframe,
ivuv, ipiti, rmsi, rci, &nout, &ratio, st);
if (nout > 0) {
i__1 = nout;
for (j = 1; j <= i__1; ++j) {
/* Add synthesized speech for pitch period J to the en
d of */
/* BUF. */
irc2pc_(&rci[j * 10 - 10], pc, &contrl_1.order, &c_b2, &g2pass);
bsynz_(pc, &ipiti[j - 1], &ivuv[j - 1], &buf[*buflen], &rmsi[j - 1]
, &ratio, &g2pass, st);
deemp_(&buf[*buflen], &ipiti[j - 1], st);
*buflen += ipiti[j - 1];
}
/* Copy first MAXFRM samples from BUF to output array SPEECH
*/
/* (scaling them), and then remove them from the beginning of
*/
/* BUF. */
for (i__ = 1; i__ <= 180; ++i__) {
speech[i__] = buf[i__ - 1] / 4096.f;
}
*k = 180;
*buflen += -180;
i__1 = *buflen;
for (i__ = 1; i__ <= i__1; ++i__) {
buf[i__ - 1] = buf[i__ + 179];
}
}
return 0;
} /* synths_ */

View File

@ -1,183 +0,0 @@
/*
$Log: tbdm.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:30:26 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int tbdm_(real *speech, integer *lpita, integer *tau, integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *mintau);
/*:ref: difmag_ 14 8 6 4 4 4 4 6 4 4 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* ********************************************************************** */
/* TBDM Version 49 */
/* $Log: tbdm.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:30:26 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/18 22:14:00 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 14:48:37 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:49:54 jaf */
/* Initial revision */
/* ********************************************************************* */
/*TURBO DIFMAG: Compute High Resolution Average Magnitude Difference Function
*/
/* Note: There are several constants in here that appear to depend on a */
/* particular TAU table. That's not a problem for the LPC10 coder, but */
/* watch out if you change the contents of TAU in the subroutine ANALYS. */
/* Input: */
/* SPEECH - Low pass filtered speech */
/* Indices 1 through MAX+LPITA-1 are read, where: */
/* MAX = (TAU(LTAU)-TAU(1))/2+1 */
/* (If TAU(1) .LT. 39, then larger indices could be read */
/* by the last call to DIFMAG below.) */
/* LPITA - Length of speech buffer */
/* TAU - Table of lags, sorted in increasing order. */
/* Indices 1 through LTAU read. */
/* LTAU - Number of lag values to compute */
/* Output: */
/* AMDF - Average Magnitude Difference for each lag in TAU */
/* Indices 1 through LTAU written, and several might then be read.*/
/* MINPTR - Index of minimum AMDF value */
/* MAXPTR - Index of maximum AMDF value within +/- 1/2 octave of min */
/* MINTAU - Lag corresponding to minimum AMDF value */
/* This subroutine has no local state. */
/* Subroutine */ int tbdm_(real *speech, integer *lpita, integer *tau,
integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *
mintau)
{
/* System generated locals */
integer i__1, i__2, i__3, i__4;
/* Local variables */
real amdf2[6];
integer minp2, ltau2, maxp2, i__;
extern /* Subroutine */ int difmag_(real *, integer *, integer *, integer
*, integer *, real *, integer *, integer *);
integer minamd, ptr, tau2[6];
/* Arguments */
/* REAL SPEECH(LPITA+TAU(LTAU)), AMDF(LTAU) */
/* Stupid TOAST doesn't understand expressions */
/* Local variables that need not be saved */
/* Local state */
/* None */
/* Compute full AMDF using log spaced lags, find coarse minimum */
/* Parameter adjustments */
--speech;
--amdf;
--tau;
/* Function Body */
difmag_(&speech[1], lpita, &tau[1], ltau, &tau[*ltau], &amdf[1], minptr,
maxptr);
*mintau = tau[*minptr];
minamd = (integer)amdf[*minptr];
/* Build table containing all lags within +/- 3 of the AMDF minimum */
/* excluding all that have already been computed */
ltau2 = 0;
ptr = *minptr - 2;
/* Computing MAX */
i__1 = *mintau - 3;
/* Computing MIN */
i__3 = *mintau + 3, i__4 = tau[*ltau] - 1;
i__2 = min(i__3,i__4);
for (i__ = max(i__1,41); i__ <= i__2; ++i__) {
while(tau[ptr] < i__) {
++ptr;
}
if (tau[ptr] != i__) {
++ltau2;
tau2[ltau2 - 1] = i__;
}
}
/* Compute AMDF of the new lags, if there are any, and choose one */
/* if it is better than the coarse minimum */
if (ltau2 > 0) {
difmag_(&speech[1], lpita, tau2, &ltau2, &tau[*ltau], amdf2, &minp2, &
maxp2);
if (amdf2[minp2 - 1] < (real) minamd) {
*mintau = tau2[minp2 - 1];
minamd = (integer)amdf2[minp2 - 1];
}
}
/* Check one octave up, if there are any lags not yet computed */
if (*mintau >= 80) {
i__ = *mintau / 2;
if ((i__ & 1) == 0) {
ltau2 = 2;
tau2[0] = i__ - 1;
tau2[1] = i__ + 1;
} else {
ltau2 = 1;
tau2[0] = i__;
}
difmag_(&speech[1], lpita, tau2, &ltau2, &tau[*ltau], amdf2, &minp2, &
maxp2);
if (amdf2[minp2 - 1] < (real) minamd) {
*mintau = tau2[minp2 - 1];
minamd = (integer)amdf2[minp2 - 1];
*minptr += -20;
}
}
/* Force minimum of the AMDF array to the high resolution minimum */
amdf[*minptr] = (real) minamd;
/* Find maximum of AMDF within 1/2 octave of minimum */
/* Computing MAX */
i__2 = *minptr - 5;
*maxptr = max(i__2,1);
/* Computing MIN */
i__1 = *minptr + 5;
i__2 = min(i__1,*ltau);
for (i__ = *maxptr + 1; i__ <= i__2; ++i__) {
if (amdf[i__] > amdf[*maxptr]) {
*maxptr = i__;
}
}
return 0;
} /* tbdm_ */

View File

@ -1,770 +0,0 @@
/*
$Log: voicin.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.2 1996/08/20 20:45:00 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:30:14 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int voicin_(integer *vwin, real *inbuf, real *lpbuf, integer *buflim, integer *half, real *minamd, real *maxamd, integer *mintau, real *ivrc, integer *obound, integer *voibuf, integer *af, struct lpc10_encoder_state *st);
/* comlen contrl_ 12 */
/*:ref: vparms_ 14 14 4 6 6 4 4 6 4 4 4 4 6 6 6 6 */
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Common Block Declarations */
extern struct {
integer order, lframe;
logical corrp;
} contrl_;
#define contrl_1 contrl_
/****************************************************************************/
/* VOICIN Version 52 */
/* $Log: voicin.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:45:00 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:30:14 jaf
* Initial revision
*
*/
/* Revision 1.10 1996/03/29 17:59:14 jaf */
/* Avoided using VALUE(9), although it shouldn't affect the function of */
/* the code at all, because it was always multiplied by VDC(9,SNRL), */
/* which is 0 for all values of SNRL. Still, if VALUE(9) had an initial */
/* value of IEEE NaN, it might cause trouble (I don't know how IEEE */
/* defines Nan * 0. It should either be NaN or 0.) */
/* Revision 1.9 1996/03/29 17:54:46 jaf */
/* Added a few comments about the accesses made to argument array VOIBUF */
/* and the local saved array VOICE. */
/* Revision 1.8 1996/03/27 18:19:54 jaf */
/* Added an assignment to VSTATE that does not affect the function of the */
/* program at all. The only reason I put it in was so that the tracing */
/* statements at the end, when enabled, will print a consistent value for */
/* VSTATE when HALF .EQ. 1, rather than a garbage value that could change */
/* from one call to the next. */
/* Revision 1.7 1996/03/26 20:00:06 jaf */
/* Removed the inclusion of the file "vcomm.fh", and put its contents */
/* into this file. It was included nowhere else but here. */
/* Revision 1.6 1996/03/26 19:38:09 jaf */
/* Commented out trace statements. */
/* Revision 1.5 1996/03/19 20:43:45 jaf */
/* Added comments about which indices of OBOUND and VOIBUF can be */
/* accessed, and whether they are read or written. VOIBUF is fairly */
/* messy. */
/* Revision 1.4 1996/03/19 15:00:58 jaf */
/* Moved the DATA statements for the *VDC* variables later, as it is */
/* apparently illegal to have DATA statements before local variable */
/* declarations. */
/* Revision 1.3 1996/03/19 00:10:49 jaf */
/* Heavily commented the local variables that are saved from one */
/* invocation to the next, and how the local variable FIRST is used to */
/* avoid the need to assign most of them initial values with DATA */
/* statements. */
/* A few should be initialized, but aren't. I've guessed initial values */
/* for two of these, SFBUE and SLBUE, and I've convinced myself that for */
/* VOICE, the effects of uninitialized values will die out after 2 or 3 */
/* frame times. It would still be good to choose initial values for */
/* these, but I don't know what reasonable values would be (0 comes to */
/* mind). */
/* Revision 1.2 1996/03/13 16:09:28 jaf */
/* Comments added explaining which of the local variables of this */
/* subroutine need to be saved from one invocation to the next, and which */
/* do not. */
/* WARNING! Some of them that should are never given initial values in */
/* this code. Hopefully, Fortran 77 defines initial values for them, but */
/* even so, giving them explicit initial values is preferable. */
/* WARNING! VALUE(9) is used, but never assigned a value. It should */
/* probably be eliminated from the code. */
/* Revision 1.1 1996/02/07 14:50:28 jaf */
/* Initial revision */
/****************************************************************************/
/* Voicing Detection (VOICIN) makes voicing decisions for each half */
/* frame of input speech. Tentative voicing decisions are made two frames*/
/* in the future (2F) for each half frame. These decisions are carried */
/* through one frame in the future (1F) to the present (P) frame where */
/* they are examined and smoothed, resulting in the final voicing */
/* decisions for each half frame. */
/* The voicing parameter (signal measurement) column vector (VALUE) */
/* is based on a rectangular window of speech samples determined by the */
/* window placement algorithm. The voicing parameter vector contains the*/
/* AMDF windowed maximum-to-minimum ratio, the zero crossing rate, energy*/
/* measures, reflection coefficients, and prediction gains. The voicing */
/* window is placed to avoid contamination of the voicing parameter vector*/
/* with speech onsets. */
/* The input signal is then classified as unvoiced (including */
/* silence) or voiced. This decision is made by a linear discriminant */
/* function consisting of a dot product of the voicing decision */
/* coefficient (VDC) row vector with the measurement column vector */
/* (VALUE). The VDC vector is 2-dimensional, each row vector is optimized*/
/* for a particular signal-to-noise ratio (SNR). So, before the dot */
/* product is performed, the SNR is estimated to select the appropriate */
/* VDC vector. */
/* The smoothing algorithm is a modified median smoother. The */
/* voicing discriminant function is used by the smoother to determine how*/
/* strongly voiced or unvoiced a signal is. The smoothing is further */
/* modified if a speech onset and a voicing decision transition occur */
/* within one half frame. In this case, the voicing decision transition */
/* is extended to the speech onset. For transmission purposes, there are*/
/* constraints on the duration and transition of voicing decisions. The */
/* smoother takes these constraints into account. */
/* Finally, the energy estimates are updated along with the dither */
/* threshold used to calculate the zero crossing rate (ZC). */
/* Inputs: */
/* VWIN - Voicing window limits */
/* The indices read of arrays VWIN, INBUF, LPBUF, and BUFLIM */
/* are the same as those read by subroutine VPARMS. */
/* INBUF - Input speech buffer */
/* LPBUF - Low-pass filtered speech buffer */
/* BUFLIM - INBUF and LPBUF limits */
/* HALF - Present analysis half frame number */
/* MINAMD - Minimum value of the AMDF */
/* MAXAMD - Maximum value of the AMDF */
/* MINTAU - Pointer to the lag of the minimum AMDF value */
/* IVRC(2) - Inverse filter's RC's */
/* Only index 2 of array IVRC read under normal operation. */
/* (Index 1 is also read when debugging is turned on.) */
/* OBOUND - Onset boundary descriptions */
/* Indices 1 through 3 read if (HALF .NE. 1), otherwise untouched.
*/
/* AF - The analysis frame number */
/* Output: */
/* VOIBUF(2,0:AF) - Buffer of voicing decisions */
/* Index (HALF,3) written. */
/* If (HALF .EQ. 1), skip down to "Read (HALF,3)" below. */
/* Indices (1,2), (2,1), (1,2), and (2,2) read. */
/* One of the following is then done: */
/* read (1,3) and possibly write (1,2) */
/* read (1,3) and write (1,2) or (2,2) */
/* write (2,1) */
/* write (2,1) or (1,2) */
/* read (1,0) and (1,3) and then write (2,2) or (1,1) */
/* no reads or writes on VOIBUF */
/* Finally, read (HALF,3) */
/* Internal: */
/* QS - Ratio of preemphasized to full-band energies */
/* RC1 - First reflection coefficient */
/* AR_B - Product of the causal forward and reverse pitch prediction gain
s*/
/* AR_F - Product of the noncausal forward and rev. pitch prediction gain
s*/
/* ZC - Zero crossing rate */
/* DITHER - Zero crossing threshold level */
/* MAXMIN - AMDF's 1 octave windowed maximum-to-minimum ratio */
/* MINPTR - Location of minimum AMDF value */
/* NVDC - Number of elements in each VDC vector */
/* NVDCL - Number of VDC vectors */
/* VDCL - SNR values corresponding to the set of VDC's */
/* VDC - 2-D voicing decision coefficient vector */
/* VALUE(9) - Voicing Parameters */
/* VOICE(2,3)- History of LDA results */
/* On every call when (HALF .EQ. 1), VOICE(*,I+1) is */
/* shifted back to VOICE(*,I), for I=1,2. */
/* VOICE(HALF,3) is written on every call. */
/* Depending on several conditions, one or more of */
/* (1,1), (1,2), (2,1), and (2,2) might then be read. */
/* LBE - Ratio of low-band instantaneous to average energies */
/* FBE - Ratio of full-band instantaneous to average energies */
/* LBVE - Low band voiced energy */
/* LBUE - Low band unvoiced energy */
/* FBVE - Full band voiced energy */
/* FBUE - Full band unvoiced energy */
/* OFBUE - Previous full-band unvoiced energy */
/* OLBUE - Previous low-band unvoiced energy */
/* REF - Reference energy for initialization and DITHER threshold */
/* SNR - Estimate of signal-to-noise ratio */
/* SNR2 - Estimate of low-band signal-to-noise ratio */
/* SNRL - SNR level number */
/* OT - Onset transition present */
/* VSTATE - Decimal interpretation of binary voicing classifications */
/* FIRST - First call flag */
/* This subroutine maintains local state from one call to the next. If */
/* you want to switch to using a new audio stream for this filter, or */
/* reinitialize its state for any other reason, call the ENTRY */
/* INITVOICIN. */
/* Subroutine */ int voicin_(integer *vwin, real *inbuf, real *
lpbuf, integer *buflim, integer *half, real *minamd, real *maxamd,
integer *mintau, real *ivrc, integer *obound, integer *voibuf,
integer *af, struct lpc10_encoder_state *st)
{
/* Initialized data */
real *dither;
static real vdc[100] /* was [10][10] */ = { 0.f,1714.f,-110.f,
334.f,-4096.f,-654.f,3752.f,3769.f,0.f,1181.f,0.f,874.f,-97.f,
300.f,-4096.f,-1021.f,2451.f,2527.f,0.f,-500.f,0.f,510.f,-70.f,
250.f,-4096.f,-1270.f,2194.f,2491.f,0.f,-1500.f,0.f,500.f,-10.f,
200.f,-4096.f,-1300.f,2e3f,2e3f,0.f,-2e3f,0.f,500.f,0.f,0.f,
-4096.f,-1300.f,2e3f,2e3f,0.f,-2500.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,
0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,
0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,
0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f };
static integer nvdcl = 5;
static real vdcl[10] = { 600.f,450.f,300.f,200.f,0.f,0.f,0.f,0.f,0.f,0.f }
;
/* System generated locals */
integer inbuf_offset, lpbuf_offset, i__1, i__2;
real r__1, r__2;
/* Builtin functions */
integer i_nint(real *);
double sqrt(doublereal);
/* Local variables */
real ar_b__, ar_f__;
integer *lbve, *lbue, *fbve, *fbue;
integer snrl, i__;
integer *ofbue, *sfbue;
real *voice;
integer *olbue, *slbue;
real value[9];
integer zc;
logical ot;
real qs;
real *maxmin;
integer vstate;
real rc1;
extern /* Subroutine */ int vparms_(integer *, real *, real *, integer *,
integer *, real *, integer *, integer *, integer *, integer *,
real *, real *, real *, real *);
integer fbe, lbe;
real *snr;
real snr2;
/* Global Variables: */
/* Arguments */
/* $Log: voicin.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.2 1996/08/20 20:45:00 jaf
* Removed all static local variables that were SAVE'd in the Fortran
* code, and put them in struct lpc10_encoder_state that is passed as an
* argument.
*
* Removed init function, since all initialization is now done in
* init_lpc10_encoder_state().
*
* Revision 1.1 1996/08/19 22:30:14 jaf
* Initial revision
*
*/
/* Revision 1.3 1996/03/29 22:05:55 jaf */
/* Commented out the common block variables that are not needed by the */
/* embedded version. */
/* Revision 1.2 1996/03/26 19:34:50 jaf */
/* Added comments indicating which constants are not needed in an */
/* application that uses the LPC-10 coder. */
/* Revision 1.1 1996/02/07 14:44:09 jaf */
/* Initial revision */
/* LPC Processing control variables: */
/* *** Read-only: initialized in setup */
/* Files for Speech, Parameter, and Bitstream Input & Output, */
/* and message and debug outputs. */
/* Here are the only files which use these variables: */
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
/* Many files which use fdebug are not listed, since it is only used in */
/* those other files conditionally, to print trace statements. */
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* LPC order, Frame size, Quantization rate, Bits per frame, */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
/* is used in only a few places, and never in the core coding and */
/* decoding routines, so it could be eliminated entirely. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* embedded. */
/* listl and lincnt are not needed for an embedded LPC10 at all. */
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Parameters/constants */
/* Voicing coefficient and Linear Discriminant Analysis variables:
*/
/* Max number of VDC's and VDC levels */
/* The following are not Fortran PARAMETER's, but they are */
/* initialized with DATA statements, and never modified. */
/* Actual number of VDC's and levels */
/* Local variables that need not be saved */
/* Note: */
/* VALUE(1) through VALUE(8) are assigned values, but VALUE(9) */
/* never is. Yet VALUE(9) is read in the loop that begins "DO I =
*/
/* 1, 9" below. I believe that this doesn't cause any problems in
*/
/* this subroutine, because all VDC(9,*) array elements are 0, and
*/
/* this is what is multiplied by VALUE(9) in all cases. Still, it
*/
/* would save a multiplication to change the loop to "DO I = 1, 8".
*/
/* Local state */
/* WARNING! */
/* VOICE, SFBUE, and SLBUE should be saved from one invocation to */
/* the next, but they are never given an initial value. */
/* Does Fortran 77 specify some default initial value, like 0, or */
/* is it undefined? If it is undefined, then this code should be */
/* corrected to specify an initial value. */
/* For VOICE, note that it is "shifted" in the statement that */
/* begins "IF (HALF .EQ. 1) THEN" below. Also, uninitialized */
/* values in the VOICE array can only affect entries in the VOIBUF
*/
/* array that are for the same frame, or for an older frame. Thus
*/
/* the effects of uninitialized values in VOICE cannot linger on */
/* for more than 2 or 3 frame times. */
/* For SFBUE and SLBUE, the effects of uninitialized values can */
/* linger on for many frame times, because their previous values */
/* are exponentially decayed. Thus it is more important to choose
*/
/* initial values for these variables. I would guess that a */
/* reasonable initial value for SFBUE is REF/16, the same as used */
/* for FBUE and OFBUE. Similarly, SLBUE can be initialized to */
/* REF/32, the same as for LBUE and OLBUE. */
/* These guessed initial values should be validated by re-running */
/* the modified program on some audio samples. */
/* Declare and initialize filters: */
dither = (&st->dither);
snr = (&st->snr);
maxmin = (&st->maxmin);
voice = (&st->voice[0]);
lbve = (&st->lbve);
lbue = (&st->lbue);
fbve = (&st->fbve);
fbue = (&st->fbue);
ofbue = (&st->ofbue);
olbue = (&st->olbue);
sfbue = (&st->sfbue);
slbue = (&st->slbue);
/* Parameter adjustments */
if (vwin) {
--vwin;
}
if (buflim) {
--buflim;
}
if (inbuf) {
inbuf_offset = buflim[1];
inbuf -= inbuf_offset;
}
if (lpbuf) {
lpbuf_offset = buflim[3];
lpbuf -= lpbuf_offset;
}
if (ivrc) {
--ivrc;
}
if (obound) {
--obound;
}
if (voibuf) {
--voibuf;
}
/* Function Body */
/* The following variables are saved from one invocation to the */
/* next, but are not initialized with DATA statements. This is */
/* acceptable, because FIRST is initialized ot .TRUE., and the */
/* first time that this subroutine is then called, they are all */
/* given initial values. */
/* SNR */
/* LBVE, LBUE, FBVE, FBUE, OFBUE, OLBUE */
/* MAXMIN is initialized on the first call, assuming that HALF */
/* .EQ. 1 on first call. This is how ANALYS calls this subroutine.
*/
/* Voicing Decision Parameter vector (* denotes zero coefficient): */
/* * MAXMIN */
/* LBE/LBVE */
/* ZC */
/* RC1 */
/* QS */
/* IVRC2 */
/* aR_B */
/* aR_F */
/* * LOG(LBE/LBVE) */
/* Define 2-D voicing decision coefficient vector according to the voicin
g*/
/* parameter order above. Each row (VDC vector) is optimized for a speci
fic*/
/* SNR. The last element of the vector is the constant. */
/* E ZC RC1 Qs IVRC2 aRb aRf c */
/* The VOICE array contains the result of the linear discriminant functio
n*/
/* (analog values). The VOIBUF array contains the hard-limited binary
*/
/* voicing decisions. The VOICE and VOIBUF arrays, according to FORTRAN
*/
/* memory allocation, are addressed as: */
/* (half-frame number, future-frame number) */
/* | Past | Present | Future1 | Future2 | */
/* | 1,0 | 2,0 | 1,1 | 2,1 | 1,2 | 2,2 | 1,3 | 2,3 | ---> time */
/* Update linear discriminant function history each frame: */
if (*half == 1) {
voice[0] = voice[2];
voice[1] = voice[3];
voice[2] = voice[4];
voice[3] = voice[5];
*maxmin = *maxamd / max(*minamd,1.f);
}
/* Calculate voicing parameters twice per frame: */
vparms_(&vwin[1], &inbuf[inbuf_offset], &lpbuf[lpbuf_offset], &buflim[1],
half, dither, mintau, &zc, &lbe, &fbe, &qs, &rc1, &ar_b__, &
ar_f__);
/* Estimate signal-to-noise ratio to select the appropriate VDC vector.
*/
/* The SNR is estimated as the running average of the ratio of the */
/* running average full-band voiced energy to the running average */
/* full-band unvoiced energy. SNR filter has gain of 63. */
r__1 = (*snr + *fbve / (real) max(*fbue,1)) * 63 / 64.f;
*snr = (real) i_nint(&r__1);
snr2 = *snr * *fbue / max(*lbue,1);
/* Quantize SNR to SNRL according to VDCL thresholds. */
snrl = 1;
i__1 = nvdcl - 1;
for (snrl = 1; snrl <= i__1; ++snrl) {
if (snr2 > vdcl[snrl - 1]) {
goto L69;
}
}
/* (Note: SNRL = NVDCL here) */
L69:
/* Linear discriminant voicing parameters: */
value[0] = *maxmin;
value[1] = (real) lbe / max(*lbve,1);
value[2] = (real) zc;
value[3] = rc1;
value[4] = qs;
value[5] = ivrc[2];
value[6] = ar_b__;
value[7] = ar_f__;
/* Evaluation of linear discriminant function: */
voice[*half + 3] = vdc[snrl * 10 - 1];
for (i__ = 1; i__ <= 8; ++i__) {
voice[*half + 3] += vdc[i__ + snrl * 10 - 11] * value[i__ - 1];
}
/* Classify as voiced if discriminant > 0, otherwise unvoiced */
/* Voicing decision for current half-frame: 1 = Voiced; 0 = Unvoiced */
if (voice[*half + 3] > 0.f) {
voibuf[*half + 6] = 1;
} else {
voibuf[*half + 6] = 0;
}
/* Skip voicing decision smoothing in first half-frame: */
/* Give a value to VSTATE, so that trace statements below will print
*/
/* a consistent value from one call to the next when HALF .EQ. 1. */
/* The value of VSTATE is not used for any other purpose when this is
*/
/* true. */
vstate = -1;
if (*half == 1) {
goto L99;
}
/* Voicing decision smoothing rules (override of linear combination): */
/* Unvoiced half-frames: At least two in a row. */
/* -------------------- */
/* Voiced half-frames: At least two in a row in one frame. */
/* ------------------- Otherwise at least three in a row. */
/* (Due to the way transition frames are encoded) */
/* In many cases, the discriminant function determines how to smooth. */
/* In the following chart, the decisions marked with a * may be overridden
.*/
/* Voicing override of transitions at onsets: */
/* If a V/UV or UV/V voicing decision transition occurs within one-half
*/
/* frame of an onset bounding a voicing window, then the transition is */
/* moved to occur at the onset. */
/* P 1F */
/* ----- ----- */
/* 0 0 0 0 */
/* 0 0 0* 1 (If there is an onset there) */
/* 0 0 1* 0* (Based on 2F and discriminant distance) */
/* 0 0 1 1 */
/* 0 1* 0 0 (Always) */
/* 0 1* 0* 1 (Based on discriminant distance) */
/* 0* 1 1 0* (Based on past, 2F, and discriminant distance) */
/* 0 1* 1 1 (If there is an onset there) */
/* 1 0* 0 0 (If there is an onset there) */
/* 1 0 0 1 */
/* 1 0* 1* 0 (Based on discriminant distance) */
/* 1 0* 1 1 (Always) */
/* 1 1 0 0 */
/* 1 1 0* 1* (Based on 2F and discriminant distance) */
/* 1 1 1* 0 (If there is an onset there) */
/* 1 1 1 1 */
/* Determine if there is an onset transition between P and 1F. */
/* OT (Onset Transition) is true if there is an onset between */
/* P and 1F but not after 1F. */
ot = ((obound[1] & 2) != 0 || obound[2] == 1) && (obound[3] & 1) == 0;
/* Multi-way dispatch on voicing decision history: */
vstate = (voibuf[3] << 3) + (voibuf[4] << 2) + (voibuf[5] << 1) + voibuf[
6];
switch (vstate + 1) {
case 1: goto L99;
case 2: goto L1;
case 3: goto L2;
case 4: goto L99;
case 5: goto L4;
case 6: goto L5;
case 7: goto L6;
case 8: goto L7;
case 9: goto L8;
case 10: goto L99;
case 11: goto L10;
case 12: goto L11;
case 13: goto L99;
case 14: goto L13;
case 15: goto L14;
case 16: goto L99;
}
L1:
if (ot && voibuf[7] == 1) {
voibuf[5] = 1;
}
goto L99;
L2:
if (voibuf[7] == 0 || voice[2] < -voice[3]) {
voibuf[5] = 0;
} else {
voibuf[6] = 1;
}
goto L99;
L4:
voibuf[4] = 0;
goto L99;
L5:
if (voice[1] < -voice[2]) {
voibuf[4] = 0;
} else {
voibuf[5] = 1;
}
goto L99;
/* VOIBUF(2,0) must be 0 */
L6:
if (voibuf[1] == 1 || voibuf[7] == 1 || voice[3] > voice[0]) {
voibuf[6] = 1;
} else {
voibuf[3] = 1;
}
goto L99;
L7:
if (ot) {
voibuf[4] = 0;
}
goto L99;
L8:
if (ot) {
voibuf[4] = 1;
}
goto L99;
L10:
if (voice[2] < -voice[1]) {
voibuf[5] = 0;
} else {
voibuf[4] = 1;
}
goto L99;
L11:
voibuf[4] = 1;
goto L99;
L13:
if (voibuf[7] == 0 && voice[3] < -voice[2]) {
voibuf[6] = 0;
} else {
voibuf[5] = 1;
}
goto L99;
L14:
if (ot && voibuf[7] == 0) {
voibuf[5] = 0;
}
/* GOTO 99 */
L99:
/* Now update parameters: */
/* ---------------------- */
/* During unvoiced half-frames, update the low band and full band unvoice
d*/
/* energy estimates (LBUE and FBUE) and also the zero crossing */
/* threshold (DITHER). (The input to the unvoiced energy filters is */
/* restricted to be less than 10dB above the previous inputs of the */
/* filters.) */
/* During voiced half-frames, update the low-pass (LBVE) and all-pass */
/* (FBVE) voiced energy estimates. */
if (voibuf[*half + 6] == 0) {
/* Computing MIN */
i__1 = fbe, i__2 = *ofbue * 3;
r__1 = (*sfbue * 63 + (min(i__1,i__2) << 3)) / 64.f;
*sfbue = i_nint(&r__1);
*fbue = *sfbue / 8;
*ofbue = fbe;
/* Computing MIN */
i__1 = lbe, i__2 = *olbue * 3;
r__1 = (*slbue * 63 + (min(i__1,i__2) << 3)) / 64.f;
*slbue = i_nint(&r__1);
*lbue = *slbue / 8;
*olbue = lbe;
} else {
r__1 = (*lbve * 63 + lbe) / 64.f;
*lbve = i_nint(&r__1);
r__1 = (*fbve * 63 + fbe) / 64.f;
*fbve = i_nint(&r__1);
}
/* Set dither threshold to yield proper zero crossing rates in the */
/* presence of low frequency noise and low level signal input. */
/* NOTE: The divisor is a function of REF, the expected energies. */
/* Computing MIN */
/* Computing MAX */
r__2 = (real)(sqrt((real) (*lbue * *lbve)) * 64 / 3000);
r__1 = max(r__2,1.f);
*dither = min(r__1,20.f);
/* Voicing decisions are returned in VOIBUF. */
return 0;
} /* voicin_ */

View File

@ -1,250 +0,0 @@
/*
$Log: vparms.c,v $
Revision 1.1 2004/05/04 11:16:43 csoutheren
Initial version
Revision 1.2 2002/02/15 03:57:55 yurik
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
Revision 1.1 2000/06/05 04:45:12 robertj
Added LPC-10 2400bps codec
* Revision 1.1 1996/08/19 22:30:04 jaf
* Initial revision
*
*/
#ifdef P_R_O_T_O_T_Y_P_E_S
extern int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer *buflim, integer *half, real *dither, integer *mintau, integer *zc, integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *ar_f__);
#endif
/* -- translated by f2c (version 19951025).
You must link the resulting object file with the libraries:
-lf2c -lm (in that order)
*/
#include "f2c.h"
/* Table of constant values */
static real c_b2 = 1.f;
/* ********************************************************************* */
/* VPARMS Version 50 */
/* $Log: vparms.c,v $
* Revision 1.1 2004/05/04 11:16:43 csoutheren
* Initial version
*
* Revision 1.2 2002/02/15 03:57:55 yurik
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
*
* Revision 1.1 2000/06/05 04:45:12 robertj
* Added LPC-10 2400bps codec
*
* Revision 1.1 1996/08/19 22:30:04 jaf
* Initial revision
*
*/
/* Revision 1.6 1996/03/29 18:01:16 jaf */
/* Added some more comments about the range of INBUF and LPBUF that can */
/* be read. Note that it is possible for index VWIN(2)+1 to be read from */
/* INBUF, which might be outside of its defined range, although that will */
/* require more careful checking. */
/* Revision 1.5 1996/03/19 00:02:02 jaf */
/* I just noticed that the argument DITHER is modified inside of this */
/* subroutine. Comments were added explaining the possible final values. */
/* Revision 1.4 1996/03/18 22:22:59 jaf */
/* Finishing the job I said I did with the last check-in comments. */
/* Revision 1.3 1996/03/18 22:22:17 jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */
/* Revision 1.2 1996/03/13 15:02:58 jaf */
/* Comments added explaining that none of the local variables of this */
/* subroutine need to be saved from one invocation to the next. */
/* Revision 1.1 1996/02/07 14:50:42 jaf */
/* Initial revision */
/* ********************************************************************* */
/* Calculate voicing parameters: */
/* Input: */
/* VWIN - Voicing window limits */
/* Indices 1 through 2 read. */
/* INBUF - Input speech buffer */
/* Indices START-1 through STOP read, */
/* where START and STOP are defined in the code (only written once).
*/
/* Note that STOP can be as large as VWIN(2)+1 ! */
/* LPBUF - Low pass filtered speech */
/* Indices START-MINTAU through STOP+MINTAU read, */
/* where START and STOP are defined in the code (only written once).
*/
/* BUFLIM - Array bounds for INBUF and LPBUF */
/* Indices 1 through 4 read. */
/* HALF - Half frame (1 or 2) */
/* MINTAU - Lag corresponding to minimum AMDF value (pitch estimate) */
/* Input/Output: */
/* DITHER - Zero crossing threshold */
/* The resulting value might be the negation of the input */
/* value. It might always be the same as the input value, */
/* if the DO loop below always executes an even number of times. */
/* Output: (all of them are written on every call) */
/* ZC - Zero crossing rate */
/* LBE - Low band energy (sum of magnitudes - SM) */
/* FBE - Full band energy (SM) */
/* QS - Ratio of 6 dB/oct preemphasized energy to full band energy */
/* RC1 - First reflection coefficient */
/* AR_B - Product of the causal forward and reverse pitch */
/* prediction gains */
/* AR_F - Product of the noncausal forward and reverse pitch */
/* prediction gains */
/* Internal: */
/* OLDSGN - Previous sign of dithered signal */
/* VLEN - Length of voicing window */
/* START - Lower address of current half of voicing window */
/* STOP - Upper address of current half of voicing window */
/* E_0 - Energy of LPF speech (sum of squares - SS) */
/* E_B - Energy of LPF speech backward one pitch period (SS) */
/* E_F - Energy of LPF speech forward one pitch period (SS) */
/* R_B - Autocovariance of LPF speech backward one pitch period */
/* R_F - Autocovariance of LPF speech forward one pitch period */
/* LP_RMS - Energy of LPF speech (sum of magnitudes - SM) */
/* AP_RMS - Energy of all-pass speech (SM) */
/* E_PRE - Energy of 6dB preemphasized speech (SM) */
/* E0AP - Energy of all-pass speech (SS) */
/* This subroutine has no local state. */
/* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer
*buflim, integer *half, real *dither, integer *mintau, integer *zc,
integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *
ar_f__)
{
/* System generated locals */
integer inbuf_offset, lpbuf_offset, i__1;
real r__1, r__2;
/* Builtin functions */
double r_sign(real *, real *);
integer i_nint(real *);
/* Local variables */
integer vlen, stop, i__;
real e_pre__;
integer start;
real ap_rms__, e_0__, oldsgn, lp_rms__, e_b__, e_f__, r_b__, r_f__, e0ap;
/* Arguments */
/* Local variables that need not be saved */
/* Calculate zero crossings (ZC) and several energy and correlation */
/* measures on low band and full band speech. Each measure is taken */
/* over either the first or the second half of the voicing window, */
/* depending on the variable HALF. */
/* Parameter adjustments */
--vwin;
--buflim;
lpbuf_offset = buflim[3];
lpbuf -= lpbuf_offset;
inbuf_offset = buflim[1];
inbuf -= inbuf_offset;
/* Function Body */
lp_rms__ = 0.f;
ap_rms__ = 0.f;
e_pre__ = 0.f;
e0ap = 0.f;
*rc1 = 0.f;
e_0__ = 0.f;
e_b__ = 0.f;
e_f__ = 0.f;
r_f__ = 0.f;
r_b__ = 0.f;
*zc = 0;
vlen = vwin[2] - vwin[1] + 1;
start = vwin[1] + (*half - 1) * vlen / 2 + 1;
stop = start + vlen / 2 - 1;
/* I'll use the symbol HVL in the table below to represent the value */
/* VLEN/2. Note that if VLEN is odd, then HVL should be rounded down, */
/* i.e., HVL = (VLEN-1)/2. */
/* HALF START STOP */
/* 1 VWIN(1)+1 VWIN(1)+HVL */
/* 2 VWIN(1)+HVL+1 VWIN(1)+2*HVL */
/* Note that if VLEN is even and HALF is 2, then STOP will be */
/* VWIN(1)+VLEN = VWIN(2)+1. That could be bad, if that index of INBUF */
/* is undefined. */
r__1 = inbuf[start - 1] - *dither;
oldsgn = (real)r_sign(&c_b2, &r__1);
i__1 = stop;
for (i__ = start; i__ <= i__1; ++i__) {
lp_rms__ += (r__1 = lpbuf[i__], abs(r__1));
ap_rms__ += (r__1 = inbuf[i__], abs(r__1));
e_pre__ += (r__1 = inbuf[i__] - inbuf[i__ - 1], abs(r__1));
/* Computing 2nd power */
r__1 = inbuf[i__];
e0ap += r__1 * r__1;
*rc1 += inbuf[i__] * inbuf[i__ - 1];
/* Computing 2nd power */
r__1 = lpbuf[i__];
e_0__ += r__1 * r__1;
/* Computing 2nd power */
r__1 = lpbuf[i__ - *mintau];
e_b__ += r__1 * r__1;
/* Computing 2nd power */
r__1 = lpbuf[i__ + *mintau];
e_f__ += r__1 * r__1;
r_f__ += lpbuf[i__] * lpbuf[i__ + *mintau];
r_b__ += lpbuf[i__] * lpbuf[i__ - *mintau];
r__1 = inbuf[i__] + *dither;
if (r_sign(&c_b2, &r__1) != oldsgn) {
++(*zc);
oldsgn = -oldsgn;
}
*dither = -(*dither);
}
/* Normalized short-term autocovariance coefficient at unit sample delay
*/
*rc1 /= max(e0ap,1.f);
/* Ratio of the energy of the first difference signal (6 dB/oct preemphas
is)*/
/* to the energy of the full band signal */
/* Computing MAX */
r__1 = ap_rms__ * 2.f;
*qs = e_pre__ / max(r__1,1.f);
/* aR_b is the product of the forward and reverse prediction gains, */
/* looking backward in time (the causal case). */
*ar_b__ = r_b__ / max(e_b__,1.f) * (r_b__ / max(e_0__,1.f));
/* aR_f is the same as aR_b, but looking forward in time (non causal case
).*/
*ar_f__ = r_f__ / max(e_f__,1.f) * (r_f__ / max(e_0__,1.f));
/* Normalize ZC, LBE, and FBE to old fixed window length of 180. */
/* (The fraction 90/VLEN has a range of .58 to 1) */
r__2 = (real) (*zc << 1);
r__1 = r__2 * (90.f / vlen);
*zc = i_nint(&r__1);
/* Computing MIN */
r__1 = lp_rms__ / 4 * (90.f / vlen);
i__1 = i_nint(&r__1);
*lbe = min(i__1,32767);
/* Computing MIN */
r__1 = ap_rms__ / 4 * (90.f / vlen);
i__1 = i_nint(&r__1);
*fbe = min(i__1,32767);
return 0;
} /* vparms_ */

View File

@ -1,9 +0,0 @@
BASE=../../../..
LPC10_DIR=$(BASE)/libs/codec/lpc10
LPC10LA=$(LPC10_DIR)/liblpc10.la
LOCAL_CFLAGS=-I$(LPC10_DIR)/src
LOCAL_LIBADD=$(LPC10LA)
include $(BASE)/build/modmake.rules
$(LPC10LA): $(LPC10_DIR) $(LPC10_DIR)/.update
cd $(LPC10_DIR) && $(MAKE)

View File

@ -1,184 +0,0 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com>
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
*
* The Initial Developer of the Original Code is
* Anthony Minessale II <anthmct@yahoo.com>
* Portions created by the Initial Developer are Copyright (C)
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Brian K. West <brian.west@mac.com>
* Bret McDanel <trixter AT 0xdecafbad.com>
*
*
* mod_lpc10.c -- LPC10 Codec Module
*
*/
#include <switch.h>
#include <lpc10.h>
SWITCH_MODULE_LOAD_FUNCTION(mod_lpc10_load);
SWITCH_MODULE_DEFINITION(mod_lpc10, mod_lpc10_load, NULL, NULL);
enum {
SamplesPerFrame = 180,
BitsPerFrame = 54,
BytesPerFrame = (BitsPerFrame + 7) / 8,
BitsPerSecond = 2400
};
#define SampleValueScale 32768.0
#define MaxSampleValue 32767.0
#define MinSampleValue -32767.0
struct lpc10_context {
struct lpc10_encoder_state encoder_object;
struct lpc10_decoder_state decoder_object;
};
static switch_status_t switch_lpc10_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
struct lpc10_context *context = NULL;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(struct lpc10_context))))) {
return SWITCH_STATUS_FALSE;
} else {
if (encoding) {
init_lpc10_encoder_state(&context->encoder_object);
}
if (decoding) {
init_lpc10_decoder_state(&context->decoder_object);
}
codec->private_info = context;
return SWITCH_STATUS_SUCCESS;
}
}
static switch_status_t switch_lpc10_destroy(switch_codec_t *codec)
{
codec->private_info = NULL;
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_lpc10_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
struct lpc10_context *context = codec->private_info;
uint8_t i;
int32_t bits[BitsPerFrame];
real speech[SamplesPerFrame];
const short *sampleBuffer = (const short *) decoded_data;
unsigned char *buffer = (unsigned char *) encoded_data;
if (!context) {
return SWITCH_STATUS_FALSE;
}
for (i = 0; i < SamplesPerFrame; i++)
speech[i] = (real) (sampleBuffer[i] / SampleValueScale);
lpc10_encode(speech, bits, &context->encoder_object);
memset(encoded_data, 0, BytesPerFrame);
for (i = 0; i < BitsPerFrame; i++) {
if (bits[i])
buffer[i >> 3] |= 1 << (i & 7);
}
*encoded_data_len = BytesPerFrame;
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_lpc10_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
struct lpc10_context *context = codec->private_info;
int i;
INT32 bits[BitsPerFrame];
real speech[SamplesPerFrame];
short *sampleBuffer = (short *) decoded_data;
const unsigned char *buffer = (const unsigned char *) encoded_data;
if (!context) {
return SWITCH_STATUS_FALSE;
}
for (i = 0; i < BitsPerFrame; i++)
bits[i] = (buffer[i >> 3] & (1 << (i & 7))) != 0;
lpc10_decode(bits, speech, &context->decoder_object);
for (i = 0; i < SamplesPerFrame; i++) {
real sample = (real) (speech[i] * SampleValueScale);
if (sample < MinSampleValue)
sample = MinSampleValue;
else if (sample > MaxSampleValue)
sample = MaxSampleValue;
sampleBuffer[i] = (short) sample;
}
*decoded_data_len = SamplesPerFrame * 2;
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MODULE_LOAD_FUNCTION(mod_lpc10_load)
{
switch_codec_interface_t *codec_interface;
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
SWITCH_ADD_CODEC(codec_interface, "LPC-10 2.4kbps");
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 7, "LPC", NULL, 8000, 8000, 2400,
22500, 180, 360, 7, 1, 1, 1,
switch_lpc10_init, switch_lpc10_encode, switch_lpc10_decode, switch_lpc10_destroy);
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS;
}
/* For Emacs:
* Local Variables:
* mode:c
* indent-tabs-mode:t
* tab-width:4
* c-basic-offset:4
* End:
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
*/

View File

@ -0,0 +1,13 @@
BASE=../../../..
VOIPCODECS_DIR=$(BASE)/libs/voipcodecs
VOIPCODECS_LA=$(VOIPCODECS_DIR)/src/libvoipcodecs.la
LOCAL_CFLAGS=-I$(VOIPCODECS_DIR)/src
LOCAL_LIBADD=$(VOIPCODECS_LA)
include $(BASE)/build/modmake.rules
$(VOIPCODECS_LA): $(VOIPCODECS_DIR) $(VOIPCODECS_DIR)/.update
cd $(VOIPCODECS_DIR) && $(MAKE)
$(TOUCH_TARGET)

View File

@ -0,0 +1,706 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com>
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / G722 codec module
*
* The Initial Developer of the Original Code is
* Brian K. West <brian.west@mac.com>
* Portions created by the Initial Developer are Copyright (C)
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian K. West <brian.west@mac.com>
* Anthony Minessale II <anthmct@yahoo.com>
* Michael Jerris <mike@jerris.com>
*
* mod_voipcodecs.c -- VoIP Codecs (G.711, G.722, G.726, GSM-FR, IMA_ADPCM, LPC10)
*
* This module wouldn't be possible without generous contributions from Steve Underwood. Thanks!
*
*/
#include <switch.h>
#include "voipcodecs.h"
SWITCH_MODULE_LOAD_FUNCTION(mod_voipcodecs_load);
SWITCH_MODULE_DEFINITION(mod_voipcodecs, mod_voipcodecs_load, NULL, NULL);
/* LPC10 - START */
struct lpc10_context {
lpc10_encode_state_t encoder_object;
lpc10_decode_state_t decoder_object;
};
static switch_status_t switch_lpc10_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
struct lpc10_context *context = NULL;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(struct lpc10_context))))) {
return SWITCH_STATUS_FALSE;
} else {
if (encoding) {
lpc10_encode_init(&context->encoder_object, TRUE);
}
if (decoding) {
lpc10_decode_init(&context->decoder_object, TRUE);
}
codec->private_info = context;
return SWITCH_STATUS_SUCCESS;
}
}
static switch_status_t switch_lpc10_destroy(switch_codec_t *codec)
{
codec->private_info = NULL;
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_lpc10_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
struct lpc10_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*encoded_data_len = lpc10_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 360);
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_lpc10_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
struct lpc10_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*decoded_data_len = (2 * lpc10_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len / 7));
return SWITCH_STATUS_SUCCESS;
}
/* LPC10 - END */
/* GSM - START */
struct gsm_context {
gsm0610_state_t decoder_object;
gsm0610_state_t encoder_object;
};
static switch_status_t switch_gsm_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
struct gsm_context *context = NULL;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context))))) {
return SWITCH_STATUS_FALSE;
} else {
if (encoding) {
gsm0610_init(&context->encoder_object, GSM0610_PACKING_VOIP);
}
if (decoding) {
gsm0610_init(&context->decoder_object, GSM0610_PACKING_VOIP);
}
codec->private_info = context;
return SWITCH_STATUS_SUCCESS;
}
}
static switch_status_t switch_gsm_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
struct gsm_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*encoded_data_len = gsm0610_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_gsm_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
struct gsm_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*decoded_data_len = (2 * gsm0610_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_gsm_destroy(switch_codec_t *codec)
{
/* We do not need to use release here as the pool memory is taken care of for us */
codec->private_info = NULL;
return SWITCH_STATUS_SUCCESS;
}
/* GSM - END */
/* G711 - START */
static switch_status_t switch_g711u_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding)) {
return SWITCH_STATUS_FALSE;
} else {
return SWITCH_STATUS_SUCCESS;
}
}
static switch_status_t switch_g711u_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
short *dbuf;
unsigned char *ebuf;
uint32_t i;
dbuf = decoded_data;
ebuf = encoded_data;
for (i = 0; i < decoded_data_len / sizeof(short); i++) {
ebuf[i] = linear_to_ulaw(dbuf[i]);
}
*encoded_data_len = i;
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g711u_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
short *dbuf;
unsigned char *ebuf;
uint32_t i;
dbuf = decoded_data;
ebuf = encoded_data;
if (*flag & SWITCH_CODEC_FLAG_SILENCE) {
memset(dbuf, 0, codec->implementation->bytes_per_frame);
*decoded_data_len = codec->implementation->bytes_per_frame;
} else {
for (i = 0; i < encoded_data_len; i++) {
dbuf[i] = ulaw_to_linear(ebuf[i]);
}
*decoded_data_len = i * 2;
}
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g711u_destroy(switch_codec_t *codec)
{
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g711a_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding)) {
return SWITCH_STATUS_FALSE;
} else {
return SWITCH_STATUS_SUCCESS;
}
}
static switch_status_t switch_g711a_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
short *dbuf;
unsigned char *ebuf;
uint32_t i;
dbuf = decoded_data;
ebuf = encoded_data;
for (i = 0; i < decoded_data_len / sizeof(short); i++) {
ebuf[i] = linear_to_alaw(dbuf[i]);
}
*encoded_data_len = i;
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g711a_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
short *dbuf;
unsigned char *ebuf;
uint32_t i;
dbuf = decoded_data;
ebuf = encoded_data;
if (*flag & SWITCH_CODEC_FLAG_SILENCE) {
memset(dbuf, 0, codec->implementation->bytes_per_frame);
*decoded_data_len = codec->implementation->bytes_per_frame;
} else {
for (i = 0; i < encoded_data_len; i++) {
dbuf[i] = alaw_to_linear(ebuf[i]);
}
*decoded_data_len = i * 2;
}
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g711a_destroy(switch_codec_t *codec)
{
return SWITCH_STATUS_SUCCESS;
}
/* G711 - END */
/* G722 - START */
struct g722_context {
g722_decode_state_t decoder_object;
g722_encode_state_t encoder_object;
};
static switch_status_t switch_g722_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
struct g722_context *context = NULL;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(struct g722_context))))) {
return SWITCH_STATUS_FALSE;
} else {
if (encoding) {
g722_encode_init(&context->encoder_object, 64000, G722_PACKED);
}
if (decoding) {
g722_decode_init(&context->decoder_object, 64000, G722_PACKED);
}
}
codec->private_info = context;
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g722_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
struct g722_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*encoded_data_len = g722_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g722_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
struct g722_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*decoded_data_len = (2 * g722_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g722_destroy(switch_codec_t *codec)
{
/* We do not need to use release here as the pool memory is taken care of for us */
codec->private_info = NULL;
return SWITCH_STATUS_SUCCESS;
}
/* G722 - END */
/* G726 - START */
static switch_status_t switch_g726_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
int packing = G726_PACKING_RIGHT;
g726_state_t *context;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context))))) {
return SWITCH_STATUS_FALSE;
} else {
if ((flags & SWITCH_CODEC_FLAG_AAL2 || strstr(codec->implementation->iananame, "AAL2"))) {
packing = G726_PACKING_LEFT;
}
g726_init(context, codec->implementation->bits_per_second, G726_ENCODING_LINEAR, packing);
codec->private_info = context;
return SWITCH_STATUS_SUCCESS;
}
}
static switch_status_t switch_g726_destroy(switch_codec_t *codec)
{
codec->private_info = NULL;
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g726_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
g726_state_t *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*encoded_data_len = g726_encode(context, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_g726_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
g726_state_t *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*decoded_data_len = (2 * g726_decode(context, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
return SWITCH_STATUS_SUCCESS;
}
/* G726 - START */
/* IMA_ADPCM - START */
struct ima_adpcm_context {
ima_adpcm_state_t decoder_object;
ima_adpcm_state_t encoder_object;
};
static switch_status_t switch_adpcm_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
{
uint32_t encoding, decoding;
struct ima_adpcm_context *context = NULL;
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context))))) {
return SWITCH_STATUS_FALSE;
} else {
if (encoding) {
ima_adpcm_init(&context->encoder_object, IMA_ADPCM_DVI4);
}
if (decoding) {
ima_adpcm_init(&context->decoder_object, IMA_ADPCM_DVI4);
}
codec->private_info = context;
return SWITCH_STATUS_SUCCESS;
}
}
static switch_status_t switch_adpcm_encode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *decoded_data,
uint32_t decoded_data_len,
uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate,
unsigned int *flag)
{
struct ima_adpcm_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*encoded_data_len = ima_adpcm_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_adpcm_decode(switch_codec_t *codec,
switch_codec_t *other_codec,
void *encoded_data,
uint32_t encoded_data_len,
uint32_t encoded_rate, void *decoded_data, uint32_t * decoded_data_len, uint32_t * decoded_rate,
unsigned int *flag)
{
struct ima_adpcm_context *context = codec->private_info;
if (!context) {
return SWITCH_STATUS_FALSE;
}
*decoded_data_len = (2 * ima_adpcm_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
return SWITCH_STATUS_SUCCESS;
}
static switch_status_t switch_adpcm_destroy(switch_codec_t *codec)
{
/* We do not need to use release here as the pool memory is taken care of for us */
codec->private_info = NULL;
return SWITCH_STATUS_SUCCESS;
}
/* IMA_ADPCM - END */
SWITCH_MODULE_LOAD_FUNCTION(mod_voipcodecs_load)
{
switch_codec_interface_t *codec_interface;
int mpf, spf, bpf, ebpf, count;
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
/* IMA_ADPCM */
mpf = 10000, spf = 80, bpf = 160, ebpf = 80;
SWITCH_ADD_CODEC(codec_interface, "ADPCM (IMA)");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 5, "DVI4", NULL, 8000, 8000, 32000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_adpcm_init, switch_adpcm_encode, switch_adpcm_decode, switch_adpcm_destroy);
}
mpf = 10000, spf = 160, bpf = 360, ebpf = 160;
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 6, "DVI4", NULL, 16000, 16000, 64000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_adpcm_init, switch_adpcm_encode, switch_adpcm_decode, switch_adpcm_destroy);
}
/* G726 */
mpf = 10000, spf = 80, bpf = 160, ebpf = 20;
SWITCH_ADD_CODEC(codec_interface, "G.726 16k (AAL2)");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 124, "AAL2-G726-16", NULL, 8000, 8000, 16000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
SWITCH_ADD_CODEC(codec_interface, "G.726 16k");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 127, "G726-16", NULL, 8000, 8000, 16000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
/* Increase encoded bytes per frame by 10 */
ebpf = ebpf + 10;
SWITCH_ADD_CODEC(codec_interface, "G.726 24k (AAL2)");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 123, "AAL2-G726-24", NULL, 8000, 8000, 24000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
SWITCH_ADD_CODEC(codec_interface, "G.726 24k");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 126, "G726-24", NULL, 8000, 8000, 24000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
/* Increase encoded bytes per frame by 10 */
ebpf = ebpf + 10;
SWITCH_ADD_CODEC(codec_interface, "G.726 32k (AAL2)");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 2, "AAL2-G726-32", NULL, 8000, 8000, 32000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
SWITCH_ADD_CODEC(codec_interface, "G.726 32k");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 2, "G726-32", NULL, 8000, 8000, 32000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
/* Increase encoded bytes per frame by 10 */
ebpf = ebpf + 10;
SWITCH_ADD_CODEC(codec_interface, "G.726 40k (AAL2)");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 122, "AAL2-G726-40", NULL, 8000, 8000, 40000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
SWITCH_ADD_CODEC(codec_interface, "G.726 40k");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 125, "G726-40", NULL, 8000, 8000, 40000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g726_init, switch_g726_encode, switch_g726_decode, switch_g726_destroy);
}
/* G722 */
mpf = 10000, spf = 80, bpf = 320, ebpf = 80;
SWITCH_ADD_CODEC(codec_interface, "G.722");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 9, "G722", NULL, 8000, 16000, 64000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g722_init, switch_g722_encode, switch_g722_decode, switch_g722_destroy);
}
/* G711 */
mpf = 10000, spf = 80, bpf = 160, ebpf = 80;
SWITCH_ADD_CODEC(codec_interface, "G.711 ulaw");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 0, "PCMU", NULL, 8000, 8000, 64000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g711u_init, switch_g711u_encode, switch_g711u_decode, switch_g711u_destroy);
}
SWITCH_ADD_CODEC(codec_interface, "G.711 alaw");
for (count = 12; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 8, "PCMA", NULL, 8000, 8000, 64000,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 12,
switch_g711a_init, switch_g711a_encode, switch_g711a_decode, switch_g711a_destroy);
}
/* GSM */
mpf = 20000, spf = 160, bpf = 320, ebpf = 33;
SWITCH_ADD_CODEC(codec_interface, "GSM");
for (count = 6; count > 0; count--) {
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 3, "GSM", NULL, 8000, 8000, 13200,
mpf * count, spf * count, bpf * count, ebpf * count, 1, 1, 6,
switch_gsm_init, switch_gsm_encode, switch_gsm_decode, switch_gsm_destroy);
}
/* LPC10 */
SWITCH_ADD_CODEC(codec_interface, "LPC-10");
switch_core_codec_add_implementation(pool, codec_interface,
SWITCH_CODEC_TYPE_AUDIO, 7, "LPC", NULL, 8000, 8000, 2400,
90000, 720, 1440, 28, 1, 1, 1,
switch_lpc10_init, switch_lpc10_encode, switch_lpc10_decode, switch_lpc10_destroy);
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS;
}
/* For Emacs:
* Local Variables:
* mode:c
* indent-tabs-mode:t
* tab-width:4
* c-basic-offset:4
* End:
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
*/