+++ /dev/null
-Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,\r
-Technische Universitaet Berlin\r
-\r
-Any use of this software is permitted provided that this notice is not\r
-removed and that neither the authors nor the Technische Universitaet Berlin\r
-are deemed to have made any representations as to the suitability of this\r
-software for any purpose nor are held responsible for any defects of\r
-this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
-\r
-As a matter of courtesy, the authors request to be informed about uses\r
-this software has found, about bugs in this software, and about any\r
-improvements that may be of general interest.\r
-\r
-Berlin, 28.11.1994\r
-Jutta Degener\r
-Carsten Bormann\r
+++ /dev/null
-# Copyright 1992-1996 by Jutta Degener and Carsten Bormann, Technische\r
-# Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
-# details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
-\r
-# Machine- or installation dependent flags you should configure to port\r
-\r
-SASR = -DSASR\r
-######### Define SASR if >> is a signed arithmetic shift (-1 >> 1 == -1)\r
-\r
-#MULHACK = -DUSE_FLOAT_MUL\r
-######### Define this if your host multiplies floats faster than integers,\r
-######### e.g. on a SPARCstation.\r
-\r
-#FAST = -DFAST\r
-######### Define together with USE_FLOAT_MUL to enable the GSM library's\r
-######### approximation option for incorrect, but good-enough results.\r
-\r
-# LTP_CUT = -DLTP_CUT\r
-LTP_CUT =\r
-######### Define to enable the GSM library's long-term correlation \r
-######### approximation option---faster, but worse; works for\r
-######### both integer and floating point multiplications.\r
-######### This flag is still in the experimental stage.\r
-\r
-WAV49 = -DWAV49\r
-#WAV49 =\r
-######### Define to enable the GSM library's option to pack GSM frames \r
-######### in the style used by the WAV #49 format. If you want to write\r
-######### a tool that produces .WAV files which contain GSM-encoded data,\r
-######### define this, and read about the GSM_OPT_WAV49 option in the\r
-######### manual page on gsm_option(3).\r
-\r
-#K6OPT = -DK6OPT\r
-#K6OPT =\r
-######### Define to enable MMXTM optimizations for x86 architecture CPU's\r
-######### which support MMX instructions. This should be newer pentiums,\r
-######### ppro's, etc, as well as the AMD K6 and K7. The compile will\r
-######### probably require gcc. \r
-\r
-ifneq (${OSARCH},Darwin)\r
-ifneq (${OSARCH},SunOS)\r
-ifneq (${PROC},x86_64)\r
-ifneq (${PROC},ultrasparc)\r
-ifneq ($(shell uname -m),ppc)\r
-ifneq ($(shell uname -m),ppc64)\r
-ifneq ($(shell uname -m),alpha)\r
-ifneq ($(shell uname -m),armv4l)\r
-ifneq (${PROC},sparc64)\r
-ifneq (${PROC},arm)\r
-ifneq (${PROC},ppc)\r
-ifneq (${PROC},ppc64)\r
-OPTIMIZE+=-march=$(PROC)\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-\r
-#The problem with sparc is the best stuff is in newer versions of gcc (post 3.0) only.\r
-#This works for even old (2.96) versions of gcc and provides a small boost either way.\r
-#A ultrasparc cpu is really v9 but the stock debian stable 3.0 gcc doesn't support it.\r
-#So we go lowest common available by gcc and go a step down, still a step up from\r
-#the default as we now have a better instruction set to work with. - Belgarath\r
-ifeq (${PROC},ultrasparc)\r
-OPTIMIZE+=-mcpu=v8 -mtune=$(PROC) -O3 \r
-endif\r
-\r
-PG =\r
-#PG = -g -pg\r
-######### Profiling flags. If you don't know what that means, leave it blank.\r
- \r
-# Choose a compiler. The code works both with ANSI and K&R-C.\r
-# Use -DNeedFunctionPrototypes to compile with, -UNeedFunctionPrototypes to\r
-# compile without, function prototypes in the header files.\r
-#\r
-# You can use the -DSTUPID_COMPILER to circumvent some compilers'\r
-# static limits regarding the number of subexpressions in a statement.\r
-\r
-# CC = cc\r
-# CCFLAGS = -c -DSTUPID_COMPILER\r
-\r
-# CC = /usr/lang/acc\r
-# CCFLAGS = -c -O\r
-\r
-CC ?= gcc\r
-CCFLAGS += -c -DNeedFunctionPrototypes=1 -funroll-loops $(OPTIMIZE)\r
-ifneq ($(findstring CYGWIN,${OSARCH}),CYGWIN)\r
-CCFLAGS += -fPIC\r
-endif\r
-\r
-\r
-LD = $(CC)\r
-\r
-# LD = gcc\r
-# LDFLAGS =\r
-\r
-\r
-# If your compiler needs additional flags/libraries, regardless of\r
-# the source compiled, configure them here.\r
-\r
-# CCINC = -I/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1/include\r
-######### Includes needed by $(CC)\r
-\r
-# LDINC = -L/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1\r
-######### Library paths needed by $(LD)\r
-\r
-# LDLIB = -lgcc\r
-######### Additional libraries needed by $(LD)\r
-\r
-\r
-# Where do you want to install libraries, binaries, a header file\r
-# and the manual pages?\r
-#\r
-# Leave INSTALL_ROOT empty (or just don't execute "make install") to\r
-# not install gsm and toast outside of this directory.\r
-\r
-INSTALL_ROOT =\r
-\r
-# Where do you want to install the gsm library, header file, and manpages?\r
-#\r
-# Leave GSM_INSTALL_ROOT empty to not install the GSM library outside of\r
-# this directory.\r
-\r
-GSM_INSTALL_ROOT = $(INSTALL_ROOT)\r
-GSM_INSTALL_LIB = $(GSM_INSTALL_ROOT)/lib\r
-GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/inc\r
-GSM_INSTALL_MAN = $(GSM_INSTALL_ROOT)/man/man3\r
-\r
-\r
-# Where do you want to install the toast binaries and their manpage?\r
-#\r
-# Leave TOAST_INSTALL_ROOT empty to not install the toast binaries outside\r
-# of this directory.\r
-\r
-TOAST_INSTALL_ROOT = $(INSTALL_ROOT)\r
-TOAST_INSTALL_BIN = $(TOAST_INSTALL_ROOT)/bin\r
-TOAST_INSTALL_MAN = $(TOAST_INSTALL_ROOT)/man/man1\r
-\r
-# Other tools\r
-\r
-SHELL = /bin/sh\r
-LN = ln\r
-BASENAME = basename\r
-AR = ar\r
-ARFLAGS = cr\r
-RMFLAGS = -f\r
-FIND = find\r
-COMPRESS = compress\r
-COMPRESSFLAGS = \r
-# RANLIB = true\r
-RANLIB = ranlib\r
-\r
-#\r
-# You shouldn't have to configure below this line if you're porting.\r
-# \r
-\r
-\r
-# Local Directories\r
-\r
-ROOT = .\r
-ADDTST = $(ROOT)/add-test\r
-TST = $(ROOT)/tst\r
-MAN = $(ROOT)/man\r
-BIN = $(ROOT)/bin\r
-SRC = $(ROOT)/src\r
-LIB = $(ROOT)/lib\r
-TLS = $(ROOT)/tls\r
-INC = $(ROOT)/inc\r
-\r
-# Flags\r
-\r
-DEBUG = -DNDEBUG\r
-######### Remove -DNDEBUG to enable assertions.\r
-\r
-CFLAGS += $(PG) $(CCFLAGS) $(SASR) $(DEBUG) $(MULHACK) $(FAST) \\r
- $(LTP_CUT) $(WAV49) $(K6OPT) $(CCINC) -I$(INC)\r
-######### It's $(CC) $(CFLAGS)\r
-\r
-LFLAGS = $(PG) $(LDFLAGS) $(LDINC)\r
-######### It's $(LD) $(LFLAGS)\r
-\r
-\r
-# Targets\r
-\r
-LIBGSM = $(LIB)/libgsm.a\r
-LIBGSMSO= $(LIB)/libgsm.so\r
-\r
-TOAST = $(BIN)/toast\r
-UNTOAST = $(BIN)/untoast\r
-TCAT = $(BIN)/tcat\r
-\r
-# Headers\r
-\r
-GSM_HEADERS = $(INC)/gsm.h\r
-\r
-HEADERS = $(INC)/proto.h \\r
- $(INC)/unproto.h \\r
- $(INC)/config.h \\r
- $(INC)/private.h \\r
- $(INC)/gsm.h \\r
- $(INC)/toast.h \\r
- $(TLS)/taste.h\r
-\r
-# Sources\r
-\r
-GSM_SOURCES = $(SRC)/add.c \\r
- $(SRC)/code.c \\r
- $(SRC)/debug.c \\r
- $(SRC)/decode.c \\r
- $(SRC)/long_term.c \\r
- $(SRC)/lpc.c \\r
- $(SRC)/preprocess.c \\r
- $(SRC)/rpe.c \\r
- $(SRC)/gsm_destroy.c \\r
- $(SRC)/gsm_decode.c \\r
- $(SRC)/gsm_encode.c \\r
- $(SRC)/gsm_explode.c \\r
- $(SRC)/gsm_implode.c \\r
- $(SRC)/gsm_create.c \\r
- $(SRC)/gsm_print.c \\r
- $(SRC)/gsm_option.c \\r
- $(SRC)/short_term.c \\r
- $(SRC)/table.c\r
-ifeq (${OSARCH},Linux)\r
-ifneq ($(shell uname -m),x86_64)\r
-ifneq ($(shell uname -m),ppc)\r
-ifneq ($(shell uname -m),ppc64)\r
-ifneq ($(shell uname -m),alpha)\r
-ifneq ($(shell uname -m),armv4l)\r
-ifneq ($(shell uname -m),sparc64)\r
-ifneq (${PROC},arm)\r
-GSM_SOURCES+= $(SRC)/k6opt.s\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-\r
-TOAST_SOURCES = $(SRC)/toast.c \\r
- $(SRC)/toast_lin.c \\r
- $(SRC)/toast_ulaw.c \\r
- $(SRC)/toast_alaw.c \\r
- $(SRC)/toast_audio.c\r
-\r
-SOURCES = $(GSM_SOURCES) \\r
- $(TOAST_SOURCES) \\r
- $(ADDTST)/add_test.c \\r
- $(TLS)/sour.c \\r
- $(TLS)/ginger.c \\r
- $(TLS)/sour1.dta \\r
- $(TLS)/sour2.dta \\r
- $(TLS)/bitter.c \\r
- $(TLS)/bitter.dta \\r
- $(TLS)/taste.c \\r
- $(TLS)/sweet.c \\r
- $(TST)/cod2lin.c \\r
- $(TST)/cod2txt.c \\r
- $(TST)/gsm2cod.c \\r
- $(TST)/lin2cod.c \\r
- $(TST)/lin2txt.c\r
-\r
-# Object files\r
-\r
-GSM_OBJECTS = $(SRC)/add.o \\r
- $(SRC)/code.o \\r
- $(SRC)/debug.o \\r
- $(SRC)/decode.o \\r
- $(SRC)/long_term.o \\r
- $(SRC)/lpc.o \\r
- $(SRC)/preprocess.o \\r
- $(SRC)/rpe.o \\r
- $(SRC)/gsm_destroy.o \\r
- $(SRC)/gsm_decode.o \\r
- $(SRC)/gsm_encode.o \\r
- $(SRC)/gsm_explode.o \\r
- $(SRC)/gsm_implode.o \\r
- $(SRC)/gsm_create.o \\r
- $(SRC)/gsm_print.o \\r
- $(SRC)/gsm_option.o \\r
- $(SRC)/short_term.o \\r
- $(SRC)/table.o\r
-\r
-ifeq (${OSARCH},Linux)\r
-ifneq ($(shell uname -m), x86_64)\r
-ifneq ($(shell uname -m), ppc)\r
-ifneq ($(shell uname -m), ppc64)\r
-ifneq ($(shell uname -m), alpha)\r
-ifneq ($(shell uname -m), sparc64)\r
-ifneq ($(shell uname -m), armv4l)\r
-GSM_OBJECTS+= $(SRC)/k6opt.o\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-\r
-TOAST_OBJECTS = $(SRC)/toast.o \\r
- $(SRC)/toast_lin.o \\r
- $(SRC)/toast_ulaw.o \\r
- $(SRC)/toast_alaw.o \\r
- $(SRC)/toast_audio.o\r
-\r
-OBJECTS = $(GSM_OBJECTS) $(TOAST_OBJECTS)\r
-\r
-# Manuals\r
-\r
-GSM_MANUALS = $(MAN)/gsm.3 \\r
- $(MAN)/gsm_explode.3 \\r
- $(MAN)/gsm_option.3 \\r
- $(MAN)/gsm_print.3\r
-\r
-TOAST_MANUALS = $(MAN)/toast.1\r
-\r
-MANUALS = $(GSM_MANUALS) $(TOAST_MANUALS) $(MAN)/bitter.1\r
-\r
-# Other stuff in the distribution\r
-\r
-STUFF = ChangeLog \\r
- INSTALL \\r
- MACHINES \\r
- MANIFEST \\r
- Makefile \\r
- README \\r
- $(ADDTST)/add_test.dta \\r
- $(TLS)/bitter.dta \\r
- $(TST)/run\r
-\r
-\r
-# Install targets\r
-\r
-GSM_INSTALL_TARGETS = \\r
- $(GSM_INSTALL_LIB)/libgsm.a \\r
- $(GSM_INSTALL_INC)/gsm.h \\r
- $(GSM_INSTALL_MAN)/gsm.3 \\r
- $(GSM_INSTALL_MAN)/gsm_explode.3 \\r
- $(GSM_INSTALL_MAN)/gsm_option.3 \\r
- $(GSM_INSTALL_MAN)/gsm_print.3\r
-\r
-TOAST_INSTALL_TARGETS = \\r
- $(TOAST_INSTALL_BIN)/toast \\r
- $(TOAST_INSTALL_BIN)/tcat \\r
- $(TOAST_INSTALL_BIN)/untoast \\r
- $(TOAST_INSTALL_MAN)/toast.1\r
-\r
-\r
-# Default rules\r
-\r
-.c.o:\r
- $(CC) $(CFLAGS) $?\r
- @-mv `$(BASENAME) $@` $@ > /dev/null 2>&1\r
-\r
-# Target rules\r
-\r
-all: $(LIBGSM) $(LIBGSMSO) $(TOAST) $(TCAT) $(UNTOAST)\r
- @-echo $(ROOT): Done.\r
-\r
-tst: $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/test-result\r
- @-echo tst: Done.\r
-\r
-addtst: $(ADDTST)/add $(ADDTST)/add_test.dta\r
- $(ADDTST)/add < $(ADDTST)/add_test.dta > /dev/null\r
- @-echo addtst: Done.\r
-\r
-misc: $(TLS)/sweet $(TLS)/bitter $(TLS)/sour $(TLS)/ginger \\r
- $(TST)/lin2txt $(TST)/cod2txt $(TST)/gsm2cod\r
- @-echo misc: Done.\r
-\r
-install: toastinstall gsminstall\r
- @-echo install: Done.\r
-\r
-\r
-# The basic API: libgsm\r
-\r
-$(LIBGSMSO): $(LIB) $(GSM_OBJECTS)\r
- $(LD) -o $@.1.0.10 -shared -Xlinker -soname -Xlinker libgsm.so.1 $(GSM_OBJECTS) -lc\r
- ln -fs libgsm.so.1.0.10 lib/libgsm.so.1\r
- ln -fs libgsm.so.1.0.10 lib/libgsm.so\r
-\r
-$(LIBGSM): $(LIB) $(GSM_OBJECTS)\r
- -rm $(RMFLAGS) $(LIBGSM)\r
- $(AR) $(ARFLAGS) $(LIBGSM) $(GSM_OBJECTS)\r
- $(RANLIB) $(LIBGSM)\r
-\r
-\r
-# Toast, Untoast and Tcat -- the compress-like frontends to gsm.\r
-\r
-$(TOAST): $(BIN) $(TOAST_OBJECTS) $(LIBGSM)\r
- $(LD) $(LFLAGS) -o $(TOAST) $(TOAST_OBJECTS) $(LIBGSMSO) $(LDLIB)\r
-\r
-$(UNTOAST): $(BIN) $(TOAST)\r
- -rm $(RMFLAGS) $(UNTOAST)\r
- $(LN) toast $(UNTOAST)\r
-\r
-$(TCAT): $(BIN) $(TOAST)\r
- -rm $(RMFLAGS) $(TCAT)\r
- $(LN) toast $(TCAT)\r
-\r
-\r
-# The local bin and lib directories\r
-\r
-$(BIN):\r
- if [ ! -d $(BIN) ] ; then mkdir $(BIN) ; fi\r
-\r
-$(LIB):\r
- if [ ! -d $(LIB) ] ; then mkdir $(LIB) ; fi\r
-\r
-\r
-# Installation\r
-\r
-gsminstall:\r
- -if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then \\r
- $(MAKE) $(GSM_INSTALL_TARGETS) ; \\r
- fi\r
-\r
-toastinstall:\r
- -if [ x"$(TOAST_INSTALL_ROOT)" != x ]; then \\r
- $(MAKE) $(TOAST_INSTALL_TARGETS); \\r
- fi\r
-\r
-gsmuninstall:\r
- -if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then \\r
- rm $(RMFLAGS) $(GSM_INSTALL_TARGETS) ; \\r
- fi\r
-\r
-toastuninstall:\r
- -if [ x"$(TOAST_INSTALL_ROOT)" != x ] ; then \\r
- rm $(RMFLAGS) $(TOAST_INSTALL_TARGETS); \\r
- fi\r
-\r
-$(TOAST_INSTALL_BIN)/toast: $(TOAST)\r
- -rm $@\r
- cp $(TOAST) $@\r
- chmod 755 $@\r
-\r
-$(TOAST_INSTALL_BIN)/untoast: $(TOAST_INSTALL_BIN)/toast\r
- -rm $@\r
- ln $? $@\r
-\r
-$(TOAST_INSTALL_BIN)/tcat: $(TOAST_INSTALL_BIN)/toast\r
- -rm $@\r
- ln $? $@\r
-\r
-$(TOAST_INSTALL_MAN)/toast.1: $(MAN)/toast.1\r
- -rm $@\r
- cp $? $@\r
- chmod 444 $@\r
-\r
-$(GSM_INSTALL_MAN)/gsm.3: $(MAN)/gsm.3\r
- -rm $@\r
- cp $? $@\r
- chmod 444 $@\r
-\r
-$(GSM_INSTALL_MAN)/gsm_option.3: $(MAN)/gsm_option.3\r
- -rm $@\r
- cp $? $@\r
- chmod 444 $@\r
-\r
-$(GSM_INSTALL_MAN)/gsm_explode.3: $(MAN)/gsm_explode.3\r
- -rm $@\r
- cp $? $@\r
- chmod 444 $@\r
-\r
-$(GSM_INSTALL_MAN)/gsm_print.3: $(MAN)/gsm_print.3\r
- -rm $@\r
- cp $? $@\r
- chmod 444 $@\r
-\r
-$(GSM_INSTALL_INC)/gsm.h: $(INC)/gsm.h\r
- -rm $@\r
- cp $? $@\r
- chmod 444 $@\r
-\r
-$(GSM_INSTALL_LIB)/libgsm.a: $(LIBGSM)\r
- -rm $@\r
- cp $? $@\r
- chmod 444 $@\r
-\r
-\r
-# Distribution\r
-\r
-dist: gsm-1.0.tar.Z\r
- @echo dist: Done.\r
-\r
-gsm-1.0.tar.Z: $(STUFF) $(SOURCES) $(HEADERS) $(MANUALS)\r
- ( cd $(ROOT)/..; \\r
- tar cvf - `cat $(ROOT)/gsm-1.0/MANIFEST \\r
- | sed '/^#/d'` \\r
- ) | $(COMPRESS) $(COMPRESSFLAGS) > $(ROOT)/gsm-1.0.tar.Z\r
-\r
-# Clean\r
-\r
-uninstall: toastuninstall gsmuninstall\r
- @-echo uninstall: Done.\r
-\r
-semi-clean:\r
- -rm $(RMFLAGS) */*.o \\r
- $(TST)/lin2cod $(TST)/lin2txt \\r
- $(TST)/cod2lin $(TST)/cod2txt \\r
- $(TST)/gsm2cod \\r
- $(TST)/*.*.*\r
- -$(FIND) . \( -name core -o -name foo \) \\r
- -print | xargs rm $(RMFLAGS)\r
-\r
-clean: semi-clean\r
- -rm $(RMFLAGS) $(LIBGSM) $(ADDTST)/add \\r
- $(TOAST) $(TCAT) $(UNTOAST) \\r
- $(ROOT)/gsm-1.0.tar.Z\r
- rm -rf lib\r
-\r
-# Two tools that helped me generate gsm_encode.c and gsm_decode.c,\r
-# but aren't generally needed to port this.\r
-\r
-$(TLS)/sweet: $(TLS)/sweet.o $(TLS)/taste.o\r
- $(LD) $(LFLAGS) -o $(TLS)/sweet \\r
- $(TLS)/sweet.o $(TLS)/taste.o $(LDLIB)\r
-\r
-$(TLS)/bitter: $(TLS)/bitter.o $(TLS)/taste.o\r
- $(LD) $(LFLAGS) -o $(TLS)/bitter \\r
- $(TLS)/bitter.o $(TLS)/taste.o $(LDLIB)\r
-\r
-# A version of the same family that Jeff Chilton used to implement\r
-# the WAV #49 GSM format.\r
-\r
-$(TLS)/ginger: $(TLS)/ginger.o $(TLS)/taste.o\r
- $(LD) $(LFLAGS) -o $(TLS)/ginger \\r
- $(TLS)/ginger.o $(TLS)/taste.o $(LDLIB)\r
-\r
-$(TLS)/sour: $(TLS)/sour.o $(TLS)/taste.o\r
- $(LD) $(LFLAGS) -o $(TLS)/sour \\r
- $(TLS)/sour.o $(TLS)/taste.o $(LDLIB)\r
-\r
-# Run $(ADDTST)/add < $(ADDTST)/add_test.dta to make sure the\r
-# basic arithmetic functions work as intended.\r
-\r
-$(ADDTST)/add: $(ADDTST)/add_test.o\r
- $(LD) $(LFLAGS) -o $(ADDTST)/add $(ADDTST)/add_test.o $(LDLIB)\r
-\r
-\r
-# Various conversion programs between linear, text, .gsm and the code\r
-# format used by the tests we ran (.cod). We paid for the test data,\r
-# so I guess we can't just provide them with this package. Still,\r
-# if you happen to have them lying around, here's the code.\r
-# \r
-# You can use gsm2cod | cod2txt independently to look at what's\r
-# coded inside the compressed frames, although this shouldn't be\r
-# hard to roll on your own using the gsm_print() function from\r
-# the API.\r
-\r
-\r
-$(TST)/test-result: $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/run\r
- ( cd $(TST); ./run ) \r
-\r
-$(TST)/lin2txt: $(TST)/lin2txt.o $(LIBGSM)\r
- $(LD) $(LFLAGS) -o $(TST)/lin2txt \\r
- $(TST)/lin2txt.o $(LIBGSM) $(LDLIB)\r
-\r
-$(TST)/lin2cod: $(TST)/lin2cod.o $(LIBGSM)\r
- $(LD) $(LFLAGS) -o $(TST)/lin2cod \\r
- $(TST)/lin2cod.o $(LIBGSM) $(LDLIB)\r
-\r
-$(TST)/gsm2cod: $(TST)/gsm2cod.o $(LIBGSM)\r
- $(LD) $(LFLAGS) -o $(TST)/gsm2cod \\r
- $(TST)/gsm2cod.o $(LIBGSM) $(LDLIB)\r
-\r
-$(TST)/cod2txt: $(TST)/cod2txt.o $(LIBGSM)\r
- $(LD) $(LFLAGS) -o $(TST)/cod2txt \\r
- $(TST)/cod2txt.o $(LIBGSM) $(LDLIB)\r
-\r
-$(TST)/cod2lin: $(TST)/cod2lin.o $(LIBGSM)\r
- $(LD) $(LFLAGS) -o $(TST)/cod2lin \\r
- $(TST)/cod2lin.o $(LIBGSM) $(LDLIB)\r
+++ /dev/null
-\r
-GSM 06.10 13 kbit/s RPE/LTP speech compression available\r
---------------------------------------------------------\r
-\r
-The Communications and Operating Systems Research Group (KBS) at the\r
-Technische Universitaet Berlin is currently working on a set of\r
-UNIX-based tools for computer-mediated telecooperation that will be\r
-made freely available.\r
-\r
-As part of this effort we are publishing an implementation of the\r
-European GSM 06.10 provisional standard for full-rate speech\r
-transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse\r
-excitation/long term prediction) coding at 13 kbit/s.\r
-\r
-GSM 06.10 compresses frames of 160 13-bit samples (8 kHz sampling\r
-rate, i.e. a frame rate of 50 Hz) into 260 bits; for compatibility\r
-with typical UNIX applications, our implementation turns frames of 160\r
-16-bit linear samples into 33-byte frames (1650 Bytes/s).\r
-The quality of the algorithm is good enough for reliable speaker\r
-recognition; even music often survives transcoding in recognizable \r
-form (given the bandwidth limitations of 8 kHz sampling rate).\r
-\r
-The interfaces offered are a front end modelled after compress(1), and\r
-a library API. Compression and decompression run faster than realtime\r
-on most SPARCstations. The implementation has been verified against the\r
-ETSI standard test patterns.\r
-\r
-Jutta Degener (jutta@cs.tu-berlin.de)\r
-Carsten Bormann (cabo@cs.tu-berlin.de)\r
-\r
-Communications and Operating Systems Research Group, TU Berlin\r
-Fax: +49.30.31425156, Phone: +49.30.31424315\r
-\r
---\r
-Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
-Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
-details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/*$Header$*/\r
-\r
-#ifndef CONFIG_H\r
-#define CONFIG_H\r
-\r
-#if 0\r
-efine SIGHANDLER_T int /* signal handlers are void */\r
-efine HAS_SYSV_SIGNAL 1 /* sigs not blocked/reset? */\r
-#endif\r
-\r
-#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */\r
-#if 0\r
-efine HAS_LIMITS_H 1 /* /usr/include/limits.h */\r
-#endif\r
-#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */\r
-#if 0\r
-efine HAS_ERRNO_DECL 1 /* errno.h declares errno */\r
-#endif\r
-\r
-#define HAS_FSTAT 1 /* fstat syscall */\r
-#define HAS_FCHMOD 1 /* fchmod syscall */\r
-#define HAS_CHMOD 1 /* chmod syscall */\r
-#define HAS_FCHOWN 1 /* fchown syscall */\r
-#define HAS_CHOWN 1 /* chown syscall */\r
-#if 0\r
-efine HAS__FSETMODE 1 /* _fsetmode -- set file mode */\r
-#endif\r
-\r
-#define HAS_STRING_H 1 /* /usr/include/string.h */\r
-#if 0\r
-efine HAS_STRINGS_H 1 /* /usr/include/strings.h */\r
-#endif\r
-\r
-#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */\r
-#define HAS_UTIME 1 /* POSIX utime(path, times) */\r
-#if 0\r
-efine HAS_UTIMES 1 /* use utimes() syscall instead */\r
-#endif\r
-#define HAS_UTIME_H 1 /* UTIME header file */\r
-#if 0\r
-efine HAS_UTIMBUF 1 /* struct utimbuf */\r
-efine HAS_UTIMEUSEC 1 /* microseconds in utimbuf? */\r
-#endif\r
-\r
-#endif /* CONFIG_H */\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/*$Header$*/\r
-\r
-#ifndef GSM_H\r
-#define GSM_H\r
-\r
-#ifdef __cplusplus\r
-# define NeedFunctionPrototypes 1\r
-#endif\r
-\r
-#if __STDC__\r
-# define NeedFunctionPrototypes 1\r
-#endif\r
-\r
-#ifdef _NO_PROTO\r
-# undef NeedFunctionPrototypes\r
-#endif\r
-\r
-#ifdef NeedFunctionPrototypes\r
-# include <stdio.h> /* for FILE * */\r
-#endif\r
-\r
-#undef GSM_P\r
-#if NeedFunctionPrototypes\r
-# define GSM_P( protos ) protos\r
-#else\r
-# define GSM_P( protos ) ( /* protos */ )\r
-#endif\r
-\r
-/*\r
- * Interface\r
- */\r
-\r
-typedef struct gsm_state * gsm;\r
-typedef short gsm_signal; /* signed 16 bit */\r
-typedef unsigned char gsm_byte;\r
-typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */\r
-\r
-#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */\r
-\r
-#define GSM_PATCHLEVEL 10\r
-#define GSM_MINOR 0\r
-#define GSM_MAJOR 1\r
-\r
-#define GSM_OPT_VERBOSE 1\r
-#define GSM_OPT_FAST 2\r
-#define GSM_OPT_LTP_CUT 3\r
-#define GSM_OPT_WAV49 4\r
-#define GSM_OPT_FRAME_INDEX 5\r
-#define GSM_OPT_FRAME_CHAIN 6\r
-\r
-extern gsm gsm_create GSM_P((void));\r
-extern void gsm_destroy GSM_P((gsm)); \r
-\r
-extern int gsm_print GSM_P((FILE *, gsm, gsm_byte *));\r
-extern int gsm_option GSM_P((gsm, int, int *));\r
-\r
-extern void gsm_encode GSM_P((gsm, gsm_signal *, gsm_byte *));\r
-extern int gsm_decode GSM_P((gsm, gsm_byte *, gsm_signal *));\r
-\r
-extern int gsm_explode GSM_P((gsm, gsm_byte *, gsm_signal *));\r
-extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte *));\r
-\r
-#undef GSM_P\r
-\r
-#endif /* GSM_H */\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/*$Header$*/\r
-\r
-#ifndef PRIVATE_H\r
-#define PRIVATE_H\r
-\r
-typedef short word; /* 16 bit signed int */\r
-typedef long longword; /* 32 bit signed int */\r
-\r
-typedef unsigned short uword; /* unsigned word */\r
-typedef unsigned long ulongword; /* unsigned longword */\r
-\r
-struct gsm_state {\r
-\r
- word dp0[ 280 ];\r
-\r
- word z1; /* preprocessing.c, Offset_com. */\r
- longword L_z2; /* Offset_com. */\r
- int mp; /* Preemphasis */\r
-\r
- word u[8]; /* short_term_aly_filter.c */\r
- word LARpp[2][8]; /* */\r
- word j; /* */\r
-\r
- word ltp_cut; /* long_term.c, LTP crosscorr. */\r
- word nrp; /* 40 */ /* long_term.c, synthesis */\r
- word v[9]; /* short_term.c, synthesis */\r
- word msr; /* decoder.c, Postprocessing */\r
-\r
- char verbose; /* only used if !NDEBUG */\r
- char fast; /* only used if FAST */\r
-\r
- char wav_fmt; /* only used if WAV49 defined */\r
- unsigned char frame_index; /* odd/even chaining */\r
- unsigned char frame_chain; /* half-byte to carry forward */\r
-};\r
-\r
-\r
-#define MIN_WORD (-32767 - 1)\r
-#define MAX_WORD 32767\r
-\r
-#define MIN_LONGWORD (-2147483647 - 1)\r
-#define MAX_LONGWORD 2147483647\r
-\r
-#ifdef SASR /* flag: >> is a signed arithmetic shift right */\r
-#undef SASR\r
-#define SASR(x, by) ((x) >> (by))\r
-#else\r
-#define SASR(x, by) ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by))))\r
-#endif /* SASR */\r
-\r
-#include "proto.h"\r
-\r
-/*\r
- * Prototypes from add.c\r
- */\r
-extern word gsm_mult P((word a, word b));\r
-extern longword gsm_L_mult P((word a, word b));\r
-extern word gsm_mult_r P((word a, word b));\r
-\r
-extern word gsm_div P((word num, word denum));\r
-\r
-extern word gsm_add P(( word a, word b ));\r
-extern longword gsm_L_add P(( longword a, longword b ));\r
-\r
-extern word gsm_sub P((word a, word b));\r
-extern longword gsm_L_sub P((longword a, longword b));\r
-\r
-extern word gsm_abs P((word a));\r
-\r
-extern word gsm_norm P(( longword a ));\r
-\r
-extern longword gsm_L_asl P((longword a, int n));\r
-extern word gsm_asl P((word a, int n));\r
-\r
-extern longword gsm_L_asr P((longword a, int n));\r
-extern word gsm_asr P((word a, int n));\r
-\r
-/*\r
- * Inlined functions from add.h \r
- */\r
-\r
-/* \r
- * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *) \\r
- * (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15))\r
- */\r
-#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \\r
- (SASR( ((longword)(a) * (longword)(b) + 16384), 15 ))\r
-\r
-# define GSM_MULT(a,b) /* word a, word b, !(a == b == MIN_WORD) */ \\r
- (SASR( ((longword)(a) * (longword)(b)), 15 ))\r
-\r
-# define GSM_L_MULT(a, b) /* word a, word b */ \\r
- (((longword)(a) * (longword)(b)) << 1)\r
-\r
-#if defined(__GNUC__) && defined(__i386__)\r
-\r
-static __inline__ int GSM_L_ADD(int a, int b)\r
-{\r
- __asm__ __volatile__(\r
- \r
- "addl %2,%0; jno 0f; movl $0x7fffffff,%0; adcl $0,%0; 0:"\r
- : "=r" (a)\r
- : "0" (a), "ir" (b)\r
- : "cc"\r
- );\r
- return(a);\r
-}\r
-\r
-static __inline__ short GSM_ADD(short a, short b)\r
-{\r
- __asm__ __volatile__(\r
- "addw %2,%0; jno 0f; movw $0x7fff,%0; adcw $0,%0; 0:"\r
- : "=r" (a)\r
- : "0" (a), "ir" (b)\r
- : "cc"\r
- );\r
- return(a);\r
-}\r
-\r
-static __inline__ short GSM_SUB(short a, short b)\r
-{\r
- __asm__ __volatile__(\r
- "subw %2,%0; jno 0f; movw $0x7fff,%0; adcw $0,%0; 0:"\r
- : "=r" (a)\r
- : "0" (a), "ir" (b)\r
- : "cc"\r
- );\r
- return(a);\r
-}\r
-\r
-#else\r
-\r
-# define GSM_L_ADD(a, b) \\r
- ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \\r
- : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \\r
- >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \\r
- : ((b) <= 0 ? (a) + (b) \\r
- : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \\r
- ? MAX_LONGWORD : utmp))\r
-\r
-/*\r
- * # define GSM_ADD(a, b) \\r
- * ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \\r
- * ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)\r
- */\r
-/* Nonportable, but faster: */\r
-\r
-# define GSM_ADD(a, b) ({ \\r
- register longword ltmp; \\r
- ltmp = (longword) (a) + (longword) (b); \\r
- ((ulongword) (ltmp - MIN_WORD) > MAX_WORD - MIN_WORD ? \\r
- (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp); \\r
- })\r
-\r
-#define GSM_SUB(a, b) ({ \\r
- register longword ltmp; \\r
- ltmp = (longword) (a) - (longword) (b); \\r
- (ltmp >= MAX_WORD ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp); \\r
- })\r
-\r
-#endif\r
-\r
-# define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))\r
-\r
-/* Use these if necessary:\r
-\r
-# define GSM_MULT_R(a, b) gsm_mult_r(a, b)\r
-# define GSM_MULT(a, b) gsm_mult(a, b)\r
-# define GSM_L_MULT(a, b) gsm_L_mult(a, b)\r
-\r
-# define GSM_L_ADD(a, b) gsm_L_add(a, b)\r
-# define GSM_ADD(a, b) gsm_add(a, b)\r
-# define GSM_SUB(a, b) gsm_sub(a, b)\r
-\r
-# define GSM_ABS(a) gsm_abs(a)\r
-\r
-*/\r
-\r
-/*\r
- * More prototypes from implementations..\r
- */\r
-extern void Gsm_Coder P((\r
- struct gsm_state * S,\r
- word * s, /* [0..159] samples IN */\r
- word * LARc, /* [0..7] LAR coefficients OUT */\r
- word * Nc, /* [0..3] LTP lag OUT */\r
- word * bc, /* [0..3] coded LTP gain OUT */\r
- word * Mc, /* [0..3] RPE grid selection OUT */\r
- word * xmaxc,/* [0..3] Coded maximum amplitude OUT */\r
- word * xMc /* [13*4] normalized RPE samples OUT */));\r
-\r
-extern void Gsm_Long_Term_Predictor P(( /* 4x for 160 samples */\r
- struct gsm_state * S,\r
- word * d, /* [0..39] residual signal IN */\r
- word * dp, /* [-120..-1] d' IN */\r
- word * e, /* [0..40] OUT */\r
- word * dpp, /* [0..40] OUT */\r
- word * Nc, /* correlation lag OUT */\r
- word * bc /* gain factor OUT */));\r
-\r
-extern void Gsm_LPC_Analysis P((\r
- struct gsm_state * S,\r
- word * s, /* 0..159 signals IN/OUT */\r
- word * LARc)); /* 0..7 LARc's OUT */\r
-\r
-extern void Gsm_Preprocess P((\r
- struct gsm_state * S,\r
- word * s, word * so));\r
-\r
-extern void Gsm_Encoding P((\r
- struct gsm_state * S,\r
- word * e, \r
- word * ep, \r
- word * xmaxc,\r
- word * Mc, \r
- word * xMc));\r
-\r
-extern void Gsm_Short_Term_Analysis_Filter P((\r
- struct gsm_state * S,\r
- word * LARc, /* coded log area ratio [0..7] IN */\r
- word * d /* st res. signal [0..159] IN/OUT */));\r
-\r
-extern void Gsm_Decoder P((\r
- struct gsm_state * S,\r
- word * LARcr, /* [0..7] IN */\r
- word * Ncr, /* [0..3] IN */\r
- word * bcr, /* [0..3] IN */\r
- word * Mcr, /* [0..3] IN */\r
- word * xmaxcr, /* [0..3] IN */\r
- word * xMcr, /* [0..13*4] IN */\r
- word * s)); /* [0..159] OUT */\r
-\r
-extern void Gsm_Decoding P((\r
- struct gsm_state * S,\r
- word xmaxcr,\r
- word Mcr,\r
- word * xMcr, /* [0..12] IN */\r
- word * erp)); /* [0..39] OUT */\r
-\r
-extern void Gsm_Long_Term_Synthesis_Filtering P((\r
- struct gsm_state* S,\r
- word Ncr,\r
- word bcr,\r
- word * erp, /* [0..39] IN */\r
- word * drp)); /* [-120..-1] IN, [0..40] OUT */\r
-\r
-void Gsm_RPE_Decoding P((\r
- struct gsm_state *S,\r
- word xmaxcr,\r
- word Mcr,\r
- word * xMcr, /* [0..12], 3 bits IN */\r
- word * erp)); /* [0..39] OUT */\r
-\r
-void Gsm_RPE_Encoding P((\r
- struct gsm_state * S,\r
- word * e, /* -5..-1][0..39][40..44 IN/OUT */\r
- word * xmaxc, /* OUT */\r
- word * Mc, /* OUT */\r
- word * xMc)); /* [0..12] OUT */\r
-\r
-extern void Gsm_Short_Term_Synthesis_Filter P((\r
- struct gsm_state * S,\r
- word * LARcr, /* log area ratios [0..7] IN */\r
- word * drp, /* received d [0...39] IN */\r
- word * s)); /* signal s [0..159] OUT */\r
-\r
-extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((\r
- word * dpp, /* [0...39] IN */\r
- word * ep, /* [0...39] IN */\r
- word * dp)); /* [-120...-1] IN/OUT */\r
-\r
-/*\r
- * Tables from table.c\r
- */\r
-#ifndef GSM_TABLE_C\r
-\r
-extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8];\r
-extern word gsm_INVA[8];\r
-extern word gsm_DLB[4], gsm_QLB[4];\r
-extern word gsm_H[11];\r
-extern word gsm_NRFAC[8];\r
-extern word gsm_FAC[8];\r
-\r
-#endif /* GSM_TABLE_C */\r
-\r
-/*\r
- * Debugging\r
- */\r
-#ifdef NDEBUG\r
-\r
-# define gsm_debug_words(a, b, c, d) /* nil */\r
-# define gsm_debug_longwords(a, b, c, d) /* nil */\r
-# define gsm_debug_word(a, b) /* nil */\r
-# define gsm_debug_longword(a, b) /* nil */\r
-\r
-#else /* !NDEBUG => DEBUG */\r
-\r
- extern void gsm_debug_words P((char * name, int, int, word *));\r
- extern void gsm_debug_longwords P((char * name, int, int, longword *));\r
- extern void gsm_debug_longword P((char * name, longword));\r
- extern void gsm_debug_word P((char * name, word));\r
-\r
-#endif /* !NDEBUG */\r
-\r
-#include "unproto.h"\r
-\r
-#endif /* PRIVATE_H */\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/*$Header$*/\r
-\r
-#ifndef PROTO_H\r
-#define PROTO_H\r
-\r
-#if __cplusplus\r
-# define NeedFunctionPrototypes 1\r
-#endif\r
-\r
-#if __STDC__\r
-# define NeedFunctionPrototypes 1\r
-#endif\r
-\r
-#ifdef _NO_PROTO\r
-# undef NeedFunctionPrototypes\r
-#endif\r
-\r
-#undef P /* gnu stdio.h actually defines this... */\r
-#undef P0\r
-#undef P1\r
-#undef P2\r
-#undef P3\r
-#undef P4\r
-#undef P5\r
-#undef P6\r
-#undef P7\r
-#undef P8\r
-\r
-#if NeedFunctionPrototypes\r
-\r
-# define P( protos ) protos\r
-\r
-# define P0() (void)\r
-# define P1(x, a) (a)\r
-# define P2(x, a, b) (a, b)\r
-# define P3(x, a, b, c) (a, b, c)\r
-# define P4(x, a, b, c, d) (a, b, c, d) \r
-# define P5(x, a, b, c, d, e) (a, b, c, d, e)\r
-# define P6(x, a, b, c, d, e, f) (a, b, c, d, e, f)\r
-# define P7(x, a, b, c, d, e, f, g) (a, b, c, d, e, f, g)\r
-# define P8(x, a, b, c, d, e, f, g, h) (a, b, c, d, e, f, g, h)\r
-\r
-#else /* !NeedFunctionPrototypes */\r
-\r
-# define P( protos ) ( /* protos */ )\r
-\r
-# define P0() ()\r
-# define P1(x, a) x a;\r
-# define P2(x, a, b) x a; b;\r
-# define P3(x, a, b, c) x a; b; c;\r
-# define P4(x, a, b, c, d) x a; b; c; d;\r
-# define P5(x, a, b, c, d, e) x a; b; c; d; e;\r
-# define P6(x, a, b, c, d, e, f) x a; b; c; d; e; f;\r
-# define P7(x, a, b, c, d, e, f, g) x a; b; c; d; e; f; g;\r
-# define P8(x, a, b, c, d, e, f, g, h) x a; b; c; d; e; f; g; h;\r
-\r
-#endif /* !NeedFunctionPrototypes */\r
-\r
-#endif /* PROTO_H */\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/*$Header$*/\r
-\r
-#ifdef PROTO_H /* sic */\r
-#undef PROTO_H\r
-\r
-#undef P\r
-#undef P0\r
-#undef P1\r
-#undef P2\r
-#undef P3\r
-#undef P4\r
-#undef P5\r
-#undef P6\r
-#undef P7\r
-#undef P8\r
-\r
-#endif /* PROTO_H */\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-/*\r
- * See private.h for the more commonly used macro versions.\r
- */\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-#define saturate(x) \\r
- ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))\r
-\r
-word gsm_add P2((a,b), word a, word b)\r
-{\r
- longword sum = (longword)a + (longword)b;\r
- return saturate(sum);\r
-}\r
-\r
-word gsm_sub P2((a,b), word a, word b)\r
-{\r
- longword diff = (longword)a - (longword)b;\r
- return saturate(diff);\r
-}\r
-\r
-word gsm_mult P2((a,b), word a, word b)\r
-{\r
- if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;\r
- else return SASR( (longword)a * (longword)b, 15 );\r
-}\r
-\r
-word gsm_mult_r P2((a,b), word a, word b)\r
-{\r
- if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;\r
- else {\r
- longword prod = (longword)a * (longword)b + 16384;\r
- prod >>= 15;\r
- return prod & 0xFFFF;\r
- }\r
-}\r
-\r
-word gsm_abs P1((a), word a)\r
-{\r
- return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;\r
-}\r
-\r
-longword gsm_L_mult P2((a,b),word a, word b)\r
-{\r
- assert( a != MIN_WORD || b != MIN_WORD );\r
- return ((longword)a * (longword)b) << 1;\r
-}\r
-\r
-longword gsm_L_add P2((a,b), longword a, longword b)\r
-{\r
- if (a < 0) {\r
- if (b >= 0) return a + b;\r
- else {\r
- ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);\r
- return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;\r
- }\r
- }\r
- else if (b <= 0) return a + b;\r
- else {\r
- ulongword A = (ulongword)a + (ulongword)b;\r
- return A > MAX_LONGWORD ? MAX_LONGWORD : A;\r
- }\r
-}\r
-\r
-longword gsm_L_sub P2((a,b), longword a, longword b)\r
-{\r
- if (a >= 0) {\r
- if (b >= 0) return a - b;\r
- else {\r
- /* a>=0, b<0 */\r
-\r
- ulongword A = (ulongword)a + -(b + 1);\r
- return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);\r
- }\r
- }\r
- else if (b <= 0) return a - b;\r
- else {\r
- /* a<0, b>0 */ \r
-\r
- ulongword A = (ulongword)-(a + 1) + b;\r
- return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;\r
- }\r
-}\r
-\r
-static unsigned char const bitoff[ 256 ] = {\r
- 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,\r
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\r
-};\r
-\r
-word gsm_norm P1((a), longword a )\r
-/*\r
- * the number of left shifts needed to normalize the 32 bit\r
- * variable L_var1 for positive values on the interval\r
- *\r
- * with minimum of\r
- * minimum of 1073741824 (01000000000000000000000000000000) and \r
- * maximum of 2147483647 (01111111111111111111111111111111)\r
- *\r
- *\r
- * and for negative values on the interval with\r
- * minimum of -2147483648 (-10000000000000000000000000000000) and\r
- * maximum of -1073741824 ( -1000000000000000000000000000000).\r
- *\r
- * in order to normalize the result, the following\r
- * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );\r
- *\r
- * (That's 'ffs', only from the left, not the right..)\r
- */\r
-{\r
- assert(a != 0);\r
-\r
- if (a < 0) {\r
- if (a <= -1073741824) return 0;\r
- a = ~a;\r
- }\r
-\r
- return a & 0xffff0000 \r
- ? ( a & 0xff000000\r
- ? -1 + bitoff[ 0xFF & (a >> 24) ]\r
- : 7 + bitoff[ 0xFF & (a >> 16) ] )\r
- : ( a & 0xff00\r
- ? 15 + bitoff[ 0xFF & (a >> 8) ]\r
- : 23 + bitoff[ 0xFF & a ] );\r
-}\r
-\r
-longword gsm_L_asl P2((a,n), longword a, int n)\r
-{\r
- if (n >= 32) return 0;\r
- if (n <= -32) return -(a < 0);\r
- if (n < 0) return gsm_L_asr(a, -n);\r
- return a << n;\r
-}\r
-\r
-word gsm_asl P2((a,n), word a, int n)\r
-{\r
- if (n >= 16) return 0;\r
- if (n <= -16) return -(a < 0);\r
- if (n < 0) return gsm_asr(a, -n);\r
- return a << n;\r
-}\r
-\r
-longword gsm_L_asr P2((a,n), longword a, int n)\r
-{\r
- if (n >= 32) return -(a < 0);\r
- if (n <= -32) return 0;\r
- if (n < 0) return a << -n;\r
-\r
-# ifdef SASR\r
- return a >> n;\r
-# else\r
- if (a >= 0) return a >> n;\r
- else return -(longword)( -(ulongword)a >> n );\r
-# endif\r
-}\r
-\r
-word gsm_asr P2((a,n), word a, int n)\r
-{\r
- if (n >= 16) return -(a < 0);\r
- if (n <= -16) return 0;\r
- if (n < 0) return a << -n;\r
-\r
-# ifdef SASR\r
- return a >> n;\r
-# else\r
- if (a >= 0) return a >> n;\r
- else return -(word)( -(uword)a >> n );\r
-# endif\r
-}\r
-\r
-/* \r
- * (From p. 46, end of section 4.2.5)\r
- *\r
- * NOTE: The following lines gives [sic] one correct implementation\r
- * of the div(num, denum) arithmetic operation. Compute div\r
- * which is the integer division of num by denum: with denum\r
- * >= num > 0\r
- */\r
-\r
-word gsm_div P2((num,denum), word num, word denum)\r
-{\r
- longword L_num = num;\r
- longword L_denum = denum;\r
- word div = 0;\r
- int k = 15;\r
-\r
- /* The parameter num sometimes becomes zero.\r
- * Although this is explicitly guarded against in 4.2.5,\r
- * we assume that the result should then be zero as well.\r
- */\r
-\r
- /* assert(num != 0); */\r
-\r
- assert(num >= 0 && denum >= num);\r
- if (num == 0)\r
- return 0;\r
-\r
- while (k--) {\r
- div <<= 1;\r
- L_num <<= 1;\r
-\r
- if (L_num >= L_denum) {\r
- L_num -= L_denum;\r
- div++;\r
- }\r
- }\r
-\r
- return div;\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "config.h"\r
-\r
-#ifdef HAS_STRING_H\r
-#include <string.h>\r
-#else\r
-# include "proto.h"\r
- extern char * memcpy P((char *, char *, int));\r
-#endif\r
-\r
-#include "private.h"\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-/* \r
- * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER \r
- */\r
-\r
-void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),\r
-\r
- struct gsm_state * S,\r
-\r
- word * s, /* [0..159] samples IN */\r
-\r
-/*\r
- * The RPE-LTD coder works on a frame by frame basis. The length of\r
- * the frame is equal to 160 samples. Some computations are done\r
- * once per frame to produce at the output of the coder the\r
- * LARc[1..8] parameters which are the coded LAR coefficients and \r
- * also to realize the inverse filtering operation for the entire\r
- * frame (160 samples of signal d[0..159]). These parts produce at\r
- * the output of the coder:\r
- */\r
-\r
- word * LARc, /* [0..7] LAR coefficients OUT */\r
-\r
-/*\r
- * Procedure 4.2.11 to 4.2.18 are to be executed four times per\r
- * frame. That means once for each sub-segment RPE-LTP analysis of\r
- * 40 samples. These parts produce at the output of the coder:\r
- */\r
-\r
- word * Nc, /* [0..3] LTP lag OUT */\r
- word * bc, /* [0..3] coded LTP gain OUT */\r
- word * Mc, /* [0..3] RPE grid selection OUT */\r
- word * xmaxc,/* [0..3] Coded maximum amplitude OUT */\r
- word * xMc /* [13*4] normalized RPE samples OUT */\r
-)\r
-{\r
- int k;\r
- word * dp = S->dp0 + 120; /* [ -120...-1 ] */\r
- word * dpp = dp; /* [ 0...39 ] */\r
-\r
- static word e[50];\r
-\r
- word so[160];\r
-\r
-#if !(defined(__GNUC__) && defined(__i386__))\r
- longword ltmp;\r
-#endif\r
-\r
- Gsm_Preprocess (S, s, so);\r
- Gsm_LPC_Analysis (S, so, LARc);\r
- Gsm_Short_Term_Analysis_Filter (S, LARc, so);\r
-\r
- for (k = 0; k <= 3; k++, xMc += 13) {\r
-\r
- Gsm_Long_Term_Predictor ( S,\r
- so+k*40, /* d [0..39] IN */\r
- dp, /* dp [-120..-1] IN */\r
- e + 5, /* e [0..39] OUT */\r
- dpp, /* dpp [0..39] OUT */\r
- Nc++,\r
- bc++);\r
-\r
- Gsm_RPE_Encoding ( S,\r
- e + 5, /* e ][0..39][ IN/OUT */\r
- xmaxc++, Mc++, xMc );\r
- /*\r
- * Gsm_Update_of_reconstructed_short_time_residual_signal\r
- * ( dpp, e + 5, dp );\r
- */\r
-\r
- { register int i;\r
- for (i = 0; i <= 39; i++)\r
- dp[ i ] = GSM_ADD( e[5 + i], dpp[i] );\r
- }\r
- dp += 40;\r
- dpp += 40;\r
-\r
- }\r
- (void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),\r
- 120 * sizeof(*S->dp0) );\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "private.h"\r
-\r
-#ifndef NDEBUG\r
-\r
-/* If NDEBUG _is_ defined and no debugging should be performed,\r
- * calls to functions in this module are #defined to nothing\r
- * in private.h.\r
- */\r
-\r
-#include <stdio.h>\r
-#include "proto.h"\r
-\r
-void gsm_debug_words P4( (name, from, to, ptr), \r
- char * name,\r
- int from,\r
- int to,\r
- word * ptr)\r
-{\r
- int nprinted = 0;\r
-\r
- fprintf( stderr, "%s [%d .. %d]: ", name, from, to );\r
- while (from <= to) {\r
- fprintf(stderr, "%d ", ptr[ from ] );\r
- from++;\r
- if (nprinted++ >= 7) {\r
- nprinted = 0;\r
- if (from < to) putc('\n', stderr);\r
- }\r
- }\r
- putc('\n', stderr);\r
-}\r
-\r
-void gsm_debug_longwords P4( (name, from, to, ptr),\r
- char * name,\r
- int from,\r
- int to,\r
- longword * ptr)\r
-{\r
- int nprinted = 0;\r
-\r
- fprintf( stderr, "%s [%d .. %d]: ", name, from, to );\r
- while (from <= to) {\r
-\r
- fprintf(stderr, "%d ", ptr[ from ] );\r
- from++;\r
- if (nprinted++ >= 7) {\r
- nprinted = 0;\r
- if (from < to) putc('\n', stderr);\r
- }\r
- }\r
- putc('\n', stderr);\r
-}\r
-\r
-void gsm_debug_longword P2( (name, value),\r
- char * name,\r
- longword value )\r
-{\r
- fprintf(stderr, "%s: %d\n", name, (long)value );\r
-}\r
-\r
-void gsm_debug_word P2( (name, value),\r
- char * name,\r
- word value )\r
-{\r
- fprintf(stderr, "%s: %d\n", name, (long)value);\r
-}\r
-\r
-#endif\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include <stdio.h>\r
-\r
-#include "private.h"\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-/*\r
- * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER\r
- */\r
-\r
-static void Postprocessing P2((S,s),\r
- struct gsm_state * S,\r
- register word * s)\r
-{\r
- register int k;\r
- register word msr = S->msr;\r
- register word tmp;\r
-\r
- for (k = 160; k--; s++) {\r
- tmp = GSM_MULT_R( msr, 28180 );\r
- msr = GSM_ADD(*s, tmp); /* Deemphasis */\r
- *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */\r
- }\r
- S->msr = msr;\r
-}\r
-\r
-void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s),\r
- struct gsm_state * S,\r
-\r
- word * LARcr, /* [0..7] IN */\r
-\r
- word * Ncr, /* [0..3] IN */\r
- word * bcr, /* [0..3] IN */\r
- word * Mcr, /* [0..3] IN */\r
- word * xmaxcr, /* [0..3] IN */\r
- word * xMcr, /* [0..13*4] IN */\r
-\r
- word * s) /* [0..159] OUT */\r
-{\r
- int j, k;\r
- word erp[40], wt[160];\r
- word * drp = S->dp0 + 120;\r
-\r
- for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {\r
-\r
- Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp );\r
- Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );\r
-\r
- for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ];\r
- }\r
-\r
- Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );\r
- Postprocessing(S, s);\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-static char const ident[] = "$Header$";\r
-\r
-#include "config.h"\r
-\r
-#ifdef HAS_STRING_H\r
-#include <string.h>\r
-#else\r
-# include "proto.h"\r
- extern char * memset P((char *, int, int));\r
-#endif\r
-\r
-#ifdef HAS_STDLIB_H\r
-# include <stdlib.h>\r
-#else\r
-# ifdef HAS_MALLOC_H\r
-# include <malloc.h>\r
-# else\r
- extern char * malloc();\r
-# endif\r
-#endif\r
-\r
-#include <stdio.h>\r
-\r
-#include "gsm.h"\r
-#include "private.h"\r
-#include "proto.h"\r
-\r
-gsm gsm_create P0()\r
-{\r
- gsm r;\r
-\r
- r = (gsm)malloc(sizeof(struct gsm_state));\r
- if (!r) return r;\r
-\r
- memset((char *)r, 0, sizeof(*r));\r
- r->nrp = 40;\r
-\r
- return r;\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)\r
-{\r
- word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];\r
-\r
-#ifdef WAV49\r
- if (s->wav_fmt) {\r
-\r
- uword sr = 0;\r
-\r
- s->frame_index = !s->frame_index;\r
- if (s->frame_index) {\r
-\r
- sr = *c++;\r
- LARc[0] = sr & 0x3f; sr >>= 6;\r
- sr |= (uword)*c++ << 2;\r
- LARc[1] = sr & 0x3f; sr >>= 6;\r
- sr |= (uword)*c++ << 4;\r
- LARc[2] = sr & 0x1f; sr >>= 5;\r
- LARc[3] = sr & 0x1f; sr >>= 5;\r
- sr |= (uword)*c++ << 2;\r
- LARc[4] = sr & 0xf; sr >>= 4;\r
- LARc[5] = sr & 0xf; sr >>= 4;\r
- sr |= (uword)*c++ << 2; /* 5 */\r
- LARc[6] = sr & 0x7; sr >>= 3;\r
- LARc[7] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[0] = sr & 0x7f; sr >>= 7;\r
- bc[0] = sr & 0x3; sr >>= 2;\r
- Mc[0] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[0] = sr & 0x3f; sr >>= 6;\r
- xmc[0] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[1] = sr & 0x7; sr >>= 3;\r
- xmc[2] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[3] = sr & 0x7; sr >>= 3;\r
- xmc[4] = sr & 0x7; sr >>= 3;\r
- xmc[5] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 10 */\r
- xmc[6] = sr & 0x7; sr >>= 3;\r
- xmc[7] = sr & 0x7; sr >>= 3;\r
- xmc[8] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[9] = sr & 0x7; sr >>= 3;\r
- xmc[10] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[11] = sr & 0x7; sr >>= 3;\r
- xmc[12] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[1] = sr & 0x7f; sr >>= 7;\r
- bc[1] = sr & 0x3; sr >>= 2;\r
- Mc[1] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[1] = sr & 0x3f; sr >>= 6;\r
- xmc[13] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 15 */\r
- xmc[14] = sr & 0x7; sr >>= 3;\r
- xmc[15] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[16] = sr & 0x7; sr >>= 3;\r
- xmc[17] = sr & 0x7; sr >>= 3;\r
- xmc[18] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[19] = sr & 0x7; sr >>= 3;\r
- xmc[20] = sr & 0x7; sr >>= 3;\r
- xmc[21] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[22] = sr & 0x7; sr >>= 3;\r
- xmc[23] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[24] = sr & 0x7; sr >>= 3;\r
- xmc[25] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4; /* 20 */\r
- Nc[2] = sr & 0x7f; sr >>= 7;\r
- bc[2] = sr & 0x3; sr >>= 2;\r
- Mc[2] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[2] = sr & 0x3f; sr >>= 6;\r
- xmc[26] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[27] = sr & 0x7; sr >>= 3;\r
- xmc[28] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[29] = sr & 0x7; sr >>= 3;\r
- xmc[30] = sr & 0x7; sr >>= 3;\r
- xmc[31] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[32] = sr & 0x7; sr >>= 3;\r
- xmc[33] = sr & 0x7; sr >>= 3;\r
- xmc[34] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 25 */\r
- xmc[35] = sr & 0x7; sr >>= 3;\r
- xmc[36] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[37] = sr & 0x7; sr >>= 3;\r
- xmc[38] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[3] = sr & 0x7f; sr >>= 7;\r
- bc[3] = sr & 0x3; sr >>= 2;\r
- Mc[3] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[3] = sr & 0x3f; sr >>= 6;\r
- xmc[39] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[40] = sr & 0x7; sr >>= 3;\r
- xmc[41] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2; /* 30 */\r
- xmc[42] = sr & 0x7; sr >>= 3;\r
- xmc[43] = sr & 0x7; sr >>= 3;\r
- xmc[44] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[45] = sr & 0x7; sr >>= 3;\r
- xmc[46] = sr & 0x7; sr >>= 3;\r
- xmc[47] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[48] = sr & 0x7; sr >>= 3;\r
- xmc[49] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[50] = sr & 0x7; sr >>= 3;\r
- xmc[51] = sr & 0x7; sr >>= 3;\r
-\r
- s->frame_chain = sr & 0xf;\r
- }\r
- else {\r
- sr = s->frame_chain;\r
- sr |= (uword)*c++ << 4; /* 1 */\r
- LARc[0] = sr & 0x3f; sr >>= 6;\r
- LARc[1] = sr & 0x3f; sr >>= 6;\r
- sr = *c++;\r
- LARc[2] = sr & 0x1f; sr >>= 5;\r
- sr |= (uword)*c++ << 3;\r
- LARc[3] = sr & 0x1f; sr >>= 5;\r
- LARc[4] = sr & 0xf; sr >>= 4;\r
- sr |= (uword)*c++ << 2;\r
- LARc[5] = sr & 0xf; sr >>= 4;\r
- LARc[6] = sr & 0x7; sr >>= 3;\r
- LARc[7] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 5 */\r
- Nc[0] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1;\r
- bc[0] = sr & 0x3; sr >>= 2;\r
- Mc[0] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[0] = sr & 0x3f; sr >>= 6;\r
- xmc[0] = sr & 0x7; sr >>= 3;\r
- xmc[1] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[2] = sr & 0x7; sr >>= 3;\r
- xmc[3] = sr & 0x7; sr >>= 3;\r
- xmc[4] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[5] = sr & 0x7; sr >>= 3;\r
- xmc[6] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2; /* 10 */\r
- xmc[7] = sr & 0x7; sr >>= 3;\r
- xmc[8] = sr & 0x7; sr >>= 3;\r
- xmc[9] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[10] = sr & 0x7; sr >>= 3;\r
- xmc[11] = sr & 0x7; sr >>= 3;\r
- xmc[12] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[1] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1;\r
- bc[1] = sr & 0x3; sr >>= 2;\r
- Mc[1] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[1] = sr & 0x3f; sr >>= 6;\r
- xmc[13] = sr & 0x7; sr >>= 3;\r
- xmc[14] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 15 */\r
- xmc[15] = sr & 0x7; sr >>= 3;\r
- xmc[16] = sr & 0x7; sr >>= 3;\r
- xmc[17] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[18] = sr & 0x7; sr >>= 3;\r
- xmc[19] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[20] = sr & 0x7; sr >>= 3;\r
- xmc[21] = sr & 0x7; sr >>= 3;\r
- xmc[22] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[23] = sr & 0x7; sr >>= 3;\r
- xmc[24] = sr & 0x7; sr >>= 3;\r
- xmc[25] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[2] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1; /* 20 */\r
- bc[2] = sr & 0x3; sr >>= 2;\r
- Mc[2] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[2] = sr & 0x3f; sr >>= 6;\r
- xmc[26] = sr & 0x7; sr >>= 3;\r
- xmc[27] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; \r
- xmc[28] = sr & 0x7; sr >>= 3;\r
- xmc[29] = sr & 0x7; sr >>= 3;\r
- xmc[30] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[31] = sr & 0x7; sr >>= 3;\r
- xmc[32] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[33] = sr & 0x7; sr >>= 3;\r
- xmc[34] = sr & 0x7; sr >>= 3;\r
- xmc[35] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 25 */\r
- xmc[36] = sr & 0x7; sr >>= 3;\r
- xmc[37] = sr & 0x7; sr >>= 3;\r
- xmc[38] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[3] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1; \r
- bc[3] = sr & 0x3; sr >>= 2;\r
- Mc[3] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[3] = sr & 0x3f; sr >>= 6;\r
- xmc[39] = sr & 0x7; sr >>= 3;\r
- xmc[40] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[41] = sr & 0x7; sr >>= 3;\r
- xmc[42] = sr & 0x7; sr >>= 3;\r
- xmc[43] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 30 */\r
- xmc[44] = sr & 0x7; sr >>= 3;\r
- xmc[45] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[46] = sr & 0x7; sr >>= 3;\r
- xmc[47] = sr & 0x7; sr >>= 3;\r
- xmc[48] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[49] = sr & 0x7; sr >>= 3;\r
- xmc[50] = sr & 0x7; sr >>= 3;\r
- xmc[51] = sr & 0x7; sr >>= 3;\r
- }\r
- }\r
- else\r
-#endif\r
- {\r
- /* GSM_MAGIC = (*c >> 4) & 0xF; */\r
-\r
- if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;\r
-\r
- LARc[0] = (*c++ & 0xF) << 2; /* 1 */\r
- LARc[0] |= (*c >> 6) & 0x3;\r
- LARc[1] = *c++ & 0x3F;\r
- LARc[2] = (*c >> 3) & 0x1F;\r
- LARc[3] = (*c++ & 0x7) << 2;\r
- LARc[3] |= (*c >> 6) & 0x3;\r
- LARc[4] = (*c >> 2) & 0xF;\r
- LARc[5] = (*c++ & 0x3) << 2;\r
- LARc[5] |= (*c >> 6) & 0x3;\r
- LARc[6] = (*c >> 3) & 0x7;\r
- LARc[7] = *c++ & 0x7;\r
- Nc[0] = (*c >> 1) & 0x7F;\r
- bc[0] = (*c++ & 0x1) << 1;\r
- bc[0] |= (*c >> 7) & 0x1;\r
- Mc[0] = (*c >> 5) & 0x3;\r
- xmaxc[0] = (*c++ & 0x1F) << 1;\r
- xmaxc[0] |= (*c >> 7) & 0x1;\r
- xmc[0] = (*c >> 4) & 0x7;\r
- xmc[1] = (*c >> 1) & 0x7;\r
- xmc[2] = (*c++ & 0x1) << 2;\r
- xmc[2] |= (*c >> 6) & 0x3;\r
- xmc[3] = (*c >> 3) & 0x7;\r
- xmc[4] = *c++ & 0x7;\r
- xmc[5] = (*c >> 5) & 0x7;\r
- xmc[6] = (*c >> 2) & 0x7;\r
- xmc[7] = (*c++ & 0x3) << 1; /* 10 */\r
- xmc[7] |= (*c >> 7) & 0x1;\r
- xmc[8] = (*c >> 4) & 0x7;\r
- xmc[9] = (*c >> 1) & 0x7;\r
- xmc[10] = (*c++ & 0x1) << 2;\r
- xmc[10] |= (*c >> 6) & 0x3;\r
- xmc[11] = (*c >> 3) & 0x7;\r
- xmc[12] = *c++ & 0x7;\r
- Nc[1] = (*c >> 1) & 0x7F;\r
- bc[1] = (*c++ & 0x1) << 1;\r
- bc[1] |= (*c >> 7) & 0x1;\r
- Mc[1] = (*c >> 5) & 0x3;\r
- xmaxc[1] = (*c++ & 0x1F) << 1;\r
- xmaxc[1] |= (*c >> 7) & 0x1;\r
- xmc[13] = (*c >> 4) & 0x7;\r
- xmc[14] = (*c >> 1) & 0x7;\r
- xmc[15] = (*c++ & 0x1) << 2;\r
- xmc[15] |= (*c >> 6) & 0x3;\r
- xmc[16] = (*c >> 3) & 0x7;\r
- xmc[17] = *c++ & 0x7;\r
- xmc[18] = (*c >> 5) & 0x7;\r
- xmc[19] = (*c >> 2) & 0x7;\r
- xmc[20] = (*c++ & 0x3) << 1;\r
- xmc[20] |= (*c >> 7) & 0x1;\r
- xmc[21] = (*c >> 4) & 0x7;\r
- xmc[22] = (*c >> 1) & 0x7;\r
- xmc[23] = (*c++ & 0x1) << 2;\r
- xmc[23] |= (*c >> 6) & 0x3;\r
- xmc[24] = (*c >> 3) & 0x7;\r
- xmc[25] = *c++ & 0x7;\r
- Nc[2] = (*c >> 1) & 0x7F;\r
- bc[2] = (*c++ & 0x1) << 1; /* 20 */\r
- bc[2] |= (*c >> 7) & 0x1;\r
- Mc[2] = (*c >> 5) & 0x3;\r
- xmaxc[2] = (*c++ & 0x1F) << 1;\r
- xmaxc[2] |= (*c >> 7) & 0x1;\r
- xmc[26] = (*c >> 4) & 0x7;\r
- xmc[27] = (*c >> 1) & 0x7;\r
- xmc[28] = (*c++ & 0x1) << 2;\r
- xmc[28] |= (*c >> 6) & 0x3;\r
- xmc[29] = (*c >> 3) & 0x7;\r
- xmc[30] = *c++ & 0x7;\r
- xmc[31] = (*c >> 5) & 0x7;\r
- xmc[32] = (*c >> 2) & 0x7;\r
- xmc[33] = (*c++ & 0x3) << 1;\r
- xmc[33] |= (*c >> 7) & 0x1;\r
- xmc[34] = (*c >> 4) & 0x7;\r
- xmc[35] = (*c >> 1) & 0x7;\r
- xmc[36] = (*c++ & 0x1) << 2;\r
- xmc[36] |= (*c >> 6) & 0x3;\r
- xmc[37] = (*c >> 3) & 0x7;\r
- xmc[38] = *c++ & 0x7;\r
- Nc[3] = (*c >> 1) & 0x7F;\r
- bc[3] = (*c++ & 0x1) << 1;\r
- bc[3] |= (*c >> 7) & 0x1;\r
- Mc[3] = (*c >> 5) & 0x3;\r
- xmaxc[3] = (*c++ & 0x1F) << 1;\r
- xmaxc[3] |= (*c >> 7) & 0x1;\r
- xmc[39] = (*c >> 4) & 0x7;\r
- xmc[40] = (*c >> 1) & 0x7;\r
- xmc[41] = (*c++ & 0x1) << 2;\r
- xmc[41] |= (*c >> 6) & 0x3;\r
- xmc[42] = (*c >> 3) & 0x7;\r
- xmc[43] = *c++ & 0x7; /* 30 */\r
- xmc[44] = (*c >> 5) & 0x7;\r
- xmc[45] = (*c >> 2) & 0x7;\r
- xmc[46] = (*c++ & 0x3) << 1;\r
- xmc[46] |= (*c >> 7) & 0x1;\r
- xmc[47] = (*c >> 4) & 0x7;\r
- xmc[48] = (*c >> 1) & 0x7;\r
- xmc[49] = (*c++ & 0x1) << 2;\r
- xmc[49] |= (*c >> 6) & 0x3;\r
- xmc[50] = (*c >> 3) & 0x7;\r
- xmc[51] = *c & 0x7; /* 33 */\r
- }\r
-\r
- Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);\r
-\r
- return 0;\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "gsm.h"\r
-#include "config.h"\r
-#include "proto.h"\r
-\r
-#ifdef HAS_STDLIB_H\r
-# include <stdlib.h>\r
-#else\r
-# ifdef HAS_MALLOC_H\r
-# include <malloc.h>\r
-# else\r
- extern void free();\r
-# endif\r
-#endif\r
-\r
-void gsm_destroy P1((S), gsm S)\r
-{\r
- if (S) free((char *)S);\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "private.h"\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)\r
-{\r
- word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];\r
-\r
- Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);\r
-\r
-\r
- /* variable size\r
-\r
- GSM_MAGIC 4\r
-\r
- LARc[0] 6\r
- LARc[1] 6\r
- LARc[2] 5\r
- LARc[3] 5\r
- LARc[4] 4\r
- LARc[5] 4\r
- LARc[6] 3\r
- LARc[7] 3\r
-\r
- Nc[0] 7\r
- bc[0] 2\r
- Mc[0] 2\r
- xmaxc[0] 6\r
- xmc[0] 3\r
- xmc[1] 3\r
- xmc[2] 3\r
- xmc[3] 3\r
- xmc[4] 3\r
- xmc[5] 3\r
- xmc[6] 3\r
- xmc[7] 3\r
- xmc[8] 3\r
- xmc[9] 3\r
- xmc[10] 3\r
- xmc[11] 3\r
- xmc[12] 3\r
-\r
- Nc[1] 7\r
- bc[1] 2\r
- Mc[1] 2\r
- xmaxc[1] 6\r
- xmc[13] 3\r
- xmc[14] 3\r
- xmc[15] 3\r
- xmc[16] 3\r
- xmc[17] 3\r
- xmc[18] 3\r
- xmc[19] 3\r
- xmc[20] 3\r
- xmc[21] 3\r
- xmc[22] 3\r
- xmc[23] 3\r
- xmc[24] 3\r
- xmc[25] 3\r
-\r
- Nc[2] 7\r
- bc[2] 2\r
- Mc[2] 2\r
- xmaxc[2] 6\r
- xmc[26] 3\r
- xmc[27] 3\r
- xmc[28] 3\r
- xmc[29] 3\r
- xmc[30] 3\r
- xmc[31] 3\r
- xmc[32] 3\r
- xmc[33] 3\r
- xmc[34] 3\r
- xmc[35] 3\r
- xmc[36] 3\r
- xmc[37] 3\r
- xmc[38] 3\r
-\r
- Nc[3] 7\r
- bc[3] 2\r
- Mc[3] 2\r
- xmaxc[3] 6\r
- xmc[39] 3\r
- xmc[40] 3\r
- xmc[41] 3\r
- xmc[42] 3\r
- xmc[43] 3\r
- xmc[44] 3\r
- xmc[45] 3\r
- xmc[46] 3\r
- xmc[47] 3\r
- xmc[48] 3\r
- xmc[49] 3\r
- xmc[50] 3\r
- xmc[51] 3\r
- */\r
-\r
-#ifdef WAV49\r
-\r
- if (s->wav_fmt) {\r
- s->frame_index = !s->frame_index;\r
- if (s->frame_index) {\r
-\r
- uword sr;\r
-\r
- sr = 0;\r
- sr = sr >> 6 | LARc[0] << 10;\r
- sr = sr >> 6 | LARc[1] << 10;\r
- *c++ = sr >> 4;\r
- sr = sr >> 5 | LARc[2] << 11;\r
- *c++ = sr >> 7;\r
- sr = sr >> 5 | LARc[3] << 11;\r
- sr = sr >> 4 | LARc[4] << 12;\r
- *c++ = sr >> 6;\r
- sr = sr >> 4 | LARc[5] << 12;\r
- sr = sr >> 3 | LARc[6] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | LARc[7] << 13;\r
- sr = sr >> 7 | Nc[0] << 9;\r
- *c++ = sr >> 5;\r
- sr = sr >> 2 | bc[0] << 14;\r
- sr = sr >> 2 | Mc[0] << 14;\r
- sr = sr >> 6 | xmaxc[0] << 10;\r
- *c++ = sr >> 3;\r
- sr = sr >> 3 | xmc[0] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[1] << 13;\r
- sr = sr >> 3 | xmc[2] << 13;\r
- sr = sr >> 3 | xmc[3] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[4] << 13;\r
- sr = sr >> 3 | xmc[5] << 13;\r
- sr = sr >> 3 | xmc[6] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[7] << 13;\r
- sr = sr >> 3 | xmc[8] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[9] << 13;\r
- sr = sr >> 3 | xmc[10] << 13;\r
- sr = sr >> 3 | xmc[11] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[12] << 13;\r
- sr = sr >> 7 | Nc[1] << 9;\r
- *c++ = sr >> 5;\r
- sr = sr >> 2 | bc[1] << 14;\r
- sr = sr >> 2 | Mc[1] << 14;\r
- sr = sr >> 6 | xmaxc[1] << 10;\r
- *c++ = sr >> 3;\r
- sr = sr >> 3 | xmc[13] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[14] << 13;\r
- sr = sr >> 3 | xmc[15] << 13;\r
- sr = sr >> 3 | xmc[16] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[17] << 13;\r
- sr = sr >> 3 | xmc[18] << 13;\r
- sr = sr >> 3 | xmc[19] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[20] << 13;\r
- sr = sr >> 3 | xmc[21] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[22] << 13;\r
- sr = sr >> 3 | xmc[23] << 13;\r
- sr = sr >> 3 | xmc[24] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[25] << 13;\r
- sr = sr >> 7 | Nc[2] << 9;\r
- *c++ = sr >> 5;\r
- sr = sr >> 2 | bc[2] << 14;\r
- sr = sr >> 2 | Mc[2] << 14;\r
- sr = sr >> 6 | xmaxc[2] << 10;\r
- *c++ = sr >> 3;\r
- sr = sr >> 3 | xmc[26] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[27] << 13;\r
- sr = sr >> 3 | xmc[28] << 13;\r
- sr = sr >> 3 | xmc[29] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[30] << 13;\r
- sr = sr >> 3 | xmc[31] << 13;\r
- sr = sr >> 3 | xmc[32] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[33] << 13;\r
- sr = sr >> 3 | xmc[34] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[35] << 13;\r
- sr = sr >> 3 | xmc[36] << 13;\r
- sr = sr >> 3 | xmc[37] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[38] << 13;\r
- sr = sr >> 7 | Nc[3] << 9;\r
- *c++ = sr >> 5;\r
- sr = sr >> 2 | bc[3] << 14;\r
- sr = sr >> 2 | Mc[3] << 14;\r
- sr = sr >> 6 | xmaxc[3] << 10;\r
- *c++ = sr >> 3;\r
- sr = sr >> 3 | xmc[39] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[40] << 13;\r
- sr = sr >> 3 | xmc[41] << 13;\r
- sr = sr >> 3 | xmc[42] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[43] << 13;\r
- sr = sr >> 3 | xmc[44] << 13;\r
- sr = sr >> 3 | xmc[45] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[46] << 13;\r
- sr = sr >> 3 | xmc[47] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[48] << 13;\r
- sr = sr >> 3 | xmc[49] << 13;\r
- sr = sr >> 3 | xmc[50] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[51] << 13;\r
- sr = sr >> 4;\r
- *c = sr >> 8;\r
- s->frame_chain = *c;\r
- }\r
- else {\r
- uword sr;\r
-\r
- sr = 0;\r
- sr = sr >> 4 | s->frame_chain << 12;\r
- sr = sr >> 6 | LARc[0] << 10;\r
- *c++ = sr >> 6;\r
- sr = sr >> 6 | LARc[1] << 10;\r
- *c++ = sr >> 8;\r
- sr = sr >> 5 | LARc[2] << 11;\r
- sr = sr >> 5 | LARc[3] << 11;\r
- *c++ = sr >> 6;\r
- sr = sr >> 4 | LARc[4] << 12;\r
- sr = sr >> 4 | LARc[5] << 12;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | LARc[6] << 13;\r
- sr = sr >> 3 | LARc[7] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 7 | Nc[0] << 9;\r
- sr = sr >> 2 | bc[0] << 14;\r
- *c++ = sr >> 7;\r
- sr = sr >> 2 | Mc[0] << 14;\r
- sr = sr >> 6 | xmaxc[0] << 10;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[0] << 13;\r
- sr = sr >> 3 | xmc[1] << 13;\r
- sr = sr >> 3 | xmc[2] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[3] << 13;\r
- sr = sr >> 3 | xmc[4] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[5] << 13;\r
- sr = sr >> 3 | xmc[6] << 13;\r
- sr = sr >> 3 | xmc[7] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[8] << 13;\r
- sr = sr >> 3 | xmc[9] << 13;\r
- sr = sr >> 3 | xmc[10] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[11] << 13;\r
- sr = sr >> 3 | xmc[12] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 7 | Nc[1] << 9;\r
- sr = sr >> 2 | bc[1] << 14;\r
- *c++ = sr >> 7;\r
- sr = sr >> 2 | Mc[1] << 14;\r
- sr = sr >> 6 | xmaxc[1] << 10;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[13] << 13;\r
- sr = sr >> 3 | xmc[14] << 13;\r
- sr = sr >> 3 | xmc[15] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[16] << 13;\r
- sr = sr >> 3 | xmc[17] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[18] << 13;\r
- sr = sr >> 3 | xmc[19] << 13;\r
- sr = sr >> 3 | xmc[20] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[21] << 13;\r
- sr = sr >> 3 | xmc[22] << 13;\r
- sr = sr >> 3 | xmc[23] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[24] << 13;\r
- sr = sr >> 3 | xmc[25] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 7 | Nc[2] << 9;\r
- sr = sr >> 2 | bc[2] << 14;\r
- *c++ = sr >> 7;\r
- sr = sr >> 2 | Mc[2] << 14;\r
- sr = sr >> 6 | xmaxc[2] << 10;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[26] << 13;\r
- sr = sr >> 3 | xmc[27] << 13;\r
- sr = sr >> 3 | xmc[28] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[29] << 13;\r
- sr = sr >> 3 | xmc[30] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[31] << 13;\r
- sr = sr >> 3 | xmc[32] << 13;\r
- sr = sr >> 3 | xmc[33] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[34] << 13;\r
- sr = sr >> 3 | xmc[35] << 13;\r
- sr = sr >> 3 | xmc[36] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[37] << 13;\r
- sr = sr >> 3 | xmc[38] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 7 | Nc[3] << 9;\r
- sr = sr >> 2 | bc[3] << 14;\r
- *c++ = sr >> 7;\r
- sr = sr >> 2 | Mc[3] << 14;\r
- sr = sr >> 6 | xmaxc[3] << 10;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[39] << 13;\r
- sr = sr >> 3 | xmc[40] << 13;\r
- sr = sr >> 3 | xmc[41] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[42] << 13;\r
- sr = sr >> 3 | xmc[43] << 13;\r
- *c++ = sr >> 8;\r
- sr = sr >> 3 | xmc[44] << 13;\r
- sr = sr >> 3 | xmc[45] << 13;\r
- sr = sr >> 3 | xmc[46] << 13;\r
- *c++ = sr >> 7;\r
- sr = sr >> 3 | xmc[47] << 13;\r
- sr = sr >> 3 | xmc[48] << 13;\r
- sr = sr >> 3 | xmc[49] << 13;\r
- *c++ = sr >> 6;\r
- sr = sr >> 3 | xmc[50] << 13;\r
- sr = sr >> 3 | xmc[51] << 13;\r
- *c++ = sr >> 8;\r
- }\r
- }\r
-\r
- else\r
-\r
-#endif /* WAV49 */\r
- {\r
-\r
- *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */\r
- | ((LARc[0] >> 2) & 0xF);\r
- *c++ = ((LARc[0] & 0x3) << 6)\r
- | (LARc[1] & 0x3F);\r
- *c++ = ((LARc[2] & 0x1F) << 3)\r
- | ((LARc[3] >> 2) & 0x7);\r
- *c++ = ((LARc[3] & 0x3) << 6)\r
- | ((LARc[4] & 0xF) << 2)\r
- | ((LARc[5] >> 2) & 0x3);\r
- *c++ = ((LARc[5] & 0x3) << 6)\r
- | ((LARc[6] & 0x7) << 3)\r
- | (LARc[7] & 0x7);\r
- *c++ = ((Nc[0] & 0x7F) << 1)\r
- | ((bc[0] >> 1) & 0x1);\r
- *c++ = ((bc[0] & 0x1) << 7)\r
- | ((Mc[0] & 0x3) << 5)\r
- | ((xmaxc[0] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[0] & 0x1) << 7)\r
- | ((xmc[0] & 0x7) << 4)\r
- | ((xmc[1] & 0x7) << 1)\r
- | ((xmc[2] >> 2) & 0x1);\r
- *c++ = ((xmc[2] & 0x3) << 6)\r
- | ((xmc[3] & 0x7) << 3)\r
- | (xmc[4] & 0x7);\r
- *c++ = ((xmc[5] & 0x7) << 5) /* 10 */\r
- | ((xmc[6] & 0x7) << 2)\r
- | ((xmc[7] >> 1) & 0x3);\r
- *c++ = ((xmc[7] & 0x1) << 7)\r
- | ((xmc[8] & 0x7) << 4)\r
- | ((xmc[9] & 0x7) << 1)\r
- | ((xmc[10] >> 2) & 0x1);\r
- *c++ = ((xmc[10] & 0x3) << 6)\r
- | ((xmc[11] & 0x7) << 3)\r
- | (xmc[12] & 0x7);\r
- *c++ = ((Nc[1] & 0x7F) << 1)\r
- | ((bc[1] >> 1) & 0x1);\r
- *c++ = ((bc[1] & 0x1) << 7)\r
- | ((Mc[1] & 0x3) << 5)\r
- | ((xmaxc[1] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[1] & 0x1) << 7)\r
- | ((xmc[13] & 0x7) << 4)\r
- | ((xmc[14] & 0x7) << 1)\r
- | ((xmc[15] >> 2) & 0x1);\r
- *c++ = ((xmc[15] & 0x3) << 6)\r
- | ((xmc[16] & 0x7) << 3)\r
- | (xmc[17] & 0x7);\r
- *c++ = ((xmc[18] & 0x7) << 5)\r
- | ((xmc[19] & 0x7) << 2)\r
- | ((xmc[20] >> 1) & 0x3);\r
- *c++ = ((xmc[20] & 0x1) << 7)\r
- | ((xmc[21] & 0x7) << 4)\r
- | ((xmc[22] & 0x7) << 1)\r
- | ((xmc[23] >> 2) & 0x1);\r
- *c++ = ((xmc[23] & 0x3) << 6)\r
- | ((xmc[24] & 0x7) << 3)\r
- | (xmc[25] & 0x7);\r
- *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */\r
- | ((bc[2] >> 1) & 0x1);\r
- *c++ = ((bc[2] & 0x1) << 7)\r
- | ((Mc[2] & 0x3) << 5)\r
- | ((xmaxc[2] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[2] & 0x1) << 7)\r
- | ((xmc[26] & 0x7) << 4)\r
- | ((xmc[27] & 0x7) << 1)\r
- | ((xmc[28] >> 2) & 0x1);\r
- *c++ = ((xmc[28] & 0x3) << 6)\r
- | ((xmc[29] & 0x7) << 3)\r
- | (xmc[30] & 0x7);\r
- *c++ = ((xmc[31] & 0x7) << 5)\r
- | ((xmc[32] & 0x7) << 2)\r
- | ((xmc[33] >> 1) & 0x3);\r
- *c++ = ((xmc[33] & 0x1) << 7)\r
- | ((xmc[34] & 0x7) << 4)\r
- | ((xmc[35] & 0x7) << 1)\r
- | ((xmc[36] >> 2) & 0x1);\r
- *c++ = ((xmc[36] & 0x3) << 6)\r
- | ((xmc[37] & 0x7) << 3)\r
- | (xmc[38] & 0x7);\r
- *c++ = ((Nc[3] & 0x7F) << 1)\r
- | ((bc[3] >> 1) & 0x1);\r
- *c++ = ((bc[3] & 0x1) << 7)\r
- | ((Mc[3] & 0x3) << 5)\r
- | ((xmaxc[3] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[3] & 0x1) << 7)\r
- | ((xmc[39] & 0x7) << 4)\r
- | ((xmc[40] & 0x7) << 1)\r
- | ((xmc[41] >> 2) & 0x1);\r
- *c++ = ((xmc[41] & 0x3) << 6) /* 30 */\r
- | ((xmc[42] & 0x7) << 3)\r
- | (xmc[43] & 0x7);\r
- *c++ = ((xmc[44] & 0x7) << 5)\r
- | ((xmc[45] & 0x7) << 2)\r
- | ((xmc[46] >> 1) & 0x3);\r
- *c++ = ((xmc[46] & 0x1) << 7)\r
- | ((xmc[47] & 0x7) << 4)\r
- | ((xmc[48] & 0x7) << 1)\r
- | ((xmc[49] >> 2) & 0x1);\r
- *c++ = ((xmc[49] & 0x3) << 6)\r
- | ((xmc[50] & 0x7) << 3)\r
- | (xmc[51] & 0x7);\r
-\r
- }\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "private.h"\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)\r
-{\r
-# define LARc target\r
-# define Nc *((gsm_signal (*) [17])(target + 8))\r
-# define bc *((gsm_signal (*) [17])(target + 9))\r
-# define Mc *((gsm_signal (*) [17])(target + 10))\r
-# define xmaxc *((gsm_signal (*) [17])(target + 11))\r
-\r
-\r
-#ifdef WAV49\r
- if (s->wav_fmt) {\r
-\r
- uword sr = 0;\r
-\r
- if (s->frame_index == 1) {\r
-\r
- sr = *c++;\r
- LARc[0] = sr & 0x3f; sr >>= 6;\r
- sr |= (uword)*c++ << 2;\r
- LARc[1] = sr & 0x3f; sr >>= 6;\r
- sr |= (uword)*c++ << 4;\r
- LARc[2] = sr & 0x1f; sr >>= 5;\r
- LARc[3] = sr & 0x1f; sr >>= 5;\r
- sr |= (uword)*c++ << 2;\r
- LARc[4] = sr & 0xf; sr >>= 4;\r
- LARc[5] = sr & 0xf; sr >>= 4;\r
- sr |= (uword)*c++ << 2; /* 5 */\r
- LARc[6] = sr & 0x7; sr >>= 3;\r
- LARc[7] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[0] = sr & 0x7f; sr >>= 7;\r
- bc[0] = sr & 0x3; sr >>= 2;\r
- Mc[0] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[0] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (target + 12)\r
- xmc[0] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[1] = sr & 0x7; sr >>= 3;\r
- xmc[2] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[3] = sr & 0x7; sr >>= 3;\r
- xmc[4] = sr & 0x7; sr >>= 3;\r
- xmc[5] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 10 */\r
- xmc[6] = sr & 0x7; sr >>= 3;\r
- xmc[7] = sr & 0x7; sr >>= 3;\r
- xmc[8] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[9] = sr & 0x7; sr >>= 3;\r
- xmc[10] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[11] = sr & 0x7; sr >>= 3;\r
- xmc[12] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[1] = sr & 0x7f; sr >>= 7;\r
- bc[1] = sr & 0x3; sr >>= 2;\r
- Mc[1] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[1] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (target + 29 - 13)\r
-\r
- xmc[13] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 15 */\r
- xmc[14] = sr & 0x7; sr >>= 3;\r
- xmc[15] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[16] = sr & 0x7; sr >>= 3;\r
- xmc[17] = sr & 0x7; sr >>= 3;\r
- xmc[18] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[19] = sr & 0x7; sr >>= 3;\r
- xmc[20] = sr & 0x7; sr >>= 3;\r
- xmc[21] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[22] = sr & 0x7; sr >>= 3;\r
- xmc[23] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[24] = sr & 0x7; sr >>= 3;\r
- xmc[25] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4; /* 20 */\r
- Nc[2] = sr & 0x7f; sr >>= 7;\r
- bc[2] = sr & 0x3; sr >>= 2;\r
- Mc[2] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[2] = sr & 0x3f; sr >>= 6;\r
-\r
-#undef xmc\r
-#define xmc (target + 46 - 26)\r
-\r
- xmc[26] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[27] = sr & 0x7; sr >>= 3;\r
- xmc[28] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[29] = sr & 0x7; sr >>= 3;\r
- xmc[30] = sr & 0x7; sr >>= 3;\r
- xmc[31] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[32] = sr & 0x7; sr >>= 3;\r
- xmc[33] = sr & 0x7; sr >>= 3;\r
- xmc[34] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 25 */\r
- xmc[35] = sr & 0x7; sr >>= 3;\r
- xmc[36] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[37] = sr & 0x7; sr >>= 3;\r
- xmc[38] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[3] = sr & 0x7f; sr >>= 7;\r
- bc[3] = sr & 0x3; sr >>= 2;\r
- Mc[3] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[3] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (target + 63 - 39)\r
-\r
- xmc[39] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[40] = sr & 0x7; sr >>= 3;\r
- xmc[41] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2; /* 30 */\r
- xmc[42] = sr & 0x7; sr >>= 3;\r
- xmc[43] = sr & 0x7; sr >>= 3;\r
- xmc[44] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[45] = sr & 0x7; sr >>= 3;\r
- xmc[46] = sr & 0x7; sr >>= 3;\r
- xmc[47] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[48] = sr & 0x7; sr >>= 3;\r
- xmc[49] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[50] = sr & 0x7; sr >>= 3;\r
- xmc[51] = sr & 0x7; sr >>= 3;\r
-\r
- s->frame_chain = sr & 0xf;\r
- }\r
- else {\r
- sr = s->frame_chain;\r
- sr |= (uword)*c++ << 4; /* 1 */\r
- LARc[0] = sr & 0x3f; sr >>= 6;\r
- LARc[1] = sr & 0x3f; sr >>= 6;\r
- sr = *c++;\r
- LARc[2] = sr & 0x1f; sr >>= 5;\r
- sr |= (uword)*c++ << 3;\r
- LARc[3] = sr & 0x1f; sr >>= 5;\r
- LARc[4] = sr & 0xf; sr >>= 4;\r
- sr |= (uword)*c++ << 2;\r
- LARc[5] = sr & 0xf; sr >>= 4;\r
- LARc[6] = sr & 0x7; sr >>= 3;\r
- LARc[7] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 5 */\r
- Nc[0] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1;\r
- bc[0] = sr & 0x3; sr >>= 2;\r
- Mc[0] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[0] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (target + 12)\r
- xmc[0] = sr & 0x7; sr >>= 3;\r
- xmc[1] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[2] = sr & 0x7; sr >>= 3;\r
- xmc[3] = sr & 0x7; sr >>= 3;\r
- xmc[4] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[5] = sr & 0x7; sr >>= 3;\r
- xmc[6] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2; /* 10 */\r
- xmc[7] = sr & 0x7; sr >>= 3;\r
- xmc[8] = sr & 0x7; sr >>= 3;\r
- xmc[9] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[10] = sr & 0x7; sr >>= 3;\r
- xmc[11] = sr & 0x7; sr >>= 3;\r
- xmc[12] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[1] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1;\r
- bc[1] = sr & 0x3; sr >>= 2;\r
- Mc[1] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[1] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (target + 29 - 13)\r
-\r
- xmc[13] = sr & 0x7; sr >>= 3;\r
- xmc[14] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 15 */\r
- xmc[15] = sr & 0x7; sr >>= 3;\r
- xmc[16] = sr & 0x7; sr >>= 3;\r
- xmc[17] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[18] = sr & 0x7; sr >>= 3;\r
- xmc[19] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[20] = sr & 0x7; sr >>= 3;\r
- xmc[21] = sr & 0x7; sr >>= 3;\r
- xmc[22] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[23] = sr & 0x7; sr >>= 3;\r
- xmc[24] = sr & 0x7; sr >>= 3;\r
- xmc[25] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[2] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1; /* 20 */\r
- bc[2] = sr & 0x3; sr >>= 2;\r
- Mc[2] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[2] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (target + 46 - 26)\r
- xmc[26] = sr & 0x7; sr >>= 3;\r
- xmc[27] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; \r
- xmc[28] = sr & 0x7; sr >>= 3;\r
- xmc[29] = sr & 0x7; sr >>= 3;\r
- xmc[30] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[31] = sr & 0x7; sr >>= 3;\r
- xmc[32] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[33] = sr & 0x7; sr >>= 3;\r
- xmc[34] = sr & 0x7; sr >>= 3;\r
- xmc[35] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 25 */\r
- xmc[36] = sr & 0x7; sr >>= 3;\r
- xmc[37] = sr & 0x7; sr >>= 3;\r
- xmc[38] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[3] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1; \r
- bc[3] = sr & 0x3; sr >>= 2;\r
- Mc[3] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[3] = sr & 0x3f; sr >>= 6;\r
-\r
-#undef xmc\r
-#define xmc (target + 63 - 39)\r
-\r
- xmc[39] = sr & 0x7; sr >>= 3;\r
- xmc[40] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[41] = sr & 0x7; sr >>= 3;\r
- xmc[42] = sr & 0x7; sr >>= 3;\r
- xmc[43] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 30 */\r
- xmc[44] = sr & 0x7; sr >>= 3;\r
- xmc[45] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[46] = sr & 0x7; sr >>= 3;\r
- xmc[47] = sr & 0x7; sr >>= 3;\r
- xmc[48] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[49] = sr & 0x7; sr >>= 3;\r
- xmc[50] = sr & 0x7; sr >>= 3;\r
- xmc[51] = sr & 0x7; sr >>= 3;\r
- }\r
- }\r
- else \r
-#endif\r
- {\r
- /* GSM_MAGIC = (*c >> 4) & 0xF; */\r
-\r
- if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;\r
-\r
- LARc[0] = (*c++ & 0xF) << 2; /* 1 */\r
- LARc[0] |= (*c >> 6) & 0x3;\r
- LARc[1] = *c++ & 0x3F;\r
- LARc[2] = (*c >> 3) & 0x1F;\r
- LARc[3] = (*c++ & 0x7) << 2;\r
- LARc[3] |= (*c >> 6) & 0x3;\r
- LARc[4] = (*c >> 2) & 0xF;\r
- LARc[5] = (*c++ & 0x3) << 2;\r
- LARc[5] |= (*c >> 6) & 0x3;\r
- LARc[6] = (*c >> 3) & 0x7;\r
- LARc[7] = *c++ & 0x7;\r
-\r
- Nc[0] = (*c >> 1) & 0x7F;\r
-\r
- bc[0] = (*c++ & 0x1) << 1;\r
- bc[0] |= (*c >> 7) & 0x1;\r
-\r
- Mc[0] = (*c >> 5) & 0x3;\r
-\r
- xmaxc[0] = (*c++ & 0x1F) << 1;\r
- xmaxc[0] |= (*c >> 7) & 0x1;\r
-\r
-#undef xmc\r
-#define xmc (target + 12)\r
-\r
- xmc[0] = (*c >> 4) & 0x7;\r
- xmc[1] = (*c >> 1) & 0x7;\r
- xmc[2] = (*c++ & 0x1) << 2;\r
- xmc[2] |= (*c >> 6) & 0x3;\r
- xmc[3] = (*c >> 3) & 0x7;\r
- xmc[4] = *c++ & 0x7;\r
- xmc[5] = (*c >> 5) & 0x7;\r
- xmc[6] = (*c >> 2) & 0x7;\r
- xmc[7] = (*c++ & 0x3) << 1; /* 10 */\r
- xmc[7] |= (*c >> 7) & 0x1;\r
- xmc[8] = (*c >> 4) & 0x7;\r
- xmc[9] = (*c >> 1) & 0x7;\r
- xmc[10] = (*c++ & 0x1) << 2;\r
- xmc[10] |= (*c >> 6) & 0x3;\r
- xmc[11] = (*c >> 3) & 0x7;\r
- xmc[12] = *c++ & 0x7;\r
-\r
- Nc[1] = (*c >> 1) & 0x7F;\r
-\r
- bc[1] = (*c++ & 0x1) << 1;\r
- bc[1] |= (*c >> 7) & 0x1;\r
-\r
- Mc[1] = (*c >> 5) & 0x3;\r
-\r
- xmaxc[1] = (*c++ & 0x1F) << 1;\r
- xmaxc[1] |= (*c >> 7) & 0x1;\r
-\r
-#undef xmc\r
-#define xmc (target + 29 - 13)\r
-\r
- xmc[13] = (*c >> 4) & 0x7;\r
- xmc[14] = (*c >> 1) & 0x7;\r
- xmc[15] = (*c++ & 0x1) << 2;\r
- xmc[15] |= (*c >> 6) & 0x3;\r
- xmc[16] = (*c >> 3) & 0x7;\r
- xmc[17] = *c++ & 0x7;\r
- xmc[18] = (*c >> 5) & 0x7;\r
- xmc[19] = (*c >> 2) & 0x7;\r
- xmc[20] = (*c++ & 0x3) << 1;\r
- xmc[20] |= (*c >> 7) & 0x1;\r
- xmc[21] = (*c >> 4) & 0x7;\r
- xmc[22] = (*c >> 1) & 0x7;\r
- xmc[23] = (*c++ & 0x1) << 2;\r
- xmc[23] |= (*c >> 6) & 0x3;\r
- xmc[24] = (*c >> 3) & 0x7;\r
- xmc[25] = *c++ & 0x7;\r
-\r
- Nc[2] = (*c >> 1) & 0x7F;\r
-\r
- bc[2] = (*c++ & 0x1) << 1; /* 20 */\r
- bc[2] |= (*c >> 7) & 0x1;\r
-\r
- Mc[2] = (*c >> 5) & 0x3;\r
-\r
- xmaxc[2] = (*c++ & 0x1F) << 1;\r
- xmaxc[2] |= (*c >> 7) & 0x1;\r
-\r
-#undef xmc\r
-#define xmc (target + 46 - 26)\r
-\r
- xmc[26] = (*c >> 4) & 0x7;\r
- xmc[27] = (*c >> 1) & 0x7;\r
- xmc[28] = (*c++ & 0x1) << 2;\r
- xmc[28] |= (*c >> 6) & 0x3;\r
- xmc[29] = (*c >> 3) & 0x7;\r
- xmc[30] = *c++ & 0x7;\r
- xmc[31] = (*c >> 5) & 0x7;\r
- xmc[32] = (*c >> 2) & 0x7;\r
- xmc[33] = (*c++ & 0x3) << 1;\r
- xmc[33] |= (*c >> 7) & 0x1;\r
- xmc[34] = (*c >> 4) & 0x7;\r
- xmc[35] = (*c >> 1) & 0x7;\r
- xmc[36] = (*c++ & 0x1) << 2;\r
- xmc[36] |= (*c >> 6) & 0x3;\r
- xmc[37] = (*c >> 3) & 0x7;\r
- xmc[38] = *c++ & 0x7;\r
-\r
- Nc[3] = (*c >> 1) & 0x7F;\r
-\r
- bc[3] = (*c++ & 0x1) << 1;\r
- bc[3] |= (*c >> 7) & 0x1;\r
-\r
- Mc[3] = (*c >> 5) & 0x3;\r
-\r
- xmaxc[3] = (*c++ & 0x1F) << 1;\r
- xmaxc[3] |= (*c >> 7) & 0x1;\r
-\r
-#undef xmc\r
-#define xmc (target + 63 - 39)\r
-\r
- xmc[39] = (*c >> 4) & 0x7;\r
- xmc[40] = (*c >> 1) & 0x7;\r
- xmc[41] = (*c++ & 0x1) << 2;\r
- xmc[41] |= (*c >> 6) & 0x3;\r
- xmc[42] = (*c >> 3) & 0x7;\r
- xmc[43] = *c++ & 0x7; /* 30 */\r
- xmc[44] = (*c >> 5) & 0x7;\r
- xmc[45] = (*c >> 2) & 0x7;\r
- xmc[46] = (*c++ & 0x3) << 1;\r
- xmc[46] |= (*c >> 7) & 0x1;\r
- xmc[47] = (*c >> 4) & 0x7;\r
- xmc[48] = (*c >> 1) & 0x7;\r
- xmc[49] = (*c++ & 0x1) << 2;\r
- xmc[49] |= (*c >> 6) & 0x3;\r
- xmc[50] = (*c >> 3) & 0x7;\r
- xmc[51] = *c & 0x7; /* 33 */\r
- }\r
-\r
- return 0;\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)\r
-{\r
- /* variable size index\r
-\r
- GSM_MAGIC 4 -\r
-\r
- LARc[0] 6 0\r
- LARc[1] 6 1\r
- LARc[2] 5 2\r
- LARc[3] 5 3\r
- LARc[4] 4 4\r
- LARc[5] 4 5\r
- LARc[6] 3 6\r
- LARc[7] 3 7\r
-\r
- Nc[0] 7 8\r
- bc[0] 2 9\r
- Mc[0] 2 10\r
- xmaxc[0] 6 11\r
- xmc[0] 3 12\r
- xmc[1] 3 13\r
- xmc[2] 3 14\r
- xmc[3] 3 15\r
- xmc[4] 3 16\r
- xmc[5] 3 17\r
- xmc[6] 3 18\r
- xmc[7] 3 19\r
- xmc[8] 3 20\r
- xmc[9] 3 21\r
- xmc[10] 3 22\r
- xmc[11] 3 23\r
- xmc[12] 3 24\r
-\r
- Nc[1] 7 25\r
- bc[1] 2 26\r
- Mc[1] 2 27\r
- xmaxc[1] 6 28\r
- xmc[13] 3 29\r
- xmc[14] 3 30\r
- xmc[15] 3 31\r
- xmc[16] 3 32\r
- xmc[17] 3 33\r
- xmc[18] 3 34\r
- xmc[19] 3 35\r
- xmc[20] 3 36\r
- xmc[21] 3 37\r
- xmc[22] 3 38\r
- xmc[23] 3 39\r
- xmc[24] 3 40\r
- xmc[25] 3 41\r
-\r
- Nc[2] 7 42\r
- bc[2] 2 43\r
- Mc[2] 2 44\r
- xmaxc[2] 6 45\r
- xmc[26] 3 46\r
- xmc[27] 3 47\r
- xmc[28] 3 48\r
- xmc[29] 3 49\r
- xmc[30] 3 50\r
- xmc[31] 3 51\r
- xmc[32] 3 52\r
- xmc[33] 3 53\r
- xmc[34] 3 54\r
- xmc[35] 3 55\r
- xmc[36] 3 56\r
- xmc[37] 3 57\r
- xmc[38] 3 58\r
-\r
- Nc[3] 7 59\r
- bc[3] 2 60\r
- Mc[3] 2 61\r
- xmaxc[3] 6 62\r
- xmc[39] 3 63\r
- xmc[40] 3 64\r
- xmc[41] 3 65\r
- xmc[42] 3 66\r
- xmc[43] 3 67\r
- xmc[44] 3 68\r
- xmc[45] 3 69\r
- xmc[46] 3 70\r
- xmc[47] 3 71\r
- xmc[48] 3 72\r
- xmc[49] 3 73\r
- xmc[50] 3 74\r
- xmc[51] 3 75\r
- */\r
-\r
- /* There are 76 parameters per frame. The first eight are\r
- * unique. The remaining 68 are four identical subframes of\r
- * 17 parameters each. gsm_implode converts from a representation\r
- * of these parameters as values in one array of signed words\r
- * to the "packed" version of a GSM frame.\r
- */\r
-\r
-# define LARc source\r
-# define Nc *((gsm_signal (*) [17])(source + 8))\r
-# define bc *((gsm_signal (*) [17])(source + 9))\r
-# define Mc *((gsm_signal (*) [17])(source + 10))\r
-# define xmaxc *((gsm_signal (*) [17])(source + 11))\r
-\r
-#ifdef WAV49\r
- if (s->wav_fmt) {\r
-\r
- uword sr = 0;\r
- if (s->frame_index == 0) {\r
-\r
- sr = *c++;\r
- LARc[0] = sr & 0x3f; sr >>= 6;\r
- sr |= (uword)*c++ << 2;\r
- LARc[1] = sr & 0x3f; sr >>= 6;\r
- sr |= (uword)*c++ << 4;\r
- LARc[2] = sr & 0x1f; sr >>= 5;\r
- LARc[3] = sr & 0x1f; sr >>= 5;\r
- sr |= (uword)*c++ << 2;\r
- LARc[4] = sr & 0xf; sr >>= 4;\r
- LARc[5] = sr & 0xf; sr >>= 4;\r
- sr |= (uword)*c++ << 2; /* 5 */\r
- LARc[6] = sr & 0x7; sr >>= 3;\r
- LARc[7] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[0] = sr & 0x7f; sr >>= 7;\r
- bc[0] = sr & 0x3; sr >>= 2;\r
- Mc[0] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[0] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 12)\r
- xmc[0] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[1] = sr & 0x7; sr >>= 3;\r
- xmc[2] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[3] = sr & 0x7; sr >>= 3;\r
- xmc[4] = sr & 0x7; sr >>= 3;\r
- xmc[5] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 10 */\r
- xmc[6] = sr & 0x7; sr >>= 3;\r
- xmc[7] = sr & 0x7; sr >>= 3;\r
- xmc[8] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[9] = sr & 0x7; sr >>= 3;\r
- xmc[10] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[11] = sr & 0x7; sr >>= 3;\r
- xmc[12] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[1] = sr & 0x7f; sr >>= 7;\r
- bc[1] = sr & 0x3; sr >>= 2;\r
- Mc[1] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[1] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 29 - 13)\r
- xmc[13] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 15 */\r
- xmc[14] = sr & 0x7; sr >>= 3;\r
- xmc[15] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[16] = sr & 0x7; sr >>= 3;\r
- xmc[17] = sr & 0x7; sr >>= 3;\r
- xmc[18] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[19] = sr & 0x7; sr >>= 3;\r
- xmc[20] = sr & 0x7; sr >>= 3;\r
- xmc[21] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[22] = sr & 0x7; sr >>= 3;\r
- xmc[23] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[24] = sr & 0x7; sr >>= 3;\r
- xmc[25] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4; /* 20 */\r
- Nc[2] = sr & 0x7f; sr >>= 7;\r
- bc[2] = sr & 0x3; sr >>= 2;\r
- Mc[2] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[2] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 46 - 26)\r
- xmc[26] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[27] = sr & 0x7; sr >>= 3;\r
- xmc[28] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[29] = sr & 0x7; sr >>= 3;\r
- xmc[30] = sr & 0x7; sr >>= 3;\r
- xmc[31] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[32] = sr & 0x7; sr >>= 3;\r
- xmc[33] = sr & 0x7; sr >>= 3;\r
- xmc[34] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 25 */\r
- xmc[35] = sr & 0x7; sr >>= 3;\r
- xmc[36] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[37] = sr & 0x7; sr >>= 3;\r
- xmc[38] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 4;\r
- Nc[3] = sr & 0x7f; sr >>= 7;\r
- bc[3] = sr & 0x3; sr >>= 2;\r
- Mc[3] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 1;\r
- xmaxc[3] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 63 - 39)\r
-\r
- xmc[39] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[40] = sr & 0x7; sr >>= 3;\r
- xmc[41] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2; /* 30 */\r
- xmc[42] = sr & 0x7; sr >>= 3;\r
- xmc[43] = sr & 0x7; sr >>= 3;\r
- xmc[44] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[45] = sr & 0x7; sr >>= 3;\r
- xmc[46] = sr & 0x7; sr >>= 3;\r
- xmc[47] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[48] = sr & 0x7; sr >>= 3;\r
- xmc[49] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[50] = sr & 0x7; sr >>= 3;\r
- xmc[51] = sr & 0x7; sr >>= 3;\r
-\r
- s->frame_chain = sr & 0xf;\r
- }\r
- else {\r
- sr = s->frame_chain;\r
- sr |= (uword)*c++ << 4; /* 1 */\r
- LARc[0] = sr & 0x3f; sr >>= 6;\r
- LARc[1] = sr & 0x3f; sr >>= 6;\r
- sr = *c++;\r
- LARc[2] = sr & 0x1f; sr >>= 5;\r
- sr |= (uword)*c++ << 3;\r
- LARc[3] = sr & 0x1f; sr >>= 5;\r
- LARc[4] = sr & 0xf; sr >>= 4;\r
- sr |= (uword)*c++ << 2;\r
- LARc[5] = sr & 0xf; sr >>= 4;\r
- LARc[6] = sr & 0x7; sr >>= 3;\r
- LARc[7] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 5 */\r
- Nc[0] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1;\r
- bc[0] = sr & 0x3; sr >>= 2;\r
- Mc[0] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[0] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 12)\r
- xmc[0] = sr & 0x7; sr >>= 3;\r
- xmc[1] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[2] = sr & 0x7; sr >>= 3;\r
- xmc[3] = sr & 0x7; sr >>= 3;\r
- xmc[4] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[5] = sr & 0x7; sr >>= 3;\r
- xmc[6] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2; /* 10 */\r
- xmc[7] = sr & 0x7; sr >>= 3;\r
- xmc[8] = sr & 0x7; sr >>= 3;\r
- xmc[9] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[10] = sr & 0x7; sr >>= 3;\r
- xmc[11] = sr & 0x7; sr >>= 3;\r
- xmc[12] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[1] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1;\r
- bc[1] = sr & 0x3; sr >>= 2;\r
- Mc[1] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[1] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 29 - 13)\r
- xmc[13] = sr & 0x7; sr >>= 3;\r
- xmc[14] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 15 */\r
- xmc[15] = sr & 0x7; sr >>= 3;\r
- xmc[16] = sr & 0x7; sr >>= 3;\r
- xmc[17] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[18] = sr & 0x7; sr >>= 3;\r
- xmc[19] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[20] = sr & 0x7; sr >>= 3;\r
- xmc[21] = sr & 0x7; sr >>= 3;\r
- xmc[22] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[23] = sr & 0x7; sr >>= 3;\r
- xmc[24] = sr & 0x7; sr >>= 3;\r
- xmc[25] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[2] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1; /* 20 */\r
- bc[2] = sr & 0x3; sr >>= 2;\r
- Mc[2] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[2] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 46 - 26)\r
- xmc[26] = sr & 0x7; sr >>= 3;\r
- xmc[27] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; \r
- xmc[28] = sr & 0x7; sr >>= 3;\r
- xmc[29] = sr & 0x7; sr >>= 3;\r
- xmc[30] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- xmc[31] = sr & 0x7; sr >>= 3;\r
- xmc[32] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[33] = sr & 0x7; sr >>= 3;\r
- xmc[34] = sr & 0x7; sr >>= 3;\r
- xmc[35] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1; /* 25 */\r
- xmc[36] = sr & 0x7; sr >>= 3;\r
- xmc[37] = sr & 0x7; sr >>= 3;\r
- xmc[38] = sr & 0x7; sr >>= 3;\r
- sr = *c++;\r
- Nc[3] = sr & 0x7f; sr >>= 7;\r
- sr |= (uword)*c++ << 1; \r
- bc[3] = sr & 0x3; sr >>= 2;\r
- Mc[3] = sr & 0x3; sr >>= 2;\r
- sr |= (uword)*c++ << 5;\r
- xmaxc[3] = sr & 0x3f; sr >>= 6;\r
-#undef xmc\r
-#define xmc (source + 63 - 39)\r
-\r
- xmc[39] = sr & 0x7; sr >>= 3;\r
- xmc[40] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[41] = sr & 0x7; sr >>= 3;\r
- xmc[42] = sr & 0x7; sr >>= 3;\r
- xmc[43] = sr & 0x7; sr >>= 3;\r
- sr = *c++; /* 30 */\r
- xmc[44] = sr & 0x7; sr >>= 3;\r
- xmc[45] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 2;\r
- xmc[46] = sr & 0x7; sr >>= 3;\r
- xmc[47] = sr & 0x7; sr >>= 3;\r
- xmc[48] = sr & 0x7; sr >>= 3;\r
- sr |= (uword)*c++ << 1;\r
- xmc[49] = sr & 0x7; sr >>= 3;\r
- xmc[50] = sr & 0x7; sr >>= 3;\r
- xmc[51] = sr & 0x7; sr >>= 3;\r
- }\r
- }\r
- else\r
-#endif \r
- {\r
-\r
- *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */\r
- | ((LARc[0] >> 2) & 0xF);\r
- *c++ = ((LARc[0] & 0x3) << 6)\r
- | (LARc[1] & 0x3F);\r
- *c++ = ((LARc[2] & 0x1F) << 3)\r
- | ((LARc[3] >> 2) & 0x7);\r
- *c++ = ((LARc[3] & 0x3) << 6)\r
- | ((LARc[4] & 0xF) << 2)\r
- | ((LARc[5] >> 2) & 0x3);\r
- *c++ = ((LARc[5] & 0x3) << 6)\r
- | ((LARc[6] & 0x7) << 3)\r
- | (LARc[7] & 0x7);\r
-\r
-\r
- *c++ = ((Nc[0] & 0x7F) << 1)\r
-\r
-\r
- | ((bc[0] >> 1) & 0x1);\r
- *c++ = ((bc[0] & 0x1) << 7)\r
-\r
-\r
- | ((Mc[0] & 0x3) << 5)\r
-\r
- | ((xmaxc[0] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[0] & 0x1) << 7)\r
-\r
-#undef xmc\r
-#define xmc (source + 12)\r
-\r
- | ((xmc[0] & 0x7) << 4)\r
- | ((xmc[1] & 0x7) << 1)\r
- | ((xmc[2] >> 2) & 0x1);\r
- *c++ = ((xmc[2] & 0x3) << 6)\r
- | ((xmc[3] & 0x7) << 3)\r
- | (xmc[4] & 0x7);\r
- *c++ = ((xmc[5] & 0x7) << 5) /* 10 */\r
- | ((xmc[6] & 0x7) << 2)\r
- | ((xmc[7] >> 1) & 0x3);\r
- *c++ = ((xmc[7] & 0x1) << 7)\r
- | ((xmc[8] & 0x7) << 4)\r
- | ((xmc[9] & 0x7) << 1)\r
- | ((xmc[10] >> 2) & 0x1);\r
- *c++ = ((xmc[10] & 0x3) << 6)\r
- | ((xmc[11] & 0x7) << 3)\r
- | (xmc[12] & 0x7);\r
-\r
-\r
- *c++ = ((Nc[1] & 0x7F) << 1)\r
-\r
-\r
- | ((bc[1] >> 1) & 0x1);\r
- *c++ = ((bc[1] & 0x1) << 7)\r
-\r
-\r
- | ((Mc[1] & 0x3) << 5)\r
-\r
-\r
- | ((xmaxc[1] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[1] & 0x1) << 7)\r
-\r
-#undef xmc\r
-#define xmc (source + 29 - 13)\r
-\r
- | ((xmc[13] & 0x7) << 4)\r
- | ((xmc[14] & 0x7) << 1)\r
- | ((xmc[15] >> 2) & 0x1);\r
- *c++ = ((xmc[15] & 0x3) << 6)\r
- | ((xmc[16] & 0x7) << 3)\r
- | (xmc[17] & 0x7);\r
- *c++ = ((xmc[18] & 0x7) << 5)\r
- | ((xmc[19] & 0x7) << 2)\r
- | ((xmc[20] >> 1) & 0x3);\r
- *c++ = ((xmc[20] & 0x1) << 7)\r
- | ((xmc[21] & 0x7) << 4)\r
- | ((xmc[22] & 0x7) << 1)\r
- | ((xmc[23] >> 2) & 0x1);\r
- *c++ = ((xmc[23] & 0x3) << 6)\r
- | ((xmc[24] & 0x7) << 3)\r
- | (xmc[25] & 0x7);\r
-\r
-\r
- *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */\r
-\r
-\r
- | ((bc[2] >> 1) & 0x1);\r
- *c++ = ((bc[2] & 0x1) << 7)\r
-\r
-\r
- | ((Mc[2] & 0x3) << 5)\r
-\r
-\r
- | ((xmaxc[2] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[2] & 0x1) << 7)\r
-\r
-#undef xmc\r
-#define xmc (source + 46 - 26)\r
-\r
- | ((xmc[26] & 0x7) << 4)\r
- | ((xmc[27] & 0x7) << 1)\r
- | ((xmc[28] >> 2) & 0x1);\r
- *c++ = ((xmc[28] & 0x3) << 6)\r
- | ((xmc[29] & 0x7) << 3)\r
- | (xmc[30] & 0x7);\r
- *c++ = ((xmc[31] & 0x7) << 5)\r
- | ((xmc[32] & 0x7) << 2)\r
- | ((xmc[33] >> 1) & 0x3);\r
- *c++ = ((xmc[33] & 0x1) << 7)\r
- | ((xmc[34] & 0x7) << 4)\r
- | ((xmc[35] & 0x7) << 1)\r
- | ((xmc[36] >> 2) & 0x1);\r
- *c++ = ((xmc[36] & 0x3) << 6)\r
- | ((xmc[37] & 0x7) << 3)\r
- | (xmc[38] & 0x7);\r
-\r
-\r
- *c++ = ((Nc[3] & 0x7F) << 1)\r
-\r
-\r
- | ((bc[3] >> 1) & 0x1);\r
- *c++ = ((bc[3] & 0x1) << 7)\r
-\r
-\r
- | ((Mc[3] & 0x3) << 5)\r
-\r
-\r
- | ((xmaxc[3] >> 1) & 0x1F);\r
- *c++ = ((xmaxc[3] & 0x1) << 7)\r
-\r
-#undef xmc\r
-#define xmc (source + 63 - 39)\r
-\r
- | ((xmc[39] & 0x7) << 4)\r
- | ((xmc[40] & 0x7) << 1)\r
- | ((xmc[41] >> 2) & 0x1);\r
- *c++ = ((xmc[41] & 0x3) << 6) /* 30 */\r
- | ((xmc[42] & 0x7) << 3)\r
- | (xmc[43] & 0x7);\r
- *c++ = ((xmc[44] & 0x7) << 5)\r
- | ((xmc[45] & 0x7) << 2)\r
- | ((xmc[46] >> 1) & 0x3);\r
- *c++ = ((xmc[46] & 0x1) << 7)\r
- | ((xmc[47] & 0x7) << 4)\r
- | ((xmc[48] & 0x7) << 1)\r
- | ((xmc[49] >> 2) & 0x1);\r
- *c++ = ((xmc[49] & 0x3) << 6)\r
- | ((xmc[50] & 0x7) << 3)\r
- | (xmc[51] & 0x7);\r
- }\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-int gsm_option P3((r, opt, val), gsm r, int opt, int * val)\r
-{\r
- int result = -1;\r
-\r
- switch (opt) {\r
- case GSM_OPT_LTP_CUT:\r
-#ifdef LTP_CUT\r
- result = r->ltp_cut;\r
- if (val) r->ltp_cut = *val;\r
-#endif\r
- break;\r
-\r
- case GSM_OPT_VERBOSE:\r
-#ifndef NDEBUG\r
- result = r->verbose;\r
- if (val) r->verbose = *val;\r
-#endif\r
- break;\r
-\r
- case GSM_OPT_FAST:\r
-\r
-#if defined(FAST) && defined(USE_FLOAT_MUL)\r
- result = r->fast;\r
- if (val) r->fast = !!*val;\r
-#endif\r
- break;\r
-\r
- case GSM_OPT_FRAME_CHAIN:\r
-\r
-#ifdef WAV49\r
- result = r->frame_chain;\r
- if (val) r->frame_chain = *val;\r
-#endif\r
- break;\r
-\r
- case GSM_OPT_FRAME_INDEX:\r
-\r
-#ifdef WAV49\r
- result = r->frame_index;\r
- if (val) r->frame_index = *val;\r
-#endif\r
- break;\r
-\r
- case GSM_OPT_WAV49:\r
-\r
-#ifdef WAV49 \r
- result = r->wav_fmt;\r
- if (val) r->wav_fmt = !!*val;\r
-#endif\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- return result;\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include <stdio.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-int gsm_print P3((f, s, c), FILE * f, gsm s, gsm_byte * c)\r
-{\r
- word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];\r
-\r
- /* GSM_MAGIC = (*c >> 4) & 0xF; */\r
-\r
- if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;\r
-\r
- LARc[0] = (*c++ & 0xF) << 2; /* 1 */\r
- LARc[0] |= (*c >> 6) & 0x3;\r
- LARc[1] = *c++ & 0x3F;\r
- LARc[2] = (*c >> 3) & 0x1F;\r
- LARc[3] = (*c++ & 0x7) << 2;\r
- LARc[3] |= (*c >> 6) & 0x3;\r
- LARc[4] = (*c >> 2) & 0xF;\r
- LARc[5] = (*c++ & 0x3) << 2;\r
- LARc[5] |= (*c >> 6) & 0x3;\r
- LARc[6] = (*c >> 3) & 0x7;\r
- LARc[7] = *c++ & 0x7;\r
-\r
-\r
- Nc[0] = (*c >> 1) & 0x7F;\r
- bc[0] = (*c++ & 0x1) << 1;\r
- bc[0] |= (*c >> 7) & 0x1;\r
- Mc[0] = (*c >> 5) & 0x3;\r
- xmaxc[0] = (*c++ & 0x1F) << 1;\r
- xmaxc[0] |= (*c >> 7) & 0x1;\r
- xmc[0] = (*c >> 4) & 0x7;\r
- xmc[1] = (*c >> 1) & 0x7;\r
- xmc[2] = (*c++ & 0x1) << 2;\r
- xmc[2] |= (*c >> 6) & 0x3;\r
- xmc[3] = (*c >> 3) & 0x7;\r
- xmc[4] = *c++ & 0x7;\r
- xmc[5] = (*c >> 5) & 0x7;\r
- xmc[6] = (*c >> 2) & 0x7;\r
- xmc[7] = (*c++ & 0x3) << 1; /* 10 */\r
- xmc[7] |= (*c >> 7) & 0x1;\r
- xmc[8] = (*c >> 4) & 0x7;\r
- xmc[9] = (*c >> 1) & 0x7;\r
- xmc[10] = (*c++ & 0x1) << 2;\r
- xmc[10] |= (*c >> 6) & 0x3;\r
- xmc[11] = (*c >> 3) & 0x7;\r
- xmc[12] = *c++ & 0x7;\r
-\r
- Nc[1] = (*c >> 1) & 0x7F;\r
- bc[1] = (*c++ & 0x1) << 1;\r
- bc[1] |= (*c >> 7) & 0x1;\r
- Mc[1] = (*c >> 5) & 0x3;\r
- xmaxc[1] = (*c++ & 0x1F) << 1;\r
- xmaxc[1] |= (*c >> 7) & 0x1;\r
- xmc[13] = (*c >> 4) & 0x7;\r
- xmc[14] = (*c >> 1) & 0x7;\r
- xmc[15] = (*c++ & 0x1) << 2;\r
- xmc[15] |= (*c >> 6) & 0x3;\r
- xmc[16] = (*c >> 3) & 0x7;\r
- xmc[17] = *c++ & 0x7;\r
- xmc[18] = (*c >> 5) & 0x7;\r
- xmc[19] = (*c >> 2) & 0x7;\r
- xmc[20] = (*c++ & 0x3) << 1;\r
- xmc[20] |= (*c >> 7) & 0x1;\r
- xmc[21] = (*c >> 4) & 0x7;\r
- xmc[22] = (*c >> 1) & 0x7;\r
- xmc[23] = (*c++ & 0x1) << 2;\r
- xmc[23] |= (*c >> 6) & 0x3;\r
- xmc[24] = (*c >> 3) & 0x7;\r
- xmc[25] = *c++ & 0x7;\r
-\r
-\r
- Nc[2] = (*c >> 1) & 0x7F;\r
- bc[2] = (*c++ & 0x1) << 1; /* 20 */\r
- bc[2] |= (*c >> 7) & 0x1;\r
- Mc[2] = (*c >> 5) & 0x3;\r
- xmaxc[2] = (*c++ & 0x1F) << 1;\r
- xmaxc[2] |= (*c >> 7) & 0x1;\r
- xmc[26] = (*c >> 4) & 0x7;\r
- xmc[27] = (*c >> 1) & 0x7;\r
- xmc[28] = (*c++ & 0x1) << 2;\r
- xmc[28] |= (*c >> 6) & 0x3;\r
- xmc[29] = (*c >> 3) & 0x7;\r
- xmc[30] = *c++ & 0x7;\r
- xmc[31] = (*c >> 5) & 0x7;\r
- xmc[32] = (*c >> 2) & 0x7;\r
- xmc[33] = (*c++ & 0x3) << 1;\r
- xmc[33] |= (*c >> 7) & 0x1;\r
- xmc[34] = (*c >> 4) & 0x7;\r
- xmc[35] = (*c >> 1) & 0x7;\r
- xmc[36] = (*c++ & 0x1) << 2;\r
- xmc[36] |= (*c >> 6) & 0x3;\r
- xmc[37] = (*c >> 3) & 0x7;\r
- xmc[38] = *c++ & 0x7;\r
-\r
- Nc[3] = (*c >> 1) & 0x7F;\r
- bc[3] = (*c++ & 0x1) << 1;\r
- bc[3] |= (*c >> 7) & 0x1;\r
- Mc[3] = (*c >> 5) & 0x3;\r
- xmaxc[3] = (*c++ & 0x1F) << 1;\r
- xmaxc[3] |= (*c >> 7) & 0x1;\r
-\r
- xmc[39] = (*c >> 4) & 0x7;\r
- xmc[40] = (*c >> 1) & 0x7;\r
- xmc[41] = (*c++ & 0x1) << 2;\r
- xmc[41] |= (*c >> 6) & 0x3;\r
- xmc[42] = (*c >> 3) & 0x7;\r
- xmc[43] = *c++ & 0x7; /* 30 */\r
- xmc[44] = (*c >> 5) & 0x7;\r
- xmc[45] = (*c >> 2) & 0x7;\r
- xmc[46] = (*c++ & 0x3) << 1;\r
- xmc[46] |= (*c >> 7) & 0x1;\r
- xmc[47] = (*c >> 4) & 0x7;\r
- xmc[48] = (*c >> 1) & 0x7;\r
- xmc[49] = (*c++ & 0x1) << 2;\r
- xmc[49] |= (*c >> 6) & 0x3;\r
- xmc[50] = (*c >> 3) & 0x7;\r
- xmc[51] = *c & 0x7; /* 33 */\r
-\r
- fprintf(f,\r
- "LARc:\t%2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d\n",\r
- LARc[0],LARc[1],LARc[2],LARc[3],LARc[4],LARc[5],LARc[6],LARc[7]);\r
-\r
- fprintf(f, "#1: Nc %4.4d bc %d Mc %d xmaxc %d\n",\r
- Nc[0], bc[0], Mc[0], xmaxc[0]);\r
- fprintf(f,\r
-"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",\r
- xmc[0],xmc[1],xmc[2],xmc[3],xmc[4],xmc[5],xmc[6],\r
- xmc[7],xmc[8],xmc[9],xmc[10],xmc[11],xmc[12] );\r
-\r
- fprintf(f, "#2: Nc %4.4d bc %d Mc %d xmaxc %d\n",\r
- Nc[1], bc[1], Mc[1], xmaxc[1]);\r
- fprintf(f,\r
-"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",\r
- xmc[13+0],xmc[13+1],xmc[13+2],xmc[13+3],xmc[13+4],xmc[13+5],\r
- xmc[13+6], xmc[13+7],xmc[13+8],xmc[13+9],xmc[13+10],xmc[13+11],\r
- xmc[13+12] );\r
-\r
- fprintf(f, "#3: Nc %4.4d bc %d Mc %d xmaxc %d\n",\r
- Nc[2], bc[2], Mc[2], xmaxc[2]);\r
- fprintf(f,\r
-"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",\r
- xmc[26+0],xmc[26+1],xmc[26+2],xmc[26+3],xmc[26+4],xmc[26+5],\r
- xmc[26+6], xmc[26+7],xmc[26+8],xmc[26+9],xmc[26+10],xmc[26+11],\r
- xmc[26+12] );\r
-\r
- fprintf(f, "#4: Nc %4.4d bc %d Mc %d xmaxc %d\n",\r
- Nc[3], bc[3], Mc[3], xmaxc[3]);\r
- fprintf(f,\r
-"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",\r
- xmc[39+0],xmc[39+1],xmc[39+2],xmc[39+3],xmc[39+4],xmc[39+5],\r
- xmc[39+6], xmc[39+7],xmc[39+8],xmc[39+9],xmc[39+10],xmc[39+11],\r
- xmc[39+12] );\r
-\r
- return 0;\r
-}\r
+++ /dev/null
-/* k6opt.h vector functions optimized for MMX extensions to x86\r
- *\r
- * Copyright (C) 1999 by Stanley J. Brooks <stabro@megsinet.net>\r
- * \r
- * Any use of this software is permitted provided that this notice is not\r
- * removed and that neither the authors nor the Technische Universitaet Berlin\r
- * are deemed to have made any representations as to the suitability of this\r
- * software for any purpose nor are held responsible for any defects of\r
- * this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE;\r
- * not even the implied warranty of MERCHANTABILITY or FITNESS FOR\r
- * A PARTICULAR PURPOSE.\r
- * \r
- * Chicago, 03.12.1999\r
- * Stanley J. Brooks\r
- */\r
-\r
-extern void Weighting_filter P2((e, x),\r
- const word * e, /* signal [-5..0.39.44] IN */\r
- word * x /* signal [0..39] OUT */\r
-)\r
-;\r
-\r
-extern longword k6maxcc P3((wt,dp,Nc_out),\r
- const word *wt,\r
- const word *dp, \r
- word * Nc_out /* OUT */\r
-)\r
-;\r
-/*\r
- * k6maxmin(p,n,out[])\r
- * input p[n] is array of shorts (require n>0)\r
- * returns (long) maximum absolute value..\r
- * if out!=NULL, also returns out[0] the maximum and out[1] the minimum\r
- */\r
-extern longword k6maxmin P3((p,n,out),\r
- const word *p,\r
- int n, \r
- word *out /* out[0] is max, out[1] is min */\r
-)\r
-;\r
-\r
-extern longword k6iprod P3((p,q,n),\r
- const word *p,\r
- const word *q,\r
- int n\r
-)\r
-;\r
-\r
-/*\r
- * k6vsraw(p,n,bits)\r
- * input p[n] is array of shorts (require n>0)\r
- * shift/round each to the right by bits>=0 bits.\r
- */\r
-extern void k6vsraw P3((p,n,bits),\r
- const word *p,\r
- int n, \r
- int bits\r
-)\r
-;\r
-\r
-/*\r
- * k6vsllw(p,n,bits)\r
- * input p[n] is array of shorts (require n>0)\r
- * shift each to the left by bits>=0 bits.\r
- */\r
-extern void k6vsllw P3((p,n,bits),\r
- const word *p,\r
- int n, \r
- int bits\r
-)\r
-;\r
-\r
-#if 1 /* there isn't any significant speed gain from mmx here: */\r
-extern void Short_term_analysis_filteringx P4((u0,rp0,k_n,s),\r
- register word * u0,\r
- register word * rp0, /* [0..7] IN */\r
- register int k_n, /* k_end - k_start */\r
- register word * s /* [0..n-1] IN/OUT */\r
-)\r
-;\r
-/*\r
-#define Short_term_analysis_filtering Short_term_analysis_filteringx\r
-*/\r
-#endif\r
+++ /dev/null
- .file "k6opt.s"\r
- .version "01.01"\r
-/* gcc2_compiled.: */\r
-.section .rodata\r
- .align 4\r
- .type coefs,@object\r
- .size coefs,24\r
-coefs:\r
- .value -134\r
- .value -374\r
- .value 0\r
- .value 2054\r
- .value 5741\r
- .value 8192\r
- .value 5741\r
- .value 2054\r
- .value 0\r
- .value -374\r
- .value -134\r
- .value 0\r
-.text\r
- .align 4\r
-/* void Weighting_filter (const short *e, short *x) */\r
-.globl Weighting_filter\r
- .type Weighting_filter,@function\r
-Weighting_filter:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- pushl %edi\r
- pushl %esi\r
- pushl %ebx\r
- movl 12(%ebp),%edi\r
- movl 8(%ebp),%ebx\r
- addl $-10,%ebx\r
- emms\r
- movl $0x1000,%eax; movd %eax,%mm5 /* for rounding */\r
- movq coefs,%mm1\r
- movq coefs+8,%mm2\r
- movq coefs+16,%mm3\r
- xorl %esi,%esi\r
- .p2align 2\r
-.L21:\r
- movq (%ebx,%esi,2),%mm0\r
- pmaddwd %mm1,%mm0\r
-\r
- movq 8(%ebx,%esi,2),%mm4\r
- pmaddwd %mm2,%mm4\r
- paddd %mm4,%mm0\r
-\r
- movq 16(%ebx,%esi,2),%mm4\r
- pmaddwd %mm3,%mm4\r
- paddd %mm4,%mm0\r
-\r
- movq %mm0,%mm4\r
- punpckhdq %mm0,%mm4 /* mm4 has high int32 of mm0 dup'd */\r
- paddd %mm4,%mm0;\r
-\r
- paddd %mm5,%mm0 /* add for roundoff */\r
- psrad $13,%mm0\r
- packssdw %mm0,%mm0 \r
- movd %mm0,%eax /* ax has result */\r
- movw %ax,(%edi,%esi,2)\r
- incl %esi\r
- cmpl $39,%esi\r
- jle .L21\r
- emms\r
- popl %ebx\r
- popl %esi\r
- popl %edi\r
- leave\r
- ret\r
-.Lfe1:\r
- .size Weighting_filter,.Lfe1-Weighting_filter\r
-\r
-.macro ccstep n\r
-.if \n\r
- movq \n(%edi),%mm1\r
- movq \n(%esi),%mm2\r
-.else\r
- movq (%edi),%mm1\r
- movq (%esi),%mm2\r
-.endif\r
- pmaddwd %mm2,%mm1\r
- paddd %mm1,%mm0\r
-.endm\r
-\r
- .align 4\r
-/* long k6maxcc(const short *wt, const short *dp, short *Nc_out) */\r
-.globl k6maxcc\r
- .type k6maxcc,@function\r
-k6maxcc:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- pushl %edi\r
- pushl %esi\r
- pushl %ebx\r
- emms\r
- movl 8(%ebp),%edi\r
- movl 12(%ebp),%esi\r
- movl $0,%edx /* will be maximum inner-product */\r
- movl $40,%ebx\r
- movl %ebx,%ecx /* will be index of max inner-product */\r
- subl $80,%esi\r
- .p2align 2\r
-.L41:\r
- movq (%edi),%mm0\r
- movq (%esi),%mm2\r
- pmaddwd %mm2,%mm0\r
- ccstep 8\r
- ccstep 16\r
- ccstep 24\r
- ccstep 32\r
- ccstep 40\r
- ccstep 48\r
- ccstep 56\r
- ccstep 64\r
- ccstep 72\r
-\r
- movq %mm0,%mm1\r
- punpckhdq %mm0,%mm1 /* mm1 has high int32 of mm0 dup'd */\r
- paddd %mm1,%mm0;\r
- movd %mm0,%eax /* eax has result */\r
-\r
- cmpl %edx,%eax\r
- jle .L40\r
- movl %eax,%edx\r
- movl %ebx,%ecx\r
- .p2align 2\r
-.L40:\r
- subl $2,%esi\r
- incl %ebx\r
- cmpl $120,%ebx\r
- jle .L41\r
- movl 16(%ebp),%eax\r
- movw %cx,(%eax)\r
- movl %edx,%eax\r
- emms\r
- popl %ebx\r
- popl %esi\r
- popl %edi\r
- leave\r
- ret\r
-.Lfe2:\r
- .size k6maxcc,.Lfe2-k6maxcc\r
-\r
-\r
- .align 4\r
-/* long k6iprod (const short *p, const short *q, int n) */\r
-.globl k6iprod\r
- .type k6iprod,@function\r
-k6iprod:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- pushl %edi\r
- pushl %esi\r
- emms\r
- pxor %mm0,%mm0\r
- movl 8(%ebp),%esi\r
- movl 12(%ebp),%edi\r
- movl 16(%ebp),%eax\r
- leal -32(%esi,%eax,2),%edx /* edx = top - 32 */\r
-\r
- cmpl %edx,%esi; ja .L202\r
-\r
- .p2align 2\r
-.L201:\r
- ccstep 0\r
- ccstep 8\r
- ccstep 16\r
- ccstep 24\r
-\r
- addl $32,%esi\r
- addl $32,%edi\r
- cmpl %edx,%esi; jbe .L201\r
-\r
- .p2align 2\r
-.L202:\r
- addl $24,%edx /* now edx = top-8 */\r
- cmpl %edx,%esi; ja .L205\r
-\r
- .p2align 2\r
-.L203:\r
- ccstep 0\r
-\r
- addl $8,%esi\r
- addl $8,%edi\r
- cmpl %edx,%esi; jbe .L203\r
-\r
- .p2align 2\r
-.L205:\r
- addl $4,%edx /* now edx = top-4 */\r
- cmpl %edx,%esi; ja .L207\r
-\r
- movd (%edi),%mm1\r
- movd (%esi),%mm2\r
- pmaddwd %mm2,%mm1\r
- paddd %mm1,%mm0\r
-\r
- addl $4,%esi\r
- addl $4,%edi\r
-\r
- .p2align 2\r
-.L207:\r
- addl $2,%edx /* now edx = top-2 */\r
- cmpl %edx,%esi; ja .L209\r
-\r
- movswl (%edi),%eax\r
- movd %eax,%mm1\r
- movswl (%esi),%eax\r
- movd %eax,%mm2\r
- pmaddwd %mm2,%mm1\r
- paddd %mm1,%mm0\r
-\r
- .p2align 2\r
-.L209:\r
- movq %mm0,%mm1\r
- punpckhdq %mm0,%mm1 /* mm1 has high int32 of mm0 dup'd */\r
- paddd %mm1,%mm0;\r
- movd %mm0,%eax /* eax has result */\r
-\r
- emms\r
- popl %esi\r
- popl %edi\r
- leave\r
- ret\r
-.Lfe3:\r
- .size k6iprod,.Lfe3-k6iprod\r
-\r
-\r
- .align 4\r
-/* void k6vsraw P3((short *p, int n, int bits) */\r
-.globl k6vsraw\r
- .type k6vsraw,@function\r
-k6vsraw:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- pushl %esi\r
- movl 8(%ebp),%esi\r
- movl 16(%ebp),%ecx\r
- andl %ecx,%ecx; jle .L399\r
- movl 12(%ebp),%eax\r
- leal -16(%esi,%eax,2),%edx /* edx = top - 16 */\r
- emms\r
- movd %ecx,%mm3\r
- movq ones,%mm2\r
- psllw %mm3,%mm2; psrlw $1,%mm2\r
- cmpl %edx,%esi; ja .L306\r
-\r
- .p2align 2\r
-.L302: /* 8 words per iteration */\r
- movq (%esi),%mm0\r
- movq 8(%esi),%mm1\r
- paddsw %mm2,%mm0\r
- psraw %mm3,%mm0;\r
- paddsw %mm2,%mm1\r
- psraw %mm3,%mm1;\r
- movq %mm0,(%esi)\r
- movq %mm1,8(%esi)\r
- addl $16,%esi\r
- cmpl %edx,%esi\r
- jbe .L302\r
-\r
- .p2align 2\r
-.L306:\r
- addl $12,%edx /* now edx = top-4 */\r
- cmpl %edx,%esi; ja .L310\r
-\r
- .p2align 2\r
-.L308: /* do up to 6 words, two at a time */\r
- movd (%esi),%mm0\r
- paddsw %mm2,%mm0\r
- psraw %mm3,%mm0;\r
- movd %mm0,(%esi)\r
- addl $4,%esi\r
- cmpl %edx,%esi\r
- jbe .L308\r
-\r
- .p2align 2\r
-.L310:\r
- addl $2,%edx /* now edx = top-2 */\r
- cmpl %edx,%esi; ja .L315\r
- \r
- movzwl (%esi),%eax\r
- movd %eax,%mm0\r
- paddsw %mm2,%mm0\r
- psraw %mm3,%mm0;\r
- movd %mm0,%eax\r
- movw %ax,(%esi)\r
-\r
- .p2align 2\r
-.L315:\r
- emms\r
-.L399:\r
- popl %esi\r
- leave\r
- ret\r
-.Lfe4:\r
- .size k6vsraw,.Lfe4-k6vsraw\r
- \r
- .align 4\r
-/* void k6vsllw P3((short *p, int n, int bits) */\r
-.globl k6vsllw\r
- .type k6vsllw,@function\r
-k6vsllw:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- pushl %esi\r
- movl 8(%ebp),%esi\r
- movl 16(%ebp),%ecx\r
- andl %ecx,%ecx; jle .L499\r
- movl 12(%ebp),%eax\r
- leal -16(%esi,%eax,2),%edx /* edx = top - 16 */\r
- emms\r
- movd %ecx,%mm3\r
- cmpl %edx,%esi; ja .L406\r
-\r
- .p2align 2\r
-.L402: /* 8 words per iteration */\r
- movq (%esi),%mm0\r
- movq 8(%esi),%mm1\r
- psllw %mm3,%mm0;\r
- psllw %mm3,%mm1;\r
- movq %mm0,(%esi)\r
- movq %mm1,8(%esi)\r
- addl $16,%esi\r
- cmpl %edx,%esi\r
- jbe .L402\r
-\r
- .p2align 2\r
-.L406:\r
- addl $12,%edx /* now edx = top-4 */\r
- cmpl %edx,%esi; ja .L410\r
-\r
- .p2align 2\r
-.L408: /* do up to 6 words, two at a time */\r
- movd (%esi),%mm0\r
- psllw %mm3,%mm0;\r
- movd %mm0,(%esi)\r
- addl $4,%esi\r
- cmpl %edx,%esi\r
- jbe .L408\r
-\r
- .p2align 2\r
-.L410:\r
- addl $2,%edx /* now edx = top-2 */\r
- cmpl %edx,%esi; ja .L415\r
- \r
- movzwl (%esi),%eax\r
- movd %eax,%mm0\r
- psllw %mm3,%mm0;\r
- movd %mm0,%eax\r
- movw %ax,(%esi)\r
-\r
- .p2align 2\r
-.L415:\r
- emms\r
-.L499:\r
- popl %esi\r
- leave\r
- ret\r
-.Lfe5:\r
- .size k6vsllw,.Lfe5-k6vsllw\r
-\r
-\r
-.section .rodata\r
- .align 4\r
- .type extremes,@object\r
- .size extremes,8\r
-extremes:\r
- .long 0x80008000\r
- .long 0x7fff7fff\r
- .type ones,@object\r
- .size ones,8\r
-ones:\r
- .long 0x00010001\r
- .long 0x00010001\r
-\r
-.text\r
- .align 4\r
-/* long k6maxmin (const short *p, int n, short *out) */\r
-.globl k6maxmin\r
- .type k6maxmin,@function\r
-k6maxmin:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- pushl %esi\r
- emms\r
- movl 8(%ebp),%esi\r
- movl 12(%ebp),%eax\r
- leal -8(%esi,%eax,2),%edx\r
-\r
- cmpl %edx,%esi\r
- jbe .L52\r
- movd extremes,%mm0\r
- movd extremes+4,%mm1\r
- jmp .L58\r
-\r
- .p2align 2\r
-.L52:\r
- movq (%esi),%mm0 /* mm0 will be max's */\r
- movq %mm0,%mm1 /* mm1 will be min's */\r
- addl $8,%esi\r
- cmpl %edx,%esi\r
- ja .L56\r
-\r
- .p2align 2\r
-.L54:\r
- movq (%esi),%mm2\r
-\r
- movq %mm2,%mm3\r
- pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */ \r
- movq %mm3,%mm4\r
- pand %mm2,%mm3 /* mm3 is mm2 masked to new max's */\r
- pandn %mm0,%mm4 /* mm4 is mm0 masked to its max's */\r
- por %mm3,%mm4\r
- movq %mm4,%mm0 /* now mm0 is updated max's */\r
- \r
- movq %mm1,%mm3\r
- pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */ \r
- pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */\r
- pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */\r
- por %mm3,%mm2\r
- movq %mm2,%mm1 /* now mm1 is updated min's */\r
-\r
- addl $8,%esi\r
- cmpl %edx,%esi\r
- jbe .L54\r
-\r
- .p2align 2\r
-.L56: /* merge down the 4-word max/mins to lower 2 words */\r
-\r
- movq %mm0,%mm2\r
- psrlq $32,%mm2\r
- movq %mm2,%mm3\r
- pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */ \r
- pand %mm3,%mm2 /* mm2 is mm2 masked to new max's */\r
- pandn %mm0,%mm3 /* mm3 is mm0 masked to its max's */\r
- por %mm3,%mm2\r
- movq %mm2,%mm0 /* now mm0 is updated max's */\r
-\r
- movq %mm1,%mm2\r
- psrlq $32,%mm2\r
- movq %mm1,%mm3\r
- pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */ \r
- pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */\r
- pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */\r
- por %mm3,%mm2\r
- movq %mm2,%mm1 /* now mm1 is updated min's */\r
-\r
- .p2align 2\r
-.L58:\r
- addl $4,%edx /* now dx = top-4 */\r
- cmpl %edx,%esi\r
- ja .L62\r
- /* here, there are >= 2 words of input remaining */\r
- movd (%esi),%mm2\r
-\r
- movq %mm2,%mm3\r
- pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */ \r
- movq %mm3,%mm4\r
- pand %mm2,%mm3 /* mm3 is mm2 masked to new max's */\r
- pandn %mm0,%mm4 /* mm4 is mm0 masked to its max's */\r
- por %mm3,%mm4\r
- movq %mm4,%mm0 /* now mm0 is updated max's */\r
- \r
- movq %mm1,%mm3\r
- pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */ \r
- pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */\r
- pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */\r
- por %mm3,%mm2\r
- movq %mm2,%mm1 /* now mm1 is updated min's */\r
-\r
- addl $4,%esi\r
-\r
- .p2align 2\r
-.L62:\r
- /* merge down the 2-word max/mins to 1 word */\r
-\r
- movq %mm0,%mm2\r
- psrlq $16,%mm2\r
- movq %mm2,%mm3\r
- pcmpgtw %mm0,%mm3 /* mm3 is bitmask for words where mm2 > mm0 */ \r
- pand %mm3,%mm2 /* mm2 is mm2 masked to new max's */\r
- pandn %mm0,%mm3 /* mm3 is mm0 masked to its max's */\r
- por %mm3,%mm2\r
- movd %mm2,%ecx /* cx is max so far */\r
-\r
- movq %mm1,%mm2\r
- psrlq $16,%mm2\r
- movq %mm1,%mm3\r
- pcmpgtw %mm2,%mm3 /* mm3 is bitmask for words where mm2 < mm1 */ \r
- pand %mm3,%mm2 /* mm2 is mm2 masked to new min's */\r
- pandn %mm1,%mm3 /* mm3 is mm1 masked to its min's */\r
- por %mm3,%mm2\r
- movd %mm2,%eax /* ax is min so far */\r
- \r
- addl $2,%edx /* now dx = top-2 */\r
- cmpl %edx,%esi\r
- ja .L65\r
-\r
- /* here, there is one word of input left */\r
- cmpw (%esi),%cx\r
- jge .L64\r
- movw (%esi),%cx\r
- .p2align 2\r
-.L64:\r
- cmpw (%esi),%ax\r
- jle .L65\r
- movw (%esi),%ax\r
-\r
- .p2align 2\r
-.L65: /* (finally!) cx is the max, ax the min */\r
- movswl %cx,%ecx\r
- movswl %ax,%eax\r
-\r
- movl 16(%ebp),%edx /* ptr to output max,min vals */\r
- andl %edx,%edx; jz .L77\r
- movw %cx,(%edx) /* max */\r
- movw %ax,2(%edx) /* min */\r
- .p2align 2\r
-.L77:\r
- /* now calculate max absolute val */\r
- negl %eax\r
- cmpl %ecx,%eax\r
- jge .L81\r
- movl %ecx,%eax\r
- .p2align 2\r
-.L81:\r
- emms\r
- popl %esi\r
- leave\r
- ret\r
-.Lfe6:\r
- .size k6maxmin,.Lfe6-k6maxmin\r
-\r
-/* void Short_term_analysis_filtering (short *u0, const short *rp0, int kn, short *s) */\r
- .equiv pm_u0,8\r
- .equiv pm_rp0,12\r
- .equiv pm_kn,16\r
- .equiv pm_s,20\r
- .equiv lv_u_top,-4\r
- .equiv lv_s_top,-8\r
- .equiv lv_rp,-40 /* local version of rp0 with each word twice */\r
- .align 4\r
-.globl Short_term_analysis_filteringx\r
- .type Short_term_analysis_filteringx,@function\r
-Short_term_analysis_filteringx:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- subl $40,%esp\r
- pushl %edi\r
- pushl %esi\r
-\r
- movl pm_rp0(%ebp),%esi;\r
- leal lv_rp(%ebp),%edi;\r
- cld\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- emms\r
- movl $0x4000,%eax;\r
- movd %eax,%mm4;\r
- punpckldq %mm4,%mm4 /* (0x00004000,0x00004000) for rounding dword product pairs */\r
-\r
- movl pm_u0(%ebp),%eax\r
- addl $16,%eax\r
- movl %eax,lv_u_top(%ebp) /* UTOP */\r
- movl pm_s(%ebp),%edx /* edx is local s ptr throughout below */\r
- movl pm_kn(%ebp),%eax\r
- leal (%edx,%eax,2),%eax\r
- movl %eax,lv_s_top(%ebp)\r
- cmpl %eax,%edx\r
- jae .L179\r
- .p2align 2\r
-.L181:\r
- leal lv_rp(%ebp),%esi /* RP */\r
- movl pm_u0(%ebp),%edi /* U */\r
- movw (%edx),%ax /* (0,DI) */\r
- roll $16,%eax\r
- movw (%edx),%ax /* (DI,DI) */\r
- .p2align 2\r
-.L185: /* RP is %esi */\r
- movl %eax,%ecx\r
- movw (%edi),%ax /* (DI,U) */\r
- movd (%esi),%mm3 /* mm3 is (0,0,RP,RP) */\r
- movw %cx,(%edi)\r
-\r
- movd %eax,%mm2 /* mm2 is (0,0,DI,U) */\r
- rorl $16,%eax \r
- movd %eax,%mm1 /* mm1 is (0,0,U,DI) */\r
-\r
- movq %mm1,%mm0\r
- pmullw %mm3,%mm0\r
- pmulhw %mm3,%mm1\r
- punpcklwd %mm1,%mm0 /* mm0 is (RP*U,RP*DI) */\r
- paddd %mm4,%mm0 /* mm4 is 0x00004000,0x00004000 */\r
- psrad $15,%mm0 /* (RP*U,RP*DI) adjusted */\r
- packssdw %mm0,%mm0 /* (*,*,RP*U,RP*DI) adjusted and saturated to word */\r
- paddsw %mm2,%mm0 /* mm0 is (?,?, DI', U') */\r
- movd %mm0,%eax /* (DI,U') */\r
-\r
- addl $2,%edi\r
- addl $4,%esi\r
- cmpl lv_u_top(%ebp),%edi\r
- jb .L185\r
-\r
- rorl $16,%eax\r
- movw %ax,(%edx) /* last DI goes to *s */\r
- addl $2,%edx /* next s */\r
- cmpl lv_s_top(%ebp),%edx\r
- jb .L181\r
- .p2align 2\r
-.L179:\r
- emms\r
- popl %esi\r
- popl %edi\r
- leave\r
- ret\r
-.Lfe7:\r
- .size Short_term_analysis_filteringx,.Lfe7-Short_term_analysis_filteringx\r
-\r
-.end\r
-\r
-/* 'as' macro's seem to be case-insensitive */\r
-.macro STEP n\r
-.if \n\r
- movd \n(%esi),%mm3 /* mm3 is (0,0,RP,RP) */\r
-.else\r
- movd (%esi),%mm3 /* mm3 is (0,0,RP,RP) */\r
-.endif\r
- movq %mm5,%mm1;\r
- movd %mm4,%ecx; movw %cx,%ax /* (DI,U) */\r
- psllq $48,%mm1; psrlq $16,%mm4; por %mm1,%mm4\r
- psllq $48,%mm0; psrlq $16,%mm5; por %mm0,%mm5\r
-\r
- movd %eax,%mm2 /* mm2 is (0,0,DI,U) */\r
- rorl $16,%eax \r
- movd %eax,%mm1 /* mm1 is (0,0,U,DI) */\r
-\r
- movq %mm1,%mm0\r
- pmullw %mm3,%mm0\r
- pmulhw %mm3,%mm1\r
- punpcklwd %mm1,%mm0 /* mm0 is (RP*U,RP*DI) */\r
- paddd %mm6,%mm0 /* mm6 is 0x00004000,0x00004000 */\r
- psrad $15,%mm0 /* (RP*U,RP*DI) adjusted */\r
- packssdw %mm0,%mm0 /* (*,*,RP*U,RP*DI) adjusted and saturated to word */\r
- paddsw %mm2,%mm0 /* mm0 is (?,?, DI', U') */\r
- movd %mm0,%eax /* (DI,U') */\r
-.endm\r
-\r
-/* void Short_term_analysis_filtering (short *u0, const short *rp0, int kn, short *s) */\r
- .equiv pm_u0,8\r
- .equiv pm_rp0,12\r
- .equiv pm_kn,16\r
- .equiv pm_s,20\r
- .equiv lv_rp_top,-4\r
- .equiv lv_s_top,-8\r
- .equiv lv_rp,-40 /* local version of rp0 with each word twice */\r
- .align 4\r
-.globl Short_term_analysis_filteringx\r
- .type Short_term_analysis_filteringx,@function\r
-Short_term_analysis_filteringx:\r
- pushl %ebp\r
- movl %esp,%ebp\r
- subl $56,%esp\r
- pushl %edi\r
- pushl %esi\r
- pushl %ebx\r
-\r
- movl pm_rp0(%ebp),%esi;\r
- leal lv_rp(%ebp),%edi;\r
- cld\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- lodsw; stosw; stosw\r
- movl %edi,lv_rp_top(%ebp)\r
- emms\r
-\r
- movl $0x4000,%eax;\r
- movd %eax,%mm6;\r
- punpckldq %mm6,%mm6 /* (0x00004000,0x00004000) for rounding dword product pairs */\r
-\r
- movl pm_u0(%ebp),%ebx\r
- movq (%ebx),%mm4; movq 8(%ebx),%mm5 /* the 8 u's */\r
- movl pm_s(%ebp),%edx /* edx is local s ptr throughout below */\r
- movl pm_kn(%ebp),%eax\r
- leal (%edx,%eax,2),%eax\r
- movl %eax,lv_s_top(%ebp)\r
- cmpl %eax,%edx\r
- jae .L179\r
- .p2align 2\r
-.L181:\r
- leal lv_rp(%ebp),%esi /* RP */\r
- movw (%edx),%ax /* (0,DI) */\r
- roll $16,%eax\r
- movw (%edx),%ax /* (DI,DI) */\r
- movd %eax,%mm0\r
- .p2align 2\r
-.L185: /* RP is %esi */\r
- step 0\r
- step 4\r
- step 8\r
- step 12\r
-/*\r
- step 16\r
- step 20\r
- step 24\r
- step 28\r
-*/\r
- addl $16,%esi\r
- cmpl lv_rp_top(%ebp),%esi \r
- jb .L185\r
-\r
- rorl $16,%eax\r
- movw %ax,(%edx) /* last DI goes to *s */\r
- addl $2,%edx /* next s */\r
- cmpl lv_s_top(%ebp),%edx\r
- jb .L181\r
-.L179:\r
- movq %mm4,(%ebx); movq %mm5,8(%ebx) /* the 8 u's */\r
- emms\r
- popl %ebx\r
- popl %esi\r
- popl %edi\r
- leave\r
- ret\r
-.Lfe7:\r
- .size Short_term_analysis_filteringx,.Lfe7-Short_term_analysis_filteringx\r
- .ident "GCC: (GNU) 2.95.2 19991109 (Debian GNU/Linux)"\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-#ifdef K6OPT\r
-#include "k6opt.h"\r
-#endif\r
-/*\r
- * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION\r
- */\r
-\r
-\r
-/*\r
- * This module computes the LTP gain (bc) and the LTP lag (Nc)\r
- * for the long term analysis filter. This is done by calculating a\r
- * maximum of the cross-correlation function between the current\r
- * sub-segment short term residual signal d[0..39] (output of\r
- * the short term analysis filter; for simplification the index\r
- * of this array begins at 0 and ends at 39 for each sub-segment of the\r
- * RPE-LTP analysis) and the previous reconstructed short term\r
- * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be\r
- * performed to avoid overflow.\r
- */\r
-\r
- /* The next procedure exists in six versions. First two integer\r
- * version (if USE_FLOAT_MUL is not defined); then four floating\r
- * point versions, twice with proper scaling (USE_FLOAT_MUL defined),\r
- * once without (USE_FLOAT_MUL and FAST defined, and fast run-time\r
- * option used). Every pair has first a Cut version (see the -C\r
- * option to toast or the LTP_CUT option to gsm_option()), then the\r
- * uncut one. (For a detailed explanation of why this is altogether\r
- * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered\r
- * Harmful''.)\r
- */\r
-\r
-#ifndef USE_FLOAT_MUL\r
-\r
-#ifdef LTP_CUT\r
-\r
-static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),\r
-\r
- struct gsm_state * st,\r
-\r
- register word * d, /* [0..39] IN */\r
- register word * dp, /* [-120..-1] IN */\r
- word * bc_out, /* OUT */\r
- word * Nc_out /* OUT */\r
-)\r
-{\r
- register int k, lambda;\r
- word Nc, bc;\r
- word wt[40];\r
-\r
- longword L_result;\r
- longword L_max, L_power;\r
- word R, S, dmax, scal, best_k;\r
- word ltp_cut;\r
-\r
- register word temp, wt_k;\r
-\r
- /* Search of the optimum scaling of d[0..39].\r
- */\r
- dmax = 0;\r
- for (k = 0; k <= 39; k++) {\r
- temp = d[k];\r
- temp = GSM_ABS( temp );\r
- if (temp > dmax) {\r
- dmax = temp;\r
- best_k = k;\r
- }\r
- }\r
- temp = 0;\r
- if (dmax == 0) scal = 0;\r
- else {\r
- assert(dmax > 0);\r
- temp = gsm_norm( (longword)dmax << 16 );\r
- }\r
- if (temp > 6) scal = 0;\r
- else scal = 6 - temp;\r
- assert(scal >= 0);\r
-\r
- /* Search for the maximum cross-correlation and coding of the LTP lag\r
- */\r
- L_max = 0;\r
- Nc = 40; /* index for the maximum cross-correlation */\r
- wt_k = SASR(d[best_k], scal);\r
-\r
- for (lambda = 40; lambda <= 120; lambda++) {\r
- L_result = (longword)wt_k * dp[best_k - lambda];\r
- if (L_result > L_max) {\r
- Nc = lambda;\r
- L_max = L_result;\r
- }\r
- }\r
- *Nc_out = Nc;\r
- L_max <<= 1;\r
-\r
- /* Rescaling of L_max\r
- */\r
- assert(scal <= 100 && scal >= -100);\r
- L_max = L_max >> (6 - scal); /* sub(6, scal) */\r
-\r
- assert( Nc <= 120 && Nc >= 40);\r
-\r
- /* Compute the power of the reconstructed short term residual\r
- * signal dp[..]\r
- */\r
- L_power = 0;\r
- for (k = 0; k <= 39; k++) {\r
-\r
- register longword L_temp;\r
-\r
- L_temp = SASR( dp[k - Nc], 3 );\r
- L_power += L_temp * L_temp;\r
- }\r
- L_power <<= 1; /* from L_MULT */\r
-\r
- /* Normalization of L_max and L_power\r
- */\r
-\r
- if (L_max <= 0) {\r
- *bc_out = 0;\r
- return;\r
- }\r
- if (L_max >= L_power) {\r
- *bc_out = 3;\r
- return;\r
- }\r
-\r
- temp = gsm_norm( L_power );\r
-\r
- R = SASR( L_max << temp, 16 );\r
- S = SASR( L_power << temp, 16 );\r
-\r
- /* Coding of the LTP gain\r
- */\r
-\r
- /* Table 4.3a must be used to obtain the level DLB[i] for the\r
- * quantization of the LTP gain b to get the coded version bc.\r
- */\r
- for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
- *bc_out = bc;\r
-}\r
-\r
-#endif /* LTP_CUT */\r
-\r
-static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),\r
- register word * d, /* [0..39] IN */\r
- register word * dp, /* [-120..-1] IN */\r
- word * bc_out, /* OUT */\r
- word * Nc_out /* OUT */\r
-)\r
-{\r
- register int k, lambda;\r
- word Nc, bc;\r
- word wt[40];\r
-\r
- longword L_max, L_power;\r
- word R, S, dmax, scal;\r
- register word temp;\r
-\r
- /* Search of the optimum scaling of d[0..39].\r
- */\r
- dmax = 0;\r
-\r
- for (k = 0; k <= 39; k++) {\r
- temp = d[k];\r
- temp = GSM_ABS( temp );\r
- if (temp > dmax) dmax = temp;\r
- }\r
-\r
- temp = 0;\r
- if (dmax == 0) scal = 0;\r
- else {\r
- assert(dmax > 0);\r
- temp = gsm_norm( (longword)dmax << 16 );\r
- }\r
-\r
- if (temp > 6) scal = 0;\r
- else scal = 6 - temp;\r
-\r
- assert(scal >= 0);\r
-\r
- /* Initialization of a working array wt\r
- */\r
-\r
- for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal );\r
-\r
- /* Search for the maximum cross-correlation and coding of the LTP lag\r
- */\r
-# ifdef K6OPT\r
- L_max = k6maxcc(wt,dp,&Nc);\r
-# else\r
- L_max = 0;\r
- Nc = 40; /* index for the maximum cross-correlation */\r
-\r
- for (lambda = 40; lambda <= 120; lambda++) {\r
-\r
-# undef STEP\r
-# define STEP(k) (longword)wt[k] * dp[k - lambda]\r
-\r
- register longword L_result;\r
-\r
- L_result = STEP(0) ; L_result += STEP(1) ;\r
- L_result += STEP(2) ; L_result += STEP(3) ;\r
- L_result += STEP(4) ; L_result += STEP(5) ;\r
- L_result += STEP(6) ; L_result += STEP(7) ;\r
- L_result += STEP(8) ; L_result += STEP(9) ;\r
- L_result += STEP(10) ; L_result += STEP(11) ;\r
- L_result += STEP(12) ; L_result += STEP(13) ;\r
- L_result += STEP(14) ; L_result += STEP(15) ;\r
- L_result += STEP(16) ; L_result += STEP(17) ;\r
- L_result += STEP(18) ; L_result += STEP(19) ;\r
- L_result += STEP(20) ; L_result += STEP(21) ;\r
- L_result += STEP(22) ; L_result += STEP(23) ;\r
- L_result += STEP(24) ; L_result += STEP(25) ;\r
- L_result += STEP(26) ; L_result += STEP(27) ;\r
- L_result += STEP(28) ; L_result += STEP(29) ;\r
- L_result += STEP(30) ; L_result += STEP(31) ;\r
- L_result += STEP(32) ; L_result += STEP(33) ;\r
- L_result += STEP(34) ; L_result += STEP(35) ;\r
- L_result += STEP(36) ; L_result += STEP(37) ;\r
- L_result += STEP(38) ; L_result += STEP(39) ;\r
-\r
- if (L_result > L_max) {\r
-\r
- Nc = lambda;\r
- L_max = L_result;\r
- }\r
- }\r
-# endif\r
- *Nc_out = Nc;\r
-\r
- L_max <<= 1;\r
-\r
- /* Rescaling of L_max\r
- */\r
- assert(scal <= 100 && scal >= -100);\r
- L_max = L_max >> (6 - scal); /* sub(6, scal) */\r
-\r
- assert( Nc <= 120 && Nc >= 40);\r
-\r
- /* Compute the power of the reconstructed short term residual\r
- * signal dp[..]\r
- */\r
- L_power = 0;\r
- for (k = 0; k <= 39; k++) {\r
-\r
- register longword L_temp;\r
-\r
- L_temp = SASR( dp[k - Nc], 3 );\r
- L_power += L_temp * L_temp;\r
- }\r
- L_power <<= 1; /* from L_MULT */\r
-\r
- /* Normalization of L_max and L_power\r
- */\r
-\r
- if (L_max <= 0) {\r
- *bc_out = 0;\r
- return;\r
- }\r
- if (L_max >= L_power) {\r
- *bc_out = 3;\r
- return;\r
- }\r
-\r
- temp = gsm_norm( L_power );\r
-\r
- R = SASR( L_max << temp, 16 );\r
- S = SASR( L_power << temp, 16 );\r
-\r
- /* Coding of the LTP gain\r
- */\r
-\r
- /* Table 4.3a must be used to obtain the level DLB[i] for the\r
- * quantization of the LTP gain b to get the coded version bc.\r
- */\r
- for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
- *bc_out = bc;\r
-}\r
-\r
-#else /* USE_FLOAT_MUL */\r
-\r
-#ifdef LTP_CUT\r
-\r
-static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),\r
- struct gsm_state * st, /* IN */\r
- register word * d, /* [0..39] IN */\r
- register word * dp, /* [-120..-1] IN */\r
- word * bc_out, /* OUT */\r
- word * Nc_out /* OUT */\r
-)\r
-{\r
- register int k, lambda;\r
- word Nc, bc;\r
- word ltp_cut;\r
-\r
- float wt_float[40];\r
- float dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
- longword L_max, L_power;\r
- word R, S, dmax, scal;\r
- register word temp;\r
-\r
- /* Search of the optimum scaling of d[0..39].\r
- */\r
- dmax = 0;\r
-\r
- for (k = 0; k <= 39; k++) {\r
- temp = d[k];\r
- temp = GSM_ABS( temp );\r
- if (temp > dmax) dmax = temp;\r
- }\r
-\r
- temp = 0;\r
- if (dmax == 0) scal = 0;\r
- else {\r
- assert(dmax > 0);\r
- temp = gsm_norm( (longword)dmax << 16 );\r
- }\r
-\r
- if (temp > 6) scal = 0;\r
- else scal = 6 - temp;\r
-\r
- assert(scal >= 0);\r
- ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; \r
-\r
-\r
- /* Initialization of a working array wt\r
- */\r
-\r
- for (k = 0; k < 40; k++) {\r
- register word w = SASR( d[k], scal );\r
- if (w < 0 ? w > -ltp_cut : w < ltp_cut) {\r
- wt_float[k] = 0.0;\r
- }\r
- else {\r
- wt_float[k] = w;\r
- }\r
- }\r
- for (k = -120; k < 0; k++) dp_float[k] = dp[k];\r
-\r
- /* Search for the maximum cross-correlation and coding of the LTP lag\r
- */\r
- L_max = 0;\r
- Nc = 40; /* index for the maximum cross-correlation */\r
-\r
- for (lambda = 40; lambda <= 120; lambda += 9) {\r
-\r
- /* Calculate L_result for l = lambda .. lambda + 9.\r
- */\r
- register float *lp = dp_float - lambda;\r
-\r
- register float W;\r
- register float a = lp[-8], b = lp[-7], c = lp[-6],\r
- d = lp[-5], e = lp[-4], f = lp[-3],\r
- g = lp[-2], h = lp[-1];\r
- register float E; \r
- register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,\r
- S5 = 0, S6 = 0, S7 = 0, S8 = 0;\r
-\r
-# undef STEP\r
-# define STEP(K, a, b, c, d, e, f, g, h) \\r
- if ((W = wt_float[K]) != 0.0) { \\r
- E = W * a; S8 += E; \\r
- E = W * b; S7 += E; \\r
- E = W * c; S6 += E; \\r
- E = W * d; S5 += E; \\r
- E = W * e; S4 += E; \\r
- E = W * f; S3 += E; \\r
- E = W * g; S2 += E; \\r
- E = W * h; S1 += E; \\r
- a = lp[K]; \\r
- E = W * a; S0 += E; } else (a = lp[K])\r
-\r
-# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)\r
-# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)\r
-# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)\r
-# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)\r
-# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)\r
-# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)\r
-# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)\r
-# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)\r
-\r
- STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);\r
- STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);\r
-\r
- STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);\r
- STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);\r
-\r
- STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);\r
- STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);\r
-\r
- STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);\r
- STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);\r
-\r
- STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);\r
- STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);\r
-\r
- if (S0 > L_max) { L_max = S0; Nc = lambda; }\r
- if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }\r
- if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }\r
- if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }\r
- if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }\r
- if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }\r
- if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }\r
- if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }\r
- if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }\r
-\r
- }\r
- *Nc_out = Nc;\r
-\r
- L_max <<= 1;\r
-\r
- /* Rescaling of L_max\r
- */\r
- assert(scal <= 100 && scal >= -100);\r
- L_max = L_max >> (6 - scal); /* sub(6, scal) */\r
-\r
- assert( Nc <= 120 && Nc >= 40);\r
-\r
- /* Compute the power of the reconstructed short term residual\r
- * signal dp[..]\r
- */\r
- L_power = 0;\r
- for (k = 0; k <= 39; k++) {\r
-\r
- register longword L_temp;\r
-\r
- L_temp = SASR( dp[k - Nc], 3 );\r
- L_power += L_temp * L_temp;\r
- }\r
- L_power <<= 1; /* from L_MULT */\r
-\r
- /* Normalization of L_max and L_power\r
- */\r
-\r
- if (L_max <= 0) {\r
- *bc_out = 0;\r
- return;\r
- }\r
- if (L_max >= L_power) {\r
- *bc_out = 3;\r
- return;\r
- }\r
-\r
- temp = gsm_norm( L_power );\r
-\r
- R = SASR( L_max << temp, 16 );\r
- S = SASR( L_power << temp, 16 );\r
-\r
- /* Coding of the LTP gain\r
- */\r
-\r
- /* Table 4.3a must be used to obtain the level DLB[i] for the\r
- * quantization of the LTP gain b to get the coded version bc.\r
- */\r
- for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
- *bc_out = bc;\r
-}\r
-\r
-#endif /* LTP_CUT */\r
-\r
-static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),\r
- register word * d, /* [0..39] IN */\r
- register word * dp, /* [-120..-1] IN */\r
- word * bc_out, /* OUT */\r
- word * Nc_out /* OUT */\r
-)\r
-{\r
- register int k, lambda;\r
- word Nc, bc;\r
-\r
- float wt_float[40];\r
- float dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
- longword L_max, L_power;\r
- word R, S, dmax, scal;\r
- register word temp;\r
-\r
- /* Search of the optimum scaling of d[0..39].\r
- */\r
- dmax = 0;\r
-\r
- for (k = 0; k <= 39; k++) {\r
- temp = d[k];\r
- temp = GSM_ABS( temp );\r
- if (temp > dmax) dmax = temp;\r
- }\r
-\r
- temp = 0;\r
- if (dmax == 0) scal = 0;\r
- else {\r
- assert(dmax > 0);\r
- temp = gsm_norm( (longword)dmax << 16 );\r
- }\r
-\r
- if (temp > 6) scal = 0;\r
- else scal = 6 - temp;\r
-\r
- assert(scal >= 0);\r
-\r
- /* Initialization of a working array wt\r
- */\r
-\r
- for (k = 0; k < 40; k++) wt_float[k] = SASR( d[k], scal );\r
- for (k = -120; k < 0; k++) dp_float[k] = dp[k];\r
-\r
- /* Search for the maximum cross-correlation and coding of the LTP lag\r
- */\r
- L_max = 0;\r
- Nc = 40; /* index for the maximum cross-correlation */\r
-\r
- for (lambda = 40; lambda <= 120; lambda += 9) {\r
-\r
- /* Calculate L_result for l = lambda .. lambda + 9.\r
- */\r
- register float *lp = dp_float - lambda;\r
-\r
- register float W;\r
- register float a = lp[-8], b = lp[-7], c = lp[-6],\r
- d = lp[-5], e = lp[-4], f = lp[-3],\r
- g = lp[-2], h = lp[-1];\r
- register float E; \r
- register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,\r
- S5 = 0, S6 = 0, S7 = 0, S8 = 0;\r
-\r
-# undef STEP\r
-# define STEP(K, a, b, c, d, e, f, g, h) \\r
- W = wt_float[K]; \\r
- E = W * a; S8 += E; \\r
- E = W * b; S7 += E; \\r
- E = W * c; S6 += E; \\r
- E = W * d; S5 += E; \\r
- E = W * e; S4 += E; \\r
- E = W * f; S3 += E; \\r
- E = W * g; S2 += E; \\r
- E = W * h; S1 += E; \\r
- a = lp[K]; \\r
- E = W * a; S0 += E\r
-\r
-# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)\r
-# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)\r
-# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)\r
-# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)\r
-# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)\r
-# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)\r
-# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)\r
-# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)\r
-\r
- STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);\r
- STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);\r
-\r
- STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);\r
- STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);\r
-\r
- STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);\r
- STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);\r
-\r
- STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);\r
- STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);\r
-\r
- STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);\r
- STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);\r
-\r
- if (S0 > L_max) { L_max = S0; Nc = lambda; }\r
- if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }\r
- if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }\r
- if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }\r
- if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }\r
- if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }\r
- if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }\r
- if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }\r
- if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }\r
- }\r
- *Nc_out = Nc;\r
-\r
- L_max <<= 1;\r
-\r
- /* Rescaling of L_max\r
- */\r
- assert(scal <= 100 && scal >= -100);\r
- L_max = L_max >> (6 - scal); /* sub(6, scal) */\r
-\r
- assert( Nc <= 120 && Nc >= 40);\r
-\r
- /* Compute the power of the reconstructed short term residual\r
- * signal dp[..]\r
- */\r
- L_power = 0;\r
- for (k = 0; k <= 39; k++) {\r
-\r
- register longword L_temp;\r
-\r
- L_temp = SASR( dp[k - Nc], 3 );\r
- L_power += L_temp * L_temp;\r
- }\r
- L_power <<= 1; /* from L_MULT */\r
-\r
- /* Normalization of L_max and L_power\r
- */\r
-\r
- if (L_max <= 0) {\r
- *bc_out = 0;\r
- return;\r
- }\r
- if (L_max >= L_power) {\r
- *bc_out = 3;\r
- return;\r
- }\r
-\r
- temp = gsm_norm( L_power );\r
-\r
- R = SASR( L_max << temp, 16 );\r
- S = SASR( L_power << temp, 16 );\r
-\r
- /* Coding of the LTP gain\r
- */\r
-\r
- /* Table 4.3a must be used to obtain the level DLB[i] for the\r
- * quantization of the LTP gain b to get the coded version bc.\r
- */\r
- for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;\r
- *bc_out = bc;\r
-}\r
-\r
-#ifdef FAST\r
-#ifdef LTP_CUT\r
-\r
-static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st,\r
- d,dp,bc_out,Nc_out),\r
- struct gsm_state * st, /* IN */\r
- register word * d, /* [0..39] IN */\r
- register word * dp, /* [-120..-1] IN */\r
- word * bc_out, /* OUT */\r
- word * Nc_out /* OUT */\r
-)\r
-{\r
- register int k, lambda;\r
- register float wt_float;\r
- word Nc, bc;\r
- word wt_max, best_k, ltp_cut;\r
-\r
- float dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
- register float L_result, L_max, L_power;\r
-\r
- wt_max = 0;\r
-\r
- for (k = 0; k < 40; ++k) {\r
- if ( d[k] > wt_max) wt_max = d[best_k = k];\r
- else if (-d[k] > wt_max) wt_max = -d[best_k = k];\r
- }\r
-\r
- assert(wt_max >= 0);\r
- wt_float = (float)wt_max;\r
-\r
- for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];\r
-\r
- /* Search for the maximum cross-correlation and coding of the LTP lag\r
- */\r
- L_max = 0;\r
- Nc = 40; /* index for the maximum cross-correlation */\r
-\r
- for (lambda = 40; lambda <= 120; lambda++) {\r
- L_result = wt_float * dp_float[best_k - lambda];\r
- if (L_result > L_max) {\r
- Nc = lambda;\r
- L_max = L_result;\r
- }\r
- }\r
-\r
- *Nc_out = Nc;\r
- if (L_max <= 0.) {\r
- *bc_out = 0;\r
- return;\r
- }\r
-\r
- /* Compute the power of the reconstructed short term residual\r
- * signal dp[..]\r
- */\r
- dp_float -= Nc;\r
- L_power = 0;\r
- for (k = 0; k < 40; ++k) {\r
- register float f = dp_float[k];\r
- L_power += f * f;\r
- }\r
-\r
- if (L_max >= L_power) {\r
- *bc_out = 3;\r
- return;\r
- }\r
-\r
- /* Coding of the LTP gain\r
- * Table 4.3a must be used to obtain the level DLB[i] for the\r
- * quantization of the LTP gain b to get the coded version bc.\r
- */\r
- lambda = L_max / L_power * 32768.;\r
- for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;\r
- *bc_out = bc;\r
-}\r
-\r
-#endif /* LTP_CUT */\r
-\r
-static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),\r
- register word * d, /* [0..39] IN */\r
- register word * dp, /* [-120..-1] IN */\r
- word * bc_out, /* OUT */\r
- word * Nc_out /* OUT */\r
-)\r
-{\r
- register int k, lambda;\r
- word Nc, bc;\r
-\r
- float wt_float[40];\r
- float dp_float_base[120], * dp_float = dp_float_base + 120;\r
-\r
- register float L_max, L_power;\r
-\r
- for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k];\r
- for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];\r
-\r
- /* Search for the maximum cross-correlation and coding of the LTP lag\r
- */\r
- L_max = 0;\r
- Nc = 40; /* index for the maximum cross-correlation */\r
-\r
- for (lambda = 40; lambda <= 120; lambda += 9) {\r
-\r
- /* Calculate L_result for l = lambda .. lambda + 9.\r
- */\r
- register float *lp = dp_float - lambda;\r
-\r
- register float W;\r
- register float a = lp[-8], b = lp[-7], c = lp[-6],\r
- d = lp[-5], e = lp[-4], f = lp[-3],\r
- g = lp[-2], h = lp[-1];\r
- register float E; \r
- register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,\r
- S5 = 0, S6 = 0, S7 = 0, S8 = 0;\r
-\r
-# undef STEP\r
-# define STEP(K, a, b, c, d, e, f, g, h) \\r
- W = wt_float[K]; \\r
- E = W * a; S8 += E; \\r
- E = W * b; S7 += E; \\r
- E = W * c; S6 += E; \\r
- E = W * d; S5 += E; \\r
- E = W * e; S4 += E; \\r
- E = W * f; S3 += E; \\r
- E = W * g; S2 += E; \\r
- E = W * h; S1 += E; \\r
- a = lp[K]; \\r
- E = W * a; S0 += E\r
-\r
-# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)\r
-# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)\r
-# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)\r
-# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)\r
-# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)\r
-# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)\r
-# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)\r
-# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)\r
-\r
- STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);\r
- STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);\r
-\r
- STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);\r
- STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);\r
-\r
- STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);\r
- STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);\r
-\r
- STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);\r
- STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);\r
-\r
- STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);\r
- STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);\r
-\r
- if (S0 > L_max) { L_max = S0; Nc = lambda; }\r
- if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }\r
- if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }\r
- if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }\r
- if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }\r
- if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }\r
- if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }\r
- if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }\r
- if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }\r
- }\r
- *Nc_out = Nc;\r
-\r
- if (L_max <= 0.) {\r
- *bc_out = 0;\r
- return;\r
- }\r
-\r
- /* Compute the power of the reconstructed short term residual\r
- * signal dp[..]\r
- */\r
- dp_float -= Nc;\r
- L_power = 0;\r
- for (k = 0; k < 40; ++k) {\r
- register float f = dp_float[k];\r
- L_power += f * f;\r
- }\r
-\r
- if (L_max >= L_power) {\r
- *bc_out = 3;\r
- return;\r
- }\r
-\r
- /* Coding of the LTP gain\r
- * Table 4.3a must be used to obtain the level DLB[i] for the\r
- * quantization of the LTP gain b to get the coded version bc.\r
- */\r
- lambda = L_max / L_power * 32768.;\r
- for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;\r
- *bc_out = bc;\r
-}\r
-\r
-#endif /* FAST */\r
-#endif /* USE_FLOAT_MUL */\r
-\r
-\r
-/* 4.2.12 */\r
-\r
-static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e),\r
- word bc, /* IN */\r
- word Nc, /* IN */\r
- register word * dp, /* previous d [-120..-1] IN */\r
- register word * d, /* d [0..39] IN */\r
- register word * dpp, /* estimate [0..39] OUT */\r
- register word * e /* long term res. signal [0..39] OUT */\r
-)\r
-/*\r
- * In this part, we have to decode the bc parameter to compute\r
- * the samples of the estimate dpp[0..39]. The decoding of bc needs the\r
- * use of table 4.3b. The long term residual signal e[0..39]\r
- * is then calculated to be fed to the RPE encoding section.\r
- */\r
-{\r
- register int k;\r
-\r
-# undef STEP\r
-# define STEP(BP) \\r
- for (k = 0; k <= 39; k++) { \\r
- dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \\r
- e[k] = GSM_SUB( d[k], dpp[k] ); \\r
- }\r
-\r
- switch (bc) {\r
- case 0: STEP( 3277 ); break;\r
- case 1: STEP( 11469 ); break;\r
- case 2: STEP( 21299 ); break;\r
- case 3: STEP( 32767 ); break; \r
- }\r
-}\r
-\r
-void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), /* 4x for 160 samples */\r
-\r
- struct gsm_state * S,\r
-\r
- word * d, /* [0..39] residual signal IN */\r
- word * dp, /* [-120..-1] d' IN */\r
-\r
- word * e, /* [0..39] OUT */\r
- word * dpp, /* [0..39] OUT */\r
- word * Nc, /* correlation lag OUT */\r
- word * bc /* gain factor OUT */\r
-)\r
-{\r
- assert( d ); assert( dp ); assert( e );\r
- assert( dpp); assert( Nc ); assert( bc );\r
-\r
-#if defined(FAST) && defined(USE_FLOAT_MUL)\r
- if (S->fast) \r
-#if defined (LTP_CUT)\r
- if (S->ltp_cut)\r
- Cut_Fast_Calculation_of_the_LTP_parameters(S,\r
- d, dp, bc, Nc);\r
- else\r
-#endif /* LTP_CUT */\r
- Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );\r
- else \r
-#endif /* FAST & USE_FLOAT_MUL */\r
-#ifdef LTP_CUT\r
- if (S->ltp_cut)\r
- Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);\r
- else\r
-#endif\r
- Calculation_of_the_LTP_parameters(d, dp, bc, Nc);\r
-\r
- Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );\r
-}\r
-\r
-/* 4.3.2 */\r
-void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),\r
- struct gsm_state * S,\r
-\r
- word Ncr,\r
- word bcr,\r
- register word * erp, /* [0..39] IN */\r
- register word * drp /* [-120..-1] IN, [-120..40] OUT */\r
-)\r
-/*\r
- * This procedure uses the bcr and Ncr parameter to realize the\r
- * long term synthesis filtering. The decoding of bcr needs\r
- * table 4.3b.\r
- */\r
-{\r
- register int k;\r
- word brp, drpp, Nr;\r
-\r
- /* Check the limits of Nr.\r
- */\r
- Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;\r
- S->nrp = Nr;\r
- assert(Nr >= 40 && Nr <= 120);\r
-\r
- /* Decoding of the LTP gain bcr\r
- */\r
- brp = gsm_QLB[ bcr ];\r
-\r
- /* Computation of the reconstructed short term residual \r
- * signal drp[0..39]\r
- */\r
- assert(brp != MIN_WORD);\r
-\r
- for (k = 0; k <= 39; k++) {\r
- drpp = GSM_MULT_R( brp, drp[ k - Nr ] );\r
- drp[k] = GSM_ADD( erp[k], drpp );\r
- }\r
-\r
- /*\r
- * Update of the reconstructed short term residual signal\r
- * drp[ -1..-120 ]\r
- */\r
-\r
- for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-#ifdef K6OPT\r
-#include "k6opt.h"\r
-#endif\r
-\r
-#undef P\r
-\r
-/*\r
- * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION\r
- */\r
-\r
-/* 4.2.4 */\r
-\r
-\r
-static void Autocorrelation P2((s, L_ACF),\r
- word * s, /* [0..159] IN/OUT */\r
- longword * L_ACF) /* [0..8] OUT */\r
-/*\r
- * The goal is to compute the array L_ACF[k]. The signal s[i] must\r
- * be scaled in order to avoid an overflow situation.\r
- */\r
-{\r
- register int k, i;\r
-\r
- word temp, smax, scalauto;\r
-\r
-#ifdef USE_FLOAT_MUL\r
- float float_s[160];\r
-#endif\r
-\r
- /* Dynamic scaling of the array s[0..159]\r
- */\r
-\r
- /* Search for the maximum.\r
- */\r
-#ifndef K6OPT\r
- smax = 0;\r
- for (k = 0; k <= 159; k++) {\r
- temp = GSM_ABS( s[k] );\r
- if (temp > smax) smax = temp;\r
- }\r
-#else\r
- {\r
- longword lmax;\r
- lmax = k6maxmin(s,160,NULL);\r
- smax = (lmax > MAX_WORD) ? MAX_WORD : lmax;\r
- }\r
-#endif\r
- /* Computation of the scaling factor.\r
- */\r
- if (smax == 0) scalauto = 0;\r
- else {\r
- assert(smax > 0);\r
- scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */\r
- }\r
-\r
- /* Scaling of the array s[0...159]\r
- */\r
-\r
- if (scalauto > 0) {\r
-# ifndef K6OPT\r
-\r
-# ifdef USE_FLOAT_MUL\r
-# define SCALE(n) \\r
- case n: for (k = 0; k <= 159; k++) \\r
- float_s[k] = (float) \\r
- (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\\r
- break;\r
-# else \r
-# define SCALE(n) \\r
- case n: for (k = 0; k <= 159; k++) \\r
- s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\\r
- break;\r
-# endif /* USE_FLOAT_MUL */\r
-\r
- switch (scalauto) {\r
- SCALE(1)\r
- SCALE(2)\r
- SCALE(3)\r
- SCALE(4)\r
- }\r
-# undef SCALE\r
-\r
-# else /* K6OPT */\r
- k6vsraw(s,160,scalauto);\r
-# endif\r
- }\r
-# ifdef USE_FLOAT_MUL\r
- else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];\r
-# endif\r
-\r
- /* Compute the L_ACF[..].\r
- */\r
-#ifndef K6OPT\r
- {\r
-# ifdef USE_FLOAT_MUL\r
- register float * sp = float_s;\r
- register float sl = *sp;\r
-\r
-# define STEP(k) L_ACF[k] += (longword)(sl * sp[ -(k) ]);\r
-# else\r
- word * sp = s;\r
- word sl = *sp;\r
-\r
-# define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]);\r
-# endif\r
-\r
-# define NEXTI sl = *++sp\r
-\r
-\r
- for (k = 9; k--; L_ACF[k] = 0) ;\r
-\r
- STEP (0);\r
- NEXTI;\r
- STEP(0); STEP(1);\r
- NEXTI;\r
- STEP(0); STEP(1); STEP(2);\r
- NEXTI;\r
- STEP(0); STEP(1); STEP(2); STEP(3);\r
- NEXTI;\r
- STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);\r
- NEXTI;\r
- STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);\r
- NEXTI;\r
- STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);\r
- NEXTI;\r
- STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);\r
-\r
- for (i = 8; i <= 159; i++) {\r
-\r
- NEXTI;\r
-\r
- STEP(0);\r
- STEP(1); STEP(2); STEP(3); STEP(4);\r
- STEP(5); STEP(6); STEP(7); STEP(8);\r
- }\r
-\r
- for (k = 9; k--; L_ACF[k] <<= 1) ; \r
-\r
- }\r
-\r
-#else\r
- {\r
- int k;\r
- for (k=0; k<9; k++) {\r
- L_ACF[k] = 2*k6iprod(s,s+k,160-k);\r
- }\r
- }\r
-#endif\r
- /* Rescaling of the array s[0..159]\r
- */\r
- if (scalauto > 0) {\r
- assert(scalauto <= 4); \r
-#ifndef K6OPT\r
- for (k = 160; k--; *s++ <<= scalauto) ;\r
-# else /* K6OPT */\r
- k6vsllw(s,160,scalauto);\r
-# endif\r
- }\r
-}\r
-\r
-#if defined(USE_FLOAT_MUL) && defined(FAST)\r
-\r
-static void Fast_Autocorrelation P2((s, L_ACF),\r
- word * s, /* [0..159] IN/OUT */\r
- longword * L_ACF) /* [0..8] OUT */\r
-{\r
- register int k, i;\r
- float f_L_ACF[9];\r
- float scale;\r
-\r
- float s_f[160];\r
- register float *sf = s_f;\r
-\r
- for (i = 0; i < 160; ++i) sf[i] = s[i];\r
- for (k = 0; k <= 8; k++) {\r
- register float L_temp2 = 0;\r
- register float *sfl = sf - k;\r
- for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];\r
- f_L_ACF[k] = L_temp2;\r
- }\r
- scale = MAX_LONGWORD / f_L_ACF[0];\r
-\r
- for (k = 0; k <= 8; k++) {\r
- L_ACF[k] = f_L_ACF[k] * scale;\r
- }\r
-}\r
-#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */\r
-\r
-/* 4.2.5 */\r
-\r
-static void Reflection_coefficients P2( (L_ACF, r),\r
- longword * L_ACF, /* 0...8 IN */\r
- register word * r /* 0...7 OUT */\r
-)\r
-{\r
- register int i, m, n;\r
- register word temp;\r
- word ACF[9]; /* 0..8 */\r
- word P[ 9]; /* 0..8 */\r
- word K[ 9]; /* 2..8 */\r
-\r
- /* Schur recursion with 16 bits arithmetic.\r
- */\r
-\r
- if (L_ACF[0] == 0) {\r
- for (i = 8; i--; *r++ = 0) ;\r
- return;\r
- }\r
-\r
- assert( L_ACF[0] != 0 );\r
- temp = gsm_norm( L_ACF[0] );\r
-\r
- assert(temp >= 0 && temp < 32);\r
-\r
- /* ? overflow ? */\r
- for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 );\r
-\r
- /* Initialize array P[..] and K[..] for the recursion.\r
- */\r
-\r
- for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];\r
- for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];\r
-\r
- /* Compute reflection coefficients\r
- */\r
- for (n = 1; n <= 8; n++, r++) {\r
-\r
- temp = P[1];\r
- temp = GSM_ABS(temp);\r
- if (P[0] < temp) {\r
- for (i = n; i <= 8; i++) *r++ = 0;\r
- return;\r
- }\r
-\r
- *r = gsm_div( temp, P[0] );\r
-\r
- assert(*r >= 0);\r
- if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */\r
- assert (*r != MIN_WORD);\r
- if (n == 8) return; \r
-\r
- /* Schur recursion\r
- */\r
- temp = GSM_MULT_R( P[1], *r );\r
- P[0] = GSM_ADD( P[0], temp );\r
-\r
- for (m = 1; m <= 8 - n; m++) {\r
- temp = GSM_MULT_R( K[ m ], *r );\r
- P[m] = GSM_ADD( P[ m+1 ], temp );\r
-\r
- temp = GSM_MULT_R( P[ m+1 ], *r );\r
- K[m] = GSM_ADD( K[ m ], temp );\r
- }\r
- }\r
-}\r
-\r
-/* 4.2.6 */\r
-\r
-static void Transformation_to_Log_Area_Ratios P1((r),\r
- register word * r /* 0..7 IN/OUT */\r
-)\r
-/*\r
- * The following scaling for r[..] and LAR[..] has been used:\r
- *\r
- * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1.\r
- * LAR[..] = integer( real_LAR[..] * 16384 );\r
- * with -1.625 <= real_LAR <= 1.625\r
- */\r
-{\r
- register word temp;\r
- register int i;\r
-\r
-\r
- /* Computation of the LAR[0..7] from the r[0..7]\r
- */\r
- for (i = 1; i <= 8; i++, r++) {\r
-\r
- temp = *r;\r
- temp = GSM_ABS(temp);\r
- assert(temp >= 0);\r
-\r
- if (temp < 22118) {\r
- temp >>= 1;\r
- } else if (temp < 31130) {\r
- assert( temp >= 11059 );\r
- temp -= 11059;\r
- } else {\r
- assert( temp >= 26112 );\r
- temp -= 26112;\r
- temp <<= 2;\r
- }\r
-\r
- *r = *r < 0 ? -temp : temp;\r
- assert( *r != MIN_WORD );\r
- }\r
-}\r
-\r
-/* 4.2.7 */\r
-\r
-static void Quantization_and_coding P1((LAR),\r
- register word * LAR /* [0..7] IN/OUT */\r
-)\r
-{\r
- register word temp;\r
-\r
-\r
- /* This procedure needs four tables; the following equations\r
- * give the optimum scaling for the constants:\r
- * \r
- * A[0..7] = integer( real_A[0..7] * 1024 )\r
- * B[0..7] = integer( real_B[0..7] * 512 )\r
- * MAC[0..7] = maximum of the LARc[0..7]\r
- * MIC[0..7] = minimum of the LARc[0..7]\r
- */\r
-\r
-# undef STEP\r
-# define STEP( A, B, MAC, MIC ) \\r
- temp = GSM_MULT( A, *LAR ); \\r
- temp = GSM_ADD( temp, B ); \\r
- temp = GSM_ADD( temp, 256 ); \\r
- temp = SASR( temp, 9 ); \\r
- *LAR = temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \\r
- LAR++;\r
-\r
- STEP( 20480, 0, 31, -32 );\r
- STEP( 20480, 0, 31, -32 );\r
- STEP( 20480, 2048, 15, -16 );\r
- STEP( 20480, -2560, 15, -16 );\r
-\r
- STEP( 13964, 94, 7, -8 );\r
- STEP( 15360, -1792, 7, -8 );\r
- STEP( 8534, -341, 3, -4 );\r
- STEP( 9036, -1144, 3, -4 );\r
-\r
-# undef STEP\r
-}\r
-\r
-void Gsm_LPC_Analysis P3((S, s,LARc),\r
- struct gsm_state *S,\r
- word * s, /* 0..159 signals IN/OUT */\r
- word * LARc) /* 0..7 LARc's OUT */\r
-{\r
- longword L_ACF[9];\r
-\r
-#if defined(USE_FLOAT_MUL) && defined(FAST)\r
- if (S->fast) Fast_Autocorrelation (s, L_ACF );\r
- else\r
-#endif\r
- Autocorrelation (s, L_ACF );\r
- Reflection_coefficients (L_ACF, LARc );\r
- Transformation_to_Log_Area_Ratios (LARc);\r
- Quantization_and_coding (LARc);\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION\r
- * \r
- * After A-law to linear conversion (or directly from the\r
- * Ato D converter) the following scaling is assumed for\r
- * input to the RPE-LTP algorithm:\r
- *\r
- * in: 0.1.....................12\r
- * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*\r
- *\r
- * Where S is the sign bit, v a valid bit, and * a "don't care" bit.\r
- * The original signal is called sop[..]\r
- *\r
- * out: 0.1................... 12 \r
- * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0\r
- */\r
-\r
-\r
-void Gsm_Preprocess P3((S, s, so),\r
- struct gsm_state * S,\r
- word * s,\r
- word * so ) /* [0..159] IN/OUT */\r
-{\r
-\r
- word z1 = S->z1;\r
- longword L_z2 = S->L_z2;\r
- word mp = S->mp;\r
-\r
- word s1;\r
-\r
-\r
- word SO;\r
-\r
- ulongword utmp; /* for L_ADD */\r
-\r
- register int k = 160;\r
-\r
- while (k--) {\r
-\r
- /* 4.2.1 Downscaling of the input signal\r
- */\r
- /* SO = SASR( *s, 3 ) << 2;*/\r
- SO = SASR( *s, 1 ) & ~3;\r
- s++;\r
-\r
- assert (SO >= -0x4000); /* downscaled by */\r
- assert (SO <= 0x3FFC); /* previous routine. */\r
-\r
-\r
- /* 4.2.2 Offset compensation\r
- * \r
- * This part implements a high-pass filter and requires extended\r
- * arithmetic precision for the recursive part of this filter.\r
- * The input of this procedure is the array so[0...159] and the\r
- * output the array sof[ 0...159 ].\r
- */\r
- /* Compute the non-recursive part\r
- */\r
-\r
- s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */\r
- z1 = SO;\r
-\r
- assert(s1 != MIN_WORD);\r
-\r
- /* SJB Remark: float might be faster than the mess that follows */\r
-\r
- /* Compute the recursive part\r
- */\r
-\r
- /* Execution of a 31 bv 16 bits multiplication\r
- */\r
- {\r
- word msp;\r
-#ifndef __GNUC__ \r
- word lsp;\r
-#endif\r
- longword L_s2;\r
- longword L_temp;\r
- \r
- L_s2 = s1;\r
- L_s2 <<= 15;\r
-#ifndef __GNUC__ \r
- msp = SASR( L_z2, 15 );\r
- lsp = L_z2 & 0x7fff; /* gsm_L_sub(L_z2,(msp<<15)); */\r
-\r
- L_s2 += GSM_MULT_R( lsp, 32735 );\r
- L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/\r
- L_z2 = GSM_L_ADD( L_temp, L_s2 );\r
- /* above does L_z2 = L_z2 * 0x7fd5/0x8000 + L_s2 */\r
-#else\r
- L_z2 = ((long long)L_z2*32735 + 0x4000)>>15;\r
- /* alternate (ansi) version of above line does slightly different rounding:\r
- * L_temp = L_z2 >> 9;\r
- * L_temp += L_temp >> 5;\r
- * L_temp = (++L_temp) >> 1;\r
- * L_z2 = L_z2 - L_temp;\r
- */\r
- L_z2 = GSM_L_ADD(L_z2,L_s2);\r
-#endif\r
- /* Compute sof[k] with rounding\r
- */\r
- L_temp = GSM_L_ADD( L_z2, 16384 );\r
-\r
- /* 4.2.3 Preemphasis\r
- */\r
-\r
- msp = GSM_MULT_R( mp, -28180 );\r
- mp = SASR( L_temp, 15 );\r
- *so++ = GSM_ADD( mp, msp );\r
- }\r
- }\r
-\r
- S->z1 = z1;\r
- S->L_z2 = L_z2;\r
- S->mp = mp;\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-\r
-/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION\r
- */\r
-\r
-/* 4.2.13 */\r
-#ifdef K6OPT\r
-#include "k6opt.h"\r
-#else\r
-static void Weighting_filter P2((e, x),\r
- register word * e, /* signal [-5..0.39.44] IN */\r
- word * x /* signal [0..39] OUT */\r
-)\r
-/*\r
- * The coefficients of the weighting filter are stored in a table\r
- * (see table 4.4). The following scaling is used:\r
- *\r
- * H[0..10] = integer( real_H[ 0..10] * 8192 ); \r
- */\r
-{\r
- /* word wt[ 50 ]; */\r
-\r
- register longword L_result;\r
- register int k /* , i */ ;\r
-\r
- /* Initialization of a temporary working array wt[0...49]\r
- */\r
-\r
- /* for (k = 0; k <= 4; k++) wt[k] = 0;\r
- * for (k = 5; k <= 44; k++) wt[k] = *e++;\r
- * for (k = 45; k <= 49; k++) wt[k] = 0;\r
- *\r
- * (e[-5..-1] and e[40..44] are allocated by the caller,\r
- * are initially zero and are not written anywhere.)\r
- */\r
- e -= 5;\r
-\r
- /* Compute the signal x[0..39]\r
- */ \r
- for (k = 0; k <= 39; k++) {\r
-\r
- L_result = 8192 >> 1;\r
-\r
- /* for (i = 0; i <= 10; i++) {\r
- * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] );\r
- * L_result = GSM_L_ADD( L_result, L_temp );\r
- * }\r
- */\r
-\r
-#undef STEP\r
-#define STEP( i, H ) (e[ k + i ] * (longword)H)\r
-\r
- /* Every one of these multiplications is done twice --\r
- * but I don't see an elegant way to optimize this. \r
- * Do you?\r
- */\r
-\r
-#ifdef STUPID_COMPILER\r
- L_result += STEP( 0, -134 ) ;\r
- L_result += STEP( 1, -374 ) ;\r
- /* + STEP( 2, 0 ) */\r
- L_result += STEP( 3, 2054 ) ;\r
- L_result += STEP( 4, 5741 ) ;\r
- L_result += STEP( 5, 8192 ) ;\r
- L_result += STEP( 6, 5741 ) ;\r
- L_result += STEP( 7, 2054 ) ;\r
- /* + STEP( 8, 0 ) */\r
- L_result += STEP( 9, -374 ) ;\r
- L_result += STEP( 10, -134 ) ;\r
-#else\r
- L_result +=\r
- STEP( 0, -134 ) \r
- + STEP( 1, -374 ) \r
- /* + STEP( 2, 0 ) */\r
- + STEP( 3, 2054 ) \r
- + STEP( 4, 5741 ) \r
- + STEP( 5, 8192 ) \r
- + STEP( 6, 5741 ) \r
- + STEP( 7, 2054 ) \r
- /* + STEP( 8, 0 ) */\r
- + STEP( 9, -374 ) \r
- + STEP(10, -134 )\r
- ;\r
-#endif\r
-\r
- /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)\r
- * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)\r
- *\r
- * x[k] = SASR( L_result, 16 );\r
- */\r
-\r
- /* 2 adds vs. >>16 => 14, minus one shift to compensate for\r
- * those we lost when replacing L_MULT by '*'.\r
- */\r
-\r
- L_result = SASR( L_result, 13 );\r
- x[k] = ( L_result < MIN_WORD ? MIN_WORD\r
- : (L_result > MAX_WORD ? MAX_WORD : L_result ));\r
- }\r
-}\r
-#endif /* K6OPT */\r
-\r
-/* 4.2.14 */\r
-\r
-static void RPE_grid_selection P3((x,xM,Mc_out),\r
- word * x, /* [0..39] IN */ \r
- word * xM, /* [0..12] OUT */\r
- word * Mc_out /* OUT */\r
-)\r
-/*\r
- * The signal x[0..39] is used to select the RPE grid which is\r
- * represented by Mc.\r
- */\r
-{\r
- /* register word temp1; */\r
- register int /* m, */ i;\r
- register longword L_result, L_temp;\r
- longword EM; /* xxx should be L_EM? */\r
- word Mc;\r
-\r
- longword L_common_0_3;\r
-\r
- EM = 0;\r
- Mc = 0;\r
-\r
- /* for (m = 0; m <= 3; m++) {\r
- * L_result = 0;\r
- *\r
- *\r
- * for (i = 0; i <= 12; i++) {\r
- *\r
- * temp1 = SASR( x[m + 3*i], 2 );\r
- *\r
- * assert(temp1 != MIN_WORD);\r
- *\r
- * L_temp = GSM_L_MULT( temp1, temp1 );\r
- * L_result = GSM_L_ADD( L_temp, L_result );\r
- * }\r
- * \r
- * if (L_result > EM) {\r
- * Mc = m;\r
- * EM = L_result;\r
- * }\r
- * }\r
- */\r
-\r
-#undef STEP\r
-#define STEP( m, i ) L_temp = SASR( x[m + 3 * i], 2 ); \\r
- L_result += L_temp * L_temp;\r
-\r
- /* common part of 0 and 3 */\r
-\r
- L_result = 0;\r
- STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );\r
- STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );\r
- STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);\r
- L_common_0_3 = L_result;\r
-\r
- /* i = 0 */\r
-\r
- STEP( 0, 0 );\r
- L_result <<= 1; /* implicit in L_MULT */\r
- EM = L_result;\r
-\r
- /* i = 1 */\r
-\r
- L_result = 0;\r
- STEP( 1, 0 );\r
- STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );\r
- STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );\r
- STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);\r
- L_result <<= 1;\r
- if (L_result > EM) {\r
- Mc = 1;\r
- EM = L_result;\r
- }\r
-\r
- /* i = 2 */\r
-\r
- L_result = 0;\r
- STEP( 2, 0 );\r
- STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );\r
- STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );\r
- STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);\r
- L_result <<= 1;\r
- if (L_result > EM) {\r
- Mc = 2;\r
- EM = L_result;\r
- }\r
-\r
- /* i = 3 */\r
-\r
- L_result = L_common_0_3;\r
- STEP( 3, 12 );\r
- L_result <<= 1;\r
- if (L_result > EM) {\r
- Mc = 3;\r
- EM = L_result;\r
- }\r
-\r
- /**/\r
-\r
- /* Down-sampling by a factor 3 to get the selected xM[0..12]\r
- * RPE sequence.\r
- */\r
- for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];\r
- *Mc_out = Mc;\r
-}\r
-\r
-/* 4.12.15 */\r
-\r
-static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out),\r
- word xmaxc, /* IN */\r
- word * exp_out, /* OUT */\r
- word * mant_out ) /* OUT */\r
-{\r
- word exp, mant;\r
-\r
- /* Compute exponent and mantissa of the decoded version of xmaxc\r
- */\r
-\r
- exp = 0;\r
- if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1;\r
- mant = xmaxc - (exp << 3);\r
-\r
- if (mant == 0) {\r
- exp = -4;\r
- mant = 7;\r
- }\r
- else {\r
- while (mant <= 7) {\r
- mant = mant << 1 | 1;\r
- exp--;\r
- }\r
- mant -= 8;\r
- }\r
-\r
- assert( exp >= -4 && exp <= 6 );\r
- assert( mant >= 0 && mant <= 7 );\r
-\r
- *exp_out = exp;\r
- *mant_out = mant;\r
-}\r
-\r
-static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out),\r
- word * xM, /* [0..12] IN */\r
-\r
- word * xMc, /* [0..12] OUT */\r
- word * mant_out, /* OUT */\r
- word * exp_out, /* OUT */\r
- word * xmaxc_out /* OUT */\r
-)\r
-{\r
- int i, itest;\r
-\r
- word xmax, xmaxc, temp, temp1, temp2;\r
- word exp, mant;\r
-\r
-\r
- /* Find the maximum absolute value xmax of xM[0..12].\r
- */\r
-\r
- xmax = 0;\r
- for (i = 0; i <= 12; i++) {\r
- temp = xM[i];\r
- temp = GSM_ABS(temp);\r
- if (temp > xmax) xmax = temp;\r
- }\r
-\r
- /* Qantizing and coding of xmax to get xmaxc.\r
- */\r
-\r
- exp = 0;\r
- temp = SASR( xmax, 9 );\r
- itest = 0;\r
-\r
- for (i = 0; i <= 5; i++) {\r
-\r
- itest |= (temp <= 0);\r
- temp = SASR( temp, 1 );\r
-\r
- assert(exp <= 5);\r
- if (itest == 0) exp++; /* exp = add (exp, 1) */\r
- }\r
-\r
- assert(exp <= 6 && exp >= 0);\r
- temp = exp + 5;\r
-\r
- assert(temp <= 11 && temp >= 0);\r
- xmaxc = gsm_add( SASR(xmax, temp), exp << 3 );\r
-\r
- /* Quantizing and coding of the xM[0..12] RPE sequence\r
- * to get the xMc[0..12]\r
- */\r
-\r
- APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant );\r
-\r
- /* This computation uses the fact that the decoded version of xmaxc\r
- * can be calculated by using the exponent and the mantissa part of\r
- * xmaxc (logarithmic table).\r
- * So, this method avoids any division and uses only a scaling\r
- * of the RPE samples by a function of the exponent. A direct \r
- * multiplication by the inverse of the mantissa (NRFAC[0..7]\r
- * found in table 4.5) gives the 3 bit coded version xMc[0..12]\r
- * of the RPE samples.\r
- */\r
-\r
-\r
- /* Direct computation of xMc[0..12] using table 4.5\r
- */\r
-\r
- assert( exp <= 4096 && exp >= -4096);\r
- assert( mant >= 0 && mant <= 7 ); \r
-\r
- temp1 = 6 - exp; /* normalization by the exponent */\r
- temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */\r
-\r
- for (i = 0; i <= 12; i++) {\r
-\r
- assert(temp1 >= 0 && temp1 < 16);\r
-\r
- temp = xM[i] << temp1;\r
- temp = GSM_MULT( temp, temp2 );\r
- temp = SASR(temp, 12);\r
- xMc[i] = temp + 4; /* see note below */\r
- }\r
-\r
- /* NOTE: This equation is used to make all the xMc[i] positive.\r
- */\r
-\r
- *mant_out = mant;\r
- *exp_out = exp;\r
- *xmaxc_out = xmaxc;\r
-}\r
-\r
-/* 4.2.16 */\r
-\r
-static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),\r
- register word * xMc, /* [0..12] IN */\r
- word mant,\r
- word exp,\r
- register word * xMp) /* [0..12] OUT */\r
-/* \r
- * This part is for decoding the RPE sequence of coded xMc[0..12]\r
- * samples to obtain the xMp[0..12] array. Table 4.6 is used to get\r
- * the mantissa of xmaxc (FAC[0..7]).\r
- */\r
-{\r
- int i;\r
- word temp, temp1, temp2, temp3;\r
-\r
- assert( mant >= 0 && mant <= 7 ); \r
-\r
- temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */\r
- temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */\r
- temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));\r
-\r
- for (i = 13; i--;) {\r
-\r
- assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */\r
-\r
- /* temp = gsm_sub( *xMc++ << 1, 7 ); */\r
- temp = (*xMc++ << 1) - 7; /* restore sign */\r
- assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */\r
-\r
- temp <<= 12; /* 16 bit signed */\r
- temp = GSM_MULT_R( temp1, temp );\r
- temp = GSM_ADD( temp, temp3 );\r
- *xMp++ = gsm_asr( temp, temp2 );\r
- }\r
-}\r
-\r
-/* 4.2.17 */\r
-\r
-static void RPE_grid_positioning P3((Mc,xMp,ep),\r
- word Mc, /* grid position IN */\r
- register word * xMp, /* [0..12] IN */\r
- register word * ep /* [0..39] OUT */\r
-)\r
-/*\r
- * This procedure computes the reconstructed long term residual signal\r
- * ep[0..39] for the LTP analysis filter. The inputs are the Mc\r
- * which is the grid position selection and the xMp[0..12] decoded\r
- * RPE samples which are upsampled by a factor of 3 by inserting zero\r
- * values.\r
- */\r
-{\r
- int i = 13;\r
-\r
- assert(0 <= Mc && Mc <= 3);\r
-\r
- switch (Mc) {\r
- case 3: *ep++ = 0;\r
- case 2: do {\r
- *ep++ = 0;\r
- case 1: *ep++ = 0;\r
- case 0: *ep++ = *xMp++;\r
- } while (--i);\r
- }\r
- while (++Mc < 4) *ep++ = 0;\r
-\r
- /*\r
-\r
- int i, k;\r
- for (k = 0; k <= 39; k++) ep[k] = 0;\r
- for (i = 0; i <= 12; i++) {\r
- ep[ Mc + (3*i) ] = xMp[i];\r
- }\r
- */\r
-}\r
-\r
-/* 4.2.18 */\r
-\r
-/* This procedure adds the reconstructed long term residual signal\r
- * ep[0..39] to the estimated signal dpp[0..39] from the long term\r
- * analysis filter to compute the reconstructed short term residual\r
- * signal dp[-40..-1]; also the reconstructed short term residual\r
- * array dp[-120..-41] is updated.\r
- */\r
-\r
-#if 0 /* Has been inlined in code.c */\r
-void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp),\r
- word * dpp, /* [0...39] IN */\r
- word * ep, /* [0...39] IN */\r
- word * dp) /* [-120...-1] IN/OUT */\r
-{\r
- int k;\r
-\r
- for (k = 0; k <= 79; k++) \r
- dp[ -120 + k ] = dp[ -80 + k ];\r
-\r
- for (k = 0; k <= 39; k++)\r
- dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );\r
-}\r
-#endif /* Has been inlined in code.c */\r
-\r
-void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc),\r
-\r
- struct gsm_state * S,\r
-\r
- word * e, /* -5..-1][0..39][40..44 IN/OUT */\r
- word * xmaxc, /* OUT */\r
- word * Mc, /* OUT */\r
- word * xMc) /* [0..12] OUT */\r
-{\r
- word x[40];\r
- word xM[13], xMp[13];\r
- word mant, exp;\r
-\r
- Weighting_filter(e, x);\r
- RPE_grid_selection(x, xM, Mc);\r
-\r
- APCM_quantization( xM, xMc, &mant, &exp, xmaxc);\r
- APCM_inverse_quantization( xMc, mant, exp, xMp);\r
-\r
- RPE_grid_positioning( *Mc, xMp, e );\r
-\r
-}\r
-\r
-void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp),\r
- struct gsm_state * S,\r
-\r
- word xmaxcr,\r
- word Mcr,\r
- word * xMcr, /* [0..12], 3 bits IN */\r
- word * erp /* [0..39] OUT */\r
-)\r
-{\r
- word exp, mant;\r
- word xMp[ 13 ];\r
-\r
- APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant );\r
- APCM_inverse_quantization( xMcr, mant, exp, xMp );\r
- RPE_grid_positioning( Mcr, xMp, erp );\r
-\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-\r
-#include "private.h"\r
-\r
-#include "gsm.h"\r
-#include "proto.h"\r
-#ifdef K6OPT\r
-#include "k6opt.h"\r
-\r
-#define Short_term_analysis_filtering Short_term_analysis_filteringx\r
-\r
-#endif\r
-/*\r
- * SHORT TERM ANALYSIS FILTERING SECTION\r
- */\r
-\r
-/* 4.2.8 */\r
-\r
-static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),\r
- word * LARc, /* coded log area ratio [0..7] IN */\r
- word * LARpp) /* out: decoded .. */\r
-{\r
- register word temp1 /* , temp2 */;\r
-\r
- /* This procedure requires for efficient implementation\r
- * two tables.\r
- *\r
- * INVA[1..8] = integer( (32768 * 8) / real_A[1..8])\r
- * MIC[1..8] = minimum value of the LARc[1..8]\r
- */\r
-\r
- /* Compute the LARpp[1..8]\r
- */\r
-\r
- /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {\r
- *\r
- * temp1 = GSM_ADD( *LARc, *MIC ) << 10;\r
- * temp2 = *B << 1;\r
- * temp1 = GSM_SUB( temp1, temp2 );\r
- *\r
- * assert(*INVA != MIN_WORD);\r
- *\r
- * temp1 = GSM_MULT_R( *INVA, temp1 );\r
- * *LARpp = GSM_ADD( temp1, temp1 );\r
- * }\r
- */\r
-\r
-#undef STEP\r
-#define STEP( B, MIC, INVA ) \\r
- temp1 = GSM_ADD( *LARc++, MIC ) << 10; \\r
- temp1 = GSM_SUB( temp1, B << 1 ); \\r
- temp1 = GSM_MULT_R( INVA, temp1 ); \\r
- *LARpp++ = GSM_ADD( temp1, temp1 );\r
-\r
- STEP( 0, -32, 13107 );\r
- STEP( 0, -32, 13107 );\r
- STEP( 2048, -16, 13107 );\r
- STEP( -2560, -16, 13107 );\r
-\r
- STEP( 94, -8, 19223 );\r
- STEP( -1792, -8, 17476 );\r
- STEP( -341, -4, 31454 );\r
- STEP( -1144, -4, 29708 );\r
-\r
- /* NOTE: the addition of *MIC is used to restore\r
- * the sign of *LARc.\r
- */\r
-}\r
-\r
-/* 4.2.9 */\r
-/* Computation of the quantized reflection coefficients \r
- */\r
-\r
-/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8]\r
- */\r
-\r
-/*\r
- * Within each frame of 160 analyzed speech samples the short term\r
- * analysis and synthesis filters operate with four different sets of\r
- * coefficients, derived from the previous set of decoded LARs(LARpp(j-1))\r
- * and the actual set of decoded LARs (LARpp(j))\r
- *\r
- * (Initial value: LARpp(j-1)[1..8] = 0.)\r
- */\r
-\r
-static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),\r
- register word * LARpp_j_1,\r
- register word * LARpp_j,\r
- register word * LARp)\r
-{\r
- register int i;\r
-\r
- for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {\r
- *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));\r
- *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1));\r
- }\r
-}\r
-\r
-static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),\r
- register word * LARpp_j_1,\r
- register word * LARpp_j,\r
- register word * LARp)\r
-{\r
- register int i;\r
- for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {\r
- *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));\r
- }\r
-}\r
-\r
-static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),\r
- register word * LARpp_j_1,\r
- register word * LARpp_j,\r
- register word * LARp)\r
-{\r
- register int i;\r
-\r
- for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {\r
- *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));\r
- *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));\r
- }\r
-}\r
-\r
-\r
-static void Coefficients_40_159 P2((LARpp_j, LARp),\r
- register word * LARpp_j,\r
- register word * LARp)\r
-{\r
- register int i;\r
-\r
- for (i = 1; i <= 8; i++, LARp++, LARpp_j++)\r
- *LARp = *LARpp_j;\r
-}\r
-\r
-/* 4.2.9.2 */\r
-\r
-static void LARp_to_rp P1((LARp),\r
- register word * LARp) /* [0..7] IN/OUT */\r
-/*\r
- * The input of this procedure is the interpolated LARp[0..7] array.\r
- * The reflection coefficients, rp[i], are used in the analysis\r
- * filter and in the synthesis filter.\r
- */\r
-{\r
- register int i;\r
- register word temp;\r
-\r
- for (i = 1; i <= 8; i++, LARp++) {\r
-\r
- /* temp = GSM_ABS( *LARp );\r
- *\r
- * if (temp < 11059) temp <<= 1;\r
- * else if (temp < 20070) temp += 11059;\r
- * else temp = GSM_ADD( temp >> 2, 26112 );\r
- *\r
- * *LARp = *LARp < 0 ? -temp : temp;\r
- */\r
-\r
- if (*LARp < 0) {\r
- temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);\r
- *LARp = - ((temp < 11059) ? temp << 1\r
- : ((temp < 20070) ? temp + 11059\r
- : GSM_ADD( temp >> 2, 26112 )));\r
- } else {\r
- temp = *LARp;\r
- *LARp = (temp < 11059) ? temp << 1\r
- : ((temp < 20070) ? temp + 11059\r
- : GSM_ADD( temp >> 2, 26112 ));\r
- }\r
- }\r
-}\r
-\r
-\r
-/* 4.2.10 */\r
-#ifndef Short_term_analysis_filtering\r
-\r
-/* SJB Remark:\r
- * I tried 2 MMX versions of this function, neither is significantly\r
- * faster than the C version which follows. MMX might be useful if\r
- * one were processing 2 input streams in parallel.\r
- */\r
-static void Short_term_analysis_filtering P4((u0,rp0,k_n,s),\r
- register word * u0,\r
- register word * rp0, /* [0..7] IN */\r
- register int k_n, /* k_end - k_start */\r
- register word * s /* [0..n-1] IN/OUT */\r
-)\r
-/*\r
- * This procedure computes the short term residual signal d[..] to be fed\r
- * to the RPE-LTP loop from the s[..] signal and from the local rp[..]\r
- * array (quantized reflection coefficients). As the call of this\r
- * procedure can be done in many ways (see the interpolation of the LAR\r
- * coefficient), it is assumed that the computation begins with index\r
- * k_start (for arrays d[..] and s[..]) and stops with index k_end\r
- * (k_start and k_end are defined in 4.2.9.1). This procedure also\r
- * needs to keep the array u0[0..7] in memory for each call.\r
- */\r
-{\r
- register word * u_top = u0 + 8;\r
- register word * s_top = s + k_n;\r
-\r
- while (s < s_top) {\r
- register word *u, *rp ;\r
- register longword di, u_out;\r
- di = u_out = *s;\r
- for (rp=rp0, u=u0; u<u_top;) {\r
- register longword ui, rpi;\r
- ui = *u;\r
- *u++ = u_out;\r
- rpi = *rp++;\r
- u_out = ui + (((rpi*di)+0x4000)>>15);\r
- di = di + (((rpi*ui)+0x4000)>>15);\r
- /* make the common case fastest: */\r
- if ((u_out == (word)u_out) && (di == (word)di)) continue;\r
- /* otherwise do slower fixup (saturation) */\r
- if (u_out>MAX_WORD) u_out=MAX_WORD;\r
- else if (u_out<MIN_WORD) u_out=MIN_WORD;\r
- if (di>MAX_WORD) di=MAX_WORD;\r
- else if (di<MIN_WORD) di=MIN_WORD;\r
- }\r
- *s++ = di;\r
- }\r
-}\r
-#endif\r
-\r
-#if defined(USE_FLOAT_MUL) && defined(FAST)\r
-\r
-static void Fast_Short_term_analysis_filtering P4((u,rp,k_n,s),\r
- register word * u;\r
- register word * rp, /* [0..7] IN */\r
- register int k_n, /* k_end - k_start */\r
- register word * s /* [0..n-1] IN/OUT */\r
-)\r
-{\r
- register int i;\r
-\r
- float uf[8],\r
- rpf[8];\r
-\r
- register float scalef = 3.0517578125e-5;\r
- register float sav, di, temp;\r
-\r
- for (i = 0; i < 8; ++i) {\r
- uf[i] = u[i];\r
- rpf[i] = rp[i] * scalef;\r
- }\r
- for (; k_n--; s++) {\r
- sav = di = *s;\r
- for (i = 0; i < 8; ++i) {\r
- register float rpfi = rpf[i];\r
- register float ufi = uf[i];\r
-\r
- uf[i] = sav;\r
- temp = rpfi * di + ufi;\r
- di += rpfi * ufi;\r
- sav = temp;\r
- }\r
- *s = di;\r
- }\r
- for (i = 0; i < 8; ++i) u[i] = uf[i];\r
-}\r
-#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */\r
-\r
-/*\r
- * SJB Remark: modified Short_term_synthesis_filtering() below\r
- * for significant (abt 35%) speedup of decompression.\r
- * (gcc-2.95, k6 cpu)\r
- * Please don't change this without benchmarking decompression\r
- * to see that you haven't harmed speed.\r
- * This function burns most of CPU time for untoasting.\r
- * Unfortunately, didn't see any good way to benefit from mmx.\r
- */\r
-static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),\r
- struct gsm_state * S,\r
- register word * rrp, /* [0..7] IN */\r
- register int k, /* k_end - k_start */\r
- register word * wt, /* [0..k-1] IN */\r
- register word * sr /* [0..k-1] OUT */\r
-)\r
-{\r
- register word * v = S->v;\r
- register int i;\r
- register longword sri;\r
-\r
- while (k--) {\r
- sri = *wt++;\r
- for (i = 8; i--;) {\r
- register longword tmp1, tmp2;\r
-\r
- /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );\r
- */\r
- tmp1 = rrp[i];\r
- tmp2 = v[i];\r
-\r
- tmp2 = (( tmp1 * tmp2 + 16384) >> 15) ;\r
- /* saturation done below */\r
- sri -= tmp2;\r
- if (sri != (word)sri) {\r
- sri = (sri<0)? MIN_WORD:MAX_WORD;\r
- }\r
- /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );\r
- */\r
-\r
- tmp1 = (( tmp1 * sri + 16384) >> 15) ;\r
- /* saturation done below */\r
- tmp1 += v[i];\r
- if (tmp1 != (word)tmp1) {\r
- tmp1 = (tmp1<0)? MIN_WORD:MAX_WORD;\r
- }\r
- v[i+1] = tmp1;\r
- }\r
- *sr++ = v[0] = sri;\r
- }\r
-}\r
-\r
-\r
-#if defined(FAST) && defined(USE_FLOAT_MUL)\r
-\r
-static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),\r
- struct gsm_state * S,\r
- register word * rrp, /* [0..7] IN */\r
- register int k, /* k_end - k_start */\r
- register word * wt, /* [0..k-1] IN */\r
- register word * sr /* [0..k-1] OUT */\r
-)\r
-{\r
- register word * v = S->v;\r
- register int i;\r
-\r
- float va[9], rrpa[8];\r
- register float scalef = 3.0517578125e-5, temp;\r
-\r
- for (i = 0; i < 8; ++i) {\r
- va[i] = v[i];\r
- rrpa[i] = (float)rrp[i] * scalef;\r
- }\r
- while (k--) {\r
- register float sri = *wt++;\r
- for (i = 8; i--;) {\r
- sri -= rrpa[i] * va[i];\r
- if (sri < -32768.) sri = -32768.;\r
- else if (sri > 32767.) sri = 32767.;\r
-\r
- temp = va[i] + rrpa[i] * sri;\r
- if (temp < -32768.) temp = -32768.;\r
- else if (temp > 32767.) temp = 32767.;\r
- va[i+1] = temp;\r
- }\r
- *sr++ = va[0] = sri;\r
- }\r
- for (i = 0; i < 9; ++i) v[i] = va[i];\r
-}\r
-\r
-#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */\r
-\r
-void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),\r
-\r
- struct gsm_state * S,\r
-\r
- word * LARc, /* coded log area ratio [0..7] IN */\r
- word * s /* signal [0..159] IN/OUT */\r
-)\r
-{\r
- word * LARpp_j = S->LARpp[ S->j ];\r
- word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ];\r
-\r
- word LARp[8];\r
-int i;\r
-#undef FILTER\r
-#if defined(FAST) && defined(USE_FLOAT_MUL)\r
-# define FILTER (* (S->fast \\r
- ? Fast_Short_term_analysis_filtering \\r
- : Short_term_analysis_filtering ))\r
-\r
-#else\r
-# define FILTER Short_term_analysis_filtering\r
-#endif\r
-\r
- Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );\r
-\r
- Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );\r
- LARp_to_rp( LARp );\r
- FILTER( S->u, LARp, 13, s);\r
-\r
- Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);\r
- LARp_to_rp( LARp );\r
- FILTER( S->u, LARp, 14, s + 13);\r
-\r
- Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);\r
- LARp_to_rp( LARp );\r
- FILTER( S->u, LARp, 13, s + 27);\r
-\r
- Coefficients_40_159( LARpp_j, LARp);\r
- LARp_to_rp( LARp );\r
- FILTER( S->u, LARp, 120, s + 40);\r
- \r
-}\r
-\r
-void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),\r
- struct gsm_state * S,\r
-\r
- word * LARcr, /* received log area ratios [0..7] IN */\r
- word * wt, /* received d [0..159] IN */\r
-\r
- word * s /* signal s [0..159] OUT */\r
-)\r
-{\r
- word * LARpp_j = S->LARpp[ S->j ];\r
- word * LARpp_j_1 = S->LARpp[ S->j ^=1 ];\r
-\r
- word LARp[8];\r
-\r
-#undef FILTER\r
-#if defined(FAST) && defined(USE_FLOAT_MUL)\r
-\r
-# define FILTER (* (S->fast \\r
- ? Fast_Short_term_synthesis_filtering \\r
- : Short_term_synthesis_filtering ))\r
-#else\r
-# define FILTER Short_term_synthesis_filtering\r
-#endif\r
-\r
- Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );\r
-\r
- Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );\r
- LARp_to_rp( LARp );\r
- FILTER( S, LARp, 13, wt, s );\r
-\r
- Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);\r
- LARp_to_rp( LARp );\r
- FILTER( S, LARp, 14, wt + 13, s + 13 );\r
-\r
- Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);\r
- LARp_to_rp( LARp );\r
- FILTER( S, LARp, 13, wt + 27, s + 27 );\r
-\r
- Coefficients_40_159( LARpp_j, LARp );\r
- LARp_to_rp( LARp );\r
- FILTER(S, LARp, 120, wt + 40, s + 40);\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\r
- * Universitaet Berlin. See the accompanying file "COPYRIGHT" for\r
- * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.\r
- */\r
-\r
-/* $Header$ */\r
-\r
-/* Most of these tables are inlined at their point of use.\r
- */\r
-\r
-/* 4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP\r
- * CODER AND DECODER\r
- *\r
- * (Most of them inlined, so watch out.)\r
- */\r
-\r
-#define GSM_TABLE_C\r
-#include "private.h"\r
-#include "gsm.h"\r
-\r
-/* Table 4.1 Quantization of the Log.-Area Ratios\r
- */\r
-/* i 1 2 3 4 5 6 7 8 */\r
-word gsm_A[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036};\r
-word gsm_B[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144};\r
-word gsm_MIC[8] = { -32, -32, -16, -16, -8, -8, -4, -4 };\r
-word gsm_MAC[8] = { 31, 31, 15, 15, 7, 7, 3, 3 };\r
-\r
-\r
-/* Table 4.2 Tabulation of 1/A[1..8]\r
- */\r
-word gsm_INVA[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 };\r
-\r
-\r
-/* Table 4.3a Decision level of the LTP gain quantizer\r
- */\r
-/* bc 0 1 2 3 */\r
-word gsm_DLB[4] = { 6554, 16384, 26214, 32767 };\r
-\r
-\r
-/* Table 4.3b Quantization levels of the LTP gain quantizer\r
- */\r
-/* bc 0 1 2 3 */\r
-word gsm_QLB[4] = { 3277, 11469, 21299, 32767 };\r
-\r
-\r
-/* Table 4.4 Coefficients of the weighting filter\r
- */\r
-/* i 0 1 2 3 4 5 6 7 8 9 10 */\r
-word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };\r
-\r
-\r
-/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax \r
- */\r
-/* i 0 1 2 3 4 5 6 7 */\r
-word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };\r
-\r
-\r
-/* Table 4.6 Normalized direct mantissa used to compute xM/xmax\r
- */\r
-/* i 0 1 2 3 4 5 6 7 */\r
-word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- FrameClassify.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include "iLBC_define.h"\r
-#include "FrameClassify.h"\r
-\r
-/*---------------------------------------------------------------*\r
- * Classification of subframes to localize start state\r
- *--------------------------------------------------------------*/\r
-\r
-int FrameClassify( /* index to the max-energy sub-frame */\r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i/o) the encoder state structure */\r
- float *residual /* (i) lpc residual signal */\r
-) {\r
- float max_ssqEn, fssqEn[NSUB_MAX], bssqEn[NSUB_MAX], *pp;\r
- int n, l, max_ssqEn_n;\r
- const float ssqEn_win[NSUB_MAX-1]={(float)0.8,(float)0.9,\r
- (float)1.0,(float)0.9,(float)0.8};\r
- const float sampEn_win[5]={(float)1.0/(float)6.0, \r
- (float)2.0/(float)6.0, (float)3.0/(float)6.0,\r
- (float)4.0/(float)6.0, (float)5.0/(float)6.0};\r
- \r
- /* init the front and back energies to zero */\r
-\r
- memset(fssqEn, 0, NSUB_MAX*sizeof(float));\r
- memset(bssqEn, 0, NSUB_MAX*sizeof(float));\r
-\r
- /* Calculate front of first seqence */\r
-\r
- n=0;\r
- pp=residual;\r
-\r
-\r
- for (l=0; l<5; l++) {\r
- fssqEn[n] += sampEn_win[l] * (*pp) * (*pp);\r
- pp++;\r
- }\r
- for (l=5; l<SUBL; l++) {\r
- fssqEn[n] += (*pp) * (*pp);\r
- pp++;\r
- }\r
-\r
- /* Calculate front and back of all middle sequences */\r
-\r
- for (n=1; n<iLBCenc_inst->nsub-1; n++) {\r
- pp=residual+n*SUBL;\r
- for (l=0; l<5; l++) {\r
- fssqEn[n] += sampEn_win[l] * (*pp) * (*pp);\r
- bssqEn[n] += (*pp) * (*pp);\r
- pp++;\r
- }\r
- for (l=5; l<SUBL-5; l++) {\r
- fssqEn[n] += (*pp) * (*pp);\r
- bssqEn[n] += (*pp) * (*pp);\r
- pp++;\r
- }\r
- for (l=SUBL-5; l<SUBL; l++) {\r
- fssqEn[n] += (*pp) * (*pp);\r
- bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp);\r
- pp++;\r
- }\r
- }\r
-\r
- /* Calculate back of last seqence */\r
-\r
- n=iLBCenc_inst->nsub-1;\r
- pp=residual+n*SUBL;\r
- for (l=0; l<SUBL-5; l++) {\r
- bssqEn[n] += (*pp) * (*pp);\r
- pp++;\r
- }\r
- for (l=SUBL-5; l<SUBL; l++) {\r
- bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp);\r
- pp++;\r
- }\r
-\r
- /* find the index to the weighted 80 sample with \r
- most energy */\r
-\r
- if (iLBCenc_inst->mode==20) l=1;\r
- else l=0;\r
-\r
- max_ssqEn=(fssqEn[0]+bssqEn[1])*ssqEn_win[l];\r
- max_ssqEn_n=1;\r
- for (n=2; n<iLBCenc_inst->nsub; n++) {\r
-\r
- l++;\r
-\r
-\r
- if ((fssqEn[n-1]+bssqEn[n])*ssqEn_win[l] > max_ssqEn) {\r
- max_ssqEn=(fssqEn[n-1]+bssqEn[n]) *\r
- ssqEn_win[l];\r
- max_ssqEn_n=n;\r
- }\r
- }\r
-\r
- return max_ssqEn_n;\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- FrameClassify.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-\r
-\r
-#ifndef __iLBC_FRAMECLASSIFY_H\r
-#define __iLBC_FRAMECLASSIFY_H\r
-\r
-int FrameClassify( /* index to the max-energy sub-frame */\r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i/o) the encoder state structure */\r
- float *residual /* (i) lpc residual signal */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- LPC_decode.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-#include <string.h>\r
-\r
-#include "helpfun.h"\r
-#include "lsf.h"\r
-#include "iLBC_define.h"\r
-#include "LPCdecode.h"\r
-#include "constants.h"\r
-\r
-/*---------------------------------------------------------------*\r
- * interpolation of lsf coefficients for the decoder\r
- *--------------------------------------------------------------*/\r
-\r
-void LSFinterpolate2a_dec( \r
- float *a, /* (o) lpc coefficients for a sub-frame */\r
- float *lsf1, /* (i) first lsf coefficient vector */\r
-\r
-\r
- float *lsf2, /* (i) second lsf coefficient vector */\r
- float coef, /* (i) interpolation weight */\r
- int length /* (i) length of lsf vectors */\r
-){\r
- float lsftmp[LPC_FILTERORDER];\r
- \r
- interpolate(lsftmp, lsf1, lsf2, coef, length);\r
- lsf2a(a, lsftmp);\r
-}\r
-\r
-/*---------------------------------------------------------------*\r
- * obtain dequantized lsf coefficients from quantization index \r
- *--------------------------------------------------------------*/\r
-\r
-void SimplelsfDEQ(\r
- float *lsfdeq, /* (o) dequantized lsf coefficients */\r
- int *index, /* (i) quantization index */\r
- int lpc_n /* (i) number of LPCs */\r
-){ \r
- int i, j, pos, cb_pos;\r
-\r
- /* decode first LSF */\r
- \r
- pos = 0;\r
- cb_pos = 0;\r
- for (i = 0; i < LSF_NSPLIT; i++) {\r
- for (j = 0; j < dim_lsfCbTbl[i]; j++) {\r
- lsfdeq[pos + j] = lsfCbTbl[cb_pos + \r
- (long)(index[i])*dim_lsfCbTbl[i] + j];\r
- } \r
- pos += dim_lsfCbTbl[i];\r
- cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];\r
- }\r
-\r
- if (lpc_n>1) {\r
-\r
- /* decode last LSF */\r
-\r
- pos = 0;\r
- cb_pos = 0;\r
- for (i = 0; i < LSF_NSPLIT; i++) {\r
- for (j = 0; j < dim_lsfCbTbl[i]; j++) {\r
- lsfdeq[LPC_FILTERORDER + pos + j] = \r
- lsfCbTbl[cb_pos + \r
- (long)(index[LSF_NSPLIT + i])*\r
- dim_lsfCbTbl[i] + j];\r
- } \r
- pos += dim_lsfCbTbl[i];\r
- cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
-\r
-\r
- * obtain synthesis and weighting filters form lsf coefficients \r
- *---------------------------------------------------------------*/\r
-\r
-void DecoderInterpolateLSF( \r
- float *syntdenum, /* (o) synthesis filter coefficients */\r
- float *weightdenum, /* (o) weighting denumerator \r
- coefficients */\r
- float *lsfdeq, /* (i) dequantized lsf coefficients */\r
- int length, /* (i) length of lsf coefficient vector */\r
- iLBC_Dec_Inst_t *iLBCdec_inst \r
- /* (i) the decoder state structure */\r
-){\r
- int i, pos, lp_length;\r
- float lp[LPC_FILTERORDER + 1], *lsfdeq2;\r
- \r
- lsfdeq2 = lsfdeq + length;\r
- lp_length = length + 1;\r
- \r
- if (iLBCdec_inst->mode==30) {\r
- /* sub-frame 1: Interpolation between old and first */\r
-\r
- LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq, \r
- lsf_weightTbl_30ms[0], length);\r
- memcpy(syntdenum,lp,lp_length*sizeof(float));\r
- bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, \r
- lp_length);\r
-\r
- /* sub-frames 2 to 6: interpolation between first \r
- and last LSF */\r
- \r
- pos = lp_length;\r
- for (i = 1; i < 6; i++) {\r
- LSFinterpolate2a_dec(lp, lsfdeq, lsfdeq2, \r
- lsf_weightTbl_30ms[i], length);\r
- memcpy(syntdenum + pos,lp,lp_length*sizeof(float));\r
- bwexpand(weightdenum + pos, lp, \r
- LPC_CHIRP_WEIGHTDENUM, lp_length);\r
- pos += lp_length;\r
- }\r
- }\r
- else {\r
- pos = 0;\r
- for (i = 0; i < iLBCdec_inst->nsub; i++) {\r
- LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, \r
- lsfdeq, lsf_weightTbl_20ms[i], length);\r
- memcpy(syntdenum+pos,lp,lp_length*sizeof(float));\r
- bwexpand(weightdenum+pos, lp, LPC_CHIRP_WEIGHTDENUM, \r
- lp_length);\r
- pos += lp_length;\r
- }\r
- }\r
- \r
- /* update memory */\r
-\r
-\r
-\r
- if (iLBCdec_inst->mode==30)\r
- memcpy(iLBCdec_inst->lsfdeqold, lsfdeq2, \r
- length*sizeof(float));\r
- else\r
- memcpy(iLBCdec_inst->lsfdeqold, lsfdeq, \r
- length*sizeof(float));\r
-\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- LPC_decode.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_LPC_DECODE_H\r
-#define __iLBC_LPC_DECODE_H\r
-\r
-void LSFinterpolate2a_dec( \r
-\r
-\r
- float *a, /* (o) lpc coefficients for a sub-frame */\r
- float *lsf1, /* (i) first lsf coefficient vector */\r
- float *lsf2, /* (i) second lsf coefficient vector */\r
- float coef, /* (i) interpolation weight */\r
- int length /* (i) length of lsf vectors */\r
-);\r
- \r
-void SimplelsfDEQ( \r
- float *lsfdeq, /* (o) dequantized lsf coefficients */\r
- int *index, /* (i) quantization index */\r
- int lpc_n /* (i) number of LPCs */\r
-);\r
-\r
-void DecoderInterpolateLSF( \r
- float *syntdenum, /* (o) synthesis filter coefficients */\r
- float *weightdenum, /* (o) weighting denumerator \r
- coefficients */\r
- float *lsfdeq, /* (i) dequantized lsf coefficients */\r
- int length, /* (i) length of lsf coefficient vector */\r
- iLBC_Dec_Inst_t *iLBCdec_inst \r
- /* (i) the decoder state structure */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- LPCencode.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <string.h>\r
-\r
-\r
-\r
-#include "iLBC_define.h"\r
-#include "LPCencode.h"\r
-#include "helpfun.h"\r
-#include "lsf.h"\r
-#include "constants.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * lpc analysis (subrutine to LPCencode)\r
- *---------------------------------------------------------------*/\r
-\r
-static void SimpleAnalysis(\r
- float *lsf, /* (o) lsf coefficients */\r
- float *data, /* (i) new data vector */\r
- iLBC_Enc_Inst_t *iLBCenc_inst \r
- /* (i/o) the encoder state structure */\r
-){\r
- int k, is;\r
- float temp[BLOCKL_MAX], lp[LPC_FILTERORDER + 1];\r
- float lp2[LPC_FILTERORDER + 1];\r
- float r[LPC_FILTERORDER + 1];\r
-\r
- is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;\r
- memcpy(iLBCenc_inst->lpc_buffer+is,data,\r
- iLBCenc_inst->blockl*sizeof(float));\r
- \r
- /* No lookahead, last window is asymmetric */\r
- \r
- for (k = 0; k < iLBCenc_inst->lpc_n; k++) {\r
- \r
- is = LPC_LOOKBACK;\r
-\r
- if (k < (iLBCenc_inst->lpc_n - 1)) {\r
- window(temp, lpc_winTbl, \r
- iLBCenc_inst->lpc_buffer, BLOCKL_MAX);\r
- } else {\r
- window(temp, lpc_asymwinTbl, \r
- iLBCenc_inst->lpc_buffer + is, BLOCKL_MAX);\r
- }\r
- \r
- autocorr(r, temp, BLOCKL_MAX, LPC_FILTERORDER);\r
- window(r, r, lpc_lagwinTbl, LPC_FILTERORDER + 1);\r
- \r
- levdurb(lp, temp, r, LPC_FILTERORDER);\r
- bwexpand(lp2, lp, LPC_CHIRP_SYNTDENUM, LPC_FILTERORDER+1);\r
-\r
- a2lsf(lsf + k*LPC_FILTERORDER, lp2);\r
- }\r
- is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;\r
- memmove(iLBCenc_inst->lpc_buffer, \r
- iLBCenc_inst->lpc_buffer+LPC_LOOKBACK+BLOCKL_MAX-is, \r
- is*sizeof(float));\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
-\r
-\r
- * lsf interpolator and conversion from lsf to a coefficients\r
- * (subrutine to SimpleInterpolateLSF)\r
- *---------------------------------------------------------------*/\r
-\r
-static void LSFinterpolate2a_enc(\r
- float *a, /* (o) lpc coefficients */ \r
- float *lsf1,/* (i) first set of lsf coefficients */\r
- float *lsf2,/* (i) second set of lsf coefficients */\r
- float coef, /* (i) weighting coefficient to use between \r
- lsf1 and lsf2 */\r
- long length /* (i) length of coefficient vectors */\r
-){ \r
- float lsftmp[LPC_FILTERORDER];\r
- \r
- interpolate(lsftmp, lsf1, lsf2, coef, length);\r
- lsf2a(a, lsftmp);\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * lsf interpolator (subrutine to LPCencode)\r
- *---------------------------------------------------------------*/\r
-\r
-static void SimpleInterpolateLSF(\r
- float *syntdenum, /* (o) the synthesis filter denominator \r
- resulting from the quantized \r
- interpolated lsf */\r
- float *weightdenum, /* (o) the weighting filter denominator \r
- resulting from the unquantized \r
- interpolated lsf */\r
- float *lsf, /* (i) the unquantized lsf coefficients */\r
- float *lsfdeq, /* (i) the dequantized lsf coefficients */\r
- float *lsfold, /* (i) the unquantized lsf coefficients of \r
- the previous signal frame */\r
- float *lsfdeqold, /* (i) the dequantized lsf coefficients of \r
- the previous signal frame */\r
- int length, /* (i) should equate LPC_FILTERORDER */\r
- iLBC_Enc_Inst_t *iLBCenc_inst \r
- /* (i/o) the encoder state structure */\r
-){\r
- int i, pos, lp_length;\r
- float lp[LPC_FILTERORDER + 1], *lsf2, *lsfdeq2;\r
- \r
- lsf2 = lsf + length;\r
- lsfdeq2 = lsfdeq + length;\r
- lp_length = length + 1; \r
- \r
- if (iLBCenc_inst->mode==30) {\r
- /* sub-frame 1: Interpolation between old and first \r
- set of lsf coefficients */\r
-\r
- LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq, \r
- lsf_weightTbl_30ms[0], length);\r
- memcpy(syntdenum,lp,lp_length*sizeof(float));\r
- LSFinterpolate2a_enc(lp, lsfold, lsf, \r
-\r
-\r
- lsf_weightTbl_30ms[0], length);\r
- bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, lp_length);\r
-\r
- /* sub-frame 2 to 6: Interpolation between first \r
- and second set of lsf coefficients */\r
- \r
- pos = lp_length;\r
- for (i = 1; i < iLBCenc_inst->nsub; i++) {\r
- LSFinterpolate2a_enc(lp, lsfdeq, lsfdeq2, \r
- lsf_weightTbl_30ms[i], length);\r
- memcpy(syntdenum + pos,lp,lp_length*sizeof(float));\r
- \r
- LSFinterpolate2a_enc(lp, lsf, lsf2, \r
- lsf_weightTbl_30ms[i], length);\r
- bwexpand(weightdenum + pos, lp, \r
- LPC_CHIRP_WEIGHTDENUM, lp_length);\r
- pos += lp_length;\r
- }\r
- }\r
- else {\r
- pos = 0;\r
- for (i = 0; i < iLBCenc_inst->nsub; i++) {\r
- LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq, \r
- lsf_weightTbl_20ms[i], length);\r
- memcpy(syntdenum+pos,lp,lp_length*sizeof(float));\r
- LSFinterpolate2a_enc(lp, lsfold, lsf, \r
- lsf_weightTbl_20ms[i], length);\r
- bwexpand(weightdenum+pos, lp, \r
- LPC_CHIRP_WEIGHTDENUM, lp_length);\r
- pos += lp_length;\r
- }\r
- }\r
- \r
- /* update memory */\r
-\r
- if (iLBCenc_inst->mode==30) {\r
- memcpy(lsfold, lsf2, length*sizeof(float));\r
- memcpy(lsfdeqold, lsfdeq2, length*sizeof(float));\r
- }\r
- else {\r
- memcpy(lsfold, lsf, length*sizeof(float));\r
- memcpy(lsfdeqold, lsfdeq, length*sizeof(float));\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * lsf quantizer (subrutine to LPCencode)\r
- *---------------------------------------------------------------*/\r
-\r
-static void SimplelsfQ(\r
- float *lsfdeq, /* (o) dequantized lsf coefficients\r
- (dimension FILTERORDER) */\r
- int *index, /* (o) quantization index */\r
- float *lsf, /* (i) the lsf coefficient vector to be \r
-\r
-\r
- quantized (dimension FILTERORDER ) */\r
- int lpc_n /* (i) number of lsf sets to quantize */\r
-){ \r
- /* Quantize first LSF with memoryless split VQ */\r
- SplitVQ(lsfdeq, index, lsf, lsfCbTbl, LSF_NSPLIT, \r
- dim_lsfCbTbl, size_lsfCbTbl);\r
-\r
- if (lpc_n==2) {\r
- /* Quantize second LSF with memoryless split VQ */\r
- SplitVQ(lsfdeq + LPC_FILTERORDER, index + LSF_NSPLIT, \r
- lsf + LPC_FILTERORDER, lsfCbTbl, LSF_NSPLIT, \r
- dim_lsfCbTbl, size_lsfCbTbl);\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * lpc encoder\r
- *---------------------------------------------------------------*/\r
-\r
-void LPCencode( \r
- float *syntdenum, /* (i/o) synthesis filter coefficients \r
- before/after encoding */\r
- float *weightdenum, /* (i/o) weighting denumerator \r
- coefficients before/after \r
- encoding */\r
- int *lsf_index, /* (o) lsf quantization index */\r
- float *data, /* (i) lsf coefficients to quantize */\r
- iLBC_Enc_Inst_t *iLBCenc_inst \r
- /* (i/o) the encoder state structure */\r
-){\r
- float lsf[LPC_FILTERORDER * LPC_N_MAX];\r
- float lsfdeq[LPC_FILTERORDER * LPC_N_MAX];\r
- int change=0;\r
- \r
- SimpleAnalysis(lsf, data, iLBCenc_inst);\r
- SimplelsfQ(lsfdeq, lsf_index, lsf, iLBCenc_inst->lpc_n);\r
- change=LSF_check(lsfdeq, LPC_FILTERORDER, iLBCenc_inst->lpc_n);\r
- SimpleInterpolateLSF(syntdenum, weightdenum, \r
- lsf, lsfdeq, iLBCenc_inst->lsfold, \r
- iLBCenc_inst->lsfdeqold, LPC_FILTERORDER, iLBCenc_inst);\r
-}\r
-\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- LPCencode.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_LPCENCOD_H\r
-#define __iLBC_LPCENCOD_H\r
-\r
-void LPCencode( \r
- float *syntdenum, /* (i/o) synthesis filter coefficients \r
- before/after encoding */\r
- float *weightdenum, /* (i/o) weighting denumerator coefficients\r
- before/after encoding */\r
- int *lsf_index, /* (o) lsf quantization index */\r
- float *data, /* (i) lsf coefficients to quantize */\r
- iLBC_Enc_Inst_t *iLBCenc_inst \r
- /* (i/o) the encoder state structure */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-ARCH=$(PROC)\r
-CFLAGS+=-Wall -O3 -funroll-loops\r
-ifneq (${OSARCH},CYGWIN)\r
-CFLAGS += -fPIC\r
-endif\r
-LIB=libilbc.a\r
-\r
-OBJS= anaFilter.o iCBSearch.o packing.o \\r
- constants.o gainquant.o iLBC_decode.o StateConstructW.o \\r
- createCB.o getCBvec.o iLBC_encode.o StateSearchW.o doCPLC.o \\r
- helpfun.o syntFilter.o enhancer.o hpInput.o LPCdecode.o \\r
- filter.o hpOutput.o LPCencode.o FrameClassify.o iCBConstruct.o lsf.o\r
-\r
-all: $(LIB)\r
-\r
-\r
-$(LIB): $(OBJS)\r
- ar cr $(LIB) $(OBJS)\r
- ranlib $(LIB)\r
-\r
-clean:\r
- rm -f $(LIB) *.o\r
-\r
-install:\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
-\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- StateConstructW.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h> \r
-#include <string.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "StateConstructW.h"\r
-#include "constants.h"\r
-#include "filter.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * decoding of the start state\r
- *---------------------------------------------------------------*/\r
-\r
-void StateConstructW( \r
- int idxForMax, /* (i) 6-bit index for the quantization of \r
- max amplitude */\r
- int *idxVec, /* (i) vector of quantization indexes */\r
- float *syntDenum, /* (i) synthesis filter denumerator */\r
- float *out, /* (o) the decoded state vector */\r
- int len /* (i) length of a state vector */\r
-){\r
- float maxVal, tmpbuf[LPC_FILTERORDER+2*STATE_LEN], *tmp, \r
- numerator[LPC_FILTERORDER+1];\r
- float foutbuf[LPC_FILTERORDER+2*STATE_LEN], *fout;\r
- int k,tmpi;\r
- \r
- /* decoding of the maximum value */\r
-\r
- maxVal = state_frgqTbl[idxForMax];\r
- maxVal = (float)pow(10,maxVal)/(float)4.5;\r
- \r
- /* initialization of buffers and coefficients */\r
- \r
- memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float));\r
- memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float));\r
- for (k=0; k<LPC_FILTERORDER; k++) {\r
- numerator[k]=syntDenum[LPC_FILTERORDER-k];\r
- }\r
- numerator[LPC_FILTERORDER]=syntDenum[0];\r
- tmp = &tmpbuf[LPC_FILTERORDER];\r
- fout = &foutbuf[LPC_FILTERORDER];\r
-\r
- /* decoding of the sample values */\r
- \r
- for (k=0; k<len; k++) {\r
- tmpi = len-1-k;\r
- /* maxVal = 1/scal */\r
-\r
-\r
- tmp[k] = maxVal*state_sq3Tbl[idxVec[tmpi]];\r
- }\r
-\r
- /* circular convolution with all-pass filter */\r
-\r
- memset(tmp+len, 0, len*sizeof(float));\r
- ZeroPoleFilter(tmp, numerator, syntDenum, 2*len, \r
- LPC_FILTERORDER, fout);\r
- for (k=0;k<len;k++) {\r
- out[k] = fout[len-1-k]+fout[2*len-1-k];\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- StateConstructW.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_STATECONSTRUCTW_H\r
-#define __iLBC_STATECONSTRUCTW_H\r
-\r
-void StateConstructW( \r
- int idxForMax, /* (i) 6-bit index for the quantization of \r
- max amplitude */\r
- int *idxVec, /* (i) vector of quantization indexes */\r
- float *syntDenum, /* (i) synthesis filter denumerator */\r
- float *out, /* (o) the decoded state vector */\r
- int len /* (i) length of a state vector */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- StateSearchW.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h> \r
-#include <string.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "StateSearchW.h"\r
-#include "constants.h"\r
-#include "filter.h"\r
-#include "helpfun.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * predictive noise shaping encoding of scaled start state \r
- * (subrutine for StateSearchW) \r
- *---------------------------------------------------------------*/\r
-\r
-void AbsQuantW(\r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i) Encoder instance */\r
- float *in, /* (i) vector to encode */\r
- float *syntDenum, /* (i) denominator of synthesis filter */\r
- float *weightDenum, /* (i) denominator of weighting filter */\r
- int *out, /* (o) vector of quantizer indexes */\r
- int len, /* (i) length of vector to encode and \r
- vector of quantizer indexes */\r
- int state_first /* (i) position of start state in the \r
- 80 vec */\r
-){\r
- float *syntOut;\r
- float syntOutBuf[LPC_FILTERORDER+STATE_SHORT_LEN_30MS];\r
- float toQ, xq;\r
- int n;\r
- int index;\r
-\r
- /* initialization of buffer for filtering */\r
- \r
- memset(syntOutBuf, 0, LPC_FILTERORDER*sizeof(float));\r
-\r
-\r
-\r
- /* initialization of pointer for filtering */\r
-\r
- syntOut = &syntOutBuf[LPC_FILTERORDER];\r
- \r
- /* synthesis and weighting filters on input */\r
- \r
- if (state_first) {\r
- AllPoleFilter (in, weightDenum, SUBL, LPC_FILTERORDER);\r
- } else {\r
- AllPoleFilter (in, weightDenum, \r
- iLBCenc_inst->state_short_len-SUBL, \r
- LPC_FILTERORDER);\r
- }\r
-\r
- /* encoding loop */\r
-\r
- for (n=0; n<len; n++) {\r
- \r
- /* time update of filter coefficients */ \r
- \r
- if ((state_first)&&(n==SUBL)){\r
- syntDenum += (LPC_FILTERORDER+1);\r
- weightDenum += (LPC_FILTERORDER+1);\r
-\r
- /* synthesis and weighting filters on input */\r
- AllPoleFilter (&in[n], weightDenum, len-n, \r
- LPC_FILTERORDER);\r
-\r
- } else if ((state_first==0)&&\r
- (n==(iLBCenc_inst->state_short_len-SUBL))) {\r
- syntDenum += (LPC_FILTERORDER+1);\r
- weightDenum += (LPC_FILTERORDER+1);\r
-\r
- /* synthesis and weighting filters on input */\r
- AllPoleFilter (&in[n], weightDenum, len-n, \r
- LPC_FILTERORDER);\r
- \r
- }\r
- \r
- /* prediction of synthesized and weighted input */\r
-\r
- syntOut[n] = 0.0;\r
- AllPoleFilter (&syntOut[n], weightDenum, 1, \r
- LPC_FILTERORDER);\r
- \r
- /* quantization */ \r
-\r
- toQ = in[n]-syntOut[n];\r
- sort_sq(&xq, &index, toQ, state_sq3Tbl, 8);\r
- out[n]=index;\r
- syntOut[n] = state_sq3Tbl[out[n]];\r
-\r
- /* update of the prediction filter */\r
-\r
-\r
-\r
- AllPoleFilter(&syntOut[n], weightDenum, 1, \r
- LPC_FILTERORDER);\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * encoding of start state \r
- *---------------------------------------------------------------*/\r
-\r
-void StateSearchW( \r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i) Encoder instance */\r
- float *residual,/* (i) target residual vector */\r
- float *syntDenum, /* (i) lpc synthesis filter */\r
- float *weightDenum, /* (i) weighting filter denuminator */\r
- int *idxForMax, /* (o) quantizer index for maximum \r
- amplitude */\r
- int *idxVec, /* (o) vector of quantization indexes */\r
- int len, /* (i) length of all vectors */\r
- int state_first /* (i) position of start state in the \r
- 80 vec */\r
-){ \r
- float dtmp, maxVal;\r
- float tmpbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS];\r
- float *tmp, numerator[1+LPC_FILTERORDER]; \r
- float foutbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS], *fout;\r
- int k;\r
- float qmax, scal;\r
- \r
- /* initialization of buffers and filter coefficients */\r
-\r
- memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float));\r
- memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float));\r
- for (k=0; k<LPC_FILTERORDER; k++) {\r
- numerator[k]=syntDenum[LPC_FILTERORDER-k];\r
- }\r
- numerator[LPC_FILTERORDER]=syntDenum[0];\r
- tmp = &tmpbuf[LPC_FILTERORDER];\r
- fout = &foutbuf[LPC_FILTERORDER];\r
-\r
- /* circular convolution with the all-pass filter */\r
- \r
- memcpy(tmp, residual, len*sizeof(float));\r
- memset(tmp+len, 0, len*sizeof(float));\r
- ZeroPoleFilter(tmp, numerator, syntDenum, 2*len, \r
- LPC_FILTERORDER, fout);\r
- for (k=0; k<len; k++) {\r
- fout[k] += fout[k+len];\r
- } \r
- \r
- /* identification of the maximum amplitude value */\r
- \r
- maxVal = fout[0];\r
-\r
-\r
- for (k=1; k<len; k++) {\r
- \r
- if (fout[k]*fout[k] > maxVal*maxVal){\r
- maxVal = fout[k];\r
- }\r
- }\r
- maxVal=(float)fabs(maxVal);\r
- \r
- /* encoding of the maximum amplitude value */\r
- \r
- if (maxVal < 10.0) {\r
- maxVal = 10.0;\r
- }\r
- maxVal = (float)log10(maxVal);\r
- sort_sq(&dtmp, idxForMax, maxVal, state_frgqTbl, 64);\r
-\r
- /* decoding of the maximum amplitude representation value,\r
- and corresponding scaling of start state */\r
-\r
- maxVal=state_frgqTbl[*idxForMax];\r
- qmax = (float)pow(10,maxVal);\r
- scal = (float)(4.5)/qmax;\r
- for (k=0; k<len; k++){\r
- fout[k] *= scal;\r
- }\r
-\r
- /* predictive noise shaping encoding of scaled start state */\r
-\r
- AbsQuantW(iLBCenc_inst, fout,syntDenum, \r
- weightDenum,idxVec, len, state_first);\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- StateSearchW.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_STATESEARCHW_H\r
-#define __iLBC_STATESEARCHW_H\r
-\r
-void AbsQuantW(\r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i) Encoder instance */\r
- float *in, /* (i) vector to encode */\r
- float *syntDenum, /* (i) denominator of synthesis filter */\r
- float *weightDenum, /* (i) denominator of weighting filter */\r
- int *out, /* (o) vector of quantizer indexes */\r
- int len, /* (i) length of vector to encode and \r
- vector of quantizer indexes */\r
- int state_first /* (i) position of start state in the \r
- 80 vec */\r
-);\r
-\r
-void StateSearchW( \r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i) Encoder instance */\r
- float *residual,/* (i) target residual vector */\r
- float *syntDenum, /* (i) lpc synthesis filter */\r
- float *weightDenum, /* (i) weighting filter denuminator */\r
- int *idxForMax, /* (o) quantizer index for maximum \r
- amplitude */\r
- int *idxVec, /* (o) vector of quantization indexes */\r
- int len, /* (i) length of all vectors */\r
- int state_first /* (i) position of start state in the \r
-\r
-\r
- 80 vec */\r
-);\r
-\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- anaFilter.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <string.h>\r
-#include "anaFilter.h"\r
-#include "iLBC_define.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * LP analysis filter.\r
-\r
-\r
- *---------------------------------------------------------------*/\r
- \r
-void anaFilter(\r
- float *In, /* (i) Signal to be filtered */\r
- float *a, /* (i) LP parameters */\r
- int len,/* (i) Length of signal */\r
- float *Out, /* (o) Filtered signal */\r
- float *mem /* (i/o) Filter state */\r
-){\r
- int i, j;\r
- float *po, *pi, *pm, *pa;\r
-\r
- po = Out;\r
-\r
- /* Filter first part using memory from past */\r
- \r
- for (i=0; i<LPC_FILTERORDER; i++) {\r
- pi = &In[i];\r
- pm = &mem[LPC_FILTERORDER-1];\r
- pa = a;\r
- *po=0.0;\r
- for (j=0; j<=i; j++) {\r
- *po+=(*pa++)*(*pi--);\r
- }\r
- for (j=i+1; j<LPC_FILTERORDER+1; j++) {\r
-\r
- *po+=(*pa++)*(*pm--);\r
- }\r
- po++;\r
- }\r
-\r
- /* Filter last part where the state is entierly \r
- in the input vector */\r
-\r
- for (i=LPC_FILTERORDER; i<len; i++) {\r
- pi = &In[i];\r
- pa = a;\r
- *po=0.0;\r
- for (j=0; j<LPC_FILTERORDER+1; j++) {\r
- *po+=(*pa++)*(*pi--);\r
- }\r
- po++;\r
- }\r
-\r
- /* Update state vector */\r
-\r
- memcpy(mem, &In[len-LPC_FILTERORDER], \r
- LPC_FILTERORDER*sizeof(float));\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- anaFilter.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_ANAFILTER_H\r
-#define __iLBC_ANAFILTER_H\r
-\r
-void anaFilter(\r
- float *In, /* (i) Signal to be filtered */\r
- float *a, /* (i) LP parameters */\r
- int len,/* (i) Length of signal */\r
- float *Out, /* (o) Filtered signal */\r
- float *mem /* (i/o) Filter state */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- constants.c\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include "iLBC_define.h"\r
-\r
-/* ULP bit allocation */\r
-\r
- /* 20 ms frame */\r
-\r
-const iLBC_ULP_Inst_t ULP_20msTbl = {\r
- /* LSF */\r
- { {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}, \r
- {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},\r
- /* Start state location, gain and samples */\r
- {2,0,0,0,0},\r
- {1,0,0,0,0},\r
- {6,0,0,0,0},\r
- {0,1,2,0,0},\r
- /* extra CB index and extra CB gain */\r
- {{6,0,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},\r
- {{2,0,3,0,0}, {1,1,2,0,0}, {0,0,3,0,0}},\r
- /* CB index and CB gain */\r
- { {{7,0,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},\r
- {{0,0,8,0,0}, {0,0,8,0,0}, {0,0,8,0,0}},\r
- {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},\r
- {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}},\r
- { {{1,2,2,0,0}, {1,1,2,0,0}, {0,0,3,0,0}},\r
- {{1,1,3,0,0}, {0,2,2,0,0}, {0,0,3,0,0}},\r
- {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},\r
- {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}}\r
-};\r
-\r
- /* 30 ms frame */\r
-\r
-const iLBC_ULP_Inst_t ULP_30msTbl = {\r
- /* LSF */\r
- { {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}, \r
-\r
-\r
- {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}},\r
- /* Start state location, gain and samples */\r
- {3,0,0,0,0},\r
- {1,0,0,0,0},\r
- {6,0,0,0,0},\r
- {0,1,2,0,0},\r
- /* extra CB index and extra CB gain */\r
- {{4,2,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},\r
- {{1,1,3,0,0}, {1,1,2,0,0}, {0,0,3,0,0}},\r
- /* CB index and CB gain */\r
- { {{6,1,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},\r
- {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}},\r
- {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}},\r
- {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}},\r
- { {{1,2,2,0,0}, {1,2,1,0,0}, {0,0,3,0,0}},\r
- {{0,2,3,0,0}, {0,2,2,0,0}, {0,0,3,0,0}},\r
- {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}},\r
- {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}}}\r
-};\r
-\r
-/* HP Filters */\r
-\r
-float hpi_zero_coefsTbl[3] = {\r
- (float)0.92727436, (float)-1.8544941, (float)0.92727436\r
-};\r
-float hpi_pole_coefsTbl[3] = {\r
- (float)1.0, (float)-1.9059465, (float)0.9114024\r
-};\r
-float hpo_zero_coefsTbl[3] = {\r
- (float)0.93980581, (float)-1.8795834, (float)0.93980581\r
-};\r
-float hpo_pole_coefsTbl[3] = {\r
- (float)1.0, (float)-1.9330735, (float)0.93589199\r
-};\r
-\r
-/* LP Filter */\r
-\r
-float lpFilt_coefsTbl[FILTERORDER_DS]={\r
- (float)-0.066650, (float)0.125000, (float)0.316650, \r
- (float)0.414063, (float)0.316650, \r
- (float)0.125000, (float)-0.066650\r
-};\r
-\r
-/* State quantization tables */\r
-\r
-float state_sq3Tbl[8] = {\r
- (float)-3.719849, (float)-2.177490, (float)-1.130005, \r
- (float)-0.309692, (float)0.444214, (float)1.329712, \r
- (float)2.436279, (float)3.983887\r
-};\r
-\r
-float state_frgqTbl[64] = {\r
- (float)1.000085, (float)1.071695, (float)1.140395, \r
- (float)1.206868, (float)1.277188, (float)1.351503, \r
-\r
-\r
- (float)1.429380, (float)1.500727, (float)1.569049, \r
- (float)1.639599, (float)1.707071, (float)1.781531, \r
- (float)1.840799, (float)1.901550, (float)1.956695, \r
- (float)2.006750, (float)2.055474, (float)2.102787, \r
- (float)2.142819, (float)2.183592, (float)2.217962, \r
- (float)2.257177, (float)2.295739, (float)2.332967, \r
- (float)2.369248, (float)2.402792, (float)2.435080, \r
- (float)2.468598, (float)2.503394, (float)2.539284, \r
- (float)2.572944, (float)2.605036, (float)2.636331, \r
- (float)2.668939, (float)2.698780, (float)2.729101, \r
- (float)2.759786, (float)2.789834, (float)2.818679, \r
- (float)2.848074, (float)2.877470, (float)2.906899, \r
- (float)2.936655, (float)2.967804, (float)3.000115, \r
- (float)3.033367, (float)3.066355, (float)3.104231, \r
- (float)3.141499, (float)3.183012, (float)3.222952, \r
- (float)3.265433, (float)3.308441, (float)3.350823, \r
- (float)3.395275, (float)3.442793, (float)3.490801, \r
- (float)3.542514, (float)3.604064, (float)3.666050, \r
- (float)3.740994, (float)3.830749, (float)3.938770, \r
- (float)4.101764\r
-};\r
-\r
-/* CB tables */\r
-\r
-int search_rangeTbl[5][CB_NSTAGES]={{58,58,58}, {108,44,44}, \r
- {108,108,108}, {108,108,108}, {108,108,108}};\r
-int stMemLTbl=85;\r
-int memLfTbl[NASUB_MAX]={147,147,147,147};\r
-\r
-/* expansion filter(s) */\r
-\r
-float cbfiltersTbl[CB_FILTERLEN]={\r
- (float)-0.034180, (float)0.108887, (float)-0.184326,\r
- (float)0.806152, (float)0.713379, (float)-0.144043,\r
- (float)0.083740, (float)-0.033691\r
-};\r
-\r
-/* Gain Quantization */\r
-\r
-float gain_sq3Tbl[8]={\r
- (float)-1.000000, (float)-0.659973, (float)-0.330017,\r
- (float)0.000000, (float)0.250000, (float)0.500000, \r
- (float)0.750000, (float)1.00000};\r
-\r
-float gain_sq4Tbl[16]={\r
- (float)-1.049988, (float)-0.900024, (float)-0.750000, \r
- (float)-0.599976, (float)-0.450012, (float)-0.299988, \r
- (float)-0.150024, (float)0.000000, (float)0.150024, \r
- (float)0.299988, (float)0.450012, (float)0.599976, \r
- (float)0.750000, (float)0.900024, (float)1.049988, \r
- (float)1.200012};\r
-\r
-float gain_sq5Tbl[32]={\r
- (float)0.037476, (float)0.075012, (float)0.112488, \r
-\r
-\r
- (float)0.150024, (float)0.187500, (float)0.224976, \r
- (float)0.262512, (float)0.299988, (float)0.337524, \r
- (float)0.375000, (float)0.412476, (float)0.450012, \r
- (float)0.487488, (float)0.525024, (float)0.562500, \r
- (float)0.599976, (float)0.637512, (float)0.674988, \r
- (float)0.712524, (float)0.750000, (float)0.787476, \r
- (float)0.825012, (float)0.862488, (float)0.900024, \r
- (float)0.937500, (float)0.974976, (float)1.012512, \r
- (float)1.049988, (float)1.087524, (float)1.125000, \r
- (float)1.162476, (float)1.200012};\r
-\r
-/* Enhancer - Upsamling a factor 4 (ENH_UPS0 = 4) */\r
-float polyphaserTbl[ENH_UPS0*(2*ENH_FL0+1)]={ \r
- (float)0.000000, (float)0.000000, (float)0.000000,\r
-(float)1.000000, \r
- (float)0.000000, (float)0.000000, (float)0.000000, \r
- (float)0.015625, (float)-0.076904, (float)0.288330,\r
-(float)0.862061, \r
- (float)-0.106445, (float)0.018799, (float)-0.015625, \r
- (float)0.023682, (float)-0.124268, (float)0.601563,\r
-(float)0.601563, \r
- (float)-0.124268, (float)0.023682, (float)-0.023682, \r
- (float)0.018799, (float)-0.106445, (float)0.862061,\r
-(float)0.288330, \r
- (float)-0.076904, (float)0.015625, (float)-0.018799};\r
-\r
-float enh_plocsTbl[ENH_NBLOCKS_TOT] = {(float)40.0, (float)120.0, \r
- (float)200.0, (float)280.0, (float)360.0, \r
- (float)440.0, (float)520.0, (float)600.0};\r
-\r
-/* LPC analysis and quantization */ \r
-\r
-int dim_lsfCbTbl[LSF_NSPLIT] = {3, 3, 4};\r
-int size_lsfCbTbl[LSF_NSPLIT] = {64,128,128};\r
-\r
-\r
-float lsfmeanTbl[LPC_FILTERORDER] = { \r
- (float)0.281738, (float)0.445801, (float)0.663330, \r
- (float)0.962524, (float)1.251831, (float)1.533081, \r
- (float)1.850586, (float)2.137817, (float)2.481445, \r
- (float)2.777344};\r
-\r
-float lsf_weightTbl_30ms[6] = {(float)(1.0/2.0), (float)1.0,\r
-(float)(2.0/3.0), \r
- (float)(1.0/3.0), (float)0.0, (float)0.0};\r
-\r
-float lsf_weightTbl_20ms[4] = {(float)(3.0/4.0), (float)(2.0/4.0), \r
- (float)(1.0/4.0), (float)(0.0)};\r
-\r
-/* Hanning LPC window */\r
-float lpc_winTbl[BLOCKL_MAX]={\r
- (float)0.000183, (float)0.000671, (float)0.001526,\r
- (float)0.002716, (float)0.004242, (float)0.006104,\r
- (float)0.008301, (float)0.010834, (float)0.013702,\r
-\r
-\r
- (float)0.016907, (float)0.020416, (float)0.024261,\r
- (float)0.028442, (float)0.032928, (float)0.037750,\r
- (float)0.042877, (float)0.048309, (float)0.054047,\r
- (float)0.060089, (float)0.066437, (float)0.073090,\r
- (float)0.080017, (float)0.087219, (float)0.094727,\r
- (float)0.102509, (float)0.110535, (float)0.118835,\r
- (float)0.127411, (float)0.136230, (float)0.145294,\r
- (float)0.154602, (float)0.164154, (float)0.173920,\r
- (float)0.183899, (float)0.194122, (float)0.204529,\r
- (float)0.215149, (float)0.225952, (float)0.236938,\r
- (float)0.248108, (float)0.259460, (float)0.270966,\r
- (float)0.282654, (float)0.294464, (float)0.306396,\r
- (float)0.318481, (float)0.330688, (float)0.343018,\r
- (float)0.355438, (float)0.367981, (float)0.380585,\r
- (float)0.393280, (float)0.406067, (float)0.418884,\r
- (float)0.431763, (float)0.444702, (float)0.457672,\r
- (float)0.470673, (float)0.483704, (float)0.496735,\r
- (float)0.509766, (float)0.522797, (float)0.535828,\r
- (float)0.548798, (float)0.561768, (float)0.574677,\r
- (float)0.587524, (float)0.600342, (float)0.613068,\r
- (float)0.625732, (float)0.638306, (float)0.650787,\r
- (float)0.663147, (float)0.675415, (float)0.687561,\r
- (float)0.699585, (float)0.711487, (float)0.723206,\r
- (float)0.734802, (float)0.746216, (float)0.757477,\r
- (float)0.768585, (float)0.779480, (float)0.790192,\r
- (float)0.800720, (float)0.811005, (float)0.821106,\r
- (float)0.830994, (float)0.840668, (float)0.850067,\r
- (float)0.859253, (float)0.868225, (float)0.876892,\r
- (float)0.885345, (float)0.893524, (float)0.901428,\r
- (float)0.909058, (float)0.916412, (float)0.923492,\r
- (float)0.930267, (float)0.936768, (float)0.942963,\r
- (float)0.948853, (float)0.954437, (float)0.959717,\r
- (float)0.964691, (float)0.969360, (float)0.973694,\r
- (float)0.977692, (float)0.981384, (float)0.984741,\r
- (float)0.987762, (float)0.990479, (float)0.992828,\r
- (float)0.994873, (float)0.996552, (float)0.997925,\r
- (float)0.998932, (float)0.999603, (float)0.999969,\r
- (float)0.999969, (float)0.999603, (float)0.998932,\r
- (float)0.997925, (float)0.996552, (float)0.994873,\r
- (float)0.992828, (float)0.990479, (float)0.987762,\r
- (float)0.984741, (float)0.981384, (float)0.977692,\r
- (float)0.973694, (float)0.969360, (float)0.964691,\r
- (float)0.959717, (float)0.954437, (float)0.948853,\r
- (float)0.942963, (float)0.936768, (float)0.930267,\r
- (float)0.923492, (float)0.916412, (float)0.909058,\r
- (float)0.901428, (float)0.893524, (float)0.885345,\r
- (float)0.876892, (float)0.868225, (float)0.859253,\r
- (float)0.850067, (float)0.840668, (float)0.830994,\r
- (float)0.821106, (float)0.811005, (float)0.800720,\r
- (float)0.790192, (float)0.779480, (float)0.768585,\r
- (float)0.757477, (float)0.746216, (float)0.734802,\r
- (float)0.723206, (float)0.711487, (float)0.699585,\r
- (float)0.687561, (float)0.675415, (float)0.663147,\r
- (float)0.650787, (float)0.638306, (float)0.625732,\r
-\r
-\r
- (float)0.613068, (float)0.600342, (float)0.587524,\r
- (float)0.574677, (float)0.561768, (float)0.548798,\r
- (float)0.535828, (float)0.522797, (float)0.509766,\r
- (float)0.496735, (float)0.483704, (float)0.470673,\r
- (float)0.457672, (float)0.444702, (float)0.431763,\r
- (float)0.418884, (float)0.406067, (float)0.393280,\r
- (float)0.380585, (float)0.367981, (float)0.355438,\r
- (float)0.343018, (float)0.330688, (float)0.318481,\r
- (float)0.306396, (float)0.294464, (float)0.282654,\r
- (float)0.270966, (float)0.259460, (float)0.248108,\r
- (float)0.236938, (float)0.225952, (float)0.215149,\r
- (float)0.204529, (float)0.194122, (float)0.183899,\r
- (float)0.173920, (float)0.164154, (float)0.154602,\r
- (float)0.145294, (float)0.136230, (float)0.127411,\r
- (float)0.118835, (float)0.110535, (float)0.102509,\r
- (float)0.094727, (float)0.087219, (float)0.080017,\r
- (float)0.073090, (float)0.066437, (float)0.060089,\r
- (float)0.054047, (float)0.048309, (float)0.042877,\r
- (float)0.037750, (float)0.032928, (float)0.028442,\r
- (float)0.024261, (float)0.020416, (float)0.016907,\r
- (float)0.013702, (float)0.010834, (float)0.008301,\r
- (float)0.006104, (float)0.004242, (float)0.002716,\r
- (float)0.001526, (float)0.000671, (float)0.000183\r
-};\r
-\r
-/* Asymmetric LPC window */\r
-float lpc_asymwinTbl[BLOCKL_MAX]={\r
- (float)0.000061, (float)0.000214, (float)0.000458,\r
- (float)0.000824, (float)0.001282, (float)0.001831,\r
- (float)0.002472, (float)0.003235, (float)0.004120,\r
- (float)0.005066, (float)0.006134, (float)0.007294,\r
- (float)0.008545, (float)0.009918, (float)0.011383,\r
- (float)0.012939, (float)0.014587, (float)0.016357,\r
- (float)0.018219, (float)0.020172, (float)0.022217,\r
- (float)0.024353, (float)0.026611, (float)0.028961,\r
- (float)0.031372, (float)0.033905, (float)0.036530,\r
- (float)0.039276, (float)0.042084, (float)0.044983,\r
- (float)0.047974, (float)0.051086, (float)0.054260,\r
- (float)0.057526, (float)0.060883, (float)0.064331,\r
- (float)0.067871, (float)0.071503, (float)0.075226,\r
- (float)0.079010, (float)0.082916, (float)0.086884,\r
- (float)0.090942, (float)0.095062, (float)0.099304,\r
- (float)0.103607, (float)0.107971, (float)0.112427,\r
- (float)0.116974, (float)0.121582, (float)0.126282,\r
- (float)0.131073, (float)0.135895, (float)0.140839,\r
- (float)0.145813, (float)0.150879, (float)0.156006,\r
- (float)0.161224, (float)0.166504, (float)0.171844,\r
- (float)0.177246, (float)0.182709, (float)0.188263,\r
- (float)0.193848, (float)0.199524, (float)0.205231,\r
- (float)0.211029, (float)0.216858, (float)0.222778,\r
- (float)0.228729, (float)0.234741, (float)0.240814,\r
- (float)0.246918, (float)0.253082, (float)0.259308,\r
- (float)0.265564, (float)0.271881, (float)0.278259,\r
- (float)0.284668, (float)0.291107, (float)0.297607,\r
-\r
-\r
- (float)0.304138, (float)0.310730, (float)0.317322,\r
- (float)0.323975, (float)0.330658, (float)0.337372,\r
- (float)0.344147, (float)0.350922, (float)0.357727,\r
- (float)0.364594, (float)0.371460, (float)0.378357,\r
- (float)0.385284, (float)0.392212, (float)0.399170,\r
- (float)0.406158, (float)0.413177, (float)0.420197,\r
- (float)0.427246, (float)0.434296, (float)0.441376,\r
- (float)0.448456, (float)0.455536, (float)0.462646,\r
- (float)0.469757, (float)0.476868, (float)0.483978,\r
- (float)0.491089, (float)0.498230, (float)0.505341,\r
- (float)0.512451, (float)0.519592, (float)0.526703,\r
- (float)0.533813, (float)0.540924, (float)0.548004,\r
- (float)0.555084, (float)0.562164, (float)0.569244,\r
- (float)0.576294, (float)0.583313, (float)0.590332,\r
- (float)0.597321, (float)0.604309, (float)0.611267,\r
- (float)0.618195, (float)0.625092, (float)0.631989,\r
- (float)0.638855, (float)0.645660, (float)0.652466,\r
- (float)0.659241, (float)0.665985, (float)0.672668,\r
- (float)0.679352, (float)0.685974, (float)0.692566,\r
- (float)0.699127, (float)0.705658, (float)0.712128,\r
- (float)0.718536, (float)0.724945, (float)0.731262,\r
- (float)0.737549, (float)0.743805, (float)0.750000,\r
- (float)0.756134, (float)0.762238, (float)0.768280,\r
- (float)0.774261, (float)0.780182, (float)0.786072,\r
- (float)0.791870, (float)0.797638, (float)0.803314,\r
- (float)0.808960, (float)0.814514, (float)0.820038,\r
- (float)0.825470, (float)0.830841, (float)0.836151,\r
- (float)0.841400, (float)0.846558, (float)0.851654,\r
- (float)0.856689, (float)0.861633, (float)0.866516,\r
- (float)0.871338, (float)0.876068, (float)0.880737,\r
- (float)0.885315, (float)0.889801, (float)0.894226,\r
- (float)0.898560, (float)0.902832, (float)0.907013,\r
- (float)0.911102, (float)0.915100, (float)0.919037,\r
- (float)0.922882, (float)0.926636, (float)0.930328,\r
- (float)0.933899, (float)0.937408, (float)0.940796,\r
- (float)0.944122, (float)0.947357, (float)0.950470,\r
- (float)0.953522, (float)0.956482, (float)0.959351,\r
- (float)0.962097, (float)0.964783, (float)0.967377,\r
- (float)0.969849, (float)0.972229, (float)0.974518,\r
- (float)0.976715, (float)0.978821, (float)0.980835,\r
- (float)0.982727, (float)0.984528, (float)0.986237,\r
- (float)0.987854, (float)0.989380, (float)0.990784,\r
- (float)0.992096, (float)0.993317, (float)0.994415,\r
- (float)0.995422, (float)0.996338, (float)0.997162,\r
- (float)0.997864, (float)0.998474, (float)0.998962,\r
- (float)0.999390, (float)0.999695, (float)0.999878,\r
- (float)0.999969, (float)0.999969, (float)0.996918,\r
- (float)0.987701, (float)0.972382, (float)0.951050,\r
- (float)0.923889, (float)0.891022, (float)0.852631,\r
- (float)0.809021, (float)0.760406, (float)0.707092,\r
- (float)0.649445, (float)0.587799, (float)0.522491,\r
- (float)0.453979, (float)0.382690, (float)0.309021,\r
- (float)0.233459, (float)0.156433, (float)0.078461\r
-};\r
-\r
-\r
-\r
-/* Lag window for LPC */\r
-float lpc_lagwinTbl[LPC_FILTERORDER + 1]={\r
- (float)1.000100, (float)0.998890, (float)0.995569,\r
- (float)0.990057, (float)0.982392,\r
- (float)0.972623, (float)0.960816, (float)0.947047,\r
- (float)0.931405, (float)0.913989, (float)0.894909};\r
-\r
-/* LSF quantization*/\r
-float lsfCbTbl[64 * 3 + 128 * 3 + 128 * 4] = {\r
-(float)0.155396, (float)0.273193, (float)0.451172,\r
-(float)0.390503, (float)0.648071, (float)1.002075,\r
-(float)0.440186, (float)0.692261, (float)0.955688,\r
-(float)0.343628, (float)0.642334, (float)1.071533,\r
-(float)0.318359, (float)0.491577, (float)0.670532,\r
-(float)0.193115, (float)0.375488, (float)0.725708,\r
-(float)0.364136, (float)0.510376, (float)0.658691,\r
-(float)0.297485, (float)0.527588, (float)0.842529,\r
-(float)0.227173, (float)0.365967, (float)0.563110,\r
-(float)0.244995, (float)0.396729, (float)0.636475,\r
-(float)0.169434, (float)0.300171, (float)0.520264,\r
-(float)0.312866, (float)0.464478, (float)0.643188,\r
-(float)0.248535, (float)0.429932, (float)0.626099,\r
-(float)0.236206, (float)0.491333, (float)0.817139,\r
-(float)0.334961, (float)0.625122, (float)0.895752,\r
-(float)0.343018, (float)0.518555, (float)0.698608,\r
-(float)0.372803, (float)0.659790, (float)0.945435,\r
-(float)0.176880, (float)0.316528, (float)0.581421,\r
-(float)0.416382, (float)0.625977, (float)0.805176,\r
-(float)0.303223, (float)0.568726, (float)0.915039,\r
-(float)0.203613, (float)0.351440, (float)0.588135,\r
-(float)0.221191, (float)0.375000, (float)0.614746,\r
-(float)0.199951, (float)0.323364, (float)0.476074,\r
-(float)0.300781, (float)0.433350, (float)0.566895,\r
-(float)0.226196, (float)0.354004, (float)0.507568,\r
-(float)0.300049, (float)0.508179, (float)0.711670,\r
-(float)0.312012, (float)0.492676, (float)0.763428,\r
-(float)0.329956, (float)0.541016, (float)0.795776,\r
-(float)0.373779, (float)0.604614, (float)0.928833,\r
-(float)0.210571, (float)0.452026, (float)0.755249,\r
-(float)0.271118, (float)0.473267, (float)0.662476,\r
-(float)0.285522, (float)0.436890, (float)0.634399,\r
-(float)0.246704, (float)0.565552, (float)0.859009,\r
-(float)0.270508, (float)0.406250, (float)0.553589,\r
-(float)0.361450, (float)0.578491, (float)0.813843,\r
-(float)0.342651, (float)0.482788, (float)0.622437,\r
-(float)0.340332, (float)0.549438, (float)0.743164,\r
-(float)0.200439, (float)0.336304, (float)0.540894,\r
-(float)0.407837, (float)0.644775, (float)0.895142,\r
-(float)0.294678, (float)0.454834, (float)0.699097,\r
-(float)0.193115, (float)0.344482, (float)0.643188,\r
-(float)0.275757, (float)0.420776, (float)0.598755,\r
-(float)0.380493, (float)0.608643, (float)0.861084,\r
-(float)0.222778, (float)0.426147, (float)0.676514,\r
-\r
-\r
-(float)0.407471, (float)0.700195, (float)1.053101,\r
-(float)0.218384, (float)0.377197, (float)0.669922,\r
-(float)0.313232, (float)0.454102, (float)0.600952,\r
-(float)0.347412, (float)0.571533, (float)0.874146,\r
-(float)0.238037, (float)0.405396, (float)0.729492,\r
-(float)0.223877, (float)0.412964, (float)0.822021,\r
-(float)0.395264, (float)0.582153, (float)0.743896,\r
-(float)0.247925, (float)0.485596, (float)0.720581,\r
-(float)0.229126, (float)0.496582, (float)0.907715,\r
-(float)0.260132, (float)0.566895, (float)1.012695,\r
-(float)0.337402, (float)0.611572, (float)0.978149,\r
-(float)0.267822, (float)0.447632, (float)0.769287,\r
-(float)0.250610, (float)0.381714, (float)0.530029,\r
-(float)0.430054, (float)0.805054, (float)1.221924,\r
-(float)0.382568, (float)0.544067, (float)0.701660,\r
-(float)0.383545, (float)0.710327, (float)1.149170,\r
-(float)0.271362, (float)0.529053, (float)0.775513,\r
-(float)0.246826, (float)0.393555, (float)0.588623,\r
-(float)0.266846, (float)0.422119, (float)0.676758,\r
-(float)0.311523, (float)0.580688, (float)0.838623,\r
-(float)1.331177, (float)1.576782, (float)1.779541,\r
-(float)1.160034, (float)1.401978, (float)1.768188,\r
-(float)1.161865, (float)1.525146, (float)1.715332,\r
-(float)0.759521, (float)0.913940, (float)1.119873,\r
-(float)0.947144, (float)1.121338, (float)1.282471,\r
-(float)1.015015, (float)1.557007, (float)1.804932,\r
-(float)1.172974, (float)1.402100, (float)1.692627,\r
-(float)1.087524, (float)1.474243, (float)1.665405,\r
-(float)0.899536, (float)1.105225, (float)1.406250,\r
-(float)1.148438, (float)1.484741, (float)1.796265,\r
-(float)0.785645, (float)1.209839, (float)1.567749,\r
-(float)0.867798, (float)1.166504, (float)1.450684,\r
-(float)0.922485, (float)1.229858, (float)1.420898,\r
-(float)0.791260, (float)1.123291, (float)1.409546,\r
-(float)0.788940, (float)0.966064, (float)1.340332,\r
-(float)1.051147, (float)1.272827, (float)1.556641,\r
-(float)0.866821, (float)1.181152, (float)1.538818,\r
-(float)0.906738, (float)1.373535, (float)1.607910,\r
-(float)1.244751, (float)1.581421, (float)1.933838,\r
-(float)0.913940, (float)1.337280, (float)1.539673,\r
-(float)0.680542, (float)0.959229, (float)1.662720,\r
-(float)0.887207, (float)1.430542, (float)1.800781,\r
-(float)0.912598, (float)1.433594, (float)1.683960,\r
-(float)0.860474, (float)1.060303, (float)1.455322,\r
-(float)1.005127, (float)1.381104, (float)1.706909,\r
-(float)0.800781, (float)1.363892, (float)1.829102,\r
-(float)0.781860, (float)1.124390, (float)1.505981,\r
-(float)1.003662, (float)1.471436, (float)1.684692,\r
-(float)0.981323, (float)1.309570, (float)1.618042,\r
-(float)1.228760, (float)1.554321, (float)1.756470,\r
-(float)0.734375, (float)0.895752, (float)1.225586,\r
-(float)0.841797, (float)1.055664, (float)1.249268,\r
-(float)0.920166, (float)1.119385, (float)1.486206,\r
-(float)0.894409, (float)1.539063, (float)1.828979,\r
-\r
-\r
-(float)1.283691, (float)1.543335, (float)1.858276,\r
-(float)0.676025, (float)0.933105, (float)1.490845,\r
-(float)0.821289, (float)1.491821, (float)1.739868,\r
-(float)0.923218, (float)1.144653, (float)1.580566,\r
-(float)1.057251, (float)1.345581, (float)1.635864,\r
-(float)0.888672, (float)1.074951, (float)1.353149,\r
-(float)0.942749, (float)1.195435, (float)1.505493,\r
-(float)1.492310, (float)1.788086, (float)2.039673,\r
-(float)1.070313, (float)1.634399, (float)1.860962,\r
-(float)1.253296, (float)1.488892, (float)1.686035,\r
-(float)0.647095, (float)0.864014, (float)1.401855,\r
-(float)0.866699, (float)1.254883, (float)1.453369,\r
-(float)1.063965, (float)1.532593, (float)1.731323,\r
-(float)1.167847, (float)1.521484, (float)1.884033,\r
-(float)0.956055, (float)1.502075, (float)1.745605,\r
-(float)0.928711, (float)1.288574, (float)1.479614,\r
-(float)1.088013, (float)1.380737, (float)1.570801,\r
-(float)0.905029, (float)1.186768, (float)1.371948,\r
-(float)1.057861, (float)1.421021, (float)1.617432,\r
-(float)1.108276, (float)1.312500, (float)1.501465,\r
-(float)0.979492, (float)1.416992, (float)1.624268,\r
-(float)1.276001, (float)1.661011, (float)2.007935,\r
-(float)0.993042, (float)1.168579, (float)1.331665,\r
-(float)0.778198, (float)0.944946, (float)1.235962,\r
-(float)1.223755, (float)1.491333, (float)1.815674,\r
-(float)0.852661, (float)1.350464, (float)1.722290,\r
-(float)1.134766, (float)1.593140, (float)1.787354,\r
-(float)1.051392, (float)1.339722, (float)1.531006,\r
-(float)0.803589, (float)1.271240, (float)1.652100,\r
-(float)0.755737, (float)1.143555, (float)1.639404,\r
-(float)0.700928, (float)0.837280, (float)1.130371,\r
-(float)0.942749, (float)1.197876, (float)1.669800,\r
-(float)0.993286, (float)1.378296, (float)1.566528,\r
-(float)0.801025, (float)1.095337, (float)1.298950,\r
-(float)0.739990, (float)1.032959, (float)1.383667,\r
-(float)0.845703, (float)1.072266, (float)1.543823,\r
-(float)0.915649, (float)1.072266, (float)1.224487,\r
-(float)1.021973, (float)1.226196, (float)1.481323,\r
-(float)0.999878, (float)1.204102, (float)1.555908,\r
-(float)0.722290, (float)0.913940, (float)1.340210,\r
-(float)0.673340, (float)0.835938, (float)1.259521,\r
-(float)0.832397, (float)1.208374, (float)1.394165,\r
-(float)0.962158, (float)1.576172, (float)1.912842,\r
-(float)1.166748, (float)1.370850, (float)1.556763,\r
-(float)0.946289, (float)1.138550, (float)1.400391,\r
-(float)1.035034, (float)1.218262, (float)1.386475,\r
-(float)1.393799, (float)1.717773, (float)2.000244,\r
-(float)0.972656, (float)1.260986, (float)1.760620,\r
-(float)1.028198, (float)1.288452, (float)1.484619,\r
-(float)0.773560, (float)1.258057, (float)1.756714,\r
-(float)1.080322, (float)1.328003, (float)1.742676,\r
-(float)0.823975, (float)1.450806, (float)1.917725,\r
-(float)0.859009, (float)1.016602, (float)1.191895,\r
-(float)0.843994, (float)1.131104, (float)1.645020,\r
-\r
-\r
-(float)1.189697, (float)1.702759, (float)1.894409,\r
-(float)1.346680, (float)1.763184, (float)2.066040,\r
-(float)0.980469, (float)1.253784, (float)1.441650,\r
-(float)1.338135, (float)1.641968, (float)1.932739,\r
-(float)1.223267, (float)1.424194, (float)1.626465,\r
-(float)0.765747, (float)1.004150, (float)1.579102,\r
-(float)1.042847, (float)1.269165, (float)1.647461,\r
-(float)0.968750, (float)1.257568, (float)1.555786,\r
-(float)0.826294, (float)0.993408, (float)1.275146,\r
-(float)0.742310, (float)0.950439, (float)1.430542,\r
-(float)1.054321, (float)1.439819, (float)1.828003,\r
-(float)1.072998, (float)1.261719, (float)1.441895,\r
-(float)0.859375, (float)1.036377, (float)1.314819,\r
-(float)0.895752, (float)1.267212, (float)1.605591,\r
-(float)0.805420, (float)0.962891, (float)1.142334,\r
-(float)0.795654, (float)1.005493, (float)1.468506,\r
-(float)1.105347, (float)1.313843, (float)1.584839,\r
-(float)0.792236, (float)1.221802, (float)1.465698,\r
-(float)1.170532, (float)1.467651, (float)1.664063,\r
-(float)0.838257, (float)1.153198, (float)1.342163,\r
-(float)0.968018, (float)1.198242, (float)1.391235,\r
-(float)1.250122, (float)1.623535, (float)1.823608,\r
-(float)0.711670, (float)1.058350, (float)1.512085,\r
-(float)1.204834, (float)1.454468, (float)1.739136,\r
-(float)1.137451, (float)1.421753, (float)1.620117,\r
-(float)0.820435, (float)1.322754, (float)1.578247,\r
-(float)0.798706, (float)1.005005, (float)1.213867,\r
-(float)0.980713, (float)1.324951, (float)1.512939,\r
-(float)1.112305, (float)1.438843, (float)1.735596,\r
-(float)1.135498, (float)1.356689, (float)1.635742,\r
-(float)1.101318, (float)1.387451, (float)1.686523,\r
-(float)0.849854, (float)1.276978, (float)1.523438,\r
-(float)1.377930, (float)1.627563, (float)1.858154,\r
-(float)0.884888, (float)1.095459, (float)1.287476,\r
-(float)1.289795, (float)1.505859, (float)1.756592,\r
-(float)0.817505, (float)1.384155, (float)1.650513,\r
-(float)1.446655, (float)1.702148, (float)1.931885,\r
-(float)0.835815, (float)1.023071, (float)1.385376,\r
-(float)0.916626, (float)1.139038, (float)1.335327,\r
-(float)0.980103, (float)1.174072, (float)1.453735,\r
-(float)1.705688, (float)2.153809, (float)2.398315, (float)2.743408,\r
-(float)1.797119, (float)2.016846, (float)2.445679, (float)2.701904,\r
-(float)1.990356, (float)2.219116, (float)2.576416, (float)2.813477,\r
-(float)1.849365, (float)2.190918, (float)2.611572, (float)2.835083,\r
-(float)1.657959, (float)1.854370, (float)2.159058, (float)2.726196,\r
-(float)1.437744, (float)1.897705, (float)2.253174, (float)2.655396,\r
-(float)2.028687, (float)2.247314, (float)2.542358, (float)2.875854,\r
-(float)1.736938, (float)1.922119, (float)2.185913, (float)2.743408,\r
-(float)1.521606, (float)1.870972, (float)2.526855, (float)2.786987,\r
-(float)1.841431, (float)2.050659, (float)2.463623, (float)2.857666,\r
-(float)1.590088, (float)2.067261, (float)2.427979, (float)2.794434,\r
-(float)1.746826, (float)2.057373, (float)2.320190, (float)2.800781,\r
-(float)1.734619, (float)1.940552, (float)2.306030, (float)2.826416,\r
-(float)1.786255, (float)2.204468, (float)2.457520, (float)2.795288,\r
-\r
-\r
-(float)1.861084, (float)2.170532, (float)2.414551, (float)2.763672,\r
-(float)2.001465, (float)2.307617, (float)2.552734, (float)2.811890,\r
-(float)1.784424, (float)2.124146, (float)2.381592, (float)2.645508,\r
-(float)1.888794, (float)2.135864, (float)2.418579, (float)2.861206,\r
-(float)2.301147, (float)2.531250, (float)2.724976, (float)2.913086,\r
-(float)1.837769, (float)2.051270, (float)2.261963, (float)2.553223,\r
-(float)2.012939, (float)2.221191, (float)2.440186, (float)2.678101,\r
-(float)1.429565, (float)1.858276, (float)2.582275, (float)2.845703,\r
-(float)1.622803, (float)1.897705, (float)2.367310, (float)2.621094,\r
-(float)1.581543, (float)1.960449, (float)2.515869, (float)2.736450,\r
-(float)1.419434, (float)1.933960, (float)2.394653, (float)2.746704,\r
-(float)1.721924, (float)2.059570, (float)2.421753, (float)2.769653,\r
-(float)1.911011, (float)2.220703, (float)2.461060, (float)2.740723,\r
-(float)1.581177, (float)1.860840, (float)2.516968, (float)2.874634,\r
-(float)1.870361, (float)2.098755, (float)2.432373, (float)2.656494,\r
-(float)2.059692, (float)2.279785, (float)2.495605, (float)2.729370,\r
-(float)1.815674, (float)2.181519, (float)2.451538, (float)2.680542,\r
-(float)1.407959, (float)1.768311, (float)2.343018, (float)2.668091,\r
-(float)2.168701, (float)2.394653, (float)2.604736, (float)2.829346,\r
-(float)1.636230, (float)1.865723, (float)2.329102, (float)2.824219,\r
-(float)1.878906, (float)2.139526, (float)2.376709, (float)2.679810,\r
-(float)1.765381, (float)1.971802, (float)2.195435, (float)2.586914,\r
-(float)2.164795, (float)2.410889, (float)2.673706, (float)2.903198,\r
-(float)2.071899, (float)2.331055, (float)2.645874, (float)2.907104,\r
-(float)2.026001, (float)2.311523, (float)2.594849, (float)2.863892,\r
-(float)1.948975, (float)2.180786, (float)2.514893, (float)2.797852,\r
-(float)1.881836, (float)2.130859, (float)2.478149, (float)2.804199,\r
-(float)2.238159, (float)2.452759, (float)2.652832, (float)2.868286,\r
-(float)1.897949, (float)2.101685, (float)2.524292, (float)2.880127,\r
-(float)1.856445, (float)2.074585, (float)2.541016, (float)2.791748,\r
-(float)1.695557, (float)2.199097, (float)2.506226, (float)2.742676,\r
-(float)1.612671, (float)1.877075, (float)2.435425, (float)2.732910,\r
-(float)1.568848, (float)1.786499, (float)2.194580, (float)2.768555,\r
-(float)1.953369, (float)2.164551, (float)2.486938, (float)2.874023,\r
-(float)1.388306, (float)1.725342, (float)2.384521, (float)2.771851,\r
-(float)2.115356, (float)2.337769, (float)2.592896, (float)2.864014,\r
-(float)1.905762, (float)2.111328, (float)2.363525, (float)2.789307,\r
-(float)1.882568, (float)2.332031, (float)2.598267, (float)2.827637,\r
-(float)1.683594, (float)2.088745, (float)2.361938, (float)2.608643,\r
-(float)1.874023, (float)2.182129, (float)2.536133, (float)2.766968,\r
-(float)1.861938, (float)2.070435, (float)2.309692, (float)2.700562,\r
-(float)1.722168, (float)2.107422, (float)2.477295, (float)2.837646,\r
-(float)1.926880, (float)2.184692, (float)2.442627, (float)2.663818,\r
-(float)2.123901, (float)2.337280, (float)2.553101, (float)2.777466,\r
-(float)1.588135, (float)1.911499, (float)2.212769, (float)2.543945,\r
-(float)2.053955, (float)2.370850, (float)2.712158, (float)2.939941,\r
-(float)2.210449, (float)2.519653, (float)2.770386, (float)2.958618,\r
-(float)2.199463, (float)2.474731, (float)2.718262, (float)2.919922,\r
-(float)1.960083, (float)2.175415, (float)2.608032, (float)2.888794,\r
-(float)1.953735, (float)2.185181, (float)2.428223, (float)2.809570,\r
-(float)1.615234, (float)2.036499, (float)2.576538, (float)2.834595,\r
-(float)1.621094, (float)2.028198, (float)2.431030, (float)2.664673,\r
-(float)1.824951, (float)2.267456, (float)2.514526, (float)2.747925,\r
-(float)1.994263, (float)2.229126, (float)2.475220, (float)2.833984,\r
-\r
-\r
-(float)1.746338, (float)2.011353, (float)2.588257, (float)2.826904,\r
-(float)1.562866, (float)2.135986, (float)2.471680, (float)2.687256,\r
-(float)1.748901, (float)2.083496, (float)2.460938, (float)2.686279,\r
-(float)1.758057, (float)2.131470, (float)2.636597, (float)2.891602,\r
-(float)2.071289, (float)2.299072, (float)2.550781, (float)2.814331,\r
-(float)1.839600, (float)2.094360, (float)2.496460, (float)2.723999,\r
-(float)1.882202, (float)2.088257, (float)2.636841, (float)2.923096,\r
-(float)1.957886, (float)2.153198, (float)2.384399, (float)2.615234,\r
-(float)1.992920, (float)2.351196, (float)2.654419, (float)2.889771,\r
-(float)2.012817, (float)2.262451, (float)2.643799, (float)2.903076,\r
-(float)2.025635, (float)2.254761, (float)2.508423, (float)2.784058,\r
-(float)2.316040, (float)2.589355, (float)2.794189, (float)2.963623,\r
-(float)1.741211, (float)2.279541, (float)2.578491, (float)2.816284,\r
-(float)1.845337, (float)2.055786, (float)2.348511, (float)2.822021,\r
-(float)1.679932, (float)1.926514, (float)2.499756, (float)2.835693,\r
-(float)1.722534, (float)1.946899, (float)2.448486, (float)2.728760,\r
-(float)1.829834, (float)2.043213, (float)2.580444, (float)2.867676,\r
-(float)1.676636, (float)2.071655, (float)2.322510, (float)2.704834,\r
-(float)1.791504, (float)2.113525, (float)2.469727, (float)2.784058,\r
-(float)1.977051, (float)2.215088, (float)2.497437, (float)2.726929,\r
-(float)1.800171, (float)2.106689, (float)2.357788, (float)2.738892,\r
-(float)1.827759, (float)2.170166, (float)2.525879, (float)2.852417,\r
-(float)1.918335, (float)2.132813, (float)2.488403, (float)2.728149,\r
-(float)1.916748, (float)2.225098, (float)2.542603, (float)2.857666,\r
-(float)1.761230, (float)1.976074, (float)2.507446, (float)2.884521,\r
-(float)2.053711, (float)2.367432, (float)2.608032, (float)2.837646,\r
-(float)1.595337, (float)2.000977, (float)2.307129, (float)2.578247,\r
-(float)1.470581, (float)2.031250, (float)2.375854, (float)2.647583,\r
-(float)1.801392, (float)2.128052, (float)2.399780, (float)2.822876,\r
-(float)1.853638, (float)2.066650, (float)2.429199, (float)2.751465,\r
-(float)1.956299, (float)2.163696, (float)2.394775, (float)2.734253,\r
-(float)1.963623, (float)2.275757, (float)2.585327, (float)2.865234,\r
-(float)1.887451, (float)2.105469, (float)2.331787, (float)2.587402,\r
-(float)2.120117, (float)2.443359, (float)2.733887, (float)2.941406,\r
-(float)1.506348, (float)1.766968, (float)2.400513, (float)2.851807,\r
-(float)1.664551, (float)1.981079, (float)2.375732, (float)2.774414,\r
-(float)1.720703, (float)1.978882, (float)2.391479, (float)2.640991,\r
-(float)1.483398, (float)1.814819, (float)2.434448, (float)2.722290,\r
-(float)1.769043, (float)2.136597, (float)2.563721, (float)2.774414,\r
-(float)1.810791, (float)2.049316, (float)2.373901, (float)2.613647,\r
-(float)1.788330, (float)2.005981, (float)2.359131, (float)2.723145,\r
-(float)1.785156, (float)1.993164, (float)2.399780, (float)2.832520,\r
-(float)1.695313, (float)2.022949, (float)2.522583, (float)2.745117,\r
-(float)1.584106, (float)1.965576, (float)2.299927, (float)2.715576,\r
-(float)1.894897, (float)2.249878, (float)2.655884, (float)2.897705,\r
-(float)1.720581, (float)1.995728, (float)2.299438, (float)2.557007,\r
-(float)1.619385, (float)2.173950, (float)2.574219, (float)2.787964,\r
-(float)1.883179, (float)2.220459, (float)2.474365, (float)2.825073,\r
-(float)1.447632, (float)2.045044, (float)2.555542, (float)2.744873,\r
-(float)1.502686, (float)2.156616, (float)2.653320, (float)2.846558,\r
-(float)1.711548, (float)1.944092, (float)2.282959, (float)2.685791,\r
-(float)1.499756, (float)1.867554, (float)2.341064, (float)2.578857,\r
-(float)1.916870, (float)2.135132, (float)2.568237, (float)2.826050,\r
-(float)1.498047, (float)1.711182, (float)2.223267, (float)2.755127,\r
-\r
-\r
-(float)1.808716, (float)1.997559, (float)2.256470, (float)2.758545,\r
-(float)2.088501, (float)2.402710, (float)2.667358, (float)2.890259,\r
-(float)1.545044, (float)1.819214, (float)2.324097, (float)2.692993,\r
-(float)1.796021, (float)2.012573, (float)2.505737, (float)2.784912,\r
-(float)1.786499, (float)2.041748, (float)2.290405, (float)2.650757,\r
-(float)1.938232, (float)2.264404, (float)2.529053, (float)2.796143\r
-};\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- constants.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_CONSTANTS_H\r
-#define __iLBC_CONSTANTS_H\r
-\r
-#include "iLBC_define.h"\r
-\r
-\r
-/* ULP bit allocation */\r
-\r
-extern const iLBC_ULP_Inst_t ULP_20msTbl;\r
-extern const iLBC_ULP_Inst_t ULP_30msTbl;\r
-\r
-/* high pass filters */\r
-\r
-extern float hpi_zero_coefsTbl[];\r
-extern float hpi_pole_coefsTbl[];\r
-extern float hpo_zero_coefsTbl[];\r
-extern float hpo_pole_coefsTbl[]; \r
-\r
-/* low pass filters */\r
-extern float lpFilt_coefsTbl[];\r
-\r
-/* LPC analysis and quantization */\r
-\r
-extern float lpc_winTbl[];\r
-extern float lpc_asymwinTbl[];\r
-extern float lpc_lagwinTbl[];\r
-extern float lsfCbTbl[];\r
-extern float lsfmeanTbl[];\r
-extern int dim_lsfCbTbl[];\r
-extern int size_lsfCbTbl[];\r
-extern float lsf_weightTbl_30ms[]; \r
-extern float lsf_weightTbl_20ms[];\r
-\r
-/* state quantization tables */\r
-\r
-extern float state_sq3Tbl[];\r
-extern float state_frgqTbl[];\r
-\r
-/* gain quantization tables */\r
-\r
-extern float gain_sq3Tbl[];\r
-extern float gain_sq4Tbl[];\r
-extern float gain_sq5Tbl[];\r
-\r
-/* adaptive codebook definitions */\r
-\r
-extern int search_rangeTbl[5][CB_NSTAGES];\r
-extern int memLfTbl[];\r
-extern int stMemLTbl;\r
-extern float cbfiltersTbl[CB_FILTERLEN];\r
-\r
-\r
-\r
-/* enhancer definitions */\r
-\r
-extern float polyphaserTbl[];\r
-extern float enh_plocsTbl[];\r
-\r
-#endif\r
-\r
+++ /dev/null
-\r
-\r
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- createCB.c\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include "iLBC_define.h"\r
-#include "createCB.h"\r
-#include "constants.h"\r
-#include <string.h>\r
-#include <math.h>\r
-\r
-/*----------------------------------------------------------------*\r
- * Construct an additional codebook vector by filtering the\r
- * initial codebook buffer. This vector is then used to expand\r
- * the codebook with an additional section.\r
- *---------------------------------------------------------------*/\r
-\r
-void filteredCBvecs(\r
- float *cbvectors, /* (o) Codebook vectors for the \r
- higher section */\r
- float *mem, /* (i) Buffer to create codebook \r
- vector from */\r
- int lMem /* (i) Length of buffer */\r
-){\r
- int j, k;\r
- float *pp, *pp1;\r
- float tempbuff2[CB_MEML+CB_FILTERLEN];\r
- float *pos;\r
-\r
- memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float));\r
- memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float));\r
- memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0, \r
- (CB_HALFFILTERLEN+1)*sizeof(float));\r
-\r
- /* Create codebook vector for higher section by filtering */\r
-\r
- /* do filtering */\r
- pos=cbvectors;\r
- memset(pos, 0, lMem*sizeof(float));\r
- for (k=0; k<lMem; k++) {\r
- pp=&tempbuff2[k];\r
- pp1=&cbfiltersTbl[CB_FILTERLEN-1];\r
- for (j=0;j<CB_FILTERLEN;j++) {\r
- (*pos)+=(*pp++)*(*pp1--);\r
- }\r
- pos++;\r
- }\r
-}\r
-\r
-\r
-\r
-/*----------------------------------------------------------------*\r
- * Search the augmented part of the codebook to find the best\r
- * measure.\r
- *----------------------------------------------------------------*/\r
-\r
-void searchAugmentedCB(\r
- int low, /* (i) Start index for the search */\r
- int high, /* (i) End index for the search */\r
- int stage, /* (i) Current stage */\r
- int startIndex, /* (i) Codebook index for the first \r
- aug vector */\r
- float *target, /* (i) Target vector for encoding */\r
- float *buffer, /* (i) Pointer to the end of the buffer for\r
- augmented codebook construction */\r
- float *max_measure, /* (i/o) Currently maximum measure */\r
- int *best_index,/* (o) Currently the best index */\r
- float *gain, /* (o) Currently the best gain */\r
- float *energy, /* (o) Energy of augmented codebook \r
- vectors */\r
- float *invenergy/* (o) Inv energy of augmented codebook \r
- vectors */\r
-) {\r
- int icount, ilow, j, tmpIndex;\r
- float *pp, *ppo, *ppi, *ppe, crossDot, alfa; \r
- float weighted, measure, nrjRecursive;\r
- float ftmp;\r
-\r
- /* Compute the energy for the first (low-5) \r
- noninterpolated samples */\r
- nrjRecursive = (float) 0.0;\r
- pp = buffer - low + 1;\r
- for (j=0; j<(low-5); j++) {\r
- nrjRecursive += ( (*pp)*(*pp) );\r
- pp++;\r
- }\r
- ppe = buffer - low;\r
-\r
-\r
- for (icount=low; icount<=high; icount++) {\r
-\r
- /* Index of the codebook vector used for retrieving \r
- energy values */\r
- tmpIndex = startIndex+icount-20;\r
-\r
- ilow = icount-4;\r
- \r
- /* Update the energy recursively to save complexity */\r
- nrjRecursive = nrjRecursive + (*ppe)*(*ppe);\r
- ppe--;\r
- energy[tmpIndex] = nrjRecursive;\r
-\r
- /* Compute cross dot product for the first (low-5) \r
- samples */\r
- crossDot = (float) 0.0;\r
-\r
-\r
- pp = buffer-icount;\r
- for (j=0; j<ilow; j++) {\r
- crossDot += target[j]*(*pp++);\r
- }\r
-\r
- /* interpolation */\r
- alfa = (float) 0.2;\r
- ppo = buffer-4;\r
- ppi = buffer-icount-4;\r
- for (j=ilow; j<icount; j++) {\r
- weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);\r
- ppo++;\r
- ppi++;\r
- energy[tmpIndex] += weighted*weighted;\r
- crossDot += target[j]*weighted;\r
- alfa += (float)0.2;\r
- }\r
-\r
- /* Compute energy and cross dot product for the \r
- remaining samples */\r
- pp = buffer - icount;\r
- for (j=icount; j<SUBL; j++) {\r
- energy[tmpIndex] += (*pp)*(*pp);\r
- crossDot += target[j]*(*pp++);\r
- }\r
- \r
- if (energy[tmpIndex]>0.0) {\r
- invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS);\r
- } else {\r
- invenergy[tmpIndex] = (float) 0.0;\r
- }\r
- \r
- if (stage==0) {\r
- measure = (float)-10000000.0;\r
- \r
- if (crossDot > 0.0) {\r
- measure = crossDot*crossDot*invenergy[tmpIndex];\r
- }\r
- }\r
- else {\r
- measure = crossDot*crossDot*invenergy[tmpIndex];\r
- }\r
- \r
- /* check if measure is better */\r
- ftmp = crossDot*invenergy[tmpIndex];\r
- \r
- if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {\r
- *best_index = tmpIndex;\r
- *max_measure = measure;\r
- *gain = ftmp;\r
- }\r
- }\r
-}\r
-\r
-\r
-\r
-\r
-/*----------------------------------------------------------------*\r
- * Recreate a specific codebook vector from the augmented part.\r
- *\r
- *----------------------------------------------------------------*/\r
-\r
-void createAugmentedVec(\r
- int index, /* (i) Index for the augmented vector \r
- to be created */\r
- float *buffer, /* (i) Pointer to the end of the buffer for\r
- augmented codebook construction */\r
- float *cbVec/* (o) The construced codebook vector */\r
-) {\r
- int ilow, j;\r
- float *pp, *ppo, *ppi, alfa, alfa1, weighted;\r
-\r
- ilow = index-5;\r
- \r
- /* copy the first noninterpolated part */\r
-\r
- pp = buffer-index;\r
- memcpy(cbVec,pp,sizeof(float)*index);\r
-\r
- /* interpolation */\r
-\r
- alfa1 = (float)0.2;\r
- alfa = 0.0;\r
- ppo = buffer-5;\r
- ppi = buffer-index-5;\r
- for (j=ilow; j<index; j++) {\r
- weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);\r
- ppo++;\r
- ppi++;\r
- cbVec[j] = weighted;\r
- alfa += alfa1;\r
- }\r
-\r
- /* copy the second noninterpolated part */\r
-\r
- pp = buffer - index;\r
- memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index));\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
-\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- createCB.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_CREATECB_H\r
-#define __iLBC_CREATECB_H\r
-\r
-void filteredCBvecs(\r
- float *cbvectors, /* (o) Codebook vector for the \r
- higher section */\r
- float *mem, /* (i) Buffer to create codebook \r
- vectors from */\r
- int lMem /* (i) Length of buffer */\r
-);\r
-\r
-void searchAugmentedCB(\r
- int low, /* (i) Start index for the search */\r
- int high, /* (i) End index for the search */\r
- int stage, /* (i) Current stage */\r
- int startIndex, /* (i) CB index for the first \r
- augmented vector */\r
- float *target, /* (i) Target vector for encoding */\r
- float *buffer, /* (i) Pointer to the end of the \r
- buffer for augmented codebook \r
- construction */\r
- float *max_measure, /* (i/o) Currently maximum measure */\r
- int *best_index,/* (o) Currently the best index */\r
- float *gain, /* (o) Currently the best gain */\r
- float *energy, /* (o) Energy of augmented \r
- codebook vectors */\r
- float *invenergy/* (o) Inv energy of aug codebook \r
- vectors */\r
-);\r
-\r
-void createAugmentedVec(\r
- int index, /* (i) Index for the aug vector \r
- to be created */\r
- float *buffer, /* (i) Pointer to the end of the \r
- buffer for augmented codebook \r
- construction */\r
- float *cbVec /* (o) The construced codebook vector */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- doCPLC.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-#include <string.h>\r
-#include <stdio.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "doCPLC.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * Compute cross correlation and pitch gain for pitch prediction\r
- * of last subframe at given lag.\r
- *---------------------------------------------------------------*/\r
-\r
-static void compCorr(\r
- float *cc, /* (o) cross correlation coefficient */\r
- float *gc, /* (o) gain */\r
- float *pm,\r
- float *buffer, /* (i) signal buffer */\r
- int lag, /* (i) pitch lag */\r
- int bLen, /* (i) length of buffer */\r
- int sRange /* (i) correlation search length */\r
-){\r
-\r
-\r
- int i;\r
- float ftmp1, ftmp2, ftmp3;\r
-\r
- /* Guard against getting outside buffer */\r
- if ((bLen-sRange-lag)<0) {\r
- sRange=bLen-lag;\r
- }\r
-\r
- ftmp1 = 0.0;\r
- ftmp2 = 0.0;\r
- ftmp3 = 0.0;\r
- for (i=0; i<sRange; i++) {\r
- ftmp1 += buffer[bLen-sRange+i] *\r
- buffer[bLen-sRange+i-lag];\r
- ftmp2 += buffer[bLen-sRange+i-lag] * \r
- buffer[bLen-sRange+i-lag];\r
- ftmp3 += buffer[bLen-sRange+i] * \r
- buffer[bLen-sRange+i];\r
- }\r
-\r
- if (ftmp2 > 0.0) {\r
- *cc = ftmp1*ftmp1/ftmp2;\r
- *gc = (float)fabs(ftmp1/ftmp2);\r
- *pm=(float)fabs(ftmp1)/\r
- ((float)sqrt(ftmp2)*(float)sqrt(ftmp3));\r
- }\r
- else {\r
- *cc = 0.0;\r
- *gc = 0.0;\r
- *pm=0.0;\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * Packet loss concealment routine. Conceals a residual signal\r
- * and LP parameters. If no packet loss, update state.\r
- *---------------------------------------------------------------*/\r
-\r
-void doThePLC(\r
- float *PLCresidual, /* (o) concealed residual */ \r
- float *PLClpc, /* (o) concealed LP parameters */ \r
- int PLI, /* (i) packet loss indicator \r
- 0 - no PL, 1 = PL */ \r
- float *decresidual, /* (i) decoded residual */\r
- float *lpc, /* (i) decoded LPC (only used for no PL) */\r
- int inlag, /* (i) pitch lag */\r
- iLBC_Dec_Inst_t *iLBCdec_inst \r
- /* (i/o) decoder instance */\r
-){\r
- int lag=20, randlag;\r
- float gain, maxcc;\r
- float use_gain;\r
- float gain_comp, maxcc_comp, per, max_per;\r
- int i, pick, use_lag;\r
-\r
-\r
- float ftmp, randvec[BLOCKL_MAX], pitchfact, energy;\r
- \r
- /* Packet Loss */\r
-\r
- if (PLI == 1) {\r
- \r
- iLBCdec_inst->consPLICount += 1;\r
- \r
- /* if previous frame not lost, \r
- determine pitch pred. gain */\r
- \r
- if (iLBCdec_inst->prevPLI != 1) {\r
-\r
- /* Search around the previous lag to find the \r
- best pitch period */\r
- \r
- lag=inlag-3;\r
- compCorr(&maxcc, &gain, &max_per, \r
- iLBCdec_inst->prevResidual,\r
- lag, iLBCdec_inst->blockl, 60);\r
- for (i=inlag-2;i<=inlag+3;i++) {\r
- compCorr(&maxcc_comp, &gain_comp, &per,\r
- iLBCdec_inst->prevResidual,\r
- i, iLBCdec_inst->blockl, 60);\r
- \r
- if (maxcc_comp>maxcc) {\r
- maxcc=maxcc_comp;\r
- gain=gain_comp;\r
- lag=i;\r
- max_per=per;\r
- }\r
- }\r
- \r
- }\r
-\r
- /* previous frame lost, use recorded lag and periodicity */\r
-\r
- else {\r
- lag=iLBCdec_inst->prevLag;\r
- max_per=iLBCdec_inst->per;\r
- }\r
- \r
- /* downscaling */\r
-\r
- use_gain=1.0;\r
- if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>320)\r
- use_gain=(float)0.9;\r
- else if (iLBCdec_inst->consPLICount*\r
- iLBCdec_inst->blockl>2*320)\r
- use_gain=(float)0.7;\r
- else if (iLBCdec_inst->consPLICount*\r
- iLBCdec_inst->blockl>3*320)\r
- use_gain=(float)0.5;\r
- else if (iLBCdec_inst->consPLICount*\r
-\r
-\r
- iLBCdec_inst->blockl>4*320)\r
- use_gain=(float)0.0;\r
-\r
- /* mix noise and pitch repeatition */\r
- ftmp=(float)sqrt(max_per);\r
- if (ftmp>(float)0.7)\r
- pitchfact=(float)1.0;\r
- else if (ftmp>(float)0.4)\r
- pitchfact=(ftmp-(float)0.4)/((float)0.7-(float)0.4);\r
- else\r
- pitchfact=0.0;\r
-\r
-\r
- /* avoid repetition of same pitch cycle */\r
- use_lag=lag;\r
- if (lag<80) {\r
- use_lag=2*lag;\r
- }\r
-\r
- /* compute concealed residual */\r
-\r
- energy = 0.0;\r
- for (i=0; i<iLBCdec_inst->blockl; i++) {\r
-\r
- /* noise component */\r
-\r
- iLBCdec_inst->seed=(iLBCdec_inst->seed*69069L+1) & \r
- (0x80000000L-1);\r
- randlag = 50 + ((signed long) iLBCdec_inst->seed)%70;\r
- pick = i - randlag;\r
- \r
- if (pick < 0) {\r
- randvec[i] = \r
- iLBCdec_inst->prevResidual[\r
- iLBCdec_inst->blockl+pick];\r
- } else {\r
- randvec[i] = randvec[pick];\r
- }\r
-\r
- /* pitch repeatition component */\r
- pick = i - use_lag;\r
- \r
- if (pick < 0) {\r
- PLCresidual[i] = \r
- iLBCdec_inst->prevResidual[\r
- iLBCdec_inst->blockl+pick];\r
- } else {\r
- PLCresidual[i] = PLCresidual[pick];\r
- }\r
-\r
- /* mix random and periodicity component */\r
-\r
- if (i<80)\r
- PLCresidual[i] = use_gain*(pitchfact * \r
-\r
-\r
- PLCresidual[i] +\r
- ((float)1.0 - pitchfact) * randvec[i]);\r
- else if (i<160)\r
- PLCresidual[i] = (float)0.95*use_gain*(pitchfact * \r
- PLCresidual[i] +\r
- ((float)1.0 - pitchfact) * randvec[i]);\r
- else\r
- PLCresidual[i] = (float)0.9*use_gain*(pitchfact * \r
- PLCresidual[i] +\r
- ((float)1.0 - pitchfact) * randvec[i]);\r
-\r
- energy += PLCresidual[i] * PLCresidual[i];\r
- }\r
- \r
- /* less than 30 dB, use only noise */\r
- \r
- if (sqrt(energy/(float)iLBCdec_inst->blockl) < 30.0) { \r
- gain=0.0;\r
- for (i=0; i<iLBCdec_inst->blockl; i++) {\r
- PLCresidual[i] = randvec[i];\r
- }\r
- }\r
-\r
- /* use old LPC */\r
-\r
- memcpy(PLClpc,iLBCdec_inst->prevLpc,\r
- (LPC_FILTERORDER+1)*sizeof(float));\r
- \r
- }\r
-\r
- /* no packet loss, copy input */\r
-\r
- else {\r
- memcpy(PLCresidual, decresidual, \r
- iLBCdec_inst->blockl*sizeof(float));\r
- memcpy(PLClpc, lpc, (LPC_FILTERORDER+1)*sizeof(float));\r
- iLBCdec_inst->consPLICount = 0;\r
- }\r
- \r
- /* update state */\r
-\r
- if (PLI) {\r
- iLBCdec_inst->prevLag = lag;\r
- iLBCdec_inst->per=max_per;\r
- }\r
-\r
- iLBCdec_inst->prevPLI = PLI;\r
- memcpy(iLBCdec_inst->prevLpc, PLClpc, \r
- (LPC_FILTERORDER+1)*sizeof(float));\r
- memcpy(iLBCdec_inst->prevResidual, PLCresidual,\r
- iLBCdec_inst->blockl*sizeof(float));\r
-}\r
-\r
-\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- doCPLC.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_DOLPC_H\r
-#define __iLBC_DOLPC_H\r
-\r
-void doThePLC(\r
- float *PLCresidual, /* (o) concealed residual */ \r
- float *PLClpc, /* (o) concealed LP parameters */ \r
- int PLI, /* (i) packet loss indicator \r
- 0 - no PL, 1 = PL */ \r
- float *decresidual, /* (i) decoded residual */\r
- float *lpc, /* (i) decoded LPC (only used for no PL) */\r
- int inlag, /* (i) pitch lag */\r
- iLBC_Dec_Inst_t *iLBCdec_inst \r
- /* (i/o) decoder instance */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- enhancer.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-#include <string.h>\r
-#include "iLBC_define.h"\r
-#include "enhancer.h"\r
-#include "constants.h"\r
-#include "filter.h"\r
-\r
-/*----------------------------------------------------------------*\r
-\r
-\r
- * Find index in array such that the array element with said\r
- * index is the element of said array closest to "value" \r
- * according to the squared-error criterion\r
- *---------------------------------------------------------------*/\r
-\r
-static void NearestNeighbor(\r
- int *index, /* (o) index of array element closest \r
- to value */\r
- float *array, /* (i) data array */\r
- float value,/* (i) value */\r
- int arlength/* (i) dimension of data array */\r
-){\r
- int i;\r
- float bestcrit,crit;\r
-\r
- crit=array[0]-value;\r
- bestcrit=crit*crit;\r
- *index=0;\r
- for (i=1; i<arlength; i++) {\r
- crit=array[i]-value;\r
- crit=crit*crit;\r
- \r
- if (crit<bestcrit) {\r
- bestcrit=crit;\r
- *index=i;\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * compute cross correlation between sequences\r
- *---------------------------------------------------------------*/\r
-\r
-static void mycorr1( \r
- float* corr, /* (o) correlation of seq1 and seq2 */\r
- float* seq1, /* (i) first sequence */\r
- int dim1, /* (i) dimension first seq1 */\r
- const float *seq2, /* (i) second sequence */\r
- int dim2 /* (i) dimension seq2 */\r
-){\r
- int i,j;\r
-\r
- for (i=0; i<=dim1-dim2; i++) {\r
- corr[i]=0.0;\r
- for (j=0; j<dim2; j++) {\r
- corr[i] += seq1[i+j] * seq2[j];\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * upsample finite array assuming zeros outside bounds\r
- *---------------------------------------------------------------*/\r
-\r
-\r
-\r
-static void enh_upsample( \r
- float* useq1, /* (o) upsampled output sequence */\r
- float* seq1,/* (i) unupsampled sequence */\r
- int dim1, /* (i) dimension seq1 */\r
- int hfl /* (i) polyphase filter length=2*hfl+1 */\r
-){\r
- float *pu,*ps;\r
- int i,j,k,q,filterlength,hfl2;\r
- const float *polyp[ENH_UPS0]; /* pointers to \r
- polyphase columns */\r
- const float *pp;\r
-\r
- /* define pointers for filter */\r
-\r
- filterlength=2*hfl+1;\r
- \r
- if ( filterlength > dim1 ) {\r
- hfl2=(int) (dim1/2);\r
- for (j=0; j<ENH_UPS0; j++) {\r
- polyp[j]=polyphaserTbl+j*filterlength+hfl-hfl2;\r
- }\r
- hfl=hfl2;\r
- filterlength=2*hfl+1;\r
- }\r
- else {\r
- for (j=0; j<ENH_UPS0; j++) {\r
- polyp[j]=polyphaserTbl+j*filterlength;\r
- }\r
- }\r
-\r
- /* filtering: filter overhangs left side of sequence */\r
-\r
- pu=useq1;\r
- for (i=hfl; i<filterlength; i++) { \r
- for (j=0; j<ENH_UPS0; j++) {\r
- *pu=0.0;\r
- pp = polyp[j];\r
- ps = seq1+i;\r
- for (k=0; k<=i; k++) {\r
- *pu += *ps-- * *pp++;\r
- }\r
- pu++;\r
- }\r
- }\r
-\r
- /* filtering: simple convolution=inner products */\r
-\r
- for (i=filterlength; i<dim1; i++) {\r
- for (j=0;j<ENH_UPS0; j++){\r
- *pu=0.0;\r
- pp = polyp[j];\r
- ps = seq1+i;\r
- for (k=0; k<filterlength; k++) {\r
- *pu += *ps-- * *pp++;\r
-\r
-\r
- }\r
- pu++;\r
- }\r
- }\r
-\r
- /* filtering: filter overhangs right side of sequence */\r
-\r
- for (q=1; q<=hfl; q++) { \r
- for (j=0; j<ENH_UPS0; j++) {\r
- *pu=0.0;\r
- pp = polyp[j]+q;\r
- ps = seq1+dim1-1;\r
- for (k=0; k<filterlength-q; k++) {\r
- *pu += *ps-- * *pp++;\r
- }\r
- pu++;\r
- }\r
- }\r
-}\r
-\r
-\r
-/*----------------------------------------------------------------*\r
- * find segment starting near idata+estSegPos that has highest \r
- * correlation with idata+centerStartPos through \r
- * idata+centerStartPos+ENH_BLOCKL-1 segment is found at a \r
- * resolution of ENH_UPSO times the original of the original \r
- * sampling rate\r
- *---------------------------------------------------------------*/\r
-\r
-static void refiner(\r
- float *seg, /* (o) segment array */\r
- float *updStartPos, /* (o) updated start point */\r
- float* idata, /* (i) original data buffer */\r
- int idatal, /* (i) dimension of idata */\r
- int centerStartPos, /* (i) beginning center segment */\r
- float estSegPos,/* (i) estimated beginning other segment */\r
- float period /* (i) estimated pitch period */\r
-){\r
- int estSegPosRounded,searchSegStartPos,searchSegEndPos,corrdim;\r
- int tloc,tloc2,i,st,en,fraction;\r
- float vect[ENH_VECTL],corrVec[ENH_CORRDIM],maxv;\r
- float corrVecUps[ENH_CORRDIM*ENH_UPS0];\r
-\r
- /* defining array bounds */\r
- \r
- estSegPosRounded=(int)(estSegPos - 0.5);\r
-\r
- searchSegStartPos=estSegPosRounded-ENH_SLOP;\r
- \r
- if (searchSegStartPos<0) { \r
- searchSegStartPos=0;\r
- }\r
- searchSegEndPos=estSegPosRounded+ENH_SLOP;\r
- \r
-\r
-\r
- if (searchSegEndPos+ENH_BLOCKL >= idatal) { \r
- searchSegEndPos=idatal-ENH_BLOCKL-1;\r
- }\r
- corrdim=searchSegEndPos-searchSegStartPos+1;\r
- \r
- /* compute upsampled correlation (corr33) and find \r
- location of max */\r
-\r
- mycorr1(corrVec,idata+searchSegStartPos,\r
- corrdim+ENH_BLOCKL-1,idata+centerStartPos,ENH_BLOCKL);\r
- enh_upsample(corrVecUps,corrVec,corrdim,ENH_FL0);\r
- tloc=0; maxv=corrVecUps[0];\r
- for (i=1; i<ENH_UPS0*corrdim; i++) {\r
- \r
- if (corrVecUps[i]>maxv) {\r
- tloc=i;\r
- maxv=corrVecUps[i];\r
- }\r
- }\r
- \r
- /* make vector can be upsampled without ever running outside \r
- bounds */\r
- \r
- *updStartPos= (float)searchSegStartPos + \r
- (float)tloc/(float)ENH_UPS0+(float)1.0;\r
- tloc2=(int)(tloc/ENH_UPS0);\r
- \r
- if (tloc>tloc2*ENH_UPS0) {\r
- tloc2++;\r
- }\r
- st=searchSegStartPos+tloc2-ENH_FL0;\r
- \r
- if (st<0) {\r
- memset(vect,0,-st*sizeof(float));\r
- memcpy(&vect[-st],idata, (ENH_VECTL+st)*sizeof(float));\r
- }\r
- else {\r
- en=st+ENH_VECTL;\r
- \r
- if (en>idatal) {\r
- memcpy(vect, &idata[st], \r
- (ENH_VECTL-(en-idatal))*sizeof(float));\r
- memset(&vect[ENH_VECTL-(en-idatal)], 0, \r
- (en-idatal)*sizeof(float));\r
- }\r
- else {\r
- memcpy(vect, &idata[st], ENH_VECTL*sizeof(float));\r
- }\r
- }\r
- fraction=tloc2*ENH_UPS0-tloc;\r
- \r
- /* compute the segment (this is actually a convolution) */\r
-\r
- mycorr1(seg,vect,ENH_VECTL,polyphaserTbl+(2*ENH_FL0+1)*fraction,\r
-\r
-\r
- 2*ENH_FL0+1);\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * find the smoothed output data\r
- *---------------------------------------------------------------*/\r
-\r
-static void smath(\r
- float *odata, /* (o) smoothed output */\r
- float *sseq,/* (i) said second sequence of waveforms */\r
- int hl, /* (i) 2*hl+1 is sseq dimension */\r
- float alpha0/* (i) max smoothing energy fraction */\r
-){\r
- int i,k;\r
- float w00,w10,w11,A,B,C,*psseq,err,errs;\r
- float surround[BLOCKL_MAX]; /* shape contributed by other than \r
- current */\r
- float wt[2*ENH_HL+1]; /* waveform weighting to get \r
- surround shape */\r
- float denom;\r
- \r
- /* create shape of contribution from all waveforms except the\r
- current one */\r
-\r
- for (i=1; i<=2*hl+1; i++) {\r
- wt[i-1] = (float)0.5*(1 - (float)cos(2*PI*i/(2*hl+2))); \r
- }\r
- wt[hl]=0.0; /* for clarity, not used */\r
- for (i=0; i<ENH_BLOCKL; i++) {\r
- surround[i]=sseq[i]*wt[0];\r
- }\r
- for (k=1; k<hl; k++) {\r
- psseq=sseq+k*ENH_BLOCKL;\r
- for(i=0;i<ENH_BLOCKL; i++) {\r
- surround[i]+=psseq[i]*wt[k];\r
- }\r
- }\r
- for (k=hl+1; k<=2*hl; k++) {\r
- psseq=sseq+k*ENH_BLOCKL;\r
- for(i=0;i<ENH_BLOCKL; i++) {\r
- surround[i]+=psseq[i]*wt[k];\r
- }\r
- }\r
- \r
- /* compute some inner products */\r
-\r
- w00 = w10 = w11 = 0.0;\r
- psseq=sseq+hl*ENH_BLOCKL; /* current block */\r
- for (i=0; i<ENH_BLOCKL;i++) {\r
- w00+=psseq[i]*psseq[i];\r
- w11+=surround[i]*surround[i];\r
- w10+=surround[i]*psseq[i];\r
- }\r
- \r
-\r
-\r
- if (fabs(w11) < 1.0) {\r
- w11=1.0;\r
- }\r
- C = (float)sqrt( w00/w11);\r
- \r
- /* first try enhancement without power-constraint */\r
-\r
- errs=0.0;\r
- psseq=sseq+hl*ENH_BLOCKL;\r
- for (i=0; i<ENH_BLOCKL; i++) {\r
- odata[i]=C*surround[i];\r
- err=psseq[i]-odata[i];\r
- errs+=err*err;\r
- }\r
- \r
- /* if constraint violated by first try, add constraint */ \r
- \r
- if (errs > alpha0 * w00) {\r
- if ( w00 < 1) {\r
- w00=1;\r
- }\r
- denom = (w11*w00-w10*w10)/(w00*w00);\r
- \r
- if (denom > 0.0001) { /* eliminates numerical problems \r
- for if smooth */\r
- A = (float)sqrt( (alpha0- alpha0*alpha0/4)/denom);\r
- B = -alpha0/2 - A * w10/w00;\r
- B = B+1;\r
- }\r
- else { /* essentially no difference between cycles; \r
- smoothing not needed */\r
- A= 0.0;\r
- B= 1.0;\r
- }\r
- \r
- /* create smoothed sequence */\r
-\r
- psseq=sseq+hl*ENH_BLOCKL;\r
- for (i=0; i<ENH_BLOCKL; i++) {\r
- odata[i]=A*surround[i]+B*psseq[i];\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * get the pitch-synchronous sample sequence\r
- *---------------------------------------------------------------*/\r
-\r
-static void getsseq(\r
- float *sseq, /* (o) the pitch-synchronous sequence */\r
- float *idata, /* (i) original data */\r
- int idatal, /* (i) dimension of data */\r
- int centerStartPos, /* (i) where current block starts */\r
- float *period, /* (i) rough-pitch-period array */\r
-\r
-\r
- float *plocs, /* (i) where periods of period array \r
- are taken */\r
- int periodl, /* (i) dimension period array */\r
- int hl /* (i) 2*hl+1 is the number of sequences */\r
-){\r
- int i,centerEndPos,q;\r
- float blockStartPos[2*ENH_HL+1];\r
- int lagBlock[2*ENH_HL+1];\r
- float plocs2[ENH_PLOCSL]; \r
- float *psseq;\r
-\r
- centerEndPos=centerStartPos+ENH_BLOCKL-1;\r
- \r
- /* present */\r
-\r
- NearestNeighbor(lagBlock+hl,plocs,\r
- (float)0.5*(centerStartPos+centerEndPos),periodl);\r
- \r
- blockStartPos[hl]=(float)centerStartPos;\r
- psseq=sseq+ENH_BLOCKL*hl;\r
- memcpy(psseq, idata+centerStartPos, ENH_BLOCKL*sizeof(float));\r
- \r
- /* past */\r
-\r
- for (q=hl-1; q>=0; q--) {\r
- blockStartPos[q]=blockStartPos[q+1]-period[lagBlock[q+1]];\r
- NearestNeighbor(lagBlock+q,plocs,\r
- blockStartPos[q]+\r
- ENH_BLOCKL_HALF-period[lagBlock[q+1]], periodl);\r
- \r
- \r
- if (blockStartPos[q]-ENH_OVERHANG>=0) {\r
- refiner(sseq+q*ENH_BLOCKL, blockStartPos+q, idata,\r
- idatal, centerStartPos, blockStartPos[q],\r
- period[lagBlock[q+1]]);\r
- } else {\r
- psseq=sseq+q*ENH_BLOCKL;\r
- memset(psseq, 0, ENH_BLOCKL*sizeof(float));\r
- }\r
- }\r
- \r
- /* future */\r
-\r
- for (i=0; i<periodl; i++) {\r
- plocs2[i]=plocs[i]-period[i];\r
- }\r
- for (q=hl+1; q<=2*hl; q++) { \r
- NearestNeighbor(lagBlock+q,plocs2,\r
- blockStartPos[q-1]+ENH_BLOCKL_HALF,periodl);\r
-\r
- blockStartPos[q]=blockStartPos[q-1]+period[lagBlock[q]];\r
- if (blockStartPos[q]+ENH_BLOCKL+ENH_OVERHANG<idatal) {\r
- refiner(sseq+ENH_BLOCKL*q, blockStartPos+q, idata,\r
- idatal, centerStartPos, blockStartPos[q],\r
-\r
-\r
- period[lagBlock[q]]);\r
- }\r
- else {\r
- psseq=sseq+q*ENH_BLOCKL;\r
- memset(psseq, 0, ENH_BLOCKL*sizeof(float));\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * perform enhancement on idata+centerStartPos through \r
- * idata+centerStartPos+ENH_BLOCKL-1\r
- *---------------------------------------------------------------*/\r
-\r
-static void enhancer(\r
- float *odata, /* (o) smoothed block, dimension blockl */\r
- float *idata, /* (i) data buffer used for enhancing */\r
- int idatal, /* (i) dimension idata */\r
- int centerStartPos, /* (i) first sample current block \r
- within idata */\r
- float alpha0, /* (i) max correction-energy-fraction \r
- (in [0,1]) */\r
- float *period, /* (i) pitch period array */\r
- float *plocs, /* (i) locations where period array \r
- values valid */\r
- int periodl /* (i) dimension of period and plocs */\r
-){\r
- float sseq[(2*ENH_HL+1)*ENH_BLOCKL];\r
-\r
- /* get said second sequence of segments */\r
-\r
- getsseq(sseq,idata,idatal,centerStartPos,period,\r
- plocs,periodl,ENH_HL);\r
-\r
- /* compute the smoothed output from said second sequence */\r
-\r
- smath(odata,sseq,ENH_HL,alpha0);\r
-\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * cross correlation\r
- *---------------------------------------------------------------*/\r
-\r
-float xCorrCoef( \r
- float *target, /* (i) first array */\r
- float *regressor, /* (i) second array */\r
- int subl /* (i) dimension arrays */\r
-){\r
- int i;\r
- float ftmp1, ftmp2;\r
- \r
- ftmp1 = 0.0;\r
- ftmp2 = 0.0;\r
-\r
-\r
- for (i=0; i<subl; i++) {\r
- ftmp1 += target[i]*regressor[i];\r
- ftmp2 += regressor[i]*regressor[i]; \r
- }\r
- \r
- if (ftmp1 > 0.0) {\r
- return (float)(ftmp1*ftmp1/ftmp2);\r
- }\r
- else {\r
- return (float)0.0;\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * interface for enhancer\r
- *---------------------------------------------------------------*/\r
-\r
-int enhancerInterface(\r
- float *out, /* (o) enhanced signal */\r
- float *in, /* (i) unenhanced signal */\r
- iLBC_Dec_Inst_t *iLBCdec_inst /* (i) buffers etc */\r
-){\r
- float *enh_buf, *enh_period;\r
- int iblock, isample;\r
- int lag=0, ilag, i, ioffset;\r
- float cc, maxcc;\r
- float ftmp1, ftmp2;\r
- float *inPtr, *enh_bufPtr1, *enh_bufPtr2;\r
- float plc_pred[ENH_BLOCKL];\r
-\r
- float lpState[6], downsampled[(ENH_NBLOCKS*ENH_BLOCKL+120)/2];\r
- int inLen=ENH_NBLOCKS*ENH_BLOCKL+120;\r
- int start, plc_blockl, inlag;\r
-\r
- enh_buf=iLBCdec_inst->enh_buf;\r
- enh_period=iLBCdec_inst->enh_period;\r
- \r
- memmove(enh_buf, &enh_buf[iLBCdec_inst->blockl], \r
- (ENH_BUFL-iLBCdec_inst->blockl)*sizeof(float));\r
- \r
- memcpy(&enh_buf[ENH_BUFL-iLBCdec_inst->blockl], in, \r
- iLBCdec_inst->blockl*sizeof(float));\r
-\r
- if (iLBCdec_inst->mode==30)\r
- plc_blockl=ENH_BLOCKL;\r
- else\r
- plc_blockl=40;\r
-\r
- /* when 20 ms frame, move processing one block */\r
- ioffset=0;\r
- if (iLBCdec_inst->mode==20) ioffset=1;\r
-\r
- i=3-ioffset;\r
- memmove(enh_period, &enh_period[i], \r
-\r
-\r
- (ENH_NBLOCKS_TOT-i)*sizeof(float));\r
-\r
- /* Set state information to the 6 samples right before \r
- the samples to be downsampled. */\r
-\r
- memcpy(lpState, \r
- enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-126, \r
- 6*sizeof(float));\r
-\r
- /* Down sample a factor 2 to save computations */\r
-\r
- DownSample(enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-120,\r
- lpFilt_coefsTbl, inLen-ioffset*ENH_BLOCKL,\r
- lpState, downsampled);\r
-\r
- /* Estimate the pitch in the down sampled domain. */\r
- for (iblock = 0; iblock<ENH_NBLOCKS-ioffset; iblock++) {\r
- \r
- lag = 10;\r
- maxcc = xCorrCoef(downsampled+60+iblock*\r
- ENH_BLOCKL_HALF, downsampled+60+iblock*\r
- ENH_BLOCKL_HALF-lag, ENH_BLOCKL_HALF);\r
- for (ilag=11; ilag<60; ilag++) {\r
- cc = xCorrCoef(downsampled+60+iblock*\r
- ENH_BLOCKL_HALF, downsampled+60+iblock*\r
- ENH_BLOCKL_HALF-ilag, ENH_BLOCKL_HALF);\r
- \r
- if (cc > maxcc) {\r
- maxcc = cc;\r
- lag = ilag;\r
- }\r
- }\r
-\r
- /* Store the estimated lag in the non-downsampled domain */\r
- enh_period[iblock+ENH_NBLOCKS_EXTRA+ioffset] = (float)lag*2;\r
-\r
-\r
- } \r
-\r
-\r
- /* PLC was performed on the previous packet */\r
- if (iLBCdec_inst->prev_enh_pl==1) {\r
-\r
- inlag=(int)enh_period[ENH_NBLOCKS_EXTRA+ioffset];\r
-\r
- lag = inlag-1;\r
- maxcc = xCorrCoef(in, in+lag, plc_blockl);\r
- for (ilag=inlag; ilag<=inlag+1; ilag++) {\r
- cc = xCorrCoef(in, in+ilag, plc_blockl);\r
- \r
- if (cc > maxcc) {\r
- maxcc = cc;\r
- lag = ilag;\r
- }\r
- }\r
-\r
-\r
-\r
- enh_period[ENH_NBLOCKS_EXTRA+ioffset-1]=(float)lag;\r
-\r
- /* compute new concealed residual for the old lookahead,\r
- mix the forward PLC with a backward PLC from \r
- the new frame */\r
- \r
- inPtr=&in[lag-1];\r
- \r
- enh_bufPtr1=&plc_pred[plc_blockl-1];\r
- \r
- if (lag>plc_blockl) {\r
- start=plc_blockl;\r
- } else {\r
- start=lag;\r
- }\r
-\r
- for (isample = start; isample>0; isample--) {\r
- *enh_bufPtr1-- = *inPtr--;\r
- }\r
- \r
- enh_bufPtr2=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl];\r
- for (isample = (plc_blockl-1-lag); isample>=0; isample--) \r
-{\r
- *enh_bufPtr1-- = *enh_bufPtr2--;\r
- }\r
-\r
- /* limit energy change */\r
- ftmp2=0.0;\r
- ftmp1=0.0;\r
- for (i=0;i<plc_blockl;i++) {\r
- ftmp2+=enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i]*\r
- enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i];\r
- ftmp1+=plc_pred[i]*plc_pred[i];\r
- }\r
- ftmp1=(float)sqrt(ftmp1/(float)plc_blockl);\r
- ftmp2=(float)sqrt(ftmp2/(float)plc_blockl);\r
- if (ftmp1>(float)2.0*ftmp2 && ftmp1>0.0) {\r
- for (i=0;i<plc_blockl-10;i++) {\r
- plc_pred[i]*=(float)2.0*ftmp2/ftmp1;\r
- }\r
- for (i=plc_blockl-10;i<plc_blockl;i++) {\r
- plc_pred[i]*=(float)(i-plc_blockl+10)*\r
- ((float)1.0-(float)2.0*ftmp2/ftmp1)/(float)(10)+\r
- (float)2.0*ftmp2/ftmp1;\r
- }\r
- }\r
- \r
- enh_bufPtr1=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl];\r
- for (i=0; i<plc_blockl; i++) {\r
- ftmp1 = (float) (i+1) / (float) (plc_blockl+1);\r
- *enh_bufPtr1 *= ftmp1;\r
- *enh_bufPtr1 += ((float)1.0-ftmp1)*\r
- plc_pred[plc_blockl-1-i];\r
- enh_bufPtr1--;\r
- }\r
-\r
-\r
- }\r
-\r
- if (iLBCdec_inst->mode==20) {\r
- /* Enhancer with 40 samples delay */\r
- for (iblock = 0; iblock<2; iblock++) {\r
- enhancer(out+iblock*ENH_BLOCKL, enh_buf, \r
- ENH_BUFL, (5+iblock)*ENH_BLOCKL+40,\r
- ENH_ALPHA0, enh_period, enh_plocsTbl, \r
- ENH_NBLOCKS_TOT);\r
- }\r
- } else if (iLBCdec_inst->mode==30) {\r
- /* Enhancer with 80 samples delay */\r
- for (iblock = 0; iblock<3; iblock++) {\r
- enhancer(out+iblock*ENH_BLOCKL, enh_buf, \r
- ENH_BUFL, (4+iblock)*ENH_BLOCKL,\r
- ENH_ALPHA0, enh_period, enh_plocsTbl, \r
- ENH_NBLOCKS_TOT);\r
- }\r
- }\r
-\r
- return (lag*2);\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- enhancer.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __ENHANCER_H\r
-#define __ENHANCER_H\r
-\r
-#include "iLBC_define.h"\r
-\r
-float xCorrCoef( \r
- float *target, /* (i) first array */\r
- float *regressor, /* (i) second array */\r
- int subl /* (i) dimension arrays */\r
-);\r
-\r
-int enhancerInterface(\r
- float *out, /* (o) the enhanced recidual signal */\r
- float *in, /* (i) the recidual signal to enhance */\r
- iLBC_Dec_Inst_t *iLBCdec_inst \r
- /* (i/o) the decoder state structure */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- filter.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-\r
-\r
-#include "iLBC_define.h"\r
-#include "filter.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * all-pole filter\r
- *---------------------------------------------------------------*/\r
-\r
-void AllPoleFilter(\r
- float *InOut, /* (i/o) on entrance InOut[-orderCoef] to \r
- InOut[-1] contain the state of the \r
- filter (delayed samples). InOut[0] to \r
- InOut[lengthInOut-1] contain the filter\r
- input, on en exit InOut[-orderCoef] to\r
- InOut[-1] is unchanged and InOut[0] to\r
- InOut[lengthInOut-1] contain filtered \r
- samples */\r
- float *Coef,/* (i) filter coefficients, Coef[0] is assumed \r
- to be 1.0 */\r
- int lengthInOut,/* (i) number of input/output samples */\r
- int orderCoef /* (i) number of filter coefficients */\r
-){ \r
- int n,k;\r
- \r
- for(n=0;n<lengthInOut;n++){\r
- for(k=1;k<=orderCoef;k++){\r
- *InOut -= Coef[k]*InOut[-k];\r
- }\r
- InOut++;\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * all-zero filter \r
- *---------------------------------------------------------------*/\r
-\r
-void AllZeroFilter(\r
- float *In, /* (i) In[0] to In[lengthInOut-1] contain \r
- filter input samples */\r
- float *Coef,/* (i) filter coefficients (Coef[0] is assumed \r
- to be 1.0) */\r
- int lengthInOut,/* (i) number of input/output samples */\r
- int orderCoef, /* (i) number of filter coefficients */\r
- float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]\r
- contain the filter state, on exit Out[0]\r
- to Out[lengthInOut-1] contain filtered\r
- samples */\r
-){ \r
- int n,k;\r
- \r
- for(n=0;n<lengthInOut;n++){\r
- *Out = Coef[0]*In[0];\r
- for(k=1;k<=orderCoef;k++){\r
- *Out += Coef[k]*In[-k];\r
- }\r
-\r
-\r
- Out++;\r
- In++;\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * pole-zero filter\r
- *---------------------------------------------------------------*/\r
-\r
-void ZeroPoleFilter(\r
- float *In, /* (i) In[0] to In[lengthInOut-1] contain \r
- filter input samples In[-orderCoef] to \r
- In[-1] contain state of all-zero \r
- section */\r
- float *ZeroCoef,/* (i) filter coefficients for all-zero \r
- section (ZeroCoef[0] is assumed to \r
- be 1.0) */\r
- float *PoleCoef,/* (i) filter coefficients for all-pole section\r
- (ZeroCoef[0] is assumed to be 1.0) */\r
- int lengthInOut,/* (i) number of input/output samples */\r
- int orderCoef, /* (i) number of filter coefficients */\r
- float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]\r
- contain state of all-pole section. On \r
- exit Out[0] to Out[lengthInOut-1] \r
- contain filtered samples */\r
-){\r
- AllZeroFilter(In,ZeroCoef,lengthInOut,orderCoef,Out);\r
- AllPoleFilter(Out,PoleCoef,lengthInOut,orderCoef);\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * downsample (LP filter and decimation)\r
- *---------------------------------------------------------------*/\r
-\r
-void DownSample (\r
- float *In, /* (i) input samples */\r
- float *Coef, /* (i) filter coefficients */\r
- int lengthIn, /* (i) number of input samples */ \r
- float *state, /* (i) filter state */\r
- float *Out /* (o) downsampled output */\r
-){\r
- float o;\r
- float *Out_ptr = Out;\r
- float *Coef_ptr, *In_ptr;\r
- float *state_ptr;\r
- int i, j, stop;\r
-\r
- /* LP filter and decimate at the same time */\r
-\r
- for (i = DELAY_DS; i < lengthIn; i+=FACTOR_DS)\r
- {\r
- Coef_ptr = &Coef[0];\r
- In_ptr = &In[i];\r
- state_ptr = &state[FILTERORDER_DS-2];\r
-\r
-\r
-\r
- o = (float)0.0;\r
- \r
- stop = (i < FILTERORDER_DS) ? i + 1 : FILTERORDER_DS;\r
-\r
- for (j = 0; j < stop; j++) \r
- {\r
- o += *Coef_ptr++ * (*In_ptr--);\r
- }\r
- for (j = i + 1; j < FILTERORDER_DS; j++) \r
- {\r
- o += *Coef_ptr++ * (*state_ptr--);\r
- }\r
-\r
- *Out_ptr++ = o;\r
- }\r
-\r
- /* Get the last part (use zeros as input for the future) */\r
-\r
- for (i=(lengthIn+FACTOR_DS); i<(lengthIn+DELAY_DS); \r
- i+=FACTOR_DS) {\r
-\r
- o=(float)0.0;\r
- \r
- if (i<lengthIn) {\r
- Coef_ptr = &Coef[0];\r
- In_ptr = &In[i];\r
- for (j=0; j<FILTERORDER_DS; j++) {\r
- o += *Coef_ptr++ * (*Out_ptr--);\r
- }\r
- } else {\r
- Coef_ptr = &Coef[i-lengthIn];\r
- In_ptr = &In[lengthIn-1];\r
- for (j=0; j<FILTERORDER_DS-(i-lengthIn); j++) {\r
- o += *Coef_ptr++ * (*In_ptr--);\r
- }\r
- }\r
- *Out_ptr++ = o;\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- filter.h\r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_FILTER_H\r
-#define __iLBC_FILTER_H\r
-\r
-void AllPoleFilter(\r
- float *InOut, /* (i/o) on entrance InOut[-orderCoef] to \r
- InOut[-1] contain the state of the \r
- filter (delayed samples). InOut[0] to \r
- InOut[lengthInOut-1] contain the filter \r
- input, on en exit InOut[-orderCoef] to \r
- InOut[-1] is unchanged and InOut[0] to \r
- InOut[lengthInOut-1] contain filtered \r
- samples */\r
- float *Coef,/* (i) filter coefficients, Coef[0] is assumed \r
- to be 1.0 */\r
- int lengthInOut,/* (i) number of input/output samples */\r
- int orderCoef /* (i) number of filter coefficients */\r
-);\r
-\r
-\r
-\r
-void AllZeroFilter(\r
- float *In, /* (i) In[0] to In[lengthInOut-1] contain \r
- filter input samples */\r
- float *Coef,/* (i) filter coefficients (Coef[0] is assumed \r
- to be 1.0) */\r
- int lengthInOut,/* (i) number of input/output samples */\r
- int orderCoef, /* (i) number of filter coefficients */\r
- float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]\r
- contain the filter state, on exit Out[0] \r
- to Out[lengthInOut-1] contain filtered \r
- samples */\r
-);\r
-\r
-void ZeroPoleFilter(\r
- float *In, /* (i) In[0] to In[lengthInOut-1] contain filter\r
- input samples In[-orderCoef] to In[-1] \r
- contain state of all-zero section */\r
- float *ZeroCoef,/* (i) filter coefficients for all-zero \r
- section (ZeroCoef[0] is assumed to \r
- be 1.0) */\r
- float *PoleCoef,/* (i) filter coefficients for all-pole section\r
- (ZeroCoef[0] is assumed to be 1.0) */\r
- int lengthInOut,/* (i) number of input/output samples */\r
- int orderCoef, /* (i) number of filter coefficients */\r
- float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]\r
- contain state of all-pole section. On\r
- exit Out[0] to Out[lengthInOut-1] \r
- contain filtered samples */\r
-);\r
-\r
-void DownSample (\r
- float *In, /* (i) input samples */\r
- float *Coef, /* (i) filter coefficients */\r
- int lengthIn, /* (i) number of input samples */ \r
- float *state, /* (i) filter state */\r
- float *Out /* (o) downsampled output */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- gainquant.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-\r
-\r
-******************************************************************/\r
-\r
-#include <string.h>\r
-#include <math.h>\r
-#include "constants.h"\r
-#include "gainquant.h"\r
-#include "filter.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * quantizer for the gain in the gain-shape coding of residual\r
- *---------------------------------------------------------------*/\r
-\r
-float gainquant(/* (o) quantized gain value */\r
- float in, /* (i) gain value */\r
- float maxIn,/* (i) maximum of gain value */\r
- int cblen, /* (i) number of quantization indices */\r
- int *index /* (o) quantization index */\r
-){\r
- int i, tindex;\r
- float minmeasure,measure, *cb, scale;\r
-\r
- /* ensure a lower bound on the scaling factor */\r
-\r
- scale=maxIn;\r
- \r
- if (scale<0.1) {\r
- scale=(float)0.1;\r
- }\r
-\r
- /* select the quantization table */\r
- \r
- if (cblen == 8) {\r
- cb = gain_sq3Tbl;\r
- } else if (cblen == 16) {\r
- cb = gain_sq4Tbl;\r
- } else {\r
- cb = gain_sq5Tbl;\r
- }\r
-\r
- /* select the best index in the quantization table */\r
- \r
- minmeasure=10000000.0;\r
- tindex=0;\r
- for (i=0; i<cblen; i++) {\r
- measure=(in-scale*cb[i])*(in-scale*cb[i]);\r
- \r
- if (measure<minmeasure) {\r
- tindex=i;\r
- minmeasure=measure;\r
- }\r
- }\r
- *index=tindex;\r
- \r
- /* return the quantized value */\r
- \r
-\r
-\r
- return scale*cb[tindex];\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * decoder for quantized gains in the gain-shape coding of \r
- * residual \r
- *---------------------------------------------------------------*/\r
-\r
-float gaindequant( /* (o) quantized gain value */\r
- int index, /* (i) quantization index */\r
- float maxIn,/* (i) maximum of unquantized gain */\r
- int cblen /* (i) number of quantization indices */\r
-){\r
- float scale;\r
-\r
- /* obtain correct scale factor */\r
-\r
- scale=(float)fabs(maxIn);\r
- \r
- if (scale<0.1) {\r
- scale=(float)0.1;\r
- }\r
-\r
- /* select the quantization table and return the decoded value */\r
-\r
- if (cblen==8) {\r
- return scale*gain_sq3Tbl[index];\r
- } else if (cblen==16) {\r
- return scale*gain_sq4Tbl[index];\r
- }\r
- else if (cblen==32) {\r
- return scale*gain_sq5Tbl[index];\r
- }\r
-\r
- return 0.0;\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- gainquant.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_GAINQUANT_H\r
-#define __iLBC_GAINQUANT_H\r
-\r
-float gainquant(/* (o) quantized gain value */\r
- float in, /* (i) gain value */\r
- float maxIn,/* (i) maximum of gain value */\r
- int cblen, /* (i) number of quantization indices */\r
- int *index /* (o) quantization index */\r
-);\r
-\r
-float gaindequant( /* (o) quantized gain value */\r
- int index, /* (i) quantization index */\r
- float maxIn,/* (i) maximum of unquantized gain */\r
- int cblen /* (i) number of quantization indices */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- getCBvec.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include "iLBC_define.h"\r
-#include "getCBvec.h"\r
-#include "constants.h"\r
-#include <string.h>\r
-\r
-/*----------------------------------------------------------------*\r
- * Construct codebook vector for given index.\r
- *---------------------------------------------------------------*/\r
-\r
-void getCBvec(\r
- float *cbvec, /* (o) Constructed codebook vector */\r
- float *mem, /* (i) Codebook buffer */\r
- int index, /* (i) Codebook index */\r
- int lMem, /* (i) Length of codebook buffer */\r
- int cbveclen/* (i) Codebook vector length */\r
-){\r
- int j, k, n, memInd, sFilt;\r
- float tmpbuf[CB_MEML];\r
- int base_size;\r
- int ilow, ihigh;\r
- float alfa, alfa1;\r
-\r
- /* Determine size of codebook sections */\r
-\r
- base_size=lMem-cbveclen+1;\r
- \r
- if (cbveclen==SUBL) {\r
- base_size+=cbveclen/2;\r
- }\r
-\r
- /* No filter -> First codebook section */\r
-\r
-\r
- \r
- if (index<lMem-cbveclen+1) {\r
-\r
- /* first non-interpolated vectors */\r
-\r
- k=index+cbveclen;\r
- /* get vector */\r
- memcpy(cbvec, mem+lMem-k, cbveclen*sizeof(float));\r
-\r
- } else if (index < base_size) {\r
-\r
- k=2*(index-(lMem-cbveclen+1))+cbveclen;\r
- \r
- ihigh=k/2;\r
- ilow=ihigh-5;\r
-\r
- /* Copy first noninterpolated part */\r
-\r
- memcpy(cbvec, mem+lMem-k/2, ilow*sizeof(float));\r
-\r
- /* interpolation */\r
-\r
- alfa1=(float)0.2;\r
- alfa=0.0;\r
- for (j=ilow; j<ihigh; j++) {\r
- cbvec[j]=((float)1.0-alfa)*mem[lMem-k/2+j]+\r
- alfa*mem[lMem-k+j];\r
- alfa+=alfa1;\r
- }\r
-\r
- /* Copy second noninterpolated part */\r
-\r
- memcpy(cbvec+ihigh, mem+lMem-k+ihigh, \r
- (cbveclen-ihigh)*sizeof(float));\r
-\r
- }\r
-\r
- /* Higher codebbok section based on filtering */\r
-\r
- else {\r
-\r
- /* first non-interpolated vectors */\r
-\r
- if (index-base_size<lMem-cbveclen+1) {\r
- float tempbuff2[CB_MEML+CB_FILTERLEN+1];\r
- float *pos;\r
- float *pp, *pp1;\r
-\r
- memset(tempbuff2, 0,\r
- CB_HALFFILTERLEN*sizeof(float));\r
- memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,\r
- lMem*sizeof(float));\r
- memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,\r
- (CB_HALFFILTERLEN+1)*sizeof(float));\r
-\r
-\r
-\r
- k=index-base_size+cbveclen;\r
- sFilt=lMem-k;\r
- memInd=sFilt+1-CB_HALFFILTERLEN;\r
-\r
- /* do filtering */\r
- pos=cbvec;\r
- memset(pos, 0, cbveclen*sizeof(float));\r
- for (n=0; n<cbveclen; n++) {\r
- pp=&tempbuff2[memInd+n+CB_HALFFILTERLEN];\r
- pp1=&cbfiltersTbl[CB_FILTERLEN-1];\r
- for (j=0; j<CB_FILTERLEN; j++) {\r
- (*pos)+=(*pp++)*(*pp1--);\r
- }\r
- pos++;\r
- }\r
- }\r
-\r
- /* interpolated vectors */\r
-\r
- else {\r
- float tempbuff2[CB_MEML+CB_FILTERLEN+1];\r
-\r
- float *pos;\r
- float *pp, *pp1;\r
- int i;\r
-\r
- memset(tempbuff2, 0,\r
- CB_HALFFILTERLEN*sizeof(float));\r
- memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,\r
- lMem*sizeof(float));\r
- memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,\r
- (CB_HALFFILTERLEN+1)*sizeof(float));\r
-\r
- k=2*(index-base_size-\r
- (lMem-cbveclen+1))+cbveclen;\r
- sFilt=lMem-k;\r
- memInd=sFilt+1-CB_HALFFILTERLEN;\r
-\r
- /* do filtering */\r
- pos=&tmpbuf[sFilt];\r
- memset(pos, 0, k*sizeof(float));\r
- for (i=0; i<k; i++) {\r
- pp=&tempbuff2[memInd+i+CB_HALFFILTERLEN];\r
- pp1=&cbfiltersTbl[CB_FILTERLEN-1];\r
- for (j=0; j<CB_FILTERLEN; j++) {\r
- (*pos)+=(*pp++)*(*pp1--);\r
- }\r
- pos++;\r
- }\r
-\r
- ihigh=k/2;\r
- ilow=ihigh-5;\r
-\r
-\r
-\r
- /* Copy first noninterpolated part */\r
-\r
- memcpy(cbvec, tmpbuf+lMem-k/2, \r
- ilow*sizeof(float));\r
-\r
- /* interpolation */\r
-\r
- alfa1=(float)0.2;\r
- alfa=0.0;\r
- for (j=ilow; j<ihigh; j++) {\r
- cbvec[j]=((float)1.0-alfa)*\r
- tmpbuf[lMem-k/2+j]+alfa*tmpbuf[lMem-k+j];\r
- alfa+=alfa1;\r
- }\r
-\r
- /* Copy second noninterpolated part */\r
-\r
- memcpy(cbvec+ihigh, tmpbuf+lMem-k+ihigh, \r
- (cbveclen-ihigh)*sizeof(float));\r
- }\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- getCBvec.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_GETCBVEC_H\r
-#define __iLBC_GETCBVEC_H\r
-\r
-\r
-\r
-void getCBvec(\r
- float *cbvec, /* (o) Constructed codebook vector */\r
- float *mem, /* (i) Codebook buffer */\r
- int index, /* (i) Codebook index */\r
- int lMem, /* (i) Length of codebook buffer */\r
- int cbveclen/* (i) Codebook vector length */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- helpfun.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "helpfun.h"\r
-#include "constants.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * calculation of auto correlation \r
- *---------------------------------------------------------------*/\r
-\r
-void autocorr( \r
- float *r, /* (o) autocorrelation vector */\r
- const float *x, /* (i) data vector */\r
- int N, /* (i) length of data vector */\r
- int order /* largest lag for calculated \r
- autocorrelations */\r
-){\r
- int lag, n;\r
- float sum;\r
- \r
- for (lag = 0; lag <= order; lag++) {\r
- sum = 0;\r
- for (n = 0; n < N - lag; n++) {\r
- sum += x[n] * x[n+lag];\r
- }\r
- r[lag] = sum;\r
- }\r
-}\r
-\r
-\r
-\r
-/*----------------------------------------------------------------*\r
- * window multiplication \r
- *---------------------------------------------------------------*/\r
-\r
-void window( \r
- float *z, /* (o) the windowed data */\r
- const float *x, /* (i) the original data vector */\r
- const float *y, /* (i) the window */\r
- int N /* (i) length of all vectors */\r
-){\r
- int i;\r
- \r
- for (i = 0; i < N; i++) {\r
- z[i] = x[i] * y[i];\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * levinson-durbin solution for lpc coefficients\r
- *---------------------------------------------------------------*/\r
-\r
-void levdurb( \r
- float *a, /* (o) lpc coefficient vector starting \r
- with 1.0 */\r
- float *k, /* (o) reflection coefficients */\r
- float *r, /* (i) autocorrelation vector */\r
- int order /* (i) order of lpc filter */\r
-){\r
- float sum, alpha;\r
- int m, m_h, i;\r
-\r
- a[0] = 1.0;\r
- \r
- if (r[0] < EPS) { /* if r[0] <= 0, set LPC coeff. to zero */\r
- for (i = 0; i < order; i++) {\r
- k[i] = 0;\r
- a[i+1] = 0;\r
- } \r
- } else {\r
- a[1] = k[0] = -r[1]/r[0];\r
- alpha = r[0] + r[1] * k[0];\r
- for (m = 1; m < order; m++){\r
- sum = r[m + 1];\r
- for (i = 0; i < m; i++){\r
- sum += a[i+1] * r[m - i];\r
- }\r
- k[m] = -sum / alpha;\r
- alpha += k[m] * sum;\r
- m_h = (m + 1) >> 1;\r
- for (i = 0; i < m_h; i++){\r
- sum = a[i+1] + k[m] * a[m - i];\r
- a[m - i] += k[m] * a[i+1];\r
- a[i+1] = sum;\r
-\r
-\r
- }\r
- a[m+1] = k[m];\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * interpolation between vectors \r
- *---------------------------------------------------------------*/\r
-\r
-void interpolate( \r
- float *out, /* (o) the interpolated vector */\r
- float *in1, /* (i) the first vector for the \r
- interpolation */\r
- float *in2, /* (i) the second vector for the \r
- interpolation */\r
- float coef, /* (i) interpolation weights */\r
- int length /* (i) length of all vectors */\r
-){\r
- int i;\r
- float invcoef;\r
-\r
- invcoef = (float)1.0 - coef;\r
- for (i = 0; i < length; i++) {\r
- out[i] = coef * in1[i] + invcoef * in2[i];\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * lpc bandwidth expansion \r
- *---------------------------------------------------------------*/\r
-\r
-void bwexpand( \r
- float *out, /* (o) the bandwidth expanded lpc \r
- coefficients */\r
- float *in, /* (i) the lpc coefficients before bandwidth \r
- expansion */\r
- float coef, /* (i) the bandwidth expansion factor */\r
- int length /* (i) the length of lpc coefficient vectors */\r
-){\r
- int i;\r
- float chirp;\r
- \r
- chirp = coef;\r
- \r
- out[0] = in[0];\r
- for (i = 1; i < length; i++) {\r
- out[i] = chirp * in[i];\r
- chirp *= coef;\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * vector quantization \r
-\r
-\r
- *---------------------------------------------------------------*/\r
-\r
-void vq( \r
- float *Xq, /* (o) the quantized vector */\r
- int *index, /* (o) the quantization index */\r
- const float *CB,/* (i) the vector quantization codebook */\r
- float *X, /* (i) the vector to quantize */\r
- int n_cb, /* (i) the number of vectors in the codebook */\r
- int dim /* (i) the dimension of all vectors */\r
-){\r
- int i, j;\r
- int pos, minindex;\r
- float dist, tmp, mindist;\r
-\r
- pos = 0;\r
- mindist = FLOAT_MAX;\r
- minindex = 0;\r
- for (j = 0; j < n_cb; j++) {\r
- dist = X[0] - CB[pos];\r
- dist *= dist;\r
- for (i = 1; i < dim; i++) {\r
- tmp = X[i] - CB[pos + i];\r
- dist += tmp*tmp;\r
- }\r
- \r
- if (dist < mindist) {\r
- mindist = dist;\r
- minindex = j;\r
- }\r
- pos += dim;\r
- }\r
- for (i = 0; i < dim; i++) {\r
- Xq[i] = CB[minindex*dim + i];\r
- }\r
- *index = minindex;\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * split vector quantization \r
- *---------------------------------------------------------------*/\r
-\r
-void SplitVQ( \r
- float *qX, /* (o) the quantized vector */\r
- int *index, /* (o) a vector of indexes for all vector\r
- codebooks in the split */\r
- float *X, /* (i) the vector to quantize */\r
- const float *CB,/* (i) the quantizer codebook */\r
- int nsplit, /* the number of vector splits */\r
- const int *dim, /* the dimension of X and qX */\r
- const int *cbsize /* the number of vectors in the codebook */\r
-){\r
- int cb_pos, X_pos, i;\r
- \r
- cb_pos = 0;\r
-\r
-\r
- X_pos= 0;\r
- for (i = 0; i < nsplit; i++) {\r
- vq(qX + X_pos, index + i, CB + cb_pos, X + X_pos, \r
- cbsize[i], dim[i]);\r
- X_pos += dim[i];\r
- cb_pos += dim[i] * cbsize[i];\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * scalar quantization \r
- *---------------------------------------------------------------*/\r
-\r
-void sort_sq( \r
- float *xq, /* (o) the quantized value */\r
- int *index, /* (o) the quantization index */\r
- float x, /* (i) the value to quantize */\r
- const float *cb,/* (i) the quantization codebook */\r
- int cb_size /* (i) the size of the quantization codebook */\r
-){\r
- int i;\r
- \r
- if (x <= cb[0]) {\r
- *index = 0;\r
- *xq = cb[0];\r
- } else {\r
- i = 0;\r
- while ((x > cb[i]) && i < cb_size - 1) {\r
- i++;\r
- }\r
- \r
- if (x > ((cb[i] + cb[i - 1])/2)) {\r
- *index = i;\r
- *xq = cb[i];\r
- } else {\r
- *index = i - 1;\r
- *xq = cb[i - 1];\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * check for stability of lsf coefficients\r
- *---------------------------------------------------------------*/\r
-\r
-int LSF_check( /* (o) 1 for stable lsf vectors and 0 for\r
- nonstable ones */\r
- float *lsf, /* (i) a table of lsf vectors */\r
- int dim, /* (i) the dimension of each lsf vector */\r
- int NoAn /* (i) the number of lsf vectors in the \r
- table */\r
-){\r
- int k,n,m, Nit=2, change=0,pos;\r
- float tmp;\r
-\r
-\r
- static float eps=(float)0.039; /* 50 Hz */\r
- static float eps2=(float)0.0195;\r
- static float maxlsf=(float)3.14; /* 4000 Hz */\r
- static float minlsf=(float)0.01; /* 0 Hz */\r
- \r
- /* LSF separation check*/\r
-\r
- for (n=0; n<Nit; n++) { /* Run through a couple of times */\r
- for (m=0; m<NoAn; m++) { /* Number of analyses per frame */\r
- for (k=0; k<(dim-1); k++) {\r
- pos=m*dim+k;\r
- \r
- if ((lsf[pos+1]-lsf[pos])<eps) {\r
- \r
- if (lsf[pos+1]<lsf[pos]) {\r
- tmp=lsf[pos+1];\r
- lsf[pos+1]= lsf[pos]+eps2;\r
- lsf[pos]= lsf[pos+1]-eps2;\r
- } else {\r
- lsf[pos]-=eps2;\r
- lsf[pos+1]+=eps2;\r
- }\r
- change=1;\r
- }\r
- \r
- if (lsf[pos]<minlsf) { \r
- lsf[pos]=minlsf;\r
- change=1;\r
- }\r
- \r
- if (lsf[pos]>maxlsf) { \r
- lsf[pos]=maxlsf;\r
- change=1;\r
- } \r
- }\r
- }\r
- }\r
- \r
- return change; \r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- helpfun.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_HELPFUN_H\r
-#define __iLBC_HELPFUN_H\r
-\r
-void autocorr( \r
- float *r, /* (o) autocorrelation vector */\r
- const float *x, /* (i) data vector */\r
- int N, /* (i) length of data vector */\r
- int order /* largest lag for calculated \r
- autocorrelations */\r
-);\r
-\r
-void window( \r
- float *z, /* (o) the windowed data */\r
- const float *x, /* (i) the original data vector */\r
- const float *y, /* (i) the window */\r
- int N /* (i) length of all vectors */\r
-);\r
-\r
-\r
-\r
-void levdurb( \r
- float *a, /* (o) lpc coefficient vector starting \r
- with 1.0 */\r
- float *k, /* (o) reflection coefficients */\r
- float *r, /* (i) autocorrelation vector */\r
- int order /* (i) order of lpc filter */\r
-);\r
-\r
-void interpolate( \r
- float *out, /* (o) the interpolated vector */\r
- float *in1, /* (i) the first vector for the \r
- interpolation */\r
- float *in2, /* (i) the second vector for the \r
- interpolation */\r
- float coef, /* (i) interpolation weights */\r
- int length /* (i) length of all vectors */\r
-);\r
- \r
-void bwexpand( \r
- float *out, /* (o) the bandwidth expanded lpc \r
- coefficients */\r
- float *in, /* (i) the lpc coefficients before bandwidth\r
- expansion */\r
- float coef, /* (i) the bandwidth expansion factor */\r
- int length /* (i) the length of lpc coefficient vectors */\r
-);\r
-\r
-void vq( \r
- float *Xq, /* (o) the quantized vector */\r
- int *index, /* (o) the quantization index */\r
- const float *CB,/* (i) the vector quantization codebook */\r
- float *X, /* (i) the vector to quantize */\r
- int n_cb, /* (i) the number of vectors in the codebook */\r
- int dim /* (i) the dimension of all vectors */\r
-); \r
-\r
-void SplitVQ( \r
- float *qX, /* (o) the quantized vector */\r
- int *index, /* (o) a vector of indexes for all vector\r
- codebooks in the split */\r
- float *X, /* (i) the vector to quantize */\r
- const float *CB,/* (i) the quantizer codebook */\r
- int nsplit, /* the number of vector splits */\r
- const int *dim, /* the dimension of X and qX */\r
- const int *cbsize /* the number of vectors in the codebook */\r
-);\r
-\r
-\r
-void sort_sq( \r
- float *xq, /* (o) the quantized value */\r
- int *index, /* (o) the quantization index */\r
- float x, /* (i) the value to quantize */\r
- const float *cb,/* (i) the quantization codebook */\r
-\r
-\r
- int cb_size /* (i) the size of the quantization codebook */\r
-);\r
-\r
-int LSF_check( /* (o) 1 for stable lsf vectors and 0 for \r
- nonstable ones */\r
- float *lsf, /* (i) a table of lsf vectors */\r
- int dim, /* (i) the dimension of each lsf vector */\r
- int NoAn /* (i) the number of lsf vectors in the \r
- table */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- hpInput.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include "constants.h"\r
-#include "hpInput.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * Input high-pass filter \r
- *---------------------------------------------------------------*/\r
-\r
-void hpInput( \r
- float *In, /* (i) vector to filter */\r
- int len, /* (i) length of vector to filter */\r
- float *Out, /* (o) the resulting filtered vector */\r
- float *mem /* (i/o) the filter state */\r
-){\r
- int i;\r
- float *pi, *po;\r
-\r
- /* all-zero section*/\r
-\r
- pi = &In[0];\r
- po = &Out[0];\r
- for (i=0; i<len; i++) {\r
- *po = hpi_zero_coefsTbl[0] * (*pi);\r
- *po += hpi_zero_coefsTbl[1] * mem[0];\r
- *po += hpi_zero_coefsTbl[2] * mem[1];\r
-\r
- mem[1] = mem[0];\r
- mem[0] = *pi;\r
- po++;\r
-\r
-\r
- pi++;\r
-\r
- }\r
-\r
- /* all-pole section*/\r
-\r
- po = &Out[0];\r
- for (i=0; i<len; i++) {\r
- *po -= hpi_pole_coefsTbl[1] * mem[2];\r
- *po -= hpi_pole_coefsTbl[2] * mem[3];\r
-\r
- mem[3] = mem[2];\r
- mem[2] = *po;\r
- po++;\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- hpInput.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-\r
-\r
-#ifndef __iLBC_HPINPUT_H\r
-#define __iLBC_HPINPUT_H\r
-\r
-void hpInput( \r
- float *In, /* (i) vector to filter */\r
- int len, /* (i) length of vector to filter */\r
- float *Out, /* (o) the resulting filtered vector */\r
- float *mem /* (i/o) the filter state */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- hpOutput.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-\r
-\r
-******************************************************************/\r
-\r
-#include "constants.h"\r
-#include "hpOutput.h"\r
-/*----------------------------------------------------------------*\r
- * Output high-pass filter \r
- *---------------------------------------------------------------*/\r
-\r
-void hpOutput(\r
- float *In, /* (i) vector to filter */\r
- int len,/* (i) length of vector to filter */\r
- float *Out, /* (o) the resulting filtered vector */\r
- float *mem /* (i/o) the filter state */\r
-){\r
- int i;\r
- float *pi, *po;\r
-\r
- /* all-zero section*/\r
-\r
- pi = &In[0];\r
- po = &Out[0];\r
- for (i=0; i<len; i++) {\r
- *po = hpo_zero_coefsTbl[0] * (*pi);\r
- *po += hpo_zero_coefsTbl[1] * mem[0];\r
- *po += hpo_zero_coefsTbl[2] * mem[1];\r
-\r
- mem[1] = mem[0];\r
- mem[0] = *pi;\r
- po++;\r
- pi++;\r
-\r
- }\r
-\r
- /* all-pole section*/\r
-\r
- po = &Out[0];\r
- for (i=0; i<len; i++) {\r
- *po -= hpo_pole_coefsTbl[1] * mem[2];\r
- *po -= hpo_pole_coefsTbl[2] * mem[3];\r
-\r
- mem[3] = mem[2];\r
- mem[2] = *po;\r
- po++;\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- hpOutput.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_HPOUTPUT_H\r
-#define __iLBC_HPOUTPUT_H\r
-\r
-void hpOutput(\r
- float *In, /* (i) vector to filter */\r
- int len,/* (i) length of vector to filter */\r
- float *Out, /* (o) the resulting filtered vector */\r
- float *mem /* (i/o) the filter state */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iCBConstruct.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "iCBConstruct.h"\r
-#include "gainquant.h"\r
-#include "getCBvec.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * Convert the codebook indexes to make the search easier\r
- *---------------------------------------------------------------*/\r
-\r
-\r
-\r
-void index_conv_enc(\r
- int *index /* (i/o) Codebook indexes */\r
-){\r
- int k;\r
-\r
- for (k=1; k<CB_NSTAGES; k++) {\r
- \r
- if ((index[k]>=108)&&(index[k]<172)) {\r
- index[k]-=64;\r
- } else if (index[k]>=236) {\r
- index[k]-=128;\r
- } else {\r
- /* ERROR */\r
- }\r
- }\r
-}\r
-\r
-void index_conv_dec(\r
- int *index /* (i/o) Codebook indexes */\r
-){\r
- int k;\r
-\r
- for (k=1; k<CB_NSTAGES; k++) {\r
- \r
- if ((index[k]>=44)&&(index[k]<108)) {\r
- index[k]+=64;\r
- } else if ((index[k]>=108)&&(index[k]<128)) {\r
- index[k]+=128;\r
- } else {\r
- /* ERROR */\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * Construct decoded vector from codebook and gains.\r
- *---------------------------------------------------------------*/\r
-\r
-void iCBConstruct(\r
- float *decvector, /* (o) Decoded vector */\r
- int *index, /* (i) Codebook indices */\r
- int *gain_index,/* (i) Gain quantization indices */\r
- float *mem, /* (i) Buffer for codevector construction */\r
- int lMem, /* (i) Length of buffer */\r
- int veclen, /* (i) Length of vector */\r
- int nStages /* (i) Number of codebook stages */\r
-){\r
- int j,k;\r
- float gain[CB_NSTAGES];\r
- float cbvec[SUBL];\r
-\r
- /* gain de-quantization */\r
-\r
- gain[0] = gaindequant(gain_index[0], 1.0, 32);\r
-\r
-\r
- if (nStages > 1) {\r
- gain[1] = gaindequant(gain_index[1], \r
- (float)fabs(gain[0]), 16); \r
- }\r
- if (nStages > 2) {\r
- gain[2] = gaindequant(gain_index[2], \r
- (float)fabs(gain[1]), 8);\r
- }\r
-\r
- /* codebook vector construction and construction of \r
- total vector */\r
-\r
- getCBvec(cbvec, mem, index[0], lMem, veclen);\r
- for (j=0;j<veclen;j++){\r
- decvector[j] = gain[0]*cbvec[j];\r
- }\r
- if (nStages > 1) {\r
- for (k=1; k<nStages; k++) {\r
- getCBvec(cbvec, mem, index[k], lMem, veclen);\r
- for (j=0;j<veclen;j++) {\r
- decvector[j] += gain[k]*cbvec[j];\r
- }\r
- }\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
-\r
-\r
- iCBConstruct.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_ICBCONSTRUCT_H\r
-#define __iLBC_ICBCONSTRUCT_H\r
-\r
-void index_conv_enc(\r
- int *index /* (i/o) Codebook indexes */\r
-);\r
-\r
-void index_conv_dec(\r
- int *index /* (i/o) Codebook indexes */\r
-);\r
-\r
-void iCBConstruct(\r
- float *decvector, /* (o) Decoded vector */\r
- int *index, /* (i) Codebook indices */\r
- int *gain_index,/* (i) Gain quantization indices */\r
- float *mem, /* (i) Buffer for codevector construction */\r
- int lMem, /* (i) Length of buffer */\r
- int veclen, /* (i) Length of vector */\r
- int nStages /* (i) Number of codebook stages */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iCBSearch.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-#include <string.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "iCBSearch.h"\r
-#include "gainquant.h"\r
-#include "createCB.h"\r
-#include "filter.h"\r
-#include "constants.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * Search routine for codebook encoding and gain quantization.\r
- *---------------------------------------------------------------*/\r
-\r
-void iCBSearch(\r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i) the encoder state structure */\r
- int *index, /* (o) Codebook indices */\r
- int *gain_index,/* (o) Gain quantization indices */\r
- float *intarget,/* (i) Target vector for encoding */ \r
- float *mem, /* (i) Buffer for codebook construction */\r
- int lMem, /* (i) Length of buffer */\r
- int lTarget, /* (i) Length of vector */\r
- int nStages, /* (i) Number of codebook stages */\r
- float *weightDenum, /* (i) weighting filter coefficients */\r
- float *weightState, /* (i) weighting filter state */\r
- int block /* (i) the sub-block number */\r
-){\r
- int i, j, icount, stage, best_index, range, counter;\r
- float max_measure, gain, measure, crossDot, ftmp;\r
- float gains[CB_NSTAGES];\r
- float target[SUBL];\r
- int base_index, sInd, eInd, base_size;\r
- int sIndAug=0, eIndAug=0;\r
- float buf[CB_MEML+SUBL+2*LPC_FILTERORDER];\r
-\r
-\r
- float invenergy[CB_EXPAND*128], energy[CB_EXPAND*128];\r
- float *pp, *ppi=0, *ppo=0, *ppe=0;\r
- float cbvectors[CB_MEML];\r
- float tene, cene, cvec[SUBL];\r
- float aug_vec[SUBL];\r
-\r
- memset(cvec,0,SUBL*sizeof(float)); \r
-\r
- /* Determine size of codebook sections */\r
-\r
- base_size=lMem-lTarget+1;\r
- \r
- if (lTarget==SUBL) {\r
- base_size=lMem-lTarget+1+lTarget/2;\r
- }\r
-\r
- /* setup buffer for weighting */\r
-\r
- memcpy(buf,weightState,sizeof(float)*LPC_FILTERORDER);\r
- memcpy(buf+LPC_FILTERORDER,mem,lMem*sizeof(float));\r
- memcpy(buf+LPC_FILTERORDER+lMem,intarget,lTarget*sizeof(float));\r
-\r
- /* weighting */\r
-\r
- AllPoleFilter(buf+LPC_FILTERORDER, weightDenum, \r
- lMem+lTarget, LPC_FILTERORDER);\r
- \r
- /* Construct the codebook and target needed */\r
-\r
- memcpy(target, buf+LPC_FILTERORDER+lMem, lTarget*sizeof(float));\r
-\r
- tene=0.0;\r
- for (i=0; i<lTarget; i++) {\r
- tene+=target[i]*target[i];\r
- }\r
-\r
- /* Prepare search over one more codebook section. This section \r
- is created by filtering the original buffer with a filter. */\r
- \r
- filteredCBvecs(cbvectors, buf+LPC_FILTERORDER, lMem);\r
-\r
- /* The Main Loop over stages */\r
-\r
- for (stage=0; stage<nStages; stage++) {\r
-\r
- range = search_rangeTbl[block][stage];\r
-\r
- /* initialize search measure */\r
-\r
- max_measure = (float)-10000000.0;\r
- gain = (float)0.0;\r
- best_index = 0;\r
-\r
- /* Compute cross dot product between the target \r
-\r
-\r
- and the CB memory */\r
-\r
- crossDot=0.0;\r
- pp=buf+LPC_FILTERORDER+lMem-lTarget;\r
- for (j=0; j<lTarget; j++) {\r
- crossDot += target[j]*(*pp++);\r
- } \r
- \r
- if (stage==0) {\r
-\r
- /* Calculate energy in the first block of \r
- 'lTarget' sampels. */\r
- ppe = energy;\r
- ppi = buf+LPC_FILTERORDER+lMem-lTarget-1;\r
- ppo = buf+LPC_FILTERORDER+lMem-1;\r
-\r
- *ppe=0.0;\r
- pp=buf+LPC_FILTERORDER+lMem-lTarget;\r
- for (j=0; j<lTarget; j++) {\r
- *ppe+=(*pp)*(*pp);\r
- pp++;\r
- }\r
- \r
- if (*ppe>0.0) {\r
- invenergy[0] = (float) 1.0 / (*ppe + EPS);\r
- } else {\r
- invenergy[0] = (float) 0.0; \r
- }\r
- ppe++;\r
-\r
- measure=(float)-10000000.0; \r
- \r
- if (crossDot > 0.0) {\r
- measure = crossDot*crossDot*invenergy[0];\r
- }\r
- }\r
- else {\r
- measure = crossDot*crossDot*invenergy[0];\r
- }\r
-\r
- /* check if measure is better */\r
- ftmp = crossDot*invenergy[0];\r
- \r
- if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {\r
- best_index = 0;\r
- max_measure = measure;\r
- gain = ftmp;\r
- }\r
-\r
- /* loop over the main first codebook section, \r
- full search */\r
-\r
- for (icount=1; icount<range; icount++) {\r
-\r
- /* calculate measure */\r
-\r
-\r
-\r
- crossDot=0.0;\r
- pp = buf+LPC_FILTERORDER+lMem-lTarget-icount;\r
-\r
- for (j=0; j<lTarget; j++) {\r
- crossDot += target[j]*(*pp++);\r
- }\r
- \r
- if (stage==0) {\r
- *ppe++ = energy[icount-1] + (*ppi)*(*ppi) - \r
- (*ppo)*(*ppo);\r
- ppo--;\r
- ppi--;\r
- \r
- if (energy[icount]>0.0) {\r
- invenergy[icount] = \r
- (float)1.0/(energy[icount]+EPS);\r
- } else {\r
- invenergy[icount] = (float) 0.0;\r
- }\r
-\r
- measure=(float)-10000000.0;\r
- \r
- if (crossDot > 0.0) {\r
- measure = crossDot*crossDot*invenergy[icount];\r
- }\r
- }\r
- else {\r
- measure = crossDot*crossDot*invenergy[icount];\r
- }\r
-\r
- /* check if measure is better */\r
- ftmp = crossDot*invenergy[icount];\r
-\r
- if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {\r
- best_index = icount;\r
- max_measure = measure;\r
- gain = ftmp;\r
- }\r
- }\r
-\r
- /* Loop over augmented part in the first codebook \r
- * section, full search.\r
- * The vectors are interpolated.\r
- */\r
- \r
- if (lTarget==SUBL) { \r
- \r
- /* Search for best possible cb vector and \r
- compute the CB-vectors' energy. */\r
- searchAugmentedCB(20, 39, stage, base_size-lTarget/2, \r
- target, buf+LPC_FILTERORDER+lMem,\r
- &max_measure, &best_index, &gain, energy, \r
- invenergy);\r
-\r
-\r
- }\r
-\r
- /* set search range for following codebook sections */\r
-\r
- base_index=best_index;\r
-\r
- /* unrestricted search */\r
-\r
- if (CB_RESRANGE == -1) {\r
- sInd=0;\r
- eInd=range-1;\r
- sIndAug=20;\r
- eIndAug=39;\r
- }\r
-\r
- /* restriced search around best index from first \r
- codebook section */\r
-\r
- else {\r
- /* Initialize search indices */\r
- sIndAug=0;\r
- eIndAug=0;\r
- sInd=base_index-CB_RESRANGE/2;\r
- eInd=sInd+CB_RESRANGE;\r
- \r
- if (lTarget==SUBL) {\r
-\r
- if (sInd<0) {\r
- \r
- sIndAug = 40 + sInd;\r
- eIndAug = 39;\r
- sInd=0;\r
-\r
- } else if ( base_index < (base_size-20) ) {\r
- \r
- if (eInd > range) {\r
- sInd -= (eInd-range);\r
- eInd = range;\r
- }\r
- } else { /* base_index >= (base_size-20) */\r
- \r
- if (sInd < (base_size-20)) {\r
- sIndAug = 20;\r
- sInd = 0;\r
- eInd = 0;\r
- eIndAug = 19 + CB_RESRANGE;\r
- \r
- if(eIndAug > 39) {\r
- eInd = eIndAug-39;\r
- eIndAug = 39;\r
- }\r
- } else {\r
- sIndAug = 20 + sInd - (base_size-20);\r
- eIndAug = 39;\r
-\r
-\r
- sInd = 0;\r
- eInd = CB_RESRANGE - (eIndAug-sIndAug+1);\r
- }\r
- }\r
-\r
- } else { /* lTarget = 22 or 23 */\r
- \r
- if (sInd < 0) {\r
- eInd -= sInd;\r
- sInd = 0;\r
- }\r
- \r
- if(eInd > range) {\r
- sInd -= (eInd - range);\r
- eInd = range;\r
- }\r
- }\r
- }\r
-\r
- /* search of higher codebook section */\r
-\r
- /* index search range */\r
- counter = sInd;\r
- sInd += base_size;\r
- eInd += base_size;\r
- \r
- \r
- if (stage==0) {\r
- ppe = energy+base_size;\r
- *ppe=0.0;\r
-\r
- pp=cbvectors+lMem-lTarget;\r
- for (j=0; j<lTarget; j++) {\r
- *ppe+=(*pp)*(*pp);\r
- pp++;\r
- }\r
-\r
- ppi = cbvectors + lMem - 1 - lTarget;\r
- ppo = cbvectors + lMem - 1;\r
- \r
- for (j=0; j<(range-1); j++) {\r
- *(ppe+1) = *ppe + (*ppi)*(*ppi) - (*ppo)*(*ppo);\r
- ppo--;\r
- ppi--;\r
- ppe++;\r
- }\r
- }\r
-\r
- /* loop over search range */\r
-\r
- for (icount=sInd; icount<eInd; icount++) {\r
-\r
- /* calculate measure */\r
-\r
- crossDot=0.0;\r
-\r
-\r
- pp=cbvectors + lMem - (counter++) - lTarget;\r
-\r
- for (j=0;j<lTarget;j++) {\r
- crossDot += target[j]*(*pp++);\r
- }\r
- \r
- if (energy[icount]>0.0) {\r
- invenergy[icount] =(float)1.0/(energy[icount]+EPS);\r
- } else {\r
- invenergy[icount] =(float)0.0;\r
- }\r
- \r
- if (stage==0) {\r
-\r
- measure=(float)-10000000.0;\r
- \r
- if (crossDot > 0.0) {\r
- measure = crossDot*crossDot*\r
- invenergy[icount];\r
- }\r
- }\r
- else {\r
- measure = crossDot*crossDot*invenergy[icount];\r
- }\r
-\r
- /* check if measure is better */\r
- ftmp = crossDot*invenergy[icount];\r
-\r
- if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {\r
- best_index = icount;\r
- max_measure = measure;\r
- gain = ftmp;\r
- }\r
- }\r
-\r
- /* Search the augmented CB inside the limited range. */\r
- \r
- if ((lTarget==SUBL)&&(sIndAug!=0)) {\r
- searchAugmentedCB(sIndAug, eIndAug, stage, \r
- 2*base_size-20, target, cbvectors+lMem,\r
- &max_measure, &best_index, &gain, energy, \r
- invenergy);\r
- }\r
-\r
- /* record best index */\r
-\r
- index[stage] = best_index;\r
-\r
- /* gain quantization */\r
-\r
- if (stage==0){\r
- \r
- if (gain<0.0){\r
- gain = 0.0;\r
-\r
-\r
- }\r
- \r
- if (gain>CB_MAXGAIN) {\r
- gain = (float)CB_MAXGAIN;\r
- }\r
- gain = gainquant(gain, 1.0, 32, &gain_index[stage]);\r
- }\r
- else {\r
- if (stage==1) {\r
- gain = gainquant(gain, (float)fabs(gains[stage-1]),\r
- 16, &gain_index[stage]);\r
- } else {\r
- gain = gainquant(gain, (float)fabs(gains[stage-1]),\r
- 8, &gain_index[stage]);\r
- }\r
- }\r
-\r
- /* Extract the best (according to measure) \r
- codebook vector */\r
- \r
- if (lTarget==(STATE_LEN-iLBCenc_inst->state_short_len)) {\r
- \r
- if (index[stage]<base_size) {\r
- pp=buf+LPC_FILTERORDER+lMem-lTarget-index[stage];\r
- } else {\r
- pp=cbvectors+lMem-lTarget-\r
- index[stage]+base_size;\r
- }\r
- } else {\r
- \r
- if (index[stage]<base_size) {\r
- if (index[stage]<(base_size-20)) {\r
- pp=buf+LPC_FILTERORDER+lMem-\r
- lTarget-index[stage];\r
- } else {\r
- createAugmentedVec(index[stage]-base_size+40,\r
- buf+LPC_FILTERORDER+lMem,aug_vec);\r
- pp=aug_vec;\r
- }\r
- } else {\r
- int filterno, position;\r
-\r
- filterno=index[stage]/base_size;\r
- position=index[stage]-filterno*base_size;\r
-\r
- \r
- if (position<(base_size-20)) {\r
- pp=cbvectors+filterno*lMem-lTarget-\r
- index[stage]+filterno*base_size;\r
- } else {\r
- createAugmentedVec(\r
- index[stage]-(filterno+1)*base_size+40,\r
- cbvectors+filterno*lMem,aug_vec);\r
- pp=aug_vec;\r
-\r
-\r
- }\r
- }\r
- }\r
-\r
- /* Subtract the best codebook vector, according \r
- to measure, from the target vector */\r
-\r
- for (j=0;j<lTarget;j++) {\r
- cvec[j] += gain*(*pp);\r
- target[j] -= gain*(*pp++);\r
- }\r
-\r
- /* record quantized gain */\r
-\r
- gains[stage]=gain;\r
-\r
- }/* end of Main Loop. for (stage=0;... */\r
-\r
- /* Gain adjustment for energy matching */\r
- cene=0.0;\r
- for (i=0; i<lTarget; i++) {\r
- cene+=cvec[i]*cvec[i];\r
- }\r
- j=gain_index[0];\r
-\r
- for (i=gain_index[0]; i<32; i++) {\r
- ftmp=cene*gain_sq5Tbl[i]*gain_sq5Tbl[i];\r
- \r
- if ((ftmp<(tene*gains[0]*gains[0])) && \r
- (gain_sq5Tbl[j]<(2.0*gains[0]))) {\r
- j=i;\r
- }\r
- }\r
- gain_index[0]=j;\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iCBSearch.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_ICBSEARCH_H\r
-#define __iLBC_ICBSEARCH_H\r
-\r
-void iCBSearch(\r
- iLBC_Enc_Inst_t *iLBCenc_inst, \r
- /* (i) the encoder state structure */\r
- int *index, /* (o) Codebook indices */\r
- int *gain_index,/* (o) Gain quantization indices */\r
- float *intarget,/* (i) Target vector for encoding */ \r
- float *mem, /* (i) Buffer for codebook construction */\r
- int lMem, /* (i) Length of buffer */\r
- int lTarget, /* (i) Length of vector */\r
- int nStages, /* (i) Number of codebook stages */\r
- float *weightDenum, /* (i) weighting filter coefficients */\r
-\r
-\r
- float *weightState, /* (i) weighting filter state */\r
- int block /* (i) the sub-block number */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iLBC_decode.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-#include <stdlib.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "iLBC_decode.h"\r
-#include "StateConstructW.h"\r
-#include "LPCdecode.h"\r
-#include "iCBConstruct.h"\r
-#include "doCPLC.h"\r
-#include "helpfun.h"\r
-#include "constants.h"\r
-#include "packing.h"\r
-#include "string.h"\r
-#include "enhancer.h"\r
-#include "hpOutput.h"\r
-#include "syntFilter.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * Initiation of decoder instance.\r
- *---------------------------------------------------------------*/\r
-\r
-short initDecode( /* (o) Number of decoded \r
- samples */\r
- iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */\r
- int mode, /* (i) frame size mode */\r
- int use_enhancer /* (i) 1 to use enhancer\r
- 0 to run without \r
- enhancer */\r
-){\r
- int i;\r
-\r
- iLBCdec_inst->mode = mode;\r
-\r
- if (mode==30) {\r
- iLBCdec_inst->blockl = BLOCKL_30MS;\r
- iLBCdec_inst->nsub = NSUB_30MS;\r
- iLBCdec_inst->nasub = NASUB_30MS;\r
- iLBCdec_inst->lpc_n = LPC_N_30MS;\r
-\r
-\r
- iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS;\r
- iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS;\r
- iLBCdec_inst->state_short_len=STATE_SHORT_LEN_30MS;\r
- /* ULP init */\r
- iLBCdec_inst->ULP_inst=&ULP_30msTbl;\r
- }\r
- else if (mode==20) {\r
- iLBCdec_inst->blockl = BLOCKL_20MS;\r
- iLBCdec_inst->nsub = NSUB_20MS;\r
- iLBCdec_inst->nasub = NASUB_20MS;\r
- iLBCdec_inst->lpc_n = LPC_N_20MS;\r
- iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS;\r
- iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS;\r
- iLBCdec_inst->state_short_len=STATE_SHORT_LEN_20MS;\r
- /* ULP init */\r
- iLBCdec_inst->ULP_inst=&ULP_20msTbl;\r
- }\r
- else {\r
- exit(2);\r
- }\r
-\r
- memset(iLBCdec_inst->syntMem, 0, \r
- LPC_FILTERORDER*sizeof(float));\r
- memcpy((*iLBCdec_inst).lsfdeqold, lsfmeanTbl, \r
- LPC_FILTERORDER*sizeof(float));\r
-\r
- memset(iLBCdec_inst->old_syntdenum, 0, \r
- ((LPC_FILTERORDER + 1)*NSUB_MAX)*sizeof(float));\r
- for (i=0; i<NSUB_MAX; i++)\r
- iLBCdec_inst->old_syntdenum[i*(LPC_FILTERORDER+1)]=1.0;\r
-\r
- iLBCdec_inst->last_lag = 20;\r
-\r
- iLBCdec_inst->prevLag = 120;\r
- iLBCdec_inst->per = 0.0;\r
- iLBCdec_inst->consPLICount = 0;\r
- iLBCdec_inst->prevPLI = 0;\r
- iLBCdec_inst->prevLpc[0] = 1.0;\r
- memset(iLBCdec_inst->prevLpc+1,0,\r
- LPC_FILTERORDER*sizeof(float));\r
- memset(iLBCdec_inst->prevResidual, 0, BLOCKL_MAX*sizeof(float));\r
- iLBCdec_inst->seed=777;\r
-\r
- memset(iLBCdec_inst->hpomem, 0, 4*sizeof(float));\r
-\r
- iLBCdec_inst->use_enhancer = use_enhancer;\r
- memset(iLBCdec_inst->enh_buf, 0, ENH_BUFL*sizeof(float));\r
- for (i=0;i<ENH_NBLOCKS_TOT;i++) \r
- iLBCdec_inst->enh_period[i]=(float)40.0;\r
-\r
- iLBCdec_inst->prev_enh_pl = 0;\r
-\r
- return (iLBCdec_inst->blockl);\r
-}\r
-\r
-\r
-\r
-/*----------------------------------------------------------------*\r
- * frame residual decoder function (subrutine to iLBC_decode) \r
- *---------------------------------------------------------------*/\r
-\r
-static void Decode(\r
- iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state \r
- structure */\r
- float *decresidual, /* (o) decoded residual frame */\r
- int start, /* (i) location of start \r
- state */\r
- int idxForMax, /* (i) codebook index for the \r
- maximum value */\r
- int *idxVec, /* (i) codebook indexes for the \r
- samples in the start \r
- state */\r
- float *syntdenum, /* (i) the decoded synthesis\r
- filter coefficients */\r
- int *cb_index, /* (i) the indexes for the \r
- adaptive codebook */\r
- int *gain_index, /* (i) the indexes for the \r
- corresponding gains */\r
- int *extra_cb_index, /* (i) the indexes for the \r
- adaptive codebook part \r
- of start state */\r
- int *extra_gain_index, /* (i) the indexes for the \r
- corresponding gains */\r
- int state_first /* (i) 1 if non adaptive part \r
- of start state comes \r
- first 0 if that part \r
- comes last */\r
-){\r
- float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML];\r
- int k, meml_gotten, Nfor, Nback, i;\r
- int diff, start_pos;\r
- int subcount, subframe;\r
-\r
- diff = STATE_LEN - iLBCdec_inst->state_short_len;\r
- \r
- if (state_first == 1) {\r
- start_pos = (start-1)*SUBL;\r
- } else {\r
- start_pos = (start-1)*SUBL + diff;\r
- }\r
-\r
- /* decode scalar part of start state */\r
-\r
- StateConstructW(idxForMax, idxVec, \r
- &syntdenum[(start-1)*(LPC_FILTERORDER+1)], \r
- &decresidual[start_pos], iLBCdec_inst->state_short_len);\r
-\r
- \r
- if (state_first) { /* put adaptive part in the end */\r
- \r
-\r
-\r
- /* setup memory */\r
-\r
- memset(mem, 0, \r
- (CB_MEML-iLBCdec_inst->state_short_len)*sizeof(float));\r
- memcpy(mem+CB_MEML-iLBCdec_inst->state_short_len, \r
- decresidual+start_pos, \r
- iLBCdec_inst->state_short_len*sizeof(float));\r
- \r
- /* construct decoded vector */\r
-\r
- iCBConstruct(\r
- &decresidual[start_pos+iLBCdec_inst->state_short_len],\r
- extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl,\r
- stMemLTbl, diff, CB_NSTAGES);\r
- \r
- } \r
- else {/* put adaptive part in the beginning */\r
- \r
- /* create reversed vectors for prediction */\r
-\r
- for (k=0; k<diff; k++) {\r
- reverseDecresidual[k] = \r
- decresidual[(start+1)*SUBL-1-\r
- (k+iLBCdec_inst->state_short_len)];\r
- }\r
- \r
- /* setup memory */\r
-\r
- meml_gotten = iLBCdec_inst->state_short_len;\r
- for (k=0; k<meml_gotten; k++){ \r
- mem[CB_MEML-1-k] = decresidual[start_pos + k];\r
- } \r
- memset(mem, 0, (CB_MEML-k)*sizeof(float));\r
- \r
- /* construct decoded vector */\r
-\r
- iCBConstruct(reverseDecresidual, extra_cb_index, \r
- extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl,\r
- diff, CB_NSTAGES);\r
- \r
- /* get decoded residual from reversed vector */\r
-\r
- for (k=0; k<diff; k++) {\r
- decresidual[start_pos-1-k] = reverseDecresidual[k];\r
- }\r
- }\r
-\r
- /* counter for predicted sub-frames */\r
-\r
- subcount=0;\r
-\r
- /* forward prediction of sub-frames */\r
-\r
- Nfor = iLBCdec_inst->nsub-start-1;\r
-\r
-\r
- \r
- if ( Nfor > 0 ){\r
- \r
- /* setup memory */\r
-\r
- memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float));\r
- memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL,\r
- STATE_LEN*sizeof(float));\r
-\r
- /* loop over sub-frames to encode */\r
-\r
- for (subframe=0; subframe<Nfor; subframe++) {\r
- \r
- /* construct decoded vector */\r
-\r
- iCBConstruct(&decresidual[(start+1+subframe)*SUBL], \r
- cb_index+subcount*CB_NSTAGES, \r
- gain_index+subcount*CB_NSTAGES, \r
- mem+CB_MEML-memLfTbl[subcount], \r
- memLfTbl[subcount], SUBL, CB_NSTAGES);\r
-\r
- /* update memory */\r
-\r
- memmove(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));\r
- memcpy(mem+CB_MEML-SUBL, \r
- &decresidual[(start+1+subframe)*SUBL],\r
- SUBL*sizeof(float));\r
-\r
- subcount++;\r
-\r
- }\r
-\r
- }\r
- \r
- /* backward prediction of sub-frames */\r
-\r
- Nback = start-1;\r
-\r
- if ( Nback > 0 ) {\r
-\r
- /* setup memory */\r
-\r
- meml_gotten = SUBL*(iLBCdec_inst->nsub+1-start);\r
- \r
- if ( meml_gotten > CB_MEML ) { \r
- meml_gotten=CB_MEML;\r
- }\r
- for (k=0; k<meml_gotten; k++) { \r
- mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k];\r
- }\r
- memset(mem, 0, (CB_MEML-k)*sizeof(float));\r
-\r
- /* loop over subframes to decode */\r
-\r
-\r
-\r
- for (subframe=0; subframe<Nback; subframe++) {\r
- \r
- /* construct decoded vector */\r
-\r
- iCBConstruct(&reverseDecresidual[subframe*SUBL], \r
- cb_index+subcount*CB_NSTAGES, \r
- gain_index+subcount*CB_NSTAGES, \r
- mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], \r
- SUBL, CB_NSTAGES);\r
-\r
- /* update memory */\r
-\r
- memmove(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));\r
- memcpy(mem+CB_MEML-SUBL, \r
- &reverseDecresidual[subframe*SUBL],\r
- SUBL*sizeof(float));\r
-\r
- subcount++;\r
- }\r
-\r
- /* get decoded residual from reversed vector */\r
-\r
- for (i=0; i<SUBL*Nback; i++)\r
- decresidual[SUBL*Nback - i - 1] = \r
- reverseDecresidual[i];\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * main decoder function \r
- *---------------------------------------------------------------*/\r
-\r
-void iLBC_decode( \r
- float *decblock, /* (o) decoded signal block */\r
- unsigned char *bytes, /* (i) encoded signal bits */\r
- iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state \r
- structure */\r
- int mode /* (i) 0: bad packet, PLC, \r
- 1: normal */\r
-){\r
- float data[BLOCKL_MAX];\r
- float lsfdeq[LPC_FILTERORDER*LPC_N_MAX];\r
- float PLCresidual[BLOCKL_MAX], PLClpc[LPC_FILTERORDER + 1];\r
- float zeros[BLOCKL_MAX], one[LPC_FILTERORDER + 1];\r
- int k, i, start, idxForMax, pos, lastpart, ulp;\r
- int lag, ilag;\r
- float cc, maxcc;\r
- int idxVec[STATE_LEN];\r
- int check;\r
- int gain_index[NASUB_MAX*CB_NSTAGES], \r
- extra_gain_index[CB_NSTAGES];\r
- int cb_index[CB_NSTAGES*NASUB_MAX], extra_cb_index[CB_NSTAGES];\r
- int lsf_i[LSF_NSPLIT*LPC_N_MAX];\r
- int state_first;\r
-\r
-\r
- int last_bit;\r
- unsigned char *pbytes;\r
- float weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];\r
- int order_plus_one;\r
- float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; \r
- float decresidual[BLOCKL_MAX];\r
- \r
- if (mode>0) { /* the data are good */\r
-\r
- /* decode data */\r
- \r
- pbytes=bytes;\r
- pos=0;\r
-\r
- /* Set everything to zero before decoding */\r
-\r
- for (k=0; k<LSF_NSPLIT*LPC_N_MAX; k++) {\r
- lsf_i[k]=0;\r
- }\r
- start=0;\r
- state_first=0;\r
- idxForMax=0;\r
- for (k=0; k<iLBCdec_inst->state_short_len; k++) {\r
- idxVec[k]=0;\r
- }\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- extra_cb_index[k]=0;\r
- }\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- extra_gain_index[k]=0;\r
- }\r
- for (i=0; i<iLBCdec_inst->nasub; i++) {\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- cb_index[i*CB_NSTAGES+k]=0;\r
- }\r
- }\r
- for (i=0; i<iLBCdec_inst->nasub; i++) {\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- gain_index[i*CB_NSTAGES+k]=0;\r
- }\r
- }\r
-\r
- /* loop over ULP classes */\r
-\r
- for (ulp=0; ulp<3; ulp++) {\r
- \r
- /* LSF */\r
- for (k=0; k<LSF_NSPLIT*iLBCdec_inst->lpc_n; k++){\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->lsf_bits[k][ulp], &pos);\r
- packcombine(&lsf_i[k], lastpart,\r
- iLBCdec_inst->ULP_inst->lsf_bits[k][ulp]);\r
- }\r
-\r
-\r
-\r
- /* Start block info */\r
-\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->start_bits[ulp], &pos);\r
- packcombine(&start, lastpart, \r
- iLBCdec_inst->ULP_inst->start_bits[ulp]);\r
-\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->startfirst_bits[ulp], &pos);\r
- packcombine(&state_first, lastpart,\r
- iLBCdec_inst->ULP_inst->startfirst_bits[ulp]);\r
-\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->scale_bits[ulp], &pos);\r
- packcombine(&idxForMax, lastpart, \r
- iLBCdec_inst->ULP_inst->scale_bits[ulp]);\r
-\r
- for (k=0; k<iLBCdec_inst->state_short_len; k++) {\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->state_bits[ulp], &pos);\r
- packcombine(idxVec+k, lastpart,\r
- iLBCdec_inst->ULP_inst->state_bits[ulp]);\r
- }\r
-\r
- /* 23/22 (20ms/30ms) sample block */\r
-\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp], \r
- &pos);\r
- packcombine(extra_cb_index+k, lastpart, \r
- iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp]);\r
- }\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp], \r
- &pos);\r
- packcombine(extra_gain_index+k, lastpart,\r
- iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp]);\r
- }\r
- \r
- /* The two/four (20ms/30ms) 40 sample sub-blocks */\r
-\r
- for (i=0; i<iLBCdec_inst->nasub; i++) {\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- unpack( &pbytes, &lastpart, \r
- iLBCdec_inst->ULP_inst->cb_index[i][k][ulp], \r
- &pos);\r
- packcombine(cb_index+i*CB_NSTAGES+k, lastpart, \r
- iLBCdec_inst->ULP_inst->cb_index[i][k][ulp]);\r
- }\r
- }\r
- \r
- for (i=0; i<iLBCdec_inst->nasub; i++) {\r
-\r
-\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- unpack( &pbytes, &lastpart, \r
-\r
- iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp], \r
- &pos);\r
- packcombine(gain_index+i*CB_NSTAGES+k, lastpart,\r
- iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp]);\r
- }\r
- }\r
- }\r
- /* Extract last bit. If it is 1 this indicates an \r
- empty/lost frame */\r
- unpack( &pbytes, &last_bit, 1, &pos);\r
-\r
- /* Check for bit errors or empty/lost frames */\r
- if (start<1)\r
- mode = 0;\r
- if (iLBCdec_inst->mode==20 && start>3)\r
- mode = 0;\r
- if (iLBCdec_inst->mode==30 && start>5)\r
- mode = 0;\r
- if (last_bit==1)\r
- mode = 0;\r
-\r
- if (mode==1) { /* No bit errors was detected, \r
- continue decoding */\r
- \r
- /* adjust index */\r
- index_conv_dec(cb_index);\r
-\r
- /* decode the lsf */\r
-\r
- SimplelsfDEQ(lsfdeq, lsf_i, iLBCdec_inst->lpc_n);\r
- check=LSF_check(lsfdeq, LPC_FILTERORDER, \r
- iLBCdec_inst->lpc_n);\r
- DecoderInterpolateLSF(syntdenum, weightdenum, \r
- lsfdeq, LPC_FILTERORDER, iLBCdec_inst);\r
- \r
- Decode(iLBCdec_inst, decresidual, start, idxForMax, \r
- idxVec, syntdenum, cb_index, gain_index, \r
- extra_cb_index, extra_gain_index, \r
- state_first);\r
-\r
- /* preparing the plc for a future loss! */\r
-\r
- doThePLC(PLCresidual, PLClpc, 0, decresidual, \r
- syntdenum + \r
- (LPC_FILTERORDER + 1)*(iLBCdec_inst->nsub - 1),\r
- (*iLBCdec_inst).last_lag, iLBCdec_inst);\r
-\r
- \r
- memcpy(decresidual, PLCresidual, \r
- iLBCdec_inst->blockl*sizeof(float));\r
- }\r
-\r
-\r
- \r
- }\r
- \r
- if (mode == 0) {\r
- /* the data is bad (either a PLC call\r
- * was made or a severe bit error was detected)\r
- */\r
- \r
- /* packet loss conceal */\r
-\r
- memset(zeros, 0, BLOCKL_MAX*sizeof(float));\r
- \r
- one[0] = 1;\r
- memset(one+1, 0, LPC_FILTERORDER*sizeof(float));\r
- \r
- start=0;\r
- \r
- doThePLC(PLCresidual, PLClpc, 1, zeros, one,\r
- (*iLBCdec_inst).last_lag, iLBCdec_inst);\r
- memcpy(decresidual, PLCresidual, \r
- iLBCdec_inst->blockl*sizeof(float));\r
- \r
- order_plus_one = LPC_FILTERORDER + 1;\r
- for (i = 0; i < iLBCdec_inst->nsub; i++) {\r
- memcpy(syntdenum+(i*order_plus_one), PLClpc, \r
- order_plus_one*sizeof(float));\r
- }\r
- }\r
-\r
- if (iLBCdec_inst->use_enhancer == 1) {\r
-\r
- /* post filtering */\r
- \r
- iLBCdec_inst->last_lag = \r
- enhancerInterface(data, decresidual, iLBCdec_inst);\r
-\r
- /* synthesis filtering */\r
- \r
- if (iLBCdec_inst->mode==20) {\r
- /* Enhancer has 40 samples delay */\r
- i=0;\r
- syntFilter(data + i*SUBL, \r
- iLBCdec_inst->old_syntdenum + \r
- (i+iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1), \r
- SUBL, iLBCdec_inst->syntMem);\r
- for (i=1; i < iLBCdec_inst->nsub; i++) {\r
- syntFilter(data + i*SUBL, \r
- syntdenum + (i-1)*(LPC_FILTERORDER+1), \r
- SUBL, iLBCdec_inst->syntMem);\r
- }\r
- } else if (iLBCdec_inst->mode==30) {\r
- /* Enhancer has 80 samples delay */\r
- for (i=0; i < 2; i++) {\r
- syntFilter(data + i*SUBL, \r
-\r
-\r
- iLBCdec_inst->old_syntdenum + \r
- (i+iLBCdec_inst->nsub-2)*(LPC_FILTERORDER+1),\r
- SUBL, iLBCdec_inst->syntMem);\r
- }\r
- for (i=2; i < iLBCdec_inst->nsub; i++) {\r
- syntFilter(data + i*SUBL, \r
- syntdenum + (i-2)*(LPC_FILTERORDER+1), SUBL,\r
- iLBCdec_inst->syntMem);\r
- }\r
- }\r
-\r
- } else {\r
-\r
- /* Find last lag */\r
- lag = 20;\r
- maxcc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL], \r
- &decresidual[BLOCKL_MAX-ENH_BLOCKL-lag], ENH_BLOCKL);\r
- \r
- for (ilag=21; ilag<120; ilag++) {\r
- cc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL], \r
- &decresidual[BLOCKL_MAX-ENH_BLOCKL-ilag], \r
- ENH_BLOCKL);\r
- \r
- if (cc > maxcc) {\r
- maxcc = cc;\r
- lag = ilag;\r
- }\r
- }\r
- iLBCdec_inst->last_lag = lag;\r
-\r
- /* copy data and run synthesis filter */\r
-\r
- memcpy(data, decresidual, \r
- iLBCdec_inst->blockl*sizeof(float));\r
- for (i=0; i < iLBCdec_inst->nsub; i++) {\r
- syntFilter(data + i*SUBL, \r
- syntdenum + i*(LPC_FILTERORDER+1), SUBL, \r
- iLBCdec_inst->syntMem);\r
- }\r
- }\r
-\r
- /* high pass filtering on output if desired, otherwise \r
- copy to out */\r
-\r
- hpOutput(data, iLBCdec_inst->blockl, \r
- decblock,iLBCdec_inst->hpomem);\r
-\r
- /* memcpy(decblock,data,iLBCdec_inst->blockl*sizeof(float));*/\r
-\r
- memcpy(iLBCdec_inst->old_syntdenum, syntdenum, \r
-\r
- iLBCdec_inst->nsub*(LPC_FILTERORDER+1)*sizeof(float));\r
-\r
- iLBCdec_inst->prev_enh_pl=0;\r
-\r
-\r
-\r
- if (mode==0) { /* PLC was used */\r
- iLBCdec_inst->prev_enh_pl=1;\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iLBC_decode.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_ILBCDECODE_H\r
-#define __iLBC_ILBCDECODE_H\r
-\r
-#include "iLBC_define.h"\r
-\r
-short initDecode( /* (o) Number of decoded \r
- samples */\r
- iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */\r
- int mode, /* (i) frame size mode */\r
- int use_enhancer /* (i) 1 to use enhancer\r
- 0 to run without \r
- enhancer */\r
-);\r
-\r
-void iLBC_decode( \r
- float *decblock, /* (o) decoded signal block */\r
- unsigned char *bytes, /* (i) encoded signal bits */\r
- iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state \r
- structure */\r
- int mode /* (i) 0: bad packet, PLC, \r
- 1: normal */\r
-);\r
-\r
-\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iLBC_define.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-#include <string.h>\r
-\r
-#ifndef __iLBC_ILBCDEFINE_H\r
-#define __iLBC_ILBCDEFINE_H\r
-\r
-/* general codec settings */\r
-\r
-#define FS (float)8000.0\r
-#define BLOCKL_20MS 160\r
-#define BLOCKL_30MS 240\r
-#define BLOCKL_MAX 240\r
-#define NSUB_20MS 4\r
-#define NSUB_30MS 6\r
-#define NSUB_MAX 6\r
-#define NASUB_20MS 2\r
-#define NASUB_30MS 4\r
-#define NASUB_MAX 4\r
-#define SUBL 40\r
-#define STATE_LEN 80\r
-#define STATE_SHORT_LEN_30MS 58\r
-#define STATE_SHORT_LEN_20MS 57\r
-\r
-/* LPC settings */\r
-\r
-#define LPC_FILTERORDER 10\r
-#define LPC_CHIRP_SYNTDENUM (float)0.9025\r
-#define LPC_CHIRP_WEIGHTDENUM (float)0.4222\r
-#define LPC_LOOKBACK 60\r
-#define LPC_N_20MS 1\r
-#define LPC_N_30MS 2\r
-#define LPC_N_MAX 2\r
-#define LPC_ASYMDIFF 20\r
-#define LPC_BW (float)60.0\r
-#define LPC_WN (float)1.0001\r
-#define LSF_NSPLIT 3\r
-\r
-#define LSF_NUMBER_OF_STEPS 4\r
-#define LPC_HALFORDER (LPC_FILTERORDER/2)\r
-\r
-/* cb settings */\r
-\r
-#define CB_NSTAGES 3\r
-#define CB_EXPAND 2\r
-#define CB_MEML 147\r
-#define CB_FILTERLEN 2*4\r
-#define CB_HALFFILTERLEN 4\r
-#define CB_RESRANGE 34\r
-#define CB_MAXGAIN (float)1.3 \r
-\r
-/* enhancer */\r
-\r
-#define ENH_BLOCKL 80 /* block length */\r
-#define ENH_BLOCKL_HALF (ENH_BLOCKL/2)\r
-#define ENH_HL 3 /* 2*ENH_HL+1 is number blocks\r
- in said second sequence */\r
-#define ENH_SLOP 2 /* max difference estimated and\r
- correct pitch period */\r
-#define ENH_PLOCSL 20 /* pitch-estimates and pitch-\r
- locations buffer length */\r
-#define ENH_OVERHANG 2\r
-#define ENH_UPS0 4 /* upsampling rate */\r
-#define ENH_FL0 3 /* 2*FLO+1 is the length of \r
- each filter */\r
-#define ENH_VECTL (ENH_BLOCKL+2*ENH_FL0)\r
-#define ENH_CORRDIM (2*ENH_SLOP+1)\r
-#define ENH_NBLOCKS (BLOCKL_MAX/ENH_BLOCKL)\r
-#define ENH_NBLOCKS_EXTRA 5\r
-#define ENH_NBLOCKS_TOT 8 /* ENH_NBLOCKS + \r
- ENH_NBLOCKS_EXTRA */\r
-#define ENH_BUFL (ENH_NBLOCKS_TOT)*ENH_BLOCKL\r
-#define ENH_ALPHA0 (float)0.05\r
-\r
-/* Down sampling */\r
-\r
-#define FILTERORDER_DS 7\r
-#define DELAY_DS 3\r
-#define FACTOR_DS 2\r
-\r
-/* bit stream defs */\r
-\r
-#define NO_OF_BYTES_20MS 38\r
-#define NO_OF_BYTES_30MS 50\r
-#define NO_OF_WORDS_20MS 19\r
-#define NO_OF_WORDS_30MS 25\r
-#define STATE_BITS 3\r
-#define BYTE_LEN 8\r
-#define ULP_CLASSES 3\r
-\r
-/* help parameters */\r
-\r
-\r
-#define FLOAT_MAX (float)1.0e37\r
-#define EPS (float)2.220446049250313e-016\r
-#define PI (float)3.14159265358979323846\r
-#define MIN_SAMPLE -32768\r
-#define MAX_SAMPLE 32767\r
-#define TWO_PI (float)6.283185307\r
-#define PI2 (float)0.159154943\r
-\r
-/* type definition encoder instance */\r
-typedef struct iLBC_ULP_Inst_t_ {\r
- int lsf_bits[6][ULP_CLASSES+2];\r
- int start_bits[ULP_CLASSES+2];\r
- int startfirst_bits[ULP_CLASSES+2];\r
- int scale_bits[ULP_CLASSES+2];\r
- int state_bits[ULP_CLASSES+2];\r
- int extra_cb_index[CB_NSTAGES][ULP_CLASSES+2];\r
- int extra_cb_gain[CB_NSTAGES][ULP_CLASSES+2];\r
- int cb_index[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];\r
- int cb_gain[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];\r
-} iLBC_ULP_Inst_t;\r
-\r
-/* type definition encoder instance */\r
-typedef struct iLBC_Enc_Inst_t_ {\r
-\r
- /* flag for frame size mode */\r
- int mode;\r
-\r
- /* basic parameters for different frame sizes */\r
- int blockl;\r
- int nsub;\r
- int nasub;\r
- int no_of_bytes, no_of_words;\r
- int lpc_n;\r
- int state_short_len;\r
- const iLBC_ULP_Inst_t *ULP_inst;\r
-\r
- /* analysis filter state */\r
- float anaMem[LPC_FILTERORDER];\r
-\r
- /* old lsf parameters for interpolation */\r
- float lsfold[LPC_FILTERORDER];\r
- float lsfdeqold[LPC_FILTERORDER];\r
-\r
- /* signal buffer for LP analysis */\r
- float lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];\r
-\r
- /* state of input HP filter */\r
- float hpimem[4];\r
-\r
-} iLBC_Enc_Inst_t;\r
-\r
-/* type definition decoder instance */\r
-typedef struct iLBC_Dec_Inst_t_ {\r
-\r
-\r
- /* flag for frame size mode */\r
- int mode;\r
-\r
- /* basic parameters for different frame sizes */\r
- int blockl;\r
- int nsub;\r
- int nasub;\r
- int no_of_bytes, no_of_words;\r
- int lpc_n;\r
- int state_short_len;\r
- const iLBC_ULP_Inst_t *ULP_inst;\r
-\r
- /* synthesis filter state */\r
- float syntMem[LPC_FILTERORDER];\r
-\r
- /* old LSF for interpolation */\r
- float lsfdeqold[LPC_FILTERORDER];\r
-\r
- /* pitch lag estimated in enhancer and used in PLC */\r
- int last_lag;\r
-\r
- /* PLC state information */\r
- int prevLag, consPLICount, prevPLI, prev_enh_pl;\r
- float prevLpc[LPC_FILTERORDER+1];\r
- float prevResidual[NSUB_MAX*SUBL];\r
- float per;\r
- unsigned long seed;\r
-\r
- /* previous synthesis filter parameters */\r
- float old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];\r
-\r
- /* state of output HP filter */\r
- float hpomem[4];\r
-\r
- /* enhancer state information */\r
- int use_enhancer;\r
- float enh_buf[ENH_BUFL];\r
- float enh_period[ENH_NBLOCKS_TOT];\r
-\r
-} iLBC_Dec_Inst_t;\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iLBC_encode.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "iLBC_encode.h"\r
-#include "LPCencode.h"\r
-#include "FrameClassify.h"\r
-#include "StateSearchW.h"\r
-#include "StateConstructW.h"\r
-#include "helpfun.h"\r
-#include "constants.h"\r
-#include "packing.h"\r
-#include "iCBSearch.h"\r
-#include "iCBConstruct.h"\r
-#include "hpInput.h"\r
-#include "anaFilter.h"\r
-#include "syntFilter.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * Initiation of encoder instance.\r
- *---------------------------------------------------------------*/\r
-\r
-short initEncode( /* (o) Number of bytes \r
- encoded */\r
- iLBC_Enc_Inst_t *iLBCenc_inst, /* (i/o) Encoder instance */\r
- int mode /* (i) frame size mode */\r
-){\r
- iLBCenc_inst->mode = mode;\r
- if (mode==30) {\r
- iLBCenc_inst->blockl = BLOCKL_30MS;\r
- iLBCenc_inst->nsub = NSUB_30MS;\r
-\r
-\r
- iLBCenc_inst->nasub = NASUB_30MS;\r
- iLBCenc_inst->lpc_n = LPC_N_30MS;\r
- iLBCenc_inst->no_of_bytes = NO_OF_BYTES_30MS;\r
- iLBCenc_inst->no_of_words = NO_OF_WORDS_30MS;\r
- iLBCenc_inst->state_short_len=STATE_SHORT_LEN_30MS;\r
- /* ULP init */\r
- iLBCenc_inst->ULP_inst=&ULP_30msTbl;\r
- }\r
- else if (mode==20) {\r
- iLBCenc_inst->blockl = BLOCKL_20MS;\r
- iLBCenc_inst->nsub = NSUB_20MS;\r
- iLBCenc_inst->nasub = NASUB_20MS;\r
- iLBCenc_inst->lpc_n = LPC_N_20MS;\r
- iLBCenc_inst->no_of_bytes = NO_OF_BYTES_20MS;\r
- iLBCenc_inst->no_of_words = NO_OF_WORDS_20MS;\r
- iLBCenc_inst->state_short_len=STATE_SHORT_LEN_20MS;\r
- /* ULP init */\r
- iLBCenc_inst->ULP_inst=&ULP_20msTbl;\r
- }\r
- else {\r
- exit(2);\r
- }\r
-\r
- memset((*iLBCenc_inst).anaMem, 0, \r
- LPC_FILTERORDER*sizeof(float));\r
- memcpy((*iLBCenc_inst).lsfold, lsfmeanTbl,\r
- LPC_FILTERORDER*sizeof(float));\r
- memcpy((*iLBCenc_inst).lsfdeqold, lsfmeanTbl,\r
- LPC_FILTERORDER*sizeof(float));\r
- memset((*iLBCenc_inst).lpc_buffer, 0, \r
- (LPC_LOOKBACK+BLOCKL_MAX)*sizeof(float));\r
- memset((*iLBCenc_inst).hpimem, 0, 4*sizeof(float));\r
-\r
- return (iLBCenc_inst->no_of_bytes);\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * main encoder function \r
- *---------------------------------------------------------------*/\r
-\r
-void iLBC_encode(\r
- unsigned char *bytes, /* (o) encoded data bits iLBC */\r
- float *block, /* (o) speech vector to \r
- encode */\r
- iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) the general encoder \r
- state */\r
-){\r
- \r
- float data[BLOCKL_MAX];\r
- float residual[BLOCKL_MAX], reverseResidual[BLOCKL_MAX];\r
-\r
- int start, idxForMax, idxVec[STATE_LEN];\r
- float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML];\r
- int n, k, meml_gotten, Nfor, Nback, i, pos;\r
-\r
-\r
- int gain_index[CB_NSTAGES*NASUB_MAX], \r
- extra_gain_index[CB_NSTAGES];\r
- int cb_index[CB_NSTAGES*NASUB_MAX],extra_cb_index[CB_NSTAGES];\r
- int lsf_i[LSF_NSPLIT*LPC_N_MAX];\r
- unsigned char *pbytes;\r
- int diff, start_pos, state_first;\r
- float en1, en2;\r
- int index, ulp, firstpart;\r
- int subcount, subframe;\r
- float weightState[LPC_FILTERORDER];\r
- float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; \r
- float weightdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; \r
- float decresidual[BLOCKL_MAX];\r
-\r
- /* high pass filtering of input signal if such is not done \r
- prior to calling this function */\r
-\r
- hpInput(block, iLBCenc_inst->blockl, \r
- data, (*iLBCenc_inst).hpimem);\r
-\r
- /* otherwise simply copy */\r
-\r
- /*memcpy(data,block,iLBCenc_inst->blockl*sizeof(float));*/\r
- \r
- /* LPC of hp filtered input data */\r
-\r
- LPCencode(syntdenum, weightdenum, lsf_i, data, iLBCenc_inst);\r
-\r
-\r
- /* inverse filter to get residual */\r
-\r
- for (n=0; n<iLBCenc_inst->nsub; n++) {\r
- anaFilter(&data[n*SUBL], &syntdenum[n*(LPC_FILTERORDER+1)], \r
- SUBL, &residual[n*SUBL], iLBCenc_inst->anaMem);\r
- }\r
-\r
- /* find state location */\r
-\r
- start = FrameClassify(iLBCenc_inst, residual);\r
- \r
- /* check if state should be in first or last part of the \r
- two subframes */\r
-\r
- diff = STATE_LEN - iLBCenc_inst->state_short_len;\r
- en1 = 0;\r
- index = (start-1)*SUBL;\r
- for (i = 0; i < iLBCenc_inst->state_short_len; i++) {\r
- en1 += residual[index+i]*residual[index+i];\r
- }\r
- en2 = 0;\r
- index = (start-1)*SUBL+diff;\r
- for (i = 0; i < iLBCenc_inst->state_short_len; i++) {\r
- en2 += residual[index+i]*residual[index+i];\r
- }\r
-\r
-\r
- \r
- \r
- if (en1 > en2) {\r
- state_first = 1;\r
- start_pos = (start-1)*SUBL;\r
- } else {\r
- state_first = 0;\r
- start_pos = (start-1)*SUBL + diff;\r
- }\r
-\r
- /* scalar quantization of state */\r
-\r
- StateSearchW(iLBCenc_inst, &residual[start_pos], \r
- &syntdenum[(start-1)*(LPC_FILTERORDER+1)], \r
- &weightdenum[(start-1)*(LPC_FILTERORDER+1)], &idxForMax, \r
- idxVec, iLBCenc_inst->state_short_len, state_first);\r
-\r
- StateConstructW(idxForMax, idxVec, \r
- &syntdenum[(start-1)*(LPC_FILTERORDER+1)], \r
- &decresidual[start_pos], iLBCenc_inst->state_short_len);\r
-\r
- /* predictive quantization in state */\r
- \r
- if (state_first) { /* put adaptive part in the end */\r
- \r
- /* setup memory */\r
-\r
- memset(mem, 0, \r
- (CB_MEML-iLBCenc_inst->state_short_len)*sizeof(float));\r
- memcpy(mem+CB_MEML-iLBCenc_inst->state_short_len, \r
- decresidual+start_pos, \r
- iLBCenc_inst->state_short_len*sizeof(float));\r
- memset(weightState, 0, LPC_FILTERORDER*sizeof(float));\r
-\r
- /* encode sub-frames */\r
-\r
- iCBSearch(iLBCenc_inst, extra_cb_index, extra_gain_index, \r
- &residual[start_pos+iLBCenc_inst->state_short_len], \r
- mem+CB_MEML-stMemLTbl,\r
- stMemLTbl, diff, CB_NSTAGES, \r
- &weightdenum[start*(LPC_FILTERORDER+1)], \r
- weightState, 0);\r
-\r
- /* construct decoded vector */\r
-\r
- iCBConstruct(\r
- &decresidual[start_pos+iLBCenc_inst->state_short_len],\r
- extra_cb_index, extra_gain_index, \r
- mem+CB_MEML-stMemLTbl, \r
- stMemLTbl, diff, CB_NSTAGES);\r
- \r
- } \r
- else { /* put adaptive part in the beginning */\r
- \r
-\r
-\r
- /* create reversed vectors for prediction */\r
-\r
- for (k=0; k<diff; k++) {\r
- reverseResidual[k] = residual[(start+1)*SUBL-1\r
- -(k+iLBCenc_inst->state_short_len)];\r
- }\r
- \r
- /* setup memory */\r
-\r
- meml_gotten = iLBCenc_inst->state_short_len;\r
- for (k=0; k<meml_gotten; k++) { \r
- mem[CB_MEML-1-k] = decresidual[start_pos + k];\r
- } \r
- memset(mem, 0, (CB_MEML-k)*sizeof(float));\r
- memset(weightState, 0, LPC_FILTERORDER*sizeof(float));\r
- \r
- /* encode sub-frames */\r
-\r
- iCBSearch(iLBCenc_inst, extra_cb_index, extra_gain_index, \r
- reverseResidual, mem+CB_MEML-stMemLTbl, stMemLTbl, \r
- diff, CB_NSTAGES, \r
- &weightdenum[(start-1)*(LPC_FILTERORDER+1)], \r
- weightState, 0);\r
-\r
- /* construct decoded vector */\r
-\r
- iCBConstruct(reverseDecresidual, extra_cb_index, \r
- extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, \r
- diff, CB_NSTAGES);\r
- \r
- /* get decoded residual from reversed vector */\r
-\r
- for (k=0; k<diff; k++) {\r
- decresidual[start_pos-1-k] = reverseDecresidual[k];\r
- }\r
- }\r
-\r
- /* counter for predicted sub-frames */\r
-\r
- subcount=0;\r
-\r
- /* forward prediction of sub-frames */\r
-\r
- Nfor = iLBCenc_inst->nsub-start-1;\r
-\r
- \r
- if ( Nfor > 0 ) {\r
- \r
- /* setup memory */\r
-\r
- memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float));\r
- memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL, \r
- STATE_LEN*sizeof(float));\r
- memset(weightState, 0, LPC_FILTERORDER*sizeof(float));\r
-\r
-\r
-\r
- /* loop over sub-frames to encode */\r
-\r
- for (subframe=0; subframe<Nfor; subframe++) {\r
-\r
- /* encode sub-frame */\r
-\r
- iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES, \r
- gain_index+subcount*CB_NSTAGES, \r
- &residual[(start+1+subframe)*SUBL], \r
- mem+CB_MEML-memLfTbl[subcount], \r
- memLfTbl[subcount], SUBL, CB_NSTAGES, \r
- &weightdenum[(start+1+subframe)*\r
- (LPC_FILTERORDER+1)],\r
- weightState, subcount+1);\r
-\r
- /* construct decoded vector */\r
-\r
- iCBConstruct(&decresidual[(start+1+subframe)*SUBL], \r
- cb_index+subcount*CB_NSTAGES, \r
- gain_index+subcount*CB_NSTAGES, \r
- mem+CB_MEML-memLfTbl[subcount], \r
- memLfTbl[subcount], SUBL, CB_NSTAGES);\r
-\r
- /* update memory */\r
-\r
- memmove(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));\r
- memcpy(mem+CB_MEML-SUBL, \r
- &decresidual[(start+1+subframe)*SUBL], \r
- SUBL*sizeof(float));\r
- memset(weightState, 0, LPC_FILTERORDER*sizeof(float));\r
-\r
- subcount++;\r
- }\r
- }\r
- \r
-\r
- /* backward prediction of sub-frames */\r
-\r
- Nback = start-1;\r
-\r
- \r
- if ( Nback > 0 ) {\r
- \r
- /* create reverse order vectors */\r
-\r
- for (n=0; n<Nback; n++) {\r
- for (k=0; k<SUBL; k++) {\r
- reverseResidual[n*SUBL+k] = \r
- residual[(start-1)*SUBL-1-n*SUBL-k];\r
- reverseDecresidual[n*SUBL+k] = \r
- decresidual[(start-1)*SUBL-1-n*SUBL-k];\r
- }\r
- }\r
-\r
-\r
-\r
- /* setup memory */\r
-\r
- meml_gotten = SUBL*(iLBCenc_inst->nsub+1-start);\r
-\r
- \r
- if ( meml_gotten > CB_MEML ) { \r
- meml_gotten=CB_MEML;\r
- }\r
- for (k=0; k<meml_gotten; k++) { \r
- mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k];\r
- } \r
- memset(mem, 0, (CB_MEML-k)*sizeof(float));\r
- memset(weightState, 0, LPC_FILTERORDER*sizeof(float));\r
-\r
- /* loop over sub-frames to encode */\r
-\r
- for (subframe=0; subframe<Nback; subframe++) {\r
- \r
- /* encode sub-frame */\r
-\r
- iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES, \r
- gain_index+subcount*CB_NSTAGES, \r
- &reverseResidual[subframe*SUBL], \r
- mem+CB_MEML-memLfTbl[subcount], \r
- memLfTbl[subcount], SUBL, CB_NSTAGES, \r
- &weightdenum[(start-2-subframe)*\r
- (LPC_FILTERORDER+1)], \r
- weightState, subcount+1);\r
-\r
- /* construct decoded vector */\r
-\r
- iCBConstruct(&reverseDecresidual[subframe*SUBL], \r
- cb_index+subcount*CB_NSTAGES, \r
- gain_index+subcount*CB_NSTAGES, \r
- mem+CB_MEML-memLfTbl[subcount], \r
- memLfTbl[subcount], SUBL, CB_NSTAGES);\r
-\r
- /* update memory */\r
-\r
- memmove(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));\r
- memcpy(mem+CB_MEML-SUBL, \r
- &reverseDecresidual[subframe*SUBL],\r
- SUBL*sizeof(float));\r
- memset(weightState, 0, LPC_FILTERORDER*sizeof(float));\r
-\r
- subcount++;\r
-\r
- }\r
-\r
- /* get decoded residual from reversed vector */\r
-\r
- for (i=0; i<SUBL*Nback; i++) {\r
- decresidual[SUBL*Nback - i - 1] = \r
-\r
-\r
- reverseDecresidual[i];\r
- }\r
- }\r
- /* end encoding part */\r
-\r
- /* adjust index */\r
- index_conv_enc(cb_index);\r
-\r
- /* pack bytes */\r
-\r
- pbytes=bytes;\r
- pos=0;\r
-\r
- /* loop over the 3 ULP classes */\r
-\r
- for (ulp=0; ulp<3; ulp++) {\r
- \r
- /* LSF */\r
- for (k=0; k<LSF_NSPLIT*iLBCenc_inst->lpc_n; k++) {\r
- packsplit(&lsf_i[k], &firstpart, &lsf_i[k], \r
- iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], \r
- iLBCenc_inst->ULP_inst->lsf_bits[k][ulp]+\r
- iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+1]+\r
- iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], &pos);\r
- }\r
-\r
- /* Start block info */\r
-\r
- packsplit(&start, &firstpart, &start, \r
- iLBCenc_inst->ULP_inst->start_bits[ulp], \r
- iLBCenc_inst->ULP_inst->start_bits[ulp]+\r
- iLBCenc_inst->ULP_inst->start_bits[ulp+1]+\r
- iLBCenc_inst->ULP_inst->start_bits[ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->start_bits[ulp], &pos);\r
-\r
- packsplit(&state_first, &firstpart, &state_first, \r
- iLBCenc_inst->ULP_inst->startfirst_bits[ulp], \r
- iLBCenc_inst->ULP_inst->startfirst_bits[ulp]+\r
- iLBCenc_inst->ULP_inst->startfirst_bits[ulp+1]+\r
- iLBCenc_inst->ULP_inst->startfirst_bits[ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->startfirst_bits[ulp], &pos);\r
-\r
- packsplit(&idxForMax, &firstpart, &idxForMax, \r
- iLBCenc_inst->ULP_inst->scale_bits[ulp], \r
- iLBCenc_inst->ULP_inst->scale_bits[ulp]+\r
- iLBCenc_inst->ULP_inst->scale_bits[ulp+1]+\r
- iLBCenc_inst->ULP_inst->scale_bits[ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->scale_bits[ulp], &pos);\r
-\r
-\r
-\r
- for (k=0; k<iLBCenc_inst->state_short_len; k++) {\r
- packsplit(idxVec+k, &firstpart, idxVec+k, \r
- iLBCenc_inst->ULP_inst->state_bits[ulp], \r
- iLBCenc_inst->ULP_inst->state_bits[ulp]+\r
- iLBCenc_inst->ULP_inst->state_bits[ulp+1]+\r
- iLBCenc_inst->ULP_inst->state_bits[ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->state_bits[ulp], &pos);\r
- }\r
-\r
- /* 23/22 (20ms/30ms) sample block */\r
-\r
- for (k=0;k<CB_NSTAGES;k++) {\r
- packsplit(extra_cb_index+k, &firstpart, \r
- extra_cb_index+k, \r
- iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp], \r
- iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp]+\r
- iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+1]+\r
- iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp], \r
- &pos);\r
- }\r
-\r
- for (k=0;k<CB_NSTAGES;k++) {\r
- packsplit(extra_gain_index+k, &firstpart, \r
- extra_gain_index+k, \r
- iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp], \r
- iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp]+\r
- iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+1]+\r
- iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp], \r
- &pos);\r
- }\r
- \r
- /* The two/four (20ms/30ms) 40 sample sub-blocks */\r
-\r
- for (i=0; i<iLBCenc_inst->nasub; i++) {\r
- for (k=0; k<CB_NSTAGES; k++) {\r
- packsplit(cb_index+i*CB_NSTAGES+k, &firstpart, \r
- cb_index+i*CB_NSTAGES+k, \r
- iLBCenc_inst->ULP_inst->cb_index[i][k][ulp], \r
- iLBCenc_inst->ULP_inst->cb_index[i][k][ulp]+\r
- iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+1]+\r
- iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->cb_index[i][k][ulp], \r
- &pos);\r
- }\r
- }\r
- \r
- for (i=0; i<iLBCenc_inst->nasub; i++) {\r
- for (k=0; k<CB_NSTAGES; k++) {\r
-\r
-\r
- packsplit(gain_index+i*CB_NSTAGES+k, &firstpart, \r
- gain_index+i*CB_NSTAGES+k, \r
- iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp], \r
- iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp]+\r
- iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+1]+\r
- iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+2]);\r
- dopack( &pbytes, firstpart, \r
- iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp], \r
- &pos);\r
- }\r
- }\r
- }\r
-\r
- /* set the last bit to zero (otherwise the decoder \r
- will treat it as a lost frame) */\r
- dopack( &pbytes, 0, 1, &pos);\r
-}\r
-\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- iLBC_encode.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_ILBCENCODE_H\r
-#define __iLBC_ILBCENCODE_H\r
-\r
-#include "iLBC_define.h"\r
-\r
-short initEncode( /* (o) Number of bytes \r
- encoded */\r
- iLBC_Enc_Inst_t *iLBCenc_inst, /* (i/o) Encoder instance */\r
- int mode /* (i) frame size mode */\r
-);\r
-\r
-void iLBC_encode(\r
-\r
-\r
- unsigned char *bytes, /* (o) encoded data bits iLBC */\r
- float *block, /* (o) speech vector to \r
- encode */\r
- iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) the general encoder \r
- state */\r
-);\r
-\r
-#endif\r
-\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- lsf.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <string.h>\r
-#include <math.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "lsf.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * conversion from lpc coefficients to lsf coefficients \r
- *---------------------------------------------------------------*/\r
-\r
-void a2lsf( \r
- float *freq,/* (o) lsf coefficients */\r
- float *a /* (i) lpc coefficients */\r
-){\r
- float steps[LSF_NUMBER_OF_STEPS] = \r
- {(float)0.00635, (float)0.003175, (float)0.0015875, \r
- (float)0.00079375};\r
- float step;\r
- int step_idx;\r
- int lsp_index; \r
- float p[LPC_HALFORDER];\r
- float q[LPC_HALFORDER];\r
- float p_pre[LPC_HALFORDER];\r
-\r
-\r
- float q_pre[LPC_HALFORDER];\r
- float old_p, old_q, *old;\r
- float *pq_coef; \r
- float omega, old_omega;\r
- int i;\r
- float hlp, hlp1, hlp2, hlp3, hlp4, hlp5;\r
-\r
- for (i=0; i<LPC_HALFORDER; i++) {\r
- p[i] = (float)-1.0 * (a[i + 1] + a[LPC_FILTERORDER - i]);\r
- q[i] = a[LPC_FILTERORDER - i] - a[i + 1];\r
- }\r
- \r
- p_pre[0] = (float)-1.0 - p[0];\r
- p_pre[1] = - p_pre[0] - p[1];\r
- p_pre[2] = - p_pre[1] - p[2];\r
- p_pre[3] = - p_pre[2] - p[3];\r
- p_pre[4] = - p_pre[3] - p[4];\r
- p_pre[4] = p_pre[4] / 2;\r
- \r
- q_pre[0] = (float)1.0 - q[0];\r
- q_pre[1] = q_pre[0] - q[1];\r
- q_pre[2] = q_pre[1] - q[2];\r
- q_pre[3] = q_pre[2] - q[3];\r
- q_pre[4] = q_pre[3] - q[4];\r
- q_pre[4] = q_pre[4] / 2;\r
- \r
- omega = 0.0;\r
- old_omega = 0.0;\r
-\r
- old_p = FLOAT_MAX;\r
- old_q = FLOAT_MAX;\r
- \r
- /* Here we loop through lsp_index to find all the \r
- LPC_FILTERORDER roots for omega. */ \r
-\r
- for (lsp_index = 0; lsp_index<LPC_FILTERORDER; lsp_index++) {\r
- \r
- /* Depending on lsp_index being even or odd, we \r
- alternatively solve the roots for the two LSP equations. */\r
-\r
- \r
- if ((lsp_index & 0x1) == 0) {\r
- pq_coef = p_pre;\r
- old = &old_p;\r
- } else {\r
- pq_coef = q_pre;\r
- old = &old_q;\r
- }\r
- \r
- /* Start with low resolution grid */\r
-\r
- for (step_idx = 0, step = steps[step_idx]; \r
- step_idx < LSF_NUMBER_OF_STEPS;){\r
- \r
-\r
-\r
- /* cos(10piw) + pq(0)cos(8piw) + pq(1)cos(6piw) + \r
- pq(2)cos(4piw) + pq(3)cod(2piw) + pq(4) */\r
-\r
- hlp = (float)cos(omega * TWO_PI);\r
- hlp1 = (float)2.0 * hlp + pq_coef[0];\r
- hlp2 = (float)2.0 * hlp * hlp1 - (float)1.0 + \r
- pq_coef[1];\r
- hlp3 = (float)2.0 * hlp * hlp2 - hlp1 + pq_coef[2];\r
- hlp4 = (float)2.0 * hlp * hlp3 - hlp2 + pq_coef[3];\r
- hlp5 = hlp * hlp4 - hlp3 + pq_coef[4];\r
- \r
- \r
- if (((hlp5 * (*old)) <= 0.0) || (omega >= 0.5)){\r
- \r
- if (step_idx == (LSF_NUMBER_OF_STEPS - 1)){\r
- \r
- if (fabs(hlp5) >= fabs(*old)) {\r
- freq[lsp_index] = omega - step;\r
- } else {\r
- freq[lsp_index] = omega;\r
- } \r
- \r
- \r
- if ((*old) >= 0.0){\r
- *old = (float)-1.0 * FLOAT_MAX;\r
- } else {\r
- *old = FLOAT_MAX;\r
- }\r
-\r
- omega = old_omega;\r
- step_idx = 0;\r
- \r
- step_idx = LSF_NUMBER_OF_STEPS;\r
- } else {\r
- \r
- if (step_idx == 0) {\r
- old_omega = omega;\r
- }\r
-\r
- step_idx++;\r
- omega -= steps[step_idx];\r
-\r
- /* Go back one grid step */\r
-\r
- step = steps[step_idx];\r
- }\r
- } else {\r
- \r
- /* increment omega until they are of different sign, \r
- and we know there is at least one root between omega \r
- and old_omega */\r
- *old = hlp5;\r
- omega += step;\r
- }\r
-\r
-\r
- }\r
- }\r
-\r
- for (i = 0; i<LPC_FILTERORDER; i++) {\r
- freq[i] = freq[i] * TWO_PI;\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * conversion from lsf coefficients to lpc coefficients \r
- *---------------------------------------------------------------*/\r
-\r
-void lsf2a( \r
- float *a_coef, /* (o) lpc coefficients */\r
- float *freq /* (i) lsf coefficients */\r
-){\r
- int i, j;\r
- float hlp;\r
- float p[LPC_HALFORDER], q[LPC_HALFORDER];\r
- float a[LPC_HALFORDER + 1], a1[LPC_HALFORDER],\r
- a2[LPC_HALFORDER];\r
- float b[LPC_HALFORDER + 1], b1[LPC_HALFORDER], \r
- b2[LPC_HALFORDER];\r
-\r
- for (i=0; i<LPC_FILTERORDER; i++) {\r
- freq[i] = freq[i] * PI2;\r
- }\r
-\r
- /* Check input for ill-conditioned cases. This part is not \r
- found in the TIA standard. It involves the following 2 IF \r
- blocks. If "freq" is judged ill-conditioned, then we first \r
- modify freq[0] and freq[LPC_HALFORDER-1] (normally \r
- LPC_HALFORDER = 10 for LPC applications), then we adjust \r
- the other "freq" values slightly */\r
-\r
- \r
- if ((freq[0] <= 0.0) || (freq[LPC_FILTERORDER - 1] >= 0.5)){\r
-\r
- \r
- if (freq[0] <= 0.0) {\r
- freq[0] = (float)0.022;\r
- }\r
-\r
- \r
- if (freq[LPC_FILTERORDER - 1] >= 0.5) {\r
- freq[LPC_FILTERORDER - 1] = (float)0.499;\r
- }\r
-\r
- hlp = (freq[LPC_FILTERORDER - 1] - freq[0]) / \r
- (float) (LPC_FILTERORDER - 1);\r
-\r
- for (i=1; i<LPC_FILTERORDER; i++) {\r
- freq[i] = freq[i - 1] + hlp;\r
- }\r
-\r
-\r
- }\r
- \r
- memset(a1, 0, LPC_HALFORDER*sizeof(float));\r
- memset(a2, 0, LPC_HALFORDER*sizeof(float));\r
- memset(b1, 0, LPC_HALFORDER*sizeof(float));\r
- memset(b2, 0, LPC_HALFORDER*sizeof(float));\r
- memset(a, 0, (LPC_HALFORDER+1)*sizeof(float));\r
- memset(b, 0, (LPC_HALFORDER+1)*sizeof(float));\r
- \r
- /* p[i] and q[i] compute cos(2*pi*omega_{2j}) and \r
- cos(2*pi*omega_{2j-1} in eqs. 4.2.2.2-1 and 4.2.2.2-2. \r
- Note that for this code p[i] specifies the coefficients \r
- used in .Q_A(z) while q[i] specifies the coefficients used \r
- in .P_A(z) */\r
-\r
- for (i=0; i<LPC_HALFORDER; i++) {\r
- p[i] = (float)cos(TWO_PI * freq[2 * i]);\r
- q[i] = (float)cos(TWO_PI * freq[2 * i + 1]);\r
- }\r
- \r
- a[0] = 0.25;\r
- b[0] = 0.25;\r
- \r
- for (i= 0; i<LPC_HALFORDER; i++) {\r
- a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i];\r
- b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i];\r
- a2[i] = a1[i];\r
- a1[i] = a[i];\r
- b2[i] = b1[i];\r
- b1[i] = b[i];\r
- }\r
- \r
- for (j=0; j<LPC_FILTERORDER; j++) {\r
- \r
- if (j == 0) {\r
- a[0] = 0.25;\r
- b[0] = -0.25;\r
- } else {\r
- a[0] = b[0] = 0.0;\r
- }\r
- \r
- for (i=0; i<LPC_HALFORDER; i++) {\r
- a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i];\r
- b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i];\r
- a2[i] = a1[i];\r
- a1[i] = a[i];\r
- b2[i] = b1[i];\r
- b1[i] = b[i];\r
- }\r
-\r
- a_coef[j + 1] = 2 * (a[LPC_HALFORDER] + b[LPC_HALFORDER]);\r
- }\r
-\r
- a_coef[0] = 1.0;\r
-\r
-\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- lsf.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_LSF_H\r
-#define __iLBC_LSF_H\r
-\r
-void a2lsf( \r
- float *freq,/* (o) lsf coefficients */\r
- float *a /* (i) lpc coefficients */\r
-);\r
-\r
-void lsf2a( \r
- float *a_coef, /* (o) lpc coefficients */\r
- float *freq /* (i) lsf coefficients */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- packing.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include <math.h>\r
-#include <stdlib.h>\r
-\r
-#include "iLBC_define.h"\r
-#include "constants.h"\r
-#include "helpfun.h"\r
-#include "packing.h"\r
-#include "string.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * splitting an integer into first most significant bits and \r
- * remaining least significant bits\r
- *---------------------------------------------------------------*/\r
-\r
-void packsplit(\r
- int *index, /* (i) the value to split */\r
- int *firstpart, /* (o) the value specified by most \r
- significant bits */\r
- int *rest, /* (o) the value specified by least\r
- significant bits */\r
- int bitno_firstpart, /* (i) number of bits in most \r
- significant part */\r
- int bitno_total /* (i) number of bits in full range\r
- of value */\r
-){\r
- int bitno_rest = bitno_total-bitno_firstpart;\r
-\r
-\r
-\r
- *firstpart = *index>>(bitno_rest);\r
- *rest = *index-(*firstpart<<(bitno_rest));\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * combining a value corresponding to msb's with a value \r
- * corresponding to lsb's\r
- *---------------------------------------------------------------*/\r
-\r
-void packcombine( \r
- int *index, /* (i/o) the msb value in the \r
- combined value out */\r
- int rest, /* (i) the lsb value */\r
- int bitno_rest /* (i) the number of bits in the \r
- lsb part */\r
-){\r
- *index = *index<<bitno_rest;\r
- *index += rest;\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * packing of bits into bitstream, i.e., vector of bytes\r
- *---------------------------------------------------------------*/\r
-\r
-void dopack( \r
- unsigned char **bitstream, /* (i/o) on entrance pointer to \r
- place in bitstream to pack \r
- new data, on exit pointer \r
- to place in bitstream to \r
- pack future data */\r
- int index, /* (i) the value to pack */\r
- int bitno, /* (i) the number of bits that the \r
- value will fit within */\r
- int *pos /* (i/o) write position in the \r
- current byte */\r
-){\r
- int posLeft;\r
- \r
- /* Clear the bits before starting in a new byte */\r
- \r
- if ((*pos)==0) {\r
- **bitstream=0;\r
- }\r
-\r
- while (bitno>0) {\r
- \r
- /* Jump to the next byte if end of this byte is reached*/\r
- \r
- if (*pos==8) {\r
- *pos=0;\r
- (*bitstream)++;\r
- **bitstream=0;\r
- }\r
-\r
-\r
-\r
- posLeft=8-(*pos);\r
-\r
- /* Insert index into the bitstream */\r
- \r
- if (bitno <= posLeft) {\r
- **bitstream |= (unsigned char)(index<<(posLeft-bitno));\r
- *pos+=bitno;\r
- bitno=0;\r
- } else {\r
- **bitstream |= (unsigned char)(index>>(bitno-posLeft));\r
- \r
- *pos=8;\r
- index-=((index>>(bitno-posLeft))<<(bitno-posLeft));\r
- \r
- bitno-=posLeft;\r
- }\r
- }\r
-}\r
-\r
-/*----------------------------------------------------------------*\r
- * unpacking of bits from bitstream, i.e., vector of bytes\r
- *---------------------------------------------------------------*/\r
-\r
-void unpack( \r
- unsigned char **bitstream, /* (i/o) on entrance pointer to \r
- place in bitstream to \r
- unpack new data from, on \r
- exit pointer to place in \r
- bitstream to unpack future \r
- data from */\r
- int *index, /* (o) resulting value */\r
- int bitno, /* (i) number of bits used to \r
- represent the value */\r
- int *pos /* (i/o) read position in the \r
- current byte */\r
-){\r
- int BitsLeft;\r
-\r
- *index=0;\r
-\r
- while (bitno>0) {\r
- \r
- /* move forward in bitstream when the end of the \r
- byte is reached */\r
- \r
- if (*pos==8) {\r
- *pos=0;\r
- (*bitstream)++;\r
- }\r
-\r
- BitsLeft=8-(*pos);\r
-\r
- /* Extract bits to index */\r
- \r
-\r
-\r
- if (BitsLeft>=bitno) {\r
- *index+=((((**bitstream)<<(*pos)) & 0xFF)>>(8-bitno));\r
- \r
- *pos+=bitno;\r
- bitno=0;\r
- } else {\r
- \r
- if ((8-bitno)>0) {\r
- *index+=((((**bitstream)<<(*pos)) & 0xFF)>>\r
- (8-bitno));\r
- *pos=8;\r
- } else {\r
- *index+=(((int)(((**bitstream)<<(*pos)) & 0xFF))<<\r
- (bitno-8));\r
- *pos=8;\r
- }\r
- bitno-=BitsLeft;\r
- }\r
- }\r
-}\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- packing.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __PACKING_H\r
-#define __PACKING_H\r
-\r
-void packsplit(\r
- int *index, /* (i) the value to split */\r
- int *firstpart, /* (o) the value specified by most \r
- significant bits */\r
- int *rest, /* (o) the value specified by least \r
- significant bits */\r
- int bitno_firstpart, /* (i) number of bits in most \r
- significant part */\r
- int bitno_total /* (i) number of bits in full range \r
- of value */\r
-);\r
-\r
-void packcombine( \r
- int *index, /* (i/o) the msb value in the \r
- combined value out */\r
- int rest, /* (i) the lsb value */\r
- int bitno_rest /* (i) the number of bits in the \r
- lsb part */\r
-);\r
-\r
-void dopack( \r
- unsigned char **bitstream, /* (i/o) on entrance pointer to \r
- place in bitstream to pack \r
- new data, on exit pointer \r
- to place in bitstream to \r
- pack future data */\r
- int index, /* (i) the value to pack */\r
- int bitno, /* (i) the number of bits that the \r
- value will fit within */\r
- int *pos /* (i/o) write position in the \r
- current byte */\r
-);\r
-\r
-void unpack( \r
- unsigned char **bitstream, /* (i/o) on entrance pointer to \r
-\r
-\r
- place in bitstream to \r
- unpack new data from, on \r
- exit pointer to place in \r
- bitstream to unpack future \r
- data from */\r
- int *index, /* (o) resulting value */\r
- int bitno, /* (i) number of bits used to \r
- represent the value */\r
- int *pos /* (i/o) read position in the \r
- current byte */\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- syntFilter.c \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#include "iLBC_define.h"\r
-#include "syntFilter.h"\r
-\r
-/*----------------------------------------------------------------*\r
- * LP synthesis filter.\r
- *---------------------------------------------------------------*/\r
- \r
-void syntFilter(\r
- float *Out, /* (i/o) Signal to be filtered */\r
- float *a, /* (i) LP parameters */\r
- int len, /* (i) Length of signal */\r
- float *mem /* (i/o) Filter state */\r
-){\r
- int i, j;\r
- float *po, *pi, *pa, *pm;\r
-\r
- po=Out;\r
-\r
- /* Filter first part using memory from past */\r
-\r
- for (i=0; i<LPC_FILTERORDER; i++) {\r
- pi=&Out[i-1];\r
- pa=&a[1];\r
- pm=&mem[LPC_FILTERORDER-1];\r
- for (j=1; j<=i; j++) {\r
- *po-=(*pa++)*(*pi--);\r
- }\r
- for (j=i+1; j<LPC_FILTERORDER+1; j++) {\r
- *po-=(*pa++)*(*pm--);\r
- }\r
- po++;\r
- }\r
-\r
- /* Filter last part where the state is entierly in \r
- the output vector */\r
- \r
- for (i=LPC_FILTERORDER; i<len; i++) {\r
-\r
-\r
- pi=&Out[i-1];\r
- pa=&a[1];\r
- for (j=1; j<LPC_FILTERORDER+1; j++) {\r
- *po-=(*pa++)*(*pi--);\r
- }\r
- po++;\r
- }\r
-\r
- /* Update state vector */\r
-\r
- memcpy(mem, &Out[len-LPC_FILTERORDER], \r
- LPC_FILTERORDER*sizeof(float));\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
+++ /dev/null
-\r
-/******************************************************************\r
-\r
- iLBC Speech Coder ANSI-C Source Code\r
-\r
- syntFilter.h \r
-\r
- Copyright (C) The Internet Society (2004). \r
- All Rights Reserved.\r
-\r
-******************************************************************/\r
-\r
-#ifndef __iLBC_SYNTFILTER_H\r
-#define __iLBC_SYNTFILTER_H\r
-\r
-void syntFilter(\r
- float *Out, /* (i/o) Signal to be filtered */\r
- float *a, /* (i) LP parameters */\r
- int len, /* (i) Length of signal */\r
- float *mem /* (i/o) Filter state */\r
-\r
-\r
-);\r
-\r
-#endif\r
-\r
-\r
+++ /dev/null
-# \r
-# Makefile for LPC-10 speech coder library (unix)\r
-# \r
-\r
-# default C compiler\r
-CC?= gcc\r
-\r
-# \r
-# These definitions for CFLAGS and LIB_TARGET_DIR are used when one\r
-# runs make in the lpc10 directory, without environment variables that\r
-# override them. When make is run in this directory from a makefile\r
-# for an application that uses the LPC10 coder, there are environment\r
-# variables set for CFLAGS and LIB_TARGET_DIR that override these\r
-# definitions.\r
-# \r
-\r
-LIB_TARGET_DIR = .\r
-\r
-# \r
-# -I$(LIB_TARGET_DIR) option needed so that #include "machine.h"\r
-# directives can find the machine.h file.\r
-# \r
-\r
-WARNINGS = -Wall -Wno-comment -Wno-error\r
-CFLAGS += $(OPTIMIZE) -I$(LIB_TARGET_DIR) $(WARNINGS)\r
-ifneq (${OSARCH},CYGWIN)\r
-CFLAGS += -fPIC\r
-endif\r
-#CFLAGS+= $(shell if uname -m | grep -q 86; then echo "-mpentium" ; fi)\r
-\r
-#fix for PPC processors and ALPHA, And UltraSparc too\r
-ifneq ($(OSARCH),Darwin)\r
-ifneq ($(findstring BSD,${OSARCH}),BSD)\r
-ifneq ($(PROC),ppc)\r
-ifneq ($(PROC),x86_64)\r
-ifneq ($(PROC),alpha)\r
-#The problem with sparc is the best stuff is in newer versions of gcc (post 3.0) only.\r
-#This works for even old (2.96) versions of gcc and provides a small boost either way.\r
-#A ultrasparc cpu is really v9 but the stock debian stable 3.0 gcc doesn.t support it.\r
-#So we go lowest common available by gcc and go a step down, still a step up from\r
-#the default as we now have a better instruction set to work with. - Belgarath\r
-ifeq ($(PROC),ultrasparc)\r
- CFLAGS+= -mtune=$(PROC) -mcpu=v8 -O3 -fomit-frame-pointer\r
-else\r
-ifneq ($(OSARCH),SunOS)\r
-ifneq ($(OSARCH),arm)\r
-# CFLAGS+= -march=$(PROC)\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-endif\r
-\r
-LIB = $(LIB_TARGET_DIR)/liblpc10.a\r
-\r
-.PHONY: all clean\r
-\r
-all: $(LIB)\r
-\r
-OBJ= f2clib.o analys.o bsynz.o chanwr.o dcbias.o decode.o \\r
- deemp.o difmag.o dyptrk.o encode.o energy.o ham84.o \\r
- hp100.o invert.o irc2pc.o ivfilt.o lpcdec.o lpcenc.o \\r
- lpcini.o lpfilt.o median.o mload.o onset.o pitsyn.o \\r
- placea.o placev.o preemp.o prepro.o random.o rcchk.o \\r
- synths.o tbdm.o voicin.o vparms.o\r
-\r
-$(LIB): $(OBJ)\r
- $(AR) cr $@ $(OBJ)\r
- ranlib $@\r
-\r
-clean:\r
- -rm -f *.o $(LIB)\r
+++ /dev/null
-Tue Aug 20 16:19:51 CDT 1996\r
-Andy Fingerhut (jaf@arl.wustl.edu)\r
-\r
-In release 1.4, there are quite a few hand modifications to the C code\r
-that was automatically created from the Fortran code with f2c. They\r
-are all summarized in change log comments at the beginning of the\r
-changed files. All of the original files from f2c were checked in to\r
-RCS before modification, so it is possible to see exactly what changes\r
-were made, for the extremely curious. That precaution was also for my\r
-benefit, in case I ever recompile the Fortran sources, and want to\r
-make similar changes to that new C source code.\r
-\r
-Below is the README file for this directory included with the 1.3\r
-release of the LPC-10 package. A few parts of it are a little out of\r
-date, but it is correct for the most part.\r
-\r
-\r
-Sun Jul 7 15:30:31 CDT 1996\r
-Andy Fingerhut (jaf@arl.wustl.edu)\r
-\r
-To create the LPC-10 library, copy the appropriate makefile to the\r
-proper name for easy use, e.g., for Unix, copy makefile.unx to the\r
-file "Makefile". The file makefile.dos has been used with some\r
-version of the 'nmake' utility that comes with the Microsoft C\r
-compiler (the same one used for Nautilus v1.5a, which I believe\r
-specifies Microsoft C version 7.0 or later).\r
-\r
-Then edit the file lpc10.h in the directory above. It should already\r
-be set up to work properly on any Unix compiler for which "int" is 32\r
-bits and "short" is 16 bits, and under the Microsoft C compiler\r
-configured so that "long" is 32 bits and "int" is 16 bits. There must\r
-be a typedef for the two types INT32 and INT16 in that file. You\r
-should choose types that compile to those sizes using your compiler,\r
-because there are places in the LPC-10 code that expect INT16's to\r
-have exactly 16 bits (at least, I *think* they must be no larger), and\r
-INT32's to have exactly 32 bits.\r
-\r
-\r
-A few notes on how these files were created\r
--------------------------------------------\r
-\r
-(This section is mostly for my benefit, so I can remember what I did.\r
-You don't need to read it if you just want to use this package. It\r
-might be useful to read it if you change the Fortran sources and want\r
-to recreate a usable library of C sources. -- Andy)\r
-\r
-These C sources were created automatically from the Fortran sources\r
-using f2c, for the most part. Listed below are the extra\r
-modifications that were made after this automatic conversion. Many of\r
-them were made so that it was not necessary to install f2c in order to\r
-use this LPC-10 coder.\r
-\r
-1.\r
-\r
-Put all of those files that were necessary for only the coder, rather\r
-than an application that uses the coder, into this subdirectory called\r
-lpc10.\r
-\r
-2.\r
-\r
-Copied f2c.h from the f2c distribution into this subdirectory. Some\r
-modifications were made to the "typedef" statements in this file, to\r
-explicitly indicate the sizes (in bits) that different integer types\r
-should be. The types INT32 and INT16 must be defined in a file called\r
-lpc10.h in the directory above. Created the file f2clib.c, containing\r
-only the functions pow_ii(), r_sign(), and i_nint() from the f2c\r
-library.\r
-\r
-3.\r
-\r
-The f2c output originally had a file called contrl_com.c, that defined\r
-a small structure containing a few variables that were used in many\r
-different functions of the LPC10 code. Every file containing\r
-functions that used it defined it as "extern", while contrl_com.c\r
-actually allocated storage for the structure. Bill Dorsey, one of the\r
-lead developers of Nautilus, said that the Microsoft C compiler had\r
-problems either compiling this file, or linking it with all of the\r
-other compiled files, so he just eliminated that file and removed the\r
-"extern" keyword from the one of the files that declared it that way.\r
-The file chosen (arbitrarily) was analys.c.\r
-\r
-4.\r
-\r
-Copied the makefiles for Unix and Microsoft C from the Nautilus v1.5a\r
-distribution into the lpc10 directory. Modified them to take out\r
-references to Nautilus. These makefiles don't create an executable,\r
-but a library of compiled functions called liblpc10.a (Unix) or\r
-LPC10.LIB (DOS). This library can be used when linking an executable\r
-that calls the functions lpcini_(), lpcenc_(), and lpcdec_().\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.16 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.15 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.2 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:16:01 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:29:08 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int analys_(real *speech, integer *voice, integer *pitch, real *rms, real *rc, struct lpc10_encoder_state *st);\r
-/* comlen contrl_ 12 */\r
-/*:ref: preemp_ 14 5 6 6 4 6 6 */\r
-/*:ref: onset_ 14 7 6 4 4 4 4 4 4 */\r
-/*:ref: placev_ 14 11 4 4 4 4 4 4 4 4 4 4 4 */\r
-/*:ref: lpfilt_ 14 4 6 6 4 4 */\r
-/*:ref: ivfilt_ 14 5 6 6 4 4 6 */\r
-/*:ref: tbdm_ 14 8 6 4 4 4 6 4 4 4 */\r
-/*:ref: voicin_ 14 12 4 6 6 4 4 6 6 4 6 4 4 4 */\r
-/*:ref: dyptrk_ 14 6 6 4 4 4 4 4 */\r
-/*:ref: placea_ 14 9 4 4 4 4 4 4 4 4 4 */\r
-/*:ref: dcbias_ 14 3 4 6 6 */\r
-/*:ref: energy_ 14 3 4 6 6 */\r
-/*:ref: mload_ 14 6 4 4 4 6 6 6 */\r
-/*:ref: invert_ 14 4 4 6 6 6 */\r
-/*:ref: rcchk_ 14 3 4 6 6 */\r
-/*:ref: initonset_ 14 0 */\r
-/*:ref: initvoicin_ 14 0 */\r
-/*:ref: initdyptrk_ 14 0 */\r
-/* Rerunning f2c -P may change prototypes or declarations. */\r
-#endif\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* Table of constant values */\r
-\r
-static integer c__10 = 10;\r
-static integer c__181 = 181;\r
-static integer c__720 = 720;\r
-static integer c__3 = 3;\r
-static integer c__90 = 90;\r
-static integer c__156 = 156;\r
-static integer c__307 = 307;\r
-static integer c__462 = 462;\r
-static integer c__312 = 312;\r
-static integer c__60 = 60;\r
-static integer c__1 = 1;\r
-\r
-/* ****************************************************************** */\r
-\r
-/* ANALYS Version 55 */\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:16:01 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:29:08 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.9 1996/05/23 19:41:07 jaf */\r
-/* Commented out some unnecessary lines that were reading uninitialized */\r
-/* values. */\r
-\r
-/* Revision 1.8 1996/03/27 23:57:55 jaf */\r
-/* Added some comments about which indices of the local buffers INBUF, */\r
-/* LPBUF, etc., get read or modified by some of the subroutine calls. I */\r
-/* just did this while trying to figure out the discrepancy between the */\r
-/* embedded code compiled with all local variables implicitly saved, and */\r
-/* without. */\r
-\r
-/* I added some debugging write statements in hopes of finding a problem. */\r
-/* None of them ever printed anything while running with the long input */\r
-/* speech file dam9.spd provided in the distribution. */\r
-\r
-/* Revision 1.7 1996/03/27 18:06:20 jaf */\r
-/* Commented out access to MAXOSP, which is just a debugging variable */\r
-/* that was defined in the COMMON block CONTRL in contrl.fh. */\r
-\r
-/* Revision 1.6 1996/03/26 19:31:33 jaf */\r
-/* Commented out trace statements. */\r
-\r
-/* Revision 1.5 1996/03/21 15:19:35 jaf */\r
-/* Added comments for ENTRY PITDEC. */\r
-\r
-/* Revision 1.4 1996/03/19 20:54:27 jaf */\r
-/* Added a line to INITANALYS. See comments there. */\r
-\r
-/* Revision 1.3 1996/03/19 20:52:49 jaf */\r
-/* Rearranged the order of the local variables quite a bit, to separate */\r
-/* them into groups of "constants", "locals that don't need to be saved */\r
-/* from one call to the next", and "local that do need to be saved from */\r
-/* one call to the next". */\r
-\r
-/* Several locals in the last set should have been given initial values, */\r
-/* but weren't. I gave them all initial values of 0. */\r
-\r
-/* Added a separate ENTRY INITANALYS that initializes all local state */\r
-/* that should be, and also calls the corresponding entries of the */\r
-/* subroutines called by ANALYS that also have local state. */\r
-\r
-/* There used to be DATA statements in ANALYS. I got rid of most of */\r
-/* them, and added a local logical variable FIRST that calls the entry */\r
-/* INITANALYS on the first call to ANALYS. This is just so that one need */\r
-/* not remember to call INITANALYS first in order for the state to be */\r
-/* initialized. */\r
-\r
-/* Revision 1.2 1996/03/11 23:29:32 jaf */\r
-/* Added several comments with my own personal questions about the */\r
-/* Fortran 77 meaning of the parameters passed to the subroutine PREEMP. */\r
-\r
-/* Revision 1.1 1996/02/07 14:42:29 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ****************************************************************** */\r
-\r
-/* SUBROUTINE ANALYS */\r
-\r
-/* Input: */\r
-/* SPEECH */\r
-/* Indices 1 through LFRAME read. */\r
-/* Output: */\r
-/* VOICE */\r
-/* Indices 1 through 2 written. */\r
-/* PITCH */\r
-/* Written in subroutine DYPTRK, and then perhaps read and written */\r
-/* some more. */\r
-/* RMS */\r
-/* Written. */\r
-/* RC */\r
-/* Indices 1 through ORDER written (ORDER defined in contrl.fh). */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITANALYS. */\r
-\r
-\r
-/* ENTRY PITDEC */\r
-\r
-/* Input: */\r
-/* PITCH - Encoded pitch index */\r
-/* Output: */\r
-/* PTAU - Decoded pitch period */\r
-\r
-/* This entry has no local state. It accesses a "constant" array */\r
-/* declared in ANALYS. */\r
-\r
-/* Subroutine */ int analys_(real *speech, integer *voice, integer \r
- *pitch, real *rms, real *rc, struct lpc10_encoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- static integer tau[60] = { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,\r
- 35,36,37,38,39,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,\r
- 74,76,78,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,\r
- 140,144,148,152,156 };\r
- static integer buflim[4] = { 181,720,25,720 };\r
- static real precoef = .9375f;\r
-\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- real amdf[60];\r
- integer half;\r
- real abuf[156];\r
- real *bias;\r
- extern /* Subroutine */ int tbdm_(real *, integer *, integer *, integer *,\r
- real *, integer *, integer *, integer *);\r
- integer *awin;\r
- integer midx, ewin[6] /* was [2][3] */;\r
- real ivrc[2], temp;\r
- real *zpre;\r
- integer *vwin;\r
- integer i__, j, lanal;\r
- extern /* Subroutine */ int rcchk_(integer *, real *, real *), mload_(\r
- integer *, integer *, integer *, real *, real *, real *);\r
- real *inbuf, *pebuf;\r
- real *lpbuf, *ivbuf;\r
- real *rcbuf;\r
- integer *osbuf;\r
- extern /* Subroutine */ int onset_(real *, integer *, integer *, integer *\r
- , integer *, integer *, integer *, struct lpc10_encoder_state *);\r
- integer *osptr;\r
- extern int dcbias_(integer *, real *, real *);\r
- integer ipitch;\r
- integer *obound;\r
- extern /* Subroutine */ int preemp_(real *, real *, integer *, real *, \r
- real *), voicin_(integer *, real *, real *, integer *, integer *, \r
- real *, real *, integer *, real *, integer *, integer *, integer *,\r
- struct lpc10_encoder_state *);\r
- integer *voibuf;\r
- integer mintau;\r
- real *rmsbuf;\r
- extern /* Subroutine */ int lpfilt_(real *, real *, integer *, integer *),\r
- ivfilt_(real *, real *, integer *, integer *, real *), energy_(\r
- integer *, real *, real *), invert_(integer *, real *, real *, \r
- real *);\r
- integer minptr, maxptr;\r
- extern /* Subroutine */ int dyptrk_(real *, integer *, integer *, integer \r
- *, integer *, integer *, struct lpc10_encoder_state *);\r
- real phi[100] /* was [10][10] */, psi[10];\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:16:01 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:29:08 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Arguments to ANALYS */\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:16:01 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:29:08 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Arguments to entry PITDEC (below) */\r
-/* Parameters/constants */\r
-/* Constants */\r
-/* NF = Number of frames */\r
-/* AF = Frame in which analysis is done */\r
-/* OSLEN = Length of the onset buffer */\r
-/* LTAU = Number of pitch lags */\r
-/* SBUFL, SBUFH = Start and end index of speech buffers */\r
-/* LBUFL, LBUFH = Start and end index of LPF speech buffer */\r
-/* MINWIN, MAXWIN = Min and Max length of voicing (and analysis) windows\r
-*/\r
-/* PWLEN, PWINH, PWINL = Length, upper and lower limits of pitch window\r
- */\r
-/* DVWINL, DVWINH = Default lower and upper limits of voicing window */\r
-/* The tables TAU and BUFLIM, and the variable PRECOEF, are not */\r
-/* Fortran PARAMETER's, but they are initialized with DATA */\r
-/* statements, and never modified. Thus, they need not have SAVE */\r
-/* statements for them to keep their values from one invocation to \r
-*/\r
-/* the next. */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* Data Buffers */\r
-/* INBUF Raw speech (with DC bias removed each frame) */\r
-/* PEBUF Preemphasized speech */\r
-/* LPBUF Low pass speech buffer */\r
-/* IVBUF Inverse filtered speech */\r
-/* OSBUF Indexes of onsets in speech buffers */\r
-/* VWIN Voicing window indices */\r
-/* AWIN Analysis window indices */\r
-/* EWIN Energy window indices */\r
-/* VOIBUF Voicing decisions on windows in VWIN */\r
-/* RMSBUF RMS energy */\r
-/* RCBUF Reflection Coefficients */\r
-\r
-/* Pitch is handled separately from the above parameters. */\r
-/* The following variables deal with pitch: */\r
-/* MIDX Encoded initial pitch estimate for analysis frame */\r
-/* IPITCH Initial pitch computed for frame AF (decoded from MIDX) */\r
-/* PITCH The encoded pitch value (index into TAU) for the present */\r
-/* frame (delayed and smoothed by Dyptrack) */\r
- /* Parameter adjustments */\r
- if (speech) {\r
- --speech;\r
- }\r
- if (voice) {\r
- --voice;\r
- }\r
- if (rc) {\r
- --rc;\r
- }\r
-\r
- /* Function Body */\r
-\r
-/* Calculations are done on future frame due to requirements */\r
-/* of the pitch tracker. Delay RMS and RC's 2 frames to give */\r
-/* current frame parameters on return. */\r
-/* Update all buffers */\r
-\r
- inbuf = &(st->inbuf[0]);\r
- pebuf = &(st->pebuf[0]);\r
- lpbuf = &(st->lpbuf[0]);\r
- ivbuf = &(st->ivbuf[0]);\r
- bias = &(st->bias);\r
- osbuf = &(st->osbuf[0]);\r
- osptr = &(st->osptr);\r
- obound = &(st->obound[0]);\r
- vwin = &(st->vwin[0]);\r
- awin = &(st->awin[0]);\r
- voibuf = &(st->voibuf[0]);\r
- rmsbuf = &(st->rmsbuf[0]);\r
- rcbuf = &(st->rcbuf[0]);\r
- zpre = &(st->zpre);\r
-\r
- i__1 = 720 - contrl_1.lframe;\r
- for (i__ = 181; i__ <= i__1; ++i__) {\r
- inbuf[i__ - 181] = inbuf[contrl_1.lframe + i__ - 181];\r
- pebuf[i__ - 181] = pebuf[contrl_1.lframe + i__ - 181];\r
- }\r
- i__1 = 540 - contrl_1.lframe;\r
- for (i__ = 229; i__ <= i__1; ++i__) {\r
- ivbuf[i__ - 229] = ivbuf[contrl_1.lframe + i__ - 229];\r
- }\r
- i__1 = 720 - contrl_1.lframe;\r
- for (i__ = 25; i__ <= i__1; ++i__) {\r
- lpbuf[i__ - 25] = lpbuf[contrl_1.lframe + i__ - 25];\r
- }\r
- j = 1;\r
- i__1 = (*osptr) - 1;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- if (osbuf[i__ - 1] > contrl_1.lframe) {\r
- osbuf[j - 1] = osbuf[i__ - 1] - contrl_1.lframe;\r
- ++j;\r
- }\r
- }\r
- *osptr = j;\r
- voibuf[0] = voibuf[2];\r
- voibuf[1] = voibuf[3];\r
- for (i__ = 1; i__ <= 2; ++i__) {\r
- vwin[(i__ << 1) - 2] = vwin[((i__ + 1) << 1) - 2] - contrl_1.lframe;\r
- vwin[(i__ << 1) - 1] = vwin[((i__ + 1) << 1) - 1] - contrl_1.lframe;\r
- awin[(i__ << 1) - 2] = awin[((i__ + 1) << 1) - 2] - contrl_1.lframe;\r
- awin[(i__ << 1) - 1] = awin[((i__ + 1) << 1) - 1] - contrl_1.lframe;\r
-/* EWIN(*,J) is unused for J .NE. AF, so the following shift is \r
-*/\r
-/* unnecessary. It also causes error messages when the C versio\r
-n */\r
-/* of the code created from this by f2c is run with Purify. It \r
-*/\r
-/* correctly complains that uninitialized memory is being read. \r
-*/\r
-/* EWIN(1,I) = EWIN(1,I+1) - LFRAME */\r
-/* EWIN(2,I) = EWIN(2,I+1) - LFRAME */\r
- obound[i__ - 1] = obound[i__];\r
- voibuf[i__ * 2] = voibuf[(i__ + 1) * 2];\r
- voibuf[(i__ << 1) + 1] = voibuf[((i__ + 1) << 1) + 1];\r
- rmsbuf[i__ - 1] = rmsbuf[i__];\r
- i__1 = contrl_1.order;\r
- for (j = 1; j <= i__1; ++j) {\r
- rcbuf[j + i__ * 10 - 11] = rcbuf[j + (i__ + 1) * 10 - 11];\r
- }\r
- }\r
-/* Copy input speech, scale to sign+12 bit integers */\r
-/* Remove long term DC bias. */\r
-/* If the average value in the frame was over 1/4096 (after current \r
-*/\r
-/* BIAS correction), then subtract that much more from samples in */\r
-/* next frame. If the average value in the frame was under */\r
-/* -1/4096, add 1/4096 more to samples in next frame. In all other \r
-*/\r
-/* cases, keep BIAS the same. */\r
- temp = 0.f;\r
- i__1 = contrl_1.lframe;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- inbuf[720 - contrl_1.lframe + i__ - 181] = speech[i__] * 4096.f - \r
- (*bias);\r
- temp += inbuf[720 - contrl_1.lframe + i__ - 181];\r
- }\r
- if (temp > (real) contrl_1.lframe) {\r
- *bias += 1;\r
- }\r
- if (temp < (real) (-contrl_1.lframe)) {\r
- *bias += -1;\r
- }\r
-/* Place Voicing Window */\r
- i__ = 721 - contrl_1.lframe;\r
- preemp_(&inbuf[i__ - 181], &pebuf[i__ - 181], &contrl_1.lframe, &precoef, \r
- zpre);\r
- onset_(pebuf, osbuf, osptr, &c__10, &c__181, &c__720, &contrl_1.lframe, st);\r
-\r
-/* MAXOSP is just a debugging variable. */\r
-\r
-/* MAXOSP = MAX( MAXOSP, OSPTR ) */\r
-\r
- placev_(osbuf, osptr, &c__10, &obound[2], vwin, &c__3, &contrl_1.lframe, \r
- &c__90, &c__156, &c__307, &c__462);\r
-/* The Pitch Extraction algorithm estimates the pitch for a frame \r
-*/\r
-/* of speech by locating the minimum of the average magnitude difference\r
- */\r
-/* function (AMDF). The AMDF operates on low-pass, inverse filtered */\r
-/* speech. (The low-pass filter is an 800 Hz, 19 tap, equiripple, FIR \r
-*/\r
-/* filter and the inverse filter is a 2nd-order LPC filter.) The pitch \r
-*/\r
-/* estimate is later refined by dynamic programming (DYPTRK). However, \r
-*/\r
-/* since some of DYPTRK's parameters are a function of the voicing */\r
-/* decisions, a voicing decision must precede the final pitch estimation.\r
-*/\r
-/* See subroutines LPFILT, IVFILT, and TBDM. */\r
-/* LPFILT reads indices LBUFH-LFRAME-29 = 511 through LBUFH = 720 */\r
-/* of INBUF, and writes indices LBUFH+1-LFRAME = 541 through LBUFH \r
-*/\r
-/* = 720 of LPBUF. */\r
- lpfilt_(&inbuf[228], &lpbuf[384], &c__312, &contrl_1.lframe);\r
-/* IVFILT reads indices (PWINH-LFRAME-7) = 353 through PWINH = 540 \r
-*/\r
-/* of LPBUF, and writes indices (PWINH-LFRAME+1) = 361 through */\r
-/* PWINH = 540 of IVBUF. */\r
- ivfilt_(&lpbuf[204], ivbuf, &c__312, &contrl_1.lframe, ivrc);\r
-/* TBDM reads indices PWINL = 229 through */\r
-/* (PWINL-1)+MAXWIN+(TAU(LTAU)-TAU(1))/2 = 452 of IVBUF, and writes \r
-*/\r
-/* indices 1 through LTAU = 60 of AMDF. */\r
- tbdm_(ivbuf, &c__156, tau, &c__60, amdf, &minptr, &maxptr, &mintau);\r
-/* Voicing decisions are made for each half frame of input speech. \r
-*/\r
-/* An initial voicing classification is made for each half of the */\r
-/* analysis frame, and the voicing decisions for the present frame */\r
-/* are finalized. See subroutine VOICIN. */\r
-/* The voicing detector (VOICIN) classifies the input signal as */\r
-/* unvoiced (including silence) or voiced using the AMDF windowed */\r
-/* maximum-to-minimum ratio, the zero crossing rate, energy measures, */\r
-/* reflection coefficients, and prediction gains. */\r
-/* The pitch and voicing rules apply smoothing and isolated */\r
-/* corrections to the pitch and voicing estimates and, in the process, \r
-*/\r
-/* introduce two frames of delay into the corrected pitch estimates and \r
-*/\r
-/* voicing decisions. */\r
- for (half = 1; half <= 2; ++half) {\r
- voicin_(&vwin[4], inbuf, lpbuf, buflim, &half, &amdf[minptr - 1], &\r
- amdf[maxptr - 1], &mintau, ivrc, obound, voibuf, &c__3, st);\r
- }\r
-/* Find the minimum cost pitch decision over several frames */\r
-/* given the current voicing decision and the AMDF array */\r
- dyptrk_(amdf, &c__60, &minptr, &voibuf[7], pitch, &midx, st);\r
- ipitch = tau[midx - 1];\r
-/* Place spectrum analysis and energy windows */\r
- placea_(&ipitch, voibuf, &obound[2], &c__3, vwin, awin, ewin, &\r
- contrl_1.lframe, &c__156);\r
-/* Remove short term DC bias over the analysis window, Put result in ABUF\r
-*/\r
- lanal = awin[5] + 1 - awin[4];\r
- dcbias_(&lanal, &pebuf[awin[4] - 181], abuf);\r
-/* ABUF(1:LANAL) is now defined. It is equal to */\r
-/* PEBUF(AWIN(1,AF):AWIN(2,AF)) corrected for short term DC bias. */\r
-/* Compute RMS over integer number of pitch periods within the */\r
-/* analysis window. */\r
-/* Note that in a hardware implementation this computation may be */\r
-/* simplified by using diagonal elements of PHI computed by MLOAD. */\r
- i__1 = ewin[5] - ewin[4] + 1;\r
- energy_(&i__1, &abuf[ewin[4] - awin[4]], &rmsbuf[2]);\r
-/* Matrix load and invert, check RC's for stability */\r
- mload_(&contrl_1.order, &c__1, &lanal, abuf, phi, psi);\r
- invert_(&contrl_1.order, phi, psi, &rcbuf[20]);\r
- rcchk_(&contrl_1.order, &rcbuf[10], &rcbuf[20]);\r
-/* Set return parameters */\r
- voice[1] = voibuf[2];\r
- voice[2] = voibuf[3];\r
- *rms = rmsbuf[0];\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- rc[i__] = rcbuf[i__ - 1];\r
- }\r
- return 0;\r
-} /* analys_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:18:55 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:58 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int bsynz_(real *coef, integer *ip, integer *iv, real *sout, real *rms, real *ratio, real *g2pass, struct lpc10_decoder_state *st);\r
-/* comlen contrl_ 12 */\r
-/*:ref: random_ 4 0 */\r
-#endif\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* ***************************************************************** */\r
-\r
-/* BSYNZ Version 54 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:18:55 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:58 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.4 1996/03/27 18:11:22 jaf */\r
-/* Changed the range of NOISE printed out in the debugging statements, */\r
-/* even though they are commented out. I didn't discover this until I */\r
-/* tried comparing two different versions of the LPC-10 coder, each with */\r
-/* full tracing enabled. */\r
-\r
-/* Revision 1.3 1996/03/26 19:33:23 jaf */\r
-/* Commented out trace statements. */\r
-\r
-/* Revision 1.2 1996/03/20 17:12:54 jaf */\r
-/* Added comments about which indices of array arguments are read or */\r
-/* written. */\r
-\r
-/* Rearranged local variable declarations to indicate which need to be */\r
-/* saved from one invocation to the next. Added entry INITBSYNZ to */\r
-/* reinitialize the local state variables, if desired. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:15 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Synthesize One Pitch Epoch */\r
-\r
-/* Input: */\r
-/* COEF - Predictor coefficients */\r
-/* Indices 1 through ORDER read. */\r
-/* IP - Pitch period (number of samples to synthesize) */\r
-/* IV - Voicing for the current epoch */\r
-/* RMS - Energy for the current epoch */\r
-/* RATIO - Energy slope for plosives */\r
-/* G2PASS- Sharpening factor for 2 pass synthesis */\r
-/* Output: */\r
-/* SOUT - Synthesized speech */\r
-/* Indices 1 through IP written. */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITBSYNZ. */\r
-\r
-/* Subroutine */ int bsynz_(real *coef, integer *ip, integer *iv, \r
- real *sout, real *rms, real *ratio, real *g2pass,\r
- struct lpc10_decoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- integer *ipo;\r
- real *rmso;\r
- static integer kexc[25] = { 8,-16,26,-48,86,-162,294,-502,718,-728,184,\r
- 672,-610,-672,184,728,718,502,294,162,86,48,26,16,8 };\r
- real *exc;\r
- real *exc2;\r
- real *lpi1;\r
- real *lpi2;\r
- real *lpi3;\r
- real *hpi1;\r
- real *hpi2;\r
- real *hpi3;\r
-\r
- /* System generated locals */\r
- integer i__1, i__2;\r
- real r__1, r__2;\r
-\r
- /* Builtin functions */\r
- double sqrt(doublereal);\r
-\r
- /* Local variables */\r
- real gain, xssq;\r
- integer i__, j, k;\r
- real noise[166], pulse;\r
- integer px;\r
- real sscale;\r
- extern integer random_(struct lpc10_decoder_state *);\r
- real xy, sum, ssq;\r
- real lpi0, hpi0;\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:18:55 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:58 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:18:55 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:58 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Function return value definitions */\r
-/* Parameters/constants */\r
-/* KEXC is not a Fortran PARAMETER, but it is an array initialized \r
-*/\r
-/* with a DATA statement that is never modified. */\r
-/* Local variables that need not be saved */\r
-/* NOISE is declared with range (1:MAXPIT+MAXORD), but only indices \r
-*/\r
-/* ORDER+1 through ORDER+IP are ever used, and I think that IP */\r
-/* .LE. MAXPIT. Why not declare it to be in the range (1:MAXPIT) */\r
-/* and use that range? */\r
-/* Local state */\r
-/* I believe that only indices 1 through ORDER of EXC need to be */\r
-/* saved from one invocation to the next, but we may as well save */\r
-/* the whole array. */\r
-/* None of these local variables were given initial values in the */\r
-/* original code. I'm guessing that 0 is a reasonable initial */\r
-/* value for all of them. */\r
- /* Parameter adjustments */\r
- if (coef) {\r
- --coef;\r
- }\r
- if (sout) {\r
- --sout;\r
- }\r
-\r
- /* Function Body */\r
- ipo = &(st->ipo);\r
- exc = &(st->exc[0]);\r
- exc2 = &(st->exc2[0]);\r
- lpi1 = &(st->lpi1);\r
- lpi2 = &(st->lpi2);\r
- lpi3 = &(st->lpi3);\r
- hpi1 = &(st->hpi1);\r
- hpi2 = &(st->hpi2);\r
- hpi3 = &(st->hpi3);\r
- rmso = &(st->rmso_bsynz);\r
-\r
-/* MAXPIT+MAXORD=166 */\r
-/* Calculate history scale factor XY and scale filter state */\r
-/* Computing MIN */\r
- r__1 = *rmso / (*rms + 1e-6f);\r
- xy = min(r__1,8.f);\r
- *rmso = *rms;\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- exc2[i__ - 1] = exc2[*ipo + i__ - 1] * xy;\r
- }\r
- *ipo = *ip;\r
- if (*iv == 0) {\r
-/* Generate white noise for unvoiced */\r
- i__1 = *ip;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- exc[contrl_1.order + i__ - 1] = (real) (random_(st) / 64);\r
- }\r
-/* Impulse doublet excitation for plosives */\r
-/* (RANDOM()+32768) is in the range 0 to 2**16-1. Therefore the\r
- */\r
-/* following expression should be evaluated using integers with \r
-at */\r
-/* least 32 bits (16 isn't enough), and PX should be in the rang\r
-e */\r
-/* ORDER+1+0 through ORDER+1+(IP-2) .EQ. ORDER+IP-1. */\r
- px = (random_(st) + 32768) * (*ip - 1) / 65536 + contrl_1.order + 1;\r
- r__1 = *ratio / 4 * 1.f;\r
- pulse = r__1 * 342;\r
- if (pulse > 2e3f) {\r
- pulse = 2e3f;\r
- }\r
- exc[px - 1] += pulse;\r
- exc[px] -= pulse;\r
-/* Load voiced excitation */\r
- } else {\r
- sscale = sqrt((real) (*ip)) / 6.928f;\r
- i__1 = *ip;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- exc[contrl_1.order + i__ - 1] = 0.f;\r
- if (i__ <= 25) {\r
- exc[contrl_1.order + i__ - 1] = sscale * kexc[i__ - 1];\r
- }\r
- lpi0 = exc[contrl_1.order + i__ - 1];\r
- r__2 = exc[contrl_1.order + i__ - 1] * .125f + *lpi1 * .75f;\r
- r__1 = r__2 + *lpi2 * .125f;\r
- exc[contrl_1.order + i__ - 1] = r__1 + *lpi3 * 0.f;\r
- *lpi3 = *lpi2;\r
- *lpi2 = *lpi1;\r
- *lpi1 = lpi0;\r
- }\r
- i__1 = *ip;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- noise[contrl_1.order + i__ - 1] = random_(st) * 1.f / 64;\r
- hpi0 = noise[contrl_1.order + i__ - 1];\r
- r__2 = noise[contrl_1.order + i__ - 1] * -.125f + *hpi1 * .25f;\r
- r__1 = r__2 + *hpi2 * -.125f;\r
- noise[contrl_1.order + i__ - 1] = r__1 + *hpi3 * 0.f;\r
- *hpi3 = *hpi2;\r
- *hpi2 = *hpi1;\r
- *hpi1 = hpi0;\r
- }\r
- i__1 = *ip;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- exc[contrl_1.order + i__ - 1] += noise[contrl_1.order + i__ - 1];\r
- }\r
- }\r
-/* Synthesis filters: */\r
-/* Modify the excitation with all-zero filter 1 + G*SUM */\r
- xssq = 0.f;\r
- i__1 = *ip;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- k = contrl_1.order + i__;\r
- sum = 0.f;\r
- i__2 = contrl_1.order;\r
- for (j = 1; j <= i__2; ++j) {\r
- sum += coef[j] * exc[k - j - 1];\r
- }\r
- sum *= *g2pass;\r
- exc2[k - 1] = sum + exc[k - 1];\r
- }\r
-/* Synthesize using the all pole filter 1 / (1 - SUM) */\r
- i__1 = *ip;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- k = contrl_1.order + i__;\r
- sum = 0.f;\r
- i__2 = contrl_1.order;\r
- for (j = 1; j <= i__2; ++j) {\r
- sum += coef[j] * exc2[k - j - 1];\r
- }\r
- exc2[k - 1] = sum + exc2[k - 1];\r
- xssq += exc2[k - 1] * exc2[k - 1];\r
- }\r
-/* Save filter history for next epoch */\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- exc[i__ - 1] = exc[*ip + i__ - 1];\r
- exc2[i__ - 1] = exc2[*ip + i__ - 1];\r
- }\r
-/* Apply gain to match RMS */\r
- r__1 = *rms * *rms;\r
- ssq = r__1 * *ip;\r
- gain = sqrt(ssq / xssq);\r
- i__1 = *ip;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- sout[i__] = gain * exc2[contrl_1.order + i__ - 1];\r
- }\r
- return 0;\r
-} /* bsynz_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:20:24 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Revision 1.1 1996/08/19 22:40:31 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-/* *********************************************************************** */\r
-\r
-/* CHANL Version 49 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:20:24 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Revision 1.1 1996/08/19 22:40:31 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/21 15:14:57 jaf */\r
-/* Added comments about which indices of argument arrays are read or */\r
-/* written, and about the one bit of local state in CHANWR. CHANRD */\r
-/* has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 18:55:10 jaf */\r
-/* Comments added explaining which of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next, and which */\r
-/* do not. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:31 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* *********************************************************************** */\r
-\r
-/* CHANWR: */\r
-/* Place quantized parameters into bitstream */\r
-\r
-/* Input: */\r
-/* ORDER - Number of reflection coefficients (not really variable) */\r
-/* IPITV - Quantized pitch/voicing parameter */\r
-/* IRMS - Quantized energy parameter */\r
-/* IRC - Quantized reflection coefficients */\r
-/* Indices 1 through ORDER read. */\r
-/* Output: */\r
-/* IBITS - Serial bitstream */\r
-/* Indices 1 through 54 written. */\r
-/* Bit 54, the SYNC bit, alternates from one call to the next. */\r
-\r
-/* Subroutine CHANWR maintains one bit of local state from one call to */\r
-/* the next, in the variable ISYNC. I believe that this one bit is only */\r
-/* intended to allow a receiver to resynchronize its interpretation of */\r
-/* the bit stream, by looking for which of the 54 bits alternates every */\r
-/* frame time. This is just a simple framing mechanism that is not */\r
-/* useful when other, higher overhead framing mechanisms are used to */\r
-/* transmit the coded frames. */\r
-\r
-/* I'm not going to make an entry to reinitialize this bit, since it */\r
-/* doesn't help a receiver much to know whether the first sync bit is a 0 */\r
-/* or a 1. It needs to examine several frames in sequence to have */\r
-/* reasonably good assurance that its framing is correct. */\r
-\r
-\r
-/* CHANRD: */\r
-/* Reconstruct parameters from bitstream */\r
-\r
-/* Input: */\r
-/* ORDER - Number of reflection coefficients (not really variable) */\r
-/* IBITS - Serial bitstream */\r
-/* Indices 1 through 53 read (SYNC bit is ignored). */\r
-/* Output: */\r
-/* IPITV - Quantized pitch/voicing parameter */\r
-/* IRMS - Quantized energy parameter */\r
-/* IRC - Quantized reflection coefficients */\r
-/* Indices 1 through ORDER written */\r
-\r
-/* Entry CHANRD has no local state. */\r
-\r
-\r
-\r
-/* IBITS is 54 bits of LPC data ordered as follows: */\r
-/* R1-0, R2-0, R3-0, P-0, A-0, */\r
-/* R1-1, R2-1, R3-1, P-1, A-1, */\r
-/* R1-2, R4-0, R3-2, A-2, P-2, R4-1, */\r
-/* R1-3, R2-2, R3-3, R4-2, A-3, */\r
-/* R1-4, R2-3, R3-4, R4-3, A-4, */\r
-/* P-3, R2-4, R7-0, R8-0, P-4, R4-4, */\r
-/* R5-0, R6-0, R7-1,R10-0, R8-1, */\r
-/* R5-1, R6-1, R7-2, R9-0, P-5, */\r
-/* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */\r
-/* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */\r
-/* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv, \r
- integer *irms, integer *irc, integer *ibits,\r
- struct lpc10_encoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- integer *isync;\r
- static integer bit[10] = { 2,4,8,8,8,8,16,16,16,16 };\r
- static integer iblist[53] = { 13,12,11,1,2,13,12,11,1,2,13,10,11,2,1,10,\r
- 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,\r
- 4,6,1,5,9,8,7,5,6 };\r
-\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- integer itab[13], i__;\r
-\r
-/* Arguments */\r
-/* Parameters/constants */\r
-/* These arrays are not Fortran PARAMETER's, but they are defined */\r
-/* by DATA statements below, and their contents are never altered. \r
-*/\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* ISYNC is only used by CHANWR, not by ENTRY CHANRD. */\r
-\r
- /* Parameter adjustments */\r
- --irc;\r
- --ibits;\r
-\r
- /* Function Body */\r
- switch(n__) {\r
- case 1: goto L_chanrd;\r
- }\r
-\r
- isync = &(st->isync);\r
-\r
-/* ***********************************************************************\r
- */\r
-/* Place quantized parameters into bitstream */\r
-/* ***********************************************************************\r
- */\r
-/* Place parameters into ITAB */\r
- itab[0] = *ipitv;\r
- itab[1] = *irms;\r
- itab[2] = 0;\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- itab[i__ + 2] = irc[*order + 1 - i__] & 32767;\r
- }\r
-/* Put 54 bits into IBITS array */\r
- for (i__ = 1; i__ <= 53; ++i__) {\r
- ibits[i__] = itab[iblist[i__ - 1] - 1] & 1;\r
- itab[iblist[i__ - 1] - 1] /= 2;\r
- }\r
- ibits[54] = *isync & 1;\r
- *isync = 1 - *isync;\r
- return 0;\r
-/* ***********************************************************************\r
- */\r
-/* Reconstruct parameters from bitstream */\r
-/* ***********************************************************************\r
- */\r
-\r
-L_chanrd:\r
-/* Reconstruct ITAB */\r
- for (i__ = 1; i__ <= 13; ++i__) {\r
- itab[i__ - 1] = 0;\r
- }\r
- for (i__ = 1; i__ <= 53; ++i__) {\r
- itab[iblist[54 - i__ - 1] - 1] = (itab[iblist[54 - i__ - 1] - 1] << 1)\r
- + ibits[54 - i__];\r
- }\r
-/* Sign extend RC's */\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- if ((itab[i__ + 2] & bit[i__ - 1]) != 0) {\r
- itab[i__ + 2] -= bit[i__ - 1] << 1;\r
- }\r
- }\r
-/* Restore variables */\r
- *ipitv = itab[0];\r
- *irms = itab[1];\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- irc[i__] = itab[*order + 4 - i__ - 1];\r
- }\r
- return 0;\r
-} /* chanwr_ */\r
-\r
-/* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms, \r
- integer *irc, integer *ibits, struct lpc10_encoder_state *st)\r
-{\r
- return chanwr_0_(0, order, ipitv, irms, irc, ibits, st);\r
- }\r
-\r
-/* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms, \r
- integer *irc, integer *ibits)\r
-{\r
- return chanwr_0_(1, order, ipitv, irms, irc, ibits, 0);\r
- }\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:40:23 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int dcbias_(integer *len, real *speech, real *sigout);\r
-#endif\r
-\r
-/* ********************************************************************* */\r
-\r
-/* DCBIAS Version 50 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:40:23 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/18 21:19:22 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 16:44:53 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:21 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Calculate and remove DC bias from buffer. */\r
-\r
-/* Input: */\r
-/* LEN - Length of speech buffers */\r
-/* SPEECH - Input speech buffer */\r
-/* Indices 1 through LEN read. */\r
-/* Output: */\r
-/* SIGOUT - Output speech buffer */\r
-/* Indices 1 through LEN written */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int dcbias_(integer *len, real *speech, real *sigout)\r
-{\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- real bias;\r
- integer i__;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
- /* Parameter adjustments */\r
- --sigout;\r
- --speech;\r
-\r
- /* Function Body */\r
- bias = 0.f;\r
- i__1 = *len;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- bias += speech[i__];\r
- }\r
- bias /= *len;\r
- i__1 = *len;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- sigout[i__] = speech[i__] - bias;\r
- }\r
- return 0;\r
-} /* dcbias_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.16 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.15 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.2 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:22:39 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:38 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int decode_(integer *ipitv, integer *irms, integer *irc, integer *voice, integer *pitch, real *rms, real *rc, struct lpc10_decoder_state *st);\r
-/* comlen contrl_ 12 */\r
-/*:ref: ham84_ 14 3 4 4 4 */\r
-/*:ref: median_ 4 3 4 4 4 */\r
-#endif\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* Table of constant values */\r
-\r
-static integer c__2 = 2;\r
-\r
-/* ***************************************************************** */\r
-\r
-/* DECODE Version 54 */\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:22:39 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:38 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.5 1996/05/23 20:06:03 jaf */\r
-/* Assigned PITCH a "default" value on the first call, since otherwise it */\r
-/* would be left uninitialized. */\r
-\r
-/* Revision 1.4 1996/03/26 19:35:18 jaf */\r
-/* Commented out trace statements. */\r
-\r
-/* Revision 1.3 1996/03/21 21:10:50 jaf */\r
-/* Added entry INITDECODE to reinitialize the local state of subroutine */\r
-/* DECODE. */\r
-\r
-/* Revision 1.2 1996/03/21 21:04:50 jaf */\r
-/* Determined which local variables should be saved from one invocation */\r
-/* to the next, and guessed initial values for some that should have been */\r
-/* saved, but weren't given initial values. Many of the arrays are */\r
-/* "constants", and many local variables are only used if the "global" */\r
-/* variable CORRP is .TRUE. */\r
-\r
-/* Added comments explaining which indices of array arguments are read or */\r
-/* written. */\r
-\r
-/* Revision 1.1 1996/02/12 03:21:10 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* This subroutine provides error correction and decoding */\r
-/* for all LPC parameters */\r
-\r
-/* Input: */\r
-/* IPITV - Index value of pitch */\r
-/* IRMS - Coded Energy */\r
-/* CORRP - Error correction: */\r
-/* If FALSE, parameters are decoded directly with no delay. If TRUE, */\r
-/* most important parameter bits are protected by Hamming code and */\r
-/* median smoothed. This requires an additional frame of delay. */\r
-/* Input/Output: */\r
-/* IRC - Coded Reflection Coefficients */\r
-/* Indices 1 through ORDER always read, then written. */\r
-/* Output: */\r
-/* VOICE - Half frame voicing decisions */\r
-/* Indices 1 through 2 written. */\r
-/* PITCH - Decoded pitch */\r
-/* RMS - Energy */\r
-/* RC - Reflection coefficients */\r
-/* Indices 1 through ORDER written. */\r
-\r
-/* NOTE: Zero RC's should be done more directly, but this would affect */\r
-/* coded parameter printout. */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITDECODE. */\r
-\r
-/* Subroutine */ int decode_(integer *ipitv, integer *irms, \r
- integer *irc, integer *voice, integer *pitch, real *rms, real *rc,\r
- struct lpc10_decoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- logical *first;\r
- static integer ethrs = 2048;\r
- static integer ethrs1 = 128;\r
- static integer ethrs2 = 1024;\r
- static integer ethrs3 = 2048;\r
- static integer ivtab[32] = { 24960,24960,24960,24960,25480,25480,25483,\r
- 25480,16640,1560,1560,1560,16640,1816,1563,1560,24960,24960,24859,\r
- 24856,26001,25881,25915,25913,1560,1560,7800,3640,1561,1561,3643,\r
- 3641 };\r
- static real corth[32] /* was [4][8] */ = { 32767.f,10.f,5.f,0.f,\r
- 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,\r
- 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,\r
- 3.2f,0.f };\r
- static integer detau[128] = { 0,0,0,3,0,3,3,31,0,3,3,21,3,3,29,30,0,3,3,\r
- 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,\r
- 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,\r
- 100,104,3,84,92,88,156,80,96,3,3,74,70,72,66,76,68,3,62,3,60,3,64,\r
- 3,3,1,3,116,132,112,148,152,3,3,140,3,136,3,144,3,3,1,124,120,128,\r
- 3,3,3,3,1,3,3,3,1,3,1,1,1 };\r
- static integer rmst[64] = { 1024,936,856,784,718,656,600,550,502,460,420,\r
- 384,352,328,294,270,246,226,206,188,172,158,144,132,120,110,102,\r
- 92,84,78,70,64,60,54,50,46,42,38,34,32,30,26,24,22,20,18,17,16,15,\r
- 14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };\r
- static integer detab7[32] = { 4,11,18,25,32,39,46,53,60,66,72,77,82,87,92,\r
- 96,101,104,108,111,114,115,117,119,121,122,123,124,125,126,127,\r
- 127 };\r
- static real descl[8] = { .6953f,.625f,.5781f,.5469f,.5312f,.5391f,.4688f,\r
- .3828f };\r
- integer *ivp2h;\r
- static integer deadd[8] = { 1152,-2816,-1536,-3584,-1280,-2432,768,-1920 }\r
- ;\r
- static integer qb[8] = { 511,511,1023,1023,1023,1023,2047,4095 };\r
- static integer nbit[10] = { 8,8,5,5,4,4,4,4,3,2 };\r
- static integer zrc[10] = { 0,0,0,0,0,3,0,2,0,0 };\r
- static integer bit[5] = { 2,4,8,16,32 };\r
- integer *iovoic;\r
- integer *iavgp;\r
- integer *iptold;\r
- integer *erate;\r
- integer *drc;\r
- integer *dpit;\r
- integer *drms;\r
-\r
- /* System generated locals */\r
- integer i__1, i__2;\r
-\r
- /* Builtin functions */\r
- integer pow_ii(integer *, integer *);\r
-\r
- /* Local variables */\r
- extern /* Subroutine */ int ham84_(integer *, integer *, integer *);\r
- integer ipit, iout, i__, icorf, index, ivoic, ixcor, i1, i2, i4;\r
- extern integer median_(integer *, integer *, integer *);\r
- integer ishift, errcnt, lsb;\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:22:39 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:38 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:22:39 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:38 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Function return value definitions */\r
-\r
-/* Parameters/constants */\r
-\r
-/* The variables below that are not Fortran PARAMETER's are */\r
-/* initialized with DATA statements, and then never modified. */\r
-/* The following are used regardless of CORRP's value. */\r
-\r
-/* DETAU, NBIT, QB, DEADD, DETAB7, RMST, DESCL */\r
-\r
-/* The following are used only if CORRP is .TRUE. */\r
-\r
-/* ETHRS, ETHRS1, ETHRS2, ETHRS3, IVTAB, BIT, CORTH, ZRC */\r
-\r
-/* Local variables that need not be saved */\r
-\r
-/* The following are used regardless of CORRP's value */\r
-/* The following are used only if CORRP is .TRUE. */\r
-\r
-/* Local state */\r
-\r
-/* The following are used regardless of CORRP's value */\r
-/* The following are used only if CORRP is .TRUE. */\r
-/* I am guessing the initial values for IVP2H, IOVOIC, DRC, DPIT, */\r
-/* and DRMS. They should be checked to see if they are reasonable. \r
-*/\r
-/* I'm also guessing for ERATE, but I think 0 is the right initial \r
-*/\r
-/* value. */\r
- /* Parameter adjustments */\r
- if (irc) {\r
- --irc;\r
- }\r
- if (voice) {\r
- --voice;\r
- }\r
- if (rc) {\r
- --rc;\r
- }\r
-\r
- /* Function Body */\r
-\r
- iptold = &(st->iptold);\r
- first = &(st->first);\r
- ivp2h = &(st->ivp2h);\r
- iovoic = &(st->iovoic);\r
- iavgp = &(st->iavgp);\r
- erate = &(st->erate);\r
- drc = &(st->drc[0]);\r
- dpit = &(st->dpit[0]);\r
- drms = &(st->drms[0]);\r
-\r
-/* DATA statements for "constants" defined above. */\r
-/* IF (LISTL.GE.3) WRITE(FDEBUG,800) IPITV,IRMS,(IRC(J),J=1,ORDER) */\r
-/* 800 FORMAT(1X,' <<ERRCOR IN>>',T32,6X,I6,I5,T50,10I8) */\r
-/* If no error correction, do pitch and voicing then jump to decode */\r
- i4 = detau[*ipitv];\r
- if (! contrl_1.corrp) {\r
- voice[1] = 1;\r
- voice[2] = 1;\r
- if (*ipitv <= 1) {\r
- voice[1] = 0;\r
- }\r
- if (*ipitv == 0 || *ipitv == 2) {\r
- voice[2] = 0;\r
- }\r
- *pitch = i4;\r
- if (*pitch <= 4) {\r
- *pitch = *iptold;\r
- }\r
- if (voice[1] == 1 && voice[2] == 1) {\r
- *iptold = *pitch;\r
- }\r
- if (voice[1] != voice[2]) {\r
- *pitch = *iptold;\r
- }\r
- goto L900;\r
- }\r
-/* Do error correction pitch and voicing */\r
- if (i4 > 4) {\r
- dpit[0] = i4;\r
- ivoic = 2;\r
- *iavgp = (*iavgp * 15 + i4 + 8) / 16;\r
- } else {\r
- ivoic = i4;\r
- dpit[0] = *iavgp;\r
- }\r
- drms[0] = *irms;\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- drc[i__ * 3 - 3] = irc[i__];\r
- }\r
-/* Determine index to IVTAB from V/UV decision */\r
-/* If error rate is high then use alternate table */\r
- index = (*ivp2h << 4) + (*iovoic << 2) + ivoic + 1;\r
- i1 = ivtab[index - 1];\r
- ipit = i1 & 3;\r
- icorf = i1 / 8;\r
- if (*erate < ethrs) {\r
- icorf /= 64;\r
- }\r
-/* Determine error rate: 4=high 1=low */\r
- ixcor = 4;\r
- if (*erate < ethrs3) {\r
- ixcor = 3;\r
- }\r
- if (*erate < ethrs2) {\r
- ixcor = 2;\r
- }\r
- if (*erate < ethrs1) {\r
- ixcor = 1;\r
- }\r
-/* Voice/unvoice decision determined from bits 0 and 1 of IVTAB */\r
- voice[1] = icorf / 2 & 1;\r
- voice[2] = icorf & 1;\r
-/* Skip decoding on first frame because present data not yet available */\r
- if (*first) {\r
- *first = FALSE_;\r
-/* Assign PITCH a "default" value on the first call, since */\r
-/* otherwise it would be left uninitialized. The two lines \r
-*/\r
-/* below were copied from above, since it seemed like a */\r
-/* reasonable thing to do for the first call. */\r
- *pitch = i4;\r
- if (*pitch <= 4) {\r
- *pitch = *iptold;\r
- }\r
- goto L500;\r
- }\r
-/* If bit 4 of ICORF is set then correct RMS and RC(1) - RC(4). */\r
-/* Determine error rate and correct errors using a Hamming 8,4 code */\r
-/* during transition or unvoiced frame. If IOUT is negative, */\r
-/* more than 1 error occurred, use previous frame's parameters. */\r
- if ((icorf & bit[3]) != 0) {\r
- errcnt = 0;\r
- lsb = drms[1] & 1;\r
- index = (drc[22] << 4) + drms[1] / 2;\r
- ham84_(&index, &iout, &errcnt);\r
- drms[1] = drms[2];\r
- if (iout >= 0) {\r
- drms[1] = (iout << 1) + lsb;\r
- }\r
- for (i__ = 1; i__ <= 4; ++i__) {\r
- if (i__ == 1) {\r
- i1 = ((drc[25] & 7) << 1) + (drc[28] & 1);\r
- } else {\r
- i1 = drc[(9 - i__) * 3 - 2] & 15;\r
- }\r
- i2 = drc[(5 - i__) * 3 - 2] & 31;\r
- lsb = i2 & 1;\r
- index = (i1 << 4) + i2 / 2;\r
- ham84_(&index, &iout, &errcnt);\r
- if (iout >= 0) {\r
- iout = (iout << 1) + lsb;\r
- if ((iout & 16) == 16) {\r
- iout += -32;\r
- }\r
- } else {\r
- iout = drc[(5 - i__) * 3 - 1];\r
- }\r
- drc[(5 - i__) * 3 - 2] = iout;\r
- }\r
-/* Determine error rate */\r
- *erate = *erate * .96875f + errcnt * 102;\r
- }\r
-/* Get unsmoothed RMS, RC's, and PITCH */\r
- *irms = drms[1];\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- irc[i__] = drc[i__ * 3 - 2];\r
- }\r
- if (ipit == 1) {\r
- dpit[1] = dpit[2];\r
- }\r
- if (ipit == 3) {\r
- dpit[1] = dpit[0];\r
- }\r
- *pitch = dpit[1];\r
-/* If bit 2 of ICORF is set then smooth RMS and RC's, */\r
- if ((icorf & bit[1]) != 0) {\r
- if ((i__1 = drms[1] - drms[0], (real) abs(i__1)) >= corth[ixcor + 3] \r
- && (i__2 = drms[1] - drms[2], (real) abs(i__2)) >= corth[\r
- ixcor + 3]) {\r
- *irms = median_(&drms[2], &drms[1], drms);\r
- }\r
- for (i__ = 1; i__ <= 6; ++i__) {\r
- if ((i__1 = drc[i__ * 3 - 2] - drc[i__ * 3 - 3], (real) abs(i__1))\r
- >= corth[ixcor + ((i__ + 2) << 2) - 5] && (i__2 = drc[i__ *\r
- 3 - 2] - drc[i__ * 3 - 1], (real) abs(i__2)) >= corth[\r
- ixcor + ((i__ + 2) << 2) - 5]) {\r
- irc[i__] = median_(&drc[i__ * 3 - 1], &drc[i__ * 3 - 2], &drc[\r
- i__ * 3 - 3]);\r
- }\r
- }\r
- }\r
-/* If bit 3 of ICORF is set then smooth pitch */\r
- if ((icorf & bit[2]) != 0) {\r
- if ((i__1 = dpit[1] - dpit[0], (real) abs(i__1)) >= corth[ixcor - 1] \r
- && (i__2 = dpit[1] - dpit[2], (real) abs(i__2)) >= corth[\r
- ixcor - 1]) {\r
- *pitch = median_(&dpit[2], &dpit[1], dpit);\r
- }\r
- }\r
-/* If bit 5 of ICORF is set then RC(5) - RC(10) are loaded with */\r
-/* values so that after quantization bias is removed in decode */\r
-/* the values will be zero. */\r
-L500:\r
- if ((icorf & bit[4]) != 0) {\r
- i__1 = contrl_1.order;\r
- for (i__ = 5; i__ <= i__1; ++i__) {\r
- irc[i__] = zrc[i__ - 1];\r
- }\r
- }\r
-/* House keeping - one frame delay */\r
- *iovoic = ivoic;\r
- *ivp2h = voice[2];\r
- dpit[2] = dpit[1];\r
- dpit[1] = dpit[0];\r
- drms[2] = drms[1];\r
- drms[1] = drms[0];\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- drc[i__ * 3 - 1] = drc[i__ * 3 - 2];\r
- drc[i__ * 3 - 2] = drc[i__ * 3 - 3];\r
- }\r
-L900:\r
-/* IF (LISTL.GE.3)WRITE(FDEBUG,801)VOICE,PITCH,IRMS,(IRC(J),J=1,ORDER) */\r
-/* 801 FORMAT(1X,'<<ERRCOR OUT>>',T32,2I3,I6,I5,T50,10I8) */\r
-/* Decode RMS */\r
- *irms = rmst[(31 - *irms) * 2];\r
-/* Decode RC(1) and RC(2) from log-area-ratios */\r
-/* Protect from illegal coded value (-16) caused by bit errors */\r
- for (i__ = 1; i__ <= 2; ++i__) {\r
- i2 = irc[i__];\r
- i1 = 0;\r
- if (i2 < 0) {\r
- i1 = 1;\r
- i2 = -i2;\r
- if (i2 > 15) {\r
- i2 = 0;\r
- }\r
- }\r
- i2 = detab7[i2 * 2];\r
- if (i1 == 1) {\r
- i2 = -i2;\r
- }\r
- ishift = 15 - nbit[i__ - 1];\r
- irc[i__] = i2 * pow_ii(&c__2, &ishift);\r
- }\r
-/* Decode RC(3)-RC(10) to sign plus 14 bits */\r
- i__1 = contrl_1.order;\r
- for (i__ = 3; i__ <= i__1; ++i__) {\r
- i2 = irc[i__];\r
- ishift = 15 - nbit[i__ - 1];\r
- i2 *= pow_ii(&c__2, &ishift);\r
- i2 += qb[i__ - 3];\r
- irc[i__] = i2 * descl[i__ - 3] + deadd[i__ - 3];\r
- }\r
-/* IF (LISTL.GE.3) WRITE(FDEBUG,811) IRMS, (IRC(I),I=1,ORDER) */\r
-/* 811 FORMAT(1X,'<<DECODE OUT>>',T45,I4,1X,10I8) */\r
-/* Scale RMS and RC's to reals */\r
- *rms = (real) (*irms);\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- rc[i__] = irc[i__] / 16384.f;\r
- }\r
- return 0;\r
-} /* decode_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:23:46 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:34 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int deemp_(real *x, integer *n, struct lpc10_decoder_state *st);\r
-#endif\r
-\r
-/* ***************************************************************** */\r
-\r
-/* DEEMP Version 48 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:23:46 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:34 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/20 15:54:37 jaf */\r
-/* Added comments about which indices of array arguments are read or */\r
-/* written. */\r
-\r
-/* Added entry INITDEEMP to reinitialize the local state variables, if */\r
-/* desired. */\r
-\r
-/* Revision 1.2 1996/03/14 22:11:13 jaf */\r
-/* Comments added explaining which of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next, and which */\r
-/* do not. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:53 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* De-Emphasize output speech with 1 / ( 1 - .75z**-1 ) */\r
-/* cascaded with 200 Hz high pass filter */\r
-/* ( 1 - 1.9998z**-1 + z**-2 ) / ( 1 - 1.75z**-1 + .78z**-2 ) */\r
-\r
-/* WARNING! The coefficients above may be out of date with the code */\r
-/* below. Either that, or some kind of transformation was performed */\r
-/* on the coefficients above to create the code below. */\r
-\r
-/* Input: */\r
-/* N - Number of samples */\r
-/* Input/Output: */\r
-/* X - Speech */\r
-/* Indices 1 through N are read before being written. */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITDEEMP. */\r
-\r
-/* Subroutine */ int deemp_(real *x, integer *n, struct lpc10_decoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- real *dei1;\r
- real *dei2;\r
- real *deo1;\r
- real *deo2;\r
- real *deo3;\r
-\r
- /* System generated locals */\r
- integer i__1;\r
- real r__1;\r
-\r
- /* Local variables */\r
- integer k;\r
- real dei0;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* All of the locals saved below were not given explicit initial */\r
-/* values in the original code. I think 0 is a safe choice. */\r
- /* Parameter adjustments */\r
- if (x) {\r
- --x;\r
- }\r
-\r
- /* Function Body */\r
-\r
- dei1 = &(st->dei1);\r
- dei2 = &(st->dei2);\r
- deo1 = &(st->deo1);\r
- deo2 = &(st->deo2);\r
- deo3 = &(st->deo3);\r
-\r
- i__1 = *n;\r
- for (k = 1; k <= i__1; ++k) {\r
- dei0 = x[k];\r
- r__1 = x[k] - *dei1 * 1.9998f + *dei2;\r
- x[k] = r__1 + *deo1 * 2.5f - *deo2 * 2.0925f + *deo3 * .585f;\r
- *dei2 = *dei1;\r
- *dei1 = dei0;\r
- *deo3 = *deo2;\r
- *deo2 = *deo1;\r
- *deo1 = x[k];\r
- }\r
- return 0;\r
-} /* deemp_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:32:31 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int difmag_(real *speech, integer *lpita, integer *tau, integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *maxptr);\r
-#endif\r
-\r
-/* ********************************************************************** */\r
-\r
-/* DIFMAG Version 49 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:14 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:31 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/15 23:09:39 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 14:41:31 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:45:04 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Compute Average Magnitude Difference Function */\r
-\r
-/* Inputs: */\r
-/* SPEECH - Low pass filtered speech */\r
-/* Indices MIN_N1 through MAX_N1+LPITA-1 are read, where */\r
-/* MIN_N1 = (MAXLAG - MAX_TAU)/2+1 MAX_TAU = max of TAU(I) for I=1,LTAU\r
-*/\r
-/* MAX_N1 = (MAXLAG - MIN_TAU)/2+1 MIN_TAU = min of TAU(I) for I=1,LTAU\r
-*/\r
-/* LPITA - Length of speech buffer */\r
-/* TAU - Table of lags */\r
-/* Indices 1 through LTAU read. */\r
-/* LTAU - Number of lag values to compute */\r
-/* MAXLAG - Maximum possible lag value */\r
-/* Outputs: */\r
-/* (All of these outputs are also read, but only after being written.) */\r
-/* AMDF - Average Magnitude Difference for each lag in TAU */\r
-/* Indices 1 through LTAU written */\r
-/* MINPTR - Index of minimum AMDF value */\r
-/* MAXPTR - Index of maximum AMDF value */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int difmag_(real *speech, integer *lpita, integer *tau, \r
- integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *\r
- maxptr)\r
-{\r
- /* System generated locals */\r
- integer i__1, i__2;\r
- real r__1;\r
-\r
- /* Local variables */\r
- integer i__, j, n1, n2;\r
- real sum;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* None */\r
- /* Parameter adjustments */\r
- --amdf;\r
- --tau;\r
- --speech;\r
-\r
- /* Function Body */\r
- *minptr = 1;\r
- *maxptr = 1;\r
- i__1 = *ltau;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- n1 = (*maxlag - tau[i__]) / 2 + 1;\r
- n2 = n1 + *lpita - 1;\r
- sum = 0.f;\r
- i__2 = n2;\r
- for (j = n1; j <= i__2; j += 4) {\r
- sum += (r__1 = speech[j] - speech[j + tau[i__]], abs(r__1));\r
- }\r
- amdf[i__] = sum;\r
- if (amdf[i__] < amdf[*minptr]) {\r
- *minptr = i__;\r
- }\r
- if (amdf[i__] > amdf[*maxptr]) {\r
- *maxptr = i__;\r
- }\r
- }\r
- return 0;\r
-} /* difmag_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:25:29 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:26 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int dyptrk_(real *amdf, integer *ltau, integer *minptr, integer *voice, integer *pitch, integer *midx, struct lpc10_encoder_state *st);\r
-/* comlen contrl_ 12 */\r
-#endif\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* ********************************************************************* */\r
-\r
-/* DYPTRK Version 52 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:25:29 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:26 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.5 1996/03/26 19:35:35 jaf */\r
-/* Commented out trace statements. */\r
-\r
-/* Revision 1.4 1996/03/19 18:03:22 jaf */\r
-/* Replaced the initialization "DATA P/60*DEPTH*0/" with "DATA P/120*0/", */\r
-/* because apparently Fortran (or at least f2c) can't handle expressions */\r
-/* like that. */\r
-\r
-/* Revision 1.3 1996/03/19 17:38:32 jaf */\r
-/* Added comments about the local variables that should be saved from one */\r
-/* invocation to the next. None of them were given initial values in the */\r
-/* original code, but from my testing, it appears that initializing them */\r
-/* all to 0 works. */\r
-\r
-/* Added entry INITDYPTRK to reinitialize these local variables. */\r
-\r
-/* Revision 1.2 1996/03/13 16:32:17 jaf */\r
-/* Comments added explaining which of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next, and which */\r
-/* do not. */\r
-\r
-/* WARNING! Some of them that should are never given initial values in */\r
-/* this code. Hopefully, Fortran 77 defines initial values for them, but */\r
-/* even so, giving them explicit initial values is preferable. */\r
-\r
-/* Revision 1.1 1996/02/07 14:45:14 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Dynamic Pitch Tracker */\r
-\r
-/* Input: */\r
-/* AMDF - Average Magnitude Difference Function array */\r
-/* Indices 1 through LTAU read, and MINPTR */\r
-/* LTAU - Number of lags in AMDF */\r
-/* MINPTR - Location of minimum AMDF value */\r
-/* VOICE - Voicing decision */\r
-/* Output: */\r
-/* PITCH - Smoothed pitch value, 2 frames delayed */\r
-/* MIDX - Initial estimate of current frame pitch */\r
-/* Compile time constant: */\r
-/* DEPTH - Number of frames to trace back */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITDYPTRK. */\r
-\r
-/* Subroutine */ int dyptrk_(real *amdf, integer *ltau, integer *\r
- minptr, integer *voice, integer *pitch, integer *midx,\r
- struct lpc10_encoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- real *s;\r
- integer *p;\r
- integer *ipoint;\r
- real *alphax;\r
-\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- integer pbar;\r
- real sbar;\r
- integer path[2], iptr, i__, j;\r
- real alpha, minsc, maxsc;\r
-\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:25:29 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:26 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Parameters/constants */\r
-/* Local variables that need not be saved */\r
-/* Note that PATH is only used for debugging purposes, and can be */\r
-/* removed. */\r
-/* Local state */\r
-/* It would be a bit more "general" to define S(LTAU), if Fortran */\r
-/* allows the argument of a function to be used as the dimension of \r
-*/\r
-/* a local array variable. */\r
-/* IPOINT is always in the range 0 to DEPTH-1. */\r
-/* WARNING! */\r
-\r
-/* In the original version of this subroutine, IPOINT, ALPHAX, */\r
-/* every element of S, and potentially any element of P with the */\r
-/* second index value .NE. IPTR were read without being given */\r
-/* initial values (all indices of P with second index equal to */\r
-/* IPTR are all written before being read in this subroutine). */\r
-\r
-/* From examining the code carefully, it appears that all of these \r
-*/\r
-/* should be saved from one invocation to the next. */\r
-\r
-/* I've run lpcsim with the "-l 6" option to see all of the */\r
-/* debugging information that is printed out by this subroutine */\r
-/* below, and it appears that S, P, IPOINT, and ALPHAX are all */\r
-/* initialized to 0 (these initial values would likely be different \r
-*/\r
-/* on different platforms, compilers, etc.). Given that the output \r
-*/\r
-/* of the coder sounds reasonable, I'm going to initialize these */\r
-/* variables to 0 explicitly. */\r
-\r
- s = &(st->s[0]);\r
- p = &(st->p[0]);\r
- ipoint = &(st->ipoint);\r
- alphax = &(st->alphax);\r
-\r
-\r
- /* Parameter adjustments */\r
- if (amdf) {\r
- --amdf;\r
- }\r
-\r
- /* Function Body */\r
-\r
-/* Calculate the confidence factor ALPHA, used as a threshold slope in \r
-*/\r
-/* SEESAW. If unvoiced, set high slope so that every point in P array \r
-*/\r
-/* is marked as a potential pitch frequency. A scaled up version (ALPHAX\r
-)*/\r
-/* is used to maintain arithmetic precision. */\r
- if (*voice == 1) {\r
- *alphax = *alphax * .75f + amdf[*minptr] / 2.f;\r
- } else {\r
- *alphax *= .984375f;\r
- }\r
- alpha = *alphax / 16;\r
- if (*voice == 0 && *alphax < 128.f) {\r
- alpha = 8.f;\r
- }\r
-/* SEESAW: Construct a pitch pointer array and intermediate winner functio\r
-n*/\r
-/* Left to right pass: */\r
- iptr = *ipoint + 1;\r
- p[iptr * 60 - 60] = 1;\r
- i__ = 1;\r
- pbar = 1;\r
- sbar = s[0];\r
- i__1 = *ltau;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- sbar += alpha;\r
- if (sbar < s[i__ - 1]) {\r
- s[i__ - 1] = sbar;\r
- p[i__ + iptr * 60 - 61] = pbar;\r
- } else {\r
- sbar = s[i__ - 1];\r
- p[i__ + iptr * 60 - 61] = i__;\r
- pbar = i__;\r
- }\r
- }\r
-/* Right to left pass: */\r
- i__ = pbar - 1;\r
- sbar = s[i__];\r
- while(i__ >= 1) {\r
- sbar += alpha;\r
- if (sbar < s[i__ - 1]) {\r
- s[i__ - 1] = sbar;\r
- p[i__ + iptr * 60 - 61] = pbar;\r
- } else {\r
- pbar = p[i__ + iptr * 60 - 61];\r
- i__ = pbar;\r
- sbar = s[i__ - 1];\r
- }\r
- --i__;\r
- }\r
-/* Update S using AMDF */\r
-/* Find maximum, minimum, and location of minimum */\r
- s[0] += amdf[1] / 2;\r
- minsc = s[0];\r
- maxsc = minsc;\r
- *midx = 1;\r
- i__1 = *ltau;\r
- for (i__ = 2; i__ <= i__1; ++i__) {\r
- s[i__ - 1] += amdf[i__] / 2;\r
- if (s[i__ - 1] > maxsc) {\r
- maxsc = s[i__ - 1];\r
- }\r
- if (s[i__ - 1] < minsc) {\r
- *midx = i__;\r
- minsc = s[i__ - 1];\r
- }\r
- }\r
-/* Subtract MINSC from S to prevent overflow */\r
- i__1 = *ltau;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- s[i__ - 1] -= minsc;\r
- }\r
- maxsc -= minsc;\r
-/* Use higher octave pitch if significant null there */\r
- j = 0;\r
- for (i__ = 20; i__ <= 40; i__ += 10) {\r
- if (*midx > i__) {\r
- if (s[*midx - i__ - 1] < maxsc / 4) {\r
- j = i__;\r
- }\r
- }\r
- }\r
- *midx -= j;\r
-/* TRACE: look back two frames to find minimum cost pitch estimate */\r
- j = *ipoint;\r
- *pitch = *midx;\r
- for (i__ = 1; i__ <= 2; ++i__) {\r
- j = j % 2 + 1;\r
- *pitch = p[*pitch + j * 60 - 61];\r
- path[i__ - 1] = *pitch;\r
- }\r
-\r
-/* The following statement subtracts one from IPOINT, mod DEPTH. I \r
-*/\r
-/* think the author chose to add DEPTH-1, instead of subtracting 1, \r
-*/\r
-/* because then it will work even if MOD doesn't work as desired on \r
-*/\r
-/* negative arguments. */\r
-\r
- *ipoint = (*ipoint + 1) % 2;\r
- return 0;\r
-} /* dyptrk_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:32:21 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int encode_(integer *voice, integer *pitch, real *rms, real *rc, integer *ipitch, integer *irms, integer *irc);\r
-/* comlen contrl_ 12 */\r
-#endif\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* Table of constant values */\r
-\r
-static integer c__2 = 2;\r
-\r
-/* ***************************************************************** */\r
-\r
-/* ENCODE Version 54 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:21 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.5 1996/03/26 19:35:50 jaf */\r
-/* Commented out trace statements. */\r
-\r
-/* Revision 1.4 1996/03/21 00:26:29 jaf */\r
-/* Added the comment that this subroutine has no local state. */\r
-\r
-/* In the last check-in, I forgot to mention that I had added comments */\r
-/* explaining which indices of array arguments are read or written. */\r
-\r
-/* Revision 1.3 1996/03/21 00:22:39 jaf */\r
-/* Added comments explaining that all local arrays are effectively */\r
-/* constants. */\r
-\r
-/* Revision 1.2 1996/03/13 18:48:33 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:45:29 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Quantize LPC parameters for transmission */\r
-\r
-/* INPUTS: */\r
-/* VOICE - Half frame voicing decisions */\r
-/* Indices 1 through 2 read. */\r
-/* PITCH - Pitch */\r
-/* RMS - Energy */\r
-/* RC - Reflection coefficients */\r
-/* Indices 1 through ORDER read. */\r
-/* CORRP - Error Correction: TRUE = yes, FALSE = none */\r
-/* (this is defined in file control.fh) */\r
-/* OUTPUTS: */\r
-/* IPITCH - Coded pitch and voicing */\r
-/* IRMS - Quantized energy */\r
-/* IRC - Quantized reflection coefficients */\r
-/* Indices 1 through MAX(ORDER,2) written. */\r
-/* If CORRP is .TRUE., then indices 1 through 10 written */\r
-/* for unvoiced frames. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int encode_(integer *voice, integer *pitch, real *rms, real *\r
- rc, integer *ipitch, integer *irms, integer *irc)\r
-{\r
- /* Initialized data */\r
-\r
- static integer enctab[16] = { 0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15 };\r
- static integer entau[60] = { 19,11,27,25,29,21,23,22,30,14,15,7,39,38,46,\r
- 42,43,41,45,37,53,49,51,50,54,52,60,56,58,26,90,88,92,84,86,82,83,\r
- 81,85,69,77,73,75,74,78,70,71,67,99,97,113,112,114,98,106,104,108,\r
- 100,101,76 };\r
- static integer enadd[8] = { 1920,-768,2432,1280,3584,1536,2816,-1152 };\r
- static real enscl[8] = { .0204f,.0167f,.0145f,.0147f,.0143f,.0135f,.0125f,\r
- .0112f };\r
- static integer enbits[8] = { 6,5,4,4,4,4,3,3 };\r
- 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,\r
- 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,\r
- 9,10,10,11,11,12,13,14,15 };\r
- static integer rmst[64] = { 1024,936,856,784,718,656,600,550,502,460,420,\r
- 384,352,328,294,270,246,226,206,188,172,158,144,132,120,110,102,\r
- 92,84,78,70,64,60,54,50,46,42,38,34,32,30,26,24,22,20,18,17,16,15,\r
- 14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };\r
-\r
- /* System generated locals */\r
- integer i__1, i__2;\r
-\r
- /* Builtin functions */\r
- integer pow_ii(integer *, integer *);\r
-\r
- /* Local variables */\r
- integer idel, nbit, i__, j, i2, i3, mrk;\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:21 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:21 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Parameters/constants */\r
-/* These arrays are not Fortran PARAMETER's, but they are defined */\r
-/* by DATA statements below, and their contents are never altered. \r
-*/\r
-/* Local variables that need not be saved */\r
- /* Parameter adjustments */\r
- --irc;\r
- --rc;\r
- --voice;\r
-\r
- /* Function Body */\r
-/* Scale RMS and RC's to integers */\r
- *irms = *rms;\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- irc[i__] = rc[i__] * 32768.f;\r
- }\r
-/* IF(LISTL.GE.3)WRITE(FDEBUG,800)VOICE,PITCH,IRMS,(IRC(I),I=1,ORDER) */\r
-/* 800 FORMAT(1X,/,' <<ENCODE IN>>',T32,2I3,I6,I5,T50,10I8) */\r
-/* Encode pitch and voicing */\r
- if (voice[1] != 0 && voice[2] != 0) {\r
- *ipitch = entau[*pitch - 1];\r
- } else {\r
- if (contrl_1.corrp) {\r
- *ipitch = 0;\r
- if (voice[1] != voice[2]) {\r
- *ipitch = 127;\r
- }\r
- } else {\r
- *ipitch = (voice[1] << 1) + voice[2];\r
- }\r
- }\r
-/* Encode RMS by binary table search */\r
- j = 32;\r
- idel = 16;\r
- *irms = min(*irms,1023);\r
- while(idel > 0) {\r
- if (*irms > rmst[j - 1]) {\r
- j -= idel;\r
- }\r
- if (*irms < rmst[j - 1]) {\r
- j += idel;\r
- }\r
- idel /= 2;\r
- }\r
- if (*irms > rmst[j - 1]) {\r
- --j;\r
- }\r
- *irms = 31 - j / 2;\r
-/* Encode RC(1) and (2) as log-area-ratios */\r
- for (i__ = 1; i__ <= 2; ++i__) {\r
- i2 = irc[i__];\r
- mrk = 0;\r
- if (i2 < 0) {\r
- i2 = -i2;\r
- mrk = 1;\r
- }\r
- i2 /= 512;\r
- i2 = min(i2,63);\r
- i2 = entab6[i2];\r
- if (mrk != 0) {\r
- i2 = -i2;\r
- }\r
- irc[i__] = i2;\r
- }\r
-/* Encode RC(3) - (10) linearly, remove bias then scale */\r
- i__1 = contrl_1.order;\r
- for (i__ = 3; i__ <= i__1; ++i__) {\r
- i2 = irc[i__] / 2;\r
- i2 = (i2 + enadd[contrl_1.order + 1 - i__ - 1]) * enscl[\r
- contrl_1.order + 1 - i__ - 1];\r
-/* Computing MIN */\r
- i__2 = max(i2,-127);\r
- i2 = min(i__2,127);\r
- nbit = enbits[contrl_1.order + 1 - i__ - 1];\r
- i3 = 0;\r
- if (i2 < 0) {\r
- i3 = -1;\r
- }\r
- i2 /= pow_ii(&c__2, &nbit);\r
- if (i3 == -1) {\r
- --i2;\r
- }\r
- irc[i__] = i2;\r
- }\r
-/* Protect the most significant bits of the most */\r
-/* important parameters during non-voiced frames. */\r
-/* RC(1) - RC(4) are protected using 20 parity bits */\r
-/* replacing RC(5) - RC(10). */\r
- if (contrl_1.corrp) {\r
- if (*ipitch == 0 || *ipitch == 127) {\r
- irc[5] = enctab[(irc[1] & 30) / 2];\r
- irc[6] = enctab[(irc[2] & 30) / 2];\r
- irc[7] = enctab[(irc[3] & 30) / 2];\r
- irc[8] = enctab[(*irms & 30) / 2];\r
- irc[9] = enctab[(irc[4] & 30) / 2] / 2;\r
- irc[10] = enctab[(irc[4] & 30) / 2] & 1;\r
- }\r
- }\r
-/* IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,IPITCH,IRMS,(IRC(J),J=1,ORDER) */\r
-/* 801 FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8) */\r
- return 0;\r
-} /* encode_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:32:17 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int energy_(integer *len, real *speech, real *rms);\r
-#endif\r
-\r
-/* ********************************************************************* */\r
-\r
-/* ENERGY Version 50 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:17 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/18 21:17:41 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 16:46:02 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:45:40 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Compute RMS energy. */\r
-\r
-/* Input: */\r
-/* LEN - Length of speech buffer */\r
-/* SPEECH - Speech buffer */\r
-/* Indices 1 through LEN read. */\r
-/* Output: */\r
-/* RMS - Root Mean Square energy */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int energy_(integer *len, real *speech, real *rms)\r
-{\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Builtin functions */\r
- double sqrt(doublereal);\r
-\r
- /* Local variables */\r
- integer i__;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
- /* Parameter adjustments */\r
- --speech;\r
-\r
- /* Function Body */\r
- *rms = 0.f;\r
- i__1 = *len;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- *rms += speech[i__] * speech[i__];\r
- }\r
- *rms = sqrt(*rms / *len);\r
- return 0;\r
-} /* energy_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:26:28 jaf\r
- * Any typedef defining a type that was used in lpc10_encoder_state or\r
- * lpc10_decoder_state struct's was commented out here and added to\r
- * lpc10.h.\r
- *\r
- * Revision 1.1 1996/08/19 22:32:13 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/*\r
- * f2c.h\r
- *\r
- * SCCS ID: @(#)f2c.h 1.2 96/05/19\r
- */\r
-\r
-/* f2c.h -- Standard Fortran to C header file */\r
-\r
-/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."\r
-\r
- - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */\r
-\r
-#ifndef F2C_INCLUDE\r
-#define F2C_INCLUDE\r
-\r
-#include "lpc10.h"\r
-\r
-/*typedef long int integer;*/\r
-/*typedef INT32 integer;*/\r
-/*typedef short int shortint;*/\r
-/*typedef INT16 shortint;*/\r
-/*typedef float real;*/\r
-/* doublereal only used for function arguments to sqrt, exp, etc. */\r
-typedef double doublereal;\r
-/* 32 bits seems wasteful, but there really aren't that many logical\r
- * variables around, and making them 32 bits could avoid word\r
- * alignment problems, perhaps. */\r
-/*typedef long int logical;*/\r
-/*typedef INT32 logical;*/\r
-/* The following types are not used in the translated C code for the\r
- * LPC-10 coder, but they might be needed by the definitions down\r
- * below, so they don't cause compilation errors. */\r
-typedef char *address;\r
-typedef struct { real r, i; } complex;\r
-typedef struct { doublereal r, i; } doublecomplex;\r
-typedef short int shortlogical;\r
-typedef char logical1;\r
-typedef char integer1;\r
-/* typedef long long longint; */ /* system-dependent */\r
-\r
-#define TRUE_ (1)\r
-#define FALSE_ (0)\r
-\r
-/* Extern is for use with -E */\r
-#ifndef Extern\r
-#define Extern extern\r
-#endif\r
-\r
-/* I/O stuff */\r
-\r
-#ifdef f2c_i2\r
-/* for -i2 */\r
-typedef short flag;\r
-typedef short ftnlen;\r
-typedef short ftnint;\r
-#else\r
-typedef long int flag;\r
-typedef long int ftnlen;\r
-typedef long int ftnint;\r
-#endif\r
-\r
-/*external read, write*/\r
-typedef struct\r
-{ flag cierr;\r
- ftnint ciunit;\r
- flag ciend;\r
- char *cifmt;\r
- ftnint cirec;\r
-} cilist;\r
-\r
-/*internal read, write*/\r
-typedef struct\r
-{ flag icierr;\r
- char *iciunit;\r
- flag iciend;\r
- char *icifmt;\r
- ftnint icirlen;\r
- ftnint icirnum;\r
-} icilist;\r
-\r
-/*open*/\r
-typedef struct\r
-{ flag oerr;\r
- ftnint ounit;\r
- char *ofnm;\r
- ftnlen ofnmlen;\r
- char *osta;\r
- char *oacc;\r
- char *ofm;\r
- ftnint orl;\r
- char *oblnk;\r
-} olist;\r
-\r
-/*close*/\r
-typedef struct\r
-{ flag cerr;\r
- ftnint cunit;\r
- char *csta;\r
-} cllist;\r
-\r
-/*rewind, backspace, endfile*/\r
-typedef struct\r
-{ flag aerr;\r
- ftnint aunit;\r
-} alist;\r
-\r
-/* inquire */\r
-typedef struct\r
-{ flag inerr;\r
- ftnint inunit;\r
- char *infile;\r
- ftnlen infilen;\r
- ftnint *inex; /*parameters in standard's order*/\r
- ftnint *inopen;\r
- ftnint *innum;\r
- ftnint *innamed;\r
- char *inname;\r
- ftnlen innamlen;\r
- char *inacc;\r
- ftnlen inacclen;\r
- char *inseq;\r
- ftnlen inseqlen;\r
- char *indir;\r
- ftnlen indirlen;\r
- char *infmt;\r
- ftnlen infmtlen;\r
- char *inform;\r
- ftnint informlen;\r
- char *inunf;\r
- ftnlen inunflen;\r
- ftnint *inrecl;\r
- ftnint *innrec;\r
- char *inblank;\r
- ftnlen inblanklen;\r
-} inlist;\r
-\r
-#define VOID void\r
-\r
-union Multitype { /* for multiple entry points */\r
- integer1 g;\r
- shortint h;\r
- integer i;\r
- /* longint j; */\r
- real r;\r
- doublereal d;\r
- complex c;\r
- doublecomplex z;\r
- };\r
-\r
-typedef union Multitype Multitype;\r
-\r
-/*typedef long int Long;*/ /* No longer used; formerly in Namelist */\r
-\r
-struct Vardesc { /* for Namelist */\r
- char *name;\r
- char *addr;\r
- ftnlen *dims;\r
- int type;\r
- };\r
-typedef struct Vardesc Vardesc;\r
-\r
-struct Namelist {\r
- char *name;\r
- Vardesc **vars;\r
- int nvars;\r
- };\r
-typedef struct Namelist Namelist;\r
-\r
-#define abs(x) ((x) >= 0 ? (x) : -(x))\r
-#define dabs(x) (doublereal)abs(x)\r
-#define min(a,b) ((a) <= (b) ? (a) : (b))\r
-#define max(a,b) ((a) >= (b) ? (a) : (b))\r
-#define dmin(a,b) (doublereal)min(a,b)\r
-#define dmax(a,b) (doublereal)max(a,b)\r
-\r
-/* procedure parameter types for -A and -C++ */\r
-\r
-#define F2C_proc_par_types 1\r
-#ifdef __cplusplus\r
-typedef int /* Unknown procedure type */ (*U_fp)(...);\r
-typedef shortint (*J_fp)(...);\r
-typedef integer (*I_fp)(...);\r
-typedef real (*R_fp)(...);\r
-typedef doublereal (*D_fp)(...), (*E_fp)(...);\r
-typedef /* Complex */ VOID (*C_fp)(...);\r
-typedef /* Double Complex */ VOID (*Z_fp)(...);\r
-typedef logical (*L_fp)(...);\r
-typedef shortlogical (*K_fp)(...);\r
-typedef /* Character */ VOID (*H_fp)(...);\r
-typedef /* Subroutine */ int (*S_fp)(...);\r
-#else\r
-typedef int /* Unknown procedure type */ (*U_fp)(VOID);\r
-typedef shortint (*J_fp)(VOID);\r
-typedef integer (*I_fp)(VOID);\r
-typedef real (*R_fp)(VOID);\r
-typedef doublereal (*D_fp)(VOID), (*E_fp)(VOID);\r
-typedef /* Complex */ VOID (*C_fp)(VOID);\r
-typedef /* Double Complex */ VOID (*Z_fp)(VOID);\r
-typedef logical (*L_fp)(VOID);\r
-typedef shortlogical (*K_fp)(VOID);\r
-typedef /* Character */ VOID (*H_fp)(VOID);\r
-typedef /* Subroutine */ int (*S_fp)(VOID);\r
-#endif\r
-/* E_fp is for real functions when -R is not specified */\r
-typedef VOID C_f; /* complex function */\r
-typedef VOID H_f; /* character function */\r
-typedef VOID Z_f; /* double complex function */\r
-typedef doublereal E_f; /* real function with -R not specified */\r
-\r
-/* undef any lower-case symbols that your C compiler predefines, e.g.: */\r
-\r
-#ifndef Skip_f2c_Undefs\r
-#undef cray\r
-#undef gcos\r
-#undef mc68010\r
-#undef mc68020\r
-#undef mips\r
-#undef pdp11\r
-#undef sgi\r
-#undef sparc\r
-#undef sun\r
-#undef sun2\r
-#undef sun3\r
-#undef sun4\r
-#undef u370\r
-#undef u3b\r
-#undef u3b2\r
-#undef u3b5\r
-#undef unix\r
-#undef vax\r
-#endif\r
-\r
-#ifdef KR_headers\r
-extern integer pow_ii(ap, bp);\r
-extern double r_sign(a,b);\r
-extern integer i_nint(x);\r
-#else\r
-extern integer pow_ii(integer *ap, integer *bp);\r
-extern double r_sign(real *a, real *b);\r
-extern integer i_nint(real *x);\r
-\r
-#endif\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int bsynz_(real *coef, integer *ip, integer *iv, \r
- real *sout, real *rms, real *ratio, real *g2pass,\r
- struct lpc10_decoder_state *st);\r
-extern int chanwr_(integer *order, integer *ipitv, integer *irms,\r
- integer *irc, integer *ibits, struct lpc10_encoder_state *st);\r
-extern int chanrd_(integer *order, integer *ipitv, integer *irms,\r
- integer *irc, integer *ibits);\r
-extern int chanwr_0_(int n__, integer *order, integer *ipitv, \r
- integer *irms, integer *irc, integer *ibits,\r
- struct lpc10_encoder_state *st);\r
-extern int dcbias_(integer *len, real *speech, real *sigout);\r
-extern int decode_(integer *ipitv, integer *irms, integer *irc, \r
- integer *voice, integer *pitch, real *rms,\r
- real *rc, struct lpc10_decoder_state *st);\r
-extern int deemp_(real *x, integer *n, struct lpc10_decoder_state *st);\r
-extern int difmag_(real *speech, integer *lpita, integer *tau, integer *ltau,\r
- integer *maxlag, real *amdf, integer *minptr, integer *maxptr);\r
-extern int dyptrk_(real *amdf, integer *ltau, integer *\r
- minptr, integer *voice, integer *pitch, integer *midx,\r
- struct lpc10_encoder_state *st);\r
-extern int encode_(integer *voice, integer *pitch, real *rms, real *rc,\r
- integer *ipitch, integer *irms, integer *irc);\r
-extern int energy_(integer *len, real *speech, real *rms);\r
-extern int ham84_(integer *input, integer *output, integer *errcnt);\r
-extern int hp100_(real *speech, integer *start, integer *end,\r
- struct lpc10_encoder_state *st);\r
-extern int inithp100_(void);\r
-extern int invert_(integer *order, real *phi, real *psi, real *rc);\r
-extern int irc2pc_(real *rc, real *pc, integer *order, real *gprime, real *g2pass);\r
-extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real *ivrc);\r
-extern int lpcdec_(integer *bits, real *speech);\r
-extern int initlpcdec_(void);\r
-extern int lpcenc_(real *speech, integer *bits);\r
-extern int initlpcenc_(void);\r
-extern int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *nsamp);\r
-extern integer median_(integer *d1, integer *d2, integer *d3);\r
-extern int mload_(integer *order, integer *awins, integer *awinf, real *speech, real *phi, real *psi);\r
-extern int onset_(real *pebuf, integer *osbuf, integer *osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *lframe, struct lpc10_encoder_state *st);\r
-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);\r
-extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);\r
-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);\r
-extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);\r
-extern int prepro_(real *speech, integer *length,\r
- struct lpc10_encoder_state *st);\r
-extern int decode_(integer *ipitv, integer *irms, integer *irc, integer *voice, integer *pitch, real *rms, real *rc, struct lpc10_decoder_state *st);\r
-extern integer random_(struct lpc10_decoder_state *st);\r
-extern int rcchk_(integer *order, real *rc1f, real *rc2f);\r
-extern int synths_(integer *voice, integer *pitch, real *rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st);\r
-extern int tbdm_(real *speech, integer *lpita, integer *tau, integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *mintau);\r
-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);\r
-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__);\r
-\r
-#endif\r
-\r
-\r
-#endif /* ! defined F2C_INCLUDE */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:32:10 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/*\r
- * f2clib.c\r
- *\r
- * SCCS ID: @(#)f2clib.c 1.2 96/05/19\r
- */\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef KR_headers\r
-integer pow_ii(ap, bp) integer *ap, *bp;\r
-#else\r
-integer pow_ii(integer *ap, integer *bp)\r
-#endif\r
-{\r
- integer pow, x, n;\r
- unsigned long u;\r
-\r
- x = *ap;\r
- n = *bp;\r
-\r
- if (n <= 0) {\r
- if (n == 0 || x == 1)\r
- return 1;\r
- if (x != -1)\r
- return x == 0 ? 1/x : 0;\r
- n = -n;\r
- }\r
- u = n;\r
- for(pow = 1; ; )\r
- {\r
- if(u & 01)\r
- pow *= x;\r
- if(u >>= 1)\r
- x *= x;\r
- else\r
- break;\r
- }\r
- return(pow);\r
- }\r
-\r
-\r
-\r
-#ifdef KR_headers\r
-double r_sign(a,b) real *a, *b;\r
-#else\r
-double r_sign(real *a, real *b)\r
-#endif\r
-{\r
-double x;\r
-x = (*a >= 0 ? *a : - *a);\r
-return( *b >= 0 ? x : -x);\r
-}\r
-\r
-\r
-\r
-#ifdef KR_headers\r
-double floor();\r
-integer i_nint(x) real *x;\r
-#else\r
-#undef abs\r
-#include "math.h"\r
-integer i_nint(real *x)\r
-#endif\r
-{\r
-return( (*x)>=0 ?\r
- floor(*x + .5) : -floor(.5 - *x) );\r
-}\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:32:07 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int ham84_(integer *input, integer *output, integer *errcnt);\r
-#endif\r
-\r
-/* ***************************************************************** */\r
-\r
-/* HAM84 Version 45G */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:07 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/21 15:26:00 jaf */\r
-/* Put comment header in standard form. */\r
-\r
-/* Revision 1.2 1996/03/13 22:00:13 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:47:04 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Hamming 8,4 Decoder - can correct 1 out of seven bits */\r
-/* and can detect up to two errors. */\r
-\r
-/* Input: */\r
-/* INPUT - Seven bit data word, 4 bits parameter and */\r
-/* 4 bits parity information */\r
-/* Input/Output: */\r
-/* ERRCNT - Sums errors detected by Hamming code */\r
-/* Output: */\r
-/* OUTPUT - 4 corrected parameter bits */\r
-\r
-/* This subroutine is entered with an eight bit word in INPUT. The 8th */\r
-/* bit is parity and is stripped off. The remaining 7 bits address the */\r
-/* hamming 8,4 table and the output OUTPUT from the table gives the 4 */\r
-/* bits of corrected data. If bit 4 is set, no error was detected. */\r
-/* ERRCNT is the number of errors counted. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int ham84_(integer *input, integer *output, integer *errcnt)\r
-{\r
- /* Initialized data */\r
-\r
- static integer dactab[128] = { 16,0,0,3,0,5,14,7,0,9,14,11,14,13,30,14,0,\r
- 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,\r
- 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,\r
- 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,\r
- 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,\r
- 12,15,15,31 };\r
-\r
- integer i__, j, parity;\r
-\r
-/* Arguments */\r
-/* Parameters/constants */\r
-/* Local variables that need not be saved */\r
-/* Determine parity of input word */\r
- parity = *input & 255;\r
- parity ^= parity / 16;\r
- parity ^= parity / 4;\r
- parity ^= parity / 2;\r
- parity &= 1;\r
- i__ = dactab[*input & 127];\r
- *output = i__ & 15;\r
- j = i__ & 16;\r
- if (j != 0) {\r
-/* No errors detected in seven bits */\r
- if (parity != 0) {\r
- ++(*errcnt);\r
- }\r
- } else {\r
-/* One or two errors detected */\r
- ++(*errcnt);\r
- if (parity == 0) {\r
-/* Two errors detected */\r
- ++(*errcnt);\r
- *output = -1;\r
- }\r
- }\r
- return 0;\r
-} /* ham84_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:28:05 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:04 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int hp100_(real *speech, integer *start, integer *end,\r
- struct lpc10_encoder_state *st);\r
-extern int inithp100_(void);\r
-#endif\r
-\r
-/* ********************************************************************* */\r
-\r
-/* HP100 Version 55 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:28:05 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:32:04 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.6 1996/03/15 16:45:25 jaf */\r
-/* Rearranged a few comments. */\r
-\r
-/* Revision 1.5 1996/03/14 23:20:54 jaf */\r
-/* Added comments about when INITHP100 should be used. */\r
-\r
-/* Revision 1.4 1996/03/14 23:08:08 jaf */\r
-/* Added an entry named INITHP100 that initializes the local state of */\r
-/* subroutine HP100. */\r
-\r
-/* Revision 1.3 1996/03/14 22:09:20 jaf */\r
-/* Comments added explaining which of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next, and which */\r
-/* do not. */\r
-\r
-/* Revision 1.2 1996/02/12 15:05:54 jaf */\r
-/* Added lots of comments explaining why I changed one line, which was a */\r
-/* declaration with initializations. */\r
-\r
-/* Revision 1.1 1996/02/07 14:47:12 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* 100 Hz High Pass Filter */\r
-\r
-/* Jan 92 - corrected typo (1.937148 to 1.935715), */\r
-/* rounded coefficients to 7 places, */\r
-/* corrected and merged gain (.97466**4), */\r
-/* merged numerator into first two sections. */\r
-\r
-/* Input: */\r
-/* start, end - Range of samples to filter */\r
-/* Input/Output: */\r
-/* speech(end) - Speech data. */\r
-/* Indices start through end are read and modified. */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITHP100. */\r
-/* Subroutine */ int hp100_(real *speech, integer *start, integer *end,\r
- struct lpc10_encoder_state *st)\r
-{\r
- /* Temporary local copies of variables in lpc10_encoder_state.\r
- I've only created these because it might cause the loop below\r
- to execute a bit faster to access local variables, rather than\r
- variables in the lpc10_encoder_state structure. It is just a\r
- guess that it will be faster. */\r
-\r
- real z11;\r
- real z21;\r
- real z12;\r
- real z22;\r
-\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- integer i__;\r
- real si, err;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
- /* Parameter adjustments */\r
- if (speech) {\r
- --speech;\r
- }\r
-\r
- /* Function Body */\r
-\r
- z11 = st->z11;\r
- z21 = st->z21;\r
- z12 = st->z12;\r
- z22 = st->z22;\r
-\r
- i__1 = *end;\r
- for (i__ = *start; i__ <= i__1; ++i__) {\r
- si = speech[i__];\r
- err = si + z11 * 1.859076f - z21 * .8648249f;\r
- si = err - z11 * 2.f + z21;\r
- z21 = z11;\r
- z11 = err;\r
- err = si + z12 * 1.935715f - z22 * .9417004f;\r
- si = err - z12 * 2.f + z22;\r
- z22 = z12;\r
- z12 = err;\r
- speech[i__] = si * .902428f;\r
- }\r
-\r
- st->z11 = z11;\r
- st->z21 = z21;\r
- st->z12 = z12;\r
- st->z22 = z22;\r
-\r
- return 0;\r
-} /* hp100_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:32:00 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int invert_(integer *order, real *phi, real *psi, real *rc);\r
-#endif\r
-\r
-/* **************************************************************** */\r
-\r
-/* INVERT Version 45G */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:00 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/18 20:52:47 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 16:51:32 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Eliminated a comment from the original, describing a local array X */\r
-/* that appeared nowhere in the code. */\r
-\r
-/* Revision 1.1 1996/02/07 14:47:20 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* **************************************************************** */\r
-\r
-/* Invert a covariance matrix using Choleski decomposition method. */\r
-\r
-/* Input: */\r
-/* ORDER - Analysis order */\r
-/* PHI(ORDER,ORDER) - Covariance matrix */\r
-/* Indices (I,J) read, where ORDER .GE. I .GE. J .GE. 1.*/\r
-/* All other indices untouched. */\r
-/* PSI(ORDER) - Column vector to be predicted */\r
-/* Indices 1 through ORDER read. */\r
-/* Output: */\r
-/* RC(ORDER) - Pseudo reflection coefficients */\r
-/* Indices 1 through ORDER written, and then possibly read.\r
-*/\r
-/* Internal: */\r
-/* V(ORDER,ORDER) - Temporary matrix */\r
-/* Same indices written as read from PHI. */\r
-/* Many indices may be read and written again after */\r
-/* initially being copied from PHI, but all indices */\r
-/* are written before being read. */\r
-\r
-/* NOTE: Temporary matrix V is not needed and may be replaced */\r
-/* by PHI if the original PHI values do not need to be preserved. */\r
-\r
-/* Subroutine */ int invert_(integer *order, real *phi, real *psi, real *rc)\r
-{\r
- /* System generated locals */\r
- integer phi_dim1, phi_offset, i__1, i__2, i__3;\r
- real r__1, r__2;\r
-\r
- /* Local variables */\r
- real save;\r
- integer i__, j, k;\r
- real v[100] /* was [10][10] */;\r
-\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:32:00 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Parameters/constants */\r
-/* Local variables that need not be saved */\r
-/* Decompose PHI into V * D * V' where V is a triangular matrix whose */\r
-/* main diagonal elements are all 1, V' is the transpose of V, and */\r
-/* D is a vector. Here D(n) is stored in location V(n,n). */\r
- /* Parameter adjustments */\r
- --rc;\r
- --psi;\r
- phi_dim1 = *order;\r
- phi_offset = phi_dim1 + 1;\r
- phi -= phi_offset;\r
-\r
- /* Function Body */\r
- i__1 = *order;\r
- for (j = 1; j <= i__1; ++j) {\r
- i__2 = *order;\r
- for (i__ = j; i__ <= i__2; ++i__) {\r
- v[i__ + j * 10 - 11] = phi[i__ + j * phi_dim1];\r
- }\r
- i__2 = j - 1;\r
- for (k = 1; k <= i__2; ++k) {\r
- save = v[j + k * 10 - 11] * v[k + k * 10 - 11];\r
- i__3 = *order;\r
- for (i__ = j; i__ <= i__3; ++i__) {\r
- v[i__ + j * 10 - 11] -= v[i__ + k * 10 - 11] * save;\r
- }\r
- }\r
-/* Compute intermediate results, which are similar to RC's */\r
- if ((r__1 = v[j + j * 10 - 11], abs(r__1)) < 1e-10f) {\r
- goto L100;\r
- }\r
- rc[j] = psi[j];\r
- i__2 = j - 1;\r
- for (k = 1; k <= i__2; ++k) {\r
- rc[j] -= rc[k] * v[j + k * 10 - 11];\r
- }\r
- v[j + j * 10 - 11] = 1.f / v[j + j * 10 - 11];\r
- rc[j] *= v[j + j * 10 - 11];\r
-/* Computing MAX */\r
-/* Computing MIN */\r
- r__2 = rc[j];\r
- r__1 = min(r__2,.999f);\r
- rc[j] = max(r__1,-.999f);\r
- }\r
- return 0;\r
-/* Zero out higher order RC's if algorithm terminated early */\r
-L100:\r
- i__1 = *order;\r
- for (i__ = j; i__ <= i__1; ++i__) {\r
- rc[i__] = 0.f;\r
- }\r
-/* Back substitute for PC's (if needed) */\r
-/* 110 DO J = ORDER,1,-1 */\r
-/* PC(J) = RC(J) */\r
-/* DO I = 1,J-1 */\r
-/* PC(J) = PC(J) - PC(I)*V(J,I) */\r
-/* END DO */\r
-/* END DO */\r
- return 0;\r
-} /* invert_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:31:56 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int irc2pc_(real *rc, real *pc, integer *order, real *gprime, real *g2pass);\r
-#endif\r
-\r
-/* ***************************************************************** */\r
-\r
-/* IRC2PC Version 48 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:56 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/20 15:47:19 jaf */\r
-/* Added comments about which indices of array arguments are read or */\r
-/* written. */\r
-\r
-/* Revision 1.2 1996/03/14 16:59:04 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:47:27 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Convert Reflection Coefficients to Predictor Coeficients */\r
-\r
-/* Inputs: */\r
-/* RC - Reflection coefficients */\r
-/* Indices 1 through ORDER read. */\r
-/* ORDER - Number of RC's */\r
-/* GPRIME - Excitation modification gain */\r
-/* Outputs: */\r
-/* PC - Predictor coefficients */\r
-/* Indices 1 through ORDER written. */\r
-/* Indices 1 through ORDER-1 are read after being written. */\r
-/* G2PASS - Excitation modification sharpening factor */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int irc2pc_(real *rc, real *pc, integer *order, real *gprime,\r
- real *g2pass)\r
-{\r
- /* System generated locals */\r
- integer i__1, i__2;\r
-\r
- /* Builtin functions */\r
- double sqrt(doublereal);\r
-\r
- /* Local variables */\r
- real temp[10];\r
- integer i__, j;\r
-\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:56 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Local variables that need not be saved */\r
- /* Parameter adjustments */\r
- --pc;\r
- --rc;\r
-\r
- /* Function Body */\r
- *g2pass = 1.f;\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- *g2pass *= 1.f - rc[i__] * rc[i__];\r
- }\r
- *g2pass = *gprime * sqrt(*g2pass);\r
- pc[1] = rc[1];\r
- i__1 = *order;\r
- for (i__ = 2; i__ <= i__1; ++i__) {\r
- i__2 = i__ - 1;\r
- for (j = 1; j <= i__2; ++j) {\r
- temp[j - 1] = pc[j] - rc[i__] * pc[i__ - j];\r
- }\r
- i__2 = i__ - 1;\r
- for (j = 1; j <= i__2; ++j) {\r
- pc[j] = temp[j - 1];\r
- }\r
- pc[i__] = rc[i__];\r
- }\r
- return 0;\r
-} /* irc2pc_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.16 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.15 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.2 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:31:53 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real *ivrc);\r
-#endif\r
-\r
-/* ********************************************************************* */\r
-\r
-/* IVFILT Version 48 */\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:53 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/15 21:36:29 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 00:01:00 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:47:34 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* 2nd order inverse filter, speech is decimated 4:1 */\r
-\r
-/* Input: */\r
-/* LEN - Length of speech buffers */\r
-/* NSAMP - Number of samples to filter */\r
-/* LPBUF - Low pass filtered speech buffer */\r
-/* Indices LEN-NSAMP-7 through LEN read. */\r
-/* Output: */\r
-/* IVBUF - Inverse filtered speech buffer */\r
-/* Indices LEN-NSAMP+1 through LEN written. */\r
-/* IVRC - Inverse filter reflection coefficients (for voicing) */\r
-/* Indices 1 and 2 both written (also read, but only after writing).\r
-*/\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *\r
- nsamp, real *ivrc)\r
-{\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- integer i__, j, k;\r
- real r__[3], pc1, pc2;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* None */\r
-/* Calculate Autocorrelations */\r
- /* Parameter adjustments */\r
- --ivbuf;\r
- --lpbuf;\r
- --ivrc;\r
-\r
- /* Function Body */\r
- for (i__ = 1; i__ <= 3; ++i__) {\r
- r__[i__ - 1] = 0.f;\r
- k = (i__ - 1) << 2;\r
- i__1 = *len;\r
- for (j = (i__ << 2) + *len - *nsamp; j <= i__1; j += 2) {\r
- r__[i__ - 1] += lpbuf[j] * lpbuf[j - k];\r
- }\r
- }\r
-/* Calculate predictor coefficients */\r
- pc1 = 0.f;\r
- pc2 = 0.f;\r
- ivrc[1] = 0.f;\r
- ivrc[2] = 0.f;\r
- if (r__[0] > 1e-10f) {\r
- ivrc[1] = r__[1] / r__[0];\r
- ivrc[2] = (r__[2] - ivrc[1] * r__[1]) / (r__[0] - ivrc[1] * r__[1]);\r
- pc1 = ivrc[1] - ivrc[1] * ivrc[2];\r
- pc2 = ivrc[2];\r
- }\r
-/* Inverse filter LPBUF into IVBUF */\r
- i__1 = *len;\r
- for (i__ = *len + 1 - *nsamp; i__ <= i__1; ++i__) {\r
- ivbuf[i__] = lpbuf[i__] - pc1 * lpbuf[i__ - 4] - pc2 * lpbuf[i__ - 8];\r
- }\r
- return 0;\r
-} /* ivfilt_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.18 2004/08/31 13:32:11 markster\r
-Merge NetBSD and Courtesty tone with modifications (bug #2329)\r
-\r
-Revision 1.17 2003/10/26 18:50:49 markster\r
-Make it build and run on MacOS X\r
-\r
-Revision 1.3 2003/10/26 18:50:49 markster\r
-Make it build and run on MacOS X\r
-\r
-Revision 1.2 2003/04/23 19:13:35 markster\r
-More OpenBSD patches\r
-\r
-Revision 1.1.1.2 2003/03/16 22:37:30 matteo\r
-dom mar 16 23:37:23 CET 2003\r
-\r
-Revision 1.2 2003/03/16 16:09:48 markster\r
-Mere James's cleanups for fewer build warnings\r
-\r
-Revision 1.1 2000/01/05 00:20:06 markster\r
-Add broken lpc10 code... It's not too far from working I don't think...\r
-\r
- * Revision 1.1 1996/08/19 22:47:31 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-#ifndef __LPC10_H__\r
-#define __LPC10_H__\r
-\r
-#define LPC10_SAMPLES_PER_FRAME 180\r
-#define LPC10_BITS_IN_COMPRESSED_FRAME 54\r
-\r
-\r
-/*\r
-\r
- The "#if defined"'s in this file are by no means intended to be\r
- complete. They are what Nautilus uses, which has been successfully\r
- compiled under DOS with the Microsoft C compiler, and under a few\r
- versions of Unix with the GNU C compiler.\r
-\r
- */\r
-\r
-#if defined(unix) || defined(__unix__) || defined(__NetBSD__)\r
-typedef short INT16;\r
-typedef int INT32;\r
-#endif\r
-\r
-\r
-#if defined(__MSDOS__) || defined(MSDOS)\r
-typedef int INT16;\r
-typedef long INT32;\r
-#endif\r
-\r
-#if defined(__APPLE__)\r
-typedef short INT16;\r
-typedef int INT32;\r
-#endif\r
-\r
-\r
-/* The initial values for every member of this structure is 0, except\r
- where noted in comments. */\r
-\r
-/* These two lines are copied from f2c.h. There should be a more\r
- elegant way of doing this than having the same declarations in two\r
- files. */\r
-\r
-typedef float real;\r
-typedef INT32 integer;\r
-typedef INT32 logical;\r
-typedef INT16 shortint;\r
-\r
-struct lpc10_encoder_state {\r
- /* State used only by function hp100 */\r
- real z11;\r
- real z21;\r
- real z12;\r
- real z22;\r
- \r
- /* State used by function analys */\r
- real inbuf[540], pebuf[540];\r
- real lpbuf[696], ivbuf[312];\r
- real bias;\r
- integer osbuf[10]; /* no initial value necessary */\r
- integer osptr; /* initial value 1 */\r
- integer obound[3];\r
- integer vwin[6] /* was [2][3] */; /* initial value vwin[4] = 307; vwin[5] = 462; */\r
- integer awin[6] /* was [2][3] */; /* initial value awin[4] = 307; awin[5] = 462; */\r
- integer voibuf[8] /* was [2][4] */;\r
- real rmsbuf[3];\r
- real rcbuf[30] /* was [10][3] */;\r
- real zpre;\r
-\r
-\r
- /* State used by function onset */\r
- real n;\r
- real d__; /* initial value 1.f */\r
- real fpc; /* no initial value necessary */\r
- real l2buf[16];\r
- real l2sum1;\r
- integer l2ptr1; /* initial value 1 */\r
- integer l2ptr2; /* initial value 9 */\r
- integer lasti; /* no initial value necessary */\r
- logical hyst; /* initial value FALSE_ */\r
-\r
- /* State used by function voicin */\r
- real dither; /* initial value 20.f */\r
- real snr;\r
- real maxmin;\r
- real voice[6] /* was [2][3] */; /* initial value is probably unnecessary */\r
- integer lbve, lbue, fbve, fbue;\r
- integer ofbue, sfbue;\r
- integer olbue, slbue;\r
- /* Initial values:\r
- lbve = 3000;\r
- fbve = 3000;\r
- fbue = 187;\r
- ofbue = 187;\r
- sfbue = 187;\r
- lbue = 93;\r
- olbue = 93;\r
- slbue = 93;\r
- snr = (real) (fbve / fbue << 6);\r
- */\r
-\r
- /* State used by function dyptrk */\r
- real s[60];\r
- integer p[120] /* was [60][2] */;\r
- integer ipoint;\r
- real alphax;\r
-\r
- /* State used by function chanwr */\r
- integer isync;\r
-\r
-};\r
-\r
-\r
-struct lpc10_decoder_state {\r
-\r
- /* State used by function decode */\r
- integer iptold; /* initial value 60 */\r
- logical first; /* initial value TRUE_ */\r
- integer ivp2h;\r
- integer iovoic;\r
- integer iavgp; /* initial value 60 */\r
- integer erate;\r
- integer drc[30] /* was [3][10] */;\r
- integer dpit[3];\r
- integer drms[3];\r
-\r
- /* State used by function synths */\r
- real buf[360];\r
- integer buflen; /* initial value 180 */\r
-\r
- /* State used by function pitsyn */\r
- integer ivoico; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- integer ipito; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- real rmso; /* initial value 1.f */\r
- real rco[10]; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- integer jsamp; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- logical first_pitsyn; /* initial value TRUE_ */\r
-\r
- /* State used by function bsynz */\r
- integer ipo;\r
- real exc[166];\r
- real exc2[166];\r
- real lpi1;\r
- real lpi2;\r
- real lpi3;\r
- real hpi1;\r
- real hpi2;\r
- real hpi3;\r
- real rmso_bsynz;\r
-\r
- /* State used by function random */\r
- integer j; /* initial value 2 */\r
- integer k; /* initial value 5 */\r
- shortint y[5]; /* initial value { -21161,-8478,30892,-10216,16950 } */\r
-\r
- /* State used by function deemp */\r
- real dei1;\r
- real dei2;\r
- real deo1;\r
- real deo2;\r
- real deo3;\r
-\r
-};\r
-\r
-\r
-\r
-/*\r
-\r
- Calling sequence:\r
-\r
- Call create_lpc10_encoder_state(), which returns a pointer to an\r
- already initialized lpc10_encoder_state structure.\r
-\r
- lpc10_encode reads indices 0 through (LPC10_SAMPLES_PER_FRAME-1) of\r
- array speech[], and writes indices 0 through\r
- (LPC10_BITS_IN_COMPRESSED_FRAME-1) of array bits[], and both reads\r
- and writes the lpc10_encoder_state structure contents. The\r
- lpc10_encoder_state structure should *not* be initialized for every\r
- frame of encoded speech. Once at the beginning of execution, done\r
- automatically for you by create_lpc10_encoder_state(), is enough.\r
-\r
- init_lpc10_encoder_state() reinitializes the lpc10_encoder_state\r
- structure. This might be useful if you are finished processing one\r
- sound sample, and want to reuse the same lpc10_encoder_state\r
- structure to process another sound sample. There might be other\r
- uses as well.\r
-\r
- Note that the comments in the lpc10/lpcenc.c file imply that indices\r
- 1 through 180 of array speech[] are read. These comments were\r
- written for the Fortran version of the code, before it was\r
- automatically converted to C by the conversion program f2c. f2c\r
- seems to use the convention that the pointers to arrays passed as\r
- function arguments point to the first index used in the Fortran\r
- code, whatever index that might be (usually 1), and then it modifies\r
- the pointer inside of the function, like so:\r
-\r
- if (speech) {\r
- --speech;\r
- }\r
-\r
- So that the code can access the first value at index 1 and the last\r
- at index 180. This makes the translated C code "closer" to the\r
- original Fortran code.\r
-\r
- The calling sequence for the decoder is similar to the encoder. The\r
- only significant difference is that the array bits[] is read\r
- (indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the\r
- array speech[] is written (indices 0 through\r
- (LPC10_SAMPLES_PER_FRAME-1)).\r
- \r
- */\r
-\r
-struct lpc10_encoder_state * create_lpc10_encoder_state (void);\r
-void init_lpc10_encoder_state (struct lpc10_encoder_state *st);\r
-int lpc10_encode (real *speech, INT32 *bits, struct lpc10_encoder_state *st);\r
-\r
-struct lpc10_decoder_state * create_lpc10_decoder_state (void);\r
-void init_lpc10_decoder_state (struct lpc10_decoder_state *st);\r
-int lpc10_decode (INT32 *bits, real *speech, struct lpc10_decoder_state *st);\r
-\r
-#endif /* __LPC10_H__ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:30:11 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Changed name of function from lpcenc_ to lpc10_encode, simply to make\r
- * all lpc10 functions have more consistent naming with each other.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:48 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int lpcdec_(integer *bits, real *speech);\r
-extern int initlpcdec_(void);\r
-/* comlen contrl_ 12 */\r
-/*:ref: chanrd_ 14 5 4 4 4 4 4 */\r
-/*:ref: decode_ 14 7 4 4 4 4 4 6 6 */\r
-/*:ref: synths_ 14 6 4 4 6 6 6 4 */\r
-/*:ref: initdecode_ 14 0 */\r
-/*:ref: initsynths_ 14 0 */\r
-#endif\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* Table of constant values */\r
-\r
-static integer c__10 = 10;\r
-\r
-/* ***************************************************************** */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:30:11 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Changed name of function from lpcenc_ to lpc10_encode, simply to make\r
- * all lpc10 functions have more consistent naming with each other.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:48 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.1 1996/03/28 00:03:00 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Decode 54 bits to one frame of 180 speech samples. */\r
-\r
-/* Input: */\r
-/* BITS - 54 encoded bits, stored 1 per array element. */\r
-/* Indices 1 through 53 read (SYNC bit ignored). */\r
-/* Output: */\r
-/* SPEECH - Speech encoded as real values in the range [-1,+1]. */\r
-/* Indices 1 through 180 written. */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITLPCDEC. */\r
-\r
-/* Subroutine */ int lpc10_decode(integer *bits, real *speech,\r
- struct lpc10_decoder_state *st)\r
-{\r
- integer irms, voice[2], pitch, ipitv;\r
- extern /* Subroutine */ int decode_(integer *, integer *, integer *, \r
- integer *, integer *, real *, real *, struct lpc10_decoder_state *);\r
- real rc[10];\r
- extern /* Subroutine */ int chanrd_(integer *, integer *, integer *, \r
- integer *, integer *), synths_(integer *, \r
- integer *, real *, real *, real *, integer *,\r
- struct lpc10_decoder_state *);\r
- integer irc[10], len;\r
- real rms;\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:30:11 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Changed name of function from lpcenc_ to lpc10_encode, simply to make\r
- * all lpc10 functions have more consistent naming with each other.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:48 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:30:11 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Changed name of function from lpcenc_ to lpc10_encode, simply to make\r
- * all lpc10 functions have more consistent naming with each other.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:48 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Local variables that need not be saved */\r
-/* Uncoded speech parameters */\r
-/* Coded speech parameters */\r
-/* Others */\r
-/* Local state */\r
-/* None */\r
- /* Parameter adjustments */\r
- if (bits) {\r
- --bits;\r
- }\r
- if (speech) {\r
- --speech;\r
- }\r
-\r
- /* Function Body */\r
-\r
- chanrd_(&c__10, &ipitv, &irms, irc, &bits[1]);\r
- decode_(&ipitv, &irms, irc, voice, &pitch, &rms, rc, st);\r
- synths_(voice, &pitch, &rms, rc, &speech[1], &len, st);\r
- return 0;\r
-} /* lpcdec_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:31:21 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Changed name of function from lpcenc_ to lpc10_encode, simply to make\r
- * all lpc10 functions have more consistent naming with each other.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:44 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int lpcenc_(real *speech, integer *bits);\r
-extern int initlpcenc_(void);\r
-/*:ref: prepro_ 14 2 6 4 */\r
-/*:ref: analys_ 14 5 6 4 4 6 6 */\r
-/*:ref: encode_ 14 7 4 4 6 6 4 4 4 */\r
-/*:ref: chanwr_ 14 5 4 4 4 4 4 */\r
-/*:ref: initprepro_ 14 0 */\r
-/*:ref: initanalys_ 14 0 */\r
-#endif\r
-\r
-/* Table of constant values */\r
-\r
-static integer c__180 = 180;\r
-static integer c__10 = 10;\r
-\r
-/* ***************************************************************** */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:31:21 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Changed name of function from lpcenc_ to lpc10_encode, simply to make\r
- * all lpc10 functions have more consistent naming with each other.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:44 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.2 1996/03/28 00:01:22 jaf */\r
-/* Commented out some trace statements. */\r
-\r
-/* Revision 1.1 1996/03/28 00:00:27 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Encode one frame of 180 speech samples to 54 bits. */\r
-\r
-/* Input: */\r
-/* SPEECH - Speech encoded as real values in the range [-1,+1]. */\r
-/* Indices 1 through 180 read, and modified (by PREPRO). */\r
-/* Output: */\r
-/* BITS - 54 encoded bits, stored 1 per array element. */\r
-/* Indices 1 through 54 written. */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITLPCENC. */\r
-\r
-/* Subroutine */ int lpc10_encode(real *speech, integer *bits,\r
- struct lpc10_encoder_state *st)\r
-{\r
- integer irms, voice[2], pitch, ipitv;\r
- real rc[10];\r
- extern /* Subroutine */ int encode_(integer *, integer *, real *, real *, \r
- integer *, integer *, integer *), chanwr_(integer *, integer *, \r
- integer *, integer *, integer *, struct lpc10_encoder_state *),\r
- analys_(real *, integer *, \r
- integer *, real *, real *, struct lpc10_encoder_state *),\r
- prepro_(real *, integer *, struct lpc10_encoder_state *);\r
- integer irc[10];\r
- real rms;\r
-\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:31:21 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Changed name of function from lpcenc_ to lpc10_encode, simply to make\r
- * all lpc10 functions have more consistent naming with each other.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:44 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Local variables that need not be saved */\r
-/* Uncoded speech parameters */\r
-/* Coded speech parameters */\r
-/* Local state */\r
-/* None */\r
- /* Parameter adjustments */\r
- if (speech) {\r
- --speech;\r
- }\r
- if (bits) {\r
- --bits;\r
- }\r
-\r
- /* Function Body */\r
- prepro_(&speech[1], &c__180, st);\r
- analys_(&speech[1], voice, &pitch, &rms, rc, st);\r
- encode_(voice, &pitch, &rms, rc, &ipitv, &irms, irc);\r
- chanwr_(&c__10, &ipitv, &irms, irc, &bits[1], st);\r
- return 0;\r
-} /* lpcenc_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.18 2003/10/21 18:08:11 markster\r
-Fix include order\r
-\r
-Revision 1.5 2003/10/21 18:08:11 markster\r
-Fix include order\r
-\r
-Revision 1.4 2003/10/21 02:57:29 markster\r
-FreeBSD patch, take 2\r
-\r
-Revision 1.3 2003/10/16 21:11:30 martinp\r
-Revert the previous patch since it's braking compilation\r
-\r
-Revision 1.1 2003/02/12 13:59:15 matteo\r
-Initial revision\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:35:41 jaf\r
- * Added functions for allocating and initializing lpc10_encoder_state\r
- * and lpc10_decoder_state structures.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:40 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int lpcini_(void);\r
-/* comlen contrl_ 12 */\r
-/*:ref: initlpcenc_ 14 0 */\r
-/*:ref: initlpcdec_ 14 0 */\r
-#endif\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include <stdlib.h>\r
-#include "f2c.h"\r
-\r
-/* Common Block Declarations */\r
-\r
-struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* ***************************************************************** */\r
-\r
-/* $Log$\r
- * Revision 1.18 2003/10/21 18:08:11 markster\r
- * Fix include order\r
- *\r
-/* Revision 1.5 2003/10/21 18:08:11 markster\r
-/* Fix include order\r
-/*\r
-/* Revision 1.4 2003/10/21 02:57:29 markster\r
-/* FreeBSD patch, take 2\r
-/*\r
-/* Revision 1.3 2003/10/16 21:11:30 martinp\r
-/* Revert the previous patch since it's braking compilation\r
-/*\r
-/* Revision 1.1 2003/02/12 13:59:15 matteo\r
-/* Initial revision\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:35:41 jaf\r
- * Added functions for allocating and initializing lpc10_encoder_state\r
- * and lpc10_decoder_state structures.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:40 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.1 1996/03/28 00:04:05 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Initialize COMMON block variables used by LPC-10 encoder and decoder, */\r
-/* and call initialization routines for both of them. */\r
-\r
-/* Subroutine */ int lpcini_(void)\r
-{\r
-\r
-/* $Log$\r
- * Revision 1.18 2003/10/21 18:08:11 markster\r
- * Fix include order\r
- *\r
-/* Revision 1.5 2003/10/21 18:08:11 markster\r
-/* Fix include order\r
-/*\r
-/* Revision 1.4 2003/10/21 02:57:29 markster\r
-/* FreeBSD patch, take 2\r
-/*\r
-/* Revision 1.3 2003/10/16 21:11:30 martinp\r
-/* Revert the previous patch since it's braking compilation\r
-/*\r
-/* Revision 1.1 2003/02/12 13:59:15 matteo\r
-/* Initial revision\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:35:41 jaf\r
- * Added functions for allocating and initializing lpc10_encoder_state\r
- * and lpc10_decoder_state structures.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:40 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* $Log$\r
- * Revision 1.18 2003/10/21 18:08:11 markster\r
- * Fix include order\r
- *\r
-/* Revision 1.5 2003/10/21 18:08:11 markster\r
-/* Fix include order\r
-/*\r
-/* Revision 1.4 2003/10/21 02:57:29 markster\r
-/* FreeBSD patch, take 2\r
-/*\r
-/* Revision 1.3 2003/10/16 21:11:30 martinp\r
-/* Revert the previous patch since it's braking compilation\r
-/*\r
-/* Revision 1.1 2003/02/12 13:59:15 matteo\r
-/* Initial revision\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:35:41 jaf\r
- * Added functions for allocating and initializing lpc10_encoder_state\r
- * and lpc10_decoder_state structures.\r
- *\r
- * Revision 1.1 1996/08/19 22:31:40 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
- contrl_1.order = 10;\r
- contrl_1.lframe = 180;\r
- contrl_1.corrp = TRUE_;\r
- return 0;\r
-} /* lpcini_ */\r
-\r
-\r
-\r
-/* Allocate memory for, and initialize, the state that needs to be\r
- kept from encoding one frame to the next for a single\r
- LPC-10-compressed audio stream. Return 0 if malloc fails,\r
- otherwise return pointer to new structure. */\r
-\r
-struct lpc10_encoder_state *\r
-create_lpc10_encoder_state()\r
-{\r
- struct lpc10_encoder_state *st;\r
-\r
- st = (struct lpc10_encoder_state *)\r
- malloc((unsigned) sizeof (struct lpc10_encoder_state));\r
- if (st != 0) {\r
- init_lpc10_encoder_state(st);\r
- }\r
- return (st);\r
-}\r
-\r
-\r
-\r
-void init_lpc10_encoder_state(struct lpc10_encoder_state *st)\r
-{\r
- int i;\r
-\r
- lpcini_();\r
-\r
- /* State used only by function hp100 */\r
- st->z11 = 0.0f;\r
- st->z21 = 0.0f;\r
- st->z12 = 0.0f;\r
- st->z22 = 0.0f;\r
- \r
- /* State used by function analys */\r
- for (i = 0; i < 540; i++) {\r
- st->inbuf[i] = 0.0f;\r
- st->pebuf[i] = 0.0f;\r
- }\r
- for (i = 0; i < 696; i++) {\r
- st->lpbuf[i] = 0.0f;\r
- }\r
- for (i = 0; i < 312; i++) {\r
- st->ivbuf[i] = 0.0f;\r
- }\r
- st->bias = 0.0f;\r
- /* integer osbuf[10]; /* no initial value necessary */\r
- st->osptr = 1;\r
- for (i = 0; i < 3; i++) {\r
- st->obound[i] = 0;\r
- }\r
- st->vwin[4] = 307;\r
- st->vwin[5] = 462;\r
- st->awin[4] = 307;\r
- st->awin[5] = 462;\r
- for (i = 0; i < 8; i++) {\r
- st->voibuf[i] = 0;\r
- }\r
- for (i = 0; i < 3; i++) {\r
- st->rmsbuf[i] = 0.0f;\r
- }\r
- for (i = 0; i < 30; i++) {\r
- st->rcbuf[i] = 0.0f;\r
- }\r
- st->zpre = 0.0f;\r
-\r
-\r
- /* State used by function onset */\r
- st->n = 0.0f;\r
- st->d__ = 1.0f;\r
- /* real fpc; /* no initial value necessary */\r
- for (i = 0; i < 16; i++) {\r
- st->l2buf[i] = 0.0f;\r
- }\r
- st->l2sum1 = 0.0f;\r
- st->l2ptr1 = 1;\r
- st->l2ptr2 = 9;\r
- /* integer lasti; /* no initial value necessary */\r
- st->hyst = FALSE_;\r
-\r
- /* State used by function voicin */\r
- st->dither = 20.0f;\r
- st->maxmin = 0.0f;\r
- for (i = 0; i < 6; i++) {\r
- st->voice[i] = 0.0f;\r
- }\r
- st->lbve = 3000;\r
- st->fbve = 3000;\r
- st->fbue = 187;\r
- st->ofbue = 187;\r
- st->sfbue = 187;\r
- st->lbue = 93;\r
- st->olbue = 93;\r
- st->slbue = 93;\r
- st->snr = (real) (st->fbve / st->fbue << 6);\r
-\r
- /* State used by function dyptrk */\r
- for (i = 0; i < 60; i++) {\r
- st->s[i] = 0.0f;\r
- }\r
- for (i = 0; i < 120; i++) {\r
- st->p[i] = 0;\r
- }\r
- st->ipoint = 0;\r
- st->alphax = 0.0f;\r
-\r
- /* State used by function chanwr */\r
- st->isync = 0;\r
-\r
-}\r
-\r
-\r
-\r
-/* Allocate memory for, and initialize, the state that needs to be\r
- kept from decoding one frame to the next for a single\r
- LPC-10-compressed audio stream. Return 0 if malloc fails,\r
- otherwise return pointer to new structure. */\r
-\r
-struct lpc10_decoder_state *\r
-create_lpc10_decoder_state()\r
-{\r
- struct lpc10_decoder_state *st;\r
-\r
- st = (struct lpc10_decoder_state *)\r
- malloc((unsigned) sizeof (struct lpc10_decoder_state));\r
- if (st != 0) {\r
- init_lpc10_decoder_state(st);\r
- }\r
- return (st);\r
-}\r
-\r
-\r
-\r
-void init_lpc10_decoder_state(struct lpc10_decoder_state *st)\r
-{\r
- int i;\r
-\r
- lpcini_();\r
-\r
- /* State used by function decode */\r
- st->iptold = 60;\r
- st->first = TRUE_;\r
- st->ivp2h = 0;\r
- st->iovoic = 0;\r
- st->iavgp = 60;\r
- st->erate = 0;\r
- for (i = 0; i < 30; i++) {\r
- st->drc[i] = 0;\r
- }\r
- for (i = 0; i < 3; i++) {\r
- st->dpit[i] = 0;\r
- st->drms[i] = 0;\r
- }\r
-\r
- /* State used by function synths */\r
- for (i = 0; i < 360; i++) {\r
- st->buf[i] = 0.0f;\r
- }\r
- st->buflen = 180;\r
-\r
- /* State used by function pitsyn */\r
- /* ivoico; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- /* ipito; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- st->rmso = 1.0f;\r
- /* rco[10]; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- /* integer jsamp; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */\r
- st->first_pitsyn = TRUE_;\r
-\r
- /* State used by function bsynz */\r
- st->ipo = 0;\r
- for (i = 0; i < 166; i++) {\r
- st->exc[i] = 0.0f;\r
- st->exc2[i] = 0.0f;\r
- }\r
- st->lpi1 = 0.0f;\r
- st->lpi2 = 0.0f;\r
- st->lpi3 = 0.0f;\r
- st->hpi1 = 0.0f;\r
- st->hpi2 = 0.0f;\r
- st->hpi3 = 0.0f;\r
- st->rmso_bsynz = 0.0f;\r
-\r
- /* State used by function random */\r
- st->j = 2;\r
- st->k = 5;\r
- st->y[0] = (shortint) -21161;\r
- st->y[1] = (shortint) -8478;\r
- st->y[2] = (shortint) 30892;\r
- st->y[3] = (shortint) -10216;\r
- st->y[4] = (shortint) 16950;\r
-\r
- /* State used by function deemp */\r
- st->dei1 = 0.0f;\r
- st->dei2 = 0.0f;\r
- st->deo1 = 0.0f;\r
- st->deo2 = 0.0f;\r
- st->deo3 = 0.0f;\r
-}\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:31:35 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *nsamp);\r
-#endif\r
-\r
-/* *********************************************************************** */\r
-\r
-/* LPFILT Version 55 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:35 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/15 16:53:49 jaf */\r
-/* Just put comment header in standard form. */\r
-\r
-/* Revision 1.2 1996/03/12 23:58:06 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:47:44 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* *********************************************************************** */\r
-\r
-/* 31 Point Equiripple FIR Low-Pass Filter */\r
-/* Linear phase, delay = 15 samples */\r
-\r
-/* Passband: ripple = 0.25 dB, cutoff = 800 Hz */\r
-/* Stopband: atten. = 40. dB, cutoff = 1240 Hz */\r
-\r
-/* Inputs: */\r
-/* LEN - Length of speech buffers */\r
-/* NSAMP - Number of samples to filter */\r
-/* INBUF - Input speech buffer */\r
-/* Indices len-nsamp-29 through len are read. */\r
-/* Output: */\r
-/* LPBUF - Low passed speech buffer (must be different array than INBUF) */\r
-/* Indices len+1-nsamp through len are written. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *\r
- nsamp)\r
-{\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- integer j;\r
- real t;\r
-\r
-/* Arguments */\r
-/* Parameters/constants */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* None */\r
- /* Parameter adjustments */\r
- --lpbuf;\r
- --inbuf;\r
-\r
- /* Function Body */\r
- i__1 = *len;\r
- for (j = *len + 1 - *nsamp; j <= i__1; ++j) {\r
- t = (inbuf[j] + inbuf[j - 30]) * -.0097201988f;\r
- t += (inbuf[j - 1] + inbuf[j - 29]) * -.0105179986f;\r
- t += (inbuf[j - 2] + inbuf[j - 28]) * -.0083479648f;\r
- t += (inbuf[j - 3] + inbuf[j - 27]) * 5.860774e-4f;\r
- t += (inbuf[j - 4] + inbuf[j - 26]) * .0130892089f;\r
- t += (inbuf[j - 5] + inbuf[j - 25]) * .0217052232f;\r
- t += (inbuf[j - 6] + inbuf[j - 24]) * .0184161253f;\r
- t += (inbuf[j - 7] + inbuf[j - 23]) * 3.39723e-4f;\r
- t += (inbuf[j - 8] + inbuf[j - 22]) * -.0260797087f;\r
- t += (inbuf[j - 9] + inbuf[j - 21]) * -.0455563702f;\r
- t += (inbuf[j - 10] + inbuf[j - 20]) * -.040306855f;\r
- t += (inbuf[j - 11] + inbuf[j - 19]) * 5.029835e-4f;\r
- t += (inbuf[j - 12] + inbuf[j - 18]) * .0729262903f;\r
- t += (inbuf[j - 13] + inbuf[j - 17]) * .1572008878f;\r
- t += (inbuf[j - 14] + inbuf[j - 16]) * .2247288674f;\r
- t += inbuf[j - 15] * .250535965f;\r
- lpbuf[j] = t;\r
- }\r
- return 0;\r
-} /* lpfilt_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:31:31 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern integer median_(integer *d1, integer *d2, integer *d3);\r
-#endif\r
-\r
-/* ********************************************************************* */\r
-\r
-/* MEDIAN Version 45G */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:31 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.2 1996/03/14 22:30:22 jaf */\r
-/* Just rearranged the comments and local variable declarations a bit. */\r
-\r
-/* Revision 1.1 1996/02/07 14:47:53 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Find median of three values */\r
-\r
-/* Input: */\r
-/* D1,D2,D3 - Three input values */\r
-/* Output: */\r
-/* MEDIAN - Median value */\r
-\r
-integer median_(integer *d1, integer *d2, integer *d3)\r
-{\r
- /* System generated locals */\r
- integer ret_val;\r
-\r
-/* Arguments */\r
- ret_val = *d2;\r
- if (*d2 > *d1 && *d2 > *d3) {\r
- ret_val = *d1;\r
- if (*d3 > *d1) {\r
- ret_val = *d3;\r
- }\r
- } else if (*d2 < *d1 && *d2 < *d3) {\r
- ret_val = *d1;\r
- if (*d3 < *d1) {\r
- ret_val = *d3;\r
- }\r
- }\r
- return ret_val;\r
-} /* median_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:31:25 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int mload_(integer *order, integer *awins, integer *awinf, real *speech, real *phi, real *psi);\r
-#endif\r
-\r
-/* ***************************************************************** */\r
-\r
-/* MLOAD Version 48 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:25 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.5 1996/03/27 23:59:51 jaf */\r
-/* Added some more accurate comments about which indices of the argument */\r
-/* array SPEECH are read. I thought that this might be the cause of a */\r
-/* problem I've been having, but it isn't. */\r
-\r
-/* Revision 1.4 1996/03/26 19:16:53 jaf */\r
-/* Commented out the code at the end that copied the lower triangular */\r
-/* half of PHI into the upper triangular half (making the resulting */\r
-/* matrix symmetric). The upper triangular half was never used by later */\r
-/* code in subroutine ANALYS. */\r
-\r
-/* Revision 1.3 1996/03/18 21:16:00 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 16:47:41 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:48:01 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Load a covariance matrix. */\r
-\r
-/* Input: */\r
-/* ORDER - Analysis order */\r
-/* AWINS - Analysis window start */\r
-/* AWINF - Analysis window finish */\r
-/* SPEECH(AWINF) - Speech buffer */\r
-/* Indices MIN(AWINS, AWINF-(ORDER-1)) through */\r
-/* MAX(AWINF, AWINS+(ORDER-1)) read. */\r
-/* As long as (AWINF-AWINS) .GE. (ORDER-1), */\r
-/* this is just indices AWINS through AWINF. */\r
-/* Output: */\r
-/* PHI(ORDER,ORDER) - Covariance matrix */\r
-/* Lower triangular half and diagonal written, and read.*/\r
-/* Upper triangular half untouched. */\r
-/* PSI(ORDER) - Prediction vector */\r
-/* Indices 1 through ORDER written, */\r
-/* and most are read after that. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int mload_(integer *order, integer *awins, integer *awinf, \r
- real *speech, real *phi, real *psi)\r
-{\r
- /* System generated locals */\r
- integer phi_dim1, phi_offset, i__1, i__2;\r
-\r
- /* Local variables */\r
- integer c__, i__, r__, start;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
-/* Load first column of triangular covariance matrix PHI */\r
- /* Parameter adjustments */\r
- --psi;\r
- phi_dim1 = *order;\r
- phi_offset = phi_dim1 + 1;\r
- phi -= phi_offset;\r
- --speech;\r
-\r
- /* Function Body */\r
- start = *awins + *order;\r
- i__1 = *order;\r
- for (r__ = 1; r__ <= i__1; ++r__) {\r
- phi[r__ + phi_dim1] = 0.f;\r
- i__2 = *awinf;\r
- for (i__ = start; i__ <= i__2; ++i__) {\r
- phi[r__ + phi_dim1] += speech[i__ - 1] * speech[i__ - r__];\r
- }\r
- }\r
-/* Load last element of vector PSI */\r
- psi[*order] = 0.f;\r
- i__1 = *awinf;\r
- for (i__ = start; i__ <= i__1; ++i__) {\r
- psi[*order] += speech[i__] * speech[i__ - *order];\r
- }\r
-/* End correct to get additional columns of PHI */\r
- i__1 = *order;\r
- for (r__ = 2; r__ <= i__1; ++r__) {\r
- i__2 = r__;\r
- for (c__ = 2; c__ <= i__2; ++c__) {\r
- phi[r__ + c__ * phi_dim1] = phi[r__ - 1 + (c__ - 1) * phi_dim1] - \r
- speech[*awinf + 1 - r__] * speech[*awinf + 1 - c__] + \r
- speech[start - r__] * speech[start - c__];\r
- }\r
- }\r
-/* End correct to get additional elements of PSI */\r
- i__1 = *order - 1;\r
- for (c__ = 1; c__ <= i__1; ++c__) {\r
- psi[c__] = phi[c__ + 1 + phi_dim1] - speech[start - 1] * speech[start \r
- - 1 - c__] + speech[*awinf] * speech[*awinf - c__];\r
- }\r
-/* Copy lower triangular section into upper (why bother?) */\r
-/* I'm commenting this out, since the upper triangular half of PHI \r
-*/\r
-/* is never used by later code, unless a sufficiently high level of \r
-*/\r
-/* tracing is turned on. */\r
-/* DO R = 1,ORDER */\r
-/* DO C = 1,R-1 */\r
-/* PHI(C,R) = PHI(R,C) */\r
-/* END DO */\r
-/* END DO */\r
- return 0;\r
-} /* mload_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:37:55 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:31:18 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int onset_(real *pebuf, integer *osbuf, integer *osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *lframe, struct lpc10_encoder_state *st);\r
-#endif\r
-\r
-/* Table of constant values */\r
-\r
-static real c_b2 = 1.f;\r
-\r
-/* ****************************************************************** */\r
-\r
-/* ONSET Version 49 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:37:55 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:31:18 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.5 1996/03/15 16:41:01 jaf */\r
-/* Just rearranged INITONSET assignment orders to be consistent with */\r
-/* order of DATA statements in ONSET. */\r
-\r
-/* Revision 1.4 1996/03/15 15:48:27 jaf */\r
-/* Changed some comments, and only reordered the DATA statements (their */\r
-/* meaning wasn't changed). */\r
-\r
-/* Revision 1.3 1996/03/14 23:53:06 jaf */\r
-/* Added an entry INITONSET that reinitializes the local state variables */\r
-/* of subroutine ONSET. */\r
-\r
-/* Rearranged quite a few comments, adding more explaining which */\r
-/* arguments were inputs, and how the modified ones can be changed. */\r
-\r
-/* Revision 1.2 1996/03/12 23:53:00 jaf */\r
-/* Lots of comments added about the local state of this subroutine that */\r
-/* must be saved from one invocation to the next. */\r
-\r
-/* One constant 180 replaced with LFRAME, which should be "more general", */\r
-/* even though it would probably require many more changes than this to */\r
-/* get this coder to work for other frame sizes. */\r
-\r
-/* Revision 1.1 1996/02/07 14:48:09 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ****************************************************************** */\r
-\r
-/* Floating point version */\r
-\r
-\r
-/* Detection of onsets in (or slightly preceding) the futuremost frame */\r
-/* of speech. */\r
-\r
-\r
-/* Input: */\r
-/* PEBUF(SBUFL:SBUFH) - Preemphasized speech */\r
-/* Indices SBUFH-LFRAME through SBUFH are read. */\r
-/* OSLEN - Maximum number of onsets that can be stored in OSBUF. */\r
-/* SBUFL, SBUFH - Range of PEBUF */\r
-/* LFRAME - length of a frame, in samples */\r
-/* Input/Output: */\r
-/* OSBUF(OSLEN) - Buffer which holds sorted indexes of onsets */\r
-/* Indices A through B are modified, where A */\r
-/* is the original value of OSPTR, and B is the final */\r
-/* value of OSPTR-1. B is at most OSLEN. */\r
-/* OSPTR - Free pointer into OSBUF */\r
-/* Initial value should be .LE. OSLEN+1. */\r
-/* If so, final value grows by one for each new onset */\r
-/* found, and final value will be .LE. OSLEN+1. */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this subroutine, or */\r
-/* reinitialize its state for any other reason, call the ENTRY INITONSET. */\r
-\r
-/* Subroutine */ int onset_(real *pebuf, integer *osbuf, integer *\r
- osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *\r
- lframe, struct lpc10_encoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- real *n;\r
- real *d__;\r
- real *l2buf;\r
- real *l2sum1;\r
- integer *l2ptr1;\r
- integer *l2ptr2;\r
- logical *hyst;\r
-\r
- /* System generated locals */\r
- integer pebuf_offset, i__1;\r
- real r__1;\r
-\r
- /* Builtin functions */\r
- double r_sign(real *, real *);\r
-\r
- /* Local variables */\r
- integer i__;\r
- integer *lasti;\r
- real l2sum2;\r
- real *fpc;\r
-\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:37:55 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:31:18 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Parameters/constants */\r
-/* Parameters for onset detection algorithm: */\r
-/* L2 Threshold for filtered slope of FPC (function of L2WID!) */\r
-/* L2LAG Lag due to both filters which compute filtered slope of FPC */\r
-/* L2WID Width of the filter which computes the slope of FPC */\r
-/* OSHYST The number of samples of slope(FPC) which must be below */\r
-/* the threshold before a new onset may be declared. */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* Variables */\r
-/* N, D Numerator and denominator of prediction filters */\r
-/* FPC Current prediction coefs */\r
-/* L2BUF, L2SUM1, L2SUM2 State of slope filter */\r
-/* The only "significant" change I've made is to change L2SUM2 out \r
-*/\r
-/* of the list of local variables that need to be saved, since it */\r
-/* didn't need to be. */\r
-/* L2SUM1 need not be, but avoiding saving it would require a small \r
-*/\r
-/* change to the body of the code. See comments below for an */\r
-/* example of how the code could be changed to avoid saving L2SUM1. \r
-*/\r
-/* FPC and LASTI are saved from one invocation to the next, but */\r
-/* they are not given initial values. This is acceptable, because \r
-*/\r
-/* FPC will be assigned a value the first time that this function */\r
-/* is called after D is initialized to 1, since the formula to */\r
-/* change D will not change it to 0 in one step, and the IF (D */\r
-/* .NE. 0) statement will execute its THEN part, initializing FPC. \r
-*/\r
-\r
-/* LASTI's value will not be used until HYST is .TRUE., and */\r
-/* whenever HYST is changed from its initial value of .FALSE., */\r
-/* LASTI is assigned a value. */\r
-/* In a C version of this coder, it would be nice if all of these */\r
-/* saved things, in this and all other subroutines, could be stored \r
-*/\r
-/* in a single struct lpc10_coder_state_t, initialized with a call \r
-*/\r
-/* to a function like lpc10_init(&lpc10_coder_state). In this way, \r
-*/\r
-/* a program that used these functions could conveniently alternate \r
-*/\r
-/* coding more than one distinct audio stream. */\r
-\r
- n = &(st->n);\r
- d__ = &(st->d__);\r
- fpc = &(st->fpc);\r
- l2buf = &(st->l2buf[0]);\r
- l2sum1 = &(st->l2sum1);\r
- l2ptr1 = &(st->l2ptr1);\r
- l2ptr2 = &(st->l2ptr2);\r
- lasti = &(st->lasti);\r
- hyst = &(st->hyst);\r
-\r
- /* Parameter adjustments */\r
- if (osbuf) {\r
- --osbuf;\r
- }\r
- if (pebuf) {\r
- pebuf_offset = *sbufl;\r
- pebuf -= pebuf_offset;\r
- }\r
-\r
- /* Function Body */\r
-\r
-/* The following line subtracted a hard-coded "180" from LASTI, */\r
-/* instead of using a variable like LFRAME or a constant like */\r
-/* MAXFRM. I changed it to LFRAME, for "generality". */\r
- if (*hyst) {\r
- *lasti -= *lframe;\r
- }\r
- i__1 = *sbufh;\r
- for (i__ = *sbufh - *lframe + 1; i__ <= i__1; ++i__) {\r
-/* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1. \r
-*/\r
- *n = (pebuf[i__] * pebuf[i__ - 1] + (*n) * 63.f) / 64.f;\r
-/* Computing 2nd power */\r
- r__1 = pebuf[i__ - 1];\r
- *d__ = (r__1 * r__1 + (*d__) * 63.f) / 64.f;\r
- if ((*d__) != 0.f) {\r
- if (abs(*n) > (*d__)) {\r
- *fpc = r_sign(&c_b2, n);\r
- } else {\r
- *fpc = (*n) / (*d__);\r
- }\r
- }\r
-/* Filter FPC */\r
-/* In order to allow L2SUM1 not to be saved from one invocation \r
-of */\r
-/* this subroutine to the next, one could change the sequence of\r
- */\r
-/* assignments below, up to the IF statement, to the following. \r
- In */\r
-/* addition, the initial value of L2PTR2 should be changed to */\r
-/* L2WID/2 instead of L2WID/2+1. */\r
-\r
-/* L2SUM1 = L2BUF(L2PTR2) */\r
-/* L2PTR2 = MOD(L2PTR2,L2WID)+1 */\r
-/* L2SUM1 = L2SUM1 - L2BUF(L2PTR2) + FPC */\r
-/* L2BUF(L2PTR2) = L2SUM1 */\r
-\r
-/* * The following lines didn't change from the original: */\r
-/* L2SUM2 = L2BUF(L2PTR1) */\r
-/* L2BUF(L2PTR1) = FPC */\r
-/* L2PTR1 = MOD(L2PTR1,L2WID)+1 */\r
-\r
- l2sum2 = l2buf[*l2ptr1 - 1];\r
- *l2sum1 = *l2sum1 - l2buf[*l2ptr2 - 1] + *fpc;\r
- l2buf[*l2ptr2 - 1] = *l2sum1;\r
- l2buf[*l2ptr1 - 1] = *fpc;\r
- *l2ptr1 = *l2ptr1 % 16 + 1;\r
- *l2ptr2 = *l2ptr2 % 16 + 1;\r
- if ((r__1 = *l2sum1 - l2sum2, abs(r__1)) > 1.7f) {\r
- if (! (*hyst)) {\r
-/* Ignore if buffer full */\r
- if (*osptr <= *oslen) {\r
- osbuf[*osptr] = i__ - 9;\r
- ++(*osptr);\r
- }\r
- *hyst = TRUE_;\r
- }\r
- *lasti = i__;\r
-/* After one onset detection, at least OSHYST sample times m\r
-ust go */\r
-/* by before another is allowed to occur. */\r
- } else if ((*hyst) && i__ - *lasti >= 10) {\r
- *hyst = FALSE_;\r
- }\r
- }\r
- return 0;\r
-} /* onset_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.16 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.15 2003/11/23 22:14:32 markster\r
-Various warning cleanups\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:40:12 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:31:12 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-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);\r
-#endif\r
-\r
-/* ***************************************************************** */\r
-\r
-/* PITSYN Version 53 */\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/11/23 22:14:32 markster\r
-/* Various warning cleanups\r
-/*\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:40:12 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:31:12 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.2 1996/03/25 18:49:07 jaf */\r
-/* Added commments about which indices of array arguments are read or */\r
-/* written. */\r
-\r
-/* Rearranged local variable declarations to indicate which need to be */\r
-/* saved from one invocation to the next. Added entry INITPITSYN to */\r
-/* reinitialize local state variables, if desired. */\r
-\r
-/* Added lots of comments about proving that the maximum number of pitch */\r
-/* periods (NOUT) that can be returned is 16. The call to STOP that */\r
-/* could happen if NOUT got too large was removed as a result. */\r
-\r
-/* Also proved that the total number of samples returned from N calls, */\r
-/* each with identical values of LFRAME, will always be in the range */\r
-/* N*LFRAME-MAXPIT+1 to N*LFRAME. */\r
-\r
-/* Revision 1.1 1996/02/07 14:48:18 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* Synthesize a single pitch epoch */\r
-\r
-/* Input: */\r
-/* ORDER - Synthesis order (number of RC's) */\r
-/* VOICE - Half frame voicing decisions */\r
-/* Indices 1 through 2 read. */\r
-/* LFRAME - Length of speech buffer */\r
-/* Input/Output: */\r
-/* PITCH - Pitch */\r
-/* This value should be in the range MINPIT (20) to MAXPIT */\r
-/* (156), inclusive. */\r
-/* PITCH can be modified under some conditions. */\r
-/* RMS - Energy (can be modified) */\r
-/* RMS is changed to 1 if the value passed in is less than 1. */\r
-/* RC - Reflection coefficients */\r
-/* Indices 1 through ORDER can be temporarily overwritten with */\r
-/* RCO, and then replaced with original values, under some */\r
-/* conditions. */\r
-/* Output: */\r
-/* IVUV - Pitch epoch voicing decisions */\r
-/* Indices (I) of IVUV, IPITI, and RMSI are written, */\r
-/* and indices (J,I) of RCI are written, */\r
-/* where I ranges from 1 to NOUT, and J ranges from 1 to ORDER. */\r
-/* IPITI - Pitch epoch length */\r
-/* RMSI - Pitch epoch energy */\r
-/* RCI - Pitch epoch RC's */\r
-/* NOUT - Number of pitch periods in this frame */\r
-/* This is at least 0, at least 1 if MAXPIT .LT. LFRAME (this */\r
-/* is currently true on every call), and can never be more than */\r
-/* (LFRAME+MAXPIT-1)/PITCH, which is currently 16 with */\r
-/* LFRAME=180, MAXPIT=156, and PITCH .GE. 20, as SYNTHS */\r
-/* guarantees when it calls this subroutine. */\r
-/* RATIO - Previous to present energy ratio */\r
-/* Always assigned a value. */\r
-\r
-/* Subroutine */ int pitsyn_(integer *order, integer *voice, \r
- integer *pitch, real *rms, real *rc, integer *lframe, integer *ivuv, \r
- integer *ipiti, real *rmsi, real *rci, integer *nout, real *ratio,\r
- struct lpc10_decoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- real *rmso;\r
- logical *first;\r
-\r
- /* System generated locals */\r
- integer rci_dim1 = 0, rci_offset, i__1, i__2;\r
- real r__1;\r
-\r
- /* Builtin functions */\r
- double log(doublereal), exp(doublereal);\r
-\r
- /* Local variables */\r
- real alrn, alro, yarc[10], prop;\r
- integer i__, j, vflag, jused, lsamp;\r
- integer *jsamp;\r
- real slope;\r
- integer *ipito;\r
- real uvpit;\r
- integer ip, nl, ivoice;\r
- integer *ivoico;\r
- integer istart;\r
- real *rco;\r
- real xxy;\r
-\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/11/23 22:14:32 markster\r
-/* Various warning cleanups\r
-/*\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:40:12 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:31:12 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Local variables that need not be saved */\r
-/* LSAMP is initialized in the IF (FIRST) THEN clause, but it is */\r
-/* not used the first time through, and it is given a value before \r
-*/\r
-/* use whenever FIRST is .FALSE., so it appears unnecessary to */\r
-/* assign it a value when FIRST is .TRUE. */\r
-/* Local state */\r
-/* FIRST - .TRUE. only on first call to PITSYN. */\r
-/* IVOICO - Previous VOICE(2) value. */\r
-/* IPITO - Previous PITCH value. */\r
-/* RMSO - Previous RMS value. */\r
-/* RCO - Previous RC values. */\r
-\r
-/* JSAMP - If this routine is called N times with identical values of */\r
-/* LFRAME, then the total length of all pitch periods returned */\r
-/* is always N*LFRAME-JSAMP, and JSAMP is always in the range 0 \r
-*/\r
-/* to MAXPIT-1 (see below for why this is so). Thus JSAMP is */\r
-/* the number of samples "left over" from the previous call to */\r
-/* PITSYN, that haven't been "used" in a pitch period returned */\r
-/* from this subroutine. Every time this subroutine is called, \r
-*/\r
-/* it returns pitch periods with a total length of at most */\r
-/* LFRAME+JSAMP. */\r
-\r
-/* IVOICO, IPITO, RCO, and JSAMP need not be assigned an initial value */\r
-/* with a DATA statement, because they are always initialized on the */\r
-/* first call to PITSYN. */\r
-\r
-/* FIRST and RMSO should be initialized with DATA statements, because */\r
-/* even on the first call, they are used before being initialized. */\r
- /* Parameter adjustments */\r
- if (rc) {\r
- --rc;\r
- }\r
- if (rci) {\r
- rci_dim1 = *order;\r
- rci_offset = rci_dim1 + 1;\r
- rci -= rci_offset;\r
- }\r
- if (voice) {\r
- --voice;\r
- }\r
- if (ivuv) {\r
- --ivuv;\r
- }\r
- if (ipiti) {\r
- --ipiti;\r
- }\r
- if (rmsi) {\r
- --rmsi;\r
- }\r
-\r
- /* Function Body */\r
- ivoico = &(st->ivoico);\r
- ipito = &(st->ipito);\r
- rmso = &(st->rmso);\r
- rco = &(st->rco[0]);\r
- jsamp = &(st->jsamp);\r
- first = &(st->first_pitsyn);\r
-\r
- if (*rms < 1.f) {\r
- *rms = 1.f;\r
- }\r
- if (*rmso < 1.f) {\r
- *rmso = 1.f;\r
- }\r
- uvpit = 0.f;\r
- *ratio = *rms / (*rmso + 8.f);\r
- if (*first) {\r
- lsamp = 0;\r
- ivoice = voice[2];\r
- if (ivoice == 0) {\r
- *pitch = *lframe / 4;\r
- }\r
- *nout = *lframe / *pitch;\r
- *jsamp = *lframe - *nout * *pitch;\r
-\r
-/* SYNTHS only calls this subroutine with PITCH in the range \r
-20 */\r
-/* to 156. LFRAME = MAXFRM = 180, so NOUT is somewhere in th\r
-e */\r
-/* range 1 to 9. */\r
-\r
-/* JSAMP is "LFRAME mod PITCH", so it is in the range 0 to */\r
-/* (PITCH-1), or 0 to MAXPIT-1=155, after the first call. */\r
-\r
- i__1 = *nout;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- i__2 = *order;\r
- for (j = 1; j <= i__2; ++j) {\r
- rci[j + i__ * rci_dim1] = rc[j];\r
- }\r
- ivuv[i__] = ivoice;\r
- ipiti[i__] = *pitch;\r
- rmsi[i__] = *rms;\r
- }\r
- *first = FALSE_;\r
- } else {\r
- vflag = 0;\r
- lsamp = *lframe + *jsamp;\r
- slope = (*pitch - *ipito) / (real) lsamp;\r
- *nout = 0;\r
- jused = 0;\r
- istart = 1;\r
- if (voice[1] == *ivoico && voice[2] == voice[1]) {\r
- if (voice[2] == 0) {\r
-/* SSUV - - 0 , 0 , 0 */\r
- *pitch = *lframe / 4;\r
- *ipito = *pitch;\r
- if (*ratio > 8.f) {\r
- *rmso = *rms;\r
- }\r
- }\r
-/* SSVC - - 1 , 1 , 1 */\r
- slope = (*pitch - *ipito) / (real) lsamp;\r
- ivoice = voice[2];\r
- } else {\r
- if (*ivoico != 1) {\r
- if (*ivoico == voice[1]) {\r
-/* UV2VC2 - - 0 , 0 , 1 */\r
- nl = lsamp - *lframe / 4;\r
- } else {\r
-/* UV2VC1 - - 0 , 1 , 1 */\r
- nl = lsamp - *lframe * 3 / 4;\r
- }\r
- ipiti[1] = nl / 2;\r
- ipiti[2] = nl - ipiti[1];\r
- ivuv[1] = 0;\r
- ivuv[2] = 0;\r
- rmsi[1] = *rmso;\r
- rmsi[2] = *rmso;\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- rci[i__ + rci_dim1] = rco[i__ - 1];\r
- rci[i__ + (rci_dim1 << 1)] = rco[i__ - 1];\r
- rco[i__ - 1] = rc[i__];\r
- }\r
- slope = 0.f;\r
- *nout = 2;\r
- *ipito = *pitch;\r
- jused = nl;\r
- istart = nl + 1;\r
- ivoice = 1;\r
- } else {\r
- if (*ivoico != voice[1]) {\r
-/* VC2UV1 - - 1 , 0 , 0 */\r
- lsamp = *lframe / 4 + *jsamp;\r
- } else {\r
-/* VC2UV2 - - 1 , 1 , 0 */\r
- lsamp = *lframe * 3 / 4 + *jsamp;\r
- }\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- yarc[i__ - 1] = rc[i__];\r
- rc[i__] = rco[i__ - 1];\r
- }\r
- ivoice = 1;\r
- slope = 0.f;\r
- vflag = 1;\r
- }\r
- }\r
-/* Here is the value of most variables that are used below, depending \r
-on */\r
-/* the values of IVOICO, VOICE(1), and VOICE(2). VOICE(1) and VOICE(2\r
-) */\r
-/* are input arguments, and IVOICO is the value of VOICE(2) on the */\r
-/* previous call (see notes for the IF (NOUT .NE. 0) statement near th\r
-e */\r
-/* end). Each of these three values is either 0 or 1. These three */\r
-/* values below are given as 3-bit long strings, in the order IVOICO, \r
-*/\r
-/* VOICE(1), and VOICE(2). It appears that the code above assumes tha\r
-t */\r
-/* the bit sequences 010 and 101 never occur, but I wonder whether a \r
-*/\r
-/* large enough number of bit errors in the channel could cause such a\r
- */\r
-/* thing to happen, and if so, could that cause NOUT to ever go over 1\r
-1? */\r
-\r
-/* Note that all of the 180 values in the table are really LFRAME, but\r
- */\r
-/* 180 has fewer characters, and it makes the table a little more */\r
-/* concrete. If LFRAME is ever changed, keep this in mind. Similarly\r
-, */\r
-/* 135's are 3*LFRAME/4, and 45's are LFRAME/4. If LFRAME is not a */\r
-/* multiple of 4, then the 135 for NL-JSAMP is actually LFRAME-LFRAME/\r
-4, */\r
-/* and the 45 for NL-JSAMP is actually LFRAME-3*LFRAME/4. */\r
-\r
-/* Note that LSAMP-JSAMP is given as the variable. This was just for \r
-*/\r
-/* brevity, to avoid adding "+JSAMP" to all of the column entries. */\r
-/* Similarly for NL-JSAMP. */\r
-\r
-/* Variable | 000 001 011,010 111 110 100,101 */\r
-/* ------------+-------------------------------------------------- */\r
-/* ISTART | 1 NL+1 NL+1 1 1 1 */\r
-/* LSAMP-JSAMP | 180 180 180 180 135 45 */\r
-/* IPITO | 45 PITCH PITCH oldPITCH oldPITCH oldPITCH */\r
-/* SLOPE | 0 0 0 seebelow 0 0 */\r
-/* JUSED | 0 NL NL 0 0 0 */\r
-/* PITCH | 45 PITCH PITCH PITCH PITCH PITCH */\r
-/* NL-JSAMP | -- 135 45 -- -- -- */\r
-/* VFLAG | 0 0 0 0 1 1 */\r
-/* NOUT | 0 2 2 0 0 0 */\r
-/* IVOICE | 0 1 1 1 1 1 */\r
-\r
-/* while_loop | once once once once twice twice */\r
-\r
-/* ISTART | -- -- -- -- JUSED+1 JUSED+1 */\r
-/* LSAMP-JSAMP | -- -- -- -- 180 180 */\r
-/* IPITO | -- -- -- -- oldPITCH oldPITCH */\r
-/* SLOPE | -- -- -- -- 0 0 */\r
-/* JUSED | -- -- -- -- ?? ?? */\r
-/* PITCH | -- -- -- -- PITCH PITCH */\r
-/* NL-JSAMP | -- -- -- -- -- -- */\r
-/* VFLAG | -- -- -- -- 0 0 */\r
-/* NOUT | -- -- -- -- ?? ?? */\r
-/* IVOICE | -- -- -- -- 0 0 */\r
-\r
-\r
-/* UVPIT is always 0.0 on the first pass through the DO WHILE (.TRUE.)\r
- */\r
-/* loop below. */\r
-\r
-/* The only possible non-0 value of SLOPE (in column 111) is */\r
-/* (PITCH-IPITO)/FLOAT(LSAMP) */\r
-\r
-/* Column 101 is identical to 100. Any good properties we can prove \r
-*/\r
-/* for 100 will also hold for 101. Similarly for 010 and 011. */\r
-\r
-/* SYNTHS calls this subroutine with PITCH restricted to the range 20 \r
-to */\r
-/* 156. IPITO is similarly restricted to this range, after the first \r
-*/\r
-/* call. IP below is also restricted to this range, given the */\r
-/* definitions of IPITO, SLOPE, UVPIT, and that I is in the range ISTA\r
-RT */\r
-/* to LSAMP. */\r
-\r
- while(TRUE_) {\r
-\r
-/* JUSED is the total length of all pitch periods curr\r
-ently */\r
-/* in the output arrays, in samples. */\r
-\r
-/* An invariant of the DO I = ISTART,LSAMP loop below,\r
- under */\r
-/* the condition that IP is always in the range 1 thro\r
-ugh */\r
-/* MAXPIT, is: */\r
-\r
-/* (I - MAXPIT) .LE. JUSED .LE. (I-1) */\r
-\r
-/* Note that the final value of I is LSAMP+1, so that \r
-after */\r
-/* the DO loop is complete, we know: */\r
-\r
-/* (LSAMP - MAXPIT + 1) .LE. JUSED .LE. LSAMP */\r
-\r
- i__1 = lsamp;\r
- for (i__ = istart; i__ <= i__1; ++i__) {\r
- r__1 = *ipito + slope * i__;\r
- ip = r__1 + .5f;\r
- if (uvpit != 0.f) {\r
- ip = uvpit;\r
- }\r
- if (ip <= i__ - jused) {\r
- ++(*nout);\r
-\r
-/* The following check is no longer nece\r
-ssary, now that */\r
-/* we can prove that NOUT will never go \r
-over 16. */\r
-\r
-/* IF (NOUT .GT. 16) STOP 'PITSYN: too many epochs' \r
-*/\r
-\r
- ipiti[*nout] = ip;\r
- *pitch = ip;\r
- ivuv[*nout] = ivoice;\r
- jused += ip;\r
- prop = (jused - ip / 2) / (real) lsamp;\r
- i__2 = *order;\r
- for (j = 1; j <= i__2; ++j) {\r
- alro = log((rco[j - 1] + 1) / (1 - rco[j - 1]));\r
- alrn = log((rc[j] + 1) / (1 - rc[j]));\r
- xxy = alro + prop * (alrn - alro);\r
- xxy = exp(xxy);\r
- rci[j + *nout * rci_dim1] = (xxy - 1) / (xxy + 1);\r
- }\r
- rmsi[*nout] = log(*rmso) + prop * (log(*rms) - log(*rmso));\r
- rmsi[*nout] = exp(rmsi[*nout]);\r
- }\r
- }\r
- if (vflag != 1) {\r
- goto L100;\r
- }\r
-\r
-/* I want to prove what range UVPIT must lie in after \r
-the */\r
-/* assignments to it below. To do this, I must determ\r
-ine */\r
-/* what range (LSAMP-ISTART) must lie in, after the */\r
-/* assignments to ISTART and LSAMP below. */\r
-\r
-/* Let oldLSAMP be the value of LSAMP at this point in\r
- the */\r
-/* execution. This is 135+JSAMP in state 110, or 45+J\r
-SAMP in */\r
-/* states 100 or 101. */\r
-\r
-/* Given the loop invariant on JUSED above, we know th\r
-at: */\r
-\r
-/* (oldLSAMP - MAXPIT + 1) .LE. JUSED .LE. oldLSAMP */\r
-\r
-/* ISTART is one more than this. */\r
-\r
-/* Let newLSAMP be the value assigned to LSAMP below. \r
- This */\r
-/* is 180+JSAMP. Thus (newLSAMP-oldLSAMP) is either 4\r
-5 or */\r
-/* 135, depending on the state. */\r
-\r
-/* Thus, the range of newLSAMP-ISTART is: */\r
-\r
-/* (newLSAMP-(oldLSAMP+1)) .LE. newLSAMP-ISTART */\r
-/* .LE. (newLSAMP-(oldLSAMP - MAXPIT + 2)) */\r
-\r
-/* or: */\r
-\r
-/* 46 .LE. newLSAMP-ISTART .LE. 133+MAXPIT .EQ. 289 */\r
-\r
-/* Therefore, UVPIT is in the range 23 to 144 after th\r
-e first */\r
-/* assignment to UVPIT below, and after the conditiona\r
-l */\r
-/* assignment, it is in the range 23 to 90. */\r
-\r
-/* The important thing is that it is in the range 20 t\r
-o 156, */\r
-/* so that in the loop above, IP is always in this ran\r
-ge. */\r
-\r
- vflag = 0;\r
- istart = jused + 1;\r
- lsamp = *lframe + *jsamp;\r
- slope = 0.f;\r
- ivoice = 0;\r
- uvpit = (real) ((lsamp - istart) / 2);\r
- if (uvpit > 90.f) {\r
- uvpit /= 2;\r
- }\r
- *rmso = *rms;\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- rc[i__] = yarc[i__ - 1];\r
- rco[i__ - 1] = yarc[i__ - 1];\r
- }\r
- }\r
-L100:\r
- *jsamp = lsamp - jused;\r
- }\r
-/* Given that the maximum pitch period MAXPIT .LT. LFRAME (this is \r
-*/\r
-/* currently true on every call, since SYNTHS always sets */\r
-/* LFRAME=180), NOUT will always be .GE. 1 at this point. */\r
- if (*nout != 0) {\r
- *ivoico = voice[2];\r
- *ipito = *pitch;\r
- *rmso = *rms;\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- rco[i__ - 1] = rc[i__];\r
- }\r
- }\r
- return 0;\r
-} /* pitsyn_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.16 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.15 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.2 2003/09/19 01:20:22 markster\r
-Code cleanups (bug #66)\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.3 2001/04/12 21:27:53 markh\r
-app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:31:07 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);\r
-#endif\r
-\r
-/* *********************************************************************** */\r
-\r
-/* PLACEA Version 48 */\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.2 2003/09/19 01:20:22 markster\r
-/* Code cleanups (bug #66)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.3 2001/04/12 21:27:53 markh\r
-/* app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:07 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.5 1996/03/19 20:41:55 jaf */\r
-/* Added some conditions satisfied by the output values in EWIN. */\r
-\r
-/* Revision 1.4 1996/03/19 20:24:17 jaf */\r
-/* Added some conditions satisfied by the output values in AWIN. */\r
-\r
-/* Revision 1.3 1996/03/18 21:40:04 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 16:43:09 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:48:31 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* *********************************************************************** */\r
-/* Input: */\r
-/* IPITCH */\r
-/* VOIBUF */\r
-/* Indices (2,AF-2), (1,AF-1), (2,AF-1), (1,AF), and (2,AF) read.*/\r
-/* All other indices untouched. */\r
-/* OBOUND */\r
-/* AF */\r
-/* VWIN */\r
-/* Indices (1,AF) and (2,AF) read. */\r
-/* All other indices untouched. */\r
-/* LFRAME */\r
-/* MAXWIN */\r
-/* Input/Output: */\r
-/* AWIN */\r
-/* Index (1,AF-1) read. */\r
-/* Indices (1,AF) and (2,AF) written, and then read. */\r
-/* All other indices untouched. */\r
-/* In all cases (except possibly one), the final values will */\r
-/* satisfy the condition: AWIN(2,AF)-AWIN(1,AF)+1 = MAXWIN. */\r
-/* In that other case, */\r
-/* AWIN(1,AF)=VWIN(1,AF) and AWIN(2,AF)=VWIN(2,AF). */\r
-/* Output: */\r
-/* EWIN */\r
-/* Indices (1,AF) and (2,AF) written. */\r
-/* All other indices untouched. */\r
-/* In all cases, the final values will satisfy the condition: */\r
-/* AWIN(1,AF) .LE. EWIN(1,AF) .LE. EWIN(2,AF) .LE. AWIN(2,AF) */\r
-/* In other words, the energy window is a sub-window of */\r
-/* the analysis window. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer *\r
- obound, integer *af, integer *vwin, integer *awin, integer *ewin, \r
- integer *lframe, integer *maxwin)\r
-{\r
- /* System generated locals */\r
- real r__1;\r
-\r
- /* Builtin functions */\r
- integer i_nint(real *);\r
-\r
- /* Local variables */\r
- logical allv, winv;\r
- integer i__, j, k, l, hrange;\r
- logical ephase;\r
- integer lrange;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
- /* Parameter adjustments */\r
- ewin -= 3;\r
- awin -= 3;\r
- vwin -= 3;\r
- --voibuf;\r
-\r
- /* Function Body */\r
- lrange = (*af - 2) * *lframe + 1;\r
- hrange = *af * *lframe;\r
-/* Place the Analysis window based on the voicing window */\r
-/* placement, onsets, tentative voicing decision, and pitch. */\r
-\r
-/* Case 1: Sustained Voiced Speech */\r
-/* If the five most recent voicing decisions are */\r
-/* voiced, then the window is placed phase-synchronously with the */\r
-/* previous window, as close to the present voicing window if possible. \r
-*/\r
-/* If onsets bound the voicing window, then preference is given to */\r
-/* a phase-synchronous placement which does not overlap these onsets. */\r
-\r
-/* Case 2: Voiced Transition */\r
-/* If at least one voicing decision in AF is voicied, and there are no \r
-*/\r
-/* onsets, then the window is placed as in case 1. */\r
-\r
-/* Case 3: Unvoiced Speech or Onsets */\r
-/* If both voicing decisions in AF are unvoiced, or there are onsets, */\r
-/* then the window is placed coincident with the voicing window. */\r
-\r
-/* Note: During phase-synchronous placement of windows, the length */\r
-/* is not altered from MAXWIN, since this would defeat the purpose */\r
-/* of phase-synchronous placement. */\r
-/* Check for case 1 and case 2 */\r
- allv = voibuf[((*af - 2) << 1) + 2] == 1;\r
- allv = allv && voibuf[((*af - 1) << 1) + 1] == 1;\r
- allv = allv && voibuf[((*af - 1) << 1) + 2] == 1;\r
- allv = allv && voibuf[(*af << 1) + 1] == 1;\r
- allv = allv && voibuf[(*af << 1) + 2] == 1;\r
- winv = voibuf[(*af << 1) + 1] == 1 || voibuf[(*af << 1) + 2] == 1;\r
- if (allv || (winv && *obound == 0)) {\r
-/* APHASE: Phase synchronous window placement. */\r
-/* Get minimum lower index of the window. */\r
- i__ = (lrange + *ipitch - 1 - awin[((*af - 1) << 1) + 1]) / *ipitch;\r
- i__ *= *ipitch;\r
- i__ += awin[((*af - 1) << 1) + 1];\r
-/* L = the actual length of this frame's analysis window. */\r
- l = *maxwin;\r
-/* Calculate the location where a perfectly centered window would star\r
-t. */\r
- k = (vwin[(*af << 1) + 1] + vwin[(*af << 1) + 2] + 1 - l) / 2;\r
-/* Choose the actual location to be the pitch multiple closest to this\r
-. */\r
- r__1 = (real) (k - i__) / *ipitch;\r
- awin[(*af << 1) + 1] = i__ + i_nint(&r__1) * *ipitch;\r
- awin[(*af << 1) + 2] = awin[(*af << 1) + 1] + l - 1;\r
-/* If there is an onset bounding the right of the voicing window and t\r
-he */\r
-/* analysis window overlaps that, then move the analysis window backwa\r
-rd */\r
-/* to avoid this onset. */\r
- if (*obound >= 2 && awin[(*af << 1) + 2] > vwin[(*af << 1) + 2]) {\r
- awin[(*af << 1) + 1] -= *ipitch;\r
- awin[(*af << 1) + 2] -= *ipitch;\r
- }\r
-/* Similarly for the left of the voicing window. */\r
- if ((*obound == 1 || *obound == 3) && awin[(*af << 1) + 1] < vwin[(*\r
- af << 1) + 1]) {\r
- awin[(*af << 1) + 1] += *ipitch;\r
- awin[(*af << 1) + 2] += *ipitch;\r
- }\r
-/* If this placement puts the analysis window above HRANGE, then */\r
-/* move it backward an integer number of pitch periods. */\r
- while(awin[(*af << 1) + 2] > hrange) {\r
- awin[(*af << 1) + 1] -= *ipitch;\r
- awin[(*af << 1) + 2] -= *ipitch;\r
- }\r
-/* Similarly if the placement puts the analysis window below LRANGE. \r
-*/\r
- while(awin[(*af << 1) + 1] < lrange) {\r
- awin[(*af << 1) + 1] += *ipitch;\r
- awin[(*af << 1) + 2] += *ipitch;\r
- }\r
-/* Make Energy window be phase-synchronous. */\r
- ephase = TRUE_;\r
-/* Case 3 */\r
- } else {\r
- awin[(*af << 1) + 1] = vwin[(*af << 1) + 1];\r
- awin[(*af << 1) + 2] = vwin[(*af << 1) + 2];\r
- ephase = FALSE_;\r
- }\r
-/* RMS is computed over an integer number of pitch periods in the analysis\r
- */\r
-/*window. When it is not placed phase-synchronously, it is placed as clos\r
-e*/\r
-/* as possible to onsets. */\r
- j = (awin[(*af << 1) + 2] - awin[(*af << 1) + 1] + 1) / *ipitch * *ipitch;\r
- if (j == 0 || ! winv) {\r
- ewin[(*af << 1) + 1] = vwin[(*af << 1) + 1];\r
- ewin[(*af << 1) + 2] = vwin[(*af << 1) + 2];\r
- } else if (! ephase && *obound == 2) {\r
- ewin[(*af << 1) + 1] = awin[(*af << 1) + 2] - j + 1;\r
- ewin[(*af << 1) + 2] = awin[(*af << 1) + 2];\r
- } else {\r
- ewin[(*af << 1) + 1] = awin[(*af << 1) + 1];\r
- ewin[(*af << 1) + 2] = awin[(*af << 1) + 1] + j - 1;\r
- }\r
- return 0;\r
-} /* placea_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.3 2001/04/12 21:27:53 markh\r
-app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:31:02 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-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);\r
-#endif\r
-\r
-/* ****************************************************************** */\r
-\r
-/* PLACEV Version 48 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.3 2001/04/12 21:27:53 markh\r
-/* app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:31:02 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.6 1996/03/19 20:42:19 jaf */\r
-/* Added some conditions satisfied by the output values in VWIN. */\r
-\r
-/* Revision 1.5 1996/03/19 18:37:56 jaf */\r
-/* Strengthened the specification of which indices of VWIN are read and */\r
-/* written. */\r
-\r
-/* Revision 1.4 1996/03/15 16:38:33 jaf */\r
-/* One tiny comment added. */\r
-\r
-/* Revision 1.3 1996/03/15 16:36:13 jaf */\r
-/* Added comments giving In/Out status of arguments. */\r
-\r
-/* Revision 1.2 1996/03/12 23:56:01 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:48:39 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ****************************************************************** */\r
-\r
-/* Input: */\r
-/* OSBUF Buffer which holds sorted indexes of onsets */\r
-/* I believe that only indices 1 through OSPTR-1 can be read. */\r
-/* OSLEN */\r
-/* OSPTR Free pointer into OSBUF */\r
-/* AF */\r
-/* LFRAME */\r
-/* MINWIN */\r
-/* MAXWIN */\r
-/* DVWINL */\r
-/* DVWINH (This argument is never used. Should it be?) */\r
-/* Input/Output: */\r
-/* VWIN Buffer of Voicing Window Positions (Modified) */\r
-/* Index (2,AF-1) is read. */\r
-/* Indices (1,AF) and (2,AF) are written, */\r
-/* and then possibly read. */\r
-/* All other indices are unused. */\r
-/* In all cases, the final values will satsify the condition:*/\r
-/* VWIN(2,AF)-VWIN(1,AF)+1 .LE. MAXWIN */\r
-/* I'm not certain yet, but they may also satisfy: */\r
-/* MINWIN .LE. VWIN(2,AF)-VWIN(1,AF)+1 */\r
-/* Output: */\r
-/* OBOUND This variable is set by this procedure and used */\r
-/* in placing analysis windows (PLACEA). Bit 1 */\r
-/* indicates whether an onset bounds the left side */\r
-/* of the voicing window, and bit 2 indicates whether */\r
-/* an onset bounds the right side of the voicing window. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen, \r
- integer *obound, integer *vwin, integer *af, integer *lframe, integer \r
- *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)\r
-{\r
- /* System generated locals */\r
- integer i__1, i__2;\r
-\r
- /* Local variables */\r
- logical crit;\r
- integer i__, q, osptr1, hrange, lrange;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
-/* Variables */\r
-/* LRANGE, HRANGE Range in which window is placed */\r
-/* OSPTR1 OSPTR excluding samples in 3F */\r
-/* Local state */\r
-/* None */\r
-/* Voicing Window Placement */\r
-\r
-/* __________________ __________________ ______________ */\r
-/* | | | */\r
-/* | 1F | 2F | 3F ... */\r
-/* |__________________|__________________|______________ */\r
-\r
-/* Previous | */\r
-/* Window | */\r
-/* ...________| */\r
-\r
-/* | | */\r
-/* ------>| This window's placement range |<------ */\r
-/* | | */\r
-\r
-/* There are three cases. Note that these are different from those */\r
-/* given in the LPC-10e phase 1 report. */\r
-\r
-/* 1. If there are no onsets in this range, then the voicing window */\r
-/* is centered in the pitch window. If such a placement is not within \r
-*/\r
-/* the window's placement range, then the window is placed in the left- \r
-*/\r
-/* most portion of the placement range. Its length is always MAXWIN. */\r
-\r
-/* 2. If the first onset is in 2F and there is sufficient room to place\r
- */\r
-/* the window immediately before this onset, then the window is placed \r
-*/\r
-/* there, and its length is set to the maximum possible under these */\r
-/* constraints. */\r
-\r
-/* "Critical Region Exception": If there is another onset in 2F */\r
-/* such that a window can be placed between the two onsets, the */\r
-/* window is placed there (ie, as in case 3). */\r
-\r
-/* 3. Otherwise, the window is placed immediately after the onset. The\r
- */\r
-/* window's length */\r
-/* is the longest length that can fit in the range under these constraint\r
-s,*/\r
-/* except that the window may be shortened even further to avoid overlapp\r
-ing*/\r
-/* other onsets in the placement range. In any case, the window's length\r
-*/\r
-/* is at least MINWIN. */\r
-\r
-/* Note that the values of MINWIN and LFRAME must be chosen such */\r
-/* that case 2 = false implies case 3 = true. This means that */\r
-/* MINWIN <= LFRAME/2. If this were not the case, then a fourth case */\r
-/* would have to be added for when the window cannot fit either before \r
-*/\r
-/* or after the onset. */\r
-\r
-/* Note also that onsets which weren't in 2F last time may be in 1F this\r
- */\r
-/* time, due to the filter delays in computing onsets. The result is tha\r
-t*/\r
-/* occasionally a voicing window will overlap that onset. The only way \r
-*/\r
-/* to circumvent this problem is to add more delay in processing input \r
-*/\r
-/* speech. In the trade-off between delay and window-placement, window \r
-*/\r
-/* placement lost. */\r
-/* Compute the placement range */\r
- /* Parameter adjustments */\r
- --osbuf;\r
- vwin -= 3;\r
-\r
- /* Function Body */\r
-/* Computing MAX */\r
- i__1 = vwin[((*af - 1) << 1) + 2] + 1, i__2 = (*af - 2) * *lframe + 1;\r
- lrange = max(i__1,i__2);\r
- hrange = *af * *lframe;\r
-/* Compute OSPTR1, so the following code only looks at relevant onsets. */\r
- for (osptr1 = *osptr - 1; osptr1 >= 1; --osptr1) {\r
- if (osbuf[osptr1] <= hrange) {\r
- goto L90;\r
- }\r
- }\r
-L90:\r
- ++osptr1;\r
-/* Check for case 1 first (fast case): */\r
- if (osptr1 <= 1 || osbuf[osptr1 - 1] < lrange) {\r
-/* Computing MAX */\r
- i__1 = vwin[((*af - 1) << 1) + 2] + 1;\r
- vwin[(*af << 1) + 1] = max(i__1,*dvwinl);\r
- vwin[(*af << 1) + 2] = vwin[(*af << 1) + 1] + *maxwin - 1;\r
- *obound = 0;\r
- } else {\r
-/* Search backward in OSBUF for first onset in range. */\r
-/* This code relies on the above check being performed first. */\r
- for (q = osptr1 - 1; q >= 1; --q) {\r
- if (osbuf[q] < lrange) {\r
- goto L100;\r
- }\r
- }\r
-L100:\r
- ++q;\r
-/* Check for case 2 (placement before onset): */\r
-/* Check for critical region exception: */\r
- i__1 = osptr1 - 1;\r
- for (i__ = q + 1; i__ <= i__1; ++i__) {\r
- if (osbuf[i__] - osbuf[q] >= *minwin) {\r
- crit = TRUE_;\r
- goto L105;\r
- }\r
- }\r
- crit = FALSE_;\r
-L105:\r
-/* Computing MAX */\r
- i__1 = (*af - 1) * *lframe, i__2 = lrange + *minwin - 1;\r
- if (! crit && osbuf[q] > max(i__1,i__2)) {\r
- vwin[(*af << 1) + 2] = osbuf[q] - 1;\r
-/* Computing MAX */\r
- i__1 = lrange, i__2 = vwin[(*af << 1) + 2] - *maxwin + 1;\r
- vwin[(*af << 1) + 1] = max(i__1,i__2);\r
- *obound = 2;\r
-/* Case 3 (placement after onset) */\r
- } else {\r
- vwin[(*af << 1) + 1] = osbuf[q];\r
-L110:\r
- ++q;\r
- if (q >= osptr1) {\r
- goto L120;\r
- }\r
- if (osbuf[q] > vwin[(*af << 1) + 1] + *maxwin) {\r
- goto L120;\r
- }\r
- if (osbuf[q] < vwin[(*af << 1) + 1] + *minwin) {\r
- goto L110;\r
- }\r
- vwin[(*af << 1) + 2] = osbuf[q] - 1;\r
- *obound = 3;\r
- return 0;\r
-L120:\r
-/* Computing MIN */\r
- i__1 = vwin[(*af << 1) + 1] + *maxwin - 1;\r
- vwin[(*af << 1) + 2] = min(i__1,hrange);\r
- *obound = 1;\r
- }\r
- }\r
- return 0;\r
-} /* placev_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:30:58 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);\r
-#endif\r
-\r
-/* ******************************************************************* */\r
-\r
-/* PREEMP Version 55 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:30:58 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/14 23:16:29 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/11 23:23:34 jaf */\r
-/* Added a bunch of comments to an otherwise simple subroutine. */\r
-\r
-/* Revision 1.1 1996/02/07 14:48:48 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ******************************************************************* */\r
-\r
-/* Preemphasize speech with a single-zero filter. */\r
-/* (When coef = .9375, preemphasis is as in LPC43.) */\r
-\r
-/* Inputs: */\r
-/* NSAMP - Number of samples to filter */\r
-/* INBUF - Input speech buffer */\r
-/* Indices 1 through NSAMP are read. */\r
-/* COEF - Preemphasis coefficient */\r
-/* Input/Output: */\r
-/* Z - Filter state */\r
-/* Output: */\r
-/* PEBUF - Preemphasized speech buffer (can be equal to INBUF) */\r
-/* Indices 1 through NSAMP are modified. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *\r
- coef, real *z__)\r
-{\r
- /* System generated locals */\r
- integer i__1;\r
-\r
- /* Local variables */\r
- real temp;\r
- integer i__;\r
-\r
-/* Arguments */\r
-/* Local variables */\r
-\r
-/* None of these need to have their values saved from one */\r
-/* invocation to the next. */\r
-\r
-/* Logically, this subroutine computes the output sequence */\r
-/* pebuf(1:nsamp) defined by: */\r
-\r
-/* pebuf(i) = inbuf(i) - coef * inbuf(i-1) */\r
-\r
-/* where inbuf(0) is defined by the value of z given as input to */\r
-/* this subroutine. */\r
-\r
-/* What is this filter's frequency response and phase response? */\r
-\r
-/* Why is this filter applied to the speech? */\r
-\r
-/* Could it be more efficient to apply multiple filters */\r
-/* simultaneously, by combining them into one equivalent filter? */\r
-\r
-/* Are there ever cases when "factoring" one high-order filter into \r
-*/\r
-/* multiple smaller-order filter actually reduces the number of */\r
-/* arithmetic operations needed to perform them? */\r
-/* When I first read this subroutine, I didn't understand why the */\r
-/* variable temp was used. It seemed that the statements in the do \r
-*/\r
-/* loop could be replaced with the following: */\r
-\r
-/* pebuf(i) = inbuf(i) - coef * z */\r
-/* z = inbuf(i) */\r
-\r
-/* The reason for temp is so that even if pebuf and inbuf are the */\r
-/* same arrays in memory (i.e., they are aliased), then this */\r
-/* subroutine will still work correctly. I didn't realize this */\r
-/* until seeing the comment after PEBUF above that says "(can be */\r
-/* equal to INBUF)". */\r
- /* Parameter adjustments */\r
- --pebuf;\r
- --inbuf;\r
-\r
- /* Function Body */\r
- i__1 = *nsamp;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- temp = inbuf[i__] - *coef * *z__;\r
- *z__ = inbuf[i__];\r
- pebuf[i__] = temp;\r
-/* L10: */\r
- }\r
- return 0;\r
-} /* preemp_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:40:51 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:54 jaf\r
- * Initial revision\r
- *\r
- */\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int prepro_(real *speech, integer *length,\r
- struct lpc10_encoder_state *st);\r
-/*:ref: hp100_ 14 3 6 4 4 */\r
-/*:ref: inithp100_ 14 0 */\r
-#endif\r
-\r
-/* Table of constant values */\r
-\r
-static integer c__1 = 1;\r
-\r
-/* ********************************************************************* */\r
-\r
-/* PREPRO Version 48 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:40:51 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:54 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/14 23:22:56 jaf */\r
-/* Added comments about when INITPREPRO should be used. */\r
-\r
-/* Revision 1.2 1996/03/14 23:09:27 jaf */\r
-/* Added an entry named INITPREPRO that initializes the local state of */\r
-/* this subroutine, and those it calls (if any). */\r
-\r
-/* Revision 1.1 1996/02/07 14:48:54 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Pre-process input speech: */\r
-\r
-/* Inputs: */\r
-/* LENGTH - Number of SPEECH samples */\r
-/* Input/Output: */\r
-/* SPEECH(LENGTH) - Speech data. */\r
-/* Indices 1 through LENGTH are read and modified. */\r
-\r
-/* This subroutine has no local state maintained from one call to the */\r
-/* next, but HP100 does. If you want to switch to using a new audio */\r
-/* stream for this filter, or reinitialize its state for any other */\r
-/* reason, call the ENTRY INITPREPRO. */\r
-\r
-/* Subroutine */ int prepro_(real *speech, integer *length,\r
- struct lpc10_encoder_state *st)\r
-{\r
- extern /* Subroutine */ int hp100_(real *, integer *, integer *, struct lpc10_encoder_state *);\r
-\r
-/* Arguments */\r
-/* High Pass Filter at 100 Hz */\r
- /* Parameter adjustments */\r
- if (speech) {\r
- --speech;\r
- }\r
-\r
- /* Function Body */\r
- hp100_(&speech[1], &c__1, length, st);\r
- return 0;\r
-} /* prepro_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:41:32 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:49 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern integer random_(struct lpc10_decoder_state *st);\r
-#endif\r
-\r
-/* ********************************************************************** */\r
-\r
-/* RANDOM Version 49 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:41:32 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:49 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/20 16:13:54 jaf */\r
-/* Rearranged comments a little bit, and added comments explaining that */\r
-/* even though there is local state here, there is no need to create an */\r
-/* ENTRY for reinitializing it. */\r
-\r
-/* Revision 1.2 1996/03/14 22:25:29 jaf */\r
-/* Just rearranged the comments and local variable declarations a bit. */\r
-\r
-/* Revision 1.1 1996/02/07 14:49:01 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Pseudo random number generator based on Knuth, Vol 2, p. 27. */\r
-\r
-/* Function Return: */\r
-/* RANDOM - Integer variable, uniformly distributed over -32768 to 32767 */\r
-\r
-/* This subroutine maintains local state from one call to the next. */\r
-/* In the context of the LPC10 coder, there is no reason to reinitialize */\r
-/* this local state when switching between audio streams, because its */\r
-/* results are only used to generate noise for unvoiced frames. */\r
-\r
-integer random_(struct lpc10_decoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- integer *j;\r
- integer *k;\r
- shortint *y;\r
-\r
- /* System generated locals */\r
- integer ret_val;\r
-\r
-/* Parameters/constants */\r
-/* Local state */\r
-/* The following is a 16 bit 2's complement addition, */\r
-/* with overflow checking disabled */\r
-\r
- j = &(st->j);\r
- k = &(st->k);\r
- y = &(st->y[0]);\r
-\r
- y[*k - 1] += y[*j - 1];\r
- ret_val = y[*k - 1];\r
- --(*k);\r
- if (*k <= 0) {\r
- *k = 5;\r
- }\r
- --(*j);\r
- if (*j <= 0) {\r
- *j = 5;\r
- }\r
- return ret_val;\r
-} /* random_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:30:41 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int rcchk_(integer *order, real *rc1f, real *rc2f);\r
-#endif\r
-\r
-/* ********************************************************************* */\r
-\r
-/* RCCHK Version 45G */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:30:41 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.4 1996/03/27 18:13:47 jaf */\r
-/* Commented out a call to subroutine ERROR. */\r
-\r
-/* Revision 1.3 1996/03/18 15:48:53 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 16:55:22 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:49:08 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Check RC's, repeat previous frame's RC's if unstable */\r
-\r
-/* Input: */\r
-/* ORDER - Number of RC's */\r
-/* RC1F - Previous frame's RC's */\r
-/* Indices 1 through ORDER may be read. */\r
-/* Input/Output: */\r
-/* RC2F - Present frame's RC's */\r
-/* Indices 1 through ORDER may be read, and written. */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int rcchk_(integer *order, real *rc1f, real *rc2f)\r
-{\r
- /* System generated locals */\r
- integer i__1;\r
- real r__1;\r
-\r
- /* Local variables */\r
- integer i__;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
- /* Parameter adjustments */\r
- --rc2f;\r
- --rc1f;\r
-\r
- /* Function Body */\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- if ((r__1 = rc2f[i__], abs(r__1)) > .99f) {\r
- goto L10;\r
- }\r
- }\r
- return 0;\r
-/* Note: In version embedded in other software, all calls to ERROR \r
-*/\r
-/* should probably be removed. */\r
-L10:\r
-\r
-/* This call to ERROR is only needed for debugging purposes. */\r
-\r
-/* CALL ERROR('RCCHK',2,I) */\r
- i__1 = *order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- rc2f[i__] = rc1f[i__];\r
- }\r
- return 0;\r
-} /* rcchk_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.16 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.15 2003/09/27 02:45:37 markster\r
-Fix various compiler warnings (bug #322)\r
-\r
-Revision 1.2 2003/09/27 02:45:37 markster\r
-Fix various compiler warnings (bug #322)\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:39 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:42:59 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:33 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int synths_(integer *voice, integer *pitch, real *rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st);\r
-/* comlen contrl_ 12 */\r
-/*:ref: pitsyn_ 14 12 4 4 4 6 6 4 4 4 6 6 4 6 */\r
-/*:ref: irc2pc_ 14 5 6 6 4 6 6 */\r
-/*:ref: bsynz_ 14 7 6 4 4 6 6 6 6 */\r
-/*:ref: deemp_ 14 2 6 4 */\r
-/*:ref: initpitsyn_ 14 0 */\r
-/*:ref: initbsynz_ 14 0 */\r
-/*:ref: initdeemp_ 14 0 */\r
-#endif\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/* Table of constant values */\r
-\r
-static real c_b2 = .7f;\r
-\r
-/* ***************************************************************** */\r
-\r
-/* SYNTHS Version 54 */\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/27 02:45:37 markster\r
-/* Fix various compiler warnings (bug #322)\r
-/*\r
-/* Revision 1.2 2003/09/27 02:45:37 markster\r
-/* Fix various compiler warnings (bug #322)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:42:59 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:33 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.5 1996/03/26 19:31:58 jaf */\r
-/* Commented out trace statements. */\r
-\r
-/* Revision 1.4 1996/03/25 19:41:01 jaf */\r
-/* Changed so that MAXFRM samples are always returned in the output array */\r
-/* SPEECH. */\r
-\r
-/* This required delaying the returned samples by MAXFRM sample times, */\r
-/* and remembering any "left over" samples returned by PITSYN from one */\r
-/* call of SYNTHS to the next. */\r
-\r
-/* Changed size of SPEECH from 2*MAXFRM to MAXFRM. Removed local */\r
-/* variable SOUT. Added local state variables BUF and BUFLEN. */\r
-\r
-/* Revision 1.3 1996/03/25 19:20:10 jaf */\r
-/* Added comments about the range of possible return values for argument */\r
-/* K, and increased the size of the arrays filled in by PITSYN from 11 to */\r
-/* 16, as has been already done inside of PITSYN. */\r
-\r
-/* Revision 1.2 1996/03/22 00:18:18 jaf */\r
-/* Added comments explaining meanings of input and output parameters, and */\r
-/* indicating which array indices can be read or written. */\r
-\r
-/* Added entry INITSYNTHS, which does nothing except call the */\r
-/* corresponding initialization entries for subroutines PITSYN, BSYNZ, */\r
-/* and DEEMP. */\r
-\r
-/* Revision 1.1 1996/02/07 14:49:44 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ***************************************************************** */\r
-\r
-/* The note below is from the distributed version of the LPC10 coder. */\r
-/* The version of the code below has been modified so that SYNTHS always */\r
-/* has a constant frame length output of MAXFRM. */\r
-\r
-/* Also, BSYNZ and DEEMP need not be modified to work on variable */\r
-/* positions within an array. It is only necessary to pass the first */\r
-/* index desired as the array argument. What actually gets passed is the */\r
-/* address of that array position, which the subroutine treats as the */\r
-/* first index of the array. */\r
-\r
-/* This technique is used in subroutine ANALYS when calling PREEMP, so it */\r
-/* appears that multiple people wrote different parts of this LPC10 code, */\r
-/* and that they didn't necessarily have equivalent knowledge of Fortran */\r
-/* (not surprising). */\r
-\r
-/* NOTE: There is excessive buffering here, BSYNZ and DEEMP should be */\r
-/* changed to operate on variable positions within SOUT. Also, */\r
-/* the output length parameter is bogus, and PITSYN should be */\r
-/* rewritten to allow a constant frame length output. */\r
-\r
-/* Input: */\r
-/* VOICE - Half frame voicing decisions */\r
-/* Indices 1 through 2 read. */\r
-/* Input/Output: */\r
-/* PITCH - Pitch */\r
-/* PITCH is restricted to range 20 to 156, inclusive, */\r
-/* before calling subroutine PITSYN, and then PITSYN */\r
-/* can modify it further under some conditions. */\r
-/* RMS - Energy */\r
-/* Only use is for debugging, and passed to PITSYN. */\r
-/* See comments there for how it can be modified. */\r
-/* RC - Reflection coefficients */\r
-/* Indices 1 through ORDER restricted to range -.99 to .99, */\r
-/* before calling subroutine PITSYN, and then PITSYN */\r
-/* can modify it further under some conditions. */\r
-/* Output: */\r
-/* SPEECH - Synthesized speech samples. */\r
-/* Indices 1 through the final value of K are written. */\r
-/* K - Number of samples placed into array SPEECH. */\r
-/* This is always MAXFRM. */\r
-\r
-/* Subroutine */ int synths_(integer *voice, integer *pitch, real *\r
- rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- real *buf;\r
- integer *buflen;\r
-\r
- /* System generated locals */\r
- integer i__1;\r
- real r__1, r__2;\r
-\r
- /* Local variables */\r
- real rmsi[16];\r
- integer nout, ivuv[16], i__, j;\r
- extern /* Subroutine */ int deemp_(real *, integer *, struct lpc10_decoder_state *);\r
- real ratio;\r
- integer ipiti[16];\r
- real g2pass;\r
- real pc[10];\r
- extern /* Subroutine */ int pitsyn_(integer *, integer *, integer *, real \r
- *, real *, integer *, integer *, integer *, real *, real *, \r
- integer *, real *, struct lpc10_decoder_state *);\r
- real rci[160] /* was [10][16] */;\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/27 02:45:37 markster\r
-/* Fix various compiler warnings (bug #322)\r
-/*\r
-/* Revision 1.2 2003/09/27 02:45:37 markster\r
-/* Fix various compiler warnings (bug #322)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:42:59 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:33 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:03:47 jaf */\r
-/* Removed definitions for any constants that were no longer used. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:33 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:43:51 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Configuration parameters: */\r
-/* Frame size, Prediction order, Pitch period */\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/09/27 02:45:37 markster\r
-/* Fix various compiler warnings (bug #322)\r
-/*\r
-/* Revision 1.2 2003/09/27 02:45:37 markster\r
-/* Fix various compiler warnings (bug #322)\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:39 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:42:59 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_decoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_decoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:33 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Parameters/constants */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* BUF is a buffer of speech samples that would have been returned \r
-*/\r
-/* by the older version of SYNTHS, but the newer version doesn't, */\r
-/* so that the newer version can always return MAXFRM samples on */\r
-/* every call. This has the effect of delaying the return of */\r
-/* samples for one additional frame time. */\r
-\r
-/* Indices 1 through BUFLEN contain samples that are left over from \r
-*/\r
-/* the last call to SYNTHS. Given the way that PITSYN works, */\r
-/* BUFLEN should always be in the range MAXFRM-MAXPIT+1 through */\r
-/* MAXFRM, inclusive, after a call to SYNTHS is complete. */\r
-\r
-/* On the first call to SYNTHS (or the first call after */\r
-/* reinitializing with the entry INITSYNTHS), BUFLEN is MAXFRM, and \r
-*/\r
-/* a frame of silence is always returned. */\r
- /* Parameter adjustments */\r
- if (voice) {\r
- --voice;\r
- }\r
- if (rc) {\r
- --rc;\r
- }\r
- if (speech) {\r
- --speech;\r
- }\r
-\r
- /* Function Body */\r
- buf = &(st->buf[0]);\r
- buflen = &(st->buflen);\r
-\r
-/* Computing MAX */\r
- i__1 = min(*pitch,156);\r
- *pitch = max(i__1,20);\r
- i__1 = contrl_1.order;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
-/* Computing MAX */\r
-/* Computing MIN */\r
- r__2 = rc[i__];\r
- r__1 = min(r__2,.99f);\r
- rc[i__] = max(r__1,-.99f);\r
- }\r
- pitsyn_(&contrl_1.order, &voice[1], pitch, rms, &rc[1], &contrl_1.lframe, \r
- ivuv, ipiti, rmsi, rci, &nout, &ratio, st);\r
- if (nout > 0) {\r
- i__1 = nout;\r
- for (j = 1; j <= i__1; ++j) {\r
-\r
-/* Add synthesized speech for pitch period J to the en\r
-d of */\r
-/* BUF. */\r
-\r
- irc2pc_(&rci[j * 10 - 10], pc, &contrl_1.order, &c_b2, &g2pass);\r
- bsynz_(pc, &ipiti[j - 1], &ivuv[j - 1], &buf[*buflen], &rmsi[j - 1]\r
- , &ratio, &g2pass, st);\r
- deemp_(&buf[*buflen], &ipiti[j - 1], st);\r
- *buflen += ipiti[j - 1];\r
- }\r
-\r
-/* Copy first MAXFRM samples from BUF to output array SPEECH \r
-*/\r
-/* (scaling them), and then remove them from the beginning of\r
- */\r
-/* BUF. */\r
-\r
- for (i__ = 1; i__ <= 180; ++i__) {\r
- speech[i__] = buf[i__ - 1] / 4096.f;\r
- }\r
- *k = 180;\r
- *buflen += -180;\r
- i__1 = *buflen;\r
- for (i__ = 1; i__ <= i__1; ++i__) {\r
- buf[i__ - 1] = buf[i__ + 179];\r
- }\r
- }\r
- return 0;\r
-} /* synths_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:40 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:30:26 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-extern int tbdm_(real *speech, integer *lpita, integer *tau, integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *mintau);\r
-/*:ref: difmag_ 14 8 6 4 4 4 4 6 4 4 */\r
-#endif\r
-\r
-/* ********************************************************************** */\r
-\r
-/* TBDM Version 49 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:40 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:30:26 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/18 22:14:00 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 14:48:37 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:49:54 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/*TURBO DIFMAG: Compute High Resolution Average Magnitude Difference Function\r
-*/\r
-\r
-/* Note: There are several constants in here that appear to depend on a */\r
-/* particular TAU table. That's not a problem for the LPC10 coder, but */\r
-/* watch out if you change the contents of TAU in the subroutine ANALYS. */\r
-\r
-/* Input: */\r
-/* SPEECH - Low pass filtered speech */\r
-/* Indices 1 through MAX+LPITA-1 are read, where: */\r
-/* MAX = (TAU(LTAU)-TAU(1))/2+1 */\r
-/* (If TAU(1) .LT. 39, then larger indices could be read */\r
-/* by the last call to DIFMAG below.) */\r
-/* LPITA - Length of speech buffer */\r
-/* TAU - Table of lags, sorted in increasing order. */\r
-/* Indices 1 through LTAU read. */\r
-/* LTAU - Number of lag values to compute */\r
-/* Output: */\r
-/* AMDF - Average Magnitude Difference for each lag in TAU */\r
-/* Indices 1 through LTAU written, and several might then be read.*/\r
-/* MINPTR - Index of minimum AMDF value */\r
-/* MAXPTR - Index of maximum AMDF value within +/- 1/2 octave of min */\r
-/* MINTAU - Lag corresponding to minimum AMDF value */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int tbdm_(real *speech, integer *lpita, integer *tau, \r
- integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *\r
- mintau)\r
-{\r
- /* System generated locals */\r
- integer i__1, i__2, i__3, i__4;\r
-\r
- /* Local variables */\r
- real amdf2[6];\r
- integer minp2, ltau2, maxp2, i__;\r
- extern /* Subroutine */ int difmag_(real *, integer *, integer *, integer \r
- *, integer *, real *, integer *, integer *);\r
- integer minamd, ptr, tau2[6];\r
-\r
-/* Arguments */\r
-/* REAL SPEECH(LPITA+TAU(LTAU)), AMDF(LTAU) */\r
-/* Stupid TOAST doesn't understand expressions */\r
-/* Local variables that need not be saved */\r
-/* Local state */\r
-/* None */\r
-/* Compute full AMDF using log spaced lags, find coarse minimum */\r
- /* Parameter adjustments */\r
- --speech;\r
- --amdf;\r
- --tau;\r
-\r
- /* Function Body */\r
- difmag_(&speech[1], lpita, &tau[1], ltau, &tau[*ltau], &amdf[1], minptr, \r
- maxptr);\r
- *mintau = tau[*minptr];\r
- minamd = amdf[*minptr];\r
-/* Build table containing all lags within +/- 3 of the AMDF minimum */\r
-/* excluding all that have already been computed */\r
- ltau2 = 0;\r
- ptr = *minptr - 2;\r
-/* Computing MAX */\r
- i__1 = *mintau - 3;\r
-/* Computing MIN */\r
- i__3 = *mintau + 3, i__4 = tau[*ltau] - 1;\r
- i__2 = min(i__3,i__4);\r
- for (i__ = max(i__1,41); i__ <= i__2; ++i__) {\r
- while(tau[ptr] < i__) {\r
- ++ptr;\r
- }\r
- if (tau[ptr] != i__) {\r
- ++ltau2;\r
- tau2[ltau2 - 1] = i__;\r
- }\r
- }\r
-/* Compute AMDF of the new lags, if there are any, and choose one */\r
-/* if it is better than the coarse minimum */\r
- if (ltau2 > 0) {\r
- difmag_(&speech[1], lpita, tau2, <au2, &tau[*ltau], amdf2, &minp2, &\r
- maxp2);\r
- if (amdf2[minp2 - 1] < (real) minamd) {\r
- *mintau = tau2[minp2 - 1];\r
- minamd = amdf2[minp2 - 1];\r
- }\r
- }\r
-/* Check one octave up, if there are any lags not yet computed */\r
- if (*mintau >= 80) {\r
- i__ = *mintau / 2;\r
- if ((i__ & 1) == 0) {\r
- ltau2 = 2;\r
- tau2[0] = i__ - 1;\r
- tau2[1] = i__ + 1;\r
- } else {\r
- ltau2 = 1;\r
- tau2[0] = i__;\r
- }\r
- difmag_(&speech[1], lpita, tau2, <au2, &tau[*ltau], amdf2, &minp2, &\r
- maxp2);\r
- if (amdf2[minp2 - 1] < (real) minamd) {\r
- *mintau = tau2[minp2 - 1];\r
- minamd = amdf2[minp2 - 1];\r
- *minptr += -20;\r
- }\r
- }\r
-/* Force minimum of the AMDF array to the high resolution minimum */\r
- amdf[*minptr] = (real) minamd;\r
-/* Find maximum of AMDF within 1/2 octave of minimum */\r
-/* Computing MAX */\r
- i__2 = *minptr - 5;\r
- *maxptr = max(i__2,1);\r
-/* Computing MIN */\r
- i__1 = *minptr + 5;\r
- i__2 = min(i__1,*ltau);\r
- for (i__ = *maxptr + 1; i__ <= i__2; ++i__) {\r
- if (amdf[i__] > amdf[*maxptr]) {\r
- *maxptr = i__;\r
- }\r
- }\r
- return 0;\r
-} /* tbdm_ */\r
-\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.16 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.15 2003/11/23 22:14:32 markster\r
-Various warning cleanups\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:40 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.2 1996/08/20 20:45:00 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:14 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-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);\r
-/* comlen contrl_ 12 */\r
-/*:ref: vparms_ 14 14 4 6 6 4 4 6 4 4 4 4 6 6 6 6 */\r
-#endif\r
-\r
-/* Common Block Declarations */\r
-\r
-extern struct {\r
- integer order, lframe;\r
- logical corrp;\r
-} contrl_;\r
-\r
-#define contrl_1 contrl_\r
-\r
-/****************************************************************************/\r
-\r
-/* VOICIN Version 52 */\r
-\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/11/23 22:14:32 markster\r
-/* Various warning cleanups\r
-/*\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:40 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:45:00 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:14 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.10 1996/03/29 17:59:14 jaf */\r
-/* Avoided using VALUE(9), although it shouldn't affect the function of */\r
-/* the code at all, because it was always multiplied by VDC(9,SNRL), */\r
-/* which is 0 for all values of SNRL. Still, if VALUE(9) had an initial */\r
-/* value of IEEE NaN, it might cause trouble (I don't know how IEEE */\r
-/* defines Nan * 0. It should either be NaN or 0.) */\r
-\r
-/* Revision 1.9 1996/03/29 17:54:46 jaf */\r
-/* Added a few comments about the accesses made to argument array VOIBUF */\r
-/* and the local saved array VOICE. */\r
-\r
-/* Revision 1.8 1996/03/27 18:19:54 jaf */\r
-/* Added an assignment to VSTATE that does not affect the function of the */\r
-/* program at all. The only reason I put it in was so that the tracing */\r
-/* statements at the end, when enabled, will print a consistent value for */\r
-/* VSTATE when HALF .EQ. 1, rather than a garbage value that could change */\r
-/* from one call to the next. */\r
-\r
-/* Revision 1.7 1996/03/26 20:00:06 jaf */\r
-/* Removed the inclusion of the file "vcomm.fh", and put its contents */\r
-/* into this file. It was included nowhere else but here. */\r
-\r
-/* Revision 1.6 1996/03/26 19:38:09 jaf */\r
-/* Commented out trace statements. */\r
-\r
-/* Revision 1.5 1996/03/19 20:43:45 jaf */\r
-/* Added comments about which indices of OBOUND and VOIBUF can be */\r
-/* accessed, and whether they are read or written. VOIBUF is fairly */\r
-/* messy. */\r
-\r
-/* Revision 1.4 1996/03/19 15:00:58 jaf */\r
-/* Moved the DATA statements for the *VDC* variables later, as it is */\r
-/* apparently illegal to have DATA statements before local variable */\r
-/* declarations. */\r
-\r
-/* Revision 1.3 1996/03/19 00:10:49 jaf */\r
-/* Heavily commented the local variables that are saved from one */\r
-/* invocation to the next, and how the local variable FIRST is used to */\r
-/* avoid the need to assign most of them initial values with DATA */\r
-/* statements. */\r
-\r
-/* A few should be initialized, but aren't. I've guessed initial values */\r
-/* for two of these, SFBUE and SLBUE, and I've convinced myself that for */\r
-/* VOICE, the effects of uninitialized values will die out after 2 or 3 */\r
-/* frame times. It would still be good to choose initial values for */\r
-/* these, but I don't know what reasonable values would be (0 comes to */\r
-/* mind). */\r
-\r
-/* Revision 1.2 1996/03/13 16:09:28 jaf */\r
-/* Comments added explaining which of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next, and which */\r
-/* do not. */\r
-\r
-/* WARNING! Some of them that should are never given initial values in */\r
-/* this code. Hopefully, Fortran 77 defines initial values for them, but */\r
-/* even so, giving them explicit initial values is preferable. */\r
-\r
-/* WARNING! VALUE(9) is used, but never assigned a value. It should */\r
-/* probably be eliminated from the code. */\r
-\r
-/* Revision 1.1 1996/02/07 14:50:28 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/****************************************************************************/\r
-\r
-/* Voicing Detection (VOICIN) makes voicing decisions for each half */\r
-/* frame of input speech. Tentative voicing decisions are made two frames*/\r
-/* in the future (2F) for each half frame. These decisions are carried */\r
-/* through one frame in the future (1F) to the present (P) frame where */\r
-/* they are examined and smoothed, resulting in the final voicing */\r
-/* decisions for each half frame. */\r
-/* The voicing parameter (signal measurement) column vector (VALUE) */\r
-/* is based on a rectangular window of speech samples determined by the */\r
-/* window placement algorithm. The voicing parameter vector contains the*/\r
-/* AMDF windowed maximum-to-minimum ratio, the zero crossing rate, energy*/\r
-/* measures, reflection coefficients, and prediction gains. The voicing */\r
-/* window is placed to avoid contamination of the voicing parameter vector*/\r
-/* with speech onsets. */\r
-/* The input signal is then classified as unvoiced (including */\r
-/* silence) or voiced. This decision is made by a linear discriminant */\r
-/* function consisting of a dot product of the voicing decision */\r
-/* coefficient (VDC) row vector with the measurement column vector */\r
-/* (VALUE). The VDC vector is 2-dimensional, each row vector is optimized*/\r
-/* for a particular signal-to-noise ratio (SNR). So, before the dot */\r
-/* product is performed, the SNR is estimated to select the appropriate */\r
-/* VDC vector. */\r
-/* The smoothing algorithm is a modified median smoother. The */\r
-/* voicing discriminant function is used by the smoother to determine how*/\r
-/* strongly voiced or unvoiced a signal is. The smoothing is further */\r
-/* modified if a speech onset and a voicing decision transition occur */\r
-/* within one half frame. In this case, the voicing decision transition */\r
-/* is extended to the speech onset. For transmission purposes, there are*/\r
-/* constraints on the duration and transition of voicing decisions. The */\r
-/* smoother takes these constraints into account. */\r
-/* Finally, the energy estimates are updated along with the dither */\r
-/* threshold used to calculate the zero crossing rate (ZC). */\r
-\r
-/* Inputs: */\r
-/* VWIN - Voicing window limits */\r
-/* The indices read of arrays VWIN, INBUF, LPBUF, and BUFLIM */\r
-/* are the same as those read by subroutine VPARMS. */\r
-/* INBUF - Input speech buffer */\r
-/* LPBUF - Low-pass filtered speech buffer */\r
-/* BUFLIM - INBUF and LPBUF limits */\r
-/* HALF - Present analysis half frame number */\r
-/* MINAMD - Minimum value of the AMDF */\r
-/* MAXAMD - Maximum value of the AMDF */\r
-/* MINTAU - Pointer to the lag of the minimum AMDF value */\r
-/* IVRC(2) - Inverse filter's RC's */\r
-/* Only index 2 of array IVRC read under normal operation. */\r
-/* (Index 1 is also read when debugging is turned on.) */\r
-/* OBOUND - Onset boundary descriptions */\r
-/* Indices 1 through 3 read if (HALF .NE. 1), otherwise untouched.\r
-*/\r
-/* AF - The analysis frame number */\r
-/* Output: */\r
-/* VOIBUF(2,0:AF) - Buffer of voicing decisions */\r
-/* Index (HALF,3) written. */\r
-/* If (HALF .EQ. 1), skip down to "Read (HALF,3)" below. */\r
-/* Indices (1,2), (2,1), (1,2), and (2,2) read. */\r
-/* One of the following is then done: */\r
-/* read (1,3) and possibly write (1,2) */\r
-/* read (1,3) and write (1,2) or (2,2) */\r
-/* write (2,1) */\r
-/* write (2,1) or (1,2) */\r
-/* read (1,0) and (1,3) and then write (2,2) or (1,1) */\r
-/* no reads or writes on VOIBUF */\r
-/* Finally, read (HALF,3) */\r
-/* Internal: */\r
-/* QS - Ratio of preemphasized to full-band energies */\r
-/* RC1 - First reflection coefficient */\r
-/* AR_B - Product of the causal forward and reverse pitch prediction gain\r
-s*/\r
-/* AR_F - Product of the noncausal forward and rev. pitch prediction gain\r
-s*/\r
-/* ZC - Zero crossing rate */\r
-/* DITHER - Zero crossing threshold level */\r
-/* MAXMIN - AMDF's 1 octave windowed maximum-to-minimum ratio */\r
-/* MINPTR - Location of minimum AMDF value */\r
-/* NVDC - Number of elements in each VDC vector */\r
-/* NVDCL - Number of VDC vectors */\r
-/* VDCL - SNR values corresponding to the set of VDC's */\r
-/* VDC - 2-D voicing decision coefficient vector */\r
-/* VALUE(9) - Voicing Parameters */\r
-/* VOICE(2,3)- History of LDA results */\r
-/* On every call when (HALF .EQ. 1), VOICE(*,I+1) is */\r
-/* shifted back to VOICE(*,I), for I=1,2. */\r
-/* VOICE(HALF,3) is written on every call. */\r
-/* Depending on several conditions, one or more of */\r
-/* (1,1), (1,2), (2,1), and (2,2) might then be read. */\r
-/* LBE - Ratio of low-band instantaneous to average energies */\r
-/* FBE - Ratio of full-band instantaneous to average energies */\r
-/* LBVE - Low band voiced energy */\r
-/* LBUE - Low band unvoiced energy */\r
-/* FBVE - Full band voiced energy */\r
-/* FBUE - Full band unvoiced energy */\r
-/* OFBUE - Previous full-band unvoiced energy */\r
-/* OLBUE - Previous low-band unvoiced energy */\r
-/* REF - Reference energy for initialization and DITHER threshold */\r
-/* SNR - Estimate of signal-to-noise ratio */\r
-/* SNR2 - Estimate of low-band signal-to-noise ratio */\r
-/* SNRL - SNR level number */\r
-/* OT - Onset transition present */\r
-/* VSTATE - Decimal interpretation of binary voicing classifications */\r
-/* FIRST - First call flag */\r
-\r
-/* This subroutine maintains local state from one call to the next. If */\r
-/* you want to switch to using a new audio stream for this filter, or */\r
-/* reinitialize its state for any other reason, call the ENTRY */\r
-/* INITVOICIN. */\r
-\r
-/* Subroutine */ int voicin_(integer *vwin, real *inbuf, real *\r
- lpbuf, integer *buflim, integer *half, real *minamd, real *maxamd, \r
- integer *mintau, real *ivrc, integer *obound, integer *voibuf, \r
- integer *af, struct lpc10_encoder_state *st)\r
-{\r
- /* Initialized data */\r
-\r
- real *dither;\r
- static real vdc[100] /* was [10][10] */ = { 0.f,1714.f,-110.f,\r
- 334.f,-4096.f,-654.f,3752.f,3769.f,0.f,1181.f,0.f,874.f,-97.f,\r
- 300.f,-4096.f,-1021.f,2451.f,2527.f,0.f,-500.f,0.f,510.f,-70.f,\r
- 250.f,-4096.f,-1270.f,2194.f,2491.f,0.f,-1500.f,0.f,500.f,-10.f,\r
- 200.f,-4096.f,-1300.f,2e3f,2e3f,0.f,-2e3f,0.f,500.f,0.f,0.f,\r
- -4096.f,-1300.f,2e3f,2e3f,0.f,-2500.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,\r
- 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,\r
- 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,\r
- 0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f };\r
- static integer nvdcl = 5;\r
- static real vdcl[10] = { 600.f,450.f,300.f,200.f,0.f,0.f,0.f,0.f,0.f,0.f }\r
- ;\r
-\r
- /* System generated locals */\r
- integer inbuf_offset = 0, lpbuf_offset = 0, i__1, i__2;\r
- real r__1, r__2;\r
-\r
- /* Builtin functions */\r
- integer i_nint(real *);\r
- double sqrt(doublereal);\r
-\r
- /* Local variables */\r
- real ar_b__, ar_f__;\r
- integer *lbve, *lbue, *fbve, *fbue;\r
- integer snrl, i__;\r
- integer *ofbue, *sfbue;\r
- real *voice;\r
- integer *olbue, *slbue;\r
- real value[9];\r
- integer zc;\r
- logical ot;\r
- real qs;\r
- real *maxmin;\r
- integer vstate;\r
- real rc1;\r
- extern /* Subroutine */ int vparms_(integer *, real *, real *, integer *, \r
- integer *, real *, integer *, integer *, integer *, integer *, \r
- real *, real *, real *, real *);\r
- integer fbe, lbe;\r
- real *snr;\r
- real snr2;\r
-\r
-/* Global Variables: */\r
-/* Arguments */\r
-/* $Log$\r
- * Revision 1.16 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.15 2003/11/23 22:14:32 markster\r
-/* Various warning cleanups\r
-/*\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:40 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.2 1996/08/20 20:45:00 jaf\r
- * Removed all static local variables that were SAVE'd in the Fortran\r
- * code, and put them in struct lpc10_encoder_state that is passed as an\r
- * argument.\r
- *\r
- * Removed init function, since all initialization is now done in\r
- * init_lpc10_encoder_state().\r
- *\r
- * Revision 1.1 1996/08/19 22:30:14 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.3 1996/03/29 22:05:55 jaf */\r
-/* Commented out the common block variables that are not needed by the */\r
-/* embedded version. */\r
-\r
-/* Revision 1.2 1996/03/26 19:34:50 jaf */\r
-/* Added comments indicating which constants are not needed in an */\r
-/* application that uses the LPC-10 coder. */\r
-\r
-/* Revision 1.1 1996/02/07 14:44:09 jaf */\r
-/* Initial revision */\r
-\r
-/* LPC Processing control variables: */\r
-\r
-/* *** Read-only: initialized in setup */\r
-\r
-/* Files for Speech, Parameter, and Bitstream Input & Output, */\r
-/* and message and debug outputs. */\r
-\r
-/* Here are the only files which use these variables: */\r
-\r
-/* lpcsim.f setup.f trans.f error.f vqsetup.f */\r
-\r
-/* Many files which use fdebug are not listed, since it is only used in */\r
-/* those other files conditionally, to print trace statements. */\r
-/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* LPC order, Frame size, Quantization rate, Bits per frame, */\r
-/* Error correction */\r
-/* Subroutine SETUP is the only place where order is assigned a value, */\r
-/* and that value is 10. It could increase efficiency 1% or so to */\r
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as \r
-*/\r
-/* a variable in a COMMON block, since it is used in many places in the */\r
-/* core of the coding and decoding routines. Actually, I take that back. \r
-*/\r
-/* At least when compiling with f2c, the upper bound of DO loops is */\r
-/* stored in a local variable before the DO loop begins, and then that is \r
-*/\r
-/* compared against on each iteration. */\r
-/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */\r
-/* Similarly for quant, which is given a value of 2400 in SETUP. quant */\r
-/* is used in only a few places, and never in the core coding and */\r
-/* decoding routines, so it could be eliminated entirely. */\r
-/* nbits is similar to quant, and is given a value of 54 in SETUP. */\r
-/* corrp is given a value of .TRUE. in SETUP, and is only used in the */\r
-/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */\r
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is \r
-*/\r
-/* a constant or a variable, since it is only examined once per frame. */\r
-/* Leaving it as a variable that is set to .TRUE. seems like a good */\r
-/* idea, since it does enable some error-correction capability for */\r
-/* unvoiced frames, with no change in the coding rate, and no noticeable \r
-*/\r
-/* quality difference in the decoded speech. */\r
-/* integer quant, nbits */\r
-/* *** Read/write: variables for debugging, not needed for LPC algorithm \r
-*/\r
-\r
-/* Current frame, Unstable frames, Output clip count, Max onset buffer, \r
-*/\r
-/* Debug listing detail level, Line count on listing page */\r
-\r
-/* nframe is not needed for an embedded LPC10 at all. */\r
-/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */\r
-/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */\r
-/* an application, I would recommend removing the call to ERROR in RCCHK, \r
-*/\r
-/* and remove ERROR and nunsfm completely. */\r
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in \r
-*/\r
-/* sread.f. When LPC10 is embedded into an application, one might want */\r
-/* to cause it to be incremented in a routine that takes the output of */\r
-/* SYNTHS and sends it to an audio device. It could be optionally */\r
-/* displayed, for those that might want to know what it is. */\r
-/* maxosp is never initialized to 0 in SETUP, although it probably should \r
-*/\r
-/* be, and it is updated in subroutine ANALYS. I doubt that its value */\r
-/* would be of much interest to an application in which LPC10 is */\r
-/* embedded. */\r
-/* listl and lincnt are not needed for an embedded LPC10 at all. */\r
-/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */\r
-/* common /contrl/ quant, nbits */\r
-/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */\r
-/* Parameters/constants */\r
-/* Voicing coefficient and Linear Discriminant Analysis variables: \r
-*/\r
-/* Max number of VDC's and VDC levels */\r
-/* The following are not Fortran PARAMETER's, but they are */\r
-/* initialized with DATA statements, and never modified. */\r
-/* Actual number of VDC's and levels */\r
-/* Local variables that need not be saved */\r
-/* Note: */\r
-\r
-/* VALUE(1) through VALUE(8) are assigned values, but VALUE(9) */\r
-/* never is. Yet VALUE(9) is read in the loop that begins "DO I = \r
-*/\r
-/* 1, 9" below. I believe that this doesn't cause any problems in \r
-*/\r
-/* this subroutine, because all VDC(9,*) array elements are 0, and \r
-*/\r
-/* this is what is multiplied by VALUE(9) in all cases. Still, it \r
-*/\r
-/* would save a multiplication to change the loop to "DO I = 1, 8". \r
-*/\r
-/* Local state */\r
-/* WARNING! */\r
-\r
-/* VOICE, SFBUE, and SLBUE should be saved from one invocation to */\r
-/* the next, but they are never given an initial value. */\r
-\r
-/* Does Fortran 77 specify some default initial value, like 0, or */\r
-/* is it undefined? If it is undefined, then this code should be */\r
-/* corrected to specify an initial value. */\r
-\r
-/* For VOICE, note that it is "shifted" in the statement that */\r
-/* begins "IF (HALF .EQ. 1) THEN" below. Also, uninitialized */\r
-/* values in the VOICE array can only affect entries in the VOIBUF \r
-*/\r
-/* array that are for the same frame, or for an older frame. Thus \r
-*/\r
-/* the effects of uninitialized values in VOICE cannot linger on */\r
-/* for more than 2 or 3 frame times. */\r
-\r
-/* For SFBUE and SLBUE, the effects of uninitialized values can */\r
-/* linger on for many frame times, because their previous values */\r
-/* are exponentially decayed. Thus it is more important to choose \r
-*/\r
-/* initial values for these variables. I would guess that a */\r
-/* reasonable initial value for SFBUE is REF/16, the same as used */\r
-/* for FBUE and OFBUE. Similarly, SLBUE can be initialized to */\r
-/* REF/32, the same as for LBUE and OLBUE. */\r
-\r
-/* These guessed initial values should be validated by re-running */\r
-/* the modified program on some audio samples. */\r
-\r
-/* Declare and initialize filters: */\r
-\r
- dither = (&st->dither);\r
- snr = (&st->snr);\r
- maxmin = (&st->maxmin);\r
- voice = (&st->voice[0]);\r
- lbve = (&st->lbve);\r
- lbue = (&st->lbue);\r
- fbve = (&st->fbve);\r
- fbue = (&st->fbue);\r
- ofbue = (&st->ofbue);\r
- olbue = (&st->olbue);\r
- sfbue = (&st->sfbue);\r
- slbue = (&st->slbue);\r
-\r
- /* Parameter adjustments */\r
- if (vwin) {\r
- --vwin;\r
- }\r
- if (buflim) {\r
- --buflim;\r
- }\r
- if (inbuf) {\r
- inbuf_offset = buflim[1];\r
- inbuf -= inbuf_offset;\r
- }\r
- if (lpbuf) {\r
- lpbuf_offset = buflim[3];\r
- lpbuf -= lpbuf_offset;\r
- }\r
- if (ivrc) {\r
- --ivrc;\r
- }\r
- if (obound) {\r
- --obound;\r
- }\r
- if (voibuf) {\r
- --voibuf;\r
- }\r
-\r
- /* Function Body */\r
-\r
-/* The following variables are saved from one invocation to the */\r
-/* next, but are not initialized with DATA statements. This is */\r
-/* acceptable, because FIRST is initialized ot .TRUE., and the */\r
-/* first time that this subroutine is then called, they are all */\r
-/* given initial values. */\r
-\r
-/* SNR */\r
-/* LBVE, LBUE, FBVE, FBUE, OFBUE, OLBUE */\r
-\r
-/* MAXMIN is initialized on the first call, assuming that HALF */\r
-/* .EQ. 1 on first call. This is how ANALYS calls this subroutine. \r
-*/\r
-\r
-/* Voicing Decision Parameter vector (* denotes zero coefficient): */\r
-\r
-/* * MAXMIN */\r
-/* LBE/LBVE */\r
-/* ZC */\r
-/* RC1 */\r
-/* QS */\r
-/* IVRC2 */\r
-/* aR_B */\r
-/* aR_F */\r
-/* * LOG(LBE/LBVE) */\r
-/* Define 2-D voicing decision coefficient vector according to the voicin\r
-g*/\r
-/* parameter order above. Each row (VDC vector) is optimized for a speci\r
-fic*/\r
-/* SNR. The last element of the vector is the constant. */\r
-/* E ZC RC1 Qs IVRC2 aRb aRf c */\r
-\r
-/* The VOICE array contains the result of the linear discriminant functio\r
-n*/\r
-/* (analog values). The VOIBUF array contains the hard-limited binary \r
-*/\r
-/* voicing decisions. The VOICE and VOIBUF arrays, according to FORTRAN\r
- */\r
-/* memory allocation, are addressed as: */\r
-\r
-/* (half-frame number, future-frame number) */\r
-\r
-/* | Past | Present | Future1 | Future2 | */\r
-/* | 1,0 | 2,0 | 1,1 | 2,1 | 1,2 | 2,2 | 1,3 | 2,3 | ---> time */\r
-\r
-/* Update linear discriminant function history each frame: */\r
- if (*half == 1) {\r
- voice[0] = voice[2];\r
- voice[1] = voice[3];\r
- voice[2] = voice[4];\r
- voice[3] = voice[5];\r
- *maxmin = *maxamd / max(*minamd,1.f);\r
- }\r
-/* Calculate voicing parameters twice per frame: */\r
- vparms_(&vwin[1], &inbuf[inbuf_offset], &lpbuf[lpbuf_offset], &buflim[1], \r
- half, dither, mintau, &zc, &lbe, &fbe, &qs, &rc1, &ar_b__, &\r
- ar_f__);\r
-/* Estimate signal-to-noise ratio to select the appropriate VDC vector. \r
-*/\r
-/* The SNR is estimated as the running average of the ratio of the */\r
-/* running average full-band voiced energy to the running average */\r
-/* full-band unvoiced energy. SNR filter has gain of 63. */\r
- r__1 = (*snr + *fbve / (real) max(*fbue,1)) * 63 / 64.f;\r
- *snr = (real) i_nint(&r__1);\r
- snr2 = *snr * *fbue / max(*lbue,1);\r
-/* Quantize SNR to SNRL according to VDCL thresholds. */\r
- snrl = 1;\r
- i__1 = nvdcl - 1;\r
- for (snrl = 1; snrl <= i__1; ++snrl) {\r
- if (snr2 > vdcl[snrl - 1]) {\r
- goto L69;\r
- }\r
- }\r
-/* (Note: SNRL = NVDCL here) */\r
-L69:\r
-/* Linear discriminant voicing parameters: */\r
- value[0] = *maxmin;\r
- value[1] = (real) lbe / max(*lbve,1);\r
- value[2] = (real) zc;\r
- value[3] = rc1;\r
- value[4] = qs;\r
- value[5] = ivrc[2];\r
- value[6] = ar_b__;\r
- value[7] = ar_f__;\r
-/* Evaluation of linear discriminant function: */\r
- voice[*half + 3] = vdc[snrl * 10 - 1];\r
- for (i__ = 1; i__ <= 8; ++i__) {\r
- voice[*half + 3] += vdc[i__ + snrl * 10 - 11] * value[i__ - 1];\r
- }\r
-/* Classify as voiced if discriminant > 0, otherwise unvoiced */\r
-/* Voicing decision for current half-frame: 1 = Voiced; 0 = Unvoiced */\r
- if (voice[*half + 3] > 0.f) {\r
- voibuf[*half + 6] = 1;\r
- } else {\r
- voibuf[*half + 6] = 0;\r
- }\r
-/* Skip voicing decision smoothing in first half-frame: */\r
-/* Give a value to VSTATE, so that trace statements below will print \r
-*/\r
-/* a consistent value from one call to the next when HALF .EQ. 1. */\r
-/* The value of VSTATE is not used for any other purpose when this is \r
-*/\r
-/* true. */\r
- vstate = -1;\r
- if (*half == 1) {\r
- goto L99;\r
- }\r
-/* Voicing decision smoothing rules (override of linear combination): */\r
-\r
-/* Unvoiced half-frames: At least two in a row. */\r
-/* -------------------- */\r
-\r
-/* Voiced half-frames: At least two in a row in one frame. */\r
-/* ------------------- Otherwise at least three in a row. */\r
-/* (Due to the way transition frames are encoded) */\r
-\r
-/* In many cases, the discriminant function determines how to smooth. */\r
-/* In the following chart, the decisions marked with a * may be overridden\r
-.*/\r
-\r
-/* Voicing override of transitions at onsets: */\r
-/* If a V/UV or UV/V voicing decision transition occurs within one-half \r
-*/\r
-/* frame of an onset bounding a voicing window, then the transition is */\r
-/* moved to occur at the onset. */\r
-\r
-/* P 1F */\r
-/* ----- ----- */\r
-/* 0 0 0 0 */\r
-/* 0 0 0* 1 (If there is an onset there) */\r
-/* 0 0 1* 0* (Based on 2F and discriminant distance) */\r
-/* 0 0 1 1 */\r
-/* 0 1* 0 0 (Always) */\r
-/* 0 1* 0* 1 (Based on discriminant distance) */\r
-/* 0* 1 1 0* (Based on past, 2F, and discriminant distance) */\r
-/* 0 1* 1 1 (If there is an onset there) */\r
-/* 1 0* 0 0 (If there is an onset there) */\r
-/* 1 0 0 1 */\r
-/* 1 0* 1* 0 (Based on discriminant distance) */\r
-/* 1 0* 1 1 (Always) */\r
-/* 1 1 0 0 */\r
-/* 1 1 0* 1* (Based on 2F and discriminant distance) */\r
-/* 1 1 1* 0 (If there is an onset there) */\r
-/* 1 1 1 1 */\r
-\r
-/* Determine if there is an onset transition between P and 1F. */\r
-/* OT (Onset Transition) is true if there is an onset between */\r
-/* P and 1F but not after 1F. */\r
- ot = ((obound[1] & 2) != 0 || obound[2] == 1) && (obound[3] & 1) == 0;\r
-/* Multi-way dispatch on voicing decision history: */\r
- vstate = (voibuf[3] << 3) + (voibuf[4] << 2) + (voibuf[5] << 1) + voibuf[\r
- 6];\r
- switch (vstate + 1) {\r
- case 1: goto L99;\r
- case 2: goto L1;\r
- case 3: goto L2;\r
- case 4: goto L99;\r
- case 5: goto L4;\r
- case 6: goto L5;\r
- case 7: goto L6;\r
- case 8: goto L7;\r
- case 9: goto L8;\r
- case 10: goto L99;\r
- case 11: goto L10;\r
- case 12: goto L11;\r
- case 13: goto L99;\r
- case 14: goto L13;\r
- case 15: goto L14;\r
- case 16: goto L99;\r
- }\r
-L1:\r
- if (ot && voibuf[7] == 1) {\r
- voibuf[5] = 1;\r
- }\r
- goto L99;\r
-L2:\r
- if (voibuf[7] == 0 || voice[2] < -voice[3]) {\r
- voibuf[5] = 0;\r
- } else {\r
- voibuf[6] = 1;\r
- }\r
- goto L99;\r
-L4:\r
- voibuf[4] = 0;\r
- goto L99;\r
-L5:\r
- if (voice[1] < -voice[2]) {\r
- voibuf[4] = 0;\r
- } else {\r
- voibuf[5] = 1;\r
- }\r
- goto L99;\r
-/* VOIBUF(2,0) must be 0 */\r
-L6:\r
- if (voibuf[1] == 1 || voibuf[7] == 1 || voice[3] > voice[0]) {\r
- voibuf[6] = 1;\r
- } else {\r
- voibuf[3] = 1;\r
- }\r
- goto L99;\r
-L7:\r
- if (ot) {\r
- voibuf[4] = 0;\r
- }\r
- goto L99;\r
-L8:\r
- if (ot) {\r
- voibuf[4] = 1;\r
- }\r
- goto L99;\r
-L10:\r
- if (voice[2] < -voice[1]) {\r
- voibuf[5] = 0;\r
- } else {\r
- voibuf[4] = 1;\r
- }\r
- goto L99;\r
-L11:\r
- voibuf[4] = 1;\r
- goto L99;\r
-L13:\r
- if (voibuf[7] == 0 && voice[3] < -voice[2]) {\r
- voibuf[6] = 0;\r
- } else {\r
- voibuf[5] = 1;\r
- }\r
- goto L99;\r
-L14:\r
- if (ot && voibuf[7] == 0) {\r
- voibuf[5] = 0;\r
- }\r
-/* GOTO 99 */\r
-L99:\r
-/* Now update parameters: */\r
-/* ---------------------- */\r
-\r
-/* During unvoiced half-frames, update the low band and full band unvoice\r
-d*/\r
-/* energy estimates (LBUE and FBUE) and also the zero crossing */\r
-/* threshold (DITHER). (The input to the unvoiced energy filters is */\r
-/* restricted to be less than 10dB above the previous inputs of the */\r
-/* filters.) */\r
-/* During voiced half-frames, update the low-pass (LBVE) and all-pass */\r
-/* (FBVE) voiced energy estimates. */\r
- if (voibuf[*half + 6] == 0) {\r
-/* Computing MIN */\r
- i__1 = fbe, i__2 = *ofbue * 3;\r
- r__1 = (*sfbue * 63 + (min(i__1,i__2) << 3)) / 64.f;\r
- *sfbue = i_nint(&r__1);\r
- *fbue = *sfbue / 8;\r
- *ofbue = fbe;\r
-/* Computing MIN */\r
- i__1 = lbe, i__2 = *olbue * 3;\r
- r__1 = (*slbue * 63 + (min(i__1,i__2) << 3)) / 64.f;\r
- *slbue = i_nint(&r__1);\r
- *lbue = *slbue / 8;\r
- *olbue = lbe;\r
- } else {\r
- r__1 = (*lbve * 63 + lbe) / 64.f;\r
- *lbve = i_nint(&r__1);\r
- r__1 = (*fbve * 63 + fbe) / 64.f;\r
- *fbve = i_nint(&r__1);\r
- }\r
-/* Set dither threshold to yield proper zero crossing rates in the */\r
-/* presence of low frequency noise and low level signal input. */\r
-/* NOTE: The divisor is a function of REF, the expected energies. */\r
-/* Computing MIN */\r
-/* Computing MAX */\r
- r__2 = sqrt((real) (*lbue * *lbve)) * 64 / 3000;\r
- r__1 = max(r__2,1.f);\r
- *dither = min(r__1,20.f);\r
-/* Voicing decisions are returned in VOIBUF. */\r
- return 0;\r
-} /* voicin_ */\r
+++ /dev/null
-/*\r
-\r
-$Log$\r
-Revision 1.15 2004/06/26 03:50:14 markster\r
-Merge source cleanups (bug #1911)\r
-\r
-Revision 1.14 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-mer feb 12 14:56:57 CET 2003\r
-\r
-Revision 1.2 2000/01/05 08:20:40 markster\r
-Some OSS fixes and a few lpc changes to make it actually work\r
-\r
- * Revision 1.1 1996/08/19 22:30:04 jaf\r
- * Initial revision\r
- *\r
-\r
-*/\r
-\r
-/* -- translated by f2c (version 19951025).\r
- You must link the resulting object file with the libraries:\r
- -lf2c -lm (in that order)\r
-*/\r
-\r
-#include "f2c.h"\r
-\r
-#ifdef P_R_O_T_O_T_Y_P_E_S\r
-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__);\r
-#endif\r
-\r
-/* Table of constant values */\r
-\r
-static real c_b2 = 1.f;\r
-\r
-/* ********************************************************************* */\r
-\r
-/* VPARMS Version 50 */\r
-\r
-/* $Log$\r
- * Revision 1.15 2004/06/26 03:50:14 markster\r
- * Merge source cleanups (bug #1911)\r
- *\r
-/* Revision 1.14 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo\r
-/* mer feb 12 14:56:57 CET 2003\r
-/*\r
-/* Revision 1.2 2000/01/05 08:20:40 markster\r
-/* Some OSS fixes and a few lpc changes to make it actually work\r
-/*\r
- * Revision 1.1 1996/08/19 22:30:04 jaf\r
- * Initial revision\r
- * */\r
-/* Revision 1.6 1996/03/29 18:01:16 jaf */\r
-/* Added some more comments about the range of INBUF and LPBUF that can */\r
-/* be read. Note that it is possible for index VWIN(2)+1 to be read from */\r
-/* INBUF, which might be outside of its defined range, although that will */\r
-/* require more careful checking. */\r
-\r
-/* Revision 1.5 1996/03/19 00:02:02 jaf */\r
-/* I just noticed that the argument DITHER is modified inside of this */\r
-/* subroutine. Comments were added explaining the possible final values. */\r
-\r
-/* Revision 1.4 1996/03/18 22:22:59 jaf */\r
-/* Finishing the job I said I did with the last check-in comments. */\r
-\r
-/* Revision 1.3 1996/03/18 22:22:17 jaf */\r
-/* Just added a few comments about which array indices of the arguments */\r
-/* are used, and mentioning that this subroutine has no local state. */\r
-\r
-/* Revision 1.2 1996/03/13 15:02:58 jaf */\r
-/* Comments added explaining that none of the local variables of this */\r
-/* subroutine need to be saved from one invocation to the next. */\r
-\r
-/* Revision 1.1 1996/02/07 14:50:42 jaf */\r
-/* Initial revision */\r
-\r
-\r
-/* ********************************************************************* */\r
-\r
-/* Calculate voicing parameters: */\r
-\r
-/* Input: */\r
-/* VWIN - Voicing window limits */\r
-/* Indices 1 through 2 read. */\r
-/* INBUF - Input speech buffer */\r
-/* Indices START-1 through STOP read, */\r
-/* where START and STOP are defined in the code (only written once).\r
-*/\r
-/* Note that STOP can be as large as VWIN(2)+1 ! */\r
-/* LPBUF - Low pass filtered speech */\r
-/* Indices START-MINTAU through STOP+MINTAU read, */\r
-/* where START and STOP are defined in the code (only written once).\r
-*/\r
-/* BUFLIM - Array bounds for INBUF and LPBUF */\r
-/* Indices 1 through 4 read. */\r
-/* HALF - Half frame (1 or 2) */\r
-/* MINTAU - Lag corresponding to minimum AMDF value (pitch estimate) */\r
-/* Input/Output: */\r
-/* DITHER - Zero crossing threshold */\r
-/* The resulting value might be the negation of the input */\r
-/* value. It might always be the same as the input value, */\r
-/* if the DO loop below always executes an even number of times. */\r
-/* Output: (all of them are written on every call) */\r
-/* ZC - Zero crossing rate */\r
-/* LBE - Low band energy (sum of magnitudes - SM) */\r
-/* FBE - Full band energy (SM) */\r
-/* QS - Ratio of 6 dB/oct preemphasized energy to full band energy */\r
-/* RC1 - First reflection coefficient */\r
-/* AR_B - Product of the causal forward and reverse pitch */\r
-/* prediction gains */\r
-/* AR_F - Product of the noncausal forward and reverse pitch */\r
-/* prediction gains */\r
-/* Internal: */\r
-/* OLDSGN - Previous sign of dithered signal */\r
-/* VLEN - Length of voicing window */\r
-/* START - Lower address of current half of voicing window */\r
-/* STOP - Upper address of current half of voicing window */\r
-/* E_0 - Energy of LPF speech (sum of squares - SS) */\r
-/* E_B - Energy of LPF speech backward one pitch period (SS) */\r
-/* E_F - Energy of LPF speech forward one pitch period (SS) */\r
-/* R_B - Autocovariance of LPF speech backward one pitch period */\r
-/* R_F - Autocovariance of LPF speech forward one pitch period */\r
-/* LP_RMS - Energy of LPF speech (sum of magnitudes - SM) */\r
-/* AP_RMS - Energy of all-pass speech (SM) */\r
-/* E_PRE - Energy of 6dB preemphasized speech (SM) */\r
-/* E0AP - Energy of all-pass speech (SS) */\r
-\r
-/* This subroutine has no local state. */\r
-\r
-/* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer \r
- *buflim, integer *half, real *dither, integer *mintau, integer *zc, \r
- integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *\r
- ar_f__)\r
-{\r
- /* System generated locals */\r
- integer inbuf_offset, lpbuf_offset, i__1;\r
- real r__1, r__2;\r
-\r
- /* Builtin functions */\r
- double r_sign(real *, real *);\r
- integer i_nint(real *);\r
-\r
- /* Local variables */\r
- integer vlen, stop, i__;\r
- real e_pre__;\r
- integer start;\r
- real ap_rms__, e_0__, oldsgn, lp_rms__, e_b__, e_f__, r_b__, r_f__, e0ap;\r
-\r
-/* Arguments */\r
-/* Local variables that need not be saved */\r
-/* Calculate zero crossings (ZC) and several energy and correlation */\r
-/* measures on low band and full band speech. Each measure is taken */\r
-/* over either the first or the second half of the voicing window, */\r
-/* depending on the variable HALF. */\r
- /* Parameter adjustments */\r
- --vwin;\r
- --buflim;\r
- lpbuf_offset = buflim[3];\r
- lpbuf -= lpbuf_offset;\r
- inbuf_offset = buflim[1];\r
- inbuf -= inbuf_offset;\r
-\r
- /* Function Body */\r
- lp_rms__ = 0.f;\r
- ap_rms__ = 0.f;\r
- e_pre__ = 0.f;\r
- e0ap = 0.f;\r
- *rc1 = 0.f;\r
- e_0__ = 0.f;\r
- e_b__ = 0.f;\r
- e_f__ = 0.f;\r
- r_f__ = 0.f;\r
- r_b__ = 0.f;\r
- *zc = 0;\r
- vlen = vwin[2] - vwin[1] + 1;\r
- start = vwin[1] + (*half - 1) * vlen / 2 + 1;\r
- stop = start + vlen / 2 - 1;\r
-\r
-/* I'll use the symbol HVL in the table below to represent the value */\r
-/* VLEN/2. Note that if VLEN is odd, then HVL should be rounded down, */\r
-/* i.e., HVL = (VLEN-1)/2. */\r
-\r
-/* HALF START STOP */\r
-\r
-/* 1 VWIN(1)+1 VWIN(1)+HVL */\r
-/* 2 VWIN(1)+HVL+1 VWIN(1)+2*HVL */\r
-\r
-/* Note that if VLEN is even and HALF is 2, then STOP will be */\r
-/* VWIN(1)+VLEN = VWIN(2)+1. That could be bad, if that index of INBUF */\r
-/* is undefined. */\r
-\r
- r__1 = inbuf[start - 1] - *dither;\r
- oldsgn = r_sign(&c_b2, &r__1);\r
- i__1 = stop;\r
- for (i__ = start; i__ <= i__1; ++i__) {\r
- lp_rms__ += (r__1 = lpbuf[i__], abs(r__1));\r
- ap_rms__ += (r__1 = inbuf[i__], abs(r__1));\r
- e_pre__ += (r__1 = inbuf[i__] - inbuf[i__ - 1], abs(r__1));\r
-/* Computing 2nd power */\r
- r__1 = inbuf[i__];\r
- e0ap += r__1 * r__1;\r
- *rc1 += inbuf[i__] * inbuf[i__ - 1];\r
-/* Computing 2nd power */\r
- r__1 = lpbuf[i__];\r
- e_0__ += r__1 * r__1;\r
-/* Computing 2nd power */\r
- r__1 = lpbuf[i__ - *mintau];\r
- e_b__ += r__1 * r__1;\r
-/* Computing 2nd power */\r
- r__1 = lpbuf[i__ + *mintau];\r
- e_f__ += r__1 * r__1;\r
- r_f__ += lpbuf[i__] * lpbuf[i__ + *mintau];\r
- r_b__ += lpbuf[i__] * lpbuf[i__ - *mintau];\r
- r__1 = inbuf[i__] + *dither;\r
- if (r_sign(&c_b2, &r__1) != oldsgn) {\r
- ++(*zc);\r
- oldsgn = -oldsgn;\r
- }\r
- *dither = -(*dither);\r
- }\r
-/* Normalized short-term autocovariance coefficient at unit sample delay\r
- */\r
- *rc1 /= max(e0ap,1.f);\r
-/* Ratio of the energy of the first difference signal (6 dB/oct preemphas\r
-is)*/\r
-/* to the energy of the full band signal */\r
-/* Computing MAX */\r
- r__1 = ap_rms__ * 2.f;\r
- *qs = e_pre__ / max(r__1,1.f);\r
-/* aR_b is the product of the forward and reverse prediction gains, */\r
-/* looking backward in time (the causal case). */\r
- *ar_b__ = r_b__ / max(e_b__,1.f) * (r_b__ / max(e_0__,1.f));\r
-/* aR_f is the same as aR_b, but looking forward in time (non causal case\r
-).*/\r
- *ar_f__ = r_f__ / max(e_f__,1.f) * (r_f__ / max(e_0__,1.f));\r
-/* Normalize ZC, LBE, and FBE to old fixed window length of 180. */\r
-/* (The fraction 90/VLEN has a range of .58 to 1) */\r
- r__2 = (real) (*zc << 1);\r
- r__1 = r__2 * (90.f / vlen);\r
- *zc = i_nint(&r__1);\r
-/* Computing MIN */\r
- r__1 = lp_rms__ / 4 * (90.f / vlen);\r
- i__1 = i_nint(&r__1);\r
- *lbe = min(i__1,32767);\r
-/* Computing MIN */\r
- r__1 = ap_rms__ / 4 * (90.f / vlen);\r
- i__1 = i_nint(&r__1);\r
- *fbe = min(i__1,32767);\r
- return 0;\r
-} /* vparms_ */\r
-\r