ref: fd1a5db140d51e7188e5126db2edc0ab923cfa8c
parent: 81592731016180584d0de28be13965aa5b80ea0d
author: Koen Vos <[email protected]>
date: Wed Jun 30 06:41:17 EDT 2010
Update SILK code using the CELT range coder
--- a/COPYING
+++ /dev/null
@@ -1,26 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
--- a/INSTALL
+++ /dev/null
@@ -1,236 +1,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
-
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
-These are generic installation instructions.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
- It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
- The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system. If you're
- using `csh' on an old version of System V, you might need to type
- `sh ./configure' instead to prevent `csh' from trying to execute
- `configure' itself.
-
- Running `configure' takes awhile. While running, it prints some
- messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package.
-
- 4. Type `make install' to install the programs and any data files and
- documentation.
-
- 5. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
-Compilers and Options
-=====================
-
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about. Run `./configure --help' for
-details on some of the pertinent environment variables.
-
- You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment. Here
-is an example:
-
- ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
-
- *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
- If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory. After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
-
-Installation Names
-==================
-
-By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc. You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
-`--build=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
- CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
- OS KERNEL-OS
-
- See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
- If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
- If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-Variables not defined in a site shell script can be set in the
-environment passed to `configure'. However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost. In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'. For example:
-
- ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script). Here is a another example:
-
- /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
-
-`configure' Invocation
-======================
-
-`configure' recognizes the following options to control how it operates.
-
-`--help'
-`-h'
- Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
-
-`--config-cache'
-`-C'
- Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options. Run
-`configure --help' for more details.
-
--- /dev/null
+++ b/Makefile
@@ -1,0 +1,122 @@
+#
+# Makefile for Silk SDK
+#
+# Copyright (c) 2010, Skype Limited
+# All rights reserved.
+#
+
+#Platform detection and settings
+
+BUILD_OS := $(shell uname | sed -e 's/^.*Darwin.*/MacOS-X/ ; s/^.*CYGWIN.*/Windows/')
+
+BUILD_ARCHITECTURE := $(shell uname -m | sed -e 's/i686/i386/')
+
+EXESUFFIX =
+LIBPREFIX = lib
+LIBSUFFIX = .a
+OBJSUFFIX = .o
+
+CC = $(TOOLCHAIN_PREFIX)gcc$(TOOLCHAIN_SUFFIX)
+AR = $(TOOLCHAIN_PREFIX)ar
+RANLIB = $(TOOLCHAIN_PREFIX)ranlib
+CP = $(TOOLCHAIN_PREFIX)cp
+
+cflags-from-defines = $(addprefix -D,$(1))
+cflags-from-includes = $(addprefix -I,$(1))
+ldflags-from-ldlibdirs = $(addprefix -L,$(1))
+ldlibs-from-libs = $(addprefix -l,$(1))
+
+CFLAGS += -Wall -enable-threads -O3
+
+CFLAGS += $(call cflags-from-defines,$(CDEFINES))
+CFLAGS += $(call cflags-from-includes,$(CINCLUDES))
+LDFLAGS += $(call ldflags-from-ldlibdirs,$(LDLIBDIRS))
+LDLIBS += $(call ldlibs-from-libs,$(LIBS))
+
+COMPILE.c.cmdline = $(CC) -c $(CFLAGS) -o $@ $<
+LINK.o.cmdline = $(LINK.o) -lm $^ $(LDLIBS) -o $@$(EXESUFFIX)
+ARCHIVE.cmdline = $(AR) $(ARFLAGS) $@ $^ && $(RANLIB) $@
+
+%$(OBJSUFFIX):%.c
+ $(COMPILE.c.cmdline)
+
+ifneq (,$(filter FIXED_POINT, $(CDEFINES)))
+
+# Directives
+
+CINCLUDES += interface src_common src_fix src_SigProc_FIX test
+
+# VPATH e.g. VPATH = src:../headers
+VPATH = ./ \
+ interface \
+ src_common \
+ src_fix \
+ src_SigProc_FIX \
+ test
+
+SRCS_C = $(wildcard src_common/*.c src_fix/*.c src_SigProc_FIX/*.c )
+
+else
+
+# Directives
+
+CINCLUDES += interface src_common src_fix src_SigProc_FIX src_SigProc_FLP test
+
+# VPATH e.g. VPATH = src:../headers
+VPATH = ./ \
+ interface \
+ src_common \
+ src_flp \
+ src_SigProc_FIX \
+ src_SigProc_FLP \
+ test
+
+SRCS_C = $(wildcard src_common/*.c src_flp/*.c src_SigProc_FIX/*.c src_SigProc_FLP/*.c )
+
+endif
+
+# Variable definitions
+LIB_NAME = SKP_SILK_SDK
+TARGET = $(LIBPREFIX)$(LIB_NAME)$(LIBSUFFIX)
+
+
+OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(SRCS_C))
+
+ENCODER_SRCS_C = test/Encoder.c test/SKP_debug.c
+ENCODER_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(ENCODER_SRCS_C))
+
+DECODER_SRCS_C = test/Decoder.c test/SKP_debug.c
+DECODER_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(DECODER_SRCS_C))
+
+SIGNALCMP_SRCS_C = test/signalCompare.c
+SIGNALCMP_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(SIGNALCMP_SRCS_C))
+
+LIBS = \
+ $(LIB_NAME)
+
+LDLIBDIRS = ./
+
+# Rules
+default: all
+
+all: $(TARGET) encoder decoder signalcompare
+
+lib: $(TARGET)
+
+$(TARGET): $(OBJS)
+ $(ARCHIVE.cmdline)
+
+encoder$(EXESUFFIX): $(ENCODER_OBJS)
+ $(LINK.o.cmdline)
+
+decoder$(EXESUFFIX): $(DECODER_OBJS)
+ $(LINK.o.cmdline)
+
+signalcompare$(EXESUFFIX): $(SIGNALCMP_OBJS)
+ $(LINK.o.cmdline)
+
+clean:
+ $(RM) $(TARGET)* $(OBJS) $(ENCODER_OBJS) $(DECODER_OBJS) \
+ $(SIGNALCMP_OBJS) $(TEST_OBJS) \
+ encoder$(EXESUFFIX) decoder$(EXESUFFIX) signalcompare$(EXESUFFIX)
+
--- a/Makefile.am
+++ /dev/null
@@ -1,172 +1,0 @@
-
-AM_CFLAGS = -Isrc -Iinterface -fPIC -Wall -O3
-AUTOMAKE_OPTS = gnu
-NAME = libSKP_SILK_SDK
-AM_CPPFLAGS = $(AM_CFLAGS)
-
-EXTRA_DIST = Silk_SDK.sln \
-src/Silk_FIX.vcproj \
-test/Encoder.c \
-test/Enc_SDK.vcproj \
-test/Decoder.c \
-test/Dec_SDK.vcproj \
-test/signalCompare.c \
-test/SignalCompare.vcproj
-
-lib_LTLIBRARIES = libSKP_SILK_SDK.la
-libSKP_SILK_SDK_la_SOURCES = src/SKP_Silk_A2NLSF.c \
-src/SKP_Silk_allpass_int.c \
-src/SKP_Silk_ana_filt_bank_1.c \
-src/SKP_Silk_apply_sine_window.c \
-src/SKP_Silk_array_maxabs.c \
-src/SKP_Silk_autocorr.c \
-src/SKP_Silk_biquad_alt.c \
-src/SKP_Silk_biquad.c \
-src/SKP_Silk_burg_modified.c \
-src/SKP_Silk_bwexpander_32.c \
-src/SKP_Silk_bwexpander.c \
-src/SKP_Silk_CNG.c \
-src/SKP_Silk_code_signs.c \
-src/SKP_Silk_control_codec_FIX.c \
-src/SKP_Silk_corrMatrix_FIX.c \
-src/SKP_Silk_create_init_destroy.c \
-src/SKP_Silk_dec_API.c \
-src/SKP_Silk_decode_core.c \
-src/SKP_Silk_decode_frame.c \
-src/SKP_Silk_decode_indices_v4.c \
-src/SKP_Silk_decode_parameters.c \
-src/SKP_Silk_decode_parameters_v4.c \
-src/SKP_Silk_decode_pulses.c \
-src/SKP_Silk_decoder_set_fs.c \
-src/SKP_Silk_detect_SWB_input.c \
-src/SKP_Silk_enc_API.c \
-src/SKP_Silk_encode_frame_FIX.c \
-src/SKP_Silk_encode_parameters.c \
-src/SKP_Silk_encode_parameters_v4.c \
-src/SKP_Silk_encode_pulses.c \
-src/SKP_Silk_find_LPC_FIX.c \
-src/SKP_Silk_find_LTP_FIX.c \
-src/SKP_Silk_find_pitch_lags_FIX.c \
-src/SKP_Silk_find_pred_coefs_FIX.c \
-src/SKP_Silk_gain_quant.c \
-src/SKP_Silk_HP_variable_cutoff_FIX.c \
-src/SKP_Silk_init_encoder_FIX.c \
-src/SKP_Silk_inner_prod_aligned.c \
-src/SKP_Silk_interpolate.c \
-src/SKP_Silk_k2a.c \
-src/SKP_Silk_k2a_Q16.c \
-src/SKP_Silk_LBRR_reset.c \
-src/SKP_Silk_lin2log.c \
-src/SKP_Silk_log2lin.c \
-src/SKP_Silk_lowpass_int.c \
-src/SKP_Silk_lowpass_short.c \
-src/SKP_Silk_LPC_inv_pred_gain.c \
-src/SKP_Silk_LPC_stabilize.c \
-src/SKP_Silk_LPC_synthesis_filter.c \
-src/SKP_Silk_LPC_synthesis_order16.c \
-src/SKP_Silk_LP_variable_cutoff.c \
-src/SKP_Silk_LSF_cos_table.c \
-src/SKP_Silk_LTP_analysis_filter_FIX.c \
-src/SKP_Silk_LTP_scale_ctrl_FIX.c \
-src/SKP_Silk_MA.c \
-src/SKP_Silk_NLSF2A.c \
-src/SKP_Silk_NLSF2A_stable.c \
-src/SKP_Silk_NLSF_MSVQ_decode.c \
-src/SKP_Silk_NLSF_MSVQ_encode_FIX.c \
-src/SKP_Silk_NLSF_stabilize.c \
-src/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c \
-src/SKP_Silk_NLSF_VQ_sum_error_FIX.c \
-src/SKP_Silk_NLSF_VQ_weights_laroia.c \
-src/SKP_Silk_noise_shape_analysis_FIX.c \
-src/SKP_Silk_NSQ.c \
-src/SKP_Silk_NSQ_del_dec.c \
-src/SKP_Silk_pitch_analysis_core.c \
-src/SKP_Silk_pitch_est_tables.c \
-src/SKP_Silk_PLC.c \
-src/SKP_Silk_prefilter_FIX.c \
-src/SKP_Silk_process_gains_FIX.c \
-src/SKP_Silk_process_NLSFs_FIX.c \
-src/SKP_Silk_pulses_to_bytes.c \
-src/SKP_Silk_quant_LTP_gains_FIX.c \
-src/SKP_Silk_range_coder.c \
-src/SKP_Silk_regularize_correlations_FIX.c \
-src/SKP_Silk_resample_1_2.c \
-src/SKP_Silk_resample_1_2_coarse.c \
-src/SKP_Silk_resample_1_2_coarsest.c \
-src/SKP_Silk_resample_1_3.c \
-src/SKP_Silk_resample_2_1_coarse.c \
-src/SKP_Silk_resample_2_3.c \
-src/SKP_Silk_resample_2_3_coarse.c \
-src/SKP_Silk_resample_2_3_coarsest.c \
-src/SKP_Silk_resample_2_3_rom.c \
-src/SKP_Silk_resample_3_1.c \
-src/SKP_Silk_resample_3_2.c \
-src/SKP_Silk_resample_3_2_rom.c \
-src/SKP_Silk_resample_3_4.c \
-src/SKP_Silk_resample_4_3.c \
-src/SKP_Silk_residual_energy16_FIX.c \
-src/SKP_Silk_residual_energy_FIX.c \
-src/SKP_Silk_scale_copy_vector16.c \
-src/SKP_Silk_scale_vector.c \
-src/SKP_Silk_schur64.c \
-src/SKP_Silk_schur.c \
-src/SKP_Silk_shell_coder.c \
-src/SKP_Silk_sigm_Q15.c \
-src/SKP_Silk_solve_LS_FIX.c \
-src/SKP_Silk_sort.c \
-src/SKP_Silk_sum_sqr_shift.c \
-src/SKP_Silk_tables_gain.c \
-src/SKP_Silk_tables_LTP.c \
-src/SKP_Silk_tables_NLSF_CB0_10.c \
-src/SKP_Silk_tables_NLSF_CB0_16.c \
-src/SKP_Silk_tables_NLSF_CB1_10.c \
-src/SKP_Silk_tables_NLSF_CB1_16.c \
-src/SKP_Silk_tables_other.c \
-src/SKP_Silk_tables_pitch_lag.c \
-src/SKP_Silk_tables_pulses_per_block.c \
-src/SKP_Silk_tables_sign.c \
-src/SKP_Silk_tables_type_offset.c \
-src/SKP_Silk_VAD.c \
-src/SKP_Silk_VQ_nearest_neighbor_FIX.c
-
-
-libSKP_SILK_SDK_la_CFLAGS = $(AM_CFLAGS)
-libSKP_SILK_SDK_la_LDFLAGS = $(LIBS)
-
-library_includedir = $(prefix)/include/silk
-library_include_HEADERS = src/SKP_Silk_common_pitch_est_defines.h \
-src/SKP_Silk_define_FIX.h \
-src/SKP_Silk_define.h \
-src/SKP_Silk_Inlines.h \
-src/SKP_Silk_macros.h \
-src/SKP_Silk_main_FIX.h \
-src/SKP_Silk_main.h \
-src/SKP_Silk_perceptual_parameters_FIX.h \
-src/SKP_Silk_pitch_est_defines.h \
-src/SKP_Silk_PLC.h \
-src/SKP_Silk_resample_rom.h \
-src/SKP_Silk_SigProc_FIX.h \
-src/SKP_Silk_structs_FIX.h \
-src/SKP_Silk_structs.h \
-src/SKP_Silk_tables.h \
-src/SKP_Silk_tables_NLSF_CB0_10.h \
-src/SKP_Silk_tables_NLSF_CB0_16.h \
-src/SKP_Silk_tables_NLSF_CB1_10.h \
-src/SKP_Silk_tables_NLSF_CB1_16.h \
-interface/SKP_Silk_control.h \
-interface/SKP_Silk_errors.h \
-interface/SKP_Silk_SDK_API.h \
-interface/SKP_Silk_typedef.h
-
-bin_PROGRAMS = Encoder Decoder signalCompare
-Encoder_SOURCES = test/Encoder.c $(top_builddir)/interface/SKP_Silk_SDK_API.h
-Encoder_LDADD = $(lib_LTLIBRARIES)
-Encoder_LDFLAGS = $(LIBS)
-
-Decoder_SOURCES = test/Decoder.c $(top_builddir)/interface/SKP_Silk_SDK_API.h
-Decoder_LDADD = $(lib_LTLIBRARIES)
-Decoder_LDFLAGS = $(LIBS)
-
-signalCompare_SOURCES = test/signalCompare.c $(top_builddir)/interface/SKP_Silk_SDK_API.h
-signalCompare_LDADD = $(lib_LTLIBRARIES)
-signalCompare_LDFLAGS = $(LIBS)
--- /dev/null
+++ b/Silk_FIX.sln
@@ -1,0 +1,91 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dec", "test\Dec_SDK.vcproj", "{82685D7F-0589-42BD-877C-31A952D53A8E}"
+ ProjectSection(ProjectDependencies) = postProject
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74} = {2769AFC5-8FC2-42E8-803C-528ACBA89C74}
+ {0E29E502-AB22-4147-93A1-AC91528ED758} = {0E29E502-AB22-4147-93A1-AC91528ED758}
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SignalCompare", "test\SignalCompare.vcproj", "{7FE8F544-9175-40C3-A187-7F15CE9A75D8}"
+ ProjectSection(ProjectDependencies) = postProject
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74} = {2769AFC5-8FC2-42E8-803C-528ACBA89C74}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Enc", "test\Enc_SDK.vcproj", "{6D97A8EF-5724-4D85-8BF4-C583714BBA78}"
+ ProjectSection(ProjectDependencies) = postProject
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74} = {2769AFC5-8FC2-42E8-803C-528ACBA89C74}
+ {0E29E502-AB22-4147-93A1-AC91528ED758} = {0E29E502-AB22-4147-93A1-AC91528ED758}
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "src_FIX\Silk_FIX.vcproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0E29E502-AB22-4147-93A1-AC91528ED758} = {0E29E502-AB22-4147-93A1-AC91528ED758}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SigProc_FIX", "src_SigProc_FIX\SigProc_FIX.vcproj", "{2769AFC5-8FC2-42E8-803C-528ACBA89C74}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_Common", "src_common\Silk_Common.vcproj", "{0E29E502-AB22-4147-93A1-AC91528ED758}"
+ ProjectSection(ProjectDependencies) = postProject
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93} = {8181D6A1-DE19-4A5C-9B96-E10A18068C93}
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74} = {2769AFC5-8FC2-42E8-803C-528ACBA89C74}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcelt", "..\..\celt-0.8.0\libcelt\libcelt.vcproj", "{8181D6A1-DE19-4A5C-9B96-E10A18068C93}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug MCD|Win32 = Debug MCD|Win32
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.Build.0 = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.ActiveCfg = Release|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.Build.0 = Release|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.Build.0 = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.ActiveCfg = Release|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.Build.0 = Release|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.Build.0 = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.ActiveCfg = Release|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.Build.0 = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug|Win32.Build.0 = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Release|Win32.ActiveCfg = Release|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Release|Win32.Build.0 = Release|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug|Win32.Build.0 = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Release|Win32.ActiveCfg = Release|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Release|Win32.Build.0 = Release|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug MCD|Win32.ActiveCfg = Debug MCD|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug MCD|Win32.Build.0 = Debug MCD|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug|Win32.Build.0 = Debug|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Release|Win32.ActiveCfg = Release|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- /dev/null
+++ b/Silk_FLP.sln
@@ -1,0 +1,99 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dec", "test\Dec_SDK.vcproj", "{82685D7F-0589-42BD-877C-31A952D53A8E}"
+ ProjectSection(ProjectDependencies) = postProject
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74} = {2769AFC5-8FC2-42E8-803C-528ACBA89C74}
+ {0E29E502-AB22-4147-93A1-AC91528ED758} = {0E29E502-AB22-4147-93A1-AC91528ED758}
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SignalCompare", "test\SignalCompare.vcproj", "{7FE8F544-9175-40C3-A187-7F15CE9A75D8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Enc", "test\Enc_SDK.vcproj", "{6D97A8EF-5724-4D85-8BF4-C583714BBA78}"
+ ProjectSection(ProjectDependencies) = postProject
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74} = {2769AFC5-8FC2-42E8-803C-528ACBA89C74}
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926} = {793D0EC2-8554-4674-9A97-F25DE5DBE926}
+ {0E29E502-AB22-4147-93A1-AC91528ED758} = {0E29E502-AB22-4147-93A1-AC91528ED758}
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SigProc_FIX", "src_SigProc_FIX\SigProc_FIX.vcproj", "{2769AFC5-8FC2-42E8-803C-528ACBA89C74}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FLP", "src_FLP\Silk_FLP.vcproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
+ ProjectSection(ProjectDependencies) = postProject
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926} = {793D0EC2-8554-4674-9A97-F25DE5DBE926}
+ {0E29E502-AB22-4147-93A1-AC91528ED758} = {0E29E502-AB22-4147-93A1-AC91528ED758}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SigProc_FLP", "src_SigProc_FLP\SigProc_FLP.vcproj", "{793D0EC2-8554-4674-9A97-F25DE5DBE926}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_Common", "src_common\Silk_CommonFLP.vcproj", "{0E29E502-AB22-4147-93A1-AC91528ED758}"
+ ProjectSection(ProjectDependencies) = postProject
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93} = {8181D6A1-DE19-4A5C-9B96-E10A18068C93}
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74} = {2769AFC5-8FC2-42E8-803C-528ACBA89C74}
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926} = {793D0EC2-8554-4674-9A97-F25DE5DBE926}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcelt", "..\..\celt-0.8.0\libcelt\libcelt.vcproj", "{8181D6A1-DE19-4A5C-9B96-E10A18068C93}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug MCD|Win32 = Debug MCD|Win32
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.Build.0 = Debug|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.ActiveCfg = Release|Win32
+ {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.Build.0 = Release|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.Build.0 = Debug|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.ActiveCfg = Release|Win32
+ {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.Build.0 = Release|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.Build.0 = Debug|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.ActiveCfg = Release|Win32
+ {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.Build.0 = Release|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Debug|Win32.Build.0 = Debug|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Release|Win32.ActiveCfg = Release|Win32
+ {2769AFC5-8FC2-42E8-803C-528ACBA89C74}.Release|Win32.Build.0 = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926}.Debug|Win32.ActiveCfg = Debug|Win32
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926}.Debug|Win32.Build.0 = Debug|Win32
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926}.Release|Win32.ActiveCfg = Release|Win32
+ {793D0EC2-8554-4674-9A97-F25DE5DBE926}.Release|Win32.Build.0 = Release|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug MCD|Win32.ActiveCfg = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug MCD|Win32.Build.0 = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Debug|Win32.Build.0 = Debug|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Release|Win32.ActiveCfg = Release|Win32
+ {0E29E502-AB22-4147-93A1-AC91528ED758}.Release|Win32.Build.0 = Release|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug MCD|Win32.ActiveCfg = Debug MCD|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug MCD|Win32.Build.0 = Debug MCD|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Debug|Win32.Build.0 = Debug|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Release|Win32.ActiveCfg = Release|Win32
+ {8181D6A1-DE19-4A5C-9B96-E10A18068C93}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- a/Silk_SDK.sln
+++ /dev/null
@@ -1,44 +1,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "src\Silk_FIX.vcproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dec_SDK", "test\Dec_SDK.vcproj", "{82685D7F-0589-42BD-877C-31A952D53A8E}"
- ProjectSection(ProjectDependencies) = postProject
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SignalCompare", "test\SignalCompare.vcproj", "{7FE8F544-9175-40C3-A187-7F15CE9A75D8}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Enc_SDK", "test\Enc_SDK.vcproj", "{6D97A8EF-5724-4D85-8BF4-C583714BBA78}"
- ProjectSection(ProjectDependencies) = postProject
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32
- {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.ActiveCfg = Debug|Win32
- {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.Build.0 = Debug|Win32
- {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.ActiveCfg = Release|Win32
- {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.Build.0 = Release|Win32
- {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.ActiveCfg = Debug|Win32
- {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.Build.0 = Debug|Win32
- {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.ActiveCfg = Release|Win32
- {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.Build.0 = Release|Win32
- {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.ActiveCfg = Debug|Win32
- {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.Build.0 = Debug|Win32
- {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.ActiveCfg = Release|Win32
- {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
--- a/configure.gnu
+++ /dev/null
@@ -1,4 +1,0 @@
-#! /bin/sh
-srcpath=$(dirname $0 2>/dev/null ) || srcpath="."
-$srcpath/configure "$@" --disable-shared --with-pic
-
--- a/configure.in
+++ /dev/null
@@ -1,26 +1,0 @@
-# -*- Autoconf -*-
-# Process this file with autoconf to produce a configure script.
-
-AC_PREREQ([2.59])
-AC_INIT(libSKP_SILK_SDK, 1.0.2, [email protected], libSKP_SILK_SDK)
-AM_INIT_AUTOMAKE(libSKP_SILK_SDK,1.0.2)
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_LIBTOOL
-
-# Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS([float.h stdint.h stdlib.h string.h])
-
-# Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_C_INLINE
-AC_TYPE_SIZE_T
-
-# Checks for library functions.
-AC_FUNC_MALLOC
-AC_CHECK_LIB([m],[pow])
-
-AC_CONFIG_FILES([Makefile])
-AC_OUTPUT
--- a/interface/SKP_Silk_SDK_API.h
+++ b/interface/SKP_Silk_SDK_API.h
@@ -39,7 +39,7 @@
#define SILK_MAX_FRAMES_PER_PACKET 5
-/* Struct for TOC (Table Of Contents) */
+/* Struct for TOC (Table of Contents) */
typedef struct {
SKP_int framesInPacket; /* Number of 20 ms frames in packet */
SKP_int fs_kHz; /* Sampling frequency in packet */
@@ -56,7 +56,7 @@
/***********************************************/
/* Get size in bytes of the Silk encoder state */
/***********************************************/
-SKP_int SKP_Silk_SDK_Get_Encoder_Size(
+SKP_int SKP_Silk_SDK_Get_Encoder_Size( /* O: Returns error code */
SKP_int32 *encSizeBytes /* O: Number of bytes in SILK encoder state */
);
@@ -63,7 +63,7 @@
/*************************/
/* Init or reset encoder */
/*************************/
-SKP_int SKP_Silk_SDK_InitEncoder(
+SKP_int SKP_Silk_SDK_InitEncoder( /* O: Returns error code */
void *encState, /* I/O: State */
SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */
);
@@ -71,7 +71,7 @@
/***************************************/
/* Read control structure from encoder */
/***************************************/
-SKP_int SKP_Silk_SDK_QueryEncoder(
+SKP_int SKP_Silk_SDK_QueryEncoder( /* O: Returns error code */
const void *encState, /* I: State */
SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */
);
@@ -79,13 +79,13 @@
/**************************/
/* Encode frame with Silk */
/**************************/
-SKP_int SKP_Silk_SDK_Encode(
+SKP_int SKP_Silk_SDK_Encode( /* O: Returns error code */
void *encState, /* I/O: State */
const SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control status */
const SKP_int16 *samplesIn, /* I: Speech sample input vector */
SKP_int nSamplesIn, /* I: Number of samples in input vector */
SKP_uint8 *outData, /* O: Encoded output vector */
- SKP_int16 *nBytesOut /* I/O: Number of Bytes in outData (input: Max Bytes) */
+ SKP_int16 *nBytesOut /* I/O: Number of bytes in outData (input: Max bytes) */
);
/****************************************/
@@ -95,7 +95,7 @@
/***********************************************/
/* Get size in bytes of the Silk decoder state */
/***********************************************/
-SKP_int SKP_Silk_SDK_Get_Decoder_Size(
+SKP_int SKP_Silk_SDK_Get_Decoder_Size( /* O: Returns error code */
SKP_int32 *decSizeBytes /* O: Number of bytes in SILK decoder state */
);
@@ -102,7 +102,7 @@
/*************************/
/* Init or Reset decoder */
/*************************/
-SKP_int SKP_Silk_SDK_InitDecoder(
+SKP_int SKP_Silk_SDK_InitDecoder( /* O: Returns error code */
void *decState /* I/O: State */
);
@@ -109,12 +109,12 @@
/******************/
/* Decode a frame */
/******************/
-SKP_int SKP_Silk_SDK_Decode(
+SKP_int SKP_Silk_SDK_Decode( /* O: Returns error code */
void* decState, /* I/O: State */
SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control Structure */
SKP_int lostFlag, /* I: 0: no loss, 1 loss */
const SKP_uint8 *inData, /* I: Encoded input vector */
- const SKP_int nBytesIn, /* I: Number of input Bytes */
+ const SKP_int nBytesIn, /* I: Number of input bytes */
SKP_int16 *samplesOut, /* O: Decoded output speech vector */
SKP_int16 *nSamplesOut /* I/O: Number of samples (vector/decoded) */
);
@@ -123,22 +123,20 @@
/* Find Low Bit Rate Redundancy (LBRR) information in a packet */
/***************************************************************/
void SKP_Silk_SDK_search_for_LBRR(
- void *decState, /* I: Decoder state, to select bitstream version only */
const SKP_uint8 *inData, /* I: Encoded input vector */
- const SKP_int16 nBytesIn, /* I: Number of input Bytes */
+ const SKP_int16 nBytesIn, /* I: Number of input bytes */
SKP_int lost_offset, /* I: Offset from lost packet */
SKP_uint8 *LBRRData, /* O: LBRR payload */
SKP_int16 *nLBRRBytes /* O: Number of LBRR Bytes */
);
-/************************************/
-/* Get type of content for a packet */
-/************************************/
+/**************************************/
+/* Get table of contents for a packet */
+/**************************************/
void SKP_Silk_SDK_get_TOC(
- void *decState, /* I: Decoder state, to select bitstream version only */
const SKP_uint8 *inData, /* I: Encoded input vector */
const SKP_int16 nBytesIn, /* I: Number of input bytes */
- SKP_Silk_TOC_struct *Silk_TOC /* O: Type of content */
+ SKP_Silk_TOC_struct *Silk_TOC /* O: Table of contents */
);
/**************************/
--- a/interface/SKP_Silk_control.h
+++ b/interface/SKP_Silk_control.h
@@ -39,9 +39,12 @@
/* Structure for controlling encoder operation */
/***********************************************/
typedef struct {
- /* I: Sampling rate in Hertz; 8000/12000/16000/24000 */
- SKP_int32 sampleRate;
+ /* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000 */
+ SKP_int32 API_sampleRate;
+ /* I: Maximum internal sampling rate in Hertz; 8000/12000/16000/24000 */
+ SKP_int32 maxInternalSampleRate;
+
/* I: Number of samples per packet; must be equivalent of 20, 40, 60, 80 or 100 ms */
SKP_int packetSize;
@@ -48,7 +51,7 @@
/* I: Bitrate during active speech in bits/second; internally limited */
SKP_int32 bitRate;
- /* I: Uplink Packet loss in pct (0...100) */
+ /* I: Uplink packet loss in percent (0-100) */
SKP_int packetLossPercentage;
/* I: Complexity mode; 0 is lowest; 1 is medium and 2 is highest complexity */
@@ -57,7 +60,7 @@
/* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */
SKP_int useInBandFEC;
- /* I: Flag to enable Discontinous Transmission; 0/1 */
+ /* I: Flag to enable discontinuous transmission (DTX); 0/1 */
SKP_int useDTX;
} SKP_SILK_SDK_EncControlStruct;
@@ -65,8 +68,8 @@
/* Structure for controlling decoder operation and reading decoder status */
/**************************************************************************/
typedef struct {
- /* I: Sampling rate in Hertz; 8000/12000/16000/24000 */
- SKP_int32 sampleRate;
+ /* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000 */
+ SKP_int32 API_sampleRate;
/* O: Number of samples per frame */
SKP_int frameSize;
--- a/interface/SKP_Silk_errors.h
+++ b/interface/SKP_Silk_errors.h
@@ -36,48 +36,45 @@
/******************/
/* Error messages */
/******************/
-#define SKP_SILK_NO_ERROR 0
+#define SKP_SILK_NO_ERROR 0
/**************************/
/* Encoder error messages */
/**************************/
-/* Input length is not a multiplum of 10 ms,
- or length is longer than the packet length */
-#define SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -1
+/* Input length is not a multiplum of 10 ms, or length is longer than the packet length */
+#define SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -1
-/* Sampling frequency not 8000, 12000, 16000
- or 24000 Hertz */
-#define SKP_SILK_ENC_FS_NOT_SUPPORTED -2
+/* Sampling frequency not 8000, 12000, 16000 or 24000 Hertz */
+#define SKP_SILK_ENC_FS_NOT_SUPPORTED -2
/* Packet size not 20, 40, 60, 80 or 100 ms */
-#define SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -3
+#define SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -3
/* Allocated payload buffer too short */
-#define SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT -4
+#define SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT -4
/* Loss rate not between 0 and 100 percent */
-#define SKP_SILK_ENC_WRONG_LOSS_RATE -5
+#define SKP_SILK_ENC_INVALID_LOSS_RATE -5
/* Complexity setting not valid, use 0, 1 or 2 */
-#define SKP_SILK_ENC_WRONG_COMPLEXITY_SETTING -6
+#define SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING -6
/* Inband FEC setting not valid, use 0 or 1 */
-#define SKP_SILK_ENC_WRONG_INBAND_FEC_SETTING -7
+#define SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING -7
/* DTX setting not valid, use 0 or 1 */
-#define SKP_SILK_ENC_WRONG_DTX_SETTING -8
+#define SKP_SILK_ENC_INVALID_DTX_SETTING -8
/* Internal encoder error */
-#define SKP_SILK_ENC_INTERNAL_ERROR -9
+#define SKP_SILK_ENC_INTERNAL_ERROR -9
/**************************/
/* Decoder error messages */
/**************************/
-/* Output sampling frequency lower than internal
- decoded sampling frequency */
-#define SKP_SILK_DEC_WRONG_SAMPLING_FREQUENCY -10
+/* Output sampling frequency lower than internal decoded sampling frequency */
+#define SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY -10
/* Payload size exceeded the maximum allowed 1024 bytes */
#define SKP_SILK_DEC_PAYLOAD_TOO_LARGE -11
@@ -84,7 +81,6 @@
/* Payload has bit errors */
#define SKP_SILK_DEC_PAYLOAD_ERROR -12
-
#ifdef __cplusplus
}
--- /dev/null
+++ b/interface/SKP_debug.h
@@ -1,0 +1,293 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+
+/* *
+ * SKP_debug.h *
+ * *
+ * This contains code to help debugging *
+ * *
+ * Copyright 2009 (c), Skype Limited *
+ * Date: 090629 *
+ * */
+#ifndef _SKP_DEBUG_H_
+#define _SKP_DEBUG_H_
+
+#ifdef _WIN32
+#define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+
+#include "SKP_Silk_typedef.h"
+#include <stdio.h> /* file writing */
+#include <string.h> /* strcpy, strcmp */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+unsigned long GetHighResolutionTime(); /* O: time in usec*/
+
+/* make SKP_DEBUG dependent on compiler's _DEBUG */
+#if defined _WIN32
+ #ifdef _DEBUG
+ #define SKP_DEBUG 1
+ #else
+ #define SKP_DEBUG 0
+ #endif
+
+ /* overrule the above */
+ #if 0
+ // #define NO_ASSERTS
+ #undef SKP_DEBUG
+ #define SKP_DEBUG 1
+ #endif
+#else
+ #define SKP_DEBUG 0
+#endif
+
+/* Flag for using timers */
+#define SKP_TIC_TOC 1
+
+#if SKP_TIC_TOC
+
+#if (defined(_WIN32) || defined(_WINCE))
+#include <windows.h> /* timer */
+#pragma warning( disable : 4996 ) // stop bitching about strcpy in TIC()
+#else // Linux or Mac
+#include <sys/time.h>
+#endif
+
+/*********************************/
+/* timer functions for profiling */
+/*********************************/
+/* example: */
+/* */
+/* TIC(LPC) */
+/* do_LPC(in_vec, order, acoef); // do LPC analysis */
+/* TOC(LPC) */
+/* */
+/* and call the following just before exiting (from main) */
+/* */
+/* SKP_TimerSave("SKP_TimingData.txt"); */
+/* */
+/* results are now in SKP_TimingData.txt */
+
+void SKP_TimerSave(char *file_name);
+
+/* max number of timers (in different locations) */
+#define SKP_NUM_TIMERS_MAX 50
+/* max length of name tags in TIC(..), TOC(..) */
+#define SKP_NUM_TIMERS_MAX_TAG_LEN 30
+
+extern int SKP_Timer_nTimers;
+extern int SKP_Timer_depth_ctr;
+extern char SKP_Timer_tags[SKP_NUM_TIMERS_MAX][SKP_NUM_TIMERS_MAX_TAG_LEN];
+#ifdef _WIN32
+extern LARGE_INTEGER SKP_Timer_start[SKP_NUM_TIMERS_MAX];
+#else
+extern unsigned long SKP_Timer_start[SKP_NUM_TIMERS_MAX];
+#endif
+extern unsigned int SKP_Timer_cnt[SKP_NUM_TIMERS_MAX];
+extern SKP_int64 SKP_Timer_sum[SKP_NUM_TIMERS_MAX];
+extern SKP_int64 SKP_Timer_max[SKP_NUM_TIMERS_MAX];
+extern SKP_int64 SKP_Timer_min[SKP_NUM_TIMERS_MAX];
+extern SKP_int64 SKP_Timer_depth[SKP_NUM_TIMERS_MAX];
+
+/* WARNING: TIC()/TOC can measure only up to 0.1 seconds at a time */
+#ifdef _WIN32
+#define TIC(TAG_NAME) { \
+ static int init = 0; \
+ static int ID = -1; \
+ if( init == 0 ) \
+ { \
+ int k; \
+ init = 1; \
+ for( k = 0; k < SKP_Timer_nTimers; k++ ) { \
+ if( strcmp(SKP_Timer_tags[k], #TAG_NAME) == 0 ) { \
+ ID = k; \
+ break; \
+ } \
+ } \
+ if (ID == -1) { \
+ ID = SKP_Timer_nTimers; \
+ SKP_Timer_nTimers++; \
+ SKP_Timer_depth[ID] = SKP_Timer_depth_ctr; \
+ strcpy(SKP_Timer_tags[ID], #TAG_NAME); \
+ SKP_Timer_cnt[ID] = 0; \
+ SKP_Timer_sum[ID] = 0; \
+ SKP_Timer_min[ID] = 0xFFFFFFFF; \
+ SKP_Timer_max[ID] = 0; \
+ } \
+ } \
+ SKP_Timer_depth_ctr++; \
+ QueryPerformanceCounter(&SKP_Timer_start[ID]); \
+}
+#else
+#define TIC(TAG_NAME) { \
+ static int init = 0; \
+ static int ID = -1; \
+ if( init == 0 ) \
+ { \
+ int k; \
+ init = 1; \
+ for( k = 0; k < SKP_Timer_nTimers; k++ ) { \
+ if( strcmp(SKP_Timer_tags[k], #TAG_NAME) == 0 ) { \
+ ID = k; \
+ break; \
+ } \
+ } \
+ if (ID == -1) { \
+ ID = SKP_Timer_nTimers; \
+ SKP_Timer_nTimers++; \
+ SKP_Timer_depth[ID] = SKP_Timer_depth_ctr; \
+ strcpy(SKP_Timer_tags[ID], #TAG_NAME); \
+ SKP_Timer_cnt[ID] = 0; \
+ SKP_Timer_sum[ID] = 0; \
+ SKP_Timer_min[ID] = 0xFFFFFFFF; \
+ SKP_Timer_max[ID] = 0; \
+ } \
+ } \
+ SKP_Timer_depth_ctr++; \
+ SKP_Timer_start[ID] = GetHighResolutionTime(); \
+}
+#endif
+
+#ifdef _WIN32
+#define TOC(TAG_NAME) { \
+ LARGE_INTEGER lpPerformanceCount; \
+ static int init = 0; \
+ static int ID = 0; \
+ if( init == 0 ) \
+ { \
+ int k; \
+ init = 1; \
+ for( k = 0; k < SKP_Timer_nTimers; k++ ) { \
+ if( strcmp(SKP_Timer_tags[k], #TAG_NAME) == 0 ) { \
+ ID = k; \
+ break; \
+ } \
+ } \
+ } \
+ QueryPerformanceCounter(&lpPerformanceCount); \
+ lpPerformanceCount.QuadPart -= SKP_Timer_start[ID].QuadPart; \
+ if((lpPerformanceCount.QuadPart < 100000000) && \
+ (lpPerformanceCount.QuadPart >= 0)) { \
+ SKP_Timer_cnt[ID]++; \
+ SKP_Timer_sum[ID] += lpPerformanceCount.QuadPart; \
+ if( lpPerformanceCount.QuadPart > SKP_Timer_max[ID] ) \
+ SKP_Timer_max[ID] = lpPerformanceCount.QuadPart; \
+ if( lpPerformanceCount.QuadPart < SKP_Timer_min[ID] ) \
+ SKP_Timer_min[ID] = lpPerformanceCount.QuadPart; \
+ } \
+ SKP_Timer_depth_ctr--; \
+}
+#else
+#define TOC(TAG_NAME) { \
+ unsigned long endTime; \
+ static int init = 0; \
+ static int ID = 0; \
+ if( init == 0 ) \
+ { \
+ int k; \
+ init = 1; \
+ for( k = 0; k < SKP_Timer_nTimers; k++ ) { \
+ if( strcmp(SKP_Timer_tags[k], #TAG_NAME) == 0 ) { \
+ ID = k; \
+ break; \
+ } \
+ } \
+ } \
+ endTime = GetHighResolutionTime(); \
+ endTime -= SKP_Timer_start[ID]; \
+ if((endTime < 100000000) && \
+ (endTime >= 0)) { \
+ SKP_Timer_cnt[ID]++; \
+ SKP_Timer_sum[ID] += endTime; \
+ if( endTime > SKP_Timer_max[ID] ) \
+ SKP_Timer_max[ID] = endTime; \
+ if( endTime < SKP_Timer_min[ID] ) \
+ SKP_Timer_min[ID] = endTime; \
+ } \
+ SKP_Timer_depth_ctr--; \
+}
+#endif
+
+#else /* SKP_TIC_TOC */
+
+/* define macros as empty strings */
+#define TIC(TAG_NAME)
+#define TOC(TAG_NAME)
+#define SKP_TimerSave(FILE_NAME)
+
+#endif /* SKP_TIC_TOC */
+
+
+
+#if SKP_DEBUG
+/************************************/
+/* write data to file for debugging */
+/************************************/
+/* opens an empty file if this file has not yet been open, then writes to the file and closes it */
+/* if file has been open previously it is opened again and the fwrite is appending, finally it is closed */
+#define SAVE_DATA(FILE_NAME, DATA_PTR, N_BYTES) { static SKP_int32 init = 0;FILE *fp;if (init == 0) {init = 1;fp = fopen(#FILE_NAME, "wb");}else {fp = fopen(#FILE_NAME, "ab+");} fwrite((DATA_PTR), (N_BYTES), 1, fp);fclose(fp);}
+
+/* Example: DEBUG_STORE_DATA(testfile.pcm, &RIN[0], 160*sizeof(SKP_int16)); */
+
+#if 0
+/* Ensure that everything is written to files when an assert breaks */
+#define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES) SAVE_DATA(FILE_NAME, DATA_PTR, N_BYTES)
+#else
+/* Faster way of storing the data */
+#define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES) { \
+ static SKP_int32 init = 0; \
+ static FILE *fp; \
+ if (init == 0) \
+ { \
+ init = 1; \
+ fp = fopen(#FILE_NAME, "wb"); \
+ } \
+ fwrite((DATA_PTR), (N_BYTES), 1, fp); \
+}
+#endif
+
+/* micro sec */
+#define SKP_GETTIME(void) time = (SKP_int64) GetHighResolutionTime();
+
+#else /* SKP_DEBUG */
+
+/* define macros as empty strings */
+#define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES)
+#define SAVE_DATA(FILE_NAME, DATA_PTR, N_BYTES)
+
+#endif /* SKP_DEBUG */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SKP_DEBUG_H_ */
--- a/readme.txt
+++ b/readme.txt
@@ -8,7 +8,7 @@
I. Description
-This package contains files for compiling and testing the fixed
+This package contains files for compilation and evaluation of the fixed
point SILK SDK library. The following is included in this package:
o Source code for the fixed point SILK SDK library
--- a/src/SKP_Silk_A2NLSF.c
+++ /dev/null
@@ -1,280 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* Conversion between prediction filter coefficients and NLSFs */
-/* Requires the order to be an even number */
-/* A piecewise linear approximation maps LSF <-> cos(LSF) */
-/* Therefore the result is not accurate NLSFs, but the two */
-/* function are accurate inverses of each other */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Number of binary divisions, when not in low complexity mode */
-#define BIN_DIV_STEPS_A2NLSF_FIX 2 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */
-#define QPoly 16
-#define MAX_ITERATIONS_A2NLSF_FIX 50
-
-/* Flag for using 2x as many cosine sampling points, reduces the risk of missing a root */
-#define OVERSAMPLE_COSINE_TABLE 0
-
-/* Helper function for A2NLSF(..) */
-/* Transforms polynomials from cos(n*f) to cos(f)^n */
-SKP_INLINE void SKP_Silk_A2NLSF_trans_poly(
- SKP_int32 *p, /* I/O Polynomial */
- const SKP_int dd /* I Polynomial order (= filter order / 2 ) */
-)
-{
- SKP_int k, n;
-
- for( k = 2; k <= dd; k++ ) {
- for( n = dd; n > k; n-- ) {
- p[ n - 2 ] -= p[ n ];
- }
- p[ k - 2 ] -= SKP_LSHIFT( p[ k ], 1 );
- }
-}
-
-/* Helper function for A2NLSF(..) */
-/* Polynomial evaluation */
-SKP_INLINE SKP_int32 SKP_Silk_A2NLSF_eval_poly( /* return the polynomial evaluation, in QPoly */
- SKP_int32 *p, /* I Polynomial, QPoly */
- const SKP_int32 x, /* I Evaluation point, Q12 */
- const SKP_int dd /* I Order */
-)
-{
- SKP_int n;
- SKP_int32 x_Q16, y32;
-
- y32 = p[ dd ]; /* QPoly */
- x_Q16 = SKP_LSHIFT( x, 4 );
- for( n = dd - 1; n >= 0; n-- ) {
- y32 = SKP_SMLAWW( p[ n ], y32, x_Q16 ); /* QPoly */
- }
- return y32;
-}
-
-SKP_INLINE void SKP_Silk_A2NLSF_init(
- const SKP_int32 *a_Q16,
- SKP_int32 *P,
- SKP_int32 *Q,
- const SKP_int dd
-)
-{
- SKP_int k;
-
- /* Convert filter coefs to even and odd polynomials */
- P[dd] = SKP_LSHIFT( 1, QPoly );
- Q[dd] = SKP_LSHIFT( 1, QPoly );
- for( k = 0; k < dd; k++ ) {
-#if( QPoly < 16 )
- P[ k ] = SKP_RSHIFT_ROUND( -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ], 16 - QPoly ); /* QPoly */
- Q[ k ] = SKP_RSHIFT_ROUND( -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ], 16 - QPoly ); /* QPoly */
-#elif( Qpoly == 16 )
- P[ k ] = -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ]; // QPoly
- Q[ k ] = -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ]; // QPoly
-#else
- P[ k ] = SKP_LSHIFT( -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ], QPoly - 16 ); /* QPoly */
- Q[ k ] = SKP_LSHIFT( -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ], QPoly - 16 ); /* QPoly */
-#endif
- }
-
- /* Divide out zeros as we have that for even filter orders, */
- /* z = 1 is always a root in Q, and */
- /* z = -1 is always a root in P */
- for( k = dd; k > 0; k-- ) {
- P[ k - 1 ] -= P[ k ];
- Q[ k - 1 ] += Q[ k ];
- }
-
- /* Transform polynomials from cos(n*f) to cos(f)^n */
- SKP_Silk_A2NLSF_trans_poly( P, dd );
- SKP_Silk_A2NLSF_trans_poly( Q, dd );
-}
-
-/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */
-/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */
-void SKP_Silk_A2NLSF(
- SKP_int *NLSF, /* O Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d] */
- SKP_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */
- const SKP_int d /* I Filter order (must be even) */
-)
-{
- SKP_int i, k, m, dd, root_ix, ffrac;
- SKP_int32 xlo, xhi, xmid;
- SKP_int32 ylo, yhi, ymid;
- SKP_int32 nom, den;
- SKP_int32 P[ SigProc_MAX_ORDER_LPC / 2 + 1 ];
- SKP_int32 Q[ SigProc_MAX_ORDER_LPC / 2 + 1 ];
- SKP_int32 *PQ[ 2 ];
- SKP_int32 *p;
-
- /* Store pointers to array */
- PQ[ 0 ] = P;
- PQ[ 1 ] = Q;
-
- dd = SKP_RSHIFT( d, 1 );
-
- SKP_Silk_A2NLSF_init( a_Q16, P, Q, dd );
-
- /* Find roots, alternating between P and Q */
- p = P; /* Pointer to polynomial */
-
- xlo = SKP_Silk_LSFCosTab_FIX_Q12[ 0 ]; // Q12
- ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
-
- if( ylo < 0 ) {
- /* Set the first NLSF to zero and move on to the next */
- NLSF[ 0 ] = 0;
- p = Q; /* Pointer to polynomial */
- ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
- root_ix = 1; /* Index of current root */
- } else {
- root_ix = 0; /* Index of current root */
- }
- k = 1; /* Loop counter */
- i = 0; /* Counter for bandwidth expansions applied */
- while( 1 ) {
- /* Evaluate polynomial */
-#if OVERSAMPLE_COSINE_TABLE
- xhi = SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] +
- ( ( SKP_Silk_LSFCosTab_FIX_Q12[ ( k + 1 ) >> 1 ] -
- SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] ) >> 1 ); /* Q12 */
-#else
- xhi = SKP_Silk_LSFCosTab_FIX_Q12[ k ]; /* Q12 */
-#endif
- yhi = SKP_Silk_A2NLSF_eval_poly( p, xhi, dd );
-
- /* Detect zero crossing */
- if( ( ylo <= 0 && yhi >= 0 ) || ( ylo >= 0 && yhi <= 0 ) ) {
- /* Binary division */
-#if OVERSAMPLE_COSINE_TABLE
- ffrac = -128;
-#else
- ffrac = -256;
-#endif
- for( m = 0; m < BIN_DIV_STEPS_A2NLSF_FIX; m++ ) {
- /* Evaluate polynomial */
- xmid = SKP_RSHIFT_ROUND( xlo + xhi, 1 );
- ymid = SKP_Silk_A2NLSF_eval_poly( p, xmid, dd );
-
- /* Detect zero crossing */
- if( ( ylo <= 0 && ymid >= 0 ) || ( ylo >= 0 && ymid <= 0 ) ) {
- /* Reduce frequency */
- xhi = xmid;
- yhi = ymid;
- } else {
- /* Increase frequency */
- xlo = xmid;
- ylo = ymid;
-#if OVERSAMPLE_COSINE_TABLE
- ffrac = SKP_ADD_RSHIFT( ffrac, 64, m );
-#else
- ffrac = SKP_ADD_RSHIFT( ffrac, 128, m );
-#endif
- }
- }
-
- /* Interpolate */
- if( SKP_abs( ylo ) < 65536 ) {
- /* Avoid dividing by zero */
- den = ylo - yhi;
- nom = SKP_LSHIFT( ylo, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) + SKP_RSHIFT( den, 1 );
- if( den != 0 ) {
- ffrac += SKP_DIV32( nom, den );
- }
- } else {
- /* No risk of dividing by zero because abs(ylo - yhi) >= abs(ylo) >= 65536 */
- ffrac += SKP_DIV32( ylo, SKP_RSHIFT( ylo - yhi, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) );
- }
-#if OVERSAMPLE_COSINE_TABLE
- NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 7 ) + ffrac, SKP_int16_MAX );
-#else
- NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 8 ) + ffrac, SKP_int16_MAX );
-#endif
-
- SKP_assert( NLSF[ root_ix ] >= 0 );
- SKP_assert( NLSF[ root_ix ] <= 32767 );
-
- root_ix++; /* Next root */
- if( root_ix >= d ) {
- /* Found all roots */
- break;
- }
- /* Alternate pointer to polynomial */
- p = PQ[ root_ix & 1 ];
-
- /* Evaluate polynomial */
-#if OVERSAMPLE_COSINE_TABLE
- xlo = SKP_Silk_LSFCosTab_FIX_Q12[ ( k - 1 ) >> 1 ] +
- ( ( SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] -
- SKP_Silk_LSFCosTab_FIX_Q12[ ( k - 1 ) >> 1 ] ) >> 1 ); // Q12
-#else
- xlo = SKP_Silk_LSFCosTab_FIX_Q12[ k - 1 ]; // Q12
-#endif
- ylo = SKP_LSHIFT( 1 - ( root_ix & 2 ), 12 );
- } else {
- /* Increment loop counter */
- k++;
- xlo = xhi;
- ylo = yhi;
-
-#if OVERSAMPLE_COSINE_TABLE
- if( k > 2 * LSF_COS_TAB_SZ_FIX ) {
-#else
- if( k > LSF_COS_TAB_SZ_FIX ) {
-#endif
- i++;
- if( i > MAX_ITERATIONS_A2NLSF_FIX ) {
- /* Set NLSFs to white spectrum and exit */
- NLSF[ 0 ] = SKP_DIV32_16( 1 << 15, d + 1 );
- for( k = 1; k < d; k++ ) {
- NLSF[ k ] = SKP_SMULBB( k + 1, NLSF[ 0 ] );
- }
- return;
- }
-
- /* Error: Apply progressively more bandwidth expansion and run again */
- SKP_Silk_bwexpander_32( a_Q16, d, 65536 - SKP_SMULBB( 66, i ) ); // 66_Q16 = 0.001
-
- SKP_Silk_A2NLSF_init( a_Q16, P, Q, dd );
- p = P; /* Pointer to polynomial */
- xlo = SKP_Silk_LSFCosTab_FIX_Q12[ 0 ]; // Q12
- ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
- if( ylo < 0 ) {
- /* Set the first NLSF to zero and move on to the next */
- NLSF[ 0 ] = 0;
- p = Q; /* Pointer to polynomial */
- ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
- root_ix = 1; /* Index of current root */
- } else {
- root_ix = 0; /* Index of current root */
- }
- k = 1; /* Reset loop counter */
- }
- }
- }
-}
--- a/src/SKP_Silk_CNG.c
+++ /dev/null
@@ -1,149 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Generates excitation for CNG LPC synthesis */
-SKP_INLINE void SKP_Silk_CNG_exc(
- SKP_int16 residual[], /* O CNG residual signal Q0 */
- SKP_int32 exc_buf_Q10[], /* I Random samples buffer Q10 */
- SKP_int32 Gain_Q16, /* I Gain to apply */
- SKP_int length, /* I Length */
- SKP_int32 *rand_seed /* I/O Seed to random index generator */
-)
-{
- SKP_int32 seed;
- SKP_int i, idx, exc_mask;
-
- exc_mask = CNG_BUF_MASK_MAX;
- while( exc_mask > length ) {
- exc_mask = SKP_RSHIFT( exc_mask, 1 );
- }
-
- seed = *rand_seed;
- for( i = 0; i < length; i++ ) {
- seed = SKP_RAND( seed );
- idx = ( SKP_int )( SKP_RSHIFT( seed, 24 ) & exc_mask );
- SKP_assert( idx >= 0 );
- SKP_assert( idx <= CNG_BUF_MASK_MAX );
- residual[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( exc_buf_Q10[ idx ], Gain_Q16 ), 10 ) );
- }
- *rand_seed = seed;
-}
-
-void SKP_Silk_CNG_Reset(
- SKP_Silk_decoder_state *psDec /* I/O Decoder state */
-)
-{
- SKP_int i, NLSF_step_Q15, NLSF_acc_Q15;
-
- NLSF_step_Q15 = SKP_DIV32_16( SKP_int16_MAX, psDec->LPC_order + 1 );
- NLSF_acc_Q15 = 0;
- for( i = 0; i < psDec->LPC_order; i++ ) {
- NLSF_acc_Q15 += NLSF_step_Q15;
- psDec->sCNG.CNG_smth_NLSF_Q15[ i ] = NLSF_acc_Q15;
- }
- psDec->sCNG.CNG_smth_Gain_Q16 = 0;
- psDec->sCNG.rand_seed = 3176576;
-}
-
-/* Updates CNG estimate, and applies the CNG when packet was lost */
-void SKP_Silk_CNG(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[], /* I/O Signal */
- SKP_int length /* I Length of residual */
-)
-{
- SKP_int i, subfr;
- SKP_int32 tmp_32, Gain_Q26, max_Gain_Q16;
- SKP_int16 LPC_buf[ MAX_LPC_ORDER ];
- SKP_int16 CNG_sig[ MAX_FRAME_LENGTH ];
- SKP_Silk_CNG_struct *psCNG;
- psCNG = &psDec->sCNG;
-
- if( psDec->fs_kHz != psCNG->fs_kHz ) {
- /* Reset state */
- SKP_Silk_CNG_Reset( psDec );
-
- psCNG->fs_kHz = psDec->fs_kHz;
- }
- if( psDec->lossCnt == 0 && psDec->vadFlag == NO_VOICE_ACTIVITY ) {
- /* Update CNG parameters */
-
- /* Smoothing of LSF's */
- for( i = 0; i < psDec->LPC_order; i++ ) {
- psCNG->CNG_smth_NLSF_Q15[ i ] += SKP_SMULWB( psDec->prevNLSF_Q15[ i ] - psCNG->CNG_smth_NLSF_Q15[ i ], CNG_NLSF_SMTH_Q16 );
- }
- /* Find the subframe with the highest gain */
- max_Gain_Q16 = 0;
- subfr = 0;
- for( i = 0; i < NB_SUBFR; i++ ) {
- if( psDecCtrl->Gains_Q16[ i ] > max_Gain_Q16 ) {
- max_Gain_Q16 = psDecCtrl->Gains_Q16[ i ];
- subfr = i;
- }
- }
- /* Update CNG excitation buffer with excitation from this subframe */
- SKP_memmove( &psCNG->CNG_exc_buf_Q10[ psDec->subfr_length ], psCNG->CNG_exc_buf_Q10, ( NB_SUBFR - 1 ) * psDec->subfr_length * sizeof( SKP_int32 ) );
- SKP_memcpy( psCNG->CNG_exc_buf_Q10, &psDec->exc_Q10[ subfr * psDec->subfr_length ], psDec->subfr_length * sizeof( SKP_int32 ) );
-
- /* Smooth gains */
- for( i = 0; i < NB_SUBFR; i++ ) {
- psCNG->CNG_smth_Gain_Q16 += SKP_SMULWB( psDecCtrl->Gains_Q16[ i ] - psCNG->CNG_smth_Gain_Q16, CNG_GAIN_SMTH_Q16 );
- }
- }
-
- /* Add CNG when packet is lost and / or when low speech activity */
- if( psDec->lossCnt ) {//|| psDec->vadFlag == NO_VOICE_ACTIVITY ) {
-
- /* Generate CNG excitation */
- SKP_Silk_CNG_exc( CNG_sig, psCNG->CNG_exc_buf_Q10,
- psCNG->CNG_smth_Gain_Q16, length, &psCNG->rand_seed );
-
- /* Convert CNG NLSF to filter representation */
- SKP_Silk_NLSF2A_stable( LPC_buf, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order );
-
- Gain_Q26 = ( SKP_int32 )1 << 26; /* 1.0 */
-
- /* Generate CNG signal, by synthesis filtering */
- if( psDec->LPC_order == 16 ) {
- SKP_Silk_LPC_synthesis_order16( CNG_sig, LPC_buf,
- Gain_Q26, psCNG->CNG_synth_state, CNG_sig, length );
- } else {
- SKP_Silk_LPC_synthesis_filter( CNG_sig, LPC_buf,
- Gain_Q26, psCNG->CNG_synth_state, CNG_sig, length, psDec->LPC_order );
- }
- /* Mix with signal */
- for( i = 0; i < length; i++ ) {
- tmp_32 = signal[ i ] + CNG_sig[ i ];
- signal[ i ] = SKP_SAT16( tmp_32 );
- }
- } else {
- SKP_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( SKP_int32 ) );
- }
-}
--- a/src/SKP_Silk_HP_variable_cutoff_FIX.c
+++ /dev/null
@@ -1,118 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-#if HIGH_PASS_INPUT
-
-#define SKP_RADIANS_CONSTANT_Q19 1482 // 0.45f * 2.0f * 3.14159265359 / 1000
-#define SKP_LOG2_VARIABLE_HP_MIN_FREQ_Q7 809 // log(80) in Q7
-
-/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */
-void SKP_Silk_HP_variable_cutoff_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */
- SKP_int16 *out, /* O high-pass filtered output signal */
- const SKP_int16 *in /* I input signal */
-)
-{
- SKP_int quality_Q15;
- SKP_int32 B_Q28[ 3 ], A_Q28[ 2 ];
- SKP_int32 Fc_Q19, r_Q28, r_Q22;
- SKP_int32 pitch_freq_Hz_Q16, pitch_freq_log_Q7, delta_freq_Q7;
-
- /*********************************************/
- /* Estimate Low End of Pitch Frequency Range */
- /*********************************************/
- if( psEnc->sCmn.prev_sigtype == SIG_TYPE_VOICED ) {
- /* difference, in log domain */
- pitch_freq_Hz_Q16 = SKP_DIV32_16( SKP_LSHIFT( SKP_MUL( psEnc->sCmn.fs_kHz, 1000 ), 16 ), psEnc->sCmn.prevLag );
- pitch_freq_log_Q7 = SKP_Silk_lin2log( pitch_freq_Hz_Q16 ) - ( 16 << 7 ); //0x70
-
- /* adjustment based on quality */
- quality_Q15 = psEncCtrl->input_quality_bands_Q15[ 0 ];
- pitch_freq_log_Q7 = SKP_SUB32( pitch_freq_log_Q7, SKP_SMULWB( SKP_SMULWB( SKP_LSHIFT( quality_Q15, 2 ), quality_Q15 ),
- pitch_freq_log_Q7 - SKP_LOG2_VARIABLE_HP_MIN_FREQ_Q7 ) );
- pitch_freq_log_Q7 = SKP_ADD32( pitch_freq_log_Q7, SKP_RSHIFT( 19661 - quality_Q15, 9 ) ); // 19661_Q15 = 0.6_Q0
-
- //delta_freq = pitch_freq_log - psEnc->variable_HP_smth1;
- delta_freq_Q7 = pitch_freq_log_Q7 - SKP_RSHIFT( psEnc->variable_HP_smth1_Q15, 8 );
- if( delta_freq_Q7 < 0 ) {
- /* less smoothing for decreasing pitch frequency, to track something close to the minimum */
- delta_freq_Q7 = SKP_MUL( delta_freq_Q7, 3 );
- }
-
- /* limit delta, to reduce impact of outliers */
- delta_freq_Q7 = SKP_LIMIT( delta_freq_Q7, -VARIABLE_HP_MAX_DELTA_FREQ_Q7, VARIABLE_HP_MAX_DELTA_FREQ_Q7 );
-
- /* update smoother */
- psEnc->variable_HP_smth1_Q15 = SKP_SMLAWB( psEnc->variable_HP_smth1_Q15,
- SKP_MUL( SKP_LSHIFT( psEnc->speech_activity_Q8, 1 ), delta_freq_Q7 ), VARIABLE_HP_SMTH_COEF1_Q16 );
- }
- /* second smoother */
- psEnc->variable_HP_smth2_Q15 = SKP_SMLAWB( psEnc->variable_HP_smth2_Q15,
- psEnc->variable_HP_smth1_Q15 - psEnc->variable_HP_smth2_Q15, VARIABLE_HP_SMTH_COEF2_Q16 );
-
- /* convert from log scale to Hertz */
- psEncCtrl->pitch_freq_low_Hz = SKP_Silk_log2lin( SKP_RSHIFT( psEnc->variable_HP_smth2_Q15, 8 ) ); //pow( 2.0, psEnc->variable_HP_smth2 );
-
- /* limit frequency range */
- psEncCtrl->pitch_freq_low_Hz = SKP_LIMIT( psEncCtrl->pitch_freq_low_Hz, VARIABLE_HP_MIN_FREQ_Q0, VARIABLE_HP_MAX_FREQ_Q0 );
-
- /********************************/
- /* Compute Filter Coefficients */
- /********************************/
- /* compute cut-off frequency, in radians */
- //Fc_num = (SKP_float)( 0.45f * 2.0f * 3.14159265359 * psEncCtrl->pitch_freq_low_Hz );
- //Fc_denom = (SKP_float)( 1e3f * psEnc->sCmn.fs_kHz );
- SKP_assert( psEncCtrl->pitch_freq_low_Hz <= SKP_int32_MAX / SKP_RADIANS_CONSTANT_Q19 );
- Fc_Q19 = SKP_DIV32_16( SKP_SMULBB( SKP_RADIANS_CONSTANT_Q19, psEncCtrl->pitch_freq_low_Hz ), psEnc->sCmn.fs_kHz ); // range: 3704 - 27787, 11-15 bits
- SKP_assert( Fc_Q19 >= 3704 );
- SKP_assert( Fc_Q19 <= 27787 );
-
- r_Q28 = ( 1 << 28 ) - SKP_MUL( 471, Fc_Q19 ); // 471_Q9 = 0.92_Q0, range: 255347779 to 266690872, 27-28 bits
- SKP_assert( r_Q28 >= 255347779 );
- SKP_assert( r_Q28 <= 266690872 );
-
- /* b = r * [ 1; -2; 1 ]; */
- /* a = [ 1; -2 * r * ( 1 - 0.5 * Fc^2 ); r^2 ]; */
- B_Q28[ 0 ] = r_Q28;
- B_Q28[ 1 ] = SKP_LSHIFT( -r_Q28, 1 );
- B_Q28[ 2 ] = r_Q28;
-
- // -r * ( 2 - Fc * Fc );
- r_Q22 = SKP_RSHIFT( r_Q28, 6 );
- A_Q28[ 0 ] = SKP_SMULWW( r_Q22, SKP_SMULWW( Fc_Q19, Fc_Q19 ) - ( 2 << 22 ) );
- A_Q28[ 1 ] = SKP_SMULWW( r_Q22, r_Q22 );
-
- /********************************/
- /* High-Pass Filter */
- /********************************/
- SKP_Silk_biquad_alt( in, B_Q28, A_Q28, psEnc->sCmn.In_HP_State, out, psEnc->sCmn.frame_length );
-}
-
-#endif // HIGH_PASS_INPUT
--- a/src/SKP_Silk_Inlines.h
+++ /dev/null
@@ -1,280 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/*! \file SKP_Silk_Inlines.h
- * \brief SigProcFix_Inlines.h defines inline signal processing functions.
- */
-
-#ifndef _SKP_SILK_FIX_INLINES_H_
-#define _SKP_SILK_FIX_INLINES_H_
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* count leading zeros of SKP_int64 */
-SKP_INLINE SKP_int32 SKP_Silk_CLZ64(SKP_int64 in)
-{
- SKP_int32 in_upper;
-
- in_upper = (SKP_int32)SKP_RSHIFT64(in, 32);
- if (in_upper == 0) {
- /* Search in the lower 32 bits */
- return 32 + SKP_Silk_CLZ32( (SKP_int32) in );
- } else {
- /* Search in the upper 32 bits */
- return SKP_Silk_CLZ32( in_upper );
- }
-}
-
-/* get number of leading zeros and fractional part (the bits right after the leading one */
-SKP_INLINE void SKP_Silk_CLZ_FRAC(SKP_int32 in, /* I: input */
- SKP_int32 *lz, /* O: number of leading zeros */
- SKP_int32 *frac_Q7) /* O: the 7 bits right after the leading one */
-{
- SKP_int32 leadingZeros;
-
- leadingZeros = SKP_Silk_CLZ32(in);
- *lz = leadingZeros;
- if( leadingZeros < 24 ) {
- *frac_Q7 = SKP_RSHIFT(in, 24 - leadingZeros) & 0x7F;
- } else {
- *frac_Q7 = SKP_LSHIFT(in, leadingZeros - 24) & 0x7F;
- }
-}
-
-/* Approximation of square root */
-/* Accuracy: < +/- 10% for output values > 15 */
-/* < +/- 2.5% for output values > 120 */
-SKP_INLINE SKP_int32 SKP_Silk_SQRT_APPROX(SKP_int32 x)
-{
- SKP_int32 y, lz, frac_Q7;
-
- if( x <= 0 ) {
- return 0;
- }
-
- SKP_Silk_CLZ_FRAC(x, &lz, &frac_Q7);
-
- if( lz & 1 ) {
- y = 32768;
- } else {
- y = 46214; /* 46214 = sqrt(2) * 32768 */
- }
-
- /* get scaling right */
- y >>= SKP_RSHIFT(lz, 1);
-
- /* increment using fractional part of input */
- y = SKP_SMLAWB(y, y, SKP_SMULBB(213, frac_Q7));
-
- return y;
-}
-
-/* returns the number of left shifts before overflow for a 16 bit number (ITU definition with norm(0)=0) */
-SKP_INLINE SKP_int32 SKP_Silk_norm16(SKP_int16 a) {
-
- SKP_int32 a32;
-
- /* if ((a == 0) || (a == SKP_int16_MIN)) return(0); */
- if ((a << 1) == 0) return(0);
-
- a32 = a;
- /* if (a32 < 0) a32 = -a32 - 1; */
- a32 ^= SKP_RSHIFT(a32, 31);
-
- return SKP_Silk_CLZ32(a32) - 17;
-}
-
-/* returns the number of left shifts before overflow for a 32 bit number (ITU definition with norm(0)=0) */
-SKP_INLINE SKP_int32 SKP_Silk_norm32(SKP_int32 a) {
-
- /* if ((a == 0) || (a == SKP_int32_MIN)) return(0); */
- if ((a << 1) == 0) return(0);
-
- /* if (a < 0) a = -a - 1; */
- a ^= SKP_RSHIFT(a, 31);
-
- return SKP_Silk_CLZ32(a) - 1;
-}
-
-/* Divide two int32 values and return result as int32 in a given Q-domain */
-SKP_INLINE SKP_int32 SKP_DIV32_varQ( /* O returns a good approximation of "(a32 << Qres) / b32" */
- const SKP_int32 a32, /* I numerator (Q0) */
- const SKP_int32 b32, /* I denominator (Q0) */
- const SKP_int Qres /* I Q-domain of result (>= 0) */
-)
-{
- SKP_int a_headrm, b_headrm, lshift;
- SKP_int32 b32_inv, a32_nrm, b32_nrm, result;
-
- SKP_assert( b32 != 0 );
- SKP_assert( Qres >= 0 );
-
- /* Compute number of bits head room and normalize inputs */
- a_headrm = SKP_Silk_CLZ32( SKP_abs(a32) ) - 1;
- a32_nrm = SKP_LSHIFT(a32, a_headrm); /* Q: a_headrm */
- b_headrm = SKP_Silk_CLZ32( SKP_abs(b32) ) - 1;
- b32_nrm = SKP_LSHIFT(b32, b_headrm); /* Q: b_headrm */
-
- /* Inverse of b32, with 14 bits of precision */
- b32_inv = SKP_DIV32_16( SKP_int32_MAX >> 2, SKP_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */
-
- /* First approximation */
- result = SKP_SMULWB(a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */
-
- /* Compute residual by subtracting product of denominator and first approximation */
- a32_nrm -= SKP_LSHIFT_ovflw( SKP_SMMUL(b32_nrm, result), 3 ); /* Q: a_headrm */
-
- /* Refinement */
- result = SKP_SMLAWB(result, a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */
-
- /* Convert to Qres domain */
- lshift = 29 + a_headrm - b_headrm - Qres;
- if( lshift <= 0 ) {
- return SKP_LSHIFT_SAT32(result, -lshift);
- } else {
- if( lshift < 32){
- return SKP_RSHIFT(result, lshift);
- } else {
- /* Avoid undefined result */
- return 0;
- }
- }
-}
-
-/* Invert int32 value and return result as int32 in a given Q-domain */
-SKP_INLINE SKP_int32 SKP_INVERSE32_varQ( /* O returns a good approximation of "(1 << Qres) / b32" */
- const SKP_int32 b32, /* I denominator (Q0) */
- const SKP_int Qres /* I Q-domain of result (> 0) */
-)
-{
- SKP_int b_headrm, lshift;
- SKP_int32 b32_inv, b32_nrm, err_Q32, result;
-
- SKP_assert( b32 != 0 );
- SKP_assert( Qres > 0 );
-
- /* Compute number of bits head room and normalize input */
- b_headrm = SKP_Silk_CLZ32( SKP_abs(b32) ) - 1;
- b32_nrm = SKP_LSHIFT(b32, b_headrm); /* Q: b_headrm */
-
- /* Inverse of b32, with 14 bits of precision */
- b32_inv = SKP_DIV32_16( SKP_int32_MAX >> 2, SKP_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */
-
- /* First approximation */
- result = SKP_LSHIFT(b32_inv, 16); /* Q: 61 - b_headrm */
-
- /* Compute residual by subtracting product of denominator and first approximation from one */
- err_Q32 = SKP_LSHIFT_ovflw( -SKP_SMULWB(b32_nrm, b32_inv), 3 ); /* Q32 */
-
- /* Refinement */
- result = SKP_SMLAWW(result, err_Q32, b32_inv); /* Q: 61 - b_headrm */
-
- /* Convert to Qres domain */
- lshift = 61 - b_headrm - Qres;
- if( lshift <= 0 ) {
- return SKP_LSHIFT_SAT32(result, -lshift);
- } else {
- if( lshift < 32){
- return SKP_RSHIFT(result, lshift);
- }else{
- /* Avoid undefined result */
- return 0;
- }
- }
-}
-
-#define SKP_SIN_APPROX_CONST0 (1073735400)
-#define SKP_SIN_APPROX_CONST1 (-82778932)
-#define SKP_SIN_APPROX_CONST2 (1059577)
-#define SKP_SIN_APPROX_CONST3 (-5013)
-
-/* Sine approximation; an input of 65536 corresponds to 2 * pi */
-/* Uses polynomial expansion of the input to the power 0, 2, 4 and 6 */
-/* The relative error is below 1e-5 */
-SKP_INLINE SKP_int32 SKP_Silk_SIN_APPROX_Q24( /* O returns approximately 2^24 * sin(x * 2 * pi / 65536) */
- SKP_int32 x
-)
-{
- SKP_int y_Q30;
-
- /* Keep only bottom 16 bits (the function repeats itself with period 65536) */
- x &= 65535;
-
- /* Split range in four quadrants */
- if( x <= 32768 ) {
- if( x < 16384 ) {
- /* Return cos(pi/2 - x) */
- x = 16384 - x;
- } else {
- /* Return cos(x - pi/2) */
- x -= 16384;
- }
- if( x < 1100 ) {
- /* Special case: high accuracy */
- return SKP_SMLAWB( 1 << 24, SKP_MUL( x, x ), -5053 );
- }
- x = SKP_SMULWB( SKP_LSHIFT( x, 8 ), x ); /* contains x^2 in Q20 */
- y_Q30 = SKP_SMLAWB( SKP_SIN_APPROX_CONST2, x, SKP_SIN_APPROX_CONST3 );
- y_Q30 = SKP_SMLAWW( SKP_SIN_APPROX_CONST1, x, y_Q30 );
- y_Q30 = SKP_SMLAWW( SKP_SIN_APPROX_CONST0 + 66, x, y_Q30 );
- } else {
- if( x < 49152 ) {
- /* Return -cos(3*pi/2 - x) */
- x = 49152 - x;
- } else {
- /* Return -cos(x - 3*pi/2) */
- x -= 49152;
- }
- if( x < 1100 ) {
- /* Special case: high accuracy */
- return SKP_SMLAWB( -1 << 24, SKP_MUL( x, x ), 5053 );
- }
- x = SKP_SMULWB( SKP_LSHIFT( x, 8 ), x ); /* contains x^2 in Q20 */
- y_Q30 = SKP_SMLAWB( -SKP_SIN_APPROX_CONST2, x, -SKP_SIN_APPROX_CONST3 );
- y_Q30 = SKP_SMLAWW( -SKP_SIN_APPROX_CONST1, x, y_Q30 );
- y_Q30 = SKP_SMLAWW( -SKP_SIN_APPROX_CONST0, x, y_Q30 );
- }
- return SKP_RSHIFT_ROUND( y_Q30, 6 );
-}
-
-/* Cosine approximation; an input of 65536 corresponds to 2 * pi */
-/* The relative error is below 1e-5 */
-SKP_INLINE SKP_int32 SKP_Silk_COS_APPROX_Q24( /* O returns approximately 2^24 * cos(x * 2 * pi / 65536) */
- SKP_int32 x
-)
-{
- return SKP_Silk_SIN_APPROX_Q24( x + 16384 );
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif //_SKP_SILK_FIX_INLINES_H_
--- a/src/SKP_Silk_LBRR_reset.c
+++ /dev/null
@@ -1,40 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Resets LBRR buffer, used if packet size changes */
-void SKP_Silk_LBRR_reset(
- SKP_Silk_encoder_state *psEncC /* I/O state */
-)
-{
- SKP_int i;
-
- for( i = 0; i < MAX_LBRR_DELAY; i++ ) {
- psEncC->LBRR_buffer[ i ].usage = SKP_SILK_NO_LBRR;
- }
-}
--- a/src/SKP_Silk_LPC_inv_pred_gain.c
+++ /dev/null
@@ -1,189 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_LPC_inverse_pred_gain.c *
- * *
- * Compute inverse of LPC prediction gain, and *
- * test if LPC coefficients are stable (all poles within unit circle) *
- * *
- * Copyright 2008 (c), Skype Limited *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-#define QA 16
-#define A_LIMIT 65520
-
-/* Compute inverse of LPC prediction gain, and */
-/* test if LPC coefficients are stable (all poles within unit circle) */
-SKP_int SKP_Silk_LPC_inverse_pred_gain( /* O: Returns 1 if unstable, otherwise 0 */
- SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
- const SKP_int16 *A_Q12, /* I: Prediction coefficients, Q12 [order] */
- const SKP_int order /* I: Prediction order */
-)
-{
- SKP_int k, n, headrm;
- SKP_int32 rc_Q31, rc_mult1_Q30, rc_mult2_Q16;
- SKP_int32 Atmp_QA[ 2 ][ SigProc_MAX_ORDER_LPC ], tmp_QA;
- SKP_int32 *Aold_QA, *Anew_QA;
-
- Anew_QA = Atmp_QA[ order & 1 ];
- /* Increase Q domain of the AR coefficients */
- for( k = 0; k < order; k++ ) {
- Anew_QA[ k ] = SKP_LSHIFT( (SKP_int32)A_Q12[ k ], QA - 12 );
- }
-
- *invGain_Q30 = ( 1 << 30 );
- for( k = order - 1; k > 0; k-- ) {
- /* Check for stability */
- if( ( Anew_QA[ k ] > A_LIMIT ) || ( Anew_QA[ k ] < -A_LIMIT ) ) {
- return 1;
- }
-
- /* Set RC equal to negated AR coef */
- rc_Q31 = -SKP_LSHIFT( Anew_QA[ k ], 31 - QA );
-
- /* rc_mult1_Q30 range: [ 1 : 2^30-1 ] */
- rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 );
- SKP_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */
- SKP_assert( rc_mult1_Q30 < ( 1 << 30 ) );
-
- /* rc_mult2_Q16 range: [ 2^16 : SKP_int32_MAX ] */
- rc_mult2_Q16 = SKP_INVERSE32_varQ( rc_mult1_Q30, 46 ); /* 16 = 46 - 30 */
-
- /* Update inverse gain */
- /* invGain_Q30 range: [ 0 : 2^30 ] */
- *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 );
- SKP_assert( *invGain_Q30 >= 0 );
- SKP_assert( *invGain_Q30 <= ( 1 << 30 ) );
-
- /* Swap pointers */
- Aold_QA = Anew_QA;
- Anew_QA = Atmp_QA[ k & 1 ];
-
- /* Update AR coefficient */
- headrm = SKP_Silk_CLZ32( rc_mult2_Q16 ) - 1;
- rc_mult2_Q16 = SKP_LSHIFT( rc_mult2_Q16, headrm ); /* Q: 16 + headrm */
- for( n = 0; n < k; n++ ) {
- tmp_QA = Aold_QA[ n ] - SKP_LSHIFT( SKP_SMMUL( Aold_QA[ k - n - 1 ], rc_Q31 ), 1 );
- Anew_QA[ n ] = SKP_LSHIFT( SKP_SMMUL( tmp_QA, rc_mult2_Q16 ), 16 - headrm );
- }
- }
-
- /* Check for stability */
- if( ( Anew_QA[ 0 ] > A_LIMIT ) || ( Anew_QA[ 0 ] < -A_LIMIT ) ) {
- return 1;
- }
-
- /* Set RC equal to negated AR coef */
- rc_Q31 = -SKP_LSHIFT( Anew_QA[ 0 ], 31 - QA );
-
- /* Range: [ 1 : 2^30 ] */
- rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 );
-
- /* Update inverse gain */
- /* Range: [ 0 : 2^30 ] */
- *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 );
- SKP_assert( *invGain_Q30 >= 0 );
- SKP_assert( *invGain_Q30 <= 1<<30 );
-
- return 0;
-}
-
-/* For input in Q13 domain */
-SKP_int SKP_Silk_LPC_inverse_pred_gain_Q13( /* O: Returns 1 if unstable, otherwise 0 */
- SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
- const SKP_int16 *A_Q13, /* I: Prediction coefficients, Q13 [order] */
- const SKP_int order /* I: Prediction order */
-)
-{
- SKP_int k, n, headrm;
- SKP_int32 rc_Q31, rc_mult1_Q30, rc_mult2_Q16;
- SKP_int32 Atmp_QA[ 2 ][ SigProc_MAX_ORDER_LPC ], tmp_QA;
- SKP_int32 *Aold_QA, *Anew_QA;
-
- Anew_QA = Atmp_QA[ order & 1 ];
- /* Increase Q domain of the AR coefficients */
- for( k = 0; k < order; k++ ) {
- Anew_QA[ k ] = SKP_LSHIFT( (SKP_int32)A_Q13[ k ], QA - 13 );
- }
-
- *invGain_Q30 = ( 1 << 30 );
- for( k = order - 1; k > 0; k-- ) {
- /* Check for stability */
- if( ( Anew_QA[ k ] > A_LIMIT ) || ( Anew_QA[ k ] < -A_LIMIT ) ) {
- return 1;
- }
-
- /* Set RC equal to negated AR coef */
- rc_Q31 = -SKP_LSHIFT( Anew_QA[ k ], 31 - QA );
-
- /* rc_mult1_Q30 range: [ 1 : 2^30-1 ] */
- rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 );
- SKP_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */
- SKP_assert( rc_mult1_Q30 < ( 1 << 30 ) );
-
- /* rc_mult2_Q16 range: [ 2^16 : SKP_int32_MAX ] */
- rc_mult2_Q16 = SKP_INVERSE32_varQ( rc_mult1_Q30, 46 ); /* 16 = 46 - 30 */
-
- /* Update inverse gain */
- /* invGain_Q30 range: [ 0 : 2^30 ] */
- *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 );
- SKP_assert( *invGain_Q30 >= 0 );
- SKP_assert( *invGain_Q30 <= 1<<30 );
-
- /* Swap pointers */
- Aold_QA = Anew_QA;
- Anew_QA = Atmp_QA[ k & 1 ];
-
- /* Update AR coefficient */
- headrm = SKP_Silk_CLZ32( rc_mult2_Q16 ) - 1;
- rc_mult2_Q16 = SKP_LSHIFT( rc_mult2_Q16, headrm ); /* Q: 16 + headrm */
- for( n = 0; n < k; n++ ) {
- tmp_QA = Aold_QA[ n ] - SKP_LSHIFT( SKP_SMMUL( Aold_QA[ k - n - 1 ], rc_Q31 ), 1 );
- Anew_QA[ n ] = SKP_LSHIFT( SKP_SMMUL( tmp_QA, rc_mult2_Q16 ), 16 - headrm );
- }
- }
-
- /* Check for stability */
- if( ( Anew_QA[ 0 ] > A_LIMIT ) || ( Anew_QA[ 0 ] < -A_LIMIT ) ) {
- return 1;
- }
-
- /* Set RC equal to negated AR coef */
- rc_Q31 = -SKP_LSHIFT( Anew_QA[ 0 ], 31 - QA );
-
- /* Range: [ 1 : 2^30 ] */
- rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 );
-
- /* Update inverse gain */
- /* Range: [ 0 : 2^30 ] */
- *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 );
- SKP_assert( *invGain_Q30 >= 0 );
- SKP_assert( *invGain_Q30 <= 1<<30 );
-
- return 0;
-}
--- a/src/SKP_Silk_LPC_stabilize.c
+++ /dev/null
@@ -1,132 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_typedef.h"
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define LPC_STABILIZE_LPC_MAX_ABS_VALUE_Q16 ( ( (SKP_int32)SKP_int16_MAX ) << 4 )
-
-/* LPC stabilizer, for a single input data vector */
-void SKP_Silk_LPC_stabilize(
- SKP_int16 *a_Q12, /* O stabilized LPC vector [L] */
- SKP_int32 *a_Q16, /* I LPC vector [L] */
- const SKP_int32 bwe_Q16, /* I Bandwidth expansion factor */
- const SKP_int L /* I Number of LPC parameters in the input vector */
-)
-{
- SKP_int32 maxabs, absval, sc_Q16;
- SKP_int i, idx = 0;
- SKP_int32 invGain_Q30;
-
- SKP_Silk_bwexpander_32( a_Q16, L, bwe_Q16 );
-
- /***************************/
- /* Limit range of the LPCs */
- /***************************/
- /* Limit the maximum absolute value of the prediction coefficients */
- while( SKP_TRUE ) {
- /* Find maximum absolute value and its index */
- maxabs = SKP_int32_MIN;
- for( i = 0; i < L; i++ ) {
- absval = SKP_abs( a_Q16[ i ] );
- if( absval > maxabs ) {
- maxabs = absval;
- idx = i;
- }
- }
-
- if( maxabs >= LPC_STABILIZE_LPC_MAX_ABS_VALUE_Q16 ) {
- /* Reduce magnitude of prediction coefficients */
- sc_Q16 = SKP_DIV32( SKP_int32_MAX, SKP_RSHIFT( maxabs, 4 ) );
- sc_Q16 = 65536 - sc_Q16;
- sc_Q16 = SKP_DIV32( sc_Q16, idx + 1 );
- sc_Q16 = 65536 - sc_Q16;
- sc_Q16 = SKP_LSHIFT( SKP_SMULWB( sc_Q16, 32604 ), 1 ); // 0.995 in Q16
- SKP_Silk_bwexpander_32( a_Q16, L, sc_Q16 );
- } else {
- break;
- }
- }
-
- /* Convert to 16 bit Q12 */
- for( i = 0; i < L; i++ ) {
- a_Q12[ i ] = (SKP_int16)SKP_RSHIFT_ROUND( a_Q16[ i ], 4 );
- }
-
- /**********************/
- /* Ensure stable LPCs */
- /**********************/
- while( SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, a_Q12, L ) == 1 ) {
- SKP_Silk_bwexpander( a_Q12, L, 65339 ); // 0.997 in Q16
- }
-}
-
-void SKP_Silk_LPC_fit(
- SKP_int16 *a_QQ, /* O Stabilized LPC vector, Q(24-rshift) [L] */
- SKP_int32 *a_Q24, /* I LPC vector [L] */
- const SKP_int QQ, /* I Q domain of output LPC vector */
- const SKP_int L /* I Number of LPC parameters in the input vector */
-)
-{
- SKP_int i, rshift, idx = 0;
- SKP_int32 maxabs, absval, sc_Q16;
-
- rshift = 24 - QQ;
-
- /***************************/
- /* Limit range of the LPCs */
- /***************************/
- /* Limit the maximum absolute value of the prediction coefficients */
- while( SKP_TRUE ) {
- /* Find maximum absolute value and its index */
- maxabs = SKP_int32_MIN;
- for( i = 0; i < L; i++ ) {
- absval = SKP_abs( a_Q24[ i ] );
- if( absval > maxabs ) {
- maxabs = absval;
- idx = i;
- }
- }
-
- maxabs = SKP_RSHIFT( maxabs, rshift );
- if( maxabs >= SKP_int16_MAX ) {
- /* Reduce magnitude of prediction coefficients */
- sc_Q16 = 65470 - SKP_DIV32( SKP_MUL( 65470 >> 2, maxabs - SKP_int16_MAX ),
- SKP_RSHIFT32( SKP_MUL( maxabs, idx + 1), 2 ) );
- SKP_Silk_bwexpander_32( a_Q24, L, sc_Q16 );
- } else {
- break;
- }
- }
-
- /* Convert to 16 bit Q(24-rshift) */
- SKP_assert( rshift > 0 );
- SKP_assert( rshift < 31 );
- for( i = 0; i < L; i++ ) {
- a_QQ[ i ] = (SKP_int16)SKP_RSHIFT_ROUND( a_Q24[ i ], rshift );
- }
-}
--- a/src/SKP_Silk_LPC_synthesis_filter.c
+++ /dev/null
@@ -1,98 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_LPC_synthesis_filter.c *
- * Coefficients are in Q12 *
- * *
- * even order AR filter *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* even order AR filter */
-void SKP_Silk_LPC_synthesis_filter(
- const SKP_int16 *in, /* I: excitation signal */
- const SKP_int16 *A_Q12, /* I: AR coefficients [Order], between -8_Q0 and 8_Q0 */
- const SKP_int32 Gain_Q26, /* I: gain */
- SKP_int32 *S, /* I/O: state vector [Order] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len, /* I: signal length */
- const SKP_int Order /* I: filter order, must be even */
-)
-{
- SKP_int k, j, idx, Order_half = SKP_RSHIFT( Order, 1 );
- SKP_int32 SA, SB, Atmp, A_align_Q12[SigProc_MAX_ORDER_LPC >> 1], out32_Q10, out32;
-
- /* Order must be even */
- SKP_assert( 2*Order_half == Order );
-
- /* combine two A_Q12 values and ensure 32-bit alignment */
- for( k = 0; k < Order_half; k++ ) {
- idx = SKP_SMULBB( 2, k );
- A_align_Q12[k] = (((SKP_int32)A_Q12[idx]) & 0x0000ffff) | SKP_LSHIFT( (SKP_int32)A_Q12[idx+1], 16 );
- }
-
- /* S[] values are in Q14 */
- for( k = 0; k < len; k++ ) {
- SA = S[Order-1];
- out32_Q10 = 0;
- for( j=0;j<(Order_half-1); j++ ) {
- idx = SKP_SMULBB( 2, j ) + 1;
- /* multiply-add two prediction coefficients for each loop */
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLAWB and SMLAWT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLAWB and SMLAWT instructions should solve the problem. */
- Atmp = A_align_Q12[j];
- SB = S[Order - 1 - idx];
- S[Order - 1 - idx] = SA;
- out32_Q10 = SKP_SMLAWB( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT( out32_Q10, SB, Atmp );
- SA = S[Order - 2 - idx];
- S[Order - 2 - idx] = SB;
- }
-
- /* unrolled loop: epilog */
- Atmp = A_align_Q12[Order_half-1];
- SB = S[0];
- S[0] = SA;
- out32_Q10 = SKP_SMLAWB( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT( out32_Q10, SB, Atmp );
-
- /* apply gain to excitation signal and add to prediction */
- out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[k] ) );
-
- /* scale to Q0 */
- out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 );
-
- /* saturate output */
- out[k] = (SKP_int16)SKP_SAT16( out32 );
-
- /* move result into delay line */
- S[Order - 1] = SKP_LSHIFT_SAT32( out32_Q10, 4 );
- }
-}
--- a/src/SKP_Silk_LPC_synthesis_order16.c
+++ /dev/null
@@ -1,141 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_LPC_synthesis_order16.c *
- * Coefficients are in Q12 *
- * *
- * 16th order AR filter *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* 16th order AR filter */
-void SKP_Silk_LPC_synthesis_order16(const SKP_int16 *in, /* I: excitation signal */
- const SKP_int16 *A_Q12, /* I: AR coefficients [16], between -8_Q0 and 8_Q0 */
- const SKP_int32 Gain_Q26, /* I: gain */
- SKP_int32 *S, /* I/O: state vector [16] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len /* I: signal length, must be multiple of 16 */
-)
-{
- SKP_int k;
- SKP_int32 SA, SB, Atmp, A_align_Q12[8], out32_Q10, out32;
-
- /* combine two A_Q12 values and ensure 32-bit alignment */
- for( k = 0; k < 8; k++ ) {
- A_align_Q12[k] = (((SKP_int32)A_Q12[ 2*k ]) & 0x0000ffff) | SKP_LSHIFT( (SKP_int32)A_Q12[ 2*k + 1 ], 16 );
- }
-
- /* S[] values are in Q14 */
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLAWB and SMLAWT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLAWB and SMLAWT instructions should solve the problem. */
- for( k = 0; k < len; k++ ) {
- /* unrolled loop: prolog */
- /* multiply-add two prediction coefficients per iteration */
- SA = S[15];
- Atmp = A_align_Q12[0];
- SB = S[14];
- S[14] = SA;
- out32_Q10 = SKP_SMULWB( SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
- SA = S[13];
- S[13] = SB;
-
- /* unrolled loop: main loop */
- Atmp = A_align_Q12[1];
- SB = S[12];
- S[12] = SA;
- out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
- SA = S[11];
- S[11] = SB;
-
- Atmp = A_align_Q12[2];
- SB = S[10];
- S[10] = SA;
- out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
- SA = S[9];
- S[9] = SB;
-
- Atmp = A_align_Q12[3];
- SB = S[8];
- S[8] = SA;
- out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
- SA = S[7];
- S[7] = SB;
-
- Atmp = A_align_Q12[4];
- SB = S[6];
- S[6] = SA;
- out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
- SA = S[5];
- S[5] = SB;
-
- Atmp = A_align_Q12[5];
- SB = S[4];
- S[4] = SA;
- out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
- SA = S[3];
- S[3] = SB;
-
- Atmp = A_align_Q12[6];
- SB = S[2];
- S[2] = SA;
- out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
- SA = S[1];
- S[1] = SB;
-
- /* unrolled loop: epilog */
- Atmp = A_align_Q12[7];
- SB = S[0];
- S[0] = SA;
- out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );
- out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );
-
- /* unrolled loop: end */
- /* apply gain to excitation signal and add to prediction */
- out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[k] ) );
-
- /* scale to Q0 */
- out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 );
-
- /* saturate output */
- out[k] = (SKP_int16)SKP_SAT16( out32 );
-
- /* move result into delay line */
- S[15] = SKP_LSHIFT_SAT32( out32_Q10, 4 );
- }
-}
-
-
--- a/src/SKP_Silk_LP_variable_cutoff.c
+++ /dev/null
@@ -1,191 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/*
-
- Elliptic/Cauer filters designed with 0.1 dB passband ripple,
- 80 dB minimum stopband attenuation, and
- [0.95 : 0.15 : 0.35] normalized cut off frequencies.
-
-*/
-#include "SKP_Silk_main.h"
-
-#if SWITCH_TRANSITION_FILTERING
-
-/* Helper function, that interpolates the filter taps */
-SKP_INLINE void SKP_Silk_LP_interpolate_filter_taps(
- SKP_int32 B_Q28[ TRANSITION_NB ],
- SKP_int32 A_Q28[ TRANSITION_NA ],
- const SKP_int ind,
- const SKP_int32 fac_Q16
-)
-{
- SKP_int nb, na;
-
- if( ind < TRANSITION_INT_NUM - 1 ) {
- if( fac_Q16 > 0 ) {
- if( fac_Q16 == SKP_SAT16( fac_Q16 ) ) { /* fac_Q16 is in range of a 16-bit int */
- /* Piece-wise linear interpolation of B and A */
- for( nb = 0; nb < TRANSITION_NB; nb++ ) {
- B_Q28[ nb ] = SKP_SMLAWB(
- SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ],
- SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] -
- SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ],
- fac_Q16 );
- }
- for( na = 0; na < TRANSITION_NA; na++ ) {
- A_Q28[ na ] = SKP_SMLAWB(
- SKP_Silk_Transition_LP_A_Q28[ ind ][ na ],
- SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ] -
- SKP_Silk_Transition_LP_A_Q28[ ind ][ na ],
- fac_Q16 );
- }
- } else if( fac_Q16 == ( 1 << 15 ) ) { /* Neither fac_Q16 nor ( ( 1 << 16 ) - fac_Q16 ) is in range of a 16-bit int */
-
- /* Piece-wise linear interpolation of B and A */
- for( nb = 0; nb < TRANSITION_NB; nb++ ) {
- B_Q28[ nb ] = SKP_RSHIFT(
- SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ] +
- SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ],
- 1 );
- }
- for( na = 0; na < TRANSITION_NA; na++ ) {
- A_Q28[ na ] = SKP_RSHIFT(
- SKP_Silk_Transition_LP_A_Q28[ ind ][ na ] +
- SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ],
- 1 );
- }
- } else { /* ( ( 1 << 16 ) - fac_Q16 ) is in range of a 16-bit int */
-
- SKP_assert( ( ( 1 << 16 ) - fac_Q16 ) == SKP_SAT16( ( ( 1 << 16 ) - fac_Q16) ) );
- /* Piece-wise linear interpolation of B and A */
- for( nb = 0; nb < TRANSITION_NB; nb++ ) {
- B_Q28[ nb ] = SKP_SMLAWB(
- SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ],
- SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ] -
- SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ],
- ( 1 << 16 ) - fac_Q16 );
- }
- for( na = 0; na < TRANSITION_NA; na++ ) {
- A_Q28[ na ] = SKP_SMLAWB(
- SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ],
- SKP_Silk_Transition_LP_A_Q28[ ind ][ na ] -
- SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ],
- ( 1 << 16 ) - fac_Q16 );
- }
- }
- } else {
- SKP_memcpy( B_Q28, SKP_Silk_Transition_LP_B_Q28[ ind ], TRANSITION_NB * sizeof( SKP_int32 ) );
- SKP_memcpy( A_Q28, SKP_Silk_Transition_LP_A_Q28[ ind ], TRANSITION_NA * sizeof( SKP_int32 ) );
- }
- } else {
- SKP_memcpy( B_Q28, SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NB * sizeof( SKP_int32 ) );
- SKP_memcpy( A_Q28, SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NA * sizeof( SKP_int32 ) );
- }
-}
-
-/* Low-pass filter with variable cutoff frequency based on */
-/* piece-wise linear interpolation between elliptic filters */
-/* Start by setting psEncC->transition_frame_no = 1; */
-/* Deactivate by setting psEncC->transition_frame_no = 0; */
-void SKP_Silk_LP_variable_cutoff(
- SKP_Silk_LP_state *psLP, /* I/O LP filter state */
- SKP_int16 *out, /* O Low-pass filtered output signal */
- const SKP_int16 *in, /* I Input signal */
- const SKP_int frame_length /* I Frame length */
-)
-{
- SKP_int32 B_Q28[ TRANSITION_NB ], A_Q28[ TRANSITION_NA ];
- SKP_int fac_Q16 = 0, ind = 0;
-
- SKP_assert( psLP->transition_frame_no >= 0 );
- SKP_assert( ( ( ( psLP->transition_frame_no <= TRANSITION_FRAMES_DOWN ) && ( psLP->mode == 0 ) ) ||
- ( ( psLP->transition_frame_no <= TRANSITION_FRAMES_UP ) && ( psLP->mode == 1 ) ) ) );
-
- /* Interpolate filter coefficients if needed */
- if( psLP->transition_frame_no > 0 ) {
- if( psLP->mode == 0 ) {
- if( psLP->transition_frame_no < TRANSITION_FRAMES_DOWN ) {
- /* Calculate index and interpolation factor for interpolation */
-#if( TRANSITION_INT_STEPS_DOWN == 32 )
- fac_Q16 = SKP_LSHIFT( psLP->transition_frame_no, 16 - 5 );
-#else
- fac_Q16 = SKP_DIV32_16( SKP_LSHIFT( psLP->transition_frame_no, 16 ), TRANSITION_INT_STEPS_DOWN );
-#endif
- ind = SKP_RSHIFT( fac_Q16, 16 );
- fac_Q16 -= SKP_LSHIFT( ind, 16 );
-
- SKP_assert( ind >= 0 );
- SKP_assert( ind < TRANSITION_INT_NUM );
-
- /* Interpolate filter coefficients */
- SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 );
-
- /* Increment transition frame number for next frame */
- psLP->transition_frame_no++;
-
- } else if( psLP->transition_frame_no == TRANSITION_FRAMES_DOWN ) {
- /* End of transition phase */
- SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, TRANSITION_INT_NUM - 1, 0 );
- }
- } else if( psLP->mode == 1 ) {
- if( psLP->transition_frame_no < TRANSITION_FRAMES_UP ) {
- /* Calculate index and interpolation factor for interpolation */
-#if( TRANSITION_INT_STEPS_UP == 64 )
- fac_Q16 = SKP_LSHIFT( TRANSITION_FRAMES_UP - psLP->transition_frame_no, 16 - 6 );
-#else
- fac_Q16 = SKP_DIV32_16( SKP_LSHIFT( TRANSITION_FRAMES_UP - psLP->transition_frame_no, 16 ), TRANSITION_INT_STEPS_UP );
-#endif
- ind = SKP_RSHIFT( fac_Q16, 16 );
- fac_Q16 -= SKP_LSHIFT( ind, 16 );
-
- SKP_assert( ind >= 0 );
- SKP_assert( ind < TRANSITION_INT_NUM );
-
- /* Interpolate filter coefficients */
- SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 );
-
- /* Increment transition frame number for next frame */
- psLP->transition_frame_no++;
-
- } else if( psLP->transition_frame_no == TRANSITION_FRAMES_UP ) {
- /* End of transition phase */
- SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, 0, 0 );
- }
- }
- }
-
- if( psLP->transition_frame_no > 0 ) {
- /* ARMA low-pass filtering */
- SKP_assert( TRANSITION_NB == 3 && TRANSITION_NA == 2 );
- SKP_Silk_biquad_alt( in, B_Q28, A_Q28, psLP->In_LP_State, out, frame_length );
- } else {
- /* Instead of using the filter, copy input directly to output */
- SKP_memcpy( out, in, frame_length * sizeof( SKP_int16 ) );
- }
-}
-#endif
--- a/src/SKP_Silk_LSF_cos_table.c
+++ /dev/null
@@ -1,65 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-// Q12 values (even)
-const SKP_int SKP_Silk_LSFCosTab_FIX_Q12[LSF_COS_TAB_SZ_FIX + 1] = {
- 8192, 8190, 8182, 8170,
- 8152, 8130, 8104, 8072,
- 8034, 7994, 7946, 7896,
- 7840, 7778, 7714, 7644,
- 7568, 7490, 7406, 7318,
- 7226, 7128, 7026, 6922,
- 6812, 6698, 6580, 6458,
- 6332, 6204, 6070, 5934,
- 5792, 5648, 5502, 5352,
- 5198, 5040, 4880, 4718,
- 4552, 4382, 4212, 4038,
- 3862, 3684, 3502, 3320,
- 3136, 2948, 2760, 2570,
- 2378, 2186, 1990, 1794,
- 1598, 1400, 1202, 1002,
- 802, 602, 402, 202,
- 0, -202, -402, -602,
- -802, -1002, -1202, -1400,
- -1598, -1794, -1990, -2186,
- -2378, -2570, -2760, -2948,
- -3136, -3320, -3502, -3684,
- -3862, -4038, -4212, -4382,
- -4552, -4718, -4880, -5040,
- -5198, -5352, -5502, -5648,
- -5792, -5934, -6070, -6204,
- -6332, -6458, -6580, -6698,
- -6812, -6922, -7026, -7128,
- -7226, -7318, -7406, -7490,
- -7568, -7644, -7714, -7778,
- -7840, -7896, -7946, -7994,
- -8034, -8072, -8104, -8130,
- -8152, -8170, -8182, -8190,
- -8192
-};
--- a/src/SKP_Silk_LTP_analysis_filter_FIX.c
+++ /dev/null
@@ -1,85 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-void SKP_Silk_LTP_analysis_filter_FIX(
- SKP_int16 *LTP_res, /* O: LTP residual signal of length NB_SUBFR * ( pre_length + subfr_length ) */
- const SKP_int16 *x, /* I: Pointer to input signal with at least max( pitchL ) preceeding samples */
- const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ],/* I: LTP_ORDER LTP coefficients for each NB_SUBFR subframe */
- const SKP_int pitchL[ NB_SUBFR ], /* I: Pitch lag, one for each subframe */
- const SKP_int32 invGains_Qxx[ NB_SUBFR ], /* I: Inverse quantization gains, one for each subframe */
- const SKP_int Qxx, /* I: Inverse quantization gains Q domain */
- const SKP_int subfr_length, /* I: Length of each subframe */
- const SKP_int pre_length /* I: Length of the preceeding samples starting at &x[0] for each subframe */
-)
-{
- const SKP_int16 *x_ptr, *x_lag_ptr;
- SKP_int16 Btmp_Q14[ LTP_ORDER ];
- SKP_int16 *LTP_res_ptr;
- SKP_int k, i, j;
- SKP_int32 LTP_est;
-
- x_ptr = x;
- LTP_res_ptr = LTP_res;
- for( k = 0; k < NB_SUBFR; k++ ) {
-
- x_lag_ptr = x_ptr - pitchL[ k ];
- for( i = 0; i < LTP_ORDER; i++ ) {
- Btmp_Q14[ i ] = LTPCoef_Q14[ k * LTP_ORDER + i ];
- }
-
- /* LTP analysis FIR filter */
- for( i = 0; i < subfr_length + pre_length; i++ ) {
- LTP_res_ptr[ i ] = x_ptr[ i ];
-
- /* Long-term prediction */
- LTP_est = SKP_SMULBB( x_lag_ptr[ LTP_ORDER / 2 ], Btmp_Q14[ 0 ] );
- for( j = 1; j < LTP_ORDER; j++ ) {
- LTP_est = SKP_SMLABB_ovflw( LTP_est, x_lag_ptr[ LTP_ORDER / 2 - j ], Btmp_Q14[ j ] );
- }
- LTP_est = SKP_RSHIFT_ROUND( LTP_est, 14 ); // round and -> Q0
-
- /* Subtract long-term prediction */
- LTP_res_ptr[ i ] = ( SKP_int16 )SKP_SAT16( ( SKP_int32 )x_ptr[ i ] - LTP_est );
-
- /* Scale residual */
- if( Qxx == 16 ) {
- LTP_res_ptr[ i ] = SKP_SMULWB( invGains_Qxx[ k ], LTP_res_ptr[ i ] );
- } else {
- LTP_res_ptr[ i ] = ( SKP_int16 )SKP_CHECK_FIT16( SKP_RSHIFT64( SKP_SMULL( invGains_Qxx[ k ], LTP_res_ptr[ i ] ), Qxx ) );
- }
-
- x_lag_ptr++;
- }
-
- /* Update pointers */
- LTP_res_ptr += subfr_length + pre_length;
- x_ptr += subfr_length;
- }
-}
-
--- a/src/SKP_Silk_LTP_scale_ctrl_FIX.c
+++ /dev/null
@@ -1,81 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-#define NB_THRESHOLDS 11
-
-/* Table containing trained thresholds for LTP scaling */
-static const SKP_int16 LTPScaleThresholds_Q15[ NB_THRESHOLDS ] =
-{
- 31129, 26214, 16384, 13107, 9830, 6554,
- 4915, 3276, 2621, 2458, 0
-};
-
-void SKP_Silk_LTP_scale_ctrl_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state FIX */
- SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control FIX */
-)
-{
- SKP_int round_loss, frames_per_packet;
- SKP_int g_out_Q5, g_limit_Q15, thrld1_Q15, thrld2_Q15;
-
- /* 1st order high-pass filter */
- psEnc->HPLTPredCodGain_Q7 = SKP_max_int( psEncCtrl->LTPredCodGain_Q7 - psEnc->prevLTPredCodGain_Q7, 0 )
- + SKP_RSHIFT_ROUND( psEnc->HPLTPredCodGain_Q7, 1 );
-
- psEnc->prevLTPredCodGain_Q7 = psEncCtrl->LTPredCodGain_Q7;
-
- /* combine input and filtered input */
- g_out_Q5 = SKP_RSHIFT_ROUND( SKP_RSHIFT( psEncCtrl->LTPredCodGain_Q7, 1 ) + SKP_RSHIFT( psEnc->HPLTPredCodGain_Q7, 1 ), 3 );
- g_limit_Q15 = SKP_Silk_sigm_Q15( g_out_Q5 - ( 3 << 5 ) ); /* mulitplid with 0.5 */
-
- /* Default is minimum scaling */
- psEncCtrl->sCmn.LTP_scaleIndex = 0;
-
- /* Round the loss measure to whole pct */
- round_loss = ( SKP_int )psEnc->sCmn.PacketLoss_perc;
-
- /* Only scale if first frame in packet 0% */
- if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
-
- frames_per_packet = SKP_DIV32_16( psEnc->sCmn.PacketSize_ms, FRAME_LENGTH_MS );
-
- round_loss += frames_per_packet - 1;
- thrld1_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss, NB_THRESHOLDS - 1 ) ];
- thrld2_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss + 1, NB_THRESHOLDS - 1 ) ];
-
- if( g_limit_Q15 > thrld1_Q15 ) {
- /* Maximum scaling */
- psEncCtrl->sCmn.LTP_scaleIndex = 2;
- } else if( g_limit_Q15 > thrld2_Q15 ) {
- /* Medium scaling */
- psEncCtrl->sCmn.LTP_scaleIndex = 1;
- }
- }
- psEncCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ];
-}
--- a/src/SKP_Silk_MA.c
+++ /dev/null
@@ -1,232 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_MA.c *
- * *
- * Variable order MA filter *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Variable order MA filter */
-void SKP_Silk_MA(
- const SKP_int16 *in, /* I: input signal */
- const SKP_int16 *B, /* I: MA coefficients, Q13 [order+1] */
- SKP_int32 *S, /* I/O: state vector [order] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len, /* I: signal length */
- const SKP_int32 order /* I: filter order */
-)
-{
- SKP_int k, d, in16;
- SKP_int32 out32;
-
- for( k = 0; k < len; k++ ) {
- in16 = in[ k ];
- out32 = SKP_SMLABB( S[ 0 ], in16, B[ 0 ] );
- out32 = SKP_RSHIFT_ROUND( out32, 13 );
-
- for( d = 1; d < order; d++ ) {
- S[ d - 1 ] = SKP_SMLABB( S[ d ], in16, B[ d ] );
- }
- S[ order - 1 ] = SKP_SMULBB( in16, B[ order ] );
-
- /* Limit */
- out[ k ] = (SKP_int16)SKP_SAT16( out32 );
- }
-}
-/* Variable order MA prediction error filter */
-void SKP_Silk_MA_Prediction(
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
- SKP_int32 *S, /* I/O: State vector [order] */
- SKP_int16 *out, /* O: Output signal */
- const SKP_int32 len, /* I: Signal length */
- const SKP_int32 order /* I: Filter order */
-)
-{
- SKP_int k, d, in16;
- SKP_int32 out32;
- SKP_int32 B32;
-
- if( ( order & 1 ) == 0 && (SKP_int32)( (SKP_int_ptr_size)B & 3 ) == 0 ) {
- /* Even order and 4-byte aligned coefficient array */
-
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLABB and SMLABT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLABB and SMLABT instructions should solve the problem. */
- for( k = 0; k < len; k++ ) {
- in16 = in[ k ];
- out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ];
- out32 = SKP_RSHIFT_ROUND( out32, 12 );
-
- for( d = 0; d < order - 2; d += 2 ) {
- B32 = *( (SKP_int32*)&B[ d ] ); /* read two coefficients at once */
- S[ d ] = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B32 );
- S[ d + 1 ] = SKP_SMLABT_ovflw( S[ d + 2 ], in16, B32 );
- }
- B32 = *( (SKP_int32*)&B[ d ] ); /* read two coefficients at once */
- S[ order - 2 ] = SKP_SMLABB_ovflw( S[ order - 1 ], in16, B32 );
- S[ order - 1 ] = SKP_SMULBT( in16, B32 );
-
- /* Limit */
- out[ k ] = (SKP_int16)SKP_SAT16( out32 );
- }
- } else {
- /* Odd order or not 4-byte aligned coefficient array */
- for( k = 0; k < len; k++ ) {
- in16 = in[ k ];
- out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ];
- out32 = SKP_RSHIFT_ROUND( out32, 12 );
-
- for( d = 0; d < order - 1; d++ ) {
- S[ d ] = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B[ d ] );
- }
- S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );
-
- /* Limit */
- out[ k ] = (SKP_int16)SKP_SAT16( out32 );
- }
- }
-}
-
-void SKP_Silk_MA_Prediction_Q13(
- const SKP_int16 *in, /* I: input signal */
- const SKP_int16 *B, /* I: MA prediction coefficients, Q13 [order] */
- SKP_int32 *S, /* I/O: state vector [order] */
- SKP_int16 *out, /* O: output signal */
- SKP_int32 len, /* I: signal length */
- SKP_int32 order /* I: filter order */
-)
-{
- SKP_int k, d, in16;
- SKP_int32 out32, B32;
-
- if( ( order & 1 ) == 0 && (SKP_int32)( (SKP_int_ptr_size)B & 3 ) == 0 ) {
- /* Even order and 4-byte aligned coefficient array */
-
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLABB and SMLABT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLABB and SMLABT instructions should solve the problem. */
- for( k = 0; k < len; k++ ) {
- in16 = in[ k ];
- out32 = SKP_LSHIFT( in16, 13 ) - S[ 0 ];
- out32 = SKP_RSHIFT_ROUND( out32, 13 );
-
- for( d = 0; d < order - 2; d += 2 ) {
- B32 = *( (SKP_int32*)&B[ d ] ); /* read two coefficients at once */
- S[ d ] = SKP_SMLABB( S[ d + 1 ], in16, B32 );
- S[ d + 1 ] = SKP_SMLABT( S[ d + 2 ], in16, B32 );
- }
- B32 = *( (SKP_int32*)&B[ d ] ); /* read two coefficients at once */
- S[ order - 2 ] = SKP_SMLABB( S[ order - 1 ], in16, B32 );
- S[ order - 1 ] = SKP_SMULBT( in16, B32 );
-
- /* Limit */
- out[ k ] = (SKP_int16)SKP_SAT16( out32 );
- }
- } else {
- /* Odd order or not 4-byte aligned coefficient array */
- for( k = 0; k < len; k++ ) {
- in16 = in[ k ];
- out32 = SKP_LSHIFT( in16, 13 ) - S[ 0 ];
- out32 = SKP_RSHIFT_ROUND( out32, 13 );
-
- for( d = 0; d < order - 1; d++ ) {
- S[ d ] = SKP_SMLABB( S[ d + 1 ], in16, B[ d ] );
- }
- S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );
-
- /* Limit */
- out[ k ] = (SKP_int16)SKP_SAT16( out32 );
- }
- }
-}
-/* Variable order MA prediction error filter. */
-/* Inverse filter of SKP_Silk_LPC_synthesis_filter */
-void SKP_Silk_LPC_analysis_filter(
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
- SKP_int16 *S, /* I/O: State vector [order] */
- SKP_int16 *out, /* O: Output signal */
- const SKP_int32 len, /* I: Signal length */
- const SKP_int32 Order /* I: Filter order */
-)
-{
- SKP_int k, j, idx, Order_half = SKP_RSHIFT( Order, 1 );
- SKP_int32 Btmp, B_align_Q12[ SigProc_MAX_ORDER_LPC >> 1 ], out32_Q12, out32;
- SKP_int16 SA, SB;
- /* Order must be even */
- SKP_assert( 2 * Order_half == Order );
-
- /* Combine two A_Q12 values and ensure 32-bit alignment */
- for( k = 0; k < Order_half; k++ ) {
- idx = SKP_SMULBB( 2, k );
- B_align_Q12[ k ] = ( ( (SKP_int32)B[ idx ] ) & 0x0000ffff ) | SKP_LSHIFT( (SKP_int32)B[ idx + 1 ], 16 );
- }
-
- /* S[] values are in Q0 */
- for( k = 0; k < len; k++ ) {
- SA = S[ 0 ];
- out32_Q12 = 0;
- for( j = 0; j < ( Order_half - 1 ); j++ ) {
- idx = SKP_SMULBB( 2, j ) + 1;
- /* Multiply-add two prediction coefficients for each loop */
- Btmp = B_align_Q12[ j ];
- SB = S[ idx ];
- S[ idx ] = SA;
- out32_Q12 = SKP_SMLABB( out32_Q12, SA, Btmp );
- out32_Q12 = SKP_SMLABT( out32_Q12, SB, Btmp );
- SA = S[ idx + 1 ];
- S[ idx + 1 ] = SB;
- }
-
- /* Unrolled loop: epilog */
- Btmp = B_align_Q12[ Order_half - 1 ];
- SB = S[ Order - 1 ];
- S[ Order - 1 ] = SA;
- out32_Q12 = SKP_SMLABB( out32_Q12, SA, Btmp );
- out32_Q12 = SKP_SMLABT( out32_Q12, SB, Btmp );
-
- /* Subtract prediction */
- out32_Q12 = SKP_SUB_SAT32( SKP_LSHIFT( (SKP_int32)in[ k ], 12 ), out32_Q12 );
-
- /* Scale to Q0 */
- out32 = SKP_RSHIFT_ROUND( out32_Q12, 12 );
-
- /* Saturate output */
- out[ k ] = (SKP_int16)SKP_SAT16( out32 );
-
- /* Move input line */
- S[ 0 ] = in[ k ];
- }
-}
--- a/src/SKP_Silk_NLSF2A.c
+++ /dev/null
@@ -1,150 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* conversion between prediction filter coefficients and LSFs */
-/* order should be even */
-/* a piecewise linear approximation maps LSF <-> cos(LSF) */
-/* therefore the result is not accurate LSFs, but the two */
-/* function are accurate inverses of each other */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* helper function for NLSF2A(..) */
-SKP_INLINE void SKP_Silk_NLSF2A_find_poly(
- SKP_int32 *out, /* o intermediate polynomial, Q20 */
- const SKP_int32 *cLSF, /* i vector of interleaved 2*cos(LSFs), Q20 */
- SKP_int dd /* i polynomial order (= 1/2 * filter order) */
-)
-{
- SKP_int k, n;
- SKP_int32 ftmp;
-
- out[0] = SKP_LSHIFT( 1, 20 );
- out[1] = -cLSF[0];
- for( k = 1; k < dd; k++ ) {
- ftmp = cLSF[2*k]; // Q20
- out[k+1] = SKP_LSHIFT( out[k-1], 1 ) - (SKP_int32)SKP_RSHIFT_ROUND64( SKP_SMULL( ftmp, out[k] ), 20 );
- for( n = k; n > 1; n-- ) {
- out[n] += out[n-2] - (SKP_int32)SKP_RSHIFT_ROUND64( SKP_SMULL( ftmp, out[n-1] ), 20 );
- }
- out[1] -= ftmp;
- }
-}
-
-/* compute whitening filter coefficients from normalized line spectral frequencies */
-void SKP_Silk_NLSF2A(
- SKP_int16 *a, /* o monic whitening filter coefficients in Q12, [d] */
- const SKP_int *NLSF, /* i normalized line spectral frequencies in Q15, [d] */
- const SKP_int d /* i filter order (should be even) */
-)
-{
- SKP_int k, i, dd;
- SKP_int32 cos_LSF_Q20[SigProc_MAX_ORDER_LPC];
- SKP_int32 P[SigProc_MAX_ORDER_LPC/2+1], Q[SigProc_MAX_ORDER_LPC/2+1];
- SKP_int32 Ptmp, Qtmp;
- SKP_int32 f_int;
- SKP_int32 f_frac;
- SKP_int32 cos_val, delta;
- SKP_int32 a_int32[SigProc_MAX_ORDER_LPC];
- SKP_int32 maxabs, absval, idx=0, sc_Q16;
-
- SKP_assert(LSF_COS_TAB_SZ_FIX == 128);
-
- /* convert LSFs to 2*cos(LSF(i)), using piecewise linear curve from table */
- for( k = 0; k < d; k++ ) {
- SKP_assert(NLSF[k] >= 0 );
- SKP_assert(NLSF[k] <= 32767 );
-
- /* f_int on a scale 0-127 (rounded down) */
- f_int = SKP_RSHIFT( NLSF[k], 15 - 7 );
-
- /* f_frac, range: 0..255 */
- f_frac = NLSF[k] - SKP_LSHIFT( f_int, 15 - 7 );
-
- SKP_assert(f_int >= 0);
- SKP_assert(f_int < LSF_COS_TAB_SZ_FIX );
-
- /* Read start and end value from table */
- cos_val = SKP_Silk_LSFCosTab_FIX_Q12[ f_int ]; /* Q12 */
- delta = SKP_Silk_LSFCosTab_FIX_Q12[ f_int + 1 ] - cos_val; /* Q12, with a range of 0..200 */
-
- /* Linear interpolation */
- cos_LSF_Q20[k] = SKP_LSHIFT( cos_val, 8 ) + SKP_MUL( delta, f_frac ); /* Q20 */
- }
-
- dd = SKP_RSHIFT( d, 1 );
-
- /* generate even and odd polynomials using convolution */
- SKP_Silk_NLSF2A_find_poly( P, &cos_LSF_Q20[0], dd );
- SKP_Silk_NLSF2A_find_poly( Q, &cos_LSF_Q20[1], dd );
-
- /* convert even and odd polynomials to SKP_int32 Q12 filter coefs */
- for( k = 0; k < dd; k++ ) {
- Ptmp = P[k+1] + P[k];
- Qtmp = Q[k+1] - Q[k];
-
- /* the Ptmp and Qtmp values at this stage need to fit in int32 */
-
- a_int32[k] = -SKP_RSHIFT_ROUND( Ptmp + Qtmp, 9 ); /* Q20 -> Q12 */
- a_int32[d-k-1] = SKP_RSHIFT_ROUND( Qtmp - Ptmp, 9 ); /* Q20 -> Q12 */
- }
-
- /* Limit the maximum absolute value of the prediction coefficients */
- for( i = 0; i < 10; i++ ) {
- /* Find maximum absolute value and its index */
- maxabs = 0;
- for( k = 0; k < d; k++ ) {
- absval = SKP_abs( a_int32[k] );
- if( absval > maxabs ) {
- maxabs = absval;
- idx = k;
- }
- }
-
- if( maxabs > SKP_int16_MAX ) {
- /* Reduce magnitude of prediction coefficients */
- sc_Q16 = 65470 - SKP_DIV32( SKP_MUL( 65470 >> 2, maxabs - SKP_int16_MAX ),
- SKP_RSHIFT32( SKP_MUL( maxabs, idx + 1), 2 ) );
- SKP_Silk_bwexpander_32( a_int32, d, sc_Q16 );
- } else {
- break;
- }
- }
-
- /* Reached the last iteration */
- if( i == 10 ) {
- SKP_assert(0);
- for( k = 0; k < d; k++ ) {
- a_int32[k] = SKP_SAT16( a_int32[k] );
- }
- }
-
- /* Return as SKP_int16 Q12 coefficients */
- for( k = 0; k < d; k++ ) {
- a[k] = (SKP_int16)a_int32[k];
- }
-}
--- a/src/SKP_Silk_NLSF2A_stable.c
+++ /dev/null
@@ -1,57 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Convert NLSF parameters to stable AR prediction filter coefficients */
-void SKP_Silk_NLSF2A_stable(
- SKP_int16 pAR_Q12[ MAX_LPC_ORDER ], /* O Stabilized AR coefs [LPC_order] */
- const SKP_int pNLSF[ MAX_LPC_ORDER ], /* I NLSF vector [LPC_order] */
- const SKP_int LPC_order /* I LPC/LSF order */
-)
-{
- SKP_int i;
- SKP_int32 invGain_Q30;
-
- SKP_Silk_NLSF2A( pAR_Q12, pNLSF, LPC_order );
-
- /* Ensure stable LPCs */
- for( i = 0; i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) {
- if( SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, pAR_Q12, LPC_order ) == 1 ) {
- SKP_Silk_bwexpander( pAR_Q12, LPC_order, 65536 - SKP_SMULBB( 66, i ) ); /* 66_Q16 = 0.001 */
- } else {
- break;
- }
- }
-
- /* Reached the last iteration */
- if( i == MAX_LPC_STABILIZE_ITERATIONS ) {
- for( i = 0; i < LPC_order; i++ ) {
- pAR_Q12[ i ] = 0;
- }
- }
-}
--- a/src/SKP_Silk_NLSF_MSVQ_decode.c
+++ /dev/null
@@ -1,91 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* NLSF vector decoder */
-void SKP_Silk_NLSF_MSVQ_decode(
- SKP_int *pNLSF_Q15, /* O Pointer to decoded output vector [LPC_ORDER x 1] */
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Pointer to NLSF codebook struct */
- const SKP_int *NLSFIndices, /* I Pointer to NLSF indices [nStages x 1] */
- const SKP_int LPC_order /* I LPC order used */
-)
-{
- const SKP_int16 *pCB_element;
- SKP_int s;
- SKP_int i;
-
- /* Check that each index is within valid range */
- SKP_assert( 0 <= NLSFIndices[ 0 ] && NLSFIndices[ 0 ] < psNLSF_CB->CBStages[ 0 ].nVectors );
-
- /* Point to the first vector element */
- pCB_element = &psNLSF_CB->CBStages[ 0 ].CB_NLSF_Q15[ SKP_MUL( NLSFIndices[ 0 ], LPC_order ) ];
-
- /* Initialize with the codebook vector from stage 0 */
- for( i = 0; i < LPC_order; i++ ) {
- pNLSF_Q15[ i ] = ( SKP_int )pCB_element[ i ];
- }
-
- for( s = 1; s < psNLSF_CB->nStages; s++ ) {
- /* Check that each index is within valid range */
- SKP_assert( 0 <= NLSFIndices[ s ] && NLSFIndices[ s ] < psNLSF_CB->CBStages[ s ].nVectors );
-
- if( LPC_order == 16 ) {
- /* Point to the first vector element */
- pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q15[ SKP_LSHIFT( NLSFIndices[ s ], 4 ) ];
-
- /* Add the codebook vector from the current stage */
- pNLSF_Q15[ 0 ] += pCB_element[ 0 ];
- pNLSF_Q15[ 1 ] += pCB_element[ 1 ];
- pNLSF_Q15[ 2 ] += pCB_element[ 2 ];
- pNLSF_Q15[ 3 ] += pCB_element[ 3 ];
- pNLSF_Q15[ 4 ] += pCB_element[ 4 ];
- pNLSF_Q15[ 5 ] += pCB_element[ 5 ];
- pNLSF_Q15[ 6 ] += pCB_element[ 6 ];
- pNLSF_Q15[ 7 ] += pCB_element[ 7 ];
- pNLSF_Q15[ 8 ] += pCB_element[ 8 ];
- pNLSF_Q15[ 9 ] += pCB_element[ 9 ];
- pNLSF_Q15[ 10 ] += pCB_element[ 10 ];
- pNLSF_Q15[ 11 ] += pCB_element[ 11 ];
- pNLSF_Q15[ 12 ] += pCB_element[ 12 ];
- pNLSF_Q15[ 13 ] += pCB_element[ 13 ];
- pNLSF_Q15[ 14 ] += pCB_element[ 14 ];
- pNLSF_Q15[ 15 ] += pCB_element[ 15 ];
- } else {
- /* Point to the first vector element */
- pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q15[ SKP_SMULBB( NLSFIndices[ s ], LPC_order ) ];
-
- /* Add the codebook vector from the current stage */
- for( i = 0; i < LPC_order; i++ ) {
- pNLSF_Q15[ i ] += pCB_element[ i ];
- }
- }
- }
-
- /* NLSF stabilization */
- SKP_Silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->NDeltaMin_Q15, LPC_order );
-}
--- a/src/SKP_Silk_NLSF_MSVQ_encode_FIX.c
+++ /dev/null
@@ -1,231 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/***********************/
-/* NLSF vector encoder */
-/***********************/
-void SKP_Silk_NLSF_MSVQ_encode_FIX(
- SKP_int *NLSFIndices, /* O Codebook path vector [ CB_STAGES ] */
- SKP_int *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */
- const SKP_int *pNLSF_q_Q15_prev, /* I Prev. quantized NLSF vector [LPC_ORDER] */
- const SKP_int *pW_Q6, /* I NLSF weight vector [ LPC_ORDER ] */
- const SKP_int NLSF_mu_Q15, /* I Rate weight for the RD optimization */
- const SKP_int NLSF_mu_fluc_red_Q16, /* I Fluctuation reduction error weight */
- const SKP_int NLSF_MSVQ_Survivors, /* I Max survivors from each stage */
- const SKP_int LPC_order, /* I LPC order */
- const SKP_int deactivate_fluc_red /* I Deactivate fluctuation reduction */
-)
-{
- SKP_int i, s, k, cur_survivors = 0, prev_survivors, input_index, cb_index, bestIndex;
- SKP_int32 rateDistThreshold_Q18;
- SKP_int pNLSF_in_Q15[ MAX_LPC_ORDER ];
-#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 1 )
- SKP_int32 se_Q15, wsse_Q20, bestRateDist_Q20;
-#endif
-
-#if( LOW_COMPLEXITY_ONLY == 1 )
- SKP_int32 pRateDist_Q18[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE ];
- SKP_int32 pRate_Q5[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
- SKP_int32 pRate_new_Q5[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
- SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
- SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ];
- SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ];
- SKP_int pRes_Q15[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ];
- SKP_int pRes_new_Q15[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ];
-#else
- SKP_int32 pRateDist_Q18[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED ];
- SKP_int32 pRate_Q5[ MAX_NLSF_MSVQ_SURVIVORS ];
- SKP_int32 pRate_new_Q5[ MAX_NLSF_MSVQ_SURVIVORS ];
- SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS ];
- SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];
- SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];
- SKP_int pRes_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];
- SKP_int pRes_new_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];
-#endif
-
- const SKP_int *pConstInt;
- SKP_int *pInt;
- const SKP_int16 *pCB_element;
- const SKP_Silk_NLSF_CBS *pCurrentCBStage;
-
- SKP_assert( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS );
- SKP_assert( ( LOW_COMPLEXITY_ONLY == 0 ) || ( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ) );
-
-
-
- /* Copy the input vector */
- SKP_memcpy( pNLSF_in_Q15, pNLSF_Q15, LPC_order * sizeof( SKP_int ) );
-
- /****************************************************/
- /* Tree search for the multi-stage vector quantizer */
- /****************************************************/
-
- /* Clear accumulated rates */
- SKP_memset( pRate_Q5, 0, NLSF_MSVQ_Survivors * sizeof( SKP_int32 ) );
-
- /* Copy NLSFs into residual signal vector */
- for( i = 0; i < LPC_order; i++ ) {
- pRes_Q15[ i ] = pNLSF_Q15[ i ];
- }
-
- /* Set first stage values */
- prev_survivors = 1;
-
- /* Loop over all stages */
- for( s = 0; s < psNLSF_CB->nStages; s++ ) {
-
- /* Set a pointer to the current stage codebook */
- pCurrentCBStage = &psNLSF_CB->CBStages[ s ];
-
- /* Calculate the number of survivors in the current stage */
- cur_survivors = SKP_min_32( NLSF_MSVQ_Survivors, SKP_SMULBB( prev_survivors, pCurrentCBStage->nVectors ) );
-
-#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 0 )
- /* Find a single best survivor in the last stage, if we */
- /* do not need candidates for fluctuation reduction */
- if( s == psNLSF_CB->nStages - 1 ) {
- cur_survivors = 1;
- }
-#endif
-
- /* Nearest neighbor clustering for multiple input data vectors */
- SKP_Silk_NLSF_VQ_rate_distortion_FIX( pRateDist_Q18, pCurrentCBStage, pRes_Q15, pW_Q6,
- pRate_Q5, NLSF_mu_Q15, prev_survivors, LPC_order );
-
- /* Sort the rate-distortion errors */
- SKP_Silk_insertion_sort_increasing( pRateDist_Q18, pTempIndices,
- prev_survivors * pCurrentCBStage->nVectors, cur_survivors );
-
- /* Discard survivors with rate-distortion values too far above the best one */
- if( pRateDist_Q18[ 0 ] < SKP_int32_MAX / NLSF_MSVQ_SURV_MAX_REL_RD ) {
- rateDistThreshold_Q18 = SKP_MUL( NLSF_MSVQ_SURV_MAX_REL_RD, pRateDist_Q18[ 0 ] );
- while( pRateDist_Q18[ cur_survivors - 1 ] > rateDistThreshold_Q18 && cur_survivors > 1 ) {
- cur_survivors--;
- }
- }
- /* Update accumulated codebook contributions for the 'cur_survivors' best codebook indices */
- for( k = 0; k < cur_survivors; k++ ) {
- if( s > 0 ) {
- /* Find the indices of the input and the codebook vector */
- if( pCurrentCBStage->nVectors == 8 ) {
- input_index = SKP_RSHIFT( pTempIndices[ k ], 3 );
- cb_index = pTempIndices[ k ] & 7;
- } else {
- input_index = SKP_DIV32_16( pTempIndices[ k ], pCurrentCBStage->nVectors );
- cb_index = pTempIndices[ k ] - SKP_SMULBB( input_index, pCurrentCBStage->nVectors );
- }
- } else {
- /* Find the indices of the input and the codebook vector */
- input_index = 0;
- cb_index = pTempIndices[ k ];
- }
-
- /* Subtract new contribution from the previous residual vector for each of 'cur_survivors' */
- pConstInt = &pRes_Q15[ SKP_SMULBB( input_index, LPC_order ) ];
- pCB_element = &pCurrentCBStage->CB_NLSF_Q15[ SKP_SMULBB( cb_index, LPC_order ) ];
- pInt = &pRes_new_Q15[ SKP_SMULBB( k, LPC_order ) ];
- for( i = 0; i < LPC_order; i++ ) {
- pInt[ i ] = pConstInt[ i ] - ( SKP_int )pCB_element[ i ];
- }
-
- /* Update accumulated rate for stage 1 to the current */
- pRate_new_Q5[ k ] = pRate_Q5[ input_index ] + pCurrentCBStage->Rates_Q5[ cb_index ];
-
- /* Copy paths from previous matrix, starting with the best path */
- pConstInt = &pPath[ SKP_SMULBB( input_index, psNLSF_CB->nStages ) ];
- pInt = &pPath_new[ SKP_SMULBB( k, psNLSF_CB->nStages ) ];
- for( i = 0; i < s; i++ ) {
- pInt[ i ] = pConstInt[ i ];
- }
- /* Write the current stage indices for the 'cur_survivors' to the best path matrix */
- pInt[ s ] = cb_index;
- }
-
- if( s < psNLSF_CB->nStages - 1 ) {
- /* Copy NLSF residual matrix for next stage */
- SKP_memcpy( pRes_Q15, pRes_new_Q15, SKP_SMULBB( cur_survivors, LPC_order ) * sizeof( SKP_int ) );
-
- /* Copy rate vector for next stage */
- SKP_memcpy( pRate_Q5, pRate_new_Q5, cur_survivors * sizeof( SKP_int32 ) );
-
- /* Copy best path matrix for next stage */
- SKP_memcpy( pPath, pPath_new, SKP_SMULBB( cur_survivors, psNLSF_CB->nStages ) * sizeof( SKP_int ) );
- }
-
- prev_survivors = cur_survivors;
- }
-
- /* (Preliminary) index of the best survivor, later to be decoded */
- bestIndex = 0;
-
-#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 1 )
- /******************************/
- /* NLSF fluctuation reduction */
- /******************************/
- if( deactivate_fluc_red != 1 ) {
-
- /* Search among all survivors, now taking also weighted fluctuation errors into account */
- bestRateDist_Q20 = SKP_int32_MAX;
- for( s = 0; s < cur_survivors; s++ ) {
- /* Decode survivor to compare with previous quantized NLSF vector */
- SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, &pPath_new[ SKP_SMULBB( s, psNLSF_CB->nStages ) ], LPC_order );
-
- /* Compare decoded NLSF vector with the previously quantized vector */
- wsse_Q20 = 0;
- for( i = 0; i < LPC_order; i += 2 ) {
- /* Compute weighted squared quantization error for index i */
- se_Q15 = pNLSF_Q15[ i ] - pNLSF_q_Q15_prev[ i ]; // range: [ -32767 : 32767 ]
- wsse_Q20 = SKP_SMLAWB( wsse_Q20, SKP_SMULBB( se_Q15, se_Q15 ), pW_Q6[ i ] );
-
- /* Compute weighted squared quantization error for index i + 1 */
- se_Q15 = pNLSF_Q15[ i + 1 ] - pNLSF_q_Q15_prev[ i + 1 ]; // range: [ -32767 : 32767 ]
- wsse_Q20 = SKP_SMLAWB( wsse_Q20, SKP_SMULBB( se_Q15, se_Q15 ), pW_Q6[ i + 1 ] );
- }
- SKP_assert( wsse_Q20 >= 0 );
-
- /* Add the fluctuation reduction penalty to the rate distortion error */
- wsse_Q20 = SKP_ADD_POS_SAT32( pRateDist_Q18[ s ], SKP_SMULWB( wsse_Q20, NLSF_mu_fluc_red_Q16 ) );
-
- /* Keep index of best survivor */
- if( wsse_Q20 < bestRateDist_Q20 ) {
- bestRateDist_Q20 = wsse_Q20;
- bestIndex = s;
- }
- }
- }
-#endif
-
- /* Copy best path to output argument */
- SKP_memcpy( NLSFIndices, &pPath_new[ SKP_SMULBB( bestIndex, psNLSF_CB->nStages ) ], psNLSF_CB->nStages * sizeof( SKP_int ) );
-
- /* Decode and stabilize the best survivor */
- SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, NLSFIndices, LPC_order );
-
-}
--- a/src/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c
+++ /dev/null
@@ -1,61 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Rate-Distortion calculations for multiple input data vectors */
-void SKP_Silk_NLSF_VQ_rate_distortion_FIX(
- SKP_int32 *pRD_Q20, /* O Rate-distortion values [psNLSF_CBS->nVectors*N] */
- const SKP_Silk_NLSF_CBS *psNLSF_CBS, /* I NLSF codebook stage struct */
- const SKP_int *in_Q15, /* I Input vectors to be quantized */
- const SKP_int *w_Q6, /* I Weight vector */
- const SKP_int32 *rate_acc_Q5, /* I Accumulated rates from previous stage */
- const SKP_int mu_Q15, /* I Weight between weighted error and rate */
- const SKP_int N, /* I Number of input vectors to be quantized */
- const SKP_int LPC_order /* I LPC order */
-)
-{
- SKP_int i, n;
- SKP_int32 *pRD_vec_Q20;
-
- /* Compute weighted quantization errors for all input vectors over one codebook stage */
- SKP_Silk_NLSF_VQ_sum_error_FIX( pRD_Q20, in_Q15, w_Q6, psNLSF_CBS->CB_NLSF_Q15,
- N, psNLSF_CBS->nVectors, LPC_order );
-
- /* Loop over input vectors */
- pRD_vec_Q20 = pRD_Q20;
- for( n = 0; n < N; n++ ) {
- /* Add rate cost to error for each codebook vector */
- for( i = 0; i < psNLSF_CBS->nVectors; i++ ) {
- SKP_assert( rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ] >= 0 );
- SKP_assert( rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ] <= SKP_int16_MAX );
- pRD_vec_Q20[ i ] = SKP_SMLABB( pRD_vec_Q20[ i ], rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ], mu_Q15 );
- SKP_assert( pRD_vec_Q20[ i ] >= 0 );
- }
- pRD_vec_Q20 += psNLSF_CBS->nVectors;
- }
-}
--- a/src/SKP_Silk_NLSF_VQ_sum_error_FIX.c
+++ /dev/null
@@ -1,79 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */
-void SKP_Silk_NLSF_VQ_sum_error_FIX(
- SKP_int32 *err_Q20, /* O Weighted quantization errors [N*K] */
- const SKP_int *in_Q15, /* I Input vectors to be quantized [N*LPC_order] */
- const SKP_int *w_Q6, /* I Weighting vectors [N*LPC_order] */
- const SKP_int16 *pCB_Q15, /* I Codebook vectors [K*LPC_order] */
- const SKP_int N, /* I Number of input vectors */
- const SKP_int K, /* I Number of codebook vectors */
- const SKP_int LPC_order /* I Number of LPCs */
-)
-{
- SKP_int i, n, m;
- SKP_int32 diff_Q15, sum_error, Wtmp_Q6;
- SKP_int32 Wcpy_Q6[ MAX_LPC_ORDER / 2 ];
- const SKP_int16 *cb_vec_Q15;
-
- SKP_assert( LPC_order <= 16 );
- SKP_assert( ( LPC_order & 1 ) == 0 );
-
- /* Copy to local stack and pack two weights per int32 */
- for( m = 0; m < SKP_RSHIFT( LPC_order, 1 ); m++ ) {
- Wcpy_Q6[ m ] = w_Q6[ 2 * m ] | SKP_LSHIFT( ( SKP_int32 )w_Q6[ 2 * m + 1 ], 16 );
- }
-
- /* Loop over input vectors */
- for( n = 0; n < N; n++ ) {
- /* Loop over codebook */
- cb_vec_Q15 = pCB_Q15;
- for( i = 0; i < K; i++ ) {
- sum_error = 0;
- for( m = 0; m < LPC_order; m += 2 ) {
- /* Get two weights packed in an int32 */
- Wtmp_Q6 = Wcpy_Q6[ SKP_RSHIFT( m, 1 ) ];
-
- /* Compute weighted squared quantization error for index m */
- diff_Q15 = in_Q15[ m ] - *cb_vec_Q15++; // range: [ -32767 : 32767 ]
- sum_error = SKP_SMLAWB( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 );
-
- /* Compute weighted squared quantization error for index m + 1 */
- diff_Q15 = in_Q15[m + 1] - *cb_vec_Q15++; // range: [ -32767 : 32767 ]
- sum_error = SKP_SMLAWT( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 );
- }
- SKP_assert( sum_error >= 0 );
- err_Q20[ i ] = sum_error;
- }
- err_Q20 += K;
- in_Q15 += LPC_order;
- }
-}
-
--- a/src/SKP_Silk_NLSF_VQ_weights_laroia.c
+++ /dev/null
@@ -1,78 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/*
-R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP
-Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech,
-Signal Processing, pp. 641-644, 1991.
-*/
-
-#define Q_OUT 6
-
-/* Laroia low complexity NLSF weights */
-void SKP_Silk_NLSF_VQ_weights_laroia(
- SKP_int *pNLSFW_Q6, /* O: Pointer to input vector weights [D x 1] */
- const SKP_int *pNLSF_Q15, /* I: Pointer to input vector [D x 1] */
- const SKP_int D /* I: Input vector dimension (even) */
-)
-{
- SKP_int k;
- SKP_int32 tmp1_int, tmp2_int;
-
- /* Check that we are guaranteed to end up within the required range */
- SKP_assert( D > 0 );
- SKP_assert( ( D & 1 ) == 0 );
-
- /* First value */
- tmp1_int = SKP_max_int( pNLSF_Q15[ 0 ], 1 );
- tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int );
- tmp2_int = SKP_max_int( pNLSF_Q15[ 1 ] - pNLSF_Q15[ 0 ], 1 );
- tmp2_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp2_int );
- pNLSFW_Q6[ 0 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
- SKP_assert( pNLSFW_Q6[ 0 ] > 0 );
-
- /* Main loop */
- for( k = 1; k < D - 1; k += 2 ) {
- tmp1_int = SKP_max_int( pNLSF_Q15[ k + 1 ] - pNLSF_Q15[ k ], 1 );
- tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int );
- pNLSFW_Q6[ k ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
- SKP_assert( pNLSFW_Q6[ k ] > 0 );
-
- tmp2_int = SKP_max_int( pNLSF_Q15[ k + 2 ] - pNLSF_Q15[ k + 1 ], 1 );
- tmp2_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp2_int );
- pNLSFW_Q6[ k + 1 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
- SKP_assert( pNLSFW_Q6[ k + 1 ] > 0 );
- }
-
- /* Last value */
- tmp1_int = SKP_max_int( ( 1 << 15 ) - pNLSF_Q15[ D - 1 ], 1 );
- tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int );
- pNLSFW_Q6[ D - 1 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
- SKP_assert( pNLSFW_Q6[ D - 1 ] > 0 );
-}
--- a/src/SKP_Silk_NLSF_stabilize.c
+++ /dev/null
@@ -1,154 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* NLSF stabilizer: */
-/* */
-/* - Moves NLSFs futher apart if they are too close */
-/* - Moves NLSFs away from borders if they are too close */
-/* - High effort to achieve a modification with minimum */
-/* Euclidean distance to input vector */
-/* - Output are sorted NLSF coefficients */
-/* */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Constant Definitions */
-#define MAX_LOOPS 20
-
-/* NLSF stabilizer, for a single input data vector */
-void SKP_Silk_NLSF_stabilize(
- SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vector in Q15 [L] */
- const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
- const SKP_int L /* I: Number of NLSF parameters in the input vector */
-)
-{
- SKP_int center_freq_Q15, diff_Q15, min_center_Q15, max_center_Q15;
- SKP_int32 min_diff_Q15;
- SKP_int loops;
- SKP_int i, I=0, k;
-
- /* This is necessary to ensure an output within range of a SKP_int16 */
- SKP_assert( NDeltaMin_Q15[L] >= 1 );
-
- for( loops = 0; loops < MAX_LOOPS; loops++ ) {
- /**************************/
- /* Find smallest distance */
- /**************************/
- /* First element */
- min_diff_Q15 = NLSF_Q15[0] - NDeltaMin_Q15[0];
- I = 0;
- /* Middle elements */
- for( i = 1; i <= L-1; i++ ) {
- diff_Q15 = NLSF_Q15[i] - ( NLSF_Q15[i-1] + NDeltaMin_Q15[i] );
- if( diff_Q15 < min_diff_Q15 ) {
- min_diff_Q15 = diff_Q15;
- I = i;
- }
- }
- /* Last element */
- diff_Q15 = (1<<15) - ( NLSF_Q15[L-1] + NDeltaMin_Q15[L] );
- if( diff_Q15 < min_diff_Q15 ) {
- min_diff_Q15 = diff_Q15;
- I = L;
- }
-
- /***************************************************/
- /* Now check if the smallest distance non-negative */
- /***************************************************/
- if (min_diff_Q15 >= 0) {
- return;
- }
-
- if( I == 0 ) {
- /* Move away from lower limit */
- NLSF_Q15[0] = NDeltaMin_Q15[0];
-
- } else if( I == L) {
- /* Move away from higher limit */
- NLSF_Q15[L-1] = (1<<15) - NDeltaMin_Q15[L];
-
- } else {
- /* Find the lower extreme for the location of the current center frequency */
- min_center_Q15 = 0;
- for( k = 0; k < I; k++ ) {
- min_center_Q15 += NDeltaMin_Q15[k];
- }
- min_center_Q15 += SKP_RSHIFT( NDeltaMin_Q15[I], 1 );
-
- /* Find the upper extreme for the location of the current center frequency */
- max_center_Q15 = (1<<15);
- for( k = L; k > I; k-- ) {
- max_center_Q15 -= NDeltaMin_Q15[k];
- }
- max_center_Q15 -= ( NDeltaMin_Q15[I] - SKP_RSHIFT( NDeltaMin_Q15[I], 1 ) );
-
- /* Move apart, sorted by value, keeping the same center frequency */
- center_freq_Q15 = SKP_LIMIT( SKP_RSHIFT_ROUND( (SKP_int32)NLSF_Q15[I-1] + (SKP_int32)NLSF_Q15[I], 1 ),
- min_center_Q15, max_center_Q15 );
- NLSF_Q15[I-1] = center_freq_Q15 - SKP_RSHIFT( NDeltaMin_Q15[I], 1 );
- NLSF_Q15[I] = NLSF_Q15[I-1] + NDeltaMin_Q15[I];
- }
- }
-
- /* Safe and simple fall back method, which is less ideal than the above */
- if( loops == MAX_LOOPS )
- {
- /* Insertion sort (fast for already almost sorted arrays): */
- /* Best case: O(n) for an already sorted array */
- /* Worst case: O(n^2) for an inversely sorted array */
- SKP_Silk_insertion_sort_increasing_all_values(&NLSF_Q15[0], L);
-
- /* First NLSF should be no less than NDeltaMin[0] */
- NLSF_Q15[0] = SKP_max_int( NLSF_Q15[0], NDeltaMin_Q15[0] );
-
- /* Keep delta_min distance between the NLSFs */
- for( i = 1; i < L; i++ )
- NLSF_Q15[i] = SKP_max_int( NLSF_Q15[i], NLSF_Q15[i-1] + NDeltaMin_Q15[i] );
-
- /* Last NLSF should be no higher than 1 - NDeltaMin[L] */
- NLSF_Q15[L-1] = SKP_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] );
-
- /* Keep NDeltaMin distance between the NLSFs */
- for( i = L-2; i >= 0; i-- )
- NLSF_Q15[i] = SKP_min_int( NLSF_Q15[i], NLSF_Q15[i+1] - NDeltaMin_Q15[i+1] );
- }
-}
-
-/* NLSF stabilizer, over multiple input column data vectors */
-void SKP_Silk_NLSF_stabilize_multi(
- SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vectors in Q15 [LxN] */
- const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
- const SKP_int N, /* I: Number of input vectors to be stabilized */
- const SKP_int L /* I: NLSF vector dimension */
-)
-{
- SKP_int n;
-
- /* loop over input data */
- for( n = 0; n < N; n++ ) {
- SKP_Silk_NLSF_stabilize( &NLSF_Q15[n * L], NDeltaMin_Q15, L );
- }
-}
--- a/src/SKP_Silk_NSQ.c
+++ /dev/null
@@ -1,446 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-SKP_INLINE void SKP_Silk_nsq_scale_states(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- const SKP_int16 x[], /* I input in Q0 */
- SKP_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
- SKP_int length, /* I length of input */
- SKP_int16 sLTP[], /* I re-whitened LTP state in Q0 */
- SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
- SKP_int subfr, /* I subframe number */
- const SKP_int LTP_scale_Q14, /* I */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int pitchL[ NB_SUBFR ] /* I */
-);
-
-SKP_INLINE void SKP_Silk_noise_shape_quantizer(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- SKP_int sigtype, /* I Signal type */
- const SKP_int32 x_sc_Q10[], /* I */
- SKP_int q[], /* O */
- SKP_int16 xq[], /* O */
- SKP_int32 sLTP_Q16[], /* I/O LTP state */
- const SKP_int16 a_Q12[], /* I Short term prediction coefs */
- const SKP_int16 b_Q14[], /* I Long term prediction coefs */
- const SKP_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
- SKP_int lag, /* I Pitch lag */
- SKP_int32 HarmShapeFIRPacked_Q14, /* I */
- SKP_int Tilt_Q14, /* I Spectral tilt */
- SKP_int32 LF_shp_Q14, /* I */
- SKP_int32 Gain_Q16, /* I */
- SKP_int Lambda_Q10, /* I */
- SKP_int offset_Q10, /* I */
- SKP_int length, /* I Input length */
- SKP_int shapingLPCOrder, /* I Noise shaping AR filter order */
- SKP_int predictLPCOrder /* I Prediction filter order */
-);
-
-void SKP_Silk_NSQ(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
- SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- const SKP_int16 x[], /* I prefiltered input signal */
- SKP_int q[], /* O quantized qulse signal */
- const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
- const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefficients */
- const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I Long term prediction coefficients */
- const SKP_int16 AR2_Q13[ NB_SUBFR * SHAPE_LPC_ORDER_MAX ], /* I */
- const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */
- const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */
- const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int Lambda_Q10, /* I */
- const SKP_int LTP_scale_Q14 /* I LTP state scaling */
-)
-{
- SKP_int k, lag, start_idx, subfr_length, LSF_interpolation_flag;
- const SKP_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
- SKP_int16 *pxq;
- SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ];
- SKP_int16 sLTP[ 2 * MAX_FRAME_LENGTH ];
- SKP_int32 HarmShapeFIRPacked_Q14;
- SKP_int offset_Q10;
- SKP_int32 FiltState[ MAX_LPC_ORDER ];
- SKP_int32 x_sc_Q10[ MAX_FRAME_LENGTH / NB_SUBFR ];
-
- subfr_length = psEncC->frame_length / NB_SUBFR;
-
- NSQ->rand_seed = psEncCtrlC->Seed;
- /* Set unvoiced lag to the previous one, overwrite later for voiced */
- lag = NSQ->lagPrev;
-
- SKP_assert( NSQ->prev_inv_gain_Q16 != 0 );
-
- offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrlC->sigtype ][ psEncCtrlC->QuantOffsetType ];
-
- if( LSFInterpFactor_Q2 == ( 1 << 2 ) ) {
- LSF_interpolation_flag = 0;
- } else {
- LSF_interpolation_flag = 1;
- }
-
- /* Setup pointers to start of sub frame */
- NSQ->sLTP_shp_buf_idx = psEncC->frame_length;
- NSQ->sLTP_buf_idx = psEncC->frame_length;
- pxq = &NSQ->xq[ psEncC->frame_length ];
- for( k = 0; k < NB_SUBFR; k++ ) {
- A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ];
- B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
- AR_shp_Q13 = &AR2_Q13[ k * SHAPE_LPC_ORDER_MAX ];
-
- /* Noise shape parameters */
- SKP_assert( HarmShapeGain_Q14[ k ] >= 0 );
- HarmShapeFIRPacked_Q14 = SKP_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
- HarmShapeFIRPacked_Q14 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
-
- if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
- /* Voiced */
- lag = psEncCtrlC->pitchL[ k ];
-
- NSQ->rewhite_flag = 0;
- /* Re-whitening */
- if( ( k & ( 3 - SKP_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
- /* Rewhiten with new A coefs */
-
- start_idx = psEncC->frame_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
- start_idx = SKP_LIMIT( start_idx, 0, psEncC->frame_length - psEncC->predictLPCOrder ); /* Limit */
-
- SKP_memset( FiltState, 0, psEncC->predictLPCOrder * sizeof( SKP_int32 ) );
- SKP_Silk_MA_Prediction( &NSQ->xq[ start_idx + k * ( psEncC->frame_length >> 2 ) ],
- A_Q12, FiltState, sLTP + start_idx, psEncC->frame_length - start_idx, psEncC->predictLPCOrder );
-
- NSQ->rewhite_flag = 1;
- NSQ->sLTP_buf_idx = psEncC->frame_length;
- }
- }
-
- SKP_Silk_nsq_scale_states( NSQ, x, x_sc_Q10, psEncC->subfr_length, sLTP,
- sLTP_Q16, k, LTP_scale_Q14, Gains_Q16, psEncCtrlC->pitchL );
-
- SKP_Silk_noise_shape_quantizer( NSQ, psEncCtrlC->sigtype, x_sc_Q10, q, pxq, sLTP_Q16, A_Q12, B_Q14,
- AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10,
- offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder
- );
-
- x += psEncC->subfr_length;
- q += psEncC->subfr_length;
- pxq += psEncC->subfr_length;
- }
-
- /* Save scalars for this layer */
- NSQ->sLF_AR_shp_Q12 = NSQ->sLF_AR_shp_Q12;
- NSQ->prev_inv_gain_Q16 = NSQ->prev_inv_gain_Q16;
- NSQ->lagPrev = psEncCtrlC->pitchL[ NB_SUBFR - 1 ];
- /* Save quantized speech and noise shaping signals */
- SKP_memcpy( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int16 ) );
- SKP_memcpy( NSQ->sLTP_shp_Q10, &NSQ->sLTP_shp_Q10[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int32 ) );
-
-}
-
-/***********************************/
-/* SKP_Silk_noise_shape_quantizer */
-/***********************************/
-SKP_INLINE void SKP_Silk_noise_shape_quantizer(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- SKP_int sigtype, /* I Signal type */
- const SKP_int32 x_sc_Q10[], /* I */
- SKP_int q[], /* O */
- SKP_int16 xq[], /* O */
- SKP_int32 sLTP_Q16[], /* I/O LTP state */
- const SKP_int16 a_Q12[], /* I Short term prediction coefs */
- const SKP_int16 b_Q14[], /* I Long term prediction coefs */
- const SKP_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
- SKP_int lag, /* I Pitch lag */
- SKP_int32 HarmShapeFIRPacked_Q14, /* I */
- SKP_int Tilt_Q14, /* I Spectral tilt */
- SKP_int32 LF_shp_Q14, /* I */
- SKP_int32 Gain_Q16, /* I */
- SKP_int Lambda_Q10, /* I */
- SKP_int offset_Q10, /* I */
- SKP_int length, /* I Input length */
- SKP_int shapingLPCOrder, /* I Noise shaping AR filter order */
- SKP_int predictLPCOrder /* I Prediction filter order */
-)
-{
- SKP_int i, j;
- SKP_int32 LTP_pred_Q14, LPC_pred_Q10, n_AR_Q10, n_LTP_Q14;
- SKP_int32 n_LF_Q10, r_Q10, q_Q0, q_Q10;
- SKP_int32 thr1_Q10, thr2_Q10, thr3_Q10;
- SKP_int32 Atmp, dither;
- SKP_int32 exc_Q10, LPC_exc_Q10, xq_Q10;
- SKP_int32 tmp, sLF_AR_shp_Q10;
- SKP_int32 *psLPC_Q14;
- SKP_int32 *shp_lag_ptr, *pred_lag_ptr;
- SKP_int32 a_Q12_tmp[ MAX_LPC_ORDER / 2 ], AR_shp_Q13_tmp[ MAX_LPC_ORDER / 2 ];
-
- shp_lag_ptr = &NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
- pred_lag_ptr = &sLTP_Q16[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
-
- /* Setup short term AR state */
- psLPC_Q14 = &NSQ->sLPC_Q14[ MAX_LPC_ORDER - 1 ];
-
- /* Quantization thresholds */
- thr1_Q10 = SKP_SUB_RSHIFT32( -1536, Lambda_Q10, 1);
- thr2_Q10 = SKP_SUB_RSHIFT32( -512, Lambda_Q10, 1);
- thr2_Q10 = SKP_ADD_RSHIFT32( thr2_Q10, SKP_SMULBB( offset_Q10, Lambda_Q10 ), 10 );
- thr3_Q10 = SKP_ADD_RSHIFT32( 512, Lambda_Q10, 1);
-
- /* Preload LPC coeficients to array on stack. Gives small performance gain */
- SKP_memcpy( a_Q12_tmp, a_Q12, predictLPCOrder * sizeof( SKP_int16 ) );
- SKP_memcpy( AR_shp_Q13_tmp, AR_shp_Q13, shapingLPCOrder * sizeof( SKP_int16 ) );
-
- for( i = 0; i < length; i++ ) {
- /* Generate dither */
- NSQ->rand_seed = SKP_RAND( NSQ->rand_seed );
-
- /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */
- dither = SKP_RSHIFT( NSQ->rand_seed, 31 );
-
- /* Short-term prediction */
- SKP_assert( ( predictLPCOrder & 1 ) == 0 ); /* check that order is even */
- SKP_assert( ( (SKP_int64)a_Q12 & 3 ) == 0 ); /* check that array starts at 4-byte aligned address */
- SKP_assert( predictLPCOrder >= 10 ); /* check that unrolling works */
-
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLAWB and SMLAWT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLAWB and SMLAWT instructions should solve the problem. */
- /* Partially unrolled */
- Atmp = a_Q12_tmp[ 0 ]; /* read two coefficients at once */
- LPC_pred_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -1 ], Atmp );
- Atmp = a_Q12_tmp[ 1 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -3 ], Atmp );
- Atmp = a_Q12_tmp[ 2 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -5 ], Atmp );
- Atmp = a_Q12_tmp[ 3 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -7 ], Atmp );
- Atmp = a_Q12_tmp[ 4 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -9 ], Atmp );
- for( j = 10; j < predictLPCOrder; j += 2 ) {
- Atmp = a_Q12_tmp[ j >> 1 ]; /* read two coefficients at once */
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -j ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -j - 1 ], Atmp );
- }
-
- /* Long-term prediction */
- if( sigtype == SIG_TYPE_VOICED ) {
- /* Unrolled loop */
- LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], b_Q14[ 0 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
- pred_lag_ptr++;
- } else {
- LTP_pred_Q14 = 0;
- }
-
- /* Noise shape feedback */
- SKP_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */
- SKP_assert( ( (SKP_int64)AR_shp_Q13 & 3 ) == 0 ); /* check that array starts at 4-byte aligned address */
- SKP_assert( shapingLPCOrder >= 12 ); /* check that unrolling works */
-
- /* Partially unrolled */
- Atmp = AR_shp_Q13_tmp[ 0 ]; /* read two coefficients at once */
- n_AR_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -1 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 1 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -2 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -3 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 2 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -4 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -5 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 3 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -6 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -7 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 4 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -8 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -9 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 5 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -10 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -11 ], Atmp );
- for( j = 12; j < shapingLPCOrder; j += 2 ) {
- Atmp = AR_shp_Q13_tmp[ j >> 1 ]; /* read two coefficients at once */
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -j ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -j - 1 ], Atmp );
- }
- n_AR_Q10 = SKP_RSHIFT( n_AR_Q10, 1 ); /* Q11 -> Q10 */
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, NSQ->sLF_AR_shp_Q12, Tilt_Q14 );
-
- n_LF_Q10 = SKP_LSHIFT( SKP_SMULWB( NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ), 2 );
- n_LF_Q10 = SKP_SMLAWT( n_LF_Q10, NSQ->sLF_AR_shp_Q12, LF_shp_Q14 );
-
- SKP_assert( lag > 0 || sigtype == SIG_TYPE_UNVOICED);
-
- /* Long-term shaping */
- if( lag > 0 ) {
- /* Symmetric, packed FIR coefficients */
- n_LTP_Q14 = SKP_SMULWB( SKP_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
- n_LTP_Q14 = SKP_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
- shp_lag_ptr++;
- n_LTP_Q14 = SKP_LSHIFT( n_LTP_Q14, 6 );
- } else {
- n_LTP_Q14 = 0;
- }
-
- /* Input minus prediction plus noise feedback */
- //r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP;
- tmp = SKP_SUB32( LTP_pred_Q14, n_LTP_Q14 ); /* Add Q14 stuff */
- tmp = SKP_RSHIFT_ROUND( tmp, 4 ); /* round to Q10 */
- tmp = SKP_ADD32( tmp, LPC_pred_Q10 ); /* add Q10 stuff */
- tmp = SKP_SUB32( tmp, n_AR_Q10 ); /* subtract Q10 stuff */
- tmp = SKP_SUB32( tmp, n_LF_Q10 ); /* subtract Q10 stuff */
- r_Q10 = SKP_SUB32( x_sc_Q10[ i ], tmp );
-
-
- /* Flip sign depending on dither */
- r_Q10 = ( r_Q10 ^ dither ) - dither;
- r_Q10 = SKP_SUB32( r_Q10, offset_Q10 );
- r_Q10 = SKP_LIMIT( r_Q10, -64 << 10, 64 << 10 );
-
- /* Quantize */
- if( r_Q10 < thr1_Q10 ) {
- q_Q0 = SKP_RSHIFT_ROUND( SKP_ADD_RSHIFT32( r_Q10, Lambda_Q10, 1 ), 10 );
- q_Q10 = SKP_LSHIFT( q_Q0, 10 );
- } else if( r_Q10 < thr2_Q10 ) {
- q_Q0 = -1;
- q_Q10 = -1024;
- } else if( r_Q10 > thr3_Q10 ) {
- q_Q0 = SKP_RSHIFT_ROUND( SKP_SUB_RSHIFT32( r_Q10, Lambda_Q10, 1 ), 10 );
- q_Q10 = SKP_LSHIFT( q_Q0, 10 );
- } else {
- q_Q0 = 0;
- q_Q10 = 0;
- }
- q[ i ] = q_Q0;
-
- /* Excitation */
- exc_Q10 = SKP_ADD32( q_Q10, offset_Q10 );
- exc_Q10 = ( exc_Q10 ^ dither ) - dither;
-
- /* Add predictions */
- LPC_exc_Q10 = SKP_ADD32( exc_Q10, SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) );
- xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 );
-
- /* Scale XQ back to normal level before saving */
- xq[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( xq_Q10, Gain_Q16 ), 10 ) );
-
-
- /* Update states */
- psLPC_Q14++;
- *psLPC_Q14 = SKP_LSHIFT( xq_Q10, 4 );
- sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 );
- NSQ->sLF_AR_shp_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 );
-
- NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx ] = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 );
- sLTP_Q16[NSQ->sLTP_buf_idx] = SKP_LSHIFT( LPC_exc_Q10, 6 );
- NSQ->sLTP_shp_buf_idx++;
- NSQ->sLTP_buf_idx++;
-
- /* Make dither dependent on quantized signal */
- NSQ->rand_seed += q[ i ];
- }
- /* Update LPC synth buffer */
- SKP_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) );
-}
-
-SKP_INLINE void SKP_Silk_nsq_scale_states(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- const SKP_int16 x[], /* I input in Q0 */
- SKP_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
- SKP_int length, /* I length of input */
- SKP_int16 sLTP[], /* I re-whitened LTP state in Q0 */
- SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
- SKP_int subfr, /* I subframe number */
- const SKP_int LTP_scale_Q14, /* I */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int pitchL[ NB_SUBFR ] /* I */
-)
-{
- SKP_int i, scale_length, lag;
- SKP_int32 inv_gain_Q16, gain_adj_Q16, inv_gain_Q32;
-
- inv_gain_Q16 = SKP_DIV32( SKP_int32_MAX, SKP_RSHIFT( Gains_Q16[ subfr ], 1) );
- inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX );
- lag = pitchL[ subfr ];
-
- /* After rewhitening the LTP state is un-scaled */
- if( NSQ->rewhite_flag ) {
- inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 );
- if( subfr == 0 ) {
- /* Do LTP downscaling */
- inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, LTP_scale_Q14 ), 2 );
- }
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
- sLTP_Q16[ i ] = SKP_SMULWB( inv_gain_Q32, sLTP[ i ] );
- }
- }
-
- /* Prepare for Worst case. Next frame starts with max lag voiced */
- scale_length = length * NB_SUBFR; /* approx max lag */
- scale_length = scale_length - SKP_SMULBB( NB_SUBFR - (subfr + 1), length ); /* subtract samples that will be too old in next frame */
- scale_length = SKP_max_int( scale_length, lag + LTP_ORDER ); /* make sure to scale whole pitch period if voiced */
-
- /* Adjust for changing gain */
- if( inv_gain_Q16 != NSQ->prev_inv_gain_Q16 ) {
- gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, NSQ->prev_inv_gain_Q16, 16 );
-
- for( i = NSQ->sLTP_shp_buf_idx - scale_length; i < NSQ->sLTP_shp_buf_idx; i++ ) {
- NSQ->sLTP_shp_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q10[ i ] );
- }
-
- /* Scale LTP predict state */
- if( NSQ->rewhite_flag == 0 ) {
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
- sLTP_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, sLTP_Q16[ i ] );
- }
- }
- NSQ->sLF_AR_shp_Q12 = SKP_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q12 );
-
- /* scale short term state */
- for( i = 0; i < MAX_LPC_ORDER; i++ ) {
- NSQ->sLPC_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] );
- }
- }
-
- /* Scale input */
- for( i = 0; i < length; i++ ) {
- x_sc_Q10[ i ] = SKP_RSHIFT( SKP_SMULBB( x[ i ], ( SKP_int16 )inv_gain_Q16 ), 6 );
- }
-
- /* save inv_gain */
- SKP_assert( inv_gain_Q16 != 0 );
- NSQ->prev_inv_gain_Q16 = inv_gain_Q16;
-}
--- a/src/SKP_Silk_NSQ_del_dec.c
+++ /dev/null
@@ -1,722 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-typedef struct {
- SKP_int RandState[ DECISION_DELAY ];
- SKP_int32 Q_Q10[ DECISION_DELAY ];
- SKP_int32 Xq_Q10[ DECISION_DELAY ];
- SKP_int32 Pred_Q16[ DECISION_DELAY ];
- SKP_int32 Shape_Q10[ DECISION_DELAY ];
- SKP_int32 Gain_Q16[ DECISION_DELAY ];
- SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + NSQ_LPC_BUF_LENGTH ];
- SKP_int32 LF_AR_Q12;
- SKP_int32 Seed;
- SKP_int32 SeedInit;
- SKP_int32 RD_Q10;
-} NSQ_del_dec_struct;
-
-typedef struct {
- SKP_int32 Q_Q10;
- SKP_int32 RD_Q10;
- SKP_int32 xq_Q14;
- SKP_int32 LF_AR_Q12;
- SKP_int32 sLTP_shp_Q10;
- SKP_int32 LPC_exc_Q16;
-} NSQ_sample_struct;
-
-SKP_INLINE void SKP_Silk_copy_del_dec_state(
- NSQ_del_dec_struct *DD_dst, /* I Dst del dec state */
- NSQ_del_dec_struct *DD_src, /* I Src del dec state */
- SKP_int LPC_state_idx /* I Index to LPC buffer */
-);
-
-SKP_INLINE void SKP_Silk_nsq_del_dec_scale_states(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- const SKP_int16 x[], /* I Input in Q0 */
- SKP_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
- SKP_int length, /* I Length of input */
- SKP_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
- SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
- SKP_int subfr, /* I Subframe number */
- SKP_int nStatesDelayedDecision, /* I Number of del dec states */
- SKP_int smpl_buf_idx, /* I Index to newest samples in buffers */
- const SKP_int LTP_scale_Q14, /* I LTP state scaling */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int pitchL[ NB_SUBFR ] /* I Pitch lag */
-);
-
-/******************************************/
-/* Noise shape quantizer for one subframe */
-/******************************************/
-SKP_INLINE void SKP_Silk_noise_shape_quantizer_del_dec(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- SKP_int sigtype, /* I Signal type */
- const SKP_int32 x_Q10[], /* I */
- SKP_int q[], /* O */
- SKP_int16 xq[], /* O */
- SKP_int32 sLTP_Q16[], /* I/O LTP filter state */
- const SKP_int16 a_Q12[], /* I Short term prediction coefs */
- const SKP_int16 b_Q14[], /* I Long term prediction coefs */
- const SKP_int16 AR_shp_Q13[], /* I Noise shaping coefs */
- SKP_int lag, /* I Pitch lag */
- SKP_int32 HarmShapeFIRPacked_Q14, /* I */
- SKP_int Tilt_Q14, /* I Spectral tilt */
- SKP_int32 LF_shp_Q14, /* I */
- SKP_int32 Gain_Q16, /* I */
- SKP_int Lambda_Q10, /* I */
- SKP_int offset_Q10, /* I */
- SKP_int length, /* I Input length */
- SKP_int subfr, /* I Subframe number */
- SKP_int shapingLPCOrder, /* I Shaping LPC filter order */
- SKP_int predictLPCOrder, /* I Prediction LPC filter order */
- SKP_int nStatesDelayedDecision, /* I Number of states in decision tree */
- SKP_int *smpl_buf_idx, /* I Index to newest samples in buffers */
- SKP_int decisionDelay /* I */
-);
-
-void SKP_Silk_NSQ_del_dec(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
- SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- const SKP_int16 x[], /* I Prefiltered input signal */
- SKP_int q[], /* O Quantized pulse signal */
- const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
- const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Prediction coefs */
- const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I LT prediction coefs */
- const SKP_int16 AR2_Q13[ NB_SUBFR * SHAPE_LPC_ORDER_MAX ], /* I */
- const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */
- const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */
- const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int Lambda_Q10, /* I */
- const SKP_int LTP_scale_Q14 /* I LTP state scaling */
-)
-{
- SKP_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
- SKP_int last_smple_idx, smpl_buf_idx, decisionDelay, subfr_length;
- const SKP_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
- SKP_int16 *pxq;
- SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ];
- SKP_int16 sLTP[ 2 * MAX_FRAME_LENGTH ];
- SKP_int32 HarmShapeFIRPacked_Q14;
- SKP_int offset_Q10;
- SKP_int32 FiltState[ MAX_LPC_ORDER ], RDmin_Q10;
- SKP_int32 x_sc_Q10[ MAX_FRAME_LENGTH / NB_SUBFR ];
- NSQ_del_dec_struct psDelDec[ DEL_DEC_STATES_MAX ];
- NSQ_del_dec_struct *psDD;
-
- subfr_length = psEncC->frame_length / NB_SUBFR;
-
- /* Set unvoiced lag to the previous one, overwrite later for voiced */
- lag = NSQ->lagPrev;
-
- SKP_assert( NSQ->prev_inv_gain_Q16 != 0 );
-
- /* Initialize delayed decision states */
- SKP_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) );
- for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
- psDD->Seed = ( k + psEncCtrlC->Seed ) & 3;
- psDD->SeedInit = psDD->Seed;
- psDD->RD_Q10 = 0;
- psDD->LF_AR_Q12 = NSQ->sLF_AR_shp_Q12;
- psDD->Shape_Q10[ 0 ] = NSQ->sLTP_shp_Q10[ psEncC->frame_length - 1 ];
- SKP_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
- }
-
- offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrlC->sigtype ][ psEncCtrlC->QuantOffsetType ];
- smpl_buf_idx = 0; /* index of oldest samples */
-
- decisionDelay = SKP_min_int( DECISION_DELAY, subfr_length );
- /* For voiced frames limit the decision delay to lower than the pitch lag */
- if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
- for( k = 0; k < NB_SUBFR; k++ ) {
- decisionDelay = SKP_min_int( decisionDelay, psEncCtrlC->pitchL[ k ] - LTP_ORDER / 2 - 1 );
- }
- }
-
- if( LSFInterpFactor_Q2 == ( 1 << 2 ) ) {
- LSF_interpolation_flag = 0;
- } else {
- LSF_interpolation_flag = 1;
- }
-
- /* Setup pointers to start of sub frame */
- pxq = &NSQ->xq[ psEncC->frame_length ];
- NSQ->sLTP_shp_buf_idx = psEncC->frame_length;
- NSQ->sLTP_buf_idx = psEncC->frame_length;
- subfr = 0;
- for( k = 0; k < NB_SUBFR; k++ ) {
- A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ];
- B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
- AR_shp_Q13 = &AR2_Q13[ k * SHAPE_LPC_ORDER_MAX ];
-
- NSQ->rewhite_flag = 0;
- if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
- /* Voiced */
- lag = psEncCtrlC->pitchL[ k ];
-
- /* Re-whitening */
- if( ( k & ( 3 - SKP_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
- if( k == 2 ) {
- /* RESET DELAYED DECISIONS */
- /* Find winner */
- RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
- Winner_ind = 0;
- for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) {
- if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psDelDec[ i ].RD_Q10;
- Winner_ind = i;
- }
- }
- for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) {
- if( i != Winner_ind ) {
- psDelDec[ i ].RD_Q10 += ( SKP_int32_MAX >> 4 );
- SKP_assert( psDelDec[ i ].RD_Q10 >= 0 );
- }
- }
-
- /* Copy final part of signals from winner state to output and long-term filter states */
- psDD = &psDelDec[ Winner_ind ];
- last_smple_idx = smpl_buf_idx + decisionDelay;
- for( i = 0; i < decisionDelay; i++ ) {
- last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK;
- q[ i - decisionDelay ] = ( SKP_int )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 );
- pxq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND(
- SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ],
- psDD->Gain_Q16[ last_smple_idx ] ), 10 ) );
- NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q10[ last_smple_idx ];
- }
-
- subfr = 0;
- }
-
- /* Rewhiten with new A coefs */
- start_idx = psEncC->frame_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
- start_idx = SKP_LIMIT( start_idx, 0, psEncC->frame_length - psEncC->predictLPCOrder );
-
- SKP_memset( FiltState, 0, psEncC->predictLPCOrder * sizeof( SKP_int32 ) );
- SKP_Silk_MA_Prediction( &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
- A_Q12, FiltState, sLTP + start_idx, psEncC->frame_length - start_idx, psEncC->predictLPCOrder );
-
- NSQ->sLTP_buf_idx = psEncC->frame_length;
- NSQ->rewhite_flag = 1;
- }
- }
-
- /* Noise shape parameters */
- SKP_assert( HarmShapeGain_Q14[ k ] >= 0 );
- HarmShapeFIRPacked_Q14 = SKP_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
- HarmShapeFIRPacked_Q14 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
-
- SKP_Silk_nsq_del_dec_scale_states( NSQ, psDelDec, x, x_sc_Q10,
- subfr_length, sLTP, sLTP_Q16, k, psEncC->nStatesDelayedDecision, smpl_buf_idx,
- LTP_scale_Q14, Gains_Q16, psEncCtrlC->pitchL );
-
- SKP_Silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psEncCtrlC->sigtype, x_sc_Q10, q, pxq, sLTP_Q16,
- A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ],
- Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, psEncC->predictLPCOrder,
- psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay
- );
-
- x += psEncC->subfr_length;
- q += psEncC->subfr_length;
- pxq += psEncC->subfr_length;
- }
-
- /* Find winner */
- RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
- Winner_ind = 0;
- for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) {
- if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psDelDec[ k ].RD_Q10;
- Winner_ind = k;
- }
- }
-
- /* Copy final part of signals from winner state to output and long-term filter states */
- psDD = &psDelDec[ Winner_ind ];
- psEncCtrlC->Seed = psDD->SeedInit;
- last_smple_idx = smpl_buf_idx + decisionDelay;
- for( i = 0; i < decisionDelay; i++ ) {
- last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK;
- q[ i - decisionDelay ] = ( SKP_int )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 );
- pxq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND(
- SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ], psDD->Gain_Q16[ last_smple_idx ] ), 10 ) );
- NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q10[ last_smple_idx ];
- sLTP_Q16[ NSQ->sLTP_buf_idx - decisionDelay + i ] = psDD->Pred_Q16[ last_smple_idx ];
-
- }
- SKP_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
-
- /* Update states */
- NSQ->sLF_AR_shp_Q12 = psDD->LF_AR_Q12;
- NSQ->prev_inv_gain_Q16 = NSQ->prev_inv_gain_Q16;
- NSQ->lagPrev = psEncCtrlC->pitchL[ NB_SUBFR - 1 ];
-
- /* Save quantized speech and noise shaping signals */
- SKP_memcpy( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int16 ) );
- SKP_memcpy( NSQ->sLTP_shp_Q10, &NSQ->sLTP_shp_Q10[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int32 ) );
-
-}
-
-/******************************************/
-/* Noise shape quantizer for one subframe */
-/******************************************/
-SKP_INLINE void SKP_Silk_noise_shape_quantizer_del_dec(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- SKP_int sigtype, /* I Signal type */
- const SKP_int32 x_Q10[], /* I */
- SKP_int q[], /* O */
- SKP_int16 xq[], /* O */
- SKP_int32 sLTP_Q16[], /* I/O LTP filter state */
- const SKP_int16 a_Q12[], /* I Short term prediction coefs */
- const SKP_int16 b_Q14[], /* I Long term prediction coefs */
- const SKP_int16 AR_shp_Q13[], /* I Noise shaping coefs */
- SKP_int lag, /* I Pitch lag */
- SKP_int32 HarmShapeFIRPacked_Q14, /* I */
- SKP_int Tilt_Q14, /* I Spectral tilt */
- SKP_int32 LF_shp_Q14, /* I */
- SKP_int32 Gain_Q16, /* I */
- SKP_int Lambda_Q10, /* I */
- SKP_int offset_Q10, /* I */
- SKP_int length, /* I Input length */
- SKP_int subfr, /* I Subframe number */
- SKP_int shapingLPCOrder, /* I Shaping LPC filter order */
- SKP_int predictLPCOrder, /* I Prediction LPC filter order */
- SKP_int nStatesDelayedDecision, /* I Number of states in decision tree */
- SKP_int *smpl_buf_idx, /* I Index to newest samples in buffers */
- SKP_int decisionDelay /* I */
-)
-{
- SKP_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx;
- SKP_int32 Winner_rand_state;
- SKP_int32 LTP_pred_Q14, LPC_pred_Q10, n_AR_Q10, n_LTP_Q14;
- SKP_int32 n_LF_Q10;
- SKP_int32 r_Q10, rr_Q20, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10;
- SKP_int32 q1_Q10, q2_Q10;
- SKP_int32 Atmp, dither;
- SKP_int32 exc_Q10, LPC_exc_Q10, xq_Q10;
- SKP_int32 tmp, sLF_AR_shp_Q10;
- SKP_int32 *pred_lag_ptr, *shp_lag_ptr;
- SKP_int32 *psLPC_Q14;
- SKP_int32 a_Q12_tmp[ MAX_LPC_ORDER / 2 ], AR_shp_Q13_tmp[ MAX_LPC_ORDER / 2 ];
- NSQ_sample_struct psSampleState[ DEL_DEC_STATES_MAX ][ 2 ];
- NSQ_del_dec_struct *psDD;
- NSQ_sample_struct *psSS;
-
- shp_lag_ptr = &NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
- pred_lag_ptr = &sLTP_Q16[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
-
- /* Preload LPC coeficients to array on stack. Gives small performance gain */
- SKP_memcpy( a_Q12_tmp, a_Q12, predictLPCOrder * sizeof( SKP_int16 ) );
- SKP_memcpy( AR_shp_Q13_tmp, AR_shp_Q13, shapingLPCOrder * sizeof( SKP_int16 ) );
-
- for( i = 0; i < length; i++ ) {
- /* Perform common calculations used in all states */
-
- /* Long-term prediction */
- if( sigtype == SIG_TYPE_VOICED ) {
- /* Unrolled loop */
- LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], b_Q14[ 0 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
- pred_lag_ptr++;
- } else {
- LTP_pred_Q14 = 0;
- }
-
- /* Long-term shaping */
- if( lag > 0 ) {
- /* Symmetric, packed FIR coefficients */
- n_LTP_Q14 = SKP_SMULWB( SKP_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
- n_LTP_Q14 = SKP_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
- n_LTP_Q14 = SKP_LSHIFT( n_LTP_Q14, 6 );
- shp_lag_ptr++;
- } else {
- n_LTP_Q14 = 0;
- }
-
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- /* Delayed decision state */
- psDD = &psDelDec[ k ];
-
- /* Sample state */
- psSS = psSampleState[ k ];
-
- /* Generate dither */
- psDD->Seed = SKP_RAND( psDD->Seed );
-
- /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */
- dither = SKP_RSHIFT( psDD->Seed, 31 );
-
- /* Pointer used in short term prediction and shaping */
- psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ];
- /* Short-term prediction */
- SKP_assert( ( predictLPCOrder & 1 ) == 0 ); /* check that order is even */
- SKP_assert( ( (SKP_int64)a_Q12 & 3 ) == 0 ); /* check that array starts at 4-byte aligned address */
- SKP_assert( predictLPCOrder >= 10 ); /* check that unrolling works */
-
- /* Partially unrolled */
- Atmp = a_Q12_tmp[ 0 ]; /* read two coefficients at once */
- LPC_pred_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -1 ], Atmp );
- Atmp = a_Q12_tmp[ 1 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -3 ], Atmp );
- Atmp = a_Q12_tmp[ 2 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -5 ], Atmp );
- Atmp = a_Q12_tmp[ 3 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -7 ], Atmp );
- Atmp = a_Q12_tmp[ 4 ];
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -9 ], Atmp );
- for( j = 10; j < predictLPCOrder; j += 2 ) {
- Atmp = a_Q12_tmp[ j >> 1 ]; /* read two coefficients at once */
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -j ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psLPC_Q14[ -j - 1 ], Atmp );
- }
-
- /* Noise shape feedback */
- SKP_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */
- SKP_assert( ( (SKP_int64)AR_shp_Q13 & 3 ) == 0 ); /* check that array starts at 4-byte aligned address */
- SKP_assert( shapingLPCOrder >= 12 ); /* check that unrolling works */
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLAWB and SMLAWT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLAWB and SMLAWT instructions should solve the problem. */
-
- /* Partially unrolled */
- Atmp = AR_shp_Q13_tmp[ 0 ]; /* read two coefficients at once */
- n_AR_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -1 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 1 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -2 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -3 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 2 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -4 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -5 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 3 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -6 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -7 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 4 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -8 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -9 ], Atmp );
- Atmp = AR_shp_Q13_tmp[ 5 ];
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -10 ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -11 ], Atmp );
- for( j = 12; j < shapingLPCOrder; j += 2 ) {
- Atmp = AR_shp_Q13_tmp[ j >> 1 ]; /* read two coefficients at once */
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psLPC_Q14[ -j ], Atmp );
- n_AR_Q10 = SKP_SMLAWT( n_AR_Q10, psLPC_Q14[ -j - 1 ], Atmp );
- }
- n_AR_Q10 = SKP_RSHIFT( n_AR_Q10, 1 ); /* Q11 -> Q10 */
- n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psDD->LF_AR_Q12, Tilt_Q14 );
-
- n_LF_Q10 = SKP_LSHIFT( SKP_SMULWB( psDD->Shape_Q10[ *smpl_buf_idx ], LF_shp_Q14 ), 2 );
- n_LF_Q10 = SKP_SMLAWT( n_LF_Q10, psDD->LF_AR_Q12, LF_shp_Q14 );
-
- /* Input minus prediction plus noise feedback */
- /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */
- tmp = SKP_SUB32( LTP_pred_Q14, n_LTP_Q14 ); /* Add Q14 stuff */
- tmp = SKP_RSHIFT_ROUND( tmp, 4 ); /* round to Q10 */
- tmp = SKP_ADD32( tmp, LPC_pred_Q10 ); /* add Q10 stuff */
- tmp = SKP_SUB32( tmp, n_AR_Q10 ); /* subtract Q10 stuff */
- tmp = SKP_SUB32( tmp, n_LF_Q10 ); /* subtract Q10 stuff */
- r_Q10 = SKP_SUB32( x_Q10[ i ], tmp ); /* residual error Q10 */
-
-
- /* Flip sign depending on dither */
- r_Q10 = ( r_Q10 ^ dither ) - dither;
- r_Q10 = SKP_SUB32( r_Q10, offset_Q10 );
- r_Q10 = SKP_LIMIT( r_Q10, -64 << 10, 64 << 10 );
-
- /* Find two quantization level candidates and measure their rate-distortion */
- if( r_Q10 < -1536 ) {
- q1_Q10 = SKP_LSHIFT( SKP_RSHIFT_ROUND( r_Q10, 10 ), 10 );
- r_Q10 = SKP_SUB32( r_Q10, q1_Q10 );
- rd1_Q10 = SKP_RSHIFT( SKP_SMLABB( SKP_MUL( -SKP_ADD32( q1_Q10, offset_Q10 ), Lambda_Q10 ), r_Q10, r_Q10 ), 10 );
- rd2_Q10 = SKP_ADD32( rd1_Q10, 1024 );
- rd2_Q10 = SKP_SUB32( rd2_Q10, SKP_ADD_LSHIFT32( Lambda_Q10, r_Q10, 1 ) );
- q2_Q10 = SKP_ADD32( q1_Q10, 1024 );
- } else if( r_Q10 > 512 ) {
- q1_Q10 = SKP_LSHIFT( SKP_RSHIFT_ROUND( r_Q10, 10 ), 10 );
- r_Q10 = SKP_SUB32( r_Q10, q1_Q10 );
- rd1_Q10 = SKP_RSHIFT( SKP_SMLABB( SKP_MUL( SKP_ADD32( q1_Q10, offset_Q10 ), Lambda_Q10 ), r_Q10, r_Q10 ), 10 );
- rd2_Q10 = SKP_ADD32( rd1_Q10, 1024 );
- rd2_Q10 = SKP_SUB32( rd2_Q10, SKP_SUB_LSHIFT32( Lambda_Q10, r_Q10, 1 ) );
- q2_Q10 = SKP_SUB32( q1_Q10, 1024 );
- } else { /* r_Q10 >= -1536 && q1_Q10 <= 512 */
- rr_Q20 = SKP_SMULBB( offset_Q10, Lambda_Q10 );
- rd2_Q10 = SKP_RSHIFT( SKP_SMLABB( rr_Q20, r_Q10, r_Q10 ), 10 );
- rd1_Q10 = SKP_ADD32( rd2_Q10, 1024 );
- rd1_Q10 = SKP_ADD32( rd1_Q10, SKP_SUB_RSHIFT32( SKP_ADD_LSHIFT32( Lambda_Q10, r_Q10, 1 ), rr_Q20, 9 ) );
- q1_Q10 = -1024;
- q2_Q10 = 0;
- }
-
- if( rd1_Q10 < rd2_Q10 ) {
- psSS[ 0 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd1_Q10 );
- psSS[ 1 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd2_Q10 );
- psSS[ 0 ].Q_Q10 = q1_Q10;
- psSS[ 1 ].Q_Q10 = q2_Q10;
- } else {
- psSS[ 0 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd2_Q10 );
- psSS[ 1 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd1_Q10 );
- psSS[ 0 ].Q_Q10 = q2_Q10;
- psSS[ 1 ].Q_Q10 = q1_Q10;
- }
-
- /* Update states for best quantization */
-
- /* Quantized excitation */
- exc_Q10 = SKP_ADD32( offset_Q10, psSS[ 0 ].Q_Q10 );
- exc_Q10 = ( exc_Q10 ^ dither ) - dither;
-
- /* Add predictions */
- LPC_exc_Q10 = exc_Q10 + SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 );
- xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 );
-
- /* Update states */
- sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 );
- psSS[ 0 ].sLTP_shp_Q10 = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 );
- psSS[ 0 ].LF_AR_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 );
- psSS[ 0 ].xq_Q14 = SKP_LSHIFT( xq_Q10, 4 );
- psSS[ 0 ].LPC_exc_Q16 = SKP_LSHIFT( LPC_exc_Q10, 6 );
-
- /* Update states for second best quantization */
-
- /* Quantized excitation */
- exc_Q10 = SKP_ADD32( offset_Q10, psSS[ 1 ].Q_Q10 );
- exc_Q10 = ( exc_Q10 ^ dither ) - dither;
-
- /* Add predictions */
- LPC_exc_Q10 = exc_Q10 + SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 );
- xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 );
-
- /* Update states */
- sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 );
- psSS[ 1 ].sLTP_shp_Q10 = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 );
- psSS[ 1 ].LF_AR_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 );
- psSS[ 1 ].xq_Q14 = SKP_LSHIFT( xq_Q10, 4 );
- psSS[ 1 ].LPC_exc_Q16 = SKP_LSHIFT( LPC_exc_Q10, 6 );
- }
-
- *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */
- last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */
-
- /* Find winner */
- RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
- Winner_ind = 0;
- for( k = 1; k < nStatesDelayedDecision; k++ ) {
- if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
- Winner_ind = k;
- }
- }
-
- /* Increase RD values of expired states */
- Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ];
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) {
- psSampleState[ k ][ 0 ].RD_Q10 = SKP_ADD32( psSampleState[ k ][ 0 ].RD_Q10, ( SKP_int32_MAX >> 4 ) );
- psSampleState[ k ][ 1 ].RD_Q10 = SKP_ADD32( psSampleState[ k ][ 1 ].RD_Q10, ( SKP_int32_MAX >> 4 ) );
- SKP_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 );
- }
- }
-
- /* Find worst in first set and best in second set */
- RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
- RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10;
- RDmax_ind = 0;
- RDmin_ind = 0;
- for( k = 1; k < nStatesDelayedDecision; k++ ) {
- /* find worst in first set */
- if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) {
- RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
- RDmax_ind = k;
- }
- /* find best in second set */
- if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10;
- RDmin_ind = k;
- }
- }
-
- /* Replace a state if best from second set outperforms worst in first set */
- if( RDmin_Q10 < RDmax_Q10 ) {
- SKP_Silk_copy_del_dec_state( &psDelDec[ RDmax_ind ], &psDelDec[ RDmin_ind ], i );
- SKP_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) );
- }
-
- /* Write samples from winner to output and long-term filter states */
- psDD = &psDelDec[ Winner_ind ];
- if( subfr > 0 || i >= decisionDelay ) {
- q[ i - decisionDelay ] = ( SKP_int )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 );
- xq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND(
- SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ], psDD->Gain_Q16[ last_smple_idx ] ), 10 ) );
- NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q10[ last_smple_idx ];
- sLTP_Q16[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q16[ last_smple_idx ];
- }
- NSQ->sLTP_shp_buf_idx++;
- NSQ->sLTP_buf_idx++;
-
- /* Update states */
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
- psSS = &psSampleState[ k ][ 0 ];
- psDD->LF_AR_Q12 = psSS->LF_AR_Q12;
- psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14;
- psDD->Xq_Q10[ *smpl_buf_idx ] = SKP_RSHIFT( psSS->xq_Q14, 4 );
- psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10;
- psDD->Pred_Q16[ *smpl_buf_idx ] = psSS->LPC_exc_Q16;
- psDD->Shape_Q10[ *smpl_buf_idx ] = psSS->sLTP_shp_Q10;
- psDD->Seed = SKP_ADD_RSHIFT32( psDD->Seed, psSS->Q_Q10, 10 );
- psDD->RandState[ *smpl_buf_idx ] = psDD->Seed;
- psDD->RD_Q10 = psSS->RD_Q10;
- psDD->Gain_Q16[ *smpl_buf_idx ] = Gain_Q16;
- }
- }
- /* Update LPC states */
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
- SKP_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
- }
-}
-
-SKP_INLINE void SKP_Silk_nsq_del_dec_scale_states(
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- const SKP_int16 x[], /* I Input in Q0 */
- SKP_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
- SKP_int length, /* I Length of input */
- SKP_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
- SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
- SKP_int subfr, /* I Subframe number */
- SKP_int nStatesDelayedDecision, /* I Number of del dec states */
- SKP_int smpl_buf_idx, /* I Index to newest samples in buffers */
- const SKP_int LTP_scale_Q14, /* I LTP state scaling */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int pitchL[ NB_SUBFR ] /* I Pitch lag */
-)
-{
- SKP_int i, k, scale_length, lag;
- SKP_int32 inv_gain_Q16, gain_adj_Q16, inv_gain_Q32;
- NSQ_del_dec_struct *psDD;
-
- inv_gain_Q16 = SKP_DIV32( SKP_int32_MAX, SKP_RSHIFT( Gains_Q16[ subfr ], 1 ) );
- inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX );
- lag = pitchL[ subfr ];
- /* After rewhitening the LTP state is un-scaled. So scale with inv_gain_Q16 */
- if( NSQ->rewhite_flag ) {
- inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 );
- if( subfr == 0 ) {
- /* Do LTP downscaling */
- inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, LTP_scale_Q14 ), 2 );
- }
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
- SKP_assert( i < MAX_FRAME_LENGTH );
- sLTP_Q16[ i ] = SKP_SMULWB( inv_gain_Q32, sLTP[ i ] );
- }
- }
-
- /* Adjust for changing gain */
- if( inv_gain_Q16 != NSQ->prev_inv_gain_Q16 ) {
- gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, NSQ->prev_inv_gain_Q16, 16 );
-
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
-
- /* Scale scalar states */
- psDD->LF_AR_Q12 = SKP_SMULWW( gain_adj_Q16, psDD->LF_AR_Q12 );
-
- /* scale short term state */
- for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
- psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - i - 1 ] = SKP_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - i - 1 ] );
- }
- for( i = 0; i < DECISION_DELAY; i++ ) {
- psDD->Pred_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->Pred_Q16[ i ] );
- psDD->Shape_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->Shape_Q10[ i ] );
- }
- }
-
- /* Scale long term shaping state */
-
- /* Calculate length to be scaled, Worst case: Next frame is voiced with max lag */
- scale_length = length * NB_SUBFR; /* aprox max lag */
- scale_length = scale_length - SKP_SMULBB( NB_SUBFR - ( subfr + 1 ), length ); /* subtract samples that will be too old in next frame */
- scale_length = SKP_max_int( scale_length, lag + LTP_ORDER ); /* make sure to scale whole pitch period if voiced */
-
- for( i = NSQ->sLTP_shp_buf_idx - scale_length; i < NSQ->sLTP_shp_buf_idx; i++ ) {
- NSQ->sLTP_shp_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q10[ i ] );
- }
-
- /* Scale LTP predict state */
- if( NSQ->rewhite_flag == 0 ) {
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
- sLTP_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, sLTP_Q16[ i ] );
- }
- }
- }
-
- /* Scale input */
- for( i = 0; i < length; i++ ) {
- x_sc_Q10[ i ] = SKP_RSHIFT( SKP_SMULBB( x[ i ], ( SKP_int16 )inv_gain_Q16 ), 6 );
- }
-
- /* save inv_gain */
- SKP_assert( inv_gain_Q16 != 0 );
- NSQ->prev_inv_gain_Q16 = inv_gain_Q16;
-}
-
-SKP_INLINE void SKP_Silk_copy_del_dec_state(
- NSQ_del_dec_struct *DD_dst, /* I Dst del dec state */
- NSQ_del_dec_struct *DD_src, /* I Src del dec state */
- SKP_int LPC_state_idx /* I Index to LPC buffer */
-)
-{
- SKP_memcpy( DD_dst->RandState, DD_src->RandState, DECISION_DELAY * sizeof( SKP_int ) );
- SKP_memcpy( DD_dst->Q_Q10, DD_src->Q_Q10, DECISION_DELAY * sizeof( SKP_int32 ) );
- SKP_memcpy( DD_dst->Pred_Q16, DD_src->Pred_Q16, DECISION_DELAY * sizeof( SKP_int32 ) );
- SKP_memcpy( DD_dst->Shape_Q10, DD_src->Shape_Q10, DECISION_DELAY * sizeof( SKP_int32 ) );
- SKP_memcpy( DD_dst->Xq_Q10, DD_src->Xq_Q10, DECISION_DELAY * sizeof( SKP_int32 ) );
-
- SKP_memcpy( &DD_dst->sLPC_Q14[ LPC_state_idx ], &DD_src->sLPC_Q14[ LPC_state_idx ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
- DD_dst->LF_AR_Q12 = DD_src->LF_AR_Q12;
- DD_dst->Seed = DD_src->Seed;
- DD_dst->SeedInit = DD_src->SeedInit;
- DD_dst->RD_Q10 = DD_src->RD_Q10;
-}
--- a/src/SKP_Silk_PLC.c
+++ /dev/null
@@ -1,389 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-#include "SKP_Silk_PLC.h"
-
-#define NB_ATT 2
-static const SKP_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /* 0.99, 0.95 */
-static const SKP_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /* 0.95, 0.8 */
-static const SKP_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /* 0.99, 0.9 */
-
-void SKP_Silk_PLC_Reset(
- SKP_Silk_decoder_state *psDec /* I/O Decoder state */
-)
-{
- psDec->sPLC.pitchL_Q8 = SKP_RSHIFT( psDec->frame_length, 1 );
-}
-
-void SKP_Silk_PLC(
- SKP_Silk_decoder_state *psDec, /* I Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */
- SKP_int16 signal[], /* O Concealed signal */
- SKP_int length, /* I length of residual */
- SKP_int lost /* I Loss flag */
-)
-{
- /* PLC control function */
- if( psDec->fs_kHz != psDec->sPLC.fs_kHz ) {
- SKP_Silk_PLC_Reset( psDec );
- psDec->sPLC.fs_kHz = psDec->fs_kHz;
- }
-
- if( lost ) {
- /****************************/
- /* Generate Signal */
- /****************************/
- SKP_Silk_PLC_conceal( psDec, psDecCtrl, signal, length );
- } else {
- /****************************/
- /* Update state */
- /****************************/
- SKP_Silk_PLC_update( psDec, psDecCtrl, signal, length );
- }
-}
-
-/**************************************************/
-/* Update state of PLC */
-/**************************************************/
-void SKP_Silk_PLC_update(
- SKP_Silk_decoder_state *psDec, /* (I/O) Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* (I/O) Decoder control */
- SKP_int16 signal[],
- SKP_int length
-)
-{
- SKP_int32 LTP_Gain_Q14, temp_LTP_Gain_Q14;
- SKP_int i, j;
- SKP_Silk_PLC_struct *psPLC;
-
- psPLC = &psDec->sPLC;
-
- /* Update parameters used in case of packet loss */
- psDec->prev_sigtype = psDecCtrl->sigtype;
- LTP_Gain_Q14 = 0;
- if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) {
- /* Find the parameters for the last subframe which contains a pitch pulse */
- for( j = 0; j * psDec->subfr_length < psDecCtrl->pitchL[ NB_SUBFR - 1 ]; j++ ) {
- temp_LTP_Gain_Q14 = 0;
- for( i = 0; i < LTP_ORDER; i++ ) {
- temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( NB_SUBFR - 1 - j ) * LTP_ORDER + i ];
- }
- if( temp_LTP_Gain_Q14 > LTP_Gain_Q14 ) {
- LTP_Gain_Q14 = temp_LTP_Gain_Q14;
- SKP_memcpy( psPLC->LTPCoef_Q14,
- &psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( NB_SUBFR - 1 - j, LTP_ORDER ) ],
- LTP_ORDER * sizeof( SKP_int16 ) );
-
- psPLC->pitchL_Q8 = SKP_LSHIFT( psDecCtrl->pitchL[ NB_SUBFR - 1 - j ], 8 );
- }
- }
-
-#if USE_SINGLE_TAP
- SKP_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ) );
- psPLC->LTPCoef_Q14[ LTP_ORDER / 2 ] = LTP_Gain_Q14;
-#endif
-
- /* Limit LT coefs */
- if( LTP_Gain_Q14 < V_PITCH_GAIN_START_MIN_Q14 ) {
- SKP_int scale_Q10;
- SKP_int32 tmp;
-
- tmp = SKP_LSHIFT( V_PITCH_GAIN_START_MIN_Q14, 10 );
- scale_Q10 = SKP_DIV32( tmp, SKP_max( LTP_Gain_Q14, 1 ) );
- for( i = 0; i < LTP_ORDER; i++ ) {
- psPLC->LTPCoef_Q14[ i ] = SKP_RSHIFT( SKP_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q10 ), 10 );
- }
- } else if( LTP_Gain_Q14 > V_PITCH_GAIN_START_MAX_Q14 ) {
- SKP_int scale_Q14;
- SKP_int32 tmp;
-
- tmp = SKP_LSHIFT( V_PITCH_GAIN_START_MAX_Q14, 14 );
- scale_Q14 = SKP_DIV32( tmp, SKP_max( LTP_Gain_Q14, 1 ) );
- for( i = 0; i < LTP_ORDER; i++ ) {
- psPLC->LTPCoef_Q14[ i ] = SKP_RSHIFT( SKP_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q14 ), 14 );
- }
- }
- } else {
- psPLC->pitchL_Q8 = SKP_LSHIFT( SKP_SMULBB( psDec->fs_kHz, 18 ), 8 );
- SKP_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ));
- }
-
- /* Save LPC coeficients */
- SKP_memcpy( psPLC->prevLPC_Q12, psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( SKP_int16 ) );
- psPLC->prevLTP_scale_Q14 = psDecCtrl->LTP_scale_Q14;
-
- /* Save Gains */
- SKP_memcpy( psPLC->prevGain_Q16, psDecCtrl->Gains_Q16, NB_SUBFR * sizeof( SKP_int32 ) );
-}
-
-void SKP_Silk_PLC_conceal(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[], /* O concealed signal */
- SKP_int length /* I length of residual */
-)
-{
- SKP_int i, j, k;
- SKP_int16 *B_Q14, exc_buf[ MAX_FRAME_LENGTH ], *exc_buf_ptr;
- SKP_int16 rand_scale_Q14, A_Q12_tmp[ MAX_LPC_ORDER ];
- SKP_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15;
- SKP_int lag, idx, shift1, shift2;
- SKP_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr, Atmp;
- SKP_int32 sig_Q10[ MAX_FRAME_LENGTH ], *sig_Q10_ptr, LPC_exc_Q10, LPC_pred_Q10, LTP_pred_Q14;
- SKP_Silk_PLC_struct *psPLC;
-
- psPLC = &psDec->sPLC;
-
- /* Update LTP buffer */
- SKP_memcpy( psDec->sLTP_Q16, &psDec->sLTP_Q16[ psDec->frame_length ], psDec->frame_length * sizeof( SKP_int32 ) );
-
- /* LPC concealment. Apply BWE to previous LPC */
- SKP_Silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, BWE_COEF_Q16 );
-
- /* Find random noise component */
- /* Scale previous excitation signal */
- exc_buf_ptr = exc_buf;
- for( k = ( NB_SUBFR >> 1 ); k < NB_SUBFR; k++ ) {
- for( i = 0; i < psDec->subfr_length; i++ ) {
- exc_buf_ptr[ i ] = ( SKP_int16 )SKP_RSHIFT(
- SKP_SMULWW( psDec->exc_Q10[ i + k * psDec->subfr_length ], psPLC->prevGain_Q16[ k ] ), 10 );
- }
- exc_buf_ptr += psDec->subfr_length;
- }
- /* Find the subframe with lowest energy of the last two and use that as random noise generator */
- SKP_Silk_sum_sqr_shift( &energy1, &shift1, exc_buf, psDec->subfr_length );
- SKP_Silk_sum_sqr_shift( &energy2, &shift2, &exc_buf[ psDec->subfr_length ], psDec->subfr_length );
-
- if( SKP_RSHIFT( energy1, shift2 ) < SKP_RSHIFT( energy1, shift2 ) ) {
- /* First sub-frame has lowest energy */
- rand_ptr = &psDec->exc_Q10[ SKP_max_int( 0, 3 * psDec->subfr_length - RAND_BUF_SIZE ) ];
- } else {
- /* Second sub-frame has lowest energy */
- rand_ptr = &psDec->exc_Q10[ SKP_max_int( 0, psDec->frame_length - RAND_BUF_SIZE ) ];
- }
-
- /* Setup Gain to random noise component */
- B_Q14 = psPLC->LTPCoef_Q14;
- rand_scale_Q14 = psPLC->randScale_Q14;
-
- /* Setup attenuation gains */
- harm_Gain_Q15 = HARM_ATT_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ];
- if( psDec->prev_sigtype == SIG_TYPE_VOICED ) {
- rand_Gain_Q15 = PLC_RAND_ATTENUATE_V_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ];
- } else {
- rand_Gain_Q15 = PLC_RAND_ATTENUATE_UV_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ];
- }
-
- /* First Lost frame */
- if( psDec->lossCnt == 0 ) {
- rand_scale_Q14 = (1 << 14 );
-
- /* Reduce random noise Gain for voiced frames */
- if( psDec->prev_sigtype == SIG_TYPE_VOICED ) {
- for( i = 0; i < LTP_ORDER; i++ ) {
- rand_scale_Q14 -= B_Q14[ i ];
- }
- rand_scale_Q14 = SKP_max_16( 3277, rand_scale_Q14 ); /* 0.2 */
- rand_scale_Q14 = ( SKP_int16 )SKP_RSHIFT( SKP_SMULBB( rand_scale_Q14, psPLC->prevLTP_scale_Q14 ), 14 );
- }
-
- /* Reduce random noise for unvoiced frames with high LPC gain */
- if( psDec->prev_sigtype == SIG_TYPE_UNVOICED ) {
- SKP_int32 invGain_Q30, down_scale_Q30;
-
- SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, psPLC->prevLPC_Q12, psDec->LPC_order );
-
- down_scale_Q30 = SKP_min_32( SKP_RSHIFT( ( 1 << 30 ), LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 );
- down_scale_Q30 = SKP_max_32( SKP_RSHIFT( ( 1 << 30 ), LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 );
- down_scale_Q30 = SKP_LSHIFT( down_scale_Q30, LOG2_INV_LPC_GAIN_HIGH_THRES );
-
- rand_Gain_Q15 = SKP_RSHIFT( SKP_SMULWB( down_scale_Q30, rand_Gain_Q15 ), 14 );
- }
- }
-
- rand_seed = psPLC->rand_seed;
- lag = SKP_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 );
- psDec->sLTP_buf_idx = psDec->frame_length;
-
- /***************************/
- /* LTP synthesis filtering */
- /***************************/
- sig_Q10_ptr = sig_Q10;
- for( k = 0; k < NB_SUBFR; k++ ) {
- /* Setup pointer */
- pred_lag_ptr = &psDec->sLTP_Q16[ psDec->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
- for( i = 0; i < psDec->subfr_length; i++ ) {
- rand_seed = SKP_RAND( rand_seed );
- idx = SKP_RSHIFT( rand_seed, 25 ) & RAND_BUF_MASK;
-
- /* Unrolled loop */
- LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], B_Q14[ 0 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], B_Q14[ 1 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], B_Q14[ 2 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], B_Q14[ 3 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], B_Q14[ 4 ] );
- pred_lag_ptr++;
-
- /* Generate LPC residual */
- LPC_exc_Q10 = SKP_LSHIFT( SKP_SMULWB( rand_ptr[ idx ], rand_scale_Q14 ), 2 ); /* Random noise part */
- LPC_exc_Q10 = SKP_ADD32( LPC_exc_Q10, SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) ); /* Harmonic part */
-
- /* Update states */
- psDec->sLTP_Q16[ psDec->sLTP_buf_idx ] = SKP_LSHIFT( LPC_exc_Q10, 6 );
- psDec->sLTP_buf_idx++;
-
- /* Save LPC residual */
- sig_Q10_ptr[ i ] = LPC_exc_Q10;
- }
- sig_Q10_ptr += psDec->subfr_length;
- /* Gradually reduce LTP gain */
- for( j = 0; j < LTP_ORDER; j++ ) {
- B_Q14[ j ] = SKP_RSHIFT( SKP_SMULBB( harm_Gain_Q15, B_Q14[ j ] ), 15 );
- }
- /* Gradually reduce excitation gain */
- rand_scale_Q14 = SKP_RSHIFT( SKP_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 );
-
- /* Slowly increase pitch lag */
- psPLC->pitchL_Q8 += SKP_SMULWB( psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 );
- psPLC->pitchL_Q8 = SKP_min_32( psPLC->pitchL_Q8, SKP_LSHIFT( SKP_SMULBB( MAX_PITCH_LAG_MS, psDec->fs_kHz ), 8 ) );
- lag = SKP_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 );
- }
-
- /***************************/
- /* LPC synthesis filtering */
- /***************************/
- sig_Q10_ptr = sig_Q10;
- /* Preload LPC coeficients to array on stack. Gives small performance gain */
- SKP_memcpy( A_Q12_tmp, psPLC->prevLPC_Q12, psDec->LPC_order * sizeof( SKP_int16 ) );
- SKP_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */
- for( k = 0; k < NB_SUBFR; k++ ) {
- for( i = 0; i < psDec->subfr_length; i++ ){
- /* unrolled */
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 0 ] ); /* read two coefficients at once */
- LPC_pred_Q10 = SKP_SMULWB( psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 2 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 4 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 6 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 8 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], Atmp );
- for( j = 10 ; j < psDec->LPC_order ; j+=2 ) {
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ j ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 1 - j ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 2 - j ], Atmp );
- }
-
- /* Add prediction to LPC residual */
- sig_Q10_ptr[ i ] = SKP_ADD32( sig_Q10_ptr[ i ], LPC_pred_Q10 );
-
- /* Update states */
- psDec->sLPC_Q14[ MAX_LPC_ORDER + i ] = SKP_LSHIFT( sig_Q10_ptr[ i ], 4 );
- }
- sig_Q10_ptr += psDec->subfr_length;
- /* Update LPC filter state */
- SKP_memcpy( psDec->sLPC_Q14, &psDec->sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) );
- }
-
- /* Scale with Gain */
- for( i = 0; i < psDec->frame_length; i++ ) {
- signal[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( sig_Q10[ i ], psPLC->prevGain_Q16[ NB_SUBFR - 1 ] ), 10 ) );
- }
-
- /**************************************/
- /* Update states */
- /**************************************/
- psPLC->rand_seed = rand_seed;
- psPLC->randScale_Q14 = rand_scale_Q14;
- for( i = 0; i < NB_SUBFR; i++ ) {
- psDecCtrl->pitchL[ i ] = lag;
- }
-}
-
-/* Glues concealed frames with new good recieved frames */
-void SKP_Silk_PLC_glue_frames(
- SKP_Silk_decoder_state *psDec, /* I/O decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[], /* I/O signal */
- SKP_int length /* I length of residual */
-)
-{
- SKP_int i, energy_shift;
- SKP_int32 energy;
- SKP_Silk_PLC_struct *psPLC;
- psPLC = &psDec->sPLC;
-
- if( psDec->lossCnt ) {
- /* Calculate energy in concealed residual */
- SKP_Silk_sum_sqr_shift( &psPLC->conc_energy, &psPLC->conc_energy_shift, signal, length );
-
- psPLC->last_frame_lost = 1;
- } else {
- if( psDec->sPLC.last_frame_lost ) {
- /* Calculate residual in decoded signal if last frame was lost */
- SKP_Silk_sum_sqr_shift( &energy, &energy_shift, signal, length );
-
- /* Normalize energies */
- if( energy_shift > psPLC->conc_energy_shift ) {
- psPLC->conc_energy = SKP_RSHIFT( psPLC->conc_energy, energy_shift - psPLC->conc_energy_shift );
- } else if( energy_shift < psPLC->conc_energy_shift ) {
- energy = SKP_RSHIFT( energy, psPLC->conc_energy_shift - energy_shift );
- }
-
- /* Fade in the energy difference */
- if( energy > psPLC->conc_energy ) {
- SKP_int32 frac_Q24, LZ;
- SKP_int32 gain_Q12, slope_Q12;
-
- LZ = SKP_Silk_CLZ32( psPLC->conc_energy );
- LZ = LZ - 1;
- psPLC->conc_energy = SKP_LSHIFT( psPLC->conc_energy, LZ );
- energy = SKP_RSHIFT( energy, SKP_max_32( 24 - LZ, 0 ) );
-
- frac_Q24 = SKP_DIV32( psPLC->conc_energy, SKP_max( energy, 1 ) );
-
- gain_Q12 = SKP_Silk_SQRT_APPROX( frac_Q24 );
- slope_Q12 = SKP_DIV32_16( ( 1 << 12 ) - gain_Q12, length );
-
- for( i = 0; i < length; i++ ) {
- signal[ i ] = SKP_RSHIFT( SKP_MUL( gain_Q12, signal[ i ] ), 12 );
- gain_Q12 += slope_Q12;
- gain_Q12 = SKP_min( gain_Q12, ( 1 << 12 ) );
- }
- }
- }
- psPLC->last_frame_lost = 0;
-
- }
-}
--- a/src/SKP_Silk_PLC.h
+++ /dev/null
@@ -1,79 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_PLC_FIX_H
-#define SKP_SILK_PLC_FIX_H
-
-#include "SKP_Silk_main_FIX.h"
-
-#define BWE_COEF_Q16 64880 /* 0.99 in Q16 */
-#define V_PITCH_GAIN_START_MIN_Q14 11469 /* 0.7 in Q14 */
-#define V_PITCH_GAIN_START_MAX_Q14 15565 /* 0.95 in Q14 */
-#define MAX_PITCH_LAG_MS 18
-#define SA_THRES_Q8 50
-#define USE_SINGLE_TAP 1
-#define RAND_BUF_SIZE 128
-#define RAND_BUF_MASK (RAND_BUF_SIZE - 1)
-#define LOG2_INV_LPC_GAIN_HIGH_THRES 4 /* 2^4 = 12 dB LPC gain */
-#define LOG2_INV_LPC_GAIN_LOW_THRES 8 /* 2^8 = 24 dB LPC gain */
-#define PITCH_DRIFT_FAC_Q16 655 /* 0.01 in Q16 */
-
-void SKP_Silk_PLC_Reset(
- SKP_Silk_decoder_state *psDec /* I/O Decoder state */
-);
-
-void SKP_Silk_PLC(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[], /* I/O signal */
- SKP_int length, /* I length of residual */
- SKP_int lost /* I Loss flag */
-);
-
-void SKP_Silk_PLC_update(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[],
- SKP_int length
-);
-
-void SKP_Silk_PLC_conceal(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[], /* O LPC residual signal */
- SKP_int length /* I length of signal */
-);
-
-void SKP_Silk_PLC_glue_frames(
- SKP_Silk_decoder_state *psDec, /* I/O decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[], /* I/O signal */
- SKP_int length /* I length of signal */
-);
-
-#endif
-
--- a/src/SKP_Silk_SigProc_FIX.h
+++ /dev/null
@@ -1,796 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef _SKP_SILK_SIGPROC_FIX_H_
-#define _SKP_SILK_SIGPROC_FIX_H_
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define SigProc_MAX_ORDER_LPC 16 /* max order of the LPC analysis in schur() and k2a() */
-#define SigProc_MAX_CORRELATION_LENGTH 640 /* max input length to the correlation */
-#include "SKP_Silk_typedef.h"
-#include <string.h>
-#include <stdlib.h> /* for abs() */
-#include "SKP_Silk_macros.h"
-#include "SKP_Silk_resample_rom.h"
-
-
-
-/********************************************************************/
-/* SIGNAL PROCESSING FUNCTIONS */
-/********************************************************************/
-
-/* downsample by a factor 2 */
-void SKP_Silk_resample_1_2(
- const SKP_int16 *in, /* I: 16 kHz signal [2*len] */
- SKP_int32 *S, /* I/O: State vector [6] */
- SKP_int16 *out, /* O: 8 kHz signal [len] */
- SKP_int32 *scratch, /* I: Scratch memory [4*len] */
- const SKP_int32 len /* I: Number of OUTPUT samples */
-);
-
-/*!
- * downsample by a factor 2, coarser (good for resampling audio)
- */
-void SKP_Silk_resample_1_2_coarse(
- const SKP_int16 *in, /* I: 16 kHz signal [2*len] */
- SKP_int32 *S, /* I/O: state vector [4] */
- SKP_int16 *out, /* O: 8 kHz signal [len] */
- SKP_int32 *scratch, /* I: scratch memory [3*len] */
- const SKP_int32 len /* I: number of OUTPUT samples */
-);
-
-/*!
- * downsample by a factor 2, coarsest (good for signals that are already oversampled, or for analysis purposes)
- */
-void SKP_Silk_resample_1_2_coarsest(
- const SKP_int16 *in, /* I: 16 kHz signal [2*len] */
- SKP_int32 *S, /* I/O: State vector [2] */
- SKP_int16 *out, /* O: 8 kHz signal [len] */
- SKP_int32 *scratch, /* I: Scratch memory [3*len] */
- const SKP_int32 len /* I: Number of OUTPUT samples */
-);
-
-/*!
- * upsample by a factor 2, coarser (good for resampling audio)
- */
-void SKP_Silk_resample_2_1_coarse(
- const SKP_int16 *in, /* I: 8 kHz signal [len] */
- SKP_int32 *S, /* I/O: State vector [4] */
- SKP_int16 *out, /* O: 16 kHz signal [2*len] */
- SKP_int32 *scratch, /* I: Scratch memory [3*len] */
- const SKP_int32 len /* I: Number of INPUT samples */
-);
-
-/*!
- * Resamples by a factor 1/3
- */
-void SKP_Silk_resample_1_3(
- SKP_int16 *out, /* O: Fs_low signal [inLen/3] */
- SKP_int32 *S, /* I/O: State vector [7] */
- const SKP_int16 *in, /* I: Fs_high signal [inLen] */
- const SKP_int32 inLen /* I: Input length, must be a multiple of 3 */
-);
-
-/*!
- * Resamples by a factor 3/1
- */
-void SKP_Silk_resample_3_1(
- SKP_int16 *out, /* O: Fs_high signal [inLen*3] */
- SKP_int32 *S, /* I/O: State vector [7] */
- const SKP_int16 *in, /* I: Fs_low signal [inLen] */
- const SKP_int32 inLen /* I: Input length */
-);
-
-/*!
- * Resamples by a factor 2/3
- */
-void SKP_Silk_resample_2_3(
- SKP_int16 *out, /* O: Fs_low signal [inLen * 2/3] */
- SKP_int32 *S, /* I/O: State vector [7+4] */
- const SKP_int16 *in, /* I: Fs_high signal [inLen] */
- const SKP_int inLen /* I: Input length, must be a multiple of 3 */
-);
-
-/*!
- * Resamples by a factor 3/2
- */
-void SKP_Silk_resample_3_2(
- SKP_int16 *out, /* O: Fs_high signal [inLen*3/2] */
- SKP_int32 *S, /* I/O: State vector [7+4] */
- const SKP_int16 *in, /* I: Fs_low signal [inLen] */
- SKP_int inLen /* I: Input length, must be a multiple of 2 */
-);
-
-/*!
- * Resamples by a factor 4/3
- */
-void SKP_Silk_resample_4_3(
- SKP_int16 *out, /* O: Fs_low signal [inLen * 4/3] */
- SKP_int32 *S, /* I/O: State vector [7+4+4] */
- const SKP_int16 *in, /* I: Fs_high signal [inLen] */
- const SKP_int inLen /* I: input length, must be a multiple of 3 */
-);
-
-/*!
- * Resamples by a factor 3/4
- */
- void SKP_Silk_resample_3_4(
- SKP_int16 *out, /* O: Fs_high signal [inLen*3/4] */
- SKP_int32 *S, /* I/O: State vector [7+2+6] */
- const SKP_int16 *in, /* I: Fs_low signal [inLen] */
- SKP_int inLen /* I: Input length, must be a multiple of 4 */
-);
-
-/*!
- * resample with a factor 2/3 coarse
- */
-void SKP_Silk_resample_2_3_coarse(
- SKP_int16 *out, /* O: Output signal */
- SKP_int16 *S, /* I/O: Resampler state [ SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ] */
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int frameLenIn, /* I: Number of input samples */
- SKP_int16 *scratch /* I: Scratch memory [ frameLenIn + SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ] */
-);
-
-/*!
- * resample with a factor 2/3 coarsest
- */
-void SKP_Silk_resample_2_3_coarsest(
- SKP_int16 *out, /* O: Output signal */
- SKP_int16 *S, /* I/O: Resampler state [ SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ] */
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int frameLenIn, /* I: Number of input samples */
- SKP_int16 *scratch /* I: Scratch memory [ frameLenIn + SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ] */
-);
-
-/*!
- * First order low-pass filter, with input as SKP_int16, running at 48 kHz
- */
-void SKP_Silk_lowpass_short(
- const SKP_int16 *in, /* I: Q15 48 kHz signal; [len] */
- SKP_int32 *S, /* I/O: Q25 state; length = 1 */
- SKP_int32 *out, /* O: Q25 48 kHz signal; [len] */
- const SKP_int32 len /* O: Signal length */
-);
-
-/*!
- * First order low-pass filter, with input as SKP_int32, running at 48 kHz
- */
-void SKP_Silk_lowpass_int(
- const SKP_int32 *in, /* I: Q25 48 kHz signal; length = len */
- SKP_int32 *S, /* I/O: Q25 state; length = 1 */
- SKP_int32 *out, /* O: Q25 48 kHz signal; length = len */
- const SKP_int32 len /* I: Number of samples */
-);
-
-/*!
- * First-order allpass filter
- */
-void SKP_Silk_allpass_int(
- const SKP_int32 *in, /* I: Q25 input signal [len] */
- SKP_int32 *S, /* I/O: Q25 state [1] */
- SKP_int A, /* I: Q15 coefficient (0 <= A < 32768) */
- SKP_int32 *out, /* O: Q25 output signal [len] */
- const SKP_int32 len /* I: Number of samples */
-);
-
-/*!
- * second order ARMA filter
- * can handle (slowly) varying coefficients
- */
-void SKP_Silk_biquad(
- const SKP_int16 *in, /* I: input signal */
- const SKP_int16 *B, /* I: MA coefficients, Q13 [3] */
- const SKP_int16 *A, /* I: AR coefficients, Q13 [2] */
- SKP_int32 *S, /* I/O: state vector [2] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len /* I: signal length */
-);
-/*!
- * second order ARMA filter;
- * slower than biquad() but uses more precise coefficients
- * can handle (slowly) varying coefficients
- */
-void SKP_Silk_biquad_alt(
- const SKP_int16 *in, /* I: input signal */
- const SKP_int32 *B_Q28, /* I: MA coefficients [3] */
- const SKP_int32 *A_Q28, /* I: AR coefficients [2] */
- SKP_int32 *S, /* I/O: state vector [2] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len /* I: signal length (must be even) */
-);
-
-/*!
- * variable order MA filter. Prediction error filter implementation. Coeficients negated and starting with coef to x[n - 1]
- */
-void SKP_Silk_MA_Prediction(
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
- SKP_int32 *S, /* I/O: State vector [order] */
- SKP_int16 *out, /* O: Output signal */
- const SKP_int32 len, /* I: Signal length */
- const SKP_int32 order /* I: Filter order */
-);
-
-void SKP_Silk_MA_Prediction_Q13(
- const SKP_int16 *in, /* I: input signal */
- const SKP_int16 *B, /* I: MA prediction coefficients, Q13 [order] */
- SKP_int32 *S, /* I/O: state vector [order] */
- SKP_int16 *out, /* O: output signal */
- SKP_int32 len, /* I: signal length */
- SKP_int32 order /* I: filter order */
-);
-
-/*!
- * 16th order AR filter for LPC synthesis, coefficients are in Q12
- */
-void SKP_Silk_LPC_synthesis_order16(
- const SKP_int16 *in, /* I: excitation signal */
- const SKP_int16 *A_Q12, /* I: AR coefficients [16], between -8_Q0 and 8_Q0 */
- const SKP_int32 Gain_Q26, /* I: gain */
- SKP_int32 *S, /* I/O: state vector [16] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len /* I: signal length, must be multiple of 16 */
-);
-
-/* variable order MA prediction error filter. */
-/* Inverse filter of SKP_Silk_LPC_synthesis_filter */
-void SKP_Silk_LPC_analysis_filter(
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
- SKP_int16 *S, /* I/O: State vector [order] */
- SKP_int16 *out, /* O: Output signal */
- const SKP_int32 len, /* I: Signal length */
- const SKP_int32 Order /* I: Filter order */
-);
-
-/* even order AR filter */
-void SKP_Silk_LPC_synthesis_filter(
- const SKP_int16 *in, /* I: excitation signal */
- const SKP_int16 *A_Q12, /* I: AR coefficients [Order], between -8_Q0 and 8_Q0 */
- const SKP_int32 Gain_Q26, /* I: gain */
- SKP_int32 *S, /* I/O: state vector [Order] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len, /* I: signal length */
- const SKP_int Order /* I: filter order, must be even */
-);
-
-/* Chirp (bandwidth expand) LP AR filter */
-void SKP_Silk_bwexpander(
- SKP_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */
- const SKP_int d, /* I Length of ar */
- SKP_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */
-);
-
-/* Chirp (bandwidth expand) LP AR filter */
-void SKP_Silk_bwexpander_32(
- SKP_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */
- const SKP_int d, /* I Length of ar */
- SKP_int32 chirp_Q16 /* I Chirp factor in Q16 */
-);
-
-/* Compute inverse of LPC prediction gain, and */
-/* test if LPC coefficients are stable (all poles within unit circle) */
-SKP_int SKP_Silk_LPC_inverse_pred_gain( /* O: Returns 1 if unstable, otherwise 0 */
- SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
- const SKP_int16 *A_Q12, /* I: Prediction coefficients, Q12 [order] */
- const SKP_int order /* I: Prediction order */
-);
-
-SKP_int SKP_Silk_LPC_inverse_pred_gain_Q13( /* O: returns 1 if unstable, otherwise 0 */
- SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
- const SKP_int16 *A_Q13, /* I: Prediction coefficients, Q13 [order] */
- const SKP_int order /* I: Prediction order */
-);
-
-/* split signal in two decimated bands using first-order allpass filters */
-void SKP_Silk_ana_filt_bank_1(
- const SKP_int16 *in, /* I: Input signal [N] */
- SKP_int32 *S, /* I/O: State vector [2] */
- SKP_int16 *outL, /* O: Low band [N/2] */
- SKP_int16 *outH, /* O: High band [N/2] */
- SKP_int32 *scratch, /* I: Scratch memory [3*N/2] */
- const SKP_int32 N /* I: Number of input samples */
-);
-
-/********************************************************************/
-/* SCALAR FUNCTIONS */
-/********************************************************************/
-
-/* approximation of 128 * log2() (exact inverse of approx 2^() below) */
-/* convert input to a log scale */
-SKP_int32 SKP_Silk_lin2log(const SKP_int32 inLin); /* I: input in linear scale */
-
-/* Approximation of a sigmoid function */
-SKP_int SKP_Silk_sigm_Q15(SKP_int in_Q5);
-
-/* approximation of 2^() (exact inverse of approx log2() above) */
-/* convert input to a linear scale */
-SKP_int32 SKP_Silk_log2lin(const SKP_int32 inLog_Q7); /* I: input on log scale */
-
-/* Function that returns the maximum absolut value of the input vector */
-SKP_int16 SKP_Silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */
- const SKP_int16 *vec, /* I Input vector [len] */
- const SKP_int32 len /* I Length of input vector */
-);
-
-/* Compute number of bits to right shift the sum of squares of a vector */
-/* of int16s to make it fit in an int32 */
-void SKP_Silk_sum_sqr_shift(
- SKP_int32 *energy, /* O Energy of x, after shifting to the right */
- SKP_int *shift, /* O Number of bits right shift applied to energy */
- const SKP_int16 *x, /* I Input vector */
- SKP_int len /* I Length of input vector */
-);
-
-/* Calculates the reflection coefficients from the correlation sequence */
-/* Faster than schur64(), but much less accurate. */
-/* Uses SMLAWB(), requiring armv5E and higher. */
-void SKP_Silk_schur(
- SKP_int16 *rc_Q15, /* O: reflection coefficients [order] Q15 */
- const SKP_int32 *c, /* I: correlations [order+1] */
- const SKP_int32 order /* I: prediction order */
-);
-
-/* Calculates the reflection coefficients from the correlation sequence */
-/* Slower than schur(), but more accurate. */
-/* Uses SMULL(), available on armv4 */
-SKP_int32 SKP_Silk_schur64( /* O: returns residual energy */
- SKP_int32 rc_Q16[], /* O: Reflection coefficients [order] Q16 */
- const SKP_int32 c[], /* I: Correlations [order+1] */
- SKP_int32 order /* I: Prediction order */
-);
-
-/* Step up function, converts reflection coefficients to prediction coefficients */
-void SKP_Silk_k2a(
- SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
- const SKP_int16 *rc_Q15, /* I: Reflection coefficients [order] Q15 */
- const SKP_int32 order /* I: Prediction order */
-);
-
-/* Step up function, converts reflection coefficients to prediction coefficients */
-void SKP_Silk_k2a_Q16(
- SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
- const SKP_int32 *rc_Q16, /* I: Reflection coefficients [order] Q16 */
- const SKP_int32 order /* I: Prediction order */
-);
-
-/* Apply sine window to signal vector. */
-/* Window types: */
-/* 0 -> sine window from 0 to pi */
-/* 1 -> sine window from 0 to pi/2 */
-/* 2 -> sine window from pi/2 to pi */
-/* every other sample of window is linearly interpolated, for speed */
-void SKP_Silk_apply_sine_window(
- SKP_int16 px_win[], /* O Pointer to windowed signal */
- const SKP_int16 px[], /* I Pointer to input signal */
- const SKP_int win_type, /* I Selects a window type */
- const SKP_int length /* I Window length, multiple of 4 */
-);
-
-/* Compute autocorrelation */
-void SKP_Silk_autocorr(
- SKP_int32 *results, /* O Result (length correlationCount) */
- SKP_int32 *scale, /* O Scaling of the correlation vector */
- const SKP_int16 *inputData, /* I Input data to correlate */
- const SKP_int inputDataSize, /* I Length of input */
- const SKP_int correlationCount /* I Number of correlation taps to compute */
-);
-
-/* Pitch estimator */
-#define SigProc_PITCH_EST_MIN_COMPLEX 0
-#define SigProc_PITCH_EST_MID_COMPLEX 1
-#define SigProc_PITCH_EST_MAX_COMPLEX 2
-
-void SKP_Silk_decode_pitch(
- SKP_int lagIndex, /* I */
- SKP_int contourIndex, /* O */
- SKP_int pitch_lags[], /* O 4 pitch values */
- SKP_int Fs_kHz /* I sampling frequency (kHz) */
-);
-
-SKP_int SKP_Silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */
- const SKP_int16 *signal, /* I Signal of length PITCH_EST_FRAME_LENGTH_MS*Fs_kHz */
- SKP_int *pitch_out, /* O 4 pitch lag values */
- SKP_int *lagIndex, /* O Lag Index */
- SKP_int *contourIndex, /* O Pitch contour Index */
- SKP_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */
- SKP_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */
- const SKP_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */
- const SKP_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */
- const SKP_int Fs_kHz, /* I Sample frequency (kHz) */
- const SKP_int complexity /* I Complexity setting, 0-2, where 2 is highest */
-);
-
-/* parameter defining the size and accuracy of the piecewise linear */
-/* cosine approximatin table. */
-
-#define LSF_COS_TAB_SZ_FIX 128
-/* rom table with cosine values */
-extern const SKP_int SKP_Silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ];
-
-void SKP_Silk_LPC_fit(
- SKP_int16 *a_QQ, /* O stabilized LPC vector, Q(24-rshift) [L] */
- SKP_int32 *a_Q24, /* I LPC vector [L] */
- const SKP_int QQ, /* I Q domain of output LPC vector */
- const SKP_int L /* I Number of LPC parameters in the input vector */
-);
-
-/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */
-/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */
-void SKP_Silk_A2NLSF(
- SKP_int *NLSF, /* O Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d] */
- SKP_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */
- const SKP_int d /* I Filter order (must be even) */
-);
-
-/* compute whitening filter coefficients from normalized line spectral frequencies */
-void SKP_Silk_NLSF2A(
- SKP_int16 *a, /* o monic whitening filter coefficients in Q12, [d] */
- const SKP_int *NLSF, /* i normalized line spectral frequencies in Q15, [d] */
- const SKP_int d /* i filter order (should be even) */
-);
-
-void SKP_Silk_insertion_sort_increasing(
- SKP_int32 *a, /* I/O Unsorted / Sorted vector */
- SKP_int *index, /* O: Index vector for the sorted elements */
- const SKP_int L, /* I: Vector length */
- const SKP_int K /* I: Number of correctly sorted positions */
-);
-
-void SKP_Silk_insertion_sort_decreasing(
- SKP_int *a, /* I/O: Unsorted / Sorted vector */
- SKP_int *index, /* O: Index vector for the sorted elements */
- const SKP_int L, /* I: Vector length */
- const SKP_int K /* I: Number of correctly sorted positions */
-);
-
-void SKP_Silk_insertion_sort_decreasing_int16(
- SKP_int16 *a, /* I/O: Unsorted / Sorted vector */
- SKP_int *index, /* O: Index vector for the sorted elements */
- const SKP_int L, /* I: Vector length */
- const SKP_int K /* I: Number of correctly sorted positions */
-);
-
-void SKP_Silk_insertion_sort_increasing_all_values(
- SKP_int *a, /* I/O: Unsorted / Sorted vector */
- const SKP_int L /* I: Vector length */
-);
-
-/* NLSF stabilizer, for a single input data vector */
-void SKP_Silk_NLSF_stabilize(
- SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vector in Q15 [L] */
- const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
- const SKP_int L /* I: Number of NLSF parameters in the input vector */
-);
-
-/* NLSF stabilizer, over multiple input column data vectors */
-void SKP_Silk_NLSF_stabilize_multi(
- SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vectors in Q15 [LxN] */
- const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
- const SKP_int N, /* I: Number of input vectors to be stabilized */
- const SKP_int L /* I: NLSF vector dimension */
-);
-
-/* Laroia low complexity NLSF weights */
-void SKP_Silk_NLSF_VQ_weights_laroia(
- SKP_int *pNLSFW_Q6, /* O: Pointer to input vector weights [D x 1] */
- const SKP_int *pNLSF_Q15, /* I: Pointer to input vector [D x 1] */
- const SKP_int D /* I: Input vector dimension (even) */
-);
-
-/* Compute reflection coefficients from input signal */
-void SKP_Silk_burg_modified(
- SKP_int32 *res_nrg, /* O residual energy */
- SKP_int *res_nrgQ, /* O residual energy Q value */
- SKP_int32 A_Q16[], /* O prediction coefficients (length order) */
- const SKP_int16 x[], /* I input signal, length: nb_subfr * ( D + subfr_length ) */
- const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */
- const SKP_int nb_subfr, /* I number of subframes stacked in x */
- const SKP_int32 WhiteNoiseFrac_Q32, /* I fraction added to zero-lag autocorrelation */
- const SKP_int D /* I order */
-);
-
-/* Multiply a vector by a constant */
-void SKP_Silk_scale_vector16_Q14(
- SKP_int16 *data1,
- SKP_int gain_Q14, /* Gain in Q14 */
- SKP_int dataSize
-);
-
-/* Copy and multiply a vector by a constant */
-void SKP_Silk_scale_copy_vector16(
- SKP_int16 *data_out,
- const SKP_int16 *data_in,
- SKP_int32 gain_Q16, /* I: gain in Q16 */
- const SKP_int dataSize /* I: length */
-);
-
-void SKP_Silk_scale_vector32_16_Q14(
- SKP_int32 *data1, /* I/O: Q0/Q0 */
- SKP_int gain_Q14, /* I: Q14 */
- SKP_int dataSize /* I: length */
-);
-
-/* Multiply a vector by a constant, does not saturate output data */
-void SKP_Silk_scale_vector32_Q16(
- SKP_int32 *data1, /* I/O: Q0/Q0 */
- SKP_int32 gain_Q16, /* I: gain in Q16 ( SKP_int16_MIN <= gain_Q16 <= SKP_int16_MAX + 65536 ) */
- const SKP_int dataSize /* I: length */
-);
-
-/* Some for the LTP related function requires Q26 to work.*/
-void SKP_Silk_scale_vector32_Q26_lshift_18(
- SKP_int32 *data1, /* I/O: Q0/Q18 */
- SKP_int32 gain_Q26, /* I: Q26 */
- SKP_int dataSize /* I: length */
-);
-
-/********************************************************************/
-/* INLINE ARM MATH */
-/********************************************************************/
-
-/* return sum(inVec1[i]*inVec2[i]) */
-/* inVec1 and inVec2 should be increasing ordered, and starting address should be 4 byte aligned. (a factor of 4)*/
-SKP_int32 SKP_Silk_inner_prod_aligned(
- const SKP_int16* const inVec1, /* I input vector 1 */
- const SKP_int16* const inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-);
-
-SKP_int32 SKP_Silk_inner_prod16_aligned_sat(
- const SKP_int16* const inVec1, /* I input vector 1 */
- const SKP_int16* const inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-);
-
-SKP_int64 SKP_Silk_inner_prod_aligned_64(
- const SKP_int32 *inVec1, /* I input vector 1 */
- const SKP_int32 *inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-);
-
-SKP_int64 SKP_Silk_inner_prod16_aligned_64(
- const SKP_int16 *inVec1, /* I input vector 1 */
- const SKP_int16 *inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-);
-/********************************************************************/
-/* MACROS */
-/********************************************************************/
-
-/* Define 4-byte aligned array of SKP_int16 */
-#define SKP_array_of_int16_4_byte_aligned( arrayName, nElements ) \
- SKP_int32 dummy_int32 ## arrayName; \
- SKP_int16 arrayName[ (nElements) ]
-
-/* Useful Macros that can be adjusted to other platforms */
-#define SKP_memcpy(a, b, c) memcpy((a), (b), (c)) /* Dest, Src, ByteCount */
-#define SKP_memset(a, b, c) memset((a), (b), (c)) /* Dest, value, ByteCount */
-#define SKP_memmove(a, b, c) memmove((a), (b), (c)) /* Dest, Src, ByteCount */
-/* fixed point macros */
-
-// (a32 * b32) output have to be 32bit int
-#define SKP_MUL(a32, b32) ((a32) * (b32))
-
-// (a32 * b32) output have to be 32bit uint
-#define SKP_MUL_uint(a32, b32) SKP_MUL(a32, b32)
-
-// a32 + (b32 * c32) output have to be 32bit int
-#define SKP_MLA(a32, b32, c32) SKP_ADD32((a32),((b32) * (c32)))
-
-// a32 + (b32 * c32) output have to be 32bit uint
-#define SKP_MLA_uint(a32, b32, c32) SKP_MLA(a32, b32, c32)
-
-// ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int
-#define SKP_SMULTT(a32, b32) (((a32) >> 16) * ((b32) >> 16))
-
-// a32 + ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int
-#define SKP_SMLATT(a32, b32, c32) SKP_ADD32((a32),((b32) >> 16) * ((c32) >> 16))
-
-#define SKP_SMLALBB(a64, b16, c16) SKP_ADD64((a64),(SKP_int64)((SKP_int32)(b16) * (SKP_int32)(c16)))
-
-// (a32 * b32)
-#define SKP_SMULL(a32, b32) ((SKP_int64)(a32) * /*(SKP_int64)*/(b32))
-
-// multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)
-#define SKP_MLA_ovflw(a32, b32, c32) SKP_MLA(a32, b32, c32)
-#ifndef SKP_SMLABB_ovflw
-# define SKP_SMLABB_ovflw(a32, b32, c32) SKP_SMLABB(a32, b32, c32)
-#endif
-#define SKP_SMLABT_ovflw(a32, b32, c32) SKP_SMLABT(a32, b32, c32)
-#define SKP_SMLATT_ovflw(a32, b32, c32) SKP_SMLATT(a32, b32, c32)
-#define SKP_SMLAWB_ovflw(a32, b32, c32) SKP_SMLAWB(a32, b32, c32)
-#define SKP_SMLAWT_ovflw(a32, b32, c32) SKP_SMLAWT(a32, b32, c32)
-
-#define SKP_DIV64_32(a64, b32) ((a64)/(b32)) /* TODO: rewrite it as a set of SKP_DIV32.*/
-
-#define SKP_DIV32_16(a32, b16) ((SKP_int32)((a32) / (b16)))
-#define SKP_DIV32(a32, b32) ((SKP_int32)((a32) / (b32)))
-
-// These macros enables checking for overflow in SKP_Silk_API_Debug.h
-#define SKP_ADD16(a, b) ((a) + (b))
-#define SKP_ADD32(a, b) ((a) + (b))
-#define SKP_ADD64(a, b) ((a) + (b))
-
-#define SKP_SUB16(a, b) ((a) - (b))
-#define SKP_SUB32(a, b) ((a) - (b))
-#define SKP_SUB64(a, b) ((a) - (b))
-
-#define SKP_SAT8(a) ((a) > SKP_int8_MAX ? SKP_int8_MAX : \
- ((a) < SKP_int8_MIN ? SKP_int8_MIN : (a)))
-#define SKP_SAT16(a) ((a) > SKP_int16_MAX ? SKP_int16_MAX : \
- ((a) < SKP_int16_MIN ? SKP_int16_MIN : (a)))
-#define SKP_SAT32(a) ((a) > SKP_int32_MAX ? SKP_int32_MAX : \
- ((a) < SKP_int32_MIN ? SKP_int32_MIN : (a)))
-
-#define SKP_CHECK_FIT8(a) (a)
-#define SKP_CHECK_FIT16(a) (a)
-#define SKP_CHECK_FIT32(a) (a)
-
-#define SKP_ADD_SAT16(a, b) (SKP_int16)SKP_SAT16( SKP_ADD32( (SKP_int32)(a), (b) ) )
-#define SKP_ADD_SAT64(a, b) ((((a) + (b)) & 0x8000000000000000LL) == 0 ? \
- ((((a) & (b)) & 0x8000000000000000LL) != 0 ? SKP_int64_MIN : (a)+(b)) : \
- ((((a) | (b)) & 0x8000000000000000LL) == 0 ? SKP_int64_MAX : (a)+(b)) )
-
-#define SKP_SUB_SAT16(a, b) (SKP_int16)SKP_SAT16( SKP_SUB32( (SKP_int32)(a), (b) ) )
-#define SKP_SUB_SAT64(a, b) ((((a)-(b)) & 0x8000000000000000LL) == 0 ? \
- (( (a) & ((b)^0x8000000000000000LL) & 0x8000000000000000LL) ? SKP_int64_MIN : (a)-(b)) : \
- ((((a)^0x8000000000000000LL) & (b) & 0x8000000000000000LL) ? SKP_int64_MAX : (a)-(b)) )
-
-/* Saturation for positive input values */
-#define SKP_POS_SAT32(a) ((a) > SKP_int32_MAX ? SKP_int32_MAX : (a))
-
-/* Add with saturation for positive input values */
-#define SKP_ADD_POS_SAT8(a, b) ((((a)+(b)) & 0x80) ? SKP_int8_MAX : ((a)+(b)))
-#define SKP_ADD_POS_SAT16(a, b) ((((a)+(b)) & 0x8000) ? SKP_int16_MAX : ((a)+(b)))
-#define SKP_ADD_POS_SAT32(a, b) ((((a)+(b)) & 0x80000000) ? SKP_int32_MAX : ((a)+(b)))
-#define SKP_ADD_POS_SAT64(a, b) ((((a)+(b)) & 0x8000000000000000LL) ? SKP_int64_MAX : ((a)+(b)))
-
-#define SKP_LSHIFT8(a, shift) ((a)<<(shift)) // shift >= 0, shift < 8
-#define SKP_LSHIFT16(a, shift) ((a)<<(shift)) // shift >= 0, shift < 16
-#define SKP_LSHIFT32(a, shift) ((a)<<(shift)) // shift >= 0, shift < 32
-#define SKP_LSHIFT64(a, shift) ((a)<<(shift)) // shift >= 0, shift < 64
-#define SKP_LSHIFT(a, shift) SKP_LSHIFT32(a, shift) // shift >= 0, shift < 32
-
-#define SKP_RSHIFT8(a, shift) ((a)>>(shift)) // shift >= 0, shift < 8
-#define SKP_RSHIFT16(a, shift) ((a)>>(shift)) // shift >= 0, shift < 16
-#define SKP_RSHIFT32(a, shift) ((a)>>(shift)) // shift >= 0, shift < 32
-#define SKP_RSHIFT64(a, shift) ((a)>>(shift)) // shift >= 0, shift < 64
-#define SKP_RSHIFT(a, shift) SKP_RSHIFT32(a, shift) // shift >= 0, shift < 32
-
-/* saturates before shifting */
-#define SKP_LSHIFT_SAT16(a, shift) (SKP_LSHIFT16( SKP_LIMIT( (a), SKP_RSHIFT16( SKP_int16_MIN, (shift) ), \
- SKP_RSHIFT16( SKP_int16_MAX, (shift) ) ), (shift) ))
-#define SKP_LSHIFT_SAT32(a, shift) (SKP_LSHIFT32( SKP_LIMIT( (a), SKP_RSHIFT32( SKP_int32_MIN, (shift) ), \
- SKP_RSHIFT32( SKP_int32_MAX, (shift) ) ), (shift) ))
-
-#define SKP_LSHIFT_ovflw(a, shift) ((a)<<(shift)) // shift >= 0, allowed to overflow
-#define SKP_LSHIFT_uint(a, shift) ((a)<<(shift)) // shift >= 0
-#define SKP_RSHIFT_uint(a, shift) ((a)>>(shift)) // shift >= 0
-
-#define SKP_ADD_LSHIFT(a, b, shift) ((a) + SKP_LSHIFT((b), (shift))) // shift >= 0
-#define SKP_ADD_LSHIFT32(a, b, shift) SKP_ADD32((a), SKP_LSHIFT32((b), (shift))) // shift >= 0
-#define SKP_ADD_LSHIFT_uint(a, b, shift) ((a) + SKP_LSHIFT_uint((b), (shift))) // shift >= 0
-#define SKP_ADD_RSHIFT(a, b, shift) ((a) + SKP_RSHIFT((b), (shift))) // shift >= 0
-#define SKP_ADD_RSHIFT32(a, b, shift) SKP_ADD32((a), SKP_RSHIFT32((b), (shift))) // shift >= 0
-#define SKP_ADD_RSHIFT_uint(a, b, shift) ((a) + SKP_RSHIFT_uint((b), (shift))) // shift >= 0
-#define SKP_SUB_LSHIFT32(a, b, shift) SKP_SUB32((a), SKP_LSHIFT32((b), (shift))) // shift >= 0
-#define SKP_SUB_RSHIFT32(a, b, shift) SKP_SUB32((a), SKP_RSHIFT32((b), (shift))) // shift >= 0
-
-/* Requires that shift > 0 */
-#define SKP_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
-#define SKP_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
-
-/* Number of rightshift required to fit the multiplication */
-#define SKP_NSHIFT_MUL_32_32(a, b) ( -(31- (32-SKP_Silk_CLZ32(SKP_abs(a)) + (32-SKP_Silk_CLZ32(SKP_abs(b))))) )
-#define SKP_NSHIFT_MUL_16_16(a, b) ( -(15- (16-SKP_Silk_CLZ16(SKP_abs(a)) + (16-SKP_Silk_CLZ16(SKP_abs(b))))) )
-
-
-#define SKP_min(a, b) (((a) < (b)) ? (a) : (b))
-#define SKP_max(a, b) (((a) > (b)) ? (a) : (b))
-
-/* Macro to convert floating-point constants to fixed-point */
-#define SKP_FIX_CONST( C, Q ) ((SKP_int32)((C) * (1 << (Q)) + 0.5))
-
-/* SKP_min() versions with typecast in the function call */
-SKP_INLINE SKP_int SKP_min_int(SKP_int a, SKP_int b)
-{
- return (((a) < (b)) ? (a) : (b));
-}
-SKP_INLINE SKP_int16 SKP_min_16(SKP_int16 a, SKP_int16 b)
-{
- return (((a) < (b)) ? (a) : (b));
-}
-SKP_INLINE SKP_int32 SKP_min_32(SKP_int32 a, SKP_int32 b)
-{
- return (((a) < (b)) ? (a) : (b));
-}
-SKP_INLINE SKP_int64 SKP_min_64(SKP_int64 a, SKP_int64 b)
-{
- return (((a) < (b)) ? (a) : (b));
-}
-
-/* SKP_min() versions with typecast in the function call */
-SKP_INLINE SKP_int SKP_max_int(SKP_int a, SKP_int b)
-{
- return (((a) > (b)) ? (a) : (b));
-}
-SKP_INLINE SKP_int16 SKP_max_16(SKP_int16 a, SKP_int16 b)
-{
- return (((a) > (b)) ? (a) : (b));
-}
-SKP_INLINE SKP_int32 SKP_max_32(SKP_int32 a, SKP_int32 b)
-{
- return (((a) > (b)) ? (a) : (b));
-}
-SKP_INLINE SKP_int64 SKP_max_64(SKP_int64 a, SKP_int64 b)
-{
- return (((a) > (b)) ? (a) : (b));
-}
-
-#define SKP_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
- : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))))
-
-//#define SKP_non_neg(a) ((a) & ((-(a)) >> (8 * sizeof(a) - 1))) /* doesn't seem faster than SKP_max(0, a);
-
-#define SKP_abs(a) (((a) > 0) ? (a) : -(a)) // Be careful, SKP_abs returns wrong when input equals to SKP_intXX_MIN
-#define SKP_abs_int(a) (((a) ^ ((a) >> (8 * sizeof(a) - 1))) - ((a) >> (8 * sizeof(a) - 1)))
-#define SKP_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31))
-#define SKP_abs_int64(a) (((a) > 0) ? (a) : -(a))
-
-#define SKP_sign(a) ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 ))
-
-#define SKP_sqrt(a) (sqrt(a))
-
-/* PSEUDO-RANDOM GENERATOR */
-/* Make sure to store the result as the seed for the next call (also in between */
-/* frames), otherwise result won't be random at all. When only using some of the */
-/* bits, take the most significant bits by right-shifting. Do not just mask off */
-/* the lowest bits. */
-#define SKP_RAND(seed) (SKP_MLA_ovflw(907633515, (seed), 196314165))
-
-// Add some multiplication functions that can be easily mapped to ARM.
-
-// SKP_SMMUL: Signed top word multiply.
-// ARMv6 2 instruction cycles.
-// ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.(except xM)
-//#define SKP_SMMUL(a32, b32) (SKP_int32)SKP_RSHIFT(SKP_SMLAL(SKP_SMULWB((a32), (b32)), (a32), SKP_RSHIFT_ROUND((b32), 16)), 16)
-// the following seems faster on x86
-#define SKP_SMMUL(a32, b32) (SKP_int32)SKP_RSHIFT64(SKP_SMULL((a32), (b32)), 32)
-
-#include "SKP_Silk_Inlines.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/SKP_Silk_VAD.c
+++ /dev/null
@@ -1,320 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/*
- * File Name: SKP_Silk_VAD.c
- * Description: Silk VAD.
- */
-
-#include <stdlib.h>
-#include "SKP_Silk_main.h"
-
-/**********************************/
-/* Initialization of the Silk VAD */
-/**********************************/
-SKP_int SKP_Silk_VAD_Init( /* O Return value, 0 if success */
- SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
-)
-{
- SKP_int b, ret = 0;
-
- /* reset state memory */
- SKP_memset( psSilk_VAD, 0, sizeof( SKP_Silk_VAD_state ) );
-
- /* init noise levels */
- /* Initialize array with approx pink noise levels (psd proportional to inverse of frequency) */
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- psSilk_VAD->NoiseLevelBias[ b ] = SKP_max_32( SKP_DIV32_16( VAD_NOISE_LEVELS_BIAS, b + 1 ), 1 );
- }
-
- /* Initialize state */
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- psSilk_VAD->NL[ b ] = SKP_MUL( 100, psSilk_VAD->NoiseLevelBias[ b ] );
- psSilk_VAD->inv_NL[ b ] = SKP_DIV32( SKP_int32_MAX, psSilk_VAD->NL[ b ] );
- }
- psSilk_VAD->counter = 15;
-
- /* init smoothed energy-to-noise ratio*/
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- psSilk_VAD->NrgRatioSmth_Q8[ b ] = 100 * 256; /* 100 * 256 --> 20 dB SNR */
- }
-
- return( ret );
-}
-
-/* Weighting factors for tilt measure */
-const static SKP_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -12000 };
-
-/***************************************/
-/* Get the speech activity level in Q8 */
-/***************************************/
-SKP_int SKP_Silk_VAD_GetSA_Q8( /* O Return value, 0 if success */
- SKP_Silk_VAD_state *psSilk_VAD, /* I/O Silk VAD state */
- SKP_int *pSA_Q8, /* O Speech activity level in Q8 */
- SKP_int *pSNR_dB_Q7, /* O SNR for current frame in Q7 */
- SKP_int pQuality_Q15[ VAD_N_BANDS ], /* O Smoothed SNR for each band */
- SKP_int *pTilt_Q15, /* O current frame's frequency tilt */
- const SKP_int16 pIn[], /* I PCM input [framelength] */
- const SKP_int framelength /* I Input frame length */
-)
-{
- SKP_int SA_Q15, input_tilt;
- SKP_int32 scratch[ 3 * MAX_FRAME_LENGTH / 2 ];
- SKP_int decimated_framelength, dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s;
- SKP_int32 sumSquared, smooth_coef_Q16;
- SKP_int16 HPstateTmp;
-
- SKP_int16 X[ VAD_N_BANDS ][ MAX_FRAME_LENGTH / 2 ];
- SKP_int32 Xnrg[ VAD_N_BANDS ];
- SKP_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ];
- SKP_int32 speech_nrg, x_tmp;
- SKP_int ret = 0;
-
- /* Safety checks */
- SKP_assert( VAD_N_BANDS == 4 );
- SKP_assert( MAX_FRAME_LENGTH >= framelength );
- SKP_assert( framelength <= 512 );
-
- /***********************/
- /* Filter and Decimate */
- /***********************/
- /* 0-8 kHz to 0-4 kHz and 4-8 kHz */
- SKP_Silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], &X[ 0 ][ 0 ], &X[ 3 ][ 0 ], &scratch[ 0 ], framelength );
-
- /* 0-4 kHz to 0-2 kHz and 2-4 kHz */
- SKP_Silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState1[ 0 ], &X[ 0 ][ 0 ], &X[ 2 ][ 0 ], &scratch[ 0 ], SKP_RSHIFT( framelength, 1 ) );
-
- /* 0-2 kHz to 0-1 kHz and 1-2 kHz */
- SKP_Silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState2[ 0 ], &X[ 0 ][ 0 ], &X[ 1 ][ 0 ], &scratch[ 0 ], SKP_RSHIFT( framelength, 2 ) );
-
- /*********************************************/
- /* HP filter on lowest band (differentiator) */
- /*********************************************/
- decimated_framelength = SKP_RSHIFT( framelength, 3 );
- X[ 0 ][ decimated_framelength - 1 ] = SKP_RSHIFT( X[ 0 ][ decimated_framelength - 1 ], 1 );
- HPstateTmp = X[ 0 ][ decimated_framelength - 1 ];
- for( i = decimated_framelength - 1; i > 0; i-- ) {
- X[ 0 ][ i - 1 ] = SKP_RSHIFT( X[ 0 ][ i - 1 ], 1 );
- X[ 0 ][ i ] -= X[ 0 ][ i - 1 ];
- }
- X[ 0 ][ 0 ] -= psSilk_VAD->HPstate;
- psSilk_VAD->HPstate = HPstateTmp;
-
- /*************************************/
- /* Calculate the energy in each band */
- /*************************************/
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- /* Find the decimated framelength in the non-uniformly divided bands */
- decimated_framelength = SKP_RSHIFT( framelength, SKP_min_int( VAD_N_BANDS - b, VAD_N_BANDS - 1 ) );
-
- /* Split length into subframe lengths */
- dec_subframe_length = SKP_RSHIFT( decimated_framelength, VAD_INTERNAL_SUBFRAMES_LOG2 );
- dec_subframe_offset = 0;
-
- /* Compute energy per sub-frame */
- /* initialize with summed energy of last subframe */
- Xnrg[ b ] = psSilk_VAD->XnrgSubfr[ b ];
- for( s = 0; s < VAD_INTERNAL_SUBFRAMES; s++ ) {
- sumSquared = 0;
- for( i = 0; i < dec_subframe_length; i++ ) {
- /* The energy will be less than dec_subframe_length * ( SKP_int16_MIN / 8 )^2. */
- /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */
- x_tmp = SKP_RSHIFT( X[ b ][ i + dec_subframe_offset ], 3 );
- sumSquared = SKP_SMLABB( sumSquared, x_tmp, x_tmp );
-
- /* Safety check */
- SKP_assert( sumSquared >= 0 );
- }
-
- /* add/saturate summed energy of current subframe */
- if( s < VAD_INTERNAL_SUBFRAMES - 1 ) {
- Xnrg[ b ] = SKP_ADD_POS_SAT32( Xnrg[ b ], sumSquared );
- } else {
- /* look-ahead subframe */
- Xnrg[ b ] = SKP_ADD_POS_SAT32( Xnrg[ b ], SKP_RSHIFT( sumSquared, 1 ) );
- }
-
- dec_subframe_offset += dec_subframe_length;
- }
- psSilk_VAD->XnrgSubfr[ b ] = sumSquared;
- }
-
- /********************/
- /* Noise estimation */
- /********************/
- SKP_Silk_VAD_GetNoiseLevels( &Xnrg[ 0 ], psSilk_VAD );
-
- /***********************************************/
- /* Signal-plus-noise to noise ratio estimation */
- /***********************************************/
- sumSquared = 0;
- input_tilt = 0;
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- speech_nrg = Xnrg[ b ] - psSilk_VAD->NL[ b ];
- if( speech_nrg > 0 ) {
- /* Divide, with sufficient resolution */
- if( ( Xnrg[ b ] & 0xFF800000 ) == 0 ) {
- NrgToNoiseRatio_Q8[ b ] = SKP_DIV32( SKP_LSHIFT( Xnrg[ b ], 8 ), psSilk_VAD->NL[ b ] + 1 );
- } else {
- NrgToNoiseRatio_Q8[ b ] = SKP_DIV32( Xnrg[ b ], SKP_RSHIFT( psSilk_VAD->NL[ b ], 8 ) + 1 );
- }
-
- /* Convert to log domain */
- SNR_Q7 = SKP_Silk_lin2log( NrgToNoiseRatio_Q8[ b ] ) - 8 * 128;
-
- /* Sum-of-squares */
- sumSquared = SKP_SMLABB( sumSquared, SNR_Q7, SNR_Q7 ); /* Q14 */
-
- /* Tilt measure */
- if( speech_nrg < ( 1 << 20 ) ) {
- /* Scale down SNR value for small subband speech energies */
- SNR_Q7 = SKP_SMULWB( SKP_LSHIFT( SKP_Silk_SQRT_APPROX( speech_nrg ), 6 ), SNR_Q7 );
- }
- input_tilt = SKP_SMLAWB( input_tilt, tiltWeights[ b ], SNR_Q7 );
- } else {
- NrgToNoiseRatio_Q8[ b ] = 256;
- }
- }
-
- /* Mean-of-squares */
- sumSquared = SKP_DIV32_16( sumSquared, VAD_N_BANDS ); /* Q14 */
-
- /* Root-mean-square approximation, scale to dBs, and write to output pointer */
- *pSNR_dB_Q7 = ( SKP_int16 )( 3 * SKP_Silk_SQRT_APPROX( sumSquared ) ); /* Q7 */
-
- /*********************************/
- /* Speech Probability Estimation */
- /*********************************/
- SA_Q15 = SKP_Silk_sigm_Q15( SKP_SMULWB( VAD_SNR_FACTOR_Q16, *pSNR_dB_Q7 ) - VAD_NEGATIVE_OFFSET_Q5 );
-
- /**************************/
- /* Frequency Tilt Measure */
- /**************************/
- *pTilt_Q15 = SKP_LSHIFT( SKP_Silk_sigm_Q15( input_tilt ) - 16384, 1 );
-
- /**************************************************/
- /* Scale the sigmoid output based on power levels */
- /**************************************************/
- speech_nrg = 0;
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- /* Accumulate signal-without-noise energies, higher frequency bands have more weight */
- speech_nrg += ( b + 1 ) * SKP_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 );
- }
-
- /* Power scaling */
- if( speech_nrg <= 0 ) {
- SA_Q15 = SKP_RSHIFT( SA_Q15, 1 );
- } else if( speech_nrg < 32768 ) {
- /* square-root */
- speech_nrg = SKP_Silk_SQRT_APPROX( SKP_LSHIFT( speech_nrg, 15 ) );
- SA_Q15 = SKP_SMULWB( 32768 + speech_nrg, SA_Q15 );
- }
-
- /* Copy the resulting speech activity in Q8 to *pSA_Q8 */
- *pSA_Q8 = SKP_min_int( SKP_RSHIFT( SA_Q15, 7 ), SKP_uint8_MAX );
-
- /***********************************/
- /* Energy Level and SNR estimation */
- /***********************************/
- /* smoothing coefficient */
- smooth_coef_Q16 = SKP_SMULWB( VAD_SNR_SMOOTH_COEF_Q18, SKP_SMULWB( SA_Q15, SA_Q15 ) );
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- /* compute smoothed energy-to-noise ratio per band */
- psSilk_VAD->NrgRatioSmth_Q8[ b ] = SKP_SMLAWB( psSilk_VAD->NrgRatioSmth_Q8[ b ],
- NrgToNoiseRatio_Q8[ b ] - psSilk_VAD->NrgRatioSmth_Q8[ b ], smooth_coef_Q16 );
-
- /* signal to noise ratio in dB per band */
- SNR_Q7 = 3 * ( SKP_Silk_lin2log( psSilk_VAD->NrgRatioSmth_Q8[b] ) - 8 * 128 );
- /* quality = sigmoid( 0.25 * ( SNR_dB - 16 ) ); */
- pQuality_Q15[ b ] = SKP_Silk_sigm_Q15( SKP_RSHIFT( SNR_Q7 - 16 * 128, 4 ) );
- }
-
- return( ret );
-}
-
-/**************************/
-/* Noise level estimation */
-/**************************/
-void SKP_Silk_VAD_GetNoiseLevels(
- const SKP_int32 pX[ VAD_N_BANDS ], /* I subband energies */
- SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
-)
-{
- SKP_int k;
- SKP_int32 nl, nrg, inv_nrg;
- SKP_int coef, min_coef;
-
- /* Initially faster smoothing */
- if( psSilk_VAD->counter < 1000 ) { /* 1000 = 20 sec */
- min_coef = SKP_DIV32_16( SKP_int16_MAX, SKP_RSHIFT( psSilk_VAD->counter, 4 ) + 1 );
- } else {
- min_coef = 0;
- }
-
- for( k = 0; k < VAD_N_BANDS; k++ ) {
- /* Get old noise level estimate for current band */
- nl = psSilk_VAD->NL[ k ];
- SKP_assert( nl >= 0 );
-
- /* Add bias */
- nrg = SKP_ADD_POS_SAT32( pX[ k ], psSilk_VAD->NoiseLevelBias[ k ] );
- SKP_assert( nrg > 0 );
-
- /* Invert energies */
- inv_nrg = SKP_DIV32( SKP_int32_MAX, nrg );
- SKP_assert( inv_nrg >= 0 );
-
- /* Less update when subband energy is high */
- if( nrg > SKP_LSHIFT( nl, 3 ) ) {
- coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 >> 3;
- } else if( nrg < nl ) {
- coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16;
- } else {
- coef = SKP_SMULWB( SKP_SMULWW( inv_nrg, nl ), VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 << 1 );
- }
-
- /* Initially faster smoothing */
- coef = SKP_max_int( coef, min_coef );
-
- /* Smooth inverse energies */
- psSilk_VAD->inv_NL[ k ] = SKP_SMLAWB( psSilk_VAD->inv_NL[ k ], inv_nrg - psSilk_VAD->inv_NL[ k ], coef );
- SKP_assert( psSilk_VAD->inv_NL[ k ] >= 0 );
-
- /* Compute noise level by inverting again */
- nl = SKP_DIV32( SKP_int32_MAX, psSilk_VAD->inv_NL[ k ] );
- SKP_assert( nl >= 0 );
-
- /* Limit noise levels (guarantee 7 bits of head room) */
- nl = SKP_min( nl, 0x00FFFFFF );
-
- /* Store as part of state */
- psSilk_VAD->NL[ k ] = nl;
- }
-
- /* Increment frame counter */
- psSilk_VAD->counter++;
-}
--- a/src/SKP_Silk_VQ_nearest_neighbor_FIX.c
+++ /dev/null
@@ -1,110 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Entropy constrained MATRIX-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */
-void SKP_Silk_VQ_WMat_EC_FIX(
- SKP_int *ind, /* O index of best codebook vector */
- SKP_int32 *rate_dist_Q14, /* O best weighted quantization error + mu * rate*/
- const SKP_int16 *in_Q14, /* I input vector to be quantized */
- const SKP_int32 *W_Q18, /* I weighting matrix */
- const SKP_int16 *cb_Q14, /* I codebook */
- const SKP_int16 *cl_Q6, /* I code length for each codebook vector */
- const SKP_int mu_Q8, /* I tradeoff between weighted error and rate */
- SKP_int L /* I number of vectors in codebook */
-)
-{
- SKP_int k;
- const SKP_int16 *cb_row_Q14;
- SKP_int32 sum1_Q14, sum2_Q16, diff_Q14_01, diff_Q14_23, diff_Q14_4;
-
- /* Loop over codebook */
- *rate_dist_Q14 = SKP_int32_MAX;
- cb_row_Q14 = cb_Q14;
- for( k = 0; k < L; k++ ) {
- /* Pack pairs of int16 values per int32 */
- diff_Q14_01 = (SKP_uint16)( in_Q14[ 0 ] - cb_row_Q14[ 0 ] ) | SKP_LSHIFT( ( SKP_int32 )in_Q14[ 1 ] - cb_row_Q14[ 1 ], 16 );
- diff_Q14_23 = (SKP_uint16)( in_Q14[ 2 ] - cb_row_Q14[ 2 ] ) | SKP_LSHIFT( ( SKP_int32 )in_Q14[ 3 ] - cb_row_Q14[ 3 ], 16 );
- diff_Q14_4 = in_Q14[ 4 ] - cb_row_Q14[ 4 ];
-
- /* Weighted rate */
- sum1_Q14 = SKP_SMULBB( mu_Q8, cl_Q6[ k ] );
-
- SKP_assert( sum1_Q14 >= 0 );
-
- /* Add weighted quantization error, assuming W_Q18 is symmetric */
- /* NOTE: the code below loads two int16 values as one int32, and multiplies each using the */
- /* SMLAWB and SMLAWT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLAWB and SMLAWT instructions should solve the problem. */
- /* first row of W_Q18 */
- sum2_Q16 = SKP_SMULWT( W_Q18[ 1 ], diff_Q14_01 );
- sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 2 ], diff_Q14_23 );
- sum2_Q16 = SKP_SMLAWT( sum2_Q16, W_Q18[ 3 ], diff_Q14_23 );
- sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 4 ], diff_Q14_4 );
- sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
- sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14_01 );
- sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14_01 );
-
- /* second row of W_Q18 */
- sum2_Q16 = SKP_SMULWB( W_Q18[ 7 ], diff_Q14_23 );
- sum2_Q16 = SKP_SMLAWT( sum2_Q16, W_Q18[ 8 ], diff_Q14_23 );
- sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14_4 );
- sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
- sum2_Q16 = SKP_SMLAWT( sum2_Q16, W_Q18[ 6 ], diff_Q14_01 );
- sum1_Q14 = SKP_SMLAWT( sum1_Q14, sum2_Q16, diff_Q14_01 );
-
- /* third row of W_Q18 */
- sum2_Q16 = SKP_SMULWT( W_Q18[ 13 ], diff_Q14_23 );
- sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14_4 );
- sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
- sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14_23 );
- sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14_23 );
-
- /* fourth row of W_Q18 */
- sum2_Q16 = SKP_SMULWB( W_Q18[ 19 ], diff_Q14_4 );
- sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
- sum2_Q16 = SKP_SMLAWT( sum2_Q16, W_Q18[ 18 ], diff_Q14_23 );
- sum1_Q14 = SKP_SMLAWT( sum1_Q14, sum2_Q16, diff_Q14_23 );
-
- /* last row of W_Q18 */
- sum2_Q16 = SKP_SMULWB( W_Q18[ 24 ], diff_Q14_4 );
- sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14_4 );
-
- SKP_assert( sum1_Q14 >= 0 );
-
- /* find best */
- if( sum1_Q14 < *rate_dist_Q14 ) {
- *rate_dist_Q14 = sum1_Q14;
- *ind = k;
- }
-
- /* Go to next cbk vector */
- cb_row_Q14 += LTP_ORDER;
- }
-}
--- a/src/SKP_Silk_allpass_int.c
+++ /dev/null
@@ -1,69 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_allpass_int.c *
- * *
- * First-order allpass filter with *
- * transfer function: *
- * *
- * A + Z^(-1) *
- * H(z) = ------------ *
- * 1 + A*Z^(-1) *
- * *
- * Implemented using minimum multiplier filter design. *
- * *
- * Reference: http://www.univ.trieste.it/~ramponi/teaching/ *
- * DSP/materiale/Ch6(2).pdf *
- * *
- * Copyright 2007 (c), Skype Limited *
- * Date: 070525 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-
-/* First-order allpass filter */
-void SKP_Silk_allpass_int(
- const SKP_int32 *in, /* I: Q25 input signal [len] */
- SKP_int32 *S, /* I/O: Q25 state [1] */
- SKP_int A, /* I: Q15 coefficient (0 <= A < 32768) */
- SKP_int32 *out, /* O: Q25 output signal [len] */
- const SKP_int32 len /* I: Number of samples */
-)
-{
- SKP_int32 Y2, X2, S0;
- SKP_int k;
-
- S0 = S[ 0 ];
- for( k = len - 1; k >= 0; k-- ) {
- Y2 = *in - S0;
- X2 = ( Y2 >> 15 ) * A + ( ( ( Y2 & 0x00007FFF ) * A ) >> 15 );
- ( *out++ ) = S0 + X2;
- S0 = ( *in++ ) + X2;
- }
- S[ 0 ] = S0;
-}
--- a/src/SKP_Silk_ana_filt_bank_1.c
+++ /dev/null
@@ -1,73 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_ana_filt_bank_1.c *
- * *
- * Split signal into two decimated bands using first-order allpass filters *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Coefficients for 2-band filter bank based on first-order allpass filters */
-static SKP_int16 A_fb1_20[ 1 ] = { 5394 };
-static SKP_int16 A_fb1_21[ 1 ] = { 20623 };
-
-/* Split signal into two decimated bands using first-order allpass filters */
-void SKP_Silk_ana_filt_bank_1(
- const SKP_int16 *in, /* I: Input signal [N] */
- SKP_int32 *S, /* I/O: State vector [2] */
- SKP_int16 *outL, /* O: Low band [N/2] */
- SKP_int16 *outH, /* O: High band [N/2] */
- SKP_int32 *scratch, /* I: Scratch memory [3*N/2] */
- const SKP_int32 N /* I: Number of input samples */
-)
-{
- SKP_int k, N2 = SKP_RSHIFT( N, 1 );
- SKP_int32 out_tmp;
-
- /* De-interleave three allpass inputs, and convert Q15 -> Q25 */
- for( k = 0; k < N2; k++ ) {
- scratch[ k + N ] = SKP_LSHIFT( (SKP_int32)in[ 2 * k ], 10 );
- scratch[ k + N2 ] = SKP_LSHIFT( (SKP_int32)in[ 2 * k + 1 ], 10 );
- }
-
- /* Allpass filters */
- SKP_Silk_allpass_int( scratch + N2, S+0, A_fb1_20[ 0 ], scratch, N2 );
- SKP_Silk_allpass_int( scratch + N, S+1, A_fb1_21[ 0 ], scratch + N2, N2 );
-
- /* Add and subtract two allpass outputs to create bands */
- for( k = 0; k < N2; k++ ) {
- out_tmp = scratch[ k ] + scratch[ k + N2 ];
- outL[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out_tmp, 11 ) );
-
- out_tmp = scratch[ k ] - scratch[ k + N2 ];
- outH[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out_tmp, 11 ) );
- }
-}
--- a/src/SKP_Silk_apply_sine_window.c
+++ /dev/null
@@ -1,92 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Apply sine window to signal vector. */
-/* Window types: */
-/* 0 -> sine window from 0 to pi */
-/* 1 -> sine window from 0 to pi/2 */
-/* 2 -> sine window from pi/2 to pi */
-/* every other sample of window is linearly interpolated, for speed */
-void SKP_Silk_apply_sine_window(
- SKP_int16 px_win[], /* O Pointer to windowed signal */
- const SKP_int16 px[], /* I Pointer to input signal */
- const SKP_int win_type, /* I Selects a window type */
- const SKP_int length /* I Window length, multiple of 4 */
-)
-{
- SKP_int k;
- SKP_int32 px32, f_Q16, c_Q20, S0_Q16, S1_Q16;
-
- /* Length must be multiple of 4 */
- SKP_assert( ( length & 3 ) == 0 );
-
- /* Input pointer must be 4-byte aligned */
- SKP_assert( ( (SKP_int64)px & 3 ) == 0 );
-
- if( win_type == 0 ) {
- f_Q16 = SKP_DIV32_16( 411775, length + 1 ); // 411775 = 2 * 65536 * pi
- } else {
- f_Q16 = SKP_DIV32_16( 205887, length + 1 ); // 205887 = 65536 * pi
- }
-
- /* factor used for cosine approximation */
- c_Q20 = -SKP_RSHIFT( SKP_MUL( f_Q16, f_Q16 ), 12 );
-
- /* c_Q20 becomes too large if length is too small */
- SKP_assert( c_Q20 >= -32768 );
-
- /* initialize state */
- if( win_type < 2 ) {
- /* start from 0 */
- S0_Q16 = 0;
- /* approximation of sin(f) */
- S1_Q16 = f_Q16;
- } else {
- /* start from 1 */
- S0_Q16 = ( 1 << 16 );
- /* approximation of cos(f) */
- S1_Q16 = ( 1 << 16 ) + SKP_RSHIFT( c_Q20, 5 );
- }
-
- /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */
- /* 4 samples at a time */
- for( k = 0; k < length; k += 4 ) {
- px32 = *( (SKP_int32 *)&px[ k ] ); /* load two values at once */
- px_win[ k ] = (SKP_int16)SKP_SMULWB( SKP_RSHIFT( S0_Q16 + S1_Q16, 1 ), px32 );
- px_win[ k + 1 ] = (SKP_int16)SKP_SMULWT( S1_Q16, px32 );
- S0_Q16 = SKP_RSHIFT( SKP_MUL( c_Q20, S1_Q16 ), 20 ) + SKP_LSHIFT( S1_Q16, 1 ) - S0_Q16 + 1;
- S0_Q16 = SKP_min( S0_Q16, ( 1 << 16 ) );
-
- px32 = *( (SKP_int32 *)&px[k + 2] ); /* load two values at once */
- px_win[ k + 2 ] = (SKP_int16)SKP_SMULWB( SKP_RSHIFT( S0_Q16 + S1_Q16, 1 ), px32 );
- px_win[ k + 3 ] = (SKP_int16)SKP_SMULWT( S0_Q16, px32 );
- S1_Q16 = SKP_RSHIFT( SKP_MUL( c_Q20, S0_Q16 ), 20 ) + SKP_LSHIFT( S0_Q16, 1 ) - S1_Q16;
- S1_Q16 = SKP_min( S1_Q16, ( 1 << 16 ) );
- }
-}
--- a/src/SKP_Silk_array_maxabs.c
+++ /dev/null
@@ -1,64 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_int16_array_maxabs.c *
- * *
- * Function that returns the maximum absolut value of *
- * the input vector *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Function that returns the maximum absolut value of the input vector */
-SKP_int16 SKP_Silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */
- const SKP_int16 *vec, /* I Input vector [len] */
- const SKP_int32 len /* I Length of input vector */
-)
-{
- SKP_int32 max = 0, i, lvl = 0, ind;
-
- ind = len - 1;
- max = SKP_SMULBB( vec[ ind ], vec[ ind ] );
- for( i = len - 2; i >= 0; i-- ) {
- lvl = SKP_SMULBB( vec[ i ], vec[ i ] );
- if( lvl > max ) {
- max = lvl;
- ind = i;
- }
- }
-
- /* Do not return 32768, as it will not fit in an int16 so may lead to problems later on */
- lvl = SKP_abs( vec[ ind ] );
- if( lvl > SKP_int16_MAX ) {
- return( SKP_int16_MAX );
- } else {
- return( (SKP_int16)lvl );
- }
-}
--- a/src/SKP_Silk_autocorr.c
+++ /dev/null
@@ -1,81 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_autocorr.c *
- * *
- * Calculates the autocorrelation *
- * The result has 29 non-zero bits for the first correlation, to leave *
- * some room for adding white noise fractions etc. *
- * *
- * Copyright 2008 (c), Skype Limited *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Compute autocorrelation */
-void SKP_Silk_autocorr(
- SKP_int32 *results, /* O Result (length correlationCount) */
- SKP_int32 *scale, /* O Scaling of the correlation vector */
- const SKP_int16 *inputData, /* I Input data to correlate */
- const SKP_int inputDataSize, /* I Length of input */
- const SKP_int correlationCount /* I Number of correlation taps to compute */
-)
-{
- SKP_int i, lz, nRightShifts, corrCount;
- SKP_int64 corr64;
-
- corrCount = SKP_min_int( inputDataSize, correlationCount );
-
- /* compute energy (zero-lag correlation) */
- corr64 = SKP_Silk_inner_prod16_aligned_64( inputData, inputData, inputDataSize );
-
- /* deal with all-zero input data */
- corr64 += 1;
-
- /* number of leading zeros */
- lz = SKP_Silk_CLZ64( corr64 );
-
- /* scaling: number of right shifts applied to correlations */
- nRightShifts = 35 - lz;
- *scale = nRightShifts;
-
- if( nRightShifts <= 0 ) {
- results[ 0 ] = SKP_LSHIFT( (SKP_int32)SKP_CHECK_FIT32( corr64 ), -nRightShifts );
-
- /* compute remaining correlations based on int32 inner product */
- for( i = 1; i < corrCount; i++ ) {
- results[ i ] = SKP_LSHIFT( SKP_Silk_inner_prod_aligned( inputData, inputData + i, inputDataSize - i ), -nRightShifts );
- }
- } else {
- results[ 0 ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( corr64, nRightShifts ) );
-
- /* compute remaining correlations based on int64 inner product */
- for( i = 1; i < corrCount; i++ ) {
- results[ i ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( SKP_Silk_inner_prod16_aligned_64( inputData, inputData + i, inputDataSize - i ), nRightShifts ) );
- }
- }
-}
--- a/src/SKP_Silk_biquad.c
+++ /dev/null
@@ -1,72 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_biquad.c *
- * *
- * Second order ARMA filter *
- * Can handle slowly varying filter coefficients *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Second order ARMA filter */
-/* Can handle slowly varying filter coefficients */
-void SKP_Silk_biquad(
- const SKP_int16 *in, /* I: input signal */
- const SKP_int16 *B, /* I: MA coefficients, Q13 [3] */
- const SKP_int16 *A, /* I: AR coefficients, Q13 [2] */
- SKP_int32 *S, /* I/O: state vector [2] */
- SKP_int16 *out, /* O: output signal */
- const SKP_int32 len /* I: signal length */
-)
-{
- SKP_int k, in16;
- SKP_int32 A0_neg, A1_neg, S0, S1, out32, tmp32;
-
- S0 = S[ 0 ];
- S1 = S[ 1 ];
- A0_neg = -A[ 0 ];
- A1_neg = -A[ 1 ];
- for( k = 0; k < len; k++ ) {
- /* S[ 0 ], S[ 1 ]: Q13 */
- in16 = in[ k ];
- out32 = SKP_SMLABB( S0, in16, B[ 0 ] );
-
- S0 = SKP_SMLABB( S1, in16, B[ 1 ] );
- S0 += SKP_LSHIFT( SKP_SMULWB( out32, A0_neg ), 3 );
-
- S1 = SKP_LSHIFT( SKP_SMULWB( out32, A1_neg ), 3 );
- S1 = SKP_SMLABB( S1, in16, B[ 2 ] );
- tmp32 = SKP_RSHIFT_ROUND( out32, 13 ) + 1;
- out[ k ] = (SKP_int16)SKP_SAT16( tmp32 );
- }
- S[ 0 ] = S0;
- S[ 1 ] = S1;
-}
--- a/src/SKP_Silk_biquad_alt.c
+++ /dev/null
@@ -1,73 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_biquad_alt.c *
- * *
- * Second order ARMA filter *
- * Can handle slowly varying filter coefficients *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-
-/* Second order ARMA filter, alternative implementation */
-void SKP_Silk_biquad_alt(
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int32 *B_Q28, /* I: MA coefficients [3] */
- const SKP_int32 *A_Q28, /* I: AR coefficients [2] */
- SKP_int32 *S, /* I/O: State vector [2] */
- SKP_int16 *out, /* O: Output signal */
- const SKP_int32 len /* I: Signal length (must be even) */
-)
-{
- /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */
- SKP_int k;
- SKP_int32 inval, A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14;
-
- /* Negate A_Q28 values and split in two parts */
- A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */
- A0_U_Q28 = SKP_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */
- A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */
- A1_U_Q28 = SKP_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */
-
- for( k = 0; k < len; k++ ) {
- /* S[ 0 ], S[ 1 ]: Q12 */
- inval = in[ k ];
- out32_Q14 = SKP_LSHIFT( SKP_SMLAWB( S[ 0 ], B_Q28[ 0 ], inval ), 2 );
-
- S[ 0 ] = S[1] + SKP_RSHIFT( SKP_SMULWB( out32_Q14, A0_L_Q28 ), 14 );
- S[ 0 ] = SKP_SMLAWB( S[ 0 ], out32_Q14, A0_U_Q28 );
- S[ 0 ] = SKP_SMLAWB( S[ 0 ], B_Q28[ 1 ], inval);
-
- S[ 1 ] = SKP_RSHIFT( SKP_SMULWB( out32_Q14, A1_L_Q28 ), 14 );
- S[ 1 ] = SKP_SMLAWB( S[ 1 ], out32_Q14, A1_U_Q28 );
- S[ 1 ] = SKP_SMLAWB( S[ 1 ], B_Q28[ 2 ], inval );
-
- /* Scale back to Q0 and saturate */
- out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT( out32_Q14, 14 ) + 2 );
- }
-}
--- a/src/SKP_Silk_burg_modified.c
+++ /dev/null
@@ -1,228 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_burg_modified.c *
- * *
- * Calculates the reflection coefficients from the input vector *
- * Input vector contains nb_subfr sub vectors of length L_sub + D *
- * *
- * Copyright 2009 (c), Skype Limited *
- * Date: 100105 *
- */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define MAX_FRAME_SIZE 544 // subfr_length * nb_subfr = ( 0.005 * 24000 + 16 ) * 4 = 544
-#define MAX_NB_SUBFR 4
-
-#define QA 24
-#define N_BITS_HEAD_ROOM 2
-#define MIN_RSHIFTS -16
-#define MAX_RSHIFTS (32 - QA)
-
-/* Compute reflection coefficients from input signal */
-void SKP_Silk_burg_modified(
- SKP_int32 *res_nrg, /* O residual energy */
- SKP_int *res_nrg_Q, /* O residual energy Q value */
- SKP_int32 A_Q16[], /* O prediction coefficients (length order) */
- const SKP_int16 x[], /* I input signal, length: nb_subfr * ( D + subfr_length ) */
- const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */
- const SKP_int nb_subfr, /* I number of subframes stacked in x */
- const SKP_int32 WhiteNoiseFrac_Q32, /* I fraction added to zero-lag autocorrelation */
- const SKP_int D /* I order */
-)
-{
- SKP_int k, n, s, lz, rshifts, rshifts_extra;
- SKP_int32 C0, num, nrg, rc_Q31, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2;
- const SKP_int16 *x_ptr;
-
- SKP_int32 C_first_row[ SigProc_MAX_ORDER_LPC ];
- SKP_int32 C_last_row[ SigProc_MAX_ORDER_LPC ];
- SKP_int32 Af_QA[ SigProc_MAX_ORDER_LPC ];
-
- SKP_int32 CAf[ SigProc_MAX_ORDER_LPC + 1 ];
- SKP_int32 CAb[ SigProc_MAX_ORDER_LPC + 1 ];
-
- SKP_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE );
- SKP_assert( nb_subfr <= MAX_NB_SUBFR );
-
-
- /* Compute autocorrelations, added over subframes */
- SKP_Silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length );
- if( rshifts > MAX_RSHIFTS ) {
- C0 = SKP_LSHIFT32( C0, rshifts - MAX_RSHIFTS );
- SKP_assert( C0 > 0 );
- rshifts = MAX_RSHIFTS;
- } else {
- lz = SKP_Silk_CLZ32( C0 ) - 1;
- rshifts_extra = N_BITS_HEAD_ROOM - lz;
- if( rshifts_extra > 0 ) {
- rshifts_extra = SKP_min( rshifts_extra, MAX_RSHIFTS - rshifts );
- C0 = SKP_RSHIFT32( C0, rshifts_extra );
- } else {
- rshifts_extra = SKP_max( rshifts_extra, MIN_RSHIFTS - rshifts );
- C0 = SKP_LSHIFT32( C0, -rshifts_extra );
- }
- rshifts += rshifts_extra;
- }
- SKP_memset( C_first_row, 0, SigProc_MAX_ORDER_LPC * sizeof( SKP_int32 ) );
- if( rshifts > 0 ) {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- for( n = 1; n < D + 1; n++ ) {
- C_first_row[ n - 1 ] += (SKP_int32)SKP_RSHIFT64(
- SKP_Silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n ), rshifts );
- }
- }
- } else {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- for( n = 1; n < D + 1; n++ ) {
- C_first_row[ n - 1 ] += SKP_LSHIFT32(
- SKP_Silk_inner_prod_aligned( x_ptr, x_ptr + n, subfr_length - n ), -rshifts );
- }
- }
- }
- SKP_memcpy( C_last_row, C_first_row, SigProc_MAX_ORDER_LPC * sizeof( SKP_int32 ) );
-
- /* Initialize */
- CAb[ 0 ] = CAf[ 0 ] = C0 + SKP_SMMUL( WhiteNoiseFrac_Q32, C0 ) + 1; // Q(-rshifts)
-
- for( n = 0; n < D; n++ ) {
- /* Update first row of correlation matrix (without first element) */
- /* Update last row of correlation matrix (without last element, stored in reversed order) */
- /* Update C * Af */
- /* Update C * flipud(Af) (stored in reversed order) */
- if( rshifts > -2 ) {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- x1 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], 16 - rshifts ); // Q(16-rshifts)
- x2 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); // Q(16-rshifts)
- tmp1 = SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], QA - 16 ); // Q(QA-16)
- tmp2 = SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); // Q(QA-16)
- for( k = 0; k < n; k++ ) {
- C_first_row[ k ] = SKP_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); // Q( -rshifts )
- C_last_row[ k ] = SKP_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); // Q( -rshifts )
- Atmp_QA = Af_QA[ k ];
- tmp1 = SKP_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); // Q(QA-16)
- tmp2 = SKP_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); // Q(QA-16)
- }
- tmp1 = SKP_LSHIFT32( -tmp1, 32 - QA - rshifts ); // Q(16-rshifts)
- tmp2 = SKP_LSHIFT32( -tmp2, 32 - QA - rshifts ); // Q(16-rshifts)
- for( k = 0; k <= n; k++ ) {
- CAf[ k ] = SKP_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); // Q( -rshift )
- CAb[ k ] = SKP_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); // Q( -rshift )
- }
- }
- } else {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- x1 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], -rshifts ); // Q( -rshifts )
- x2 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); // Q( -rshifts )
- tmp1 = SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], 17 ); // Q17
- tmp2 = SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], 17 ); // Q17
- for( k = 0; k < n; k++ ) {
- C_first_row[ k ] = SKP_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); // Q( -rshifts )
- C_last_row[ k ] = SKP_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); // Q( -rshifts )
- Atmp1 = SKP_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); // Q17
- tmp1 = SKP_MLA( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); // Q17
- tmp2 = SKP_MLA( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); // Q17
- }
- tmp1 = -tmp1; // Q17
- tmp2 = -tmp2; // Q17
- for( k = 0; k <= n; k++ ) {
- CAf[ k ] = SKP_SMLAWW( CAf[ k ], tmp1,
- SKP_LSHIFT32( (SKP_int32)x_ptr[ n - k ], -rshifts - 1 ) ); // Q( -rshift )
- CAb[ k ] = SKP_SMLAWW( CAb[ k ], tmp2,
- SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) );// Q( -rshift )
- }
- }
- }
-
- /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */
- tmp1 = C_first_row[ n ]; // Q( -rshifts )
- tmp2 = C_last_row[ n ]; // Q( -rshifts )
- num = 0; // Q( -rshifts )
- nrg = SKP_ADD32( CAb[ 0 ], CAf[ 0 ] ); // Q( 1-rshifts )
- for( k = 0; k < n; k++ ) {
- Atmp_QA = Af_QA[ k ];
- lz = SKP_Silk_CLZ32( SKP_abs( Atmp_QA ) ) - 1;
- lz = SKP_min( 32 - QA, lz );
- Atmp1 = SKP_LSHIFT32( Atmp_QA, lz ); // Q( QA + lz )
-
- tmp1 = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts )
- tmp2 = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts )
- num = SKP_ADD_LSHIFT32( num, SKP_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts )
- nrg = SKP_ADD_LSHIFT32( nrg, SKP_SMMUL( SKP_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ),
- Atmp1 ), 32 - QA - lz ); // Q( 1-rshifts )
- }
- CAf[ n + 1 ] = tmp1; // Q( -rshifts )
- CAb[ n + 1 ] = tmp2; // Q( -rshifts )
- num = SKP_ADD32( num, tmp2 ); // Q( -rshifts )
- num = SKP_LSHIFT32( -num, 1 ); // Q( 1-rshifts )
-
- /* Calculate the next order reflection (parcor) coefficient */
- if( SKP_abs( num ) < nrg ) {
- rc_Q31 = SKP_DIV32_varQ( num, nrg, 31 );
- } else {
- /* Negative energy or ratio too high; set remaining coefficients to zero and exit loop */
- SKP_memset( &Af_QA[ n ], 0, ( D - n ) * sizeof( SKP_int32 ) );
- SKP_assert( 0 );
- break;
- }
-
- /* Update the AR coefficients */
- for( k = 0; k < (n + 1) >> 1; k++ ) {
- tmp1 = Af_QA[ k ]; // QA
- tmp2 = Af_QA[ n - k - 1 ]; // QA
- Af_QA[ k ] = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( tmp2, rc_Q31 ), 1 ); // QA
- Af_QA[ n - k - 1 ] = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( tmp1, rc_Q31 ), 1 ); // QA
- }
- Af_QA[ n ] = SKP_RSHIFT32( rc_Q31, 31 - QA ); // QA
-
- /* Update C * Af and C * Ab */
- for( k = 0; k <= n + 1; k++ ) {
- tmp1 = CAf[ k ]; // Q( -rshifts )
- tmp2 = CAb[ n - k + 1 ]; // Q( -rshifts )
- CAf[ k ] = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( tmp2, rc_Q31 ), 1 ); // Q( -rshifts )
- CAb[ n - k + 1 ] = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( tmp1, rc_Q31 ), 1 ); // Q( -rshifts )
- }
- }
-
- /* Return residual energy */
- nrg = CAf[ 0 ]; // Q( -rshifts )
- tmp1 = 1 << 16; // Q16
- for( k = 0; k < D; k++ ) {
- Atmp1 = SKP_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); // Q16
- nrg = SKP_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); // Q( -rshifts )
- tmp1 = SKP_SMLAWW( tmp1, Atmp1, Atmp1 ); // Q16
- A_Q16[ k ] = -Atmp1;
- }
- *res_nrg = SKP_SMLAWW( nrg, SKP_SMMUL( WhiteNoiseFrac_Q32, C0 ), -tmp1 ); // Q( -rshifts )
- *res_nrg_Q = -rshifts;
-}
--- a/src/SKP_Silk_bwexpander.c
+++ /dev/null
@@ -1,49 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Chirp (bandwidth expand) LP AR filter */
-void SKP_Silk_bwexpander(
- SKP_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */
- const SKP_int d, /* I Length of ar */
- SKP_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */
-)
-{
- SKP_int i;
- SKP_int32 chirp_minus_one_Q16;
-
- chirp_minus_one_Q16 = chirp_Q16 - 65536;
-
- /* NB: Dont use SKP_SMULWB, instead of SKP_RSHIFT_ROUND( SKP_MUL() , 16 ), below. */
- /* Bias in SKP_SMULWB can lead to unstable filters */
- for( i = 0; i < d - 1; i++ ) {
- ar[ i ] = (SKP_int16)SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, ar[ i ] ), 16 );
- chirp_Q16 += SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 );
- }
- ar[ d - 1 ] = (SKP_int16)SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, ar[ d - 1 ] ), 16 );
-}
--- a/src/SKP_Silk_bwexpander_32.c
+++ /dev/null
@@ -1,46 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Chirp (bandwidth expand) LP AR filter */
-void SKP_Silk_bwexpander_32(
- SKP_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */
- const SKP_int d, /* I Length of ar */
- SKP_int32 chirp_Q16 /* I Chirp factor in Q16 */
-)
-{
- SKP_int i;
- SKP_int32 tmp_chirp_Q16;
-
- tmp_chirp_Q16 = chirp_Q16;
- for( i = 0; i < d - 1; i++ ) {
- ar[ i ] = SKP_SMULWW( ar[ i ], tmp_chirp_Q16 );
- tmp_chirp_Q16 = SKP_SMULWW( chirp_Q16, tmp_chirp_Q16 );
- }
- ar[ d - 1 ] = SKP_SMULWW( ar[ d - 1 ], tmp_chirp_Q16 );
-}
--- a/src/SKP_Silk_code_signs.c
+++ /dev/null
@@ -1,87 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-//#define SKP_enc_map(a) ((a) > 0 ? 1 : 0)
-//#define SKP_dec_map(a) ((a) > 0 ? 1 : -1)
-/* shifting avoids if-statement */
-#define SKP_enc_map(a) ( SKP_RSHIFT( (a), 15 ) + 1 )
-#define SKP_dec_map(a) ( SKP_LSHIFT( (a), 1 ) - 1 )
-
-/* Encodes signs of excitation */
-void SKP_Silk_encode_signs(
- SKP_Silk_range_coder_state *sRC, /* I/O Range coder state */
- const SKP_int q[], /* I Pulse signal */
- const SKP_int length, /* I Length of input */
- const SKP_int sigtype, /* I Signal type */
- const SKP_int QuantOffsetType, /* I Quantization offset type */
- const SKP_int RateLevelIndex /* I Rate level index */
-)
-{
- SKP_int i;
- SKP_int inData;
- const SKP_uint16 *cdf;
-
- i = SKP_SMULBB( N_RATE_LEVELS - 1, SKP_LSHIFT( sigtype, 1 ) + QuantOffsetType ) + RateLevelIndex;
- cdf = SKP_Silk_sign_CDF[ i ];
-
- for( i = 0; i < length; i++ ) {
- if( q[ i ] != 0 ) {
- inData = SKP_enc_map( q[ i ] ); /* - = 0, + = 1 */
- SKP_Silk_range_encoder( sRC, inData, cdf );
- }
- }
-}
-
-/* Decodes signs of excitation */
-void SKP_Silk_decode_signs(
- SKP_Silk_range_coder_state *sRC, /* I/O Range coder state */
- SKP_int q[], /* I/O pulse signal */
- const SKP_int length, /* I length of output */
- const SKP_int sigtype, /* I Signal type */
- const SKP_int QuantOffsetType, /* I Quantization offset type */
- const SKP_int RateLevelIndex /* I Rate Level Index */
-)
-{
- SKP_int i;
- SKP_int data;
- const SKP_uint16 *cdf;
-
- i = SKP_SMULBB( N_RATE_LEVELS - 1, SKP_LSHIFT( sigtype, 1 ) + QuantOffsetType ) + RateLevelIndex;
- cdf = SKP_Silk_sign_CDF[ i ];
-
- for( i = 0; i < length; i++ ) {
- if( q[ i ] > 0 ) {
- SKP_Silk_range_decoder( &data, sRC, cdf, 1 );
- /* attach sign */
- /* implementation with shift, subtraction, multiplication */
- q[ i ] *= SKP_dec_map( data );
- }
- }
-}
-
--- a/src/SKP_Silk_common_pitch_est_defines.h
+++ /dev/null
@@ -1,76 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SIGPROC_COMMON_PITCH_EST_DEFINES_H
-#define SIGPROC_COMMON_PITCH_EST_DEFINES_H
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/************************************************************/
-/* Definitions For Fix pitch estimator */
-/************************************************************/
-
-#define PITCH_EST_MAX_FS_KHZ 24 /* Maximum sampling frequency used */
-
-#define PITCH_EST_FRAME_LENGTH_MS 40 /* 40 ms */
-
-#define PITCH_EST_MAX_FRAME_LENGTH (PITCH_EST_FRAME_LENGTH_MS * PITCH_EST_MAX_FS_KHZ)
-#define PITCH_EST_MAX_FRAME_LENGTH_ST_1 (PITCH_EST_MAX_FRAME_LENGTH >> 2)
-#define PITCH_EST_MAX_FRAME_LENGTH_ST_2 (PITCH_EST_MAX_FRAME_LENGTH >> 1)
-#define PITCH_EST_MAX_SF_FRAME_LENGTH (PITCH_EST_SUB_FRAME * PITCH_EST_MAX_FS_KHZ)
-
-#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */
-#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */
-#define PITCH_EST_MAX_LAG (PITCH_EST_MAX_LAG_MS * PITCH_EST_MAX_FS_KHZ)
-#define PITCH_EST_MIN_LAG (PITCH_EST_MIN_LAG_MS * PITCH_EST_MAX_FS_KHZ)
-
-#define PITCH_EST_NB_SUBFR 4
-
-#define PITCH_EST_D_SRCH_LENGTH 24
-
-#define PITCH_EST_MAX_DECIMATE_STATE_LENGTH 7
-
-#define PITCH_EST_NB_STAGE3_LAGS 5
-
-#define PITCH_EST_NB_CBKS_STAGE2 3
-#define PITCH_EST_NB_CBKS_STAGE2_EXT 11
-
-#define PITCH_EST_CB_mn2 1
-#define PITCH_EST_CB_mx2 2
-
-#define PITCH_EST_NB_CBKS_STAGE3_MAX 34
-#define PITCH_EST_NB_CBKS_STAGE3_MID 24
-#define PITCH_EST_NB_CBKS_STAGE3_MIN 16
-
-extern const SKP_int16 SKP_Silk_CB_lags_stage2[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE2_EXT];
-extern const SKP_int16 SKP_Silk_CB_lags_stage3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX];
-extern const SKP_int16 SKP_Silk_Lag_range_stage3[ SigProc_PITCH_EST_MAX_COMPLEX + 1 ] [ PITCH_EST_NB_SUBFR ][ 2 ];
-extern const SKP_int16 SKP_Silk_cbk_sizes_stage3[ SigProc_PITCH_EST_MAX_COMPLEX + 1 ];
-extern const SKP_int16 SKP_Silk_cbk_offsets_stage3[ SigProc_PITCH_EST_MAX_COMPLEX + 1 ];
-
-#endif
-
--- a/src/SKP_Silk_control_codec_FIX.c
+++ /dev/null
@@ -1,656 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Control encoder SNR */
-SKP_int SKP_Silk_control_encoder_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */
- const SKP_int API_fs_kHz, /* I External (API) sampling rate (kHz) */
- const SKP_int PacketSize_ms, /* I Packet length (ms) */
- SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) (used if SNR_dB == 0) */
- const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */
- const SKP_int INBandFec_enabled, /* I Enable (1) / disable (0) inband FEC */
- const SKP_int DTX_enabled, /* I Enable / disable DTX */
- const SKP_int InputFramesize_ms, /* I Inputframe in ms */
- const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */
-)
-{
- SKP_int32 LBRRRate_thres_bps;
- SKP_int k, fs_kHz, ret = 0;
- SKP_int32 frac_Q6;
- const SKP_int32 *rateTable;
-
- /* State machine for the SWB/WB switching */
- fs_kHz = psEnc->sCmn.fs_kHz;
-
- /* Only switch during low speech activity, when no frames are sitting in the payload buffer */
- if( API_fs_kHz == 8 || fs_kHz == 0 || API_fs_kHz < fs_kHz ) {
- // Switching is not possible, encoder just initialized, or internal mode higher than external
- fs_kHz = API_fs_kHz;
- } else {
-
- /* Resample all valid data in x_buf. Resampling the last part gets rid of a click, 5ms after switching */
- /* this is because the same state is used when downsampling in API.c and is then up to date */
- /* the click immidiatly after switching is most of the time still there */
-
- if( psEnc->sCmn.fs_kHz == 24 ) {
- /* Accumulate the difference between the target rate and limit */
- if( psEnc->sCmn.fs_kHz_changed == 0 ) {
- psEnc->sCmn.bitrateDiff += SKP_MUL( InputFramesize_ms, TargetRate_bps - SWB2WB_BITRATE_BPS_INITIAL );
- } else {
- psEnc->sCmn.bitrateDiff += SKP_MUL( InputFramesize_ms, TargetRate_bps - SWB2WB_BITRATE_BPS );
- }
- psEnc->sCmn.bitrateDiff = SKP_min( psEnc->sCmn.bitrateDiff, 0 );
-
- /* Check if we should switch from 24 to 16 kHz */
-#if SWITCH_TRANSITION_FILTERING
- if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* Transition phase not active */
- ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD || psEnc->sCmn.sSWBdetect.WB_detected == 1 ) &&
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
- psEnc->sCmn.sLP.transition_frame_no = 1; /* Begin transition phase */
- psEnc->sCmn.sLP.mode = 0; /* Switch down */
- }
-
- if( ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_DOWN ) && ( psEnc->sCmn.sLP.mode == 0 ) && /* Transition phase complete, ready to switch */
-#else
- if( ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD || psEnc->sCmn.sSWBdetect.WB_detected == 1 ) &&
-#endif
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
-
- SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
- SKP_int16 x_bufout[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
-
- psEnc->sCmn.bitrateDiff = 0;
- fs_kHz = 16;
-
- SKP_memcpy( x_buf, psEnc->x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- SKP_memset( psEnc->sCmn.resample24To16state, 0, sizeof( psEnc->sCmn.resample24To16state ) );
-
-#if LOW_COMPLEXITY_ONLY
- {
- SKP_int16 scratch[ ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) + SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ];
- SKP_Silk_resample_2_3_coarse( &x_bufout[ 0 ], psEnc->sCmn.resample24To16state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape, (SKP_int16*)scratch );
- }
-#else
- SKP_Silk_resample_2_3( &x_bufout[ 0 ], psEnc->sCmn.resample24To16state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-#endif
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_bufout, 0, 320 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_bufout, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
-#if SWITCH_TRANSITION_FILTERING
- psEnc->sCmn.sLP.transition_frame_no = 0; /* Transition phase complete */
-#endif
- }
- } else if( psEnc->sCmn.fs_kHz == 16 ) {
-
- /* Check if we should switch from 16 to 24 kHz */
-#if SWITCH_TRANSITION_FILTERING
- if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* No transition phase running, ready to switch */
-#else
- if(
-#endif
- ( API_fs_kHz > psEnc->sCmn.fs_kHz && TargetRate_bps >= WB2SWB_BITRATE_BPS && psEnc->sCmn.sSWBdetect.WB_detected == 0 ) &&
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
-
- SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
- SKP_int16 x_bufout[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) / 2 ];
- SKP_int32 resample16To24state[ 11 ];
-
- psEnc->sCmn.bitrateDiff = 0;
- fs_kHz = 24;
-
- SKP_memcpy( x_buf, psEnc->x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- SKP_memset( resample16To24state, 0, sizeof(resample16To24state) );
-
- SKP_Silk_resample_3_2( &x_bufout[ 0 ], resample16To24state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_bufout, 0, 480 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_bufout, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-#if SWITCH_TRANSITION_FILTERING
- psEnc->sCmn.sLP.mode = 1; /* Switch up */
-#endif
- } else {
- /* accumulate the difference between the target rate and limit */
- psEnc->sCmn.bitrateDiff += SKP_MUL( InputFramesize_ms, TargetRate_bps - WB2MB_BITRATE_BPS );
- psEnc->sCmn.bitrateDiff = SKP_min( psEnc->sCmn.bitrateDiff, 0 );
-
- /* Check if we should switch from 16 to 12 kHz */
-#if SWITCH_TRANSITION_FILTERING
- if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* Transition phase not active */
- ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD ) &&
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
- psEnc->sCmn.sLP.transition_frame_no = 1; /* Begin transition phase */
- psEnc->sCmn.sLP.mode = 0; /* Switch down */
- }
-
- if( ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_DOWN ) && ( psEnc->sCmn.sLP.mode == 0 ) && /* Transition phase complete, ready to switch */
-#else
- if( ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD ) &&
-#endif
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
-
- SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
-
- SKP_memcpy( x_buf, psEnc->x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- psEnc->sCmn.bitrateDiff = 0;
- fs_kHz = 12;
-
- if( API_fs_kHz == 24 ) {
-
- /* Intermediate upsampling of x_bufFIX from 16 to 24 kHz */
- SKP_int16 x_buf24[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) / 2 ];
- SKP_int32 scratch[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- SKP_int32 resample16To24state[ 11 ];
-
- SKP_memset( resample16To24state, 0, sizeof( resample16To24state ) );
- SKP_Silk_resample_3_2( &x_buf24[ 0 ], resample16To24state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- /* Update the state of the resampler used in API.c, from 24 to 12 kHz */
- SKP_memset( psEnc->sCmn.resample24To12state, 0, sizeof( psEnc->sCmn.resample24To12state ) );
- SKP_Silk_resample_1_2_coarse( &x_buf24[ 0 ], psEnc->sCmn.resample24To12state, &x_buf[ 0 ], scratch, SKP_RSHIFT( SKP_SMULBB( 3, SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape ), 2 ) );
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_buf, 0, 240 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- } else if( API_fs_kHz == 16 ) {
- SKP_int16 x_bufout[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) / 4 ];
- SKP_memset( psEnc->sCmn.resample16To12state, 0, sizeof( psEnc->sCmn.resample16To12state ) );
-
- SKP_Silk_resample_3_4( &x_bufout[ 0 ], psEnc->sCmn.resample16To12state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_bufout, 0, 240 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_bufout, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
- }
-#if SWITCH_TRANSITION_FILTERING
- psEnc->sCmn.sLP.transition_frame_no = 0; /* Transition phase complete */
-#endif
- }
- }
- } else if( psEnc->sCmn.fs_kHz == 12 ) {
-
- /* Check if we should switch from 12 to 16 kHz */
-#if SWITCH_TRANSITION_FILTERING
- if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* No transition phase running, ready to switch */
-#else
- if(
-#endif
- ( API_fs_kHz > psEnc->sCmn.fs_kHz && TargetRate_bps >= MB2WB_BITRATE_BPS ) &&
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
-
- SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
-
- SKP_memcpy( x_buf, psEnc->x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- psEnc->sCmn.bitrateDiff = 0;
- fs_kHz = 16;
-
- /* Reset state of the resampler to be used */
- if( API_fs_kHz == 24 ) {
-
- SKP_int16 x_bufout[ 2 * 2 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) / 3 ];
-
- /* Intermediate upsampling of x_bufFIX from 12 to 24 kHz */
- SKP_int16 x_buf24[ 2 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- SKP_int32 scratch[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- SKP_int32 resample12To24state[6];
-
- SKP_memset( resample12To24state, 0, sizeof( resample12To24state ) );
- SKP_Silk_resample_2_1_coarse( &x_buf[ 0 ], resample12To24state, &x_buf24[ 0 ], scratch, SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- SKP_memset( psEnc->sCmn.resample24To16state, 0, sizeof( psEnc->sCmn.resample24To16state ) );
-
-#if LOW_COMPLEXITY_ONLY
- SKP_assert( sizeof( SKP_int16 ) * ( 2 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) + SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ) <= sizeof( scratch ) );
- SKP_Silk_resample_2_3_coarse( &x_bufout[ 0 ], psEnc->sCmn.resample24To16state, &x_buf24[ 0 ], SKP_LSHIFT( SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape, 1 ), (SKP_int16*)scratch );
-#else
- SKP_Silk_resample_2_3( &x_bufout[ 0 ], psEnc->sCmn.resample24To16state, &x_buf24[ 0 ], SKP_LSHIFT( SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape, 1 ) );
-#endif
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_bufout, 0, 320 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_bufout, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
- }
-#if SWITCH_TRANSITION_FILTERING
- psEnc->sCmn.sLP.mode = 1; /* Switch up */
-#endif
- } else {
- /* accumulate the difference between the target rate and limit */
- psEnc->sCmn.bitrateDiff += SKP_MUL( InputFramesize_ms, TargetRate_bps - MB2NB_BITRATE_BPS );
- psEnc->sCmn.bitrateDiff = SKP_min( psEnc->sCmn.bitrateDiff, 0 );
-
- /* Check if we should switch from 12 to 8 kHz */
-#if SWITCH_TRANSITION_FILTERING
- if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* Transition phase not active */
- ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD ) &&
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
- psEnc->sCmn.sLP.transition_frame_no = 1; /* Begin transition phase */
- psEnc->sCmn.sLP.mode = 0; /* Switch down */
- }
-
- if( ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_DOWN ) && ( psEnc->sCmn.sLP.mode == 0 ) &&
-#else
- if( ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD ) &&
-#endif
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
-
- SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
-
- SKP_memcpy( x_buf, psEnc->x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- psEnc->sCmn.bitrateDiff = 0;
- fs_kHz = 8;
-
- if( API_fs_kHz == 24 ) {
-
- SKP_int32 scratch[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- /* Intermediate upsampling of x_buf from 12 to 24 kHz */
- SKP_int16 x_buf24[ 2 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- SKP_int32 resample12To24state[ 6 ];
-
- SKP_memset( resample12To24state, 0, sizeof( resample12To24state ) );
- SKP_Silk_resample_2_1_coarse( &x_buf[ 0 ], resample12To24state, &x_buf24[ 0 ], scratch, SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- /* Update the state of the resampler used in API.c, from 24 to 8 kHz */
- SKP_memset( psEnc->sCmn.resample24To8state, 0, sizeof( psEnc->sCmn.resample24To8state ) );
- SKP_Silk_resample_1_3( &x_buf[ 0 ], psEnc->sCmn.resample24To8state, &x_buf24[ 0 ], SKP_LSHIFT( SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape, 1 ) );
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_buf, 0, 160 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- } else if( API_fs_kHz == 16 ) {
- /* Intermediate upsampling of x_bufFIX from 12 to 16 kHz */
- SKP_int16 x_buf16[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) / 2 ];
- SKP_int32 resample12To16state[11];
-
- SKP_memset( resample12To16state, 0, sizeof( resample12To16state ) );
- SKP_Silk_resample_3_2( &x_buf16[ 0 ], resample12To16state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_buf, 0, 160 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- } else if( API_fs_kHz == 12 ) {
- SKP_int16 x_bufout[ 2 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) / 3 ];
- SKP_memset( psEnc->sCmn.resample12To8state, 0, sizeof( psEnc->sCmn.resample12To8state ) );
-#if LOW_COMPLEXITY_ONLY
- {
- SKP_int16 scratch[ ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) + SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ];
- SKP_Silk_resample_2_3_coarse( &x_bufout[ 0 ], psEnc->sCmn.resample12To8state, &x_buf[ 0 ],
- SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape, scratch );
- }
-#else
- SKP_Silk_resample_2_3( &x_bufout[ 0 ], psEnc->sCmn.resample12To8state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-#endif
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_bufout, 0, 160 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_bufout, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
- }
-#if SWITCH_TRANSITION_FILTERING
- psEnc->sCmn.sLP.transition_frame_no = 0; /* Transition phase complete */
-#endif
- }
- }
- } else if( psEnc->sCmn.fs_kHz == 8 ) {
-
- /* Check if we should switch from 8 to 12 kHz */
-#if SWITCH_TRANSITION_FILTERING
- if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* No transition phase running, ready to switch */
-#else
- if(
-#endif
- ( API_fs_kHz > psEnc->sCmn.fs_kHz && TargetRate_bps >= NB2MB_BITRATE_BPS ) &&
- ( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
-
- SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
-
- SKP_memcpy( x_buf, psEnc->x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- psEnc->sCmn.bitrateDiff = 0;
- fs_kHz = 12;
-
- /* Reset state of the resampler to be used */
- if( API_fs_kHz == 24 ) {
- SKP_int16 x_buf24[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- SKP_int32 scratch[ 3 * 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) / 2 ];
- SKP_int32 resample8To24state[ 7 ];
-
- /* Intermediate upsampling of x_bufFIX from 8 to 24 kHz */
- SKP_memset( resample8To24state, 0, sizeof( resample8To24state ) );
- SKP_Silk_resample_3_1( &x_buf24[ 0 ], resample8To24state, &x_buf[ 0 ], SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- SKP_memset( psEnc->sCmn.resample24To12state, 0, sizeof( psEnc->sCmn.resample24To12state ) );
-
- SKP_Silk_resample_1_2_coarse( &x_buf24[ 0 ], psEnc->sCmn.resample24To12state, &x_buf[ 0 ], scratch, SKP_RSHIFT( SKP_SMULBB( 3, SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape ), 1 ) );
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_buf, 0, 240 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
-
- } else if( API_fs_kHz == 16 ) {
- SKP_int16 x_buf16[ 2 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- SKP_int32 scratch[ 3 * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
- SKP_int32 resample8To16state[ 6 ];
-
- /* Intermediate upsampling of x_bufFIX from 8 to 16 kHz */
- SKP_memset( resample8To16state, 0, sizeof( resample8To16state ) );
- SKP_Silk_resample_2_1_coarse( &x_buf[ 0 ], resample8To16state, &x_buf16[ 0 ], scratch, SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape );
-
- SKP_memset( psEnc->sCmn.resample16To12state, 0, sizeof( psEnc->sCmn.resample16To12state ) );
-
- SKP_Silk_resample_3_4( &x_buf[ 0 ], psEnc->sCmn.resample16To12state, &x_buf16[ 0 ], SKP_LSHIFT( SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape, 1 ) );
-
- /* set the first frame to zero, no performance difference was noticed though */
- SKP_memset( x_buf, 0, 240 * sizeof( SKP_int16 ) );
- SKP_memcpy( psEnc->x_buf, x_buf, ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * sizeof( SKP_int16 ) );
- }
-#if SWITCH_TRANSITION_FILTERING
- psEnc->sCmn.sLP.mode = 1; /* Switch up */
-#endif
- }
- } else {
- // Internal sample frequency not supported!
- SKP_assert( 0 );
- }
- }
-
-#if SWITCH_TRANSITION_FILTERING
- /* After switching up, stop transition filter during speech inactivity */
- if( ( psEnc->sCmn.sLP.mode == 1 ) &&
- ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_UP ) &&
- ( psEnc->speech_activity_Q8 < 128 ) &&
- ( psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
-
- psEnc->sCmn.sLP.transition_frame_no = 0;
-
- /* Reset transition filter state */
- SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );
- }
-#endif
-
-
-
- /* Set internal sampling frequency */
- if( psEnc->sCmn.fs_kHz != fs_kHz ) {
- /* reset part of the state */
- SKP_memset( &psEnc->sShape, 0, sizeof( SKP_Silk_shape_state_FIX ) );
- SKP_memset( &psEnc->sPrefilt, 0, sizeof( SKP_Silk_prefilter_state_FIX ) );
- SKP_memset( &psEnc->sNSQ, 0, sizeof( SKP_Silk_nsq_state ) );
- SKP_memset( &psEnc->sPred, 0, sizeof( SKP_Silk_predict_state_FIX ) );
- SKP_memset( psEnc->sNSQ.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) );
- SKP_memset( psEnc->sNSQ_LBRR.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) );
- SKP_memset( psEnc->sCmn.LBRR_buffer, 0, MAX_LBRR_DELAY * sizeof( SKP_SILK_LBRR_struct ) );
-#if SWITCH_TRANSITION_FILTERING
- SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );
- if( psEnc->sCmn.sLP.mode == 1 ) {
- /* Begin transition phase */
- psEnc->sCmn.sLP.transition_frame_no = 1;
- } else {
- /* End transition phase */
- psEnc->sCmn.sLP.transition_frame_no = 0;
- }
-#endif
- psEnc->sCmn.inputBufIx = 0;
- psEnc->sCmn.nFramesInPayloadBuf = 0;
- psEnc->sCmn.nBytesInPayloadBuf = 0;
- psEnc->sCmn.oldest_LBRR_idx = 0;
- psEnc->sCmn.TargetRate_bps = 0; /* ensures that psEnc->SNR_dB is recomputed */
-
- SKP_memset( psEnc->sPred.prev_NLSFq_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) );
-
- /* Initialize non-zero parameters */
- psEnc->sCmn.prevLag = 100;
- psEnc->sCmn.prev_sigtype = SIG_TYPE_UNVOICED;
- psEnc->sCmn.first_frame_after_reset = 1;
- psEnc->sPrefilt.lagPrev = 100;
- psEnc->sShape.LastGainIndex = 1;
- psEnc->sNSQ.lagPrev = 100;
- psEnc->sNSQ.prev_inv_gain_Q16 = 65536;
- psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536;
- psEnc->sCmn.fs_kHz = fs_kHz;
- if( psEnc->sCmn.fs_kHz == 8 ) {
- psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER;
- psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_10;
- psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_10;
- } else {
- psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER;
- psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_16;
- psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_16;
- }
- psEnc->sCmn.frame_length = SKP_SMULBB( FRAME_LENGTH_MS, fs_kHz );
- psEnc->sCmn.subfr_length = SKP_DIV32_16( psEnc->sCmn.frame_length, NB_SUBFR );
- psEnc->sCmn.la_pitch = SKP_SMULBB( LA_PITCH_MS, fs_kHz );
- psEnc->sCmn.la_shape = SKP_SMULBB( LA_SHAPE_MS, fs_kHz );
- psEnc->sPred.min_pitch_lag = SKP_SMULBB( 3, fs_kHz );
- psEnc->sPred.max_pitch_lag = SKP_SMULBB( 18, fs_kHz );
- psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
- if( psEnc->sCmn.fs_kHz == 24 ) {
- psEnc->mu_LTP_Q8 = MU_LTP_QUANT_SWB_Q8;
- } else if( psEnc->sCmn.fs_kHz == 16 ) {
- psEnc->mu_LTP_Q8 = MU_LTP_QUANT_WB_Q8;
- } else if( psEnc->sCmn.fs_kHz == 12 ) {
- psEnc->mu_LTP_Q8 = MU_LTP_QUANT_MB_Q8;
- } else {
- psEnc->mu_LTP_Q8 = MU_LTP_QUANT_NB_Q8;
- }
- psEnc->sCmn.fs_kHz_changed = 1;
-
- /* Check that settings are valid */
- SKP_assert( ( psEnc->sCmn.subfr_length * NB_SUBFR ) == psEnc->sCmn.frame_length );
- }
-
- /* Set encoding complexity */
- if( Complexity == 0 || LOW_COMPLEXITY_ONLY ) {
- /* Low complexity */
- psEnc->sCmn.Complexity = 0;
- psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_LC_MODE;
- psEnc->pitchEstimationThreshold_Q16 = FIND_PITCH_CORRELATION_THRESHOLD_Q16_LC_MODE;
- psEnc->sCmn.pitchEstimationLPCOrder = 8;
- psEnc->sCmn.shapingLPCOrder = 12;
- psEnc->sCmn.nStatesDelayedDecision = 1;
- psEnc->NoiseShapingQuantizer = SKP_Silk_NSQ;
- psEnc->sCmn.useInterpolatedNLSFs = 0;
- psEnc->sCmn.LTPQuantLowComplexity = 1;
- psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS_LC_MODE;
- } else if( Complexity == 1 ) {
- /* Medium complexity */
- psEnc->sCmn.Complexity = 1;
- psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_MC_MODE;
- psEnc->pitchEstimationThreshold_Q16 = FIND_PITCH_CORRELATION_THRESHOLD_Q16_MC_MODE;
- psEnc->sCmn.pitchEstimationLPCOrder = 12;
- psEnc->sCmn.shapingLPCOrder = 16;
- psEnc->sCmn.nStatesDelayedDecision = 2;
- psEnc->NoiseShapingQuantizer = SKP_Silk_NSQ_del_dec;
- psEnc->sCmn.useInterpolatedNLSFs = 0;
- psEnc->sCmn.LTPQuantLowComplexity = 0;
- psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS_MC_MODE;
- } else if( Complexity == 2 ) {
- /* High complexity */
- psEnc->sCmn.Complexity = 2;
- psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_HC_MODE;
- psEnc->pitchEstimationThreshold_Q16 = FIND_PITCH_CORRELATION_THRESHOLD_Q16_HC_MODE;
- psEnc->sCmn.pitchEstimationLPCOrder = 16;
- psEnc->sCmn.shapingLPCOrder = 16;
- psEnc->sCmn.nStatesDelayedDecision = 4;
- psEnc->NoiseShapingQuantizer = SKP_Silk_NSQ_del_dec;
- psEnc->sCmn.useInterpolatedNLSFs = 1;
- psEnc->sCmn.LTPQuantLowComplexity = 0;
- psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS;
- } else {
- ret = SKP_SILK_ENC_WRONG_COMPLEXITY_SETTING;
- }
-
- /* Dont have higher Pitch estimation LPC order than predict LPC order */
- psEnc->sCmn.pitchEstimationLPCOrder = SKP_min_int( psEnc->sCmn.pitchEstimationLPCOrder, psEnc->sCmn.predictLPCOrder );
-
- SKP_assert( psEnc->sCmn.pitchEstimationLPCOrder <= FIND_PITCH_LPC_ORDER_MAX );
- SKP_assert( psEnc->sCmn.shapingLPCOrder <= SHAPE_LPC_ORDER_MAX );
- SKP_assert( psEnc->sCmn.nStatesDelayedDecision <= DEL_DEC_STATES_MAX );
-
- /* Set bitrate/coding quality */
- TargetRate_bps = SKP_min( TargetRate_bps, 100000 );
- if( psEnc->sCmn.fs_kHz == 8 ) {
- TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_NB_BPS );
- } else if( psEnc->sCmn.fs_kHz == 12 ) {
- TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_MB_BPS );
- } else if( psEnc->sCmn.fs_kHz == 16 ) {
- TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_WB_BPS );
- } else {
- TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_SWB_BPS );
- }
- if( TargetRate_bps != psEnc->sCmn.TargetRate_bps ) {
- psEnc->sCmn.TargetRate_bps = TargetRate_bps;
-
- /* if new TargetRate_bps, translate to SNR_dB value */
- if( psEnc->sCmn.fs_kHz == 8 ) {
- rateTable = TargetRate_table_NB;
- } else if( psEnc->sCmn.fs_kHz == 12 ) {
- rateTable = TargetRate_table_MB;
- } else if( psEnc->sCmn.fs_kHz == 16 ) {
- rateTable = TargetRate_table_WB;
- } else {
- rateTable = TargetRate_table_SWB;
- }
- for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) {
- /* find bitrate interval in table and interpolate */
- if( TargetRate_bps < rateTable[ k ] ) {
- frac_Q6 = SKP_DIV32( SKP_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), rateTable[ k ] - rateTable[ k - 1 ] );
- psEnc->SNR_dB_Q7 = SKP_LSHIFT( SNR_table_Q1[ k - 1 ], 6 ) + SKP_MUL( frac_Q6, SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] );
- break;
- }
- }
- }
-
- /* Set packet size */
- if( ( PacketSize_ms != 20 ) &&
- ( PacketSize_ms != 40 ) &&
- ( PacketSize_ms != 60 ) &&
- ( PacketSize_ms != 80 ) &&
- ( PacketSize_ms != 100 ) ) {
- ret = SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED;
- } else {
- if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) {
- psEnc->sCmn.PacketSize_ms = PacketSize_ms;
-
- /* Packet length changes. Reset LBRR buffer */
- SKP_Silk_LBRR_reset( &psEnc->sCmn );
- }
- }
-
- /* Set packet loss rate measured by farend */
- if( ( PacketLoss_perc < 0 ) || ( PacketLoss_perc > 100 ) ) {
- ret = SKP_SILK_ENC_WRONG_LOSS_RATE;
- }
- psEnc->sCmn.PacketLoss_perc = PacketLoss_perc;
-
-#if USE_LBRR
- if( INBandFec_enabled < 0 || INBandFec_enabled > 1 ) {
- ret = SKP_SILK_ENC_WRONG_INBAND_FEC_SETTING;
- }
-
- /* Only change settings if first frame in packet */
- if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
-
- psEnc->sCmn.LBRR_enabled = INBandFec_enabled;
- if( psEnc->sCmn.fs_kHz == 8 ) {
- LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 9000;
- } else if( psEnc->sCmn.fs_kHz == 12 ) {
- LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 6000;;
- } else if( psEnc->sCmn.fs_kHz == 16 ) {
- LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 3000;
- } else {
- LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS;
- }
-
- if( psEnc->sCmn.TargetRate_bps >= LBRRRate_thres_bps ) {
- /* Set gain increase / rate reduction for LBRR usage */
- /* Coarse tuned with pesq for now. */
- /* Linear regression coefs G = 8 - 0.5 * loss */
- /* Meaning that at 16% loss main rate and redundant rate is the same, -> G = 0 */
- psEnc->sCmn.LBRR_GainIncreases = SKP_max_int( 8 - SKP_RSHIFT( psEnc->sCmn.PacketLoss_perc, 1 ), 0 );
-
- /* Set main stream rate compensation */
- if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) {
- /* Tuned to give aprox same mean / weighted bitrate as no inband FEC */
- psEnc->inBandFEC_SNR_comp_Q8 = ( 6 << 8 ) - SKP_LSHIFT( psEnc->sCmn.LBRR_GainIncreases, 7 );
- } else {
- psEnc->inBandFEC_SNR_comp_Q8 = 0;
- psEnc->sCmn.LBRR_enabled = 0;
- }
- } else {
- psEnc->inBandFEC_SNR_comp_Q8 = 0;
- psEnc->sCmn.LBRR_enabled = 0;
- }
- }
-#else
- psEnc->sCmn.LBRR_enabled = 0;
-#endif
-
- /* Set DTX mode */
- if( DTX_enabled < 0 || DTX_enabled > 1 ) {
- ret = SKP_SILK_ENC_WRONG_DTX_SETTING;
- }
- psEnc->sCmn.useDTX = DTX_enabled;
-
- return ret;
-}
-
-/* Control low bitrate redundancy usage */
-void SKP_Silk_LBRR_ctrl_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */
-)
-{
- SKP_int LBRR_usage;
-
- if( psEnc->sCmn.LBRR_enabled ) {
- /* Control LBRR */
-
- /* Usage Control based on sensitivity and packet loss caracteristics */
- /* For now only enable adding to next for active frames. Make more complex later */
- LBRR_usage = SKP_SILK_NO_LBRR;
- if( psEnc->speech_activity_Q8 > LBRR_SPEECH_ACTIVITY_THRES_Q8 && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) { // nb! maybe multiply loss prob and speech activity
- //if( psEnc->PacketLoss_burst > BURST_THRES )
- // psEncCtrl->LBRR_usage = SKP_SILK_ADD_LBRR_TO_PLUS2;
- //} else {
- LBRR_usage = SKP_SILK_ADD_LBRR_TO_PLUS1;//SKP_SILK_NO_LBRR
- //}
- }
- psEncCtrl->sCmn.LBRR_usage = LBRR_usage;
- } else {
- psEncCtrl->sCmn.LBRR_usage = SKP_SILK_NO_LBRR;
- }
-}
--- a/src/SKP_Silk_corrMatrix_FIX.c
+++ /dev/null
@@ -1,152 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/**********************************************************************
- * Correlation Matrix Computations for LS estimate.
- **********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Calculates correlation vector X'*t */
-void SKP_Silk_corrVector_FIX(
- const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
- const SKP_int16 *t, /* I target vector [L] */
- const SKP_int L, /* I Length of vectors */
- const SKP_int order, /* I Max lag for correlation */
- SKP_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */
- const SKP_int rshifts /* I Right shifts of correlations */
-)
-{
- SKP_int lag, i;
- const SKP_int16 *ptr1, *ptr2;
- SKP_int32 inner_prod;
-
- ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */
- ptr2 = t;
- /* Calculate X'*t */
- if( rshifts > 0 ) {
- /* Right shifting used */
- for( lag = 0; lag < order; lag++ ) {
- inner_prod = 0;
- for( i = 0; i < L; i++ ) {
- inner_prod += SKP_RSHIFT32( SKP_SMULBB( ptr1[ i ], ptr2[i] ), rshifts );
- }
- Xt[ lag ] = inner_prod; /* X[:,lag]'*t */
- ptr1--; /* Go to next column of X */
- }
- } else {
- SKP_assert( rshifts == 0 );
- for( lag = 0; lag < order; lag++ ) {
- Xt[ lag ] = SKP_Silk_inner_prod_aligned( ptr1, ptr2, L ); /* X[:,lag]'*t */
- ptr1--; /* Go to next column of X */
- }
- }
-}
-
-/* Calculates correlation matrix X'*X */
-void SKP_Silk_corrMatrix_FIX(
- const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
- const SKP_int L, /* I Length of vectors */
- const SKP_int order, /* I Max lag for correlation */
- SKP_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ]*/
- SKP_int *rshifts /* I/O Right shifts of correlations */
-)
-{
- SKP_int i, j, lag, rshifts_local, head_room_rshifts;
- SKP_int32 energy;
- const SKP_int16 *ptr1, *ptr2;
-
- /* Calculate energy to find shift used to fit in 32 bits */
- SKP_Silk_sum_sqr_shift( &energy, &rshifts_local, x, L + order - 1 );
- /* Add shifts to get the wanted head room */
-
- head_room_rshifts = SKP_max( LTP_CORRS_HEAD_ROOM - SKP_Silk_CLZ32( energy ), 0 );
-
- energy = SKP_RSHIFT32( energy, head_room_rshifts );
- rshifts_local += head_room_rshifts;
-
- /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */
- /* Remove contribution of first order - 1 samples */
- for( i = 0; i < order - 1; i++ ) {
- energy -= SKP_RSHIFT32( SKP_SMULBB( x[ i ], x[ i ] ), rshifts_local );
- }
- if( rshifts_local < *rshifts ) {
- /* Adjust energy */
- energy = SKP_RSHIFT32( energy, *rshifts - rshifts_local );
- rshifts_local = *rshifts;
- }
-
- /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */
- /* Fill out the diagonal of the correlation matrix */
- matrix_ptr( XX, 0, 0, order ) = energy;
- ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */
- for( j = 1; j < order; j++ ) {
- energy = SKP_SUB32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), rshifts_local ) );
- energy = SKP_ADD32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ -j ], ptr1[ -j ] ), rshifts_local ) );
- matrix_ptr( XX, j, j, order ) = energy;
- }
-
- ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */
- /* Calculate the remaining elements of the correlation matrix */
- if( rshifts_local > 0 ) {
- /* Right shifting used */
- for( lag = 1; lag < order; lag++ ) {
- /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */
- energy = 0;
- for( i = 0; i < L; i++ ) {
- energy += SKP_RSHIFT32( SKP_SMULBB( ptr1[ i ], ptr2[i] ), rshifts_local );
- }
- /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */
- matrix_ptr( XX, lag, 0, order ) = energy;
- matrix_ptr( XX, 0, lag, order ) = energy;
- for( j = 1; j < ( order - lag ); j++ ) {
- energy = SKP_SUB32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), rshifts_local ) );
- energy = SKP_ADD32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ -j ], ptr2[ -j ] ), rshifts_local ) );
- matrix_ptr( XX, lag + j, j, order ) = energy;
- matrix_ptr( XX, j, lag + j, order ) = energy;
- }
- ptr2--; /* Update pointer to first sample of next column (lag) in X */
- }
- } else {
- for( lag = 1; lag < order; lag++ ) {
- /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */
- energy = SKP_Silk_inner_prod_aligned( ptr1, ptr2, L );
- matrix_ptr( XX, lag, 0, order ) = energy;
- matrix_ptr( XX, 0, lag, order ) = energy;
- /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */
- for( j = 1; j < ( order - lag ); j++ ) {
- energy = SKP_SUB32( energy, SKP_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) );
- energy = SKP_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] );
- matrix_ptr( XX, lag + j, j, order ) = energy;
- matrix_ptr( XX, j, lag + j, order ) = energy;
- }
- ptr2--;/* Update pointer to first sample of next column (lag) in X */
- }
- }
- *rshifts = rshifts_local;
-}
-
--- a/src/SKP_Silk_create_init_destroy.c
+++ /dev/null
@@ -1,55 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-
-/************************/
-/* Init Decoder State */
-/************************/
-SKP_int SKP_Silk_init_decoder(
- SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */
-)
-{
- SKP_memset( psDec, 0, sizeof( SKP_Silk_decoder_state ) );
- /* Set sampling rate to 24 kHz, and init non-zero values */
- SKP_Silk_decoder_set_fs( psDec, 24 );
-
- /* Used to deactivate e.g. LSF interpolation and fluctuation reduction */
- psDec->first_frame_after_reset = 1;
- psDec->prev_inv_gain_Q16 = 65536;
-
- /* Reset CNG state */
- SKP_Silk_CNG_Reset( psDec );
-
- SKP_Silk_PLC_Reset( psDec );
-
- psDec->bitstream_v = USE_BIT_STREAM_V;
-
- return(0);
-}
-
--- a/src/SKP_Silk_dec_API.c
+++ /dev/null
@@ -1,343 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SDK_API.h"
-#include "SKP_Silk_main_FIX.h"
-
-/*********************/
-/* Decoder functions */
-/*********************/
-
-SKP_int SKP_Silk_SDK_Get_Decoder_Size( SKP_int32 *decSizeBytes )
-{
- SKP_int ret = 0;
-
- *decSizeBytes = sizeof( SKP_Silk_decoder_state );
-
- return ret;
-}
-
-/* Reset decoder state */
-SKP_int SKP_Silk_SDK_InitDecoder(
- void* decState /* I/O: State */
-)
-{
- SKP_int ret = 0;
- SKP_Silk_decoder_state *struc;
-
- struc = (SKP_Silk_decoder_state *)decState;
-
- ret = SKP_Silk_init_decoder( struc );
-
- return ret;
-}
-
-/* Decode a frame */
-SKP_int SKP_Silk_SDK_Decode(
- void* decState, /* I/O: State */
- SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control structure */
- SKP_int lostFlag, /* I: 0: no loss, 1 loss */
- const SKP_uint8 *inData, /* I: Encoded input vector */
- const SKP_int nBytesIn, /* I: Number of input Bytes */
- SKP_int16 *samplesOut, /* O: Decoded output speech vector */
- SKP_int16 *nSamplesOut /* I/O: Number of samples (vector/decoded) */
-)
-{
- SKP_int ret = 0, used_bytes, prev_fs_kHz;
- SKP_Silk_decoder_state *psDec;
-
- psDec = (SKP_Silk_decoder_state *)decState;
-
- /**********************************/
- /* Test if first frame in payload */
- /**********************************/
- if( psDec->moreInternalDecoderFrames == 0 ) {
- /* First Frame in Payload */
- psDec->nFramesDecoded = 0; /* Used to count frames in packet */
- }
-
- if( psDec->moreInternalDecoderFrames == 0 && /* First frame in packet */
- lostFlag == 0 && /* Not packet loss */
- nBytesIn > MAX_ARITHM_BYTES ) { /* Too long payload */
- /* Avoid trying to decode a too large packet */
- lostFlag = 1;
- ret = SKP_SILK_DEC_PAYLOAD_TOO_LARGE;
- }
-
- /* Save previous sample frequency */
- prev_fs_kHz = psDec->fs_kHz;
-
- /* Call decoder for one frame */
- ret += SKP_Silk_decode_frame( psDec, samplesOut, nSamplesOut, inData, nBytesIn,
- lostFlag, &used_bytes );
-
- if( used_bytes ) { /* Only Call if not a packet loss */
- if( psDec->nBytesLeft > 0 && psDec->FrameTermination == SKP_SILK_MORE_FRAMES && psDec->nFramesDecoded < 5 ) {
- /* We have more frames in the Payload */
- psDec->moreInternalDecoderFrames = 1;
- } else {
- /* Last frame in Payload */
- psDec->moreInternalDecoderFrames = 0;
- psDec->nFramesInPacket = psDec->nFramesDecoded;
-
- /* Track inband FEC usage */
- if( psDec->vadFlag == VOICE_ACTIVITY ) {
- if( psDec->FrameTermination == SKP_SILK_LAST_FRAME ) {
- psDec->no_FEC_counter++;
- if( psDec->no_FEC_counter > NO_LBRR_THRES ) {
- psDec->inband_FEC_offset = 0;
- }
- } else if( psDec->FrameTermination == SKP_SILK_LBRR_VER1 ) {
- psDec->inband_FEC_offset = 1; /* FEC info with 1 packet delay */
- psDec->no_FEC_counter = 0;
- } else if( psDec->FrameTermination == SKP_SILK_LBRR_VER2 ) {
- psDec->inband_FEC_offset = 2; /* FEC info with 2 packets delay */
- psDec->no_FEC_counter = 0;
- }
- }
- }
- }
-
- if( psDec->fs_kHz * 1000 > decControl->sampleRate ) {
- ret = SKP_SILK_DEC_WRONG_SAMPLING_FREQUENCY;
- }
-
- /* Do any resampling if needed */
- if( psDec->fs_kHz * 1000 != decControl->sampleRate ) {
- SKP_int16 samplesOut_tmp[ 2 * MAX_FRAME_LENGTH ];
- SKP_int32 scratch[ 3 * MAX_FRAME_LENGTH ];
-
- /* Copy to a tmpbuffer as the resampling writes to samplesOut */
- memcpy( samplesOut_tmp, samplesOut, *nSamplesOut * sizeof( SKP_int16 ) );
-
- /* Clear resampler state when switching internal sampling frequency */
- if( prev_fs_kHz != psDec->fs_kHz ) {
- SKP_memset( psDec->resampleState, 0, sizeof( psDec->resampleState ) );
- }
-
- if( psDec->fs_kHz == 16 && decControl->sampleRate == 24000 ) {
- /* Resample from 16 kHz to 24 kHz */
- SKP_Silk_resample_3_2( samplesOut, psDec->resampleState, samplesOut_tmp, *nSamplesOut );
- } else if( psDec->fs_kHz == 12 && decControl->sampleRate == 24000 ) {
- /* Resample from 12 kHz to 24 kHz */
- SKP_Silk_resample_2_1_coarse( samplesOut_tmp, psDec->resampleState, samplesOut, scratch, *nSamplesOut );
- } else if( psDec->fs_kHz == 8 && decControl->sampleRate == 24000 ) {
- /* Resample from 8 kHz to 24 kHz */
- SKP_Silk_resample_3_1( samplesOut, psDec->resampleState, samplesOut_tmp, *nSamplesOut );
- } else if( psDec->fs_kHz == 12 && decControl->sampleRate == 16000 ) {
- /* Resample from 12 kHz to 16 kHz */
- SKP_Silk_resample_4_3( samplesOut, psDec->resampleState, samplesOut_tmp, *nSamplesOut );
- } else if( psDec->fs_kHz == 8 && decControl->sampleRate == 16000 ) {
- /* Resample from 8 kHz to 16 kHz */
- SKP_Silk_resample_2_1_coarse( samplesOut_tmp, psDec->resampleState, samplesOut, scratch, *nSamplesOut );
- } else if( psDec->fs_kHz == 8 && decControl->sampleRate == 12000 ) {
- /* Resample from 8 kHz to 12 kHz */
- SKP_Silk_resample_3_2( samplesOut, psDec->resampleState, samplesOut_tmp, *nSamplesOut );
- }
-
- *nSamplesOut = SKP_DIV32( ( SKP_int32 )*nSamplesOut * decControl->sampleRate, psDec->fs_kHz * 1000 );
- }
-
- /* Copy all parameters that are needed out of internal structure to the control stucture */
- decControl->frameSize = ( SKP_int )psDec->frame_length;
- decControl->framesPerPacket = ( SKP_int )psDec->nFramesInPacket;
- decControl->inBandFECOffset = ( SKP_int )psDec->inband_FEC_offset;
- decControl->moreInternalDecoderFrames = ( SKP_int )psDec->moreInternalDecoderFrames;
-
- return ret;
-}
-
-/* Function to find LBRR information in a packet */
-void SKP_Silk_SDK_search_for_LBRR(
- void *decState, /* I: Decoder state, to select bitstream version only */
- const SKP_uint8 *inData, /* I: Encoded input vector */
- const SKP_int16 nBytesIn, /* I: Number of input Bytes */
- SKP_int lost_offset, /* I: Offset from lost packet */
- SKP_uint8 *LBRRData, /* O: LBRR payload */
- SKP_int16 *nLBRRBytes /* O: Number of LBRR Bytes */
-)
-{
- SKP_Silk_decoder_state *psDec;
- SKP_Silk_decoder_state sDec; // Local decoder state to avoid interfering with running decoder */
- SKP_Silk_decoder_control sDecCtrl;
- SKP_int i, TempQ[ MAX_FRAME_LENGTH ];
-
- psDec = ( SKP_Silk_decoder_state * )decState;
-
- if( lost_offset < 1 || lost_offset > MAX_LBRR_DELAY ) {
- /* No useful FEC in this packet */
- *nLBRRBytes = 0;
- return;
- }
-
- sDec.nFramesDecoded = 0;
- sDec.fs_kHz = 0; /* Force update parameters LPC_order etc */
- SKP_memset( sDec.prevNLSF_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) );
- SKP_Silk_range_dec_init( &sDec.sRC, inData, ( SKP_int32 )nBytesIn );
-
- if( psDec->bitstream_v == BIT_STREAM_V4 ) { /* Silk_v4 payload */
- /* Decode all parameter indices for the whole packet*/
- SKP_Silk_decode_indices_v4( &sDec );
-
- /* Is there usable LBRR in this packet */
- *nLBRRBytes = 0;
- if( ( sDec.FrameTermination - 1 ) & lost_offset && sDec.FrameTermination > 0 && sDec.nBytesLeft >= 0 ) {
- /* The wanted FEC is present in the packet */
- for( i = 0; i < sDec.nFramesInPacket; i++ ) {
- SKP_Silk_decode_parameters_v4( &sDec, &sDecCtrl, TempQ, 0 );
-
- if( sDec.nBytesLeft <= 0 || sDec.sRC.error ) {
- /* Corrupt stream */
- LBRRData = NULL;
- *nLBRRBytes = 0;
- break;
- } else {
- sDec.nFramesDecoded++;
- }
- }
-
- if( LBRRData != NULL ) {
- /* The wanted FEC is present in the packet */
- *nLBRRBytes = sDec.nBytesLeft;
- SKP_memcpy( LBRRData, &inData[ nBytesIn - sDec.nBytesLeft ], sDec.nBytesLeft * sizeof( SKP_uint8 ) );
- }
- }
- } else { /* Silk_v3 payload */
- while(1) {
- SKP_Silk_decode_parameters( &sDec, &sDecCtrl, TempQ, 0 );
-
- if( sDec.sRC.error ) {
- /* Corrupt stream */
- *nLBRRBytes = 0;
- return;
- };
-
- if( ( sDec.FrameTermination - 1 ) & lost_offset && sDec.FrameTermination > 0 && sDec.nBytesLeft >= 0 ) {
- /* The wanted FEC is present in the packet */
- *nLBRRBytes = sDec.nBytesLeft;
- SKP_memcpy( LBRRData, &inData[ nBytesIn - sDec.nBytesLeft ], sDec.nBytesLeft * sizeof( SKP_uint8 ) );
- break;
- }
- if( sDec.nBytesLeft > 0 && sDec.FrameTermination == SKP_SILK_MORE_FRAMES ) {
- sDec.nFramesDecoded++;
- } else {
- LBRRData = NULL;
- *nLBRRBytes = 0;
- break;
- }
- }
- }
-}
-
-/* Getting type of content for a packet */
-void SKP_Silk_SDK_get_TOC(
- void *decState, /* I/O: Decoder state, to select bitstream version only */
- const SKP_uint8 *inData, /* I: Encoded input vector */
- const SKP_int16 nBytesIn, /* I: Number of input bytes */
- SKP_Silk_TOC_struct *Silk_TOC /* O: Type of content */
-)
-{
- SKP_Silk_decoder_state *psDec;
- SKP_Silk_decoder_state sDec; // Local Decoder state to avoid interfering with running decoder */
- SKP_Silk_decoder_control sDecCtrl;
- SKP_int i, TempQ[ MAX_FRAME_LENGTH ];
-
- psDec = (SKP_Silk_decoder_state *)decState;
-
- sDec.nFramesDecoded = 0;
- sDec.fs_kHz = 0; /* Force update parameters LPC_order etc */
- SKP_Silk_range_dec_init( &sDec.sRC, inData, ( SKP_int32 )nBytesIn );
-
- if( psDec->bitstream_v == BIT_STREAM_V4 ) { /* Silk_v4 payload */
- /* Decode all parameter indices for the whole packet*/
- SKP_Silk_decode_indices_v4( &sDec );
-
- if( sDec.nFramesInPacket > SILK_MAX_FRAMES_PER_PACKET || sDec.sRC.error ) {
- /* Corrupt packet */
- SKP_memset( Silk_TOC, 0, sizeof( SKP_Silk_TOC_struct ) );
- Silk_TOC->corrupt = 1;
- } else {
- Silk_TOC->corrupt = 0;
- Silk_TOC->framesInPacket = sDec.nFramesInPacket;
- Silk_TOC->fs_kHz = sDec.fs_kHz;
- if( sDec.FrameTermination == SKP_SILK_LAST_FRAME ) {
- Silk_TOC->inbandLBRR = sDec.FrameTermination;
- } else {
- Silk_TOC->inbandLBRR = sDec.FrameTermination - 1;
- }
- /* Copy data */
- for( i = 0; i < sDec.nFramesInPacket; i++ ) {
- Silk_TOC->vadFlags[ i ] = sDec.vadFlagBuf[ i ];
- Silk_TOC->sigtypeFlags[ i ] = sDec.sigtype[ i ];
- }
- }
- } else { /* Silk_v3 payload */
- Silk_TOC->corrupt = 0;
- while( 1 ) {
- SKP_Silk_decode_parameters( &sDec, &sDecCtrl, TempQ, 0 );
-
- Silk_TOC->vadFlags[ sDec.nFramesDecoded ] = sDec.vadFlag;
- Silk_TOC->sigtypeFlags[ sDec.nFramesDecoded ] = sDecCtrl.sigtype;
-
- if( sDec.sRC.error ) {
- /* Corrupt stream */
- Silk_TOC->corrupt = 1;
- break;
- };
-
- if( sDec.nBytesLeft > 0 && sDec.FrameTermination == SKP_SILK_MORE_FRAMES ) {
- sDec.nFramesDecoded++;
- } else {
- break;
- }
- }
- if( Silk_TOC->corrupt || sDec.FrameTermination == SKP_SILK_MORE_FRAMES ||
- sDec.nFramesInPacket > SILK_MAX_FRAMES_PER_PACKET ) {
- /* Corrupt packet */
- SKP_memset( Silk_TOC, 0, sizeof( SKP_Silk_TOC_struct ) );
- Silk_TOC->corrupt = 1;
- } else {
- Silk_TOC->framesInPacket = sDec.nFramesDecoded;
- Silk_TOC->fs_kHz = sDec.fs_kHz;
- if( sDec.FrameTermination == SKP_SILK_LAST_FRAME ) {
- Silk_TOC->inbandLBRR = sDec.FrameTermination;
- } else {
- Silk_TOC->inbandLBRR = sDec.FrameTermination - 1;
- }
- }
- }
-}
-
-/**************************/
-/* Get the version number */
-/**************************/
-/* Return a pointer to string specifying the version */
-const char *SKP_Silk_SDK_get_version()
-{
- static const char version[] = "1.0.2";
- return version;
-}
--- a/src/SKP_Silk_decode_core.c
+++ /dev/null
@@ -1,256 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/**********************************************************/
-/* Core decoder. Performs inverse NSQ operation LTP + LPC */
-/**********************************************************/
-void SKP_Silk_decode_core(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */
- SKP_int16 xq[], /* O Decoded speech */
- const SKP_int q[ MAX_FRAME_LENGTH ] /* I Pulse signal */
-)
-{
- SKP_int i, k, lag = 0, start_idx, NLSF_interpolation_flag, sigtype, LTP_scale_Q14;
- SKP_int16 *A_Q12, *B_Q14, *pxq, A_Q12_tmp[ MAX_LPC_ORDER ];
- SKP_int16 sLTP[ MAX_FRAME_LENGTH ];
- SKP_int32 Gain_Q16, *pred_lag_ptr, *pexc_Q10, *pres_Q10, LTP_pred_Q14, LPC_pred_Q10;
- SKP_int32 rand_seed, offset_Q10, dither;
- SKP_int32 vec_Q10[ MAX_FRAME_LENGTH / NB_SUBFR ], Atmp;
- SKP_int32 inv_gain_Q16, inv_gain_Q32, gain_adj_Q16, FiltState[ MAX_LPC_ORDER ];
- SKP_assert( psDec->prev_inv_gain_Q16 != 0 );
-
- offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psDecCtrl->sigtype ][ psDecCtrl->QuantOffsetType ];
-
- if( psDecCtrl->NLSFInterpCoef_Q2 < ( 1 << 2 ) ) {
- NLSF_interpolation_flag = 1;
- } else {
- NLSF_interpolation_flag = 0;
- }
-
-
- /* Decode excitation */
- rand_seed = psDecCtrl->Seed;
- for( i = 0; i < psDec->frame_length; i++ ) {
- rand_seed = SKP_RAND( rand_seed );
- /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */
- dither = SKP_RSHIFT( rand_seed, 31 );
-
- psDec->exc_Q10[ i ] = SKP_LSHIFT( ( SKP_int32 )q[ i ], 10 ) + offset_Q10;
- psDec->exc_Q10[ i ] = ( psDec->exc_Q10[ i ] ^ dither ) - dither;
-
- rand_seed += q[ i ];
- }
-
-
- pexc_Q10 = psDec->exc_Q10;
- pres_Q10 = psDec->res_Q10;
- pxq = &psDec->outBuf[ psDec->frame_length ];
- psDec->sLTP_buf_idx = psDec->frame_length;
- /* Loop over subframes */
- for( k = 0; k < NB_SUBFR; k++ ) {
- A_Q12 = psDecCtrl->PredCoef_Q12[ k >> 1 ];
-
- /* Preload LPC coeficients to array on stack. Gives small performance gain */
- SKP_memcpy( A_Q12_tmp, A_Q12, psDec->LPC_order * sizeof( SKP_int16 ) );
- B_Q14 = &psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER ];
- Gain_Q16 = psDecCtrl->Gains_Q16[ k ];
- LTP_scale_Q14 = psDecCtrl->LTP_scale_Q14;
- sigtype = psDecCtrl->sigtype;
-
- inv_gain_Q16 = SKP_DIV32( SKP_int32_MAX, SKP_RSHIFT( Gain_Q16, 1 ) );
- inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX );
-
- /* Calculate Gain adjustment factor */
- gain_adj_Q16 = ( SKP_int32 )1 << 16;
- if( inv_gain_Q16 != psDec->prev_inv_gain_Q16 ) {
- gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, psDec->prev_inv_gain_Q16, 16 );
- }
-
- /* Avoid abrupt transition from voiced PLC to unvoiced normal decoding */
- if( psDec->lossCnt && psDec->prev_sigtype == SIG_TYPE_VOICED &&
- psDecCtrl->sigtype == SIG_TYPE_UNVOICED && k < ( NB_SUBFR >> 1 ) ) {
-
- SKP_memset( B_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ) );
- B_Q14[ LTP_ORDER/2 ] = ( SKP_int16 )1 << 12; /* 0.25 */
-
- sigtype = SIG_TYPE_VOICED;
- psDecCtrl->pitchL[ k ] = psDec->lagPrev;
- LTP_scale_Q14 = ( SKP_int )1 << 14;
- }
- if( sigtype == SIG_TYPE_VOICED ) {
- /* Voiced */
-
- lag = psDecCtrl->pitchL[ k ];
- /* Re-whitening */
- if( ( k & ( 3 - SKP_LSHIFT( NLSF_interpolation_flag, 1 ) ) ) == 0 ) {
- /* Rewhiten with new A coefs */
- start_idx = psDec->frame_length - lag - psDec->LPC_order - LTP_ORDER / 2;
- start_idx = SKP_LIMIT( start_idx, 0, psDec->frame_length - psDec->LPC_order );
-
- SKP_Silk_MA_Prediction( &psDec->outBuf[ start_idx + k * ( psDec->frame_length >> 2 ) ],
- A_Q12, FiltState, sLTP + start_idx, psDec->frame_length - start_idx, psDec->LPC_order );
-
- /* After rewhitening the LTP state is unscaled */
- inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 );
- if( k == 0 ) {
- /* Do LTP downscaling */
- inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, psDecCtrl->LTP_scale_Q14 ), 2 );
- }
- for( i = 0; i < (lag + LTP_ORDER/2); i++ ) {
- psDec->sLTP_Q16[ psDec->sLTP_buf_idx - i - 1 ] = SKP_SMULWB( inv_gain_Q32, sLTP[ psDec->frame_length - i - 1 ] );
- }
- } else {
- /* Update LTP state when Gain changes */
- if( gain_adj_Q16 != ( SKP_int32 )1 << 16 ) {
- for( i = 0; i < ( lag + LTP_ORDER / 2 ); i++ ) {
- psDec->sLTP_Q16[ psDec->sLTP_buf_idx - i - 1 ] = SKP_SMULWW( gain_adj_Q16, psDec->sLTP_Q16[ psDec->sLTP_buf_idx - i - 1 ] );
- }
- }
- }
- }
-
- /* Scale short term state */
- for( i = 0; i < MAX_LPC_ORDER; i++ ) {
- psDec->sLPC_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, psDec->sLPC_Q14[ i ] );
- }
-
- /* Save inv_gain */
- SKP_assert( inv_gain_Q16 != 0 );
- psDec->prev_inv_gain_Q16 = inv_gain_Q16;
-
-
- /* Long-term prediction */
- if( sigtype == SIG_TYPE_VOICED ) {
- /* Setup pointer */
- pred_lag_ptr = &psDec->sLTP_Q16[ psDec->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
- for( i = 0; i < psDec->subfr_length; i++ ) {
- /* Unrolled loop */
- LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], B_Q14[ 0 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], B_Q14[ 1 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], B_Q14[ 2 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], B_Q14[ 3 ] );
- LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], B_Q14[ 4 ] );
- pred_lag_ptr++;
-
- /* Generate LPC residual */
- pres_Q10[ i ] = SKP_ADD32( pexc_Q10[ i ], SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) );
-
- /* Update states */
- psDec->sLTP_Q16[ psDec->sLTP_buf_idx ] = SKP_LSHIFT( pres_Q10[ i ], 6 );
- psDec->sLTP_buf_idx++;
- }
- } else {
- SKP_memcpy( pres_Q10, pexc_Q10, psDec->subfr_length * sizeof( SKP_int32 ) );
- }
-
-
- /* Short term prediction */
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLAWB and SMLAWT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLAWB and SMLAWT instructions should solve the problem. */
- if( psDec->LPC_order == 16 ) {
- for( i = 0; i < psDec->subfr_length; i++ ) {
- /* unrolled */
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 0 ] ); /* read two coefficients at once */
- LPC_pred_Q10 = SKP_SMULWB( psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 2 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 4 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 6 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 8 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 10 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 11 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 12 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 12 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 13 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 14 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 14 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 15 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 16 ], Atmp );
-
- /* Add prediction to LPC residual */
- vec_Q10[ i ] = SKP_ADD32( pres_Q10[ i ], LPC_pred_Q10 );
-
- /* Update states */
- psDec->sLPC_Q14[ MAX_LPC_ORDER + i ] = SKP_LSHIFT( vec_Q10[ i ], 4 );
- }
- } else {
- SKP_assert( psDec->LPC_order == 10 );
- for( i = 0; i < psDec->subfr_length; i++ ) {
- /* unrolled */
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 0 ] ); /* read two coefficients at once */
- LPC_pred_Q10 = SKP_SMULWB( psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 2 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 4 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 6 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], Atmp );
- Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 8 ] );
- LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], Atmp );
- LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], Atmp );
-
- /* Add prediction to LPC residual */
- vec_Q10[ i ] = SKP_ADD32( pres_Q10[ i ], LPC_pred_Q10 );
-
- /* Update states */
- psDec->sLPC_Q14[ MAX_LPC_ORDER + i ] = SKP_LSHIFT( vec_Q10[ i ], 4 );
- }
- }
-
- /* Scale with Gain */
- for( i = 0; i < psDec->subfr_length; i++ ) {
- pxq[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( vec_Q10[ i ], Gain_Q16 ), 10 ) );
- }
-
- /* Update LPC filter state */
- SKP_memcpy( psDec->sLPC_Q14, &psDec->sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) );
- pexc_Q10 += psDec->subfr_length;
- pres_Q10 += psDec->subfr_length;
- pxq += psDec->subfr_length;
- }
-
- /* Copy to output */
- SKP_memcpy( xq, &psDec->outBuf[ psDec->frame_length ], psDec->frame_length * sizeof( SKP_int16 ) );
-
-}
--- a/src/SKP_Silk_decode_frame.c
+++ /dev/null
@@ -1,167 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-
-#include "SKP_Silk_main.h"
-#include "SKP_Silk_PLC.h"
-
-/****************/
-/* Decode frame */
-/****************/
-SKP_int SKP_Silk_decode_frame(
- SKP_Silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */
- SKP_int16 pOut[], /* O Pointer to output speech frame */
- SKP_int16 *pN, /* O Pointer to size of output frame */
- const SKP_uint8 pCode[], /* I Pointer to payload */
- const SKP_int nBytes, /* I Payload length */
- SKP_int action, /* I Action from Jitter Buffer */
- SKP_int *decBytes /* O Used bytes to decode this frame */
-)
-{
- SKP_Silk_decoder_control sDecCtrl;
- SKP_int L, fs_Khz_old, LPC_order_old, ret = 0;
- SKP_int Pulses[ MAX_FRAME_LENGTH ];
-
-
- L = psDec->frame_length;
- sDecCtrl.LTP_scale_Q14 = 0;
-
- /* Safety checks */
- SKP_assert( L > 0 && L <= MAX_FRAME_LENGTH );
-
- /********************************************/
- /* Decode Frame if packet is not lost */
- /********************************************/
- *decBytes = 0;
- if( action == 0 ) {
- /********************************************/
- /* Initialize arithmetic coder */
- /********************************************/
- fs_Khz_old = psDec->fs_kHz;
- LPC_order_old = psDec->LPC_order;
- if( psDec->nFramesDecoded == 0 ) {
- /* Initialize range decoder state */
- SKP_Silk_range_dec_init( &psDec->sRC, pCode, nBytes );
-
- if( psDec->bitstream_v == BIT_STREAM_V4 ) {
- SKP_Silk_decode_indices_v4( psDec );
- }
- }
-
- /********************************************/
- /* Decode parameters and pulse signal */
- /********************************************/
- if( psDec->bitstream_v == BIT_STREAM_V4 ) {
- SKP_Silk_decode_parameters_v4( psDec, &sDecCtrl, Pulses, 1 );
- } else {
- SKP_Silk_decode_parameters( psDec, &sDecCtrl, Pulses, 1 );
- }
-
-
- if( psDec->sRC.error ) {
- psDec->nBytesLeft = 0;
-
- action = 1; /* PLC operation */
- psDec->fs_kHz = fs_Khz_old; /* revert fs if changed in decode_parameters */
- psDec->LPC_order = LPC_order_old; /* revert lpc_order if changed in decode_parameters */
- psDec->frame_length = fs_Khz_old * FRAME_LENGTH_MS;
- psDec->subfr_length = fs_Khz_old * FRAME_LENGTH_MS / NB_SUBFR;
-
- /* Avoid crashing */
- *decBytes = psDec->sRC.bufferLength;
-
- if( psDec->sRC.error == RANGE_CODER_DEC_PAYLOAD_TOO_LONG ) {
- ret = SKP_SILK_DEC_PAYLOAD_TOO_LARGE;
- } else {
- ret = SKP_SILK_DEC_PAYLOAD_ERROR;
- }
- } else {
- *decBytes = psDec->sRC.bufferLength - psDec->nBytesLeft;
- psDec->nFramesDecoded++;
-
- /* Update lengths. Sampling frequency could have changed */
- L = psDec->frame_length;
-
- /********************************************************/
- /* Run inverse NSQ */
- /********************************************************/
- SKP_Silk_decode_core( psDec, &sDecCtrl, pOut, Pulses );
-
- /********************************************************/
- /* Update PLC state */
- /********************************************************/
- SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, action );
-
- psDec->lossCnt = 0;
- psDec->prev_sigtype = sDecCtrl.sigtype;
-
- /* A frame has been decoded without errors */
- psDec->first_frame_after_reset = 0;
- }
- }
- /*************************************************************/
- /* Generate Concealment Frame if packet is lost, or corrupt */
- /*************************************************************/
- if( action == 1 ) {
- /* Handle packet loss by extrapolation */
- SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, action );
- psDec->lossCnt++;
-
- }
-
- /*************************/
- /* Update output buffer. */
- /*************************/
- SKP_memcpy( psDec->outBuf, pOut, L * sizeof( SKP_int16 ) );
-
- /****************************************************************/
- /* Ensure smooth connection of extrapolated and good frames */
- /****************************************************************/
- SKP_Silk_PLC_glue_frames( psDec, &sDecCtrl, pOut, L );
-
- /************************************************/
- /* Comfort noise generation / estimation */
- /************************************************/
- SKP_Silk_CNG( psDec, &sDecCtrl, pOut , L );
-
- /********************************************/
- /* HP filter output */
- /********************************************/
- SKP_assert( ( ( psDec->fs_kHz == 12 ) && ( L % 3 ) == 0 ) ||
- ( ( psDec->fs_kHz != 12 ) && ( L % 2 ) == 0 ) );
- SKP_Silk_biquad( pOut, psDec->HP_B, psDec->HP_A, psDec->HPState, pOut, L );
-
- /********************************************/
- /* set output frame length */
- /********************************************/
- *pN = ( SKP_int16 )L;
-
- /* Update some decoder state variables */
- psDec->lagPrev = sDecCtrl.pitchL[ NB_SUBFR - 1 ];
-
- return ret;
-}
--- a/src/SKP_Silk_decode_indices_v4.c
+++ /dev/null
@@ -1,195 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Decode indices from payload */
-void SKP_Silk_decode_indices_v4(
- SKP_Silk_decoder_state *psDec /* I/O State */
-)
-{
- SKP_int i, k, Ix, fs_kHz_dec, FrameIndex = 0, FrameTermination;
- SKP_int sigtype, QuantOffsetType, seed_int, nBytesUsed;
- SKP_int decode_absolute_lagIndex, delta_lagIndex, prev_lagIndex = 0;
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB = NULL;
- SKP_Silk_range_coder_state *psRC = &psDec->sRC;
- /************************/
- /* Decode sampling rate */
- /************************/
- /* only done for first frame of packet */
- if( psDec->nFramesDecoded == 0 ) {
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_SamplingRates_CDF, SKP_Silk_SamplingRates_offset );
-
- /* check that sampling rate is supported */
- if( Ix < 0 || Ix > 3 ) {
- psRC->error = RANGE_CODER_ILLEGAL_SAMPLING_RATE;
- return;
- }
- fs_kHz_dec = SKP_Silk_SamplingRates_table[ Ix ];
- SKP_Silk_decoder_set_fs( psDec, fs_kHz_dec );
-
- FrameIndex = 0;
- FrameTermination = SKP_SILK_MORE_FRAMES;
- }
-
- while( FrameTermination == SKP_SILK_MORE_FRAMES ) {
- /*******************/
- /* Decode VAD flag */
- /*******************/
- SKP_Silk_range_decoder( &psDec->vadFlagBuf[ FrameIndex ], psRC, SKP_Silk_vadflag_CDF, SKP_Silk_vadflag_offset );
-
- /*******************************************/
- /* Decode signal type and quantizer offset */
- /*******************************************/
- if( FrameIndex == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_CDF, SKP_Silk_type_offset_CDF_offset );
- } else {
- /* condidtional coding */
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_joint_CDF[ psDec->typeOffsetPrev ],
- SKP_Silk_type_offset_CDF_offset );
- }
- sigtype = SKP_RSHIFT( Ix, 1 );
- QuantOffsetType = Ix & 1;
- psDec->typeOffsetPrev = Ix;
-
- /****************/
- /* Decode gains */
- /****************/
- /* first subframe */
- if( FrameIndex == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_decoder( &psDec->GainsIndices[ FrameIndex ][ 0 ], psRC, SKP_Silk_gain_CDF[ sigtype ], SKP_Silk_gain_CDF_offset );
- } else {
- /* condidtional coding */
- SKP_Silk_range_decoder( &psDec->GainsIndices[ FrameIndex ][ 0 ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset );
- }
-
- /* remaining subframes */
- for( i = 1; i < NB_SUBFR; i++ ) {
- SKP_Silk_range_decoder( &psDec->GainsIndices[ FrameIndex ][ i ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset );
- }
-
- /**********************/
- /* Decode LSF Indices */
- /**********************/
-
- /* Set pointer to LSF VQ CB for the current signal type */
- psNLSF_CB = psDec->psNLSF_CB[ sigtype ];
-
- /* Arithmetically decode NLSF path */
- SKP_Silk_range_decoder_multi( psDec->NLSFIndices[ FrameIndex ], psRC, psNLSF_CB->StartPtr, psNLSF_CB->MiddleIx, psNLSF_CB->nStages );
-
- /***********************************/
- /* Decode LSF interpolation factor */
- /***********************************/
- SKP_Silk_range_decoder( &psDec->NLSFInterpCoef_Q2[ FrameIndex ], psRC, SKP_Silk_NLSF_interpolation_factor_CDF,
- SKP_Silk_NLSF_interpolation_factor_offset );
-
- if( sigtype == SIG_TYPE_VOICED ) {
- /*********************/
- /* Decode pitch lags */
- /*********************/
- /* Get lag index */
- decode_absolute_lagIndex = 1;
- if( FrameIndex > 0 && psDec->sigtype[ FrameIndex - 1 ] == SIG_TYPE_VOICED ) {
- /* Decode Delta index */
- SKP_Silk_range_decoder( &delta_lagIndex,psRC, SKP_Silk_pitch_delta_CDF, SKP_Silk_pitch_delta_CDF_offset );
- if( delta_lagIndex < ( MAX_DELTA_LAG << 1 ) + 1 ) {
- delta_lagIndex = delta_lagIndex - MAX_DELTA_LAG;
- psDec->lagIndex[ FrameIndex ] = prev_lagIndex + delta_lagIndex;
- decode_absolute_lagIndex = 0;
- }
- }
- if( decode_absolute_lagIndex ) {
- /* Absolute decoding */
- if( psDec->fs_kHz == 8 ) {
- SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_NB_CDF, SKP_Silk_pitch_lag_NB_CDF_offset );
- } else if( psDec->fs_kHz == 12 ) {
- SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_MB_CDF, SKP_Silk_pitch_lag_MB_CDF_offset );
- } else if( psDec->fs_kHz == 16 ) {
- SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_WB_CDF, SKP_Silk_pitch_lag_WB_CDF_offset );
- } else {
- SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_SWB_CDF, SKP_Silk_pitch_lag_SWB_CDF_offset );
- }
- }
- prev_lagIndex = psDec->lagIndex[ FrameIndex ];
-
- /* Get countour index */
- if( psDec->fs_kHz == 8 ) {
- /* Less codevectors used in 8 khz mode */
- SKP_Silk_range_decoder( &psDec->contourIndex[ FrameIndex ], psRC, SKP_Silk_pitch_contour_NB_CDF, SKP_Silk_pitch_contour_NB_CDF_offset );
- } else {
- /* Joint for 12, 16, and 24 khz */
- SKP_Silk_range_decoder( &psDec->contourIndex[ FrameIndex ], psRC, SKP_Silk_pitch_contour_CDF, SKP_Silk_pitch_contour_CDF_offset );
- }
-
- /********************/
- /* Decode LTP gains */
- /********************/
- /* Decode PERIndex value */
- SKP_Silk_range_decoder( &psDec->PERIndex[ FrameIndex ], psRC, SKP_Silk_LTP_per_index_CDF, SKP_Silk_LTP_per_index_CDF_offset );
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- SKP_Silk_range_decoder( &psDec->LTPIndex[ FrameIndex ][ k ], psRC, SKP_Silk_LTP_gain_CDF_ptrs[ psDec->PERIndex[ FrameIndex ] ],
- SKP_Silk_LTP_gain_CDF_offsets[ psDec->PERIndex[ FrameIndex ] ] );
- }
-
- /**********************/
- /* Decode LTP scaling */
- /**********************/
- SKP_Silk_range_decoder( &psDec->LTP_scaleIndex[ FrameIndex ], psRC, SKP_Silk_LTPscale_CDF, SKP_Silk_LTPscale_offset );
- }
-
- /***************/
- /* Decode seed */
- /***************/
- SKP_Silk_range_decoder( &seed_int, psRC, SKP_Silk_Seed_CDF, SKP_Silk_Seed_offset );
- psDec->Seed[ FrameIndex ] = ( SKP_int32 )seed_int;
- /**************************************/
- /* Decode Frame termination indicator */
- /**************************************/
- SKP_Silk_range_decoder( &FrameTermination, psRC, SKP_Silk_FrameTermination_v4_CDF, SKP_Silk_FrameTermination_v4_offset );
-
- psDec->sigtype[ FrameIndex ] = sigtype;
- psDec->QuantOffsetType[ FrameIndex ] = QuantOffsetType;
-
- FrameIndex++;
- }
-
- /****************************************/
- /* get number of bytes used so far */
- /****************************************/
- SKP_Silk_range_coder_get_length( psRC, &nBytesUsed );
- psDec->nBytesLeft = psRC->bufferLength - nBytesUsed;
- if( psDec->nBytesLeft < 0 ) {
- psRC->error = RANGE_CODER_READ_BEYOND_BUFFER;
- }
-
- psDec->nFramesInPacket = FrameIndex;
- psDec->FrameTermination = FrameTermination;
-}
--- a/src/SKP_Silk_decode_parameters.c
+++ /dev/null
@@ -1,243 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Decode parameters from payload */
-void SKP_Silk_decode_parameters(
- SKP_Silk_decoder_state *psDec, /* I/O State */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int q[], /* O Excitation signal */
- const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */
-)
-{
- SKP_int i, k, Ix, fs_kHz_dec, nBytesUsed;
- SKP_int Ixs[ NB_SUBFR ];
- SKP_int GainsIndices[ NB_SUBFR ];
- SKP_int NLSFIndices[ NLSF_MSVQ_MAX_CB_STAGES ];
- SKP_int pNLSF_Q15[ MAX_LPC_ORDER ], pNLSF0_Q15[ MAX_LPC_ORDER ];
- const SKP_int16 *cbk_ptr_Q14;
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB = NULL;
- SKP_Silk_range_coder_state *psRC = &psDec->sRC;
-
- /************************/
- /* Decode sampling rate */
- /************************/
- /* only done for first frame of packet */
- if( psDec->nFramesDecoded == 0 ) {
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_SamplingRates_CDF, SKP_Silk_SamplingRates_offset );
-
- /* check that sampling rate is supported */
- if( Ix < 0 || Ix > 3 ) {
- psRC->error = RANGE_CODER_ILLEGAL_SAMPLING_RATE;
- return;
- }
- fs_kHz_dec = SKP_Silk_SamplingRates_table[ Ix ];
- SKP_Silk_decoder_set_fs( psDec, fs_kHz_dec );
- }
-
- /*******************************************/
- /* Decode signal type and quantizer offset */
- /*******************************************/
- if( psDec->nFramesDecoded == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_CDF, SKP_Silk_type_offset_CDF_offset );
- } else {
- /* condidtional coding */
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_joint_CDF[ psDec->typeOffsetPrev ],
- SKP_Silk_type_offset_CDF_offset );
- }
- psDecCtrl->sigtype = SKP_RSHIFT( Ix, 1 );
- psDecCtrl->QuantOffsetType = Ix & 1;
- psDec->typeOffsetPrev = Ix;
-
- /****************/
- /* Decode gains */
- /****************/
- /* first subframe */
- if( psDec->nFramesDecoded == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_decoder( &GainsIndices[ 0 ], psRC, SKP_Silk_gain_CDF[ psDecCtrl->sigtype ], SKP_Silk_gain_CDF_offset );
- } else {
- /* condidtional coding */
- SKP_Silk_range_decoder( &GainsIndices[ 0 ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset );
- }
-
- /* remaining subframes */
- for( i = 1; i < NB_SUBFR; i++ ) {
- SKP_Silk_range_decoder( &GainsIndices[ i ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset );
- }
-
- /* Dequant Gains */
- SKP_Silk_gains_dequant( psDecCtrl->Gains_Q16, GainsIndices, &psDec->LastGainIndex, psDec->nFramesDecoded );
- /****************/
- /* Decode NLSFs */
- /****************/
- /* Set pointer to NLSF VQ CB for the current signal type */
- psNLSF_CB = psDec->psNLSF_CB[ psDecCtrl->sigtype ];
-
- /* Arithmetically decode NLSF path */
- SKP_Silk_range_decoder_multi( NLSFIndices, psRC, psNLSF_CB->StartPtr, psNLSF_CB->MiddleIx, psNLSF_CB->nStages );
-
- /* From the NLSF path, decode an NLSF vector */
- SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, NLSFIndices, psDec->LPC_order );
-
- /************************************/
- /* Decode NLSF interpolation factor */
- /************************************/
- SKP_Silk_range_decoder( &psDecCtrl->NLSFInterpCoef_Q2, psRC, SKP_Silk_NLSF_interpolation_factor_CDF,
- SKP_Silk_NLSF_interpolation_factor_offset );
-
- /* If just reset, e.g., because internal Fs changed, do not allow interpolation */
- /* improves the case of packet loss in the first frame after a switch */
- if( psDec->first_frame_after_reset == 1 ) {
- psDecCtrl->NLSFInterpCoef_Q2 = 4;
- }
-
- if( fullDecoding ) {
- /* Convert NLSF parameters to AR prediction filter coefficients */
- SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order );
-
- if( psDecCtrl->NLSFInterpCoef_Q2 < 4 ) {
- /* Calculation of the interpolated NLSF0 vector from the interpolation factor, */
- /* the previous NLSF1, and the current NLSF1 */
- for( i = 0; i < psDec->LPC_order; i++ ) {
- pNLSF0_Q15[ i ] = psDec->prevNLSF_Q15[ i ] + SKP_RSHIFT( SKP_MUL( psDecCtrl->NLSFInterpCoef_Q2,
- ( pNLSF_Q15[ i ] - psDec->prevNLSF_Q15[ i ] ) ), 2 );
- }
-
- /* Convert NLSF parameters to AR prediction filter coefficients */
- SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order );
- } else {
- /* Copy LPC coefficients for first half from second half */
- SKP_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ],
- psDec->LPC_order * sizeof( SKP_int16 ) );
- }
- }
-
- SKP_memcpy( psDec->prevNLSF_Q15, pNLSF_Q15, psDec->LPC_order * sizeof( SKP_int ) );
-
- /* After a packet loss do BWE of LPC coefs */
- if( psDec->lossCnt ) {
- SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 0 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 );
- SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 );
- }
-
- if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) {
- /*********************/
- /* Decode pitch lags */
- /*********************/
- /* Get lag index */
- if( psDec->fs_kHz == 8 ) {
- SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_NB_CDF, SKP_Silk_pitch_lag_NB_CDF_offset );
- } else if( psDec->fs_kHz == 12 ) {
- SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_MB_CDF, SKP_Silk_pitch_lag_MB_CDF_offset );
- } else if( psDec->fs_kHz == 16 ) {
- SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_WB_CDF, SKP_Silk_pitch_lag_WB_CDF_offset );
- } else {
- SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_SWB_CDF, SKP_Silk_pitch_lag_SWB_CDF_offset );
- }
-
- /* Get countour index */
- if( psDec->fs_kHz == 8 ) {
- /* Less codevectors used in 8 khz mode */
- SKP_Silk_range_decoder( &Ixs[ 1 ], psRC, SKP_Silk_pitch_contour_NB_CDF, SKP_Silk_pitch_contour_NB_CDF_offset );
- } else {
- /* Joint for 12, 16, and 24 khz */
- SKP_Silk_range_decoder( &Ixs[ 1 ], psRC, SKP_Silk_pitch_contour_CDF, SKP_Silk_pitch_contour_CDF_offset );
- }
-
- /* Decode pitch values */
- SKP_Silk_decode_pitch( Ixs[ 0 ], Ixs[ 1 ], psDecCtrl->pitchL, psDec->fs_kHz );
-
- /********************/
- /* Decode LTP gains */
- /********************/
- /* Decode PERIndex value */
- SKP_Silk_range_decoder( &psDecCtrl->PERIndex, psRC, SKP_Silk_LTP_per_index_CDF,
- SKP_Silk_LTP_per_index_CDF_offset );
-
- /* Decode Codebook Index */
- cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ psDecCtrl->PERIndex ]; // set pointer to start of codebook
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_LTP_gain_CDF_ptrs[ psDecCtrl->PERIndex ],
- SKP_Silk_LTP_gain_CDF_offsets[ psDecCtrl->PERIndex ] );
-
- for( i = 0; i < LTP_ORDER; i++ ) {
- psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( k, LTP_ORDER ) + i ] = cbk_ptr_Q14[ SKP_SMULBB( Ix, LTP_ORDER ) + i ];
- }
- }
-
- /**********************/
- /* Decode LTP scaling */
- /**********************/
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_LTPscale_CDF, SKP_Silk_LTPscale_offset );
- psDecCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ Ix ];
- } else {
- SKP_memset( psDecCtrl->pitchL, 0, NB_SUBFR * sizeof( SKP_int ) );
- SKP_memset( psDecCtrl->LTPCoef_Q14, 0, NB_SUBFR * LTP_ORDER * sizeof( SKP_int16 ) );
- psDecCtrl->PERIndex = 0;
- psDecCtrl->LTP_scale_Q14 = 0;
- }
-
- /***************/
- /* Decode seed */
- /***************/
- SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_Seed_CDF, SKP_Silk_Seed_offset );
- psDecCtrl->Seed = ( SKP_int32 )Ix;
- /*********************************************/
- /* Decode quantization indices of excitation */
- /*********************************************/
- SKP_Silk_decode_pulses( psRC, psDecCtrl, q, psDec->frame_length );
-
- /*********************************************/
- /* Decode VAD flag */
- /*********************************************/
- SKP_Silk_range_decoder( &psDec->vadFlag, psRC, SKP_Silk_vadflag_CDF, SKP_Silk_vadflag_offset );
-
- /**************************************/
- /* Decode Frame termination indicator */
- /**************************************/
- SKP_Silk_range_decoder( &psDec->FrameTermination, psRC, SKP_Silk_FrameTermination_CDF, SKP_Silk_FrameTermination_offset );
-
- /****************************************/
- /* get number of bytes used so far */
- /****************************************/
- SKP_Silk_range_coder_get_length( psRC, &nBytesUsed );
- psDec->nBytesLeft = psRC->bufferLength - nBytesUsed;
- if( psDec->nBytesLeft < 0 ) {
- psRC->error = RANGE_CODER_READ_BEYOND_BUFFER;
- }
-
- /****************************************/
- /* check remaining bits in last byte */
- /****************************************/
- if( psDec->nBytesLeft == 0 ) {
- SKP_Silk_range_coder_check_after_decoding( psRC );
- }
-}
--- a/src/SKP_Silk_decode_parameters_v4.c
+++ /dev/null
@@ -1,157 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Decode parameters from payload */
-void SKP_Silk_decode_parameters_v4(
- SKP_Silk_decoder_state *psDec, /* I/O State */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int q[ MAX_FRAME_LENGTH ], /* O Excitation signal */
- const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */
-)
-{
- SKP_int i, k, Ix, nBytesUsed;
- SKP_int pNLSF_Q15[ MAX_LPC_ORDER ], pNLSF0_Q15[ MAX_LPC_ORDER ];
- const SKP_int16 *cbk_ptr_Q14;
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB = NULL;
- SKP_Silk_range_coder_state *psRC = &psDec->sRC;
-
- psDec->FrameTermination = SKP_SILK_MORE_FRAMES;
- psDecCtrl->sigtype = psDec->sigtype[ psDec->nFramesDecoded ];
- psDecCtrl->QuantOffsetType = psDec->QuantOffsetType[ psDec->nFramesDecoded ];
- psDec->vadFlag = psDec->vadFlagBuf[ psDec->nFramesDecoded ];
- psDecCtrl->NLSFInterpCoef_Q2 = psDec->NLSFInterpCoef_Q2[ psDec->nFramesDecoded ];
- psDecCtrl->Seed = psDec->Seed[ psDec->nFramesDecoded ];
-
- /* Dequant Gains */
- SKP_Silk_gains_dequant( psDecCtrl->Gains_Q16, psDec->GainsIndices[ psDec->nFramesDecoded ], &psDec->LastGainIndex, psDec->nFramesDecoded );
- /****************/
- /* Decode NLSFs */
- /****************/
-
- /* Set pointer to NLSF VQ CB for the current signal type */
- psNLSF_CB = psDec->psNLSF_CB[ psDecCtrl->sigtype ];
-
- /* From the NLSF path, decode an NLSF vector */
- SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, psDec->NLSFIndices[ psDec->nFramesDecoded ], psDec->LPC_order );
-
- /* Convert NLSF parameters to AR prediction filter coefficients */
- SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order );
-
- /* If just reset, e.g., because internal Fs changed, do not allow interpolation */
- /* improves the case of packet loss in the first frame after a switch */
- if( psDec->first_frame_after_reset == 1 ) {
- psDecCtrl->NLSFInterpCoef_Q2 = 4;
- }
-
- if( psDecCtrl->NLSFInterpCoef_Q2 < 4 ) {
- /* Calculation of the interpolated NLSF0 vector from the interpolation factor, */
- /* the previous NLSF1, and the current NLSF1 */
- for( i = 0; i < psDec->LPC_order; i++ ) {
- pNLSF0_Q15[ i ] = psDec->prevNLSF_Q15[ i ] + SKP_RSHIFT( SKP_MUL( psDecCtrl->NLSFInterpCoef_Q2,
- ( pNLSF_Q15[ i ] - psDec->prevNLSF_Q15[ i ] ) ), 2 );
- }
-
- /* Convert NLSF parameters to AR prediction filter coefficients */
- SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order );
- } else {
- /* Copy LPC coefficients for first half from second half */
- SKP_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ],
- psDec->LPC_order * sizeof( SKP_int16 ) );
- }
-
- SKP_memcpy( psDec->prevNLSF_Q15, pNLSF_Q15, psDec->LPC_order * sizeof( SKP_int ) );
-
- /* After a packet loss do BWE of LPC coefs */
- if( psDec->lossCnt ) {
- SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 0 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 );
- SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 );
- }
-
- if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) {
- /*********************/
- /* Decode pitch lags */
- /*********************/
-
- /* Decode pitch values */
- SKP_Silk_decode_pitch( psDec->lagIndex[ psDec->nFramesDecoded ],
- psDec->contourIndex[ psDec->nFramesDecoded ], psDecCtrl->pitchL, psDec->fs_kHz );
-
- /********************/
- /* Decode LTP gains */
- /********************/
- psDecCtrl->PERIndex = psDec->PERIndex[ psDec->nFramesDecoded ];
-
- /* Decode Codebook Index */
- cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ psDecCtrl->PERIndex ]; /* set pointer to start of codebook */
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- Ix = psDec->LTPIndex[ psDec->nFramesDecoded ][ k ];
- for( i = 0; i < LTP_ORDER; i++ ) {
- psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( k, LTP_ORDER ) + i ] = cbk_ptr_Q14[ SKP_SMULBB( Ix, LTP_ORDER ) + i ];
- }
- }
-
- /**********************/
- /* Decode LTP scaling */
- /**********************/
- Ix = psDec->LTP_scaleIndex[ psDec->nFramesDecoded ];
- psDecCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ Ix ];
- } else {
- SKP_memset( psDecCtrl->pitchL, 0, NB_SUBFR * sizeof( SKP_int ) );
- SKP_memset( psDecCtrl->LTPCoef_Q14, 0, NB_SUBFR * LTP_ORDER * sizeof( SKP_int16 ) );
- psDecCtrl->PERIndex = 0;
- psDecCtrl->LTP_scale_Q14 = 0;
- }
-
- /*********************************************/
- /* Decode quantization indices of excitation */
- /*********************************************/
- SKP_Silk_decode_pulses( psRC, psDecCtrl, q, psDec->frame_length );
-
- /****************************************/
- /* get number of bytes used so far */
- /****************************************/
- SKP_Silk_range_coder_get_length( psRC, &nBytesUsed );
- psDec->nBytesLeft = psRC->bufferLength - nBytesUsed;
- if( psDec->nBytesLeft < 0 ) {
- psRC->error = RANGE_CODER_READ_BEYOND_BUFFER;
- }
-
- /****************************************/
- /* check remaining bits in last byte */
- /****************************************/
- if( psDec->nBytesLeft == 0 ) {
- SKP_Silk_range_coder_check_after_decoding( psRC );
- }
-
- if( psDec->nFramesInPacket == (psDec->nFramesDecoded + 1)) {
- /* To indicate the packet has been fully decoded */
- psDec->FrameTermination = SKP_SILK_LAST_FRAME;
- }
-}
--- a/src/SKP_Silk_decode_pulses.c
+++ /dev/null
@@ -1,105 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/*********************************************/
-/* Decode quantization indices of excitation */
-/*********************************************/
-void SKP_Silk_decode_pulses(
- SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int q[], /* O Excitation signal */
- const SKP_int frame_length /* I Frame length (preliminary) */
-)
-{
- SKP_int i, j, k, iter, abs_q, nLS, bit;
- SKP_int sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ];
- SKP_int *pulses_ptr;
- const SKP_uint16 *cdf_ptr;
-
- /*********************/
- /* Decode rate level */
- /*********************/
- SKP_Silk_range_decoder( &psDecCtrl->RateLevelIndex, psRC,
- SKP_Silk_rate_levels_CDF[ psDecCtrl->sigtype ], SKP_Silk_rate_levels_CDF_offset );
-
- /* Calculate number of shell blocks */
- iter = frame_length / SHELL_CODEC_FRAME_LENGTH;
-
- /***************************************************/
- /* Sum-Weighted-Pulses Decoding */
- /***************************************************/
- cdf_ptr = SKP_Silk_pulses_per_block_CDF[ psDecCtrl->RateLevelIndex ];
- for( i = 0; i < iter; i++ ) {
- nLshifts[ i ] = 0;
- SKP_Silk_range_decoder( &sum_pulses[ i ], psRC, cdf_ptr, SKP_Silk_pulses_per_block_CDF_offset );
-
- /* LSB indication */
- while( sum_pulses[ i ] == ( MAX_PULSES + 1 ) ) {
- nLshifts[ i ]++;
- SKP_Silk_range_decoder( &sum_pulses[ i ], psRC,
- SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ], SKP_Silk_pulses_per_block_CDF_offset );
- }
- }
-
- /***************************************************/
- /* Shell decoding */
- /***************************************************/
- for( i = 0; i < iter; i++ ) {
- if( sum_pulses[ i ] > 0 ) {
- SKP_Silk_shell_decoder( &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRC, sum_pulses[ i ] );
- } else {
- SKP_memset( &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( SKP_int ) );
- }
- }
-
- /***************************************************/
- /* LSB Decoding */
- /***************************************************/
- for( i = 0; i < iter; i++ ) {
- if( nLshifts[ i ] > 0 ) {
- nLS = nLshifts[ i ];
- pulses_ptr = &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ];
- for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
- abs_q = pulses_ptr[ k ];
- for( j = 0; j < nLS; j++ ) {
- abs_q = SKP_LSHIFT( abs_q, 1 );
- SKP_Silk_range_decoder( &bit, psRC, SKP_Silk_lsb_CDF, 1 );
- abs_q += bit;
- }
- pulses_ptr[ k ] = abs_q;
- }
- }
- }
-
- /****************************************/
- /* Decode and add signs to pulse signal */
- /****************************************/
- SKP_Silk_decode_signs( psRC, q, frame_length, psDecCtrl->sigtype,
- psDecCtrl->QuantOffsetType, psDecCtrl->RateLevelIndex);
-}
--- a/src/SKP_Silk_decoder_set_fs.c
+++ /dev/null
@@ -1,81 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Set decoder sampling rate */
-void SKP_Silk_decoder_set_fs(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state pointer */
- SKP_int fs_kHz /* I Sampling frequency (kHz) */
-)
-{
- if( psDec->fs_kHz != fs_kHz ) {
- psDec->fs_kHz = fs_kHz;
- psDec->frame_length = SKP_SMULBB( FRAME_LENGTH_MS, fs_kHz );
- psDec->subfr_length = SKP_SMULBB( FRAME_LENGTH_MS / NB_SUBFR, fs_kHz );
- if( psDec->fs_kHz == 8 ) {
- psDec->LPC_order = MIN_LPC_ORDER;
- psDec->psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_10;
- psDec->psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_10;
- } else {
- psDec->LPC_order = MAX_LPC_ORDER;
- psDec->psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_16;
- psDec->psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_16;
- }
- /* Reset part of the decoder state */
- SKP_memset( psDec->sLPC_Q14, 0, MAX_LPC_ORDER * sizeof( SKP_int32 ) );
- SKP_memset( psDec->outBuf, 0, MAX_FRAME_LENGTH * sizeof( SKP_int16 ) );
- SKP_memset( psDec->prevNLSF_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) );
-
- psDec->sLTP_buf_idx = 0;
- psDec->lagPrev = 100;
- psDec->LastGainIndex = 1;
- psDec->prev_sigtype = 0;
- psDec->first_frame_after_reset = 1;
-
- if( fs_kHz == 24 ) {
- psDec->HP_A = SKP_Silk_Dec_A_HP_24;
- psDec->HP_B = SKP_Silk_Dec_B_HP_24;
- } else if( fs_kHz == 16 ) {
- psDec->HP_A = SKP_Silk_Dec_A_HP_16;
- psDec->HP_B = SKP_Silk_Dec_B_HP_16;
- } else if( fs_kHz == 12 ) {
- psDec->HP_A = SKP_Silk_Dec_A_HP_12;
- psDec->HP_B = SKP_Silk_Dec_B_HP_12;
- } else if( fs_kHz == 8 ) {
- psDec->HP_A = SKP_Silk_Dec_A_HP_8;
- psDec->HP_B = SKP_Silk_Dec_B_HP_8;
- } else {
- /* unsupported sampling rate */
- SKP_assert( 0 );
- }
- }
-
- /* Check that settings are valid */
- SKP_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH );
-}
-
--- a/src/SKP_Silk_define.h
+++ /dev/null
@@ -1,330 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_DEFINE_H
-#define SKP_SILK_DEFINE_H
-
-#include "SKP_Silk_errors.h"
-#include "SKP_Silk_typedef.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
-#define MAX_FRAMES_PER_PACKET 5
-#define BIT_STREAM_V3 3
-#define BIT_STREAM_V4 4
-#define USE_BIT_STREAM_V BIT_STREAM_V3 // Should be moved to a API call
-
-
-/* MAX DELTA LAG used for multiframe packets */
-#define MAX_DELTA_LAG 10
-
-/* Lower limit on bitrate for each mode */
-#define MIN_TARGET_RATE_NB_BPS 5000
-#define MIN_TARGET_RATE_MB_BPS 7000
-#define MIN_TARGET_RATE_WB_BPS 8000
-#define MIN_TARGET_RATE_SWB_BPS 20000
-
-/* Transition bitrates between modes */
-#define SWB2WB_BITRATE_BPS 30000
-#define SWB2WB_BITRATE_BPS_INITIAL 25000
-#define WB2SWB_BITRATE_BPS 35000
-#define WB2MB_BITRATE_BPS 15000
-#define MB2WB_BITRATE_BPS 20000
-#define MB2NB_BITRATE_BPS 10000
-#define NB2MB_BITRATE_BPS 14000
-
-/* Integration/hysteresis threshold for lowering internal sample frequency */
-/* 30000000 -> 6 sec if bitrate is 5000 bps below limit; 3 sec if bitrate is 10000 bps below limit */
-#define ACCUM_BITS_DIFF_THRESHOLD 30000000
-#define TARGET_RATE_TAB_SZ 8
-
-/* DTX settings */
-#define NO_SPEECH_FRAMES_BEFORE_DTX 5 /* eq 100 ms */
-#define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */
-
-#define USE_LBRR 1
-
-/* Amount of concecutive no FEC packets before telling JB */
-#define NO_LBRR_THRES 10
-
-/* Maximum delay between real packet and LBRR packet */
-#define MAX_LBRR_DELAY 2
-#define LBRR_IDX_MASK 1
-
-#define INBAND_FEC_MIN_RATE_BPS 18000 /* Dont use inband FEC below this total target rate */
-#define LBRR_LOSS_THRES 2 /* Start adding LBRR at this loss rate (needs tuning) */
-
-/* LBRR usage defines */
-#define SKP_SILK_NO_LBRR 0 /* No LBRR information for this packet */
-#define SKP_SILK_ADD_LBRR_TO_PLUS1 1 /* Add LBRR for this packet to packet n + 1 */
-#define SKP_SILK_ADD_LBRR_TO_PLUS2 2 /* Add LBRR for this packet to packet n + 2 */
-
-/* Frame termination indicator defines */
-#define SKP_SILK_LAST_FRAME 0 /* Last frames in packet */
-#define SKP_SILK_MORE_FRAMES 1 /* More frames to follow this one */
-#define SKP_SILK_LBRR_VER1 2 /* LBRR information from packet n - 1 */
-#define SKP_SILK_LBRR_VER2 3 /* LBRR information from packet n - 2 */
-#define SKP_SILK_EXT_LAYER 4 /* Extension layers added */
-
-/* Number of Second order Sections for SWB detection HP filter */
-#define NB_SOS 3
-#define HP_8_KHZ_THRES 10 /* average energy per sample, above 8 kHz */
-#define CONCEC_SWB_SMPLS_THRES 480 * 15 /* 300 ms */
-#define WB_DETECT_ACTIVE_SPEECH_MS_THRES 15000 /* ms of active speech needed for WB detection */
-
-/* Low complexity setting */
-#ifdef EMBEDDED_OPT
-# define LOW_COMPLEXITY_ONLY 1
-#else
-# define LOW_COMPLEXITY_ONLY 0
-#endif
-
-/* Activate bandwidth transition filtering for mode switching */
-#ifdef EMBEDDED_OPT
-# define SWITCH_TRANSITION_FILTERING 0
-#else
-#ifndef FORCE_FS_KHZ
-# define SWITCH_TRANSITION_FILTERING 1
-#else
-# define SWITCH_TRANSITION_FILTERING 0
-#endif
-#endif
-
-/* Decoder Parameters */
-#define DEC_HP_ORDER 2
-
-/* Maximum sampling frequency, should be 16 for embedded */
-#define MAX_FS_KHZ 24
-
-/* Signal Types used by silk */
-#define SIG_TYPE_VOICED 0
-#define SIG_TYPE_UNVOICED 1
-
-/* VAD Types used by silk */
-#define NO_VOICE_ACTIVITY 0
-#define VOICE_ACTIVITY 1
-
-/* number of samples per frame */
-#define FRAME_LENGTH_MS 20 /* 20 ms */
-#define MAX_FRAME_LENGTH (FRAME_LENGTH_MS * MAX_FS_KHZ)
-
-/* number of lookahead samples for pitch analysis */
-#define LA_PITCH_MS 3
-#define LA_PITCH_MAX (LA_PITCH_MS * MAX_FS_KHZ)
-
-/* number of lookahead samples for noise shape analysis */
-#define LA_SHAPE_MS 5
-#define LA_SHAPE_MAX (LA_SHAPE_MS * MAX_FS_KHZ)
-
-/* Order of LPC used in find pitch */
-#define FIND_PITCH_LPC_ORDER_MAX 16
-
-/* Length of LPC window used in find pitch */
-#define FIND_PITCH_LPC_WIN_MS (30 + (LA_PITCH_MS << 1))
-#define FIND_PITCH_LPC_WIN_MAX (FIND_PITCH_LPC_WIN_MS * MAX_FS_KHZ)
-
-#define PITCH_EST_COMPLEXITY_HC_MODE SigProc_PITCH_EST_MAX_COMPLEX
-#define PITCH_EST_COMPLEXITY_MC_MODE SigProc_PITCH_EST_MID_COMPLEX
-#define PITCH_EST_COMPLEXITY_LC_MODE SigProc_PITCH_EST_MIN_COMPLEX
-
-
-/* Max number of bytes in payload output buffer (may contain multiple frames) */
-#define MAX_ARITHM_BYTES 1024
-
-#define RANGE_CODER_WRITE_BEYOND_BUFFER -1
-#define RANGE_CODER_CDF_OUT_OF_RANGE -2
-#define RANGE_CODER_NORMALIZATION_FAILED -3
-#define RANGE_CODER_ZERO_INTERVAL_WIDTH -4
-#define RANGE_CODER_DECODER_CHECK_FAILED -5
-#define RANGE_CODER_READ_BEYOND_BUFFER -6
-#define RANGE_CODER_ILLEGAL_SAMPLING_RATE -7
-#define RANGE_CODER_DEC_PAYLOAD_TOO_LONG -8
-
-/* dB level of lowest gain quantization level */
-#define MIN_QGAIN_DB 6
-/* dB level of highest gain quantization level */
-#define MAX_QGAIN_DB 86
-/* Number of gain quantization levels */
-#define N_LEVELS_QGAIN 64
-/* Max increase in gain quantization index */
-#define MAX_DELTA_GAIN_QUANT 40
-/* Max decrease in gain quantization index */
-#define MIN_DELTA_GAIN_QUANT -4
-
-/* Quantization offsets (multiples of 4) */
-#define OFFSET_VL_Q10 32
-#define OFFSET_VH_Q10 100
-#define OFFSET_UVL_Q10 100
-#define OFFSET_UVH_Q10 256
-
-/* Maximum numbers of iterations used to stabilize a LPC vector */
-#define MAX_LPC_STABILIZE_ITERATIONS 20
-
-#define MAX_LPC_ORDER 16
-#define MIN_LPC_ORDER 10
-
-/* Find Pred Coef defines */
-#define LTP_ORDER 5
-
-/* LTP quantization settings */
-#define NB_LTP_CBKS 3
-
-/* Number of subframes */
-#define NB_SUBFR 4
-
-/* Flag to use harmonic noise shaping */
-#define USE_HARM_SHAPING 1
-
-/* Max LPC order of noise shaping filters */
-#define SHAPE_LPC_ORDER_MAX 16
-
-#define HARM_SHAPE_FIR_TAPS 3
-
-/* Length of LPC window used in noise shape analysis */
-#define SHAPE_LPC_WIN_MS 15
-#define SHAPE_LPC_WIN_16_KHZ (SHAPE_LPC_WIN_MS * 16)
-#define SHAPE_LPC_WIN_24_KHZ (SHAPE_LPC_WIN_MS * 24)
-#define SHAPE_LPC_WIN_MAX (SHAPE_LPC_WIN_MS * MAX_FS_KHZ)
-
-/* Maximum number of delayed decision states */
-#define DEL_DEC_STATES_MAX 4
-
-#define LTP_BUF_LENGTH 512
-#define LTP_MASK (LTP_BUF_LENGTH - 1)
-
-#define DECISION_DELAY 32
-#define DECISION_DELAY_MASK (DECISION_DELAY - 1)
-
-/* number of subframes for excitation entropy coding */
-#define SHELL_CODEC_FRAME_LENGTH 16
-#define MAX_NB_SHELL_BLOCKS (MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH)
-
-/* number of rate levels, for entropy coding of excitation */
-#define N_RATE_LEVELS 10
-
-/* maximum sum of pulses per shell coding frame */
-#define MAX_PULSES 18
-
-#define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */
-
-#if( MAX_LPC_ORDER > DECISION_DELAY )
-# define NSQ_LPC_BUF_LENGTH MAX_LPC_ORDER
-#else
-# define NSQ_LPC_BUF_LENGTH DECISION_DELAY
-#endif
-
-/***********************/
-/* High pass filtering */
-/***********************/
-#define HIGH_PASS_INPUT 1
-
-/***************************/
-/* Voice activity detector */
-/***************************/
-#define VAD_N_BANDS 4 /* 0-1, 1-2, 2-4, and 4-8 kHz */
-
-#define VAD_INTERNAL_SUBFRAMES_LOG2 2
-#define VAD_INTERNAL_SUBFRAMES (1 << VAD_INTERNAL_SUBFRAMES_LOG2)
-
-#define VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 1024 /* Must be < 4096 */
-#define VAD_NOISE_LEVELS_BIAS 50
-
-/* Sigmoid settings */
-#define VAD_NEGATIVE_OFFSET_Q5 128 /* sigmoid is 0 at -128 */
-#define VAD_SNR_FACTOR_Q16 45000
-
-/* smoothing for SNR measurement */
-#define VAD_SNR_SMOOTH_COEF_Q18 4096
-
-/******************/
-/* NLSF quantizer */
-/******************/
-#ifdef NLSF_TRAINING
-# define NLSF_MSVQ_MAX_CB_STAGES 30
-# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE 256
-# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END 128
-#else
-# define NLSF_MSVQ_MAX_CB_STAGES 10 /* Update manually when changing codebooks */
-# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE 128 /* Update manually when changing codebooks */
-# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END 16 /* Update manually when changing codebooks */
-#endif
-
-#define NLSF_MSVQ_FLUCTUATION_REDUCTION 1
-#define MAX_NLSF_MSVQ_SURVIVORS 16
-#define MAX_NLSF_MSVQ_SURVIVORS_LC_MODE 2
-#define MAX_NLSF_MSVQ_SURVIVORS_MC_MODE 4
-
-/* Based on above defines, calculate how much memory is necessary to allocate */
-#if( NLSF_MSVQ_MAX_VECTORS_IN_STAGE > ( MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END ) )
-# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE NLSF_MSVQ_MAX_VECTORS_IN_STAGE
-#else
-# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END
-#endif
-
-#if( NLSF_MSVQ_MAX_VECTORS_IN_STAGE > ( MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END ) )
-# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED NLSF_MSVQ_MAX_VECTORS_IN_STAGE
-#else
-# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END
-#endif
-
-#define NLSF_MSVQ_SURV_MAX_REL_RD 4
-
-/* Transition filtering for mode switching */
-#if SWITCH_TRANSITION_FILTERING
-# define TRANSITION_TIME_UP_MS 5120 // 5120 = 64 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 64*(20*4)
-# define TRANSITION_TIME_DOWN_MS 2560 // 2560 = 32 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 32*(20*4)
-# define TRANSITION_NB 3 /* Hardcoded in tables */
-# define TRANSITION_NA 2 /* Hardcoded in tables */
-# define TRANSITION_INT_NUM 5 /* Hardcoded in tables */
-# define TRANSITION_FRAMES_UP ( TRANSITION_TIME_UP_MS / FRAME_LENGTH_MS )
-# define TRANSITION_FRAMES_DOWN ( TRANSITION_TIME_DOWN_MS / FRAME_LENGTH_MS )
-# define TRANSITION_INT_STEPS_UP ( TRANSITION_FRAMES_UP / ( TRANSITION_INT_NUM - 1 ) )
-# define TRANSITION_INT_STEPS_DOWN ( TRANSITION_FRAMES_DOWN / ( TRANSITION_INT_NUM - 1 ) )
-#endif
-
-/* Row based */
-#define matrix_ptr(Matrix_base_adr, row, column, N) *(Matrix_base_adr + ((row)*(N)+(column)))
-#define matrix_adr(Matrix_base_adr, row, column, N) (Matrix_base_adr + ((row)*(N)+(column)))
-
-/* Column based */
-#ifndef matrix_c_ptr
-# define matrix_c_ptr(Matrix_base_adr, row, column, M) *(Matrix_base_adr + ((row)+(M)*(column)))
-#endif
-#define matrix_c_adr(Matrix_base_adr, row, column, M) (Matrix_base_adr + ((row)+(M)*(column)))
-
-/* BWE factors to apply after packet loss */
-#define BWE_AFTER_LOSS_Q16 63570
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/SKP_Silk_define_FIX.h
+++ /dev/null
@@ -1,97 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_DEFINE_FIX_H
-#define SKP_SILK_DEFINE_FIX_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Head room for correlations */
-#define LTP_CORRS_HEAD_ROOM 2
-#define LPC_CORRS_HEAD_ROOM 10
-
-#define WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES_Q8 179 // 179.2_Q8 = 0.7f required speech activity for counting frame as active
-
-/* DTX settings */
-#define SPEECH_ACTIVITY_DTX_THRES_Q8 26 // 25.60_Q8 = 0.1f
-
-#define LBRR_SPEECH_ACTIVITY_THRES_Q8 128
-
-/* level of noise floor for whitening filter LPC analysis in pitch analysis */
-#define FIND_PITCH_WHITE_NOISE_FRACTION_Q16 66
-
-/* bandwdith expansion for whitening filter in pitch analysis */
-#define FIND_PITCH_BANDWITH_EXPANSION_Q16 64881
-
-/* Threshold used by pitch estimator for early escape */
-#define FIND_PITCH_CORRELATION_THRESHOLD_Q16_HC_MODE 45875 // 0.7
-#define FIND_PITCH_CORRELATION_THRESHOLD_Q16_MC_MODE 49152 // 0.75
-#define FIND_PITCH_CORRELATION_THRESHOLD_Q16_LC_MODE 52429 // 0.8
-
-/* Regualarization factor for correlation matrix. Equivalent to adding noise at -50 dB */
-#define FIND_LTP_COND_FAC_Q31 21475
-#define FIND_LPC_COND_FAC_Q32 257698 // 6e-5
-
-/* Find Pred Coef defines */
-#define INACTIVE_BWExp_Q16 64225 // 0.98
-#define ACTIVE_BWExp_Q16 65470 // 0.999
-#define LTP_DAMPING_Q16 66
-#define LTP_SMOOTHING_Q26 6710886
-
-/* LTP quantization settings */
-#define MU_LTP_QUANT_NB_Q8 8
-#define MU_LTP_QUANT_MB_Q8 6
-#define MU_LTP_QUANT_WB_Q8 5
-#define MU_LTP_QUANT_SWB_Q8 4
-
-/***********************/
-/* High pass filtering */
-/***********************/
-/* Smoothing parameters for low end of pitch frequency range estimation */
-#define VARIABLE_HP_SMTH_COEF1_Q16 6554 // 0.1
-#define VARIABLE_HP_SMTH_COEF2_Q16 983 // 0.015
-
-/* Min and max values for low end of pitch frequency range estimation */
-#define VARIABLE_HP_MIN_FREQ_Q0 80
-#define VARIABLE_HP_MAX_FREQ_Q0 150
-
-/* Max absolute difference between log2 of pitch frequency and smoother state, to enter the smoother */
-#define VARIABLE_HP_MAX_DELTA_FREQ_Q7 51 // 0.4 in Q7
-
-/* Defines for CN generation */
-#define CNG_BUF_MASK_MAX 255 /* 2^floor(log2(MAX_FRAME_LENGTH)) */
-#define CNG_GAIN_SMTH_Q16 4634 /* 0.25^(1/4) */
-#define CNG_NLSF_SMTH_Q16 16348 /* 0.25 */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/SKP_Silk_detect_SWB_input.c
+++ /dev/null
@@ -1,76 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/*
- * Detect SWB input by measuring energy above 8 kHz.
- */
-
-#include "SKP_Silk_main.h"
-
-void SKP_Silk_detect_SWB_input(
- SKP_Silk_detect_SWB_state *psSWBdetect, /* (I/O) encoder state */
- const SKP_int16 samplesIn[], /* (I) input to encoder */
- SKP_int nSamplesIn /* (I) length of input */
-)
-{
- SKP_int HP_8_kHz_len, i;
- SKP_int16 in_HP_8_kHz[ MAX_FRAME_LENGTH ];
- SKP_int32 energy_32, shift;
-
- /* High pass filter with cutoff at 8 khz */
- HP_8_kHz_len = SKP_min_int( nSamplesIn, MAX_FRAME_LENGTH );
- HP_8_kHz_len = SKP_max_int( HP_8_kHz_len, 0 );
-
- /* Cutoff around 9 khz */
- /* A = conv(conv([8192,14613, 6868], [8192,12883, 7337]), [8192,11586, 7911]); */
- /* B = conv(conv([575, -948, 575], [575, -221, 575]), [575, 104, 575]); */
- SKP_Silk_biquad( samplesIn, SKP_Silk_SWB_detect_B_HP_Q13[ 0 ], SKP_Silk_SWB_detect_A_HP_Q13[ 0 ],
- psSWBdetect->S_HP_8_kHz[ 0 ], in_HP_8_kHz, HP_8_kHz_len );
- for( i = 1; i < NB_SOS; i++ ) {
- SKP_Silk_biquad( in_HP_8_kHz, SKP_Silk_SWB_detect_B_HP_Q13[ i ], SKP_Silk_SWB_detect_A_HP_Q13[ i ],
- psSWBdetect->S_HP_8_kHz[ i ], in_HP_8_kHz, HP_8_kHz_len );
- }
-
- /* Calculate energy in HP signal */
- SKP_Silk_sum_sqr_shift( &energy_32, &shift, in_HP_8_kHz, HP_8_kHz_len );
-
- /* Count concecutive samples above threshold, after adjusting threshold for number of input samples and shift */
- if( energy_32 > SKP_RSHIFT( SKP_SMULBB( HP_8_KHZ_THRES, HP_8_kHz_len ), shift ) ) {
- psSWBdetect->ConsecSmplsAboveThres += nSamplesIn;
- if( psSWBdetect->ConsecSmplsAboveThres > CONCEC_SWB_SMPLS_THRES ) {
- psSWBdetect->SWB_detected = 1;
- }
- } else {
- psSWBdetect->ConsecSmplsAboveThres -= nSamplesIn;
- psSWBdetect->ConsecSmplsAboveThres = SKP_max( psSWBdetect->ConsecSmplsAboveThres, 0 );
- }
-
- /* If sufficient speech activity and no SWB detected, we detect the signal as being WB */
- if( ( psSWBdetect->ActiveSpeech_ms > WB_DETECT_ACTIVE_SPEECH_MS_THRES ) && ( psSWBdetect->SWB_detected == 0 ) ) {
- psSWBdetect->WB_detected = 1;
- }
-}
--- a/src/SKP_Silk_enc_API.c
+++ /dev/null
@@ -1,268 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-
-#include "SKP_Silk_define.h"
-#include "SKP_Silk_main_FIX.h"
-#include "SKP_Silk_SDK_API.h"
-#include "SKP_Silk_control.h"
-#include "SKP_Silk_typedef.h"
-#include "SKP_Silk_structs.h"
-#define SKP_Silk_EncodeControlStruct SKP_SILK_SDK_EncControlStruct
-
-/****************************************/
-/* Encoder functions */
-/****************************************/
-
-SKP_int SKP_Silk_SDK_Get_Encoder_Size( SKP_int *encSizeBytes )
-{
- SKP_int ret = 0;
-
- *encSizeBytes = sizeof( SKP_Silk_encoder_state_FIX );
-
- return ret;
-}
-
-
-/***************************************/
-/* Read control structure from encoder */
-/***************************************/
-SKP_int SKP_Silk_SDK_QueryEncoder(
- const void *encState, /* I: State Vector */
- SKP_Silk_EncodeControlStruct *encStatus /* O: Control Structure */
-)
-{
- SKP_Silk_encoder_state_FIX *psEnc;
- SKP_int ret = 0;
-
- psEnc = ( SKP_Silk_encoder_state_FIX* )encState;
-
- encStatus->sampleRate = ( unsigned short )SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ); /* convert kHz -> Hz */
- encStatus->packetSize = ( unsigned short )SKP_SMULBB( psEnc->sCmn.fs_kHz, psEnc->sCmn.PacketSize_ms ); /* convert samples -> ms */
- encStatus->bitRate = ( unsigned short )psEnc->sCmn.TargetRate_bps;
- encStatus->packetLossPercentage = psEnc->sCmn.PacketLoss_perc;
- encStatus->complexity = psEnc->sCmn.Complexity;
-
- return ret;
-}
-
-/*************************/
-/* Init or Reset encoder */
-/*************************/
-SKP_int SKP_Silk_SDK_InitEncoder(
- void *encState, /* I/O: State */
- SKP_Silk_EncodeControlStruct *encStatus /* O: Control structure */
-)
-{
- SKP_Silk_encoder_state_FIX *psEnc;
- SKP_int ret = 0;
-
-
- psEnc = ( SKP_Silk_encoder_state_FIX* )encState;
-
- /* Reset Encoder */
- if( ret += SKP_Silk_init_encoder_FIX( psEnc ) ) {
- SKP_assert( 0 );
- }
-
- /* Read Control structure */
- if( ret += SKP_Silk_SDK_QueryEncoder( encState, encStatus ) ) {
- SKP_assert( 0 );
- }
-
-
- return ret;
-}
-
-/**************************/
-/* Encode frame with Silk */
-/**************************/
-SKP_int SKP_Silk_SDK_Encode(
- void *encState, /* I/O: State */
- const SKP_Silk_EncodeControlStruct *encControl, /* I: Control structure */
- const SKP_int16 *samplesIn, /* I: Speech sample input vector */
- SKP_int nSamplesIn, /* I: Number of samples in input vector */
- SKP_uint8 *outData, /* O: Encoded output vector */
- SKP_int16 *nBytesOut /* I/O: Number of bytes in outData (input: Max bytes) */
-)
-{
- SKP_int API_fs_kHz, PacketSize_ms, PacketLoss_perc, UseInBandFec, UseDTX, ret = 0;
- SKP_int nSamplesToBuffer, Complexity, input_ms, nSamplesFromInput = 0;
- SKP_int32 TargetRate_bps;
- SKP_int16 MaxBytesOut;
- SKP_Silk_encoder_state_FIX *psEnc = ( SKP_Silk_encoder_state_FIX* )encState;
-
-
- SKP_assert( encControl != NULL );
-
- /* Check sampling frequency first, to avoid divide by zero later */
- if( ( encControl->sampleRate != 8000 ) && ( encControl->sampleRate != 12000 ) &&
- ( encControl->sampleRate != 16000 ) && ( encControl->sampleRate != 24000 ) ) {
- ret = SKP_SILK_ENC_FS_NOT_SUPPORTED;
- SKP_assert( 0 );
- return( ret );
- }
-
- /* Set Encoder parameters from Control structure */
- API_fs_kHz = SKP_DIV32_16( ( SKP_int )encControl->sampleRate, 1000 ); /* convert Hz -> kHz */
- PacketSize_ms = SKP_DIV32_16( ( SKP_int )encControl->packetSize, API_fs_kHz ); /* convert samples -> ms */
- TargetRate_bps = ( SKP_int32 )encControl->bitRate;
- PacketLoss_perc = ( SKP_int )encControl->packetLossPercentage;
- UseInBandFec = ( SKP_int )encControl->useInBandFEC;
- Complexity = ( SKP_int )encControl->complexity;
- UseDTX = ( SKP_int )encControl->useDTX;
-
- /* Only accept input lengths that are multiplum of 10 ms */
- input_ms = SKP_DIV32_16( nSamplesIn, API_fs_kHz );
- if( ( input_ms % 10) != 0 || nSamplesIn < 0 ) {
- ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
- SKP_assert( 0 );
- return( ret );
- }
-
- /* Make sure no more than one packet can be produced */
- if( nSamplesIn > SKP_SMULBB( psEnc->sCmn.PacketSize_ms, API_fs_kHz ) ) {
- ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
- SKP_assert( 0 );
- return( ret );
- }
-
- if( ( ret = SKP_Silk_control_encoder_FIX( psEnc, API_fs_kHz, PacketSize_ms, TargetRate_bps,
- PacketLoss_perc, UseInBandFec, UseDTX, input_ms, Complexity ) ) != 0 ) {
- SKP_assert( 0 );
- return( ret );
- }
-
- /* Detect energy above 8 kHz */
- if( encControl->sampleRate == 24000 && psEnc->sCmn.sSWBdetect.SWB_detected == 0 && psEnc->sCmn.sSWBdetect.WB_detected == 0 ) {
- SKP_Silk_detect_SWB_input( &psEnc->sCmn.sSWBdetect, samplesIn, ( SKP_int )nSamplesIn );
- }
-
- /* Input buffering/resampling and encoding */
- MaxBytesOut = 0; /* return 0 output bytes if no encoder called */
- while( 1 ) {
- /* Resample/buffer */
- nSamplesToBuffer = psEnc->sCmn.frame_length - psEnc->sCmn.inputBufIx;
- if( encControl->sampleRate == SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ) ) {
- /* Same sample frequency - copy the data */
- nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, nSamplesIn );
- nSamplesFromInput = nSamplesToBuffer;
- SKP_memcpy( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], samplesIn, SKP_SMULBB( nSamplesToBuffer, sizeof( SKP_int16 ) ) );
- } else if( encControl->sampleRate == 24000 && psEnc->sCmn.fs_kHz == 16 ) {
- /* Resample the data from 24 kHz to 16 kHz */
- nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, SKP_SMULWB( SKP_LSHIFT( nSamplesIn, 1 ), 21846 ) ); // 21846 = ceil(2/3)*2^15
- nSamplesFromInput = SKP_RSHIFT( SKP_SMULBB( nSamplesToBuffer, 3 ), 1 );
-#if LOW_COMPLEXITY_ONLY
- {
- SKP_int16 scratch[ MAX_FRAME_LENGTH + SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ];
- SKP_assert( nSamplesFromInput <= MAX_FRAME_LENGTH );
- SKP_Silk_resample_2_3_coarse( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], psEnc->sCmn.resample24To16state,
- samplesIn, nSamplesFromInput, scratch );
- }
-#else
- SKP_Silk_resample_2_3( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], psEnc->sCmn.resample24To16state,
- samplesIn, nSamplesFromInput );
-#endif
- } else if( encControl->sampleRate == 24000 && psEnc->sCmn.fs_kHz == 12 ) {
- SKP_int32 scratch[ 3 * MAX_FRAME_LENGTH ];
- /* Resample the data from 24 kHz to 12 kHz */
- nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, SKP_RSHIFT( nSamplesIn, 1 ) );
- nSamplesFromInput = SKP_LSHIFT16( nSamplesToBuffer, 1 );
- SKP_Silk_resample_1_2_coarse( samplesIn, psEnc->sCmn.resample24To12state,
- &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], scratch, nSamplesToBuffer );
- } else if( encControl->sampleRate == 24000 && psEnc->sCmn.fs_kHz == 8 ) {
- /* Resample the data from 24 kHz to 8 kHz */
- nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, SKP_DIV32_16( nSamplesIn, 3 ) );
- nSamplesFromInput = SKP_SMULBB( nSamplesToBuffer, 3 );
- SKP_Silk_resample_1_3( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], psEnc->sCmn.resample24To8state,
- samplesIn, nSamplesFromInput);
- } else if( encControl->sampleRate == 16000 && psEnc->sCmn.fs_kHz == 12 ) {
- /* Resample the data from 16 kHz to 12 kHz */
- nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, SKP_RSHIFT( SKP_SMULBB( nSamplesIn, 3 ), 2 ) );
- nSamplesFromInput = SKP_SMULWB( SKP_LSHIFT16( nSamplesToBuffer, 2 ), 21846 ); // 21846 = ceil((1/3)*2^16)
- SKP_Silk_resample_3_4( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], psEnc->sCmn.resample16To12state,
- samplesIn, nSamplesFromInput );
- } else if( encControl->sampleRate == 16000 && psEnc->sCmn.fs_kHz == 8 ) {
- SKP_int32 scratch[ 3 * MAX_FRAME_LENGTH ];
- /* Resample the data from 16 kHz to 8 kHz */
- nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, SKP_RSHIFT( nSamplesIn, 1 ) );
- nSamplesFromInput = SKP_LSHIFT16( nSamplesToBuffer, 1 );
- SKP_Silk_resample_1_2_coarse( samplesIn, psEnc->sCmn.resample16To8state,
- &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], scratch, nSamplesToBuffer );
- } else if( encControl->sampleRate == 12000 && psEnc->sCmn.fs_kHz == 8 ) {
- /* Resample the data from 12 kHz to 8 kHz */
- nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, SKP_SMULWB( SKP_LSHIFT( nSamplesIn, 1 ), 21846 ) );
- nSamplesFromInput = SKP_RSHIFT( SKP_SMULBB( nSamplesToBuffer, 3 ), 1 );
-#if LOW_COMPLEXITY_ONLY
- {
- SKP_int16 scratch[ MAX_FRAME_LENGTH + SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ];
- SKP_assert( nSamplesFromInput <= MAX_FRAME_LENGTH );
- SKP_Silk_resample_2_3_coarse( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], psEnc->sCmn.resample12To8state,
- samplesIn, nSamplesFromInput, scratch );
- }
-#else
- SKP_Silk_resample_2_3( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], psEnc->sCmn.resample12To8state,
- samplesIn, nSamplesFromInput );
-#endif
- }
- samplesIn += nSamplesFromInput;
- nSamplesIn -= nSamplesFromInput;
- psEnc->sCmn.inputBufIx += nSamplesToBuffer;
-
- /* Silk encoder */
- if( psEnc->sCmn.inputBufIx >= psEnc->sCmn.frame_length ) {
- /* Enough data in input buffer, so encode */
- if( MaxBytesOut == 0 ) {
- /* No payload obtained so far */
- MaxBytesOut = *nBytesOut;
- if( ( ret = SKP_Silk_encode_frame_FIX( psEnc, outData, &MaxBytesOut, psEnc->sCmn.inputBuf ) ) != 0 ) {
- SKP_assert( 0 );
- }
- } else {
- /* outData already contains a payload */
- if( ( ret = SKP_Silk_encode_frame_FIX( psEnc, outData, nBytesOut, psEnc->sCmn.inputBuf ) ) != 0 ) {
- SKP_assert( 0 );
- }
- /* Check that no second payload was created */
- SKP_assert( *nBytesOut == 0 );
- }
- psEnc->sCmn.inputBufIx = 0;
- } else {
- break;
- }
- }
-
- *nBytesOut = MaxBytesOut;
- if( psEnc->sCmn.useDTX && psEnc->sCmn.inDTX ) {
- /* Dtx simulation */
- *nBytesOut = 0;
- }
-
-
- return ret;
-}
-
--- a/src/SKP_Silk_encode_frame_FIX.c
+++ /dev/null
@@ -1,432 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-/****************/
-/* Encode frame */
-/****************/
-SKP_int SKP_Silk_encode_frame_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */
- SKP_uint8 *pCode, /* O Pointer to payload */
- SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */
- /* input: max length; output: used */
- const SKP_int16 *pIn /* I Pointer to input speech frame */
-)
-{
- SKP_Silk_encoder_control_FIX sEncCtrl;
- SKP_int i, nBytes, ret = 0;
- SKP_int16 *x_frame, *res_pitch_frame;
- SKP_int16 xfw[ MAX_FRAME_LENGTH ];
- SKP_int16 pIn_HP[ MAX_FRAME_LENGTH ];
- SKP_int16 res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ];
- SKP_int LBRR_idx, frame_terminator, SNR_dB_Q7;
- const SKP_uint16 *FrameTermination_CDF;
-
- /* Low bitrate redundancy parameters */
- SKP_uint8 LBRRpayload[ MAX_ARITHM_BYTES ];
- SKP_int16 nBytesLBRR;
-
- //SKP_int32 Seed[ MAX_LAYERS ];
- sEncCtrl.sCmn.Seed = psEnc->sCmn.frameCounter++ & 3;
-
-
- /**************************************************************/
- /* Setup Input Pointers, and insert frame in input buffer */
- /*************************************************************/
- x_frame = psEnc->x_buf + psEnc->sCmn.frame_length; /* start of frame to encode */
- res_pitch_frame = res_pitch + psEnc->sCmn.frame_length; /* start of pitch LPC residual frame */
-
- /****************************/
- /* Voice Activity Detection */
- /****************************/
- ret = SKP_Silk_VAD_GetSA_Q8( &psEnc->sCmn.sVAD, &psEnc->speech_activity_Q8, &SNR_dB_Q7,
- sEncCtrl.input_quality_bands_Q15, &sEncCtrl.input_tilt_Q15,
- pIn,psEnc->sCmn.frame_length );
-
- /*******************************************/
- /* High-pass filtering of the input signal */
- /*******************************************/
-#if HIGH_PASS_INPUT
- /* Variable high-pass filter */
- SKP_Silk_HP_variable_cutoff_FIX( psEnc, &sEncCtrl, pIn_HP, pIn );
-#else
- SKP_memcpy( pIn_HP, pIn,psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
-#endif
-
-#if SWITCH_TRANSITION_FILTERING
- /* Ensure smooth bandwidth transitions */
- SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, x_frame + psEnc->sCmn.la_shape, pIn_HP, psEnc->sCmn.frame_length );
-#else
- SKP_memcpy( x_frame + psEnc->sCmn.la_shape, pIn_HP,psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
-#endif
-
- /*****************************************/
- /* Find pitch lags, initial LPC analysis */
- /*****************************************/
- SKP_Silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame );
-
- /************************/
- /* Noise shape analysis */
- /************************/
- SKP_Silk_noise_shape_analysis_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame );
-
- /*****************************************/
- /* Prefiltering for noise shaper */
- /*****************************************/
- SKP_Silk_prefilter_FIX( psEnc, &sEncCtrl, xfw, x_frame );
-
-
- /***************************************************/
- /* Find linear prediction coefficients (LPC + LTP) */
- /***************************************************/
- SKP_Silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch );
-
- /****************************************/
- /* Process gains */
- /****************************************/
- SKP_Silk_process_gains_FIX( psEnc, &sEncCtrl );
-
- psEnc->sCmn.sigtype[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.sigtype;
- psEnc->sCmn.QuantOffsetType[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.QuantOffsetType;
-
- /****************************************/
- /* Low Bitrate Redundant Encoding */
- /****************************************/
- nBytesLBRR = MAX_ARITHM_BYTES;
- SKP_Silk_LBRR_encode_FIX( psEnc, &sEncCtrl, LBRRpayload, &nBytesLBRR, xfw );
-
- /*****************************************/
- /* Noise shaping quantization */
- /*****************************************/
- psEnc->NoiseShapingQuantizer( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sNSQ, xfw,
- &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf *psEnc->sCmn.frame_length ], sEncCtrl.sCmn.NLSFInterpCoef_Q2,
- sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14,
- sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.Lambda_Q10,
- sEncCtrl.LTP_scale_Q14 );
-
- /**************************************************/
- /* Convert speech activity into VAD and DTX flags */
- /**************************************************/
- if( psEnc->speech_activity_Q8 < SPEECH_ACTIVITY_DTX_THRES_Q8 ) {
- psEnc->sCmn.vadFlag = NO_VOICE_ACTIVITY;
- psEnc->sCmn.noSpeechCounter++;
- if( psEnc->sCmn.noSpeechCounter > NO_SPEECH_FRAMES_BEFORE_DTX ) {
- psEnc->sCmn.inDTX = 1;
- }
- if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX ) {
- psEnc->sCmn.noSpeechCounter = 0;
- psEnc->sCmn.inDTX = 0;
- }
- } else {
- psEnc->sCmn.noSpeechCounter = 0;
- psEnc->sCmn.inDTX = 0;
- psEnc->sCmn.vadFlag = VOICE_ACTIVITY;
- }
-
- /****************************************/
- /* Initialize arithmetic coder */
- /****************************************/
- if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
- SKP_Silk_range_enc_init( &psEnc->sCmn.sRC );
- psEnc->sCmn.nBytesInPayloadBuf = 0;
- }
-
- /****************************************/
- /* Encode Parameters */
- /****************************************/
- if( psEnc->sCmn.bitstream_v == BIT_STREAM_V4 ) {
- SKP_Silk_encode_parameters_v4( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sCmn.sRC );
- FrameTermination_CDF = SKP_Silk_FrameTermination_v4_CDF;
- } else {
- SKP_Silk_encode_parameters( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sCmn.sRC,
- &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf *psEnc->sCmn.frame_length ] );
- FrameTermination_CDF = SKP_Silk_FrameTermination_CDF;
- }
-
- /****************************************/
- /* Update Buffers and State */
- /****************************************/
- /* Update Input buffer */
- SKP_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ], ( psEnc->sCmn.frame_length + psEnc->sCmn.la_shape ) * sizeof( SKP_int16 ) );
-
- /* parameters needed for next frame */
- psEnc->sCmn.prev_sigtype = sEncCtrl.sCmn.sigtype;
- psEnc->sCmn.prevLag = sEncCtrl.sCmn.pitchL[ NB_SUBFR - 1];
- psEnc->sCmn.first_frame_after_reset = 0;
-
- if( psEnc->sCmn.sRC.error ) {
- /* encoder returned error: clear payload buffer */
- psEnc->sCmn.nFramesInPayloadBuf = 0;
- } else {
- psEnc->sCmn.nFramesInPayloadBuf++;
- }
-
- /****************************************/
- /* finalize payload and copy to output */
- /****************************************/
- if( psEnc->sCmn.nFramesInPayloadBuf * FRAME_LENGTH_MS >= psEnc->sCmn.PacketSize_ms ) {
-
- LBRR_idx = ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK;
-
- /* Check if FEC information should be added */
- frame_terminator = SKP_SILK_LAST_FRAME;
- if( psEnc->sCmn.LBRR_buffer[ LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS1 ) {
- frame_terminator = SKP_SILK_LBRR_VER1;
- }
- if( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS2 ) {
- frame_terminator = SKP_SILK_LBRR_VER2;
- LBRR_idx = psEnc->sCmn.oldest_LBRR_idx;
- }
- /* Add the frame termination info to stream */
- SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF );
-
- if( psEnc->sCmn.bitstream_v == BIT_STREAM_V4 ) {
- /* Code excitation signal */
- for( i = 0; i <psEnc->sCmn.nFramesInPayloadBuf; i++ ) {
- SKP_Silk_encode_pulses( &psEnc->sCmn.sRC, psEnc->sCmn.sigtype[ i ],psEnc->sCmn.QuantOffsetType[ i ],
- &psEnc->sCmn.q[ i * psEnc->sCmn.frame_length],psEnc->sCmn.frame_length );
- }
- }
- /* payload length so far */
- SKP_Silk_range_coder_get_length( &psEnc->sCmn.sRC, &nBytes );
-
- /* check that there is enough space in external output buffer, and move data */
- if( *pnBytesOut >= nBytes ) {
- SKP_Silk_range_enc_wrap_up( &psEnc->sCmn.sRC );
- SKP_memcpy( pCode, psEnc->sCmn.sRC.buffer, nBytes * sizeof( SKP_uint8 ) );
-
- if( frame_terminator > SKP_SILK_MORE_FRAMES &&
- *pnBytesOut >= nBytes + psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes ) {
- /* Get old packet and add to payload. */
- SKP_memcpy( &pCode[ nBytes ],
- psEnc->sCmn.LBRR_buffer[ LBRR_idx ].payload,
- psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes * sizeof( SKP_uint8 ) );
- nBytes += psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes;
- }
-
- *pnBytesOut = nBytes;
-
- /* Update FEC buffer */
- SKP_memcpy( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].payload, LBRRpayload,
- nBytesLBRR * sizeof( SKP_uint8 ) );
- psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].nBytes = nBytesLBRR;
- /* This line tells describes how FEC should be used */
- psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage = sEncCtrl.sCmn.LBRR_usage;
- psEnc->sCmn.oldest_LBRR_idx = ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK;
-
- /* Reset number of frames in payload buffer */
- psEnc->sCmn.nFramesInPayloadBuf = 0;
- } else {
- /* Not enough space: Payload will be discarded */
- *pnBytesOut = 0;
- nBytes = 0;
- psEnc->sCmn.nFramesInPayloadBuf = 0;
- ret = SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT;
- }
- } else {
- /* no payload for you this time */
- *pnBytesOut = 0;
-
- /* Encode that more frames follows */
- frame_terminator = SKP_SILK_MORE_FRAMES;
- SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF );
-
- /* payload length so far */
- SKP_Silk_range_coder_get_length( &psEnc->sCmn.sRC, &nBytes );
-
- if( psEnc->sCmn.bitstream_v == BIT_STREAM_V4 ) {
- /* Take into account the q signal that isnt in the bitstream yet */
- nBytes += SKP_Silk_pulses_to_bytes( &psEnc->sCmn,
- &psEnc->sCmn.q[ (psEnc->sCmn.nFramesInPayloadBuf - 1) * psEnc->sCmn.frame_length ] );
- }
- }
-
- /* Check for arithmetic coder errors */
- if( psEnc->sCmn.sRC.error ) {
- ret = SKP_SILK_ENC_INTERNAL_ERROR;
- }
-
- /* simulate number of ms buffered in channel because of exceeding TargetRate */
- SKP_assert( ( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) ==
- SKP_SAT32( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) );
- SKP_assert( psEnc->sCmn.TargetRate_bps > 0 );
- psEnc->BufferedInChannel_ms += SKP_DIV32( 8 * 1000 * ( nBytes -psEnc->sCmn.nBytesInPayloadBuf ),psEnc->sCmn.TargetRate_bps );
- psEnc->BufferedInChannel_ms -= FRAME_LENGTH_MS;
- psEnc->BufferedInChannel_ms = SKP_LIMIT( psEnc->BufferedInChannel_ms, 0, 100 );
- psEnc->sCmn.nBytesInPayloadBuf = nBytes;
-
- if( psEnc->speech_activity_Q8 > WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES_Q8 ) {
- psEnc->sCmn.sSWBdetect.ActiveSpeech_ms = SKP_ADD_POS_SAT32( psEnc->sCmn.sSWBdetect.ActiveSpeech_ms, FRAME_LENGTH_MS );
- }
-
-
- return( ret );
-}
-
-/* Low BitRate Redundancy encoding functionality. Reuse all parameters but encode residual with lower bitrate */
-void SKP_Silk_LBRR_encode_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk encoder control struct */
- SKP_uint8 *pCode, /* O Pointer to payload */
- SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */
- SKP_int16 xfw[] /* I Input signal */
-)
-{
- SKP_int i, TempGainsIndices[ NB_SUBFR ], frame_terminator;
- SKP_int nBytes, nFramesInPayloadBuf;
- SKP_int32 TempGains_Q16[ NB_SUBFR ];
- SKP_int typeOffset, LTP_scaleIndex, Rate_only_parameters = 0;
- /*******************************************/
- /* Control use of inband LBRR */
- /*******************************************/
- SKP_Silk_LBRR_ctrl_FIX( psEnc, psEncCtrl );
-
- if( psEnc->sCmn.LBRR_enabled ) {
- /* Save original Gains */
- SKP_memcpy( TempGainsIndices, psEncCtrl->sCmn.GainsIndices, NB_SUBFR * sizeof( SKP_int ) );
- SKP_memcpy( TempGains_Q16, psEncCtrl->Gains_Q16, NB_SUBFR * sizeof( SKP_int32 ) );
-
- typeOffset = psEnc->sCmn.typeOffsetPrev; // Temp save as cannot be overwritten
- LTP_scaleIndex = psEncCtrl->sCmn.LTP_scaleIndex;
-
- /* Set max rate where quant signal is encoded */
- if( psEnc->sCmn.fs_kHz == 8 ) {
- Rate_only_parameters = 13500;
- } else if( psEnc->sCmn.fs_kHz == 12 ) {
- Rate_only_parameters = 15500;
- } else if( psEnc->sCmn.fs_kHz == 16 ) {
- Rate_only_parameters = 17500;
- } else if( psEnc->sCmn.fs_kHz == 24 ) {
- Rate_only_parameters = 19500;
- } else {
- SKP_assert( 0 );
- }
-
- if( psEnc->sCmn.Complexity > 0 && psEnc->sCmn.TargetRate_bps > Rate_only_parameters ) {
- if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
- /* First frame in packet copy Everything */
- SKP_memcpy( &psEnc->sNSQ_LBRR, &psEnc->sNSQ, sizeof( SKP_Silk_nsq_state ) );
-
- psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex;
- /* Increase Gains to get target LBRR rate */
- psEncCtrl->sCmn.GainsIndices[ 0 ] = psEncCtrl->sCmn.GainsIndices[ 0 ] + psEnc->sCmn.LBRR_GainIncreases;
- psEncCtrl->sCmn.GainsIndices[ 0 ] = SKP_LIMIT( psEncCtrl->sCmn.GainsIndices[ 0 ], 0, N_LEVELS_QGAIN - 1 );
- }
- /* Decode to get Gains in sync with decoder */
- /* Overwrite unquantized gains with quantized gains */
- SKP_Silk_gains_dequant( psEncCtrl->Gains_Q16, psEncCtrl->sCmn.GainsIndices,
- &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesInPayloadBuf );
- /*****************************************/
- /* Noise shaping quantization */
- /*****************************************/
- psEnc->NoiseShapingQuantizer( &psEnc->sCmn, &psEncCtrl->sCmn,
- &psEnc->sNSQ_LBRR, xfw, &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ],
- psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14,
- psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14,
- psEncCtrl->Gains_Q16, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 );
- } else {
- SKP_memset( &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf *psEnc->sCmn.frame_length ], 0,
- psEnc->sCmn.frame_length * sizeof( SKP_int ) );
- psEncCtrl->sCmn.LTP_scaleIndex = 0;
- }
- /****************************************/
- /* Initialize arithmetic coder */
- /****************************************/
- if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
- SKP_Silk_range_enc_init( &psEnc->sCmn.sRC_LBRR );
- psEnc->sCmn.nBytesInPayloadBuf = 0;
- }
-
- /****************************************/
- /* Encode Parameters */
- /****************************************/
- if( psEnc->sCmn.bitstream_v == BIT_STREAM_V4 ) {
- SKP_Silk_encode_parameters_v4( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sCmn.sRC_LBRR );
- } else {
- SKP_Silk_encode_parameters( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sCmn.sRC_LBRR,
- &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length] );
- }
-
- if( psEnc->sCmn.sRC_LBRR.error ) {
- /* encoder returned error: clear payload buffer */
- nFramesInPayloadBuf = 0;
- } else {
- nFramesInPayloadBuf = psEnc->sCmn.nFramesInPayloadBuf + 1;
- }
-
- /****************************************/
- /* finalize payload and copy to output */
- /****************************************/
- if( SKP_SMULBB( nFramesInPayloadBuf, FRAME_LENGTH_MS ) >= psEnc->sCmn.PacketSize_ms ) {
-
- /* Check if FEC information should be added */
- frame_terminator = SKP_SILK_LAST_FRAME;
-
- /* Add the frame termination info to stream */
- SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_CDF );
-
- if( psEnc->sCmn.bitstream_v == BIT_STREAM_V4 ) {
- /*********************************************/
- /* Encode quantization indices of excitation */
- /*********************************************/
- for( i = 0; i < nFramesInPayloadBuf; i++ ) {
- SKP_Silk_encode_pulses( &psEnc->sCmn.sRC_LBRR, psEnc->sCmn.sigtype[ i ], psEnc->sCmn.QuantOffsetType[ i ],
- &psEnc->sCmn.q_LBRR[ i * psEnc->sCmn.frame_length ], psEnc->sCmn.frame_length );
- }
- }
- /* payload length so far */
- SKP_Silk_range_coder_get_length( &psEnc->sCmn.sRC_LBRR, &nBytes );
-
- /* check that there is enough space in external output buffer, and move data */
- if( *pnBytesOut >= nBytes ) {
- SKP_Silk_range_enc_wrap_up( &psEnc->sCmn.sRC_LBRR );
- SKP_memcpy( pCode, psEnc->sCmn.sRC_LBRR.buffer, nBytes * sizeof( SKP_uint8 ) );
-
- *pnBytesOut = nBytes;
- } else {
- /* not enough space: payload will be discarded */
- *pnBytesOut = 0;
- SKP_assert( 0 );
- }
- } else {
- /* no payload for you this time */
- *pnBytesOut = 0;
-
- /* Encode that more frames follows */
- frame_terminator = SKP_SILK_MORE_FRAMES;
- SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_CDF );
- }
-
- /* Restore original Gains */
- SKP_memcpy( psEncCtrl->sCmn.GainsIndices, TempGainsIndices, NB_SUBFR * sizeof( SKP_int ) );
- SKP_memcpy( psEncCtrl->Gains_Q16, TempGains_Q16, NB_SUBFR * sizeof( SKP_int32 ) );
-
- /* Restore LTP scale index and typeoffset */
- psEncCtrl->sCmn.LTP_scaleIndex = LTP_scaleIndex;
- psEnc->sCmn.typeOffsetPrev = typeOffset;
- }
-}
--- a/src/SKP_Silk_encode_parameters.c
+++ /dev/null
@@ -1,167 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/*******************************************/
-/* Encode parameters to create the payload */
-/*******************************************/
-void SKP_Silk_encode_parameters(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */
- SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */
- SKP_Silk_range_coder_state *psRC, /* I/O Range encoder state */
- const SKP_int *q /* I Quantization indices */
-)
-{
- SKP_int i, k, typeOffset;
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB;
-
-
- /************************/
- /* Encode sampling rate */
- /************************/
- /* only done for first frame in packet */
- if( psEncC->nFramesInPayloadBuf == 0 ) {
-
- /* Initialize arithmetic coder */
- SKP_Silk_range_enc_init( &psEncC->sRC );
- psEncC->nBytesInPayloadBuf = 0;
-
- /* get sampling rate index */
- for( i = 0; i < 3; i++ ) {
- if( SKP_Silk_SamplingRates_table[ i ] == psEncC->fs_kHz ) {
- break;
- }
- }
- SKP_Silk_range_encoder( psRC, i, SKP_Silk_SamplingRates_CDF );
- }
-
- /*******************************************/
- /* Encode signal type and quantizer offset */
- /*******************************************/
- typeOffset = 2 * psEncCtrlC->sigtype + psEncCtrlC->QuantOffsetType;
- if( psEncC->nFramesInPayloadBuf == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_CDF );
- } else {
- /* condidtional coding */
- SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_joint_CDF[ psEncC->typeOffsetPrev ] );
- }
- psEncC->typeOffsetPrev = typeOffset;
-
- /****************/
- /* Encode gains */
- /****************/
- /* first subframe */
- if( psEncC->nFramesInPayloadBuf == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_gain_CDF[ psEncCtrlC->sigtype ] );
- } else {
- /* condidtional coding */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_delta_gain_CDF );
- }
-
- /* remaining subframes */
- for( i = 1; i < NB_SUBFR; i++ ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ i ], SKP_Silk_delta_gain_CDF );
- }
-
-
- /****************/
- /* Encode NLSFs */
- /****************/
- /* Range encoding of the NLSF path */
- psNLSF_CB = psEncC->psNLSF_CB[ psEncCtrlC->sigtype ];
- SKP_Silk_range_encoder_multi( psRC, psEncCtrlC->NLSFIndices, psNLSF_CB->StartPtr, psNLSF_CB->nStages );
-
- /* Encode NLSF interpolation factor */
- SKP_assert( psEncC->useInterpolatedNLSFs == 1 || psEncCtrlC->NLSFInterpCoef_Q2 == ( 1 << 2 ) );
- SKP_Silk_range_encoder( psRC, psEncCtrlC->NLSFInterpCoef_Q2, SKP_Silk_NLSF_interpolation_factor_CDF );
-
-
- if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
- /*********************/
- /* Encode pitch lags */
- /*********************/
-
-
- /* lag index */
- if( psEncC->fs_kHz == 8 ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_NB_CDF );
- } else if( psEncC->fs_kHz == 12 ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_MB_CDF );
- } else if( psEncC->fs_kHz == 16 ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_WB_CDF );
- } else {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_SWB_CDF );
- }
-
-
- /* countour index */
- if( psEncC->fs_kHz == 8 ) {
- /* Less codevectors used in 8 khz mode */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_NB_CDF );
- } else {
- /* Joint for 12, 16, 24 khz */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_CDF );
- }
-
- /********************/
- /* Encode LTP gains */
- /********************/
-
- /* PERIndex value */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->PERIndex, SKP_Silk_LTP_per_index_CDF );
-
- /* Codebook Indices */
- for( k = 0; k < NB_SUBFR; k++ ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->LTPIndex[ k ], SKP_Silk_LTP_gain_CDF_ptrs[ psEncCtrlC->PERIndex ] );
- }
-
- /**********************/
- /* Encode LTP scaling */
- /**********************/
- SKP_Silk_range_encoder( psRC, psEncCtrlC->LTP_scaleIndex, SKP_Silk_LTPscale_CDF );
- }
-
-
- /***************/
- /* Encode seed */
- /***************/
- SKP_Silk_range_encoder( psRC, psEncCtrlC->Seed, SKP_Silk_Seed_CDF );
-
- /*********************************************/
- /* Encode quantization indices of excitation */
- /*********************************************/
- SKP_Silk_encode_pulses( psRC, psEncCtrlC->sigtype, psEncCtrlC->QuantOffsetType, q, psEncC->frame_length );
-
-
- /*********************************************/
- /* Encode VAD flag */
- /*********************************************/
- SKP_Silk_range_encoder( psRC, psEncC->vadFlag, SKP_Silk_vadflag_CDF );
-}
--- a/src/SKP_Silk_encode_parameters_v4.c
+++ /dev/null
@@ -1,179 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/*******************************************/
-/* Encode parameters to create the payload */
-/*******************************************/
-void SKP_Silk_encode_parameters_v4(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */
- SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */
- SKP_Silk_range_coder_state *psRC /* I/O Range encoder state */
-)
-{
- SKP_int i, k, typeOffset;
- SKP_int encode_absolute_lagIndex, delta_lagIndex;
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB;
-
-
- /************************/
- /* Encode sampling rate */
- /************************/
- /* only done for first frame in packet */
- if( psEncC->nFramesInPayloadBuf == 0 ) {
-
- /* Initialize arithmetic coder */
- SKP_Silk_range_enc_init( &psEncC->sRC );
- psEncC->nBytesInPayloadBuf = 0;
-
- /* get sampling rate index */
- for( i = 0; i < 3; i++ ) {
- if( SKP_Silk_SamplingRates_table[ i ] == psEncC->fs_kHz ) {
- break;
- }
- }
- SKP_Silk_range_encoder( psRC, i, SKP_Silk_SamplingRates_CDF );
- }
-
- /*********************************************/
- /* Encode VAD flag */
- /*********************************************/
- SKP_Silk_range_encoder( psRC, psEncC->vadFlag, SKP_Silk_vadflag_CDF );
-
- /*******************************************/
- /* Encode signal type and quantizer offset */
- /*******************************************/
- typeOffset = 2 * psEncCtrlC->sigtype + psEncCtrlC->QuantOffsetType;
- if( psEncC->nFramesInPayloadBuf == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_CDF );
- } else {
- /* condidtional coding */
- SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_joint_CDF[ psEncC->typeOffsetPrev ] );
- }
- psEncC->typeOffsetPrev = typeOffset;
-
- /****************/
- /* Encode gains */
- /****************/
- /* first subframe */
- if( psEncC->nFramesInPayloadBuf == 0 ) {
- /* first frame in packet: independent coding */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_gain_CDF[ psEncCtrlC->sigtype ] );
- } else {
- /* condidtional coding */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_delta_gain_CDF );
- }
-
- /* remaining subframes */
- for( i = 1; i < NB_SUBFR; i++ ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ i ], SKP_Silk_delta_gain_CDF );
- }
-
-
- /****************/
- /* Encode NLSFs */
- /****************/
- /* Range encoding of the NLSF path */
- psNLSF_CB = psEncC->psNLSF_CB[ psEncCtrlC->sigtype ];
- SKP_Silk_range_encoder_multi( psRC, psEncCtrlC->NLSFIndices, psNLSF_CB->StartPtr, psNLSF_CB->nStages );
-
- /* Encode NLSF interpolation factor */
- SKP_assert( psEncC->useInterpolatedNLSFs == 1 || psEncCtrlC->NLSFInterpCoef_Q2 == ( 1 << 2 ) );
- SKP_Silk_range_encoder( psRC, psEncCtrlC->NLSFInterpCoef_Q2, SKP_Silk_NLSF_interpolation_factor_CDF );
-
-
- if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
- /*********************/
- /* Encode pitch lags */
- /*********************/
-
-
- /* lag index */
- encode_absolute_lagIndex = 1;
- if( psEncC->nFramesInPayloadBuf > 0 && psEncC->prev_sigtype == SIG_TYPE_VOICED ) {
- /* Delta Encoding */
- delta_lagIndex = psEncCtrlC->lagIndex - psEncC->prev_lagIndex;
- if( delta_lagIndex > MAX_DELTA_LAG ) {
- delta_lagIndex = ( MAX_DELTA_LAG << 1 ) + 1;
- } else if ( delta_lagIndex < -MAX_DELTA_LAG ) {
- delta_lagIndex = ( MAX_DELTA_LAG << 1 ) + 1;
- } else {
- delta_lagIndex = delta_lagIndex + MAX_DELTA_LAG;
- encode_absolute_lagIndex = 0; /* Only use delta */
- }
- SKP_Silk_range_encoder( psRC, delta_lagIndex, SKP_Silk_pitch_delta_CDF );
- }
- if( encode_absolute_lagIndex ) {
- /* Absolute encoding */
- if( psEncC->fs_kHz == 8 ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_NB_CDF );
- } else if( psEncC->fs_kHz == 12 ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_MB_CDF );
- } else if( psEncC->fs_kHz == 16 ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_WB_CDF );
- } else {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_SWB_CDF );
- }
- }
- psEncC->prev_lagIndex = psEncCtrlC->lagIndex;
-
-
- /* countour index */
- if( psEncC->fs_kHz == 8 ) {
- /* Less codevectors used in 8 khz mode */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_NB_CDF );
- } else {
- /* Joint for 12, 16, 24 khz */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_CDF );
- }
-
- /********************/
- /* Encode LTP gains */
- /********************/
-
- /* PERIndex value */
- SKP_Silk_range_encoder( psRC, psEncCtrlC->PERIndex, SKP_Silk_LTP_per_index_CDF );
-
- /* Codebook Indices */
- for( k = 0; k < NB_SUBFR; k++ ) {
- SKP_Silk_range_encoder( psRC, psEncCtrlC->LTPIndex[ k ], SKP_Silk_LTP_gain_CDF_ptrs[ psEncCtrlC->PERIndex ] );
- }
-
- /**********************/
- /* Encode LTP scaling */
- /**********************/
- SKP_Silk_range_encoder( psRC, psEncCtrlC->LTP_scaleIndex, SKP_Silk_LTPscale_CDF );
- }
-
-
- /***************/
- /* Encode seed */
- /***************/
- SKP_Silk_range_encoder( psRC, psEncCtrlC->Seed, SKP_Silk_Seed_CDF );
-}
--- a/src/SKP_Silk_encode_pulses.c
+++ /dev/null
@@ -1,195 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/*********************************************/
-/* Encode quantization indices of excitation */
-/*********************************************/
-
-SKP_INLINE SKP_int combine_and_check( /* return ok */
- SKP_int *pulses_comb, /* O */
- const SKP_int *pulses_in, /* I */
- SKP_int max_pulses, /* I max value for sum of pulses */
- SKP_int len /* I number of output values */
-)
-{
- SKP_int k, sum;
-
- for( k = 0; k < len; k++ ) {
- sum = pulses_in[ 2 * k ] + pulses_in[ 2 * k + 1 ];
- if( sum > max_pulses ) {
- return 1;
- }
- pulses_comb[ k ] = sum;
- }
-
- return 0;
-}
-
-/* Encode quantization indices of excitation */
-void SKP_Silk_encode_pulses(
- SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
- const SKP_int sigtype, /* I Sigtype */
- const SKP_int QuantOffsetType,/* I QuantOffsetType */
- const SKP_int q[], /* I quantization indices */
- const SKP_int frame_length /* I Frame length */
-)
-{
- SKP_int i, k, j, iter, bit, nLS, scale_down, RateLevelIndex = 0;
- SKP_int32 abs_q, minSumBits_Q6, sumBits_Q6;
- SKP_int abs_pulses[ MAX_FRAME_LENGTH ];
- SKP_int sum_pulses[ MAX_NB_SHELL_BLOCKS ];
- SKP_int nRshifts[ MAX_NB_SHELL_BLOCKS ];
- SKP_int pulses_comb[ 8 ];
- SKP_int *abs_pulses_ptr;
- const SKP_int *pulses_ptr;
- const SKP_uint16 *cdf_ptr;
- const SKP_int16 *nBits_ptr;
-
- SKP_memset( pulses_comb, 0, 8 * sizeof( SKP_int ) ); // Fixing Valgrind reported problem
-
- /****************************/
- /* Prepare for shell coding */
- /****************************/
- /* Calculate number of shell blocks */
- iter = frame_length / SHELL_CODEC_FRAME_LENGTH;
-
- /* Take the absolute value of the pulses */
- for( i = 0; i < frame_length; i+=4 ) {
- abs_pulses[i+0] = ( SKP_int )SKP_abs( q[ i + 0 ] );
- abs_pulses[i+1] = ( SKP_int )SKP_abs( q[ i + 1 ] );
- abs_pulses[i+2] = ( SKP_int )SKP_abs( q[ i + 2 ] );
- abs_pulses[i+3] = ( SKP_int )SKP_abs( q[ i + 3 ] );
- }
-
- /* Calc sum pulses per shell code frame */
- abs_pulses_ptr = abs_pulses;
- for( i = 0; i < iter; i++ ) {
- nRshifts[ i ] = 0;
-
- while( 1 ) {
- /* 1+1 -> 2 */
- scale_down = combine_and_check( pulses_comb, abs_pulses_ptr, SKP_Silk_max_pulses_table[ 0 ], 8 );
-
- /* 2+2 -> 4 */
- scale_down += combine_and_check( pulses_comb, pulses_comb, SKP_Silk_max_pulses_table[ 1 ], 4 );
-
- /* 4+4 -> 8 */
- scale_down += combine_and_check( pulses_comb, pulses_comb, SKP_Silk_max_pulses_table[ 2 ], 2 );
-
- /* 8+8 -> 16 */
- sum_pulses[ i ] = pulses_comb[ 0 ] + pulses_comb[ 1 ];
- if( sum_pulses[ i ] > SKP_Silk_max_pulses_table[ 3 ] ) {
- scale_down++;
- }
-
- if( scale_down ) {
- /* We need to down scale the quantization signal */
- nRshifts[ i ]++;
- for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
- abs_pulses_ptr[ k ] = SKP_RSHIFT( abs_pulses_ptr[ k ], 1 );
- }
- } else {
- /* Jump out of while(1) loop and go to next shell coding frame */
- break;
- }
- }
- abs_pulses_ptr += SHELL_CODEC_FRAME_LENGTH;
- }
-
- /**************/
- /* Rate level */
- /**************/
- /* find rate level that leads to fewest bits for coding of pulses per block info */
- minSumBits_Q6 = SKP_int32_MAX;
- for( k = 0; k < N_RATE_LEVELS - 1; k++ ) {
- nBits_ptr = SKP_Silk_pulses_per_block_BITS_Q6[ k ];
- sumBits_Q6 = SKP_Silk_rate_levels_BITS_Q6[sigtype][ k ];
- for( i = 0; i < iter; i++ ) {
- if( nRshifts[ i ] > 0 ) {
- sumBits_Q6 += nBits_ptr[ MAX_PULSES + 1 ];
- } else {
- sumBits_Q6 += nBits_ptr[ sum_pulses[ i ] ];
- }
- }
- if( sumBits_Q6 < minSumBits_Q6 ) {
- minSumBits_Q6 = sumBits_Q6;
- RateLevelIndex = k;
- }
- }
- SKP_Silk_range_encoder( psRC, RateLevelIndex, SKP_Silk_rate_levels_CDF[ sigtype ] );
-
- /***************************************************/
- /* Sum-Weighted-Pulses Encoding */
- /***************************************************/
- cdf_ptr = SKP_Silk_pulses_per_block_CDF[ RateLevelIndex ];
- for( i = 0; i < iter; i++ ) {
- if( nRshifts[ i ] == 0 ) {
- SKP_Silk_range_encoder( psRC, sum_pulses[ i ], cdf_ptr );
- } else {
- SKP_Silk_range_encoder( psRC, MAX_PULSES + 1, cdf_ptr );
- for( k = 0; k < nRshifts[ i ] - 1; k++ ) {
- SKP_Silk_range_encoder( psRC, MAX_PULSES + 1, SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ] );
- }
- SKP_Silk_range_encoder( psRC, sum_pulses[ i ], SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ] );
- }
- }
-
- /******************/
- /* Shell Encoding */
- /******************/
- for( i = 0; i < iter; i++ ) {
- if( sum_pulses[ i ] > 0 ) {
- SKP_Silk_shell_encoder( psRC, &abs_pulses[ i * SHELL_CODEC_FRAME_LENGTH ] );
- }
- }
-
- /****************/
- /* LSB Encoding */
- /****************/
- for( i = 0; i < iter; i++ ) {
- if( nRshifts[ i ] > 0 ) {
- pulses_ptr = &q[ i * SHELL_CODEC_FRAME_LENGTH ];
- nLS = nRshifts[ i ] - 1;
- for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
- abs_q = SKP_abs( pulses_ptr[ k ] );
- for( j = nLS; j > 0; j-- ) {
- bit = SKP_RSHIFT( abs_q, j ) & 1;
- SKP_Silk_range_encoder( psRC, bit, SKP_Silk_lsb_CDF );
- }
- bit = abs_q & 1;
- SKP_Silk_range_encoder( psRC, bit, SKP_Silk_lsb_CDF );
- }
- }
- }
-
- /****************/
- /* Encode signs */
- /****************/
- SKP_Silk_encode_signs( psRC, q, frame_length, sigtype, QuantOffsetType, RateLevelIndex );
-}
--- a/src/SKP_Silk_find_LPC_FIX.c
+++ /dev/null
@@ -1,147 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Finds LPC vector from correlations, and converts to NLSF */
-void SKP_Silk_find_LPC_FIX(
- SKP_int NLSF_Q15[], /* O NLSFs */
- SKP_int *interpIndex, /* O NLSF interpolation index, only used for NLSF interpolation */
- const SKP_int prev_NLSFq_Q15[], /* I previous NLSFs, only used for NLSF interpolation */
- const SKP_int useInterpolatedNLSFs, /* I Flag */
- const SKP_int LPC_order, /* I LPC order */
- const SKP_int16 x[], /* I Input signal */
- const SKP_int subfr_length /* I Input signal subframe length including preceeding samples */
-)
-{
- SKP_int k;
- SKP_int32 a_Q16[ MAX_LPC_ORDER ];
-
- SKP_int isInterpLower, shift;
- SKP_int16 S[ MAX_LPC_ORDER ];
- SKP_int32 res_nrg0, res_nrg1;
- SKP_int rshift0, rshift1;
-
- /* Used only for LSF interpolation */
- SKP_int32 a_tmp_Q16[ MAX_LPC_ORDER ], res_nrg_interp, res_nrg, res_tmp_nrg, res_nrg_2nd;
- SKP_int res_nrg_interp_Q, res_nrg_Q, res_tmp_nrg_Q, res_nrg_2nd_Q;
- SKP_int16 a_tmp_Q12[ MAX_LPC_ORDER ];
- SKP_int NLSF0_Q15[ MAX_LPC_ORDER ];
- SKP_int16 LPC_res[ ( MAX_FRAME_LENGTH + NB_SUBFR * MAX_LPC_ORDER ) / 2 ];
-
- /* Default: no interpolation */
- *interpIndex = 4;
-
- /* Burg AR analysis for the full frame */
- SKP_Silk_burg_modified( &res_nrg, &res_nrg_Q, a_Q16, x, subfr_length, NB_SUBFR, FIND_LPC_COND_FAC_Q32, LPC_order );
-
- if( useInterpolatedNLSFs == 1 ) {
-
- /* Optimal solution for last 10 ms */
- SKP_Silk_burg_modified( &res_tmp_nrg, &res_tmp_nrg_Q, a_tmp_Q16, x + ( NB_SUBFR >> 1 ) * subfr_length,
- subfr_length, ( NB_SUBFR >> 1 ), FIND_LPC_COND_FAC_Q32, LPC_order );
-
- /* subtract residual energy here, as that's easier than adding it to the */
- /* residual energy of the first 10 ms in each iteration of the search below */
- shift = res_tmp_nrg_Q - res_nrg_Q;
- if( shift >= 0 ) {
- if( shift < 32 ) {
- res_nrg = res_nrg - SKP_RSHIFT( res_tmp_nrg, shift );
- }
- } else {
- SKP_assert( shift > -32 );
- res_nrg = SKP_RSHIFT( res_nrg, -shift ) - res_tmp_nrg;
- res_nrg_Q = res_tmp_nrg_Q;
- }
-
- /* Convert to NLSFs */
- SKP_Silk_A2NLSF( NLSF_Q15, a_tmp_Q16, LPC_order );
-
- /* Search over interpolation indices to find the one with lowest residual energy */
- res_nrg_2nd = SKP_int32_MAX;
- for( k = 3; k >= 0; k-- ) {
- /* Interpolate NLSFs for first half */
- SKP_Silk_interpolate( NLSF0_Q15, prev_NLSFq_Q15, NLSF_Q15, k, LPC_order );
-
- /* Convert to LPC for residual energy evaluation */
- SKP_Silk_NLSF2A_stable( a_tmp_Q12, NLSF0_Q15, LPC_order );
-
- /* Calculate residual energy with NLSF interpolation */
- SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) );
- SKP_Silk_LPC_analysis_filter( x, a_tmp_Q12, S, LPC_res, 2 * subfr_length, LPC_order );
-
- SKP_Silk_sum_sqr_shift( &res_nrg0, &rshift0, LPC_res + LPC_order, subfr_length - LPC_order );
- SKP_Silk_sum_sqr_shift( &res_nrg1, &rshift1, LPC_res + LPC_order + subfr_length, subfr_length - LPC_order );
-
- /* Add subframe energies from first half frame */
- shift = rshift0 - rshift1;
- if( shift >= 0 ) {
- res_nrg1 = SKP_RSHIFT( res_nrg1, shift );
- res_nrg_interp_Q = -rshift0;
- } else {
- res_nrg0 = SKP_RSHIFT( res_nrg0, -shift );
- res_nrg_interp_Q = -rshift1;
- }
- res_nrg_interp = SKP_ADD32( res_nrg0, res_nrg1 );
-
- /* Compare with first half energy without NLSF interpolation, or best interpolated value so far */
- shift = res_nrg_interp_Q - res_nrg_Q;
- if( shift >= 0 ) {
- if( SKP_RSHIFT( res_nrg_interp, shift ) < res_nrg ) {
- isInterpLower = SKP_TRUE;
- } else {
- isInterpLower = SKP_FALSE;
- }
- } else {
- if( -shift < 32 ) {
- if( res_nrg_interp < SKP_RSHIFT( res_nrg, -shift ) ) {
- isInterpLower = SKP_TRUE;
- } else {
- isInterpLower = SKP_FALSE;
- }
- } else {
- isInterpLower = SKP_FALSE;
- }
- }
-
- /* Determine whether current interpolated NLSFs are best so far */
- if( isInterpLower == SKP_TRUE ) {
- /* Interpolation has lower residual energy */
- res_nrg = res_nrg_interp;
- res_nrg_Q = res_nrg_interp_Q;
- *interpIndex = k;
- }
- res_nrg_2nd = res_nrg_interp;
- res_nrg_2nd_Q = res_nrg_interp_Q;
- }
- }
-
- if( *interpIndex == 4 ) {
- /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */
- SKP_Silk_A2NLSF( NLSF_Q15, a_Q16, LPC_order );
- }
-}
--- a/src/SKP_Silk_find_LTP_FIX.c
+++ /dev/null
@@ -1,234 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-void SKP_Silk_fit_LTP(
- SKP_int32 LTP_coefs_Q16[ LTP_ORDER ],
- SKP_int16 LTP_coefs_Q14[ LTP_ORDER ]
-);
-
-void SKP_Silk_find_LTP_FIX(
- SKP_int16 b_Q14[ NB_SUBFR * LTP_ORDER ], /* O LTP coefs */
- SKP_int32 WLTP[ NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */
- SKP_int *LTPredCodGain_Q7, /* O LTP coding gain */
- const SKP_int16 r_first[], /* I residual signal after LPC signal + state for first 10 ms */
- const SKP_int16 r_last[], /* I residual signal after LPC signal + state for last 10 ms */
- const SKP_int lag[ NB_SUBFR ], /* I LTP lags */
- const SKP_int32 Wght_Q15[ NB_SUBFR ], /* I weights */
- const SKP_int subfr_length, /* I subframe length */
- const SKP_int mem_offset, /* I number of samples in LTP memory */
- SKP_int corr_rshifts[ NB_SUBFR ] /* O right shifts applied to correlations */
-)
-{
- SKP_int i, k, lshift;
- const SKP_int16 *r_ptr, *lag_ptr;
- SKP_int16 *b_Q14_ptr;
-
- SKP_int32 regu;
- SKP_int32 *WLTP_ptr;
- SKP_int32 b_Q16[ LTP_ORDER ], delta_b_Q14[ LTP_ORDER ], d_Q14[ NB_SUBFR ], nrg[ NB_SUBFR ], g_Q26;
- SKP_int32 w[ NB_SUBFR ], WLTP_max, max_abs_d_Q14, max_w_bits;
-
- SKP_int32 temp32, denom32;
- SKP_int extra_shifts;
- SKP_int rr_shifts, maxRshifts, maxRshifts_wxtra, LZs;
- SKP_int32 LPC_res_nrg, LPC_LTP_res_nrg, div_Q16;
- SKP_int32 Rr[ LTP_ORDER ], rr[ NB_SUBFR ];
- SKP_int32 wd, m_Q12;
-
- b_Q14_ptr = b_Q14;
- WLTP_ptr = WLTP;
- r_ptr = &r_first[ mem_offset ];
- for( k = 0; k < NB_SUBFR; k++ ) {
- if( k == ( NB_SUBFR >> 1 ) ) { /* shift residual for last 10 ms */
- r_ptr = &r_last[ mem_offset ];
- }
- lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 );
-
- SKP_Silk_sum_sqr_shift( &rr[ k ], &rr_shifts, r_ptr, subfr_length ); /* rr[ k ] in Q( -rr_shifts ) */
- /* Assure headroom */
- LZs = SKP_Silk_CLZ32( rr[k] );
- if( LZs < LTP_CORRS_HEAD_ROOM ) {
- rr[ k ] = SKP_RSHIFT_ROUND( rr[ k ], LTP_CORRS_HEAD_ROOM - LZs );
- rr_shifts += (LTP_CORRS_HEAD_ROOM - LZs);
- }
- corr_rshifts[ k ] = rr_shifts;
- SKP_Silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, WLTP_ptr, &corr_rshifts[ k ] ); /* WLTP_fix_ptr in Q( -corr_rshifts[ k ] ) */
- /* The correlation vector always have lower max abs value than rr and/or RR so head room is assured */
- SKP_Silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr, corr_rshifts[ k ] ); /* Rr_fix_ptr in Q( -corr_rshifts[ k ] ) */
- if( corr_rshifts[ k ] > rr_shifts ) {
- rr[ k ] = SKP_RSHIFT( rr[ k ], corr_rshifts[ k ] - rr_shifts ); /* rr[ k ] in Q( -corr_rshifts[ k ] ) */
- }
- SKP_assert( rr[ k ] >= 0 );
-
- regu = SKP_SMULWB( rr[ k ] + 1, LTP_DAMPING_Q16 );
- SKP_Silk_regularize_correlations_FIX( WLTP_ptr, &rr[k], regu, LTP_ORDER );
-
- SKP_Silk_solve_LDL_FIX( WLTP_ptr, LTP_ORDER, Rr, b_Q16 ); /* WLTP_fix_ptr and Rr_fix_ptr both in Q(-corr_rshifts[k]) */
-
- /* Limit and store in Q14 */
- SKP_Silk_fit_LTP( b_Q16, b_Q14_ptr );
-
- /* Calculate residual energy */
- nrg[ k ] = SKP_Silk_residual_energy16_covar_FIX( b_Q14_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER, 14 ); /* nrg_fix in Q( -corr_rshifts[ k ] ) */
-
- /* temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length ); */
- extra_shifts = SKP_min_int( corr_rshifts[ k ], LTP_CORRS_HEAD_ROOM );
- denom32 = SKP_LSHIFT_SAT32( SKP_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 + extra_shifts ) + /* Q( -corr_rshifts[ k ] + extra_shifts ) */
- SKP_RSHIFT( SKP_SMULWB( subfr_length, 655 ), corr_rshifts[ k ] - extra_shifts ); /* Q( -corr_rshifts[ k ] + extra_shifts ) */
- denom32 = SKP_max( denom32, 1 );
- SKP_assert( ((SKP_int64)Wght_Q15[ k ] << 16 ) < SKP_int32_MAX ); /* Wght always < 0.5 in Q0 */
- temp32 = SKP_DIV32( SKP_LSHIFT( ( SKP_int32 )Wght_Q15[ k ], 16 ), denom32 ); /* Q( 15 + 16 + corr_rshifts[k] - extra_shifts ) */
- temp32 = SKP_RSHIFT( temp32, 31 + corr_rshifts[ k ] - extra_shifts - 26 ); /* Q26 */
-
- /* Limit temp such that the below scaling never wraps around */
- WLTP_max = 0;
- for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) {
- WLTP_max = SKP_max( WLTP_ptr[ i ], WLTP_max );
- }
- lshift = SKP_Silk_CLZ32( WLTP_max ) - 1 - 3; /* keep 3 bits free for vq_nearest_neighbor_fix */
- SKP_assert( 26 - 18 + lshift >= 0 );
- if( 26 - 18 + lshift < 31 ) {
- temp32 = SKP_min_32( temp32, SKP_LSHIFT( ( SKP_int32 )1, 26 - 18 + lshift ) );
- }
-
- SKP_Silk_scale_vector32_Q26_lshift_18( WLTP_ptr, temp32, LTP_ORDER * LTP_ORDER ); /* WLTP_ptr in Q( 18 - corr_rshifts[ k ] ) */
-
- w[ k ] = matrix_ptr( WLTP_ptr, ( LTP_ORDER >> 1 ), ( LTP_ORDER >> 1 ), LTP_ORDER ); /* w in Q( 18 - corr_rshifts[ k ] ) */
- SKP_assert( w[k] >= 0 );
-
- r_ptr += subfr_length;
- b_Q14_ptr += LTP_ORDER;
- WLTP_ptr += LTP_ORDER * LTP_ORDER;
- }
-
- maxRshifts = 0;
- for( k = 0; k < NB_SUBFR; k++ ) {
- maxRshifts = SKP_max_int( corr_rshifts[ k ], maxRshifts );
- }
-
- /* compute LTP coding gain */
- if( LTPredCodGain_Q7 != NULL ) {
- LPC_LTP_res_nrg = 0;
- LPC_res_nrg = 0;
- SKP_assert( LTP_CORRS_HEAD_ROOM >= 2 ); /* Check that no overflow will happen when adding */
- for( k = 0; k < NB_SUBFR; k++ ) {
- LPC_res_nrg = SKP_ADD32( LPC_res_nrg, SKP_RSHIFT( SKP_ADD32( SKP_SMULWB( rr[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */
- LPC_LTP_res_nrg = SKP_ADD32( LPC_LTP_res_nrg, SKP_RSHIFT( SKP_ADD32( SKP_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */
- }
- LPC_LTP_res_nrg = SKP_max( LPC_LTP_res_nrg, 1 ); /* avoid division by zero */
-
- div_Q16 = SKP_DIV32_varQ( LPC_res_nrg, LPC_LTP_res_nrg, 16 );
- *LTPredCodGain_Q7 = ( SKP_int )SKP_SMULBB( 3, SKP_Silk_lin2log( div_Q16 ) - ( 16 << 7 ) );
-
- SKP_assert( *LTPredCodGain_Q7 == ( SKP_int )SKP_SAT16( SKP_MUL( 3, SKP_Silk_lin2log( div_Q16 ) - ( 16 << 7 ) ) ) );
- }
-
- /* smoothing */
- /* d = sum( B, 1 ); */
- b_Q14_ptr = b_Q14;
- for( k = 0; k < NB_SUBFR; k++ ) {
- d_Q14[ k ] = 0;
- for( i = 0; i < LTP_ORDER; i++ ) {
- d_Q14[ k ] += b_Q14_ptr[ i ];
- }
- b_Q14_ptr += LTP_ORDER;
- }
-
- /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */
-
- /* Find maximum absolute value of d_Q14 and the bits used by w in Q0 */
- max_abs_d_Q14 = 0;
- max_w_bits = 0;
- for( k = 0; k < NB_SUBFR; k++ ) {
- max_abs_d_Q14 = SKP_max_32( max_abs_d_Q14, SKP_abs( d_Q14[ k ] ) );
- /* w[ k ] is in Q( 18 - corr_rshifts[ k ] ) */
- /* Find bits needed in Q( 18 - maxRshifts ) */
- max_w_bits = SKP_max_32( max_w_bits, 32 - SKP_Silk_CLZ32( w[ k ] ) + corr_rshifts[ k ] - maxRshifts );
- }
-
- /* max_abs_d_Q14 = (5 << 15); worst case, i.e. LTP_ORDER * -SKP_int16_MIN */
- SKP_assert( max_abs_d_Q14 <= ( 5 << 15 ) );
-
- /* How many bits is needed for w*d' in Q( 18 - maxRshifts ) in the worst case, of all d_Q14's being equal to max_abs_d_Q14 */
- extra_shifts = max_w_bits + 32 - SKP_Silk_CLZ32( max_abs_d_Q14 ) - 14;
-
- /* Subtract what we got available; bits in output var plus maxRshifts */
- extra_shifts -= ( 32 - 1 - 2 + maxRshifts ); /* Keep sign bit free as well as 2 bits for accumulation */
- extra_shifts = SKP_max_int( extra_shifts, 0 );
-
- maxRshifts_wxtra = maxRshifts + extra_shifts;
-
- temp32 = SKP_RSHIFT( 262, maxRshifts + extra_shifts ) + 1; /* 1e-3f in Q( 18 - (maxRshifts + extra_shifts) ) */
- wd = 0;
- for( k = 0; k < NB_SUBFR; k++ ) {
- /* w has at least 2 bits of headroom so no overflow should happen */
- temp32 = SKP_ADD32( temp32, SKP_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ) ); /* Q( 18 - maxRshifts_wxtra ) */
- wd = SKP_ADD32( wd, SKP_LSHIFT( SKP_SMULWW( SKP_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ), d_Q14[ k ] ), 2 ) ); /* Q( 18 - maxRshifts_wxtra ) */
- }
- m_Q12 = SKP_DIV32_varQ( wd, temp32, 12 );
-
- b_Q14_ptr = b_Q14;
- for( k = 0; k < NB_SUBFR; k++ ) {
- /* w_fix[ k ] from Q( 18 - corr_rshifts[ k ] ) to Q( 16 ) */
- if( 2 - corr_rshifts[k] > 0 ) {
- temp32 = SKP_RSHIFT( w[ k ], 2 - corr_rshifts[ k ] );
- } else {
- temp32 = SKP_LSHIFT_SAT32( w[ k ], corr_rshifts[ k ] - 2 );
- }
-
- g_Q26 = SKP_MUL(
- SKP_DIV32(
- LTP_SMOOTHING_Q26,
- SKP_RSHIFT( LTP_SMOOTHING_Q26, 10 ) + temp32 ), /* Q10 */
- SKP_LSHIFT_SAT32( SKP_SUB_SAT32( ( SKP_int32 )m_Q12, SKP_RSHIFT( d_Q14[ k ], 2 ) ), 4 ) ); /* Q16 */
-
- temp32 = 0;
- for( i = 0; i < LTP_ORDER; i++ ) {
- delta_b_Q14[ i ] = SKP_max_16( b_Q14_ptr[ i ], 1638 ); /* 1638_Q14 = 0.1_Q0 */
- temp32 += delta_b_Q14[ i ]; /* Q14 */
- }
- temp32 = SKP_DIV32( g_Q26, temp32 ); /* Q14->Q12 */
- for( i = 0; i < LTP_ORDER; i++ ) {
- b_Q14_ptr[ i ] = SKP_LIMIT( ( SKP_int32 )b_Q14_ptr[ i ] + SKP_SMULWB( SKP_LSHIFT_SAT32( temp32, 4 ), delta_b_Q14[ i ] ), -16000, 28000 );
- }
- b_Q14_ptr += LTP_ORDER;
- }
-}
-
-void SKP_Silk_fit_LTP(
- SKP_int32 LTP_coefs_Q16[ LTP_ORDER ],
- SKP_int16 LTP_coefs_Q14[ LTP_ORDER ]
-)
-{
- SKP_int i;
-
- for( i = 0; i < LTP_ORDER; i++ ) {
- LTP_coefs_Q14[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( LTP_coefs_Q16[ i ], 2 ) );
- }
-}
--- a/src/SKP_Silk_find_pitch_lags_FIX.c
+++ /dev/null
@@ -1,122 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Find pitch lags */
-void SKP_Silk_find_pitch_lags_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
- SKP_int16 res[], /* O residual */
- const SKP_int16 x[] /* I Speech signal */
-)
-{
- SKP_Silk_predict_state_FIX *psPredSt = &psEnc->sPred;
- SKP_int buf_len, i;
- SKP_int32 scale;
- SKP_int32 thrhld_Q15;
- const SKP_int16 *x_buf, *x_buf_ptr;
- SKP_int16 Wsig[ FIND_PITCH_LPC_WIN_MAX ], *Wsig_ptr;
- SKP_int32 auto_corr[ FIND_PITCH_LPC_ORDER_MAX + 1 ];
- SKP_int16 rc_Q15[ FIND_PITCH_LPC_ORDER_MAX ];
- SKP_int32 A_Q24[ FIND_PITCH_LPC_ORDER_MAX ];
- SKP_int32 FiltState[ FIND_PITCH_LPC_ORDER_MAX ];
- SKP_int16 A_Q12[ FIND_PITCH_LPC_ORDER_MAX ];
-
- /******************************************/
- /* Setup buffer lengths etc based of Fs. */
- /******************************************/
- buf_len = SKP_ADD_LSHIFT( psEnc->sCmn.la_pitch, psEnc->sCmn.frame_length, 1 );
-
- /* Safty check */
- SKP_assert( buf_len >= psPredSt->pitch_LPC_win_length );
-
- x_buf = x - psEnc->sCmn.frame_length;
-
- /*************************************/
- /* Estimate LPC AR coeficients */
- /*************************************/
-
- /* Calculate windowed signal */
-
- /* First LA_LTP samples */
- x_buf_ptr = x_buf + buf_len - psPredSt->pitch_LPC_win_length;
- Wsig_ptr = Wsig;
- SKP_Silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch );
-
- /* Middle un - windowed samples */
- Wsig_ptr += psEnc->sCmn.la_pitch;
- x_buf_ptr += psEnc->sCmn.la_pitch;
- SKP_memcpy( Wsig_ptr, x_buf_ptr, ( psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( SKP_int16 ) );
-
- /* Last LA_LTP samples */
- Wsig_ptr += psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 );
- x_buf_ptr += psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 );
- SKP_Silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch );
-
- /* Calculate autocorrelation sequence */
- SKP_Silk_autocorr( auto_corr, &scale, Wsig, psPredSt->pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1 );
-
- /* add white noise, as fraction of energy */
- auto_corr[ 0 ] = SKP_SMLAWB( auto_corr[ 0 ], auto_corr[ 0 ], FIND_PITCH_WHITE_NOISE_FRACTION_Q16 );
-
- /* calculate the reflection coefficients using schur */
- SKP_Silk_schur( rc_Q15, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder );
-
- /* convert reflection coefficients to prediction coefficients */
- SKP_Silk_k2a( A_Q24, rc_Q15, psEnc->sCmn.pitchEstimationLPCOrder );
-
- /* Convert From 32 bit Q24 to 16 bit Q12 coefs */
- for( i = 0; i < psEnc->sCmn.pitchEstimationLPCOrder; i++ ) {
- A_Q12[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT( A_Q24[ i ], 12 ) );
- }
-
- /* Do BWE */
- SKP_Silk_bwexpander( A_Q12, psEnc->sCmn.pitchEstimationLPCOrder, FIND_PITCH_BANDWITH_EXPANSION_Q16 );
-
- /*****************************************/
- /* LPC analysis filtering */
- /*****************************************/
- SKP_memset( FiltState, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int16 ) );
- SKP_Silk_MA_Prediction( x_buf, A_Q12, FiltState, res, buf_len, psEnc->sCmn.pitchEstimationLPCOrder );
- SKP_memset( res, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int16 ) );
-
- /* Threshold for pitch estimator */
- thrhld_Q15 = ( 1 << 14 ); // 0.5f in Q15
- thrhld_Q15 = SKP_SMLABB( thrhld_Q15, -131, psEnc->sCmn.pitchEstimationLPCOrder );
- thrhld_Q15 = SKP_SMLABB( thrhld_Q15, -13, ( SKP_int16 )SKP_Silk_SQRT_APPROX( SKP_LSHIFT( ( SKP_int32 )psEnc->speech_activity_Q8, 8 ) ) );
- thrhld_Q15 = SKP_SMLABB( thrhld_Q15, 4587, psEnc->sCmn.prev_sigtype );
- thrhld_Q15 = SKP_MLA( thrhld_Q15, -31, SKP_RSHIFT( psEncCtrl->input_tilt_Q15, 8 ) );
- thrhld_Q15 = SKP_SAT16( thrhld_Q15 );
-
- /*****************************************/
- /* Call Pitch estimator */
- /*****************************************/
- psEncCtrl->sCmn.sigtype = SKP_Silk_pitch_analysis_core( res, psEncCtrl->sCmn.pitchL, &psEncCtrl->sCmn.lagIndex,
- &psEncCtrl->sCmn.contourIndex, &psEnc->LTPCorr_Q15, psEnc->sCmn.prevLag, psEnc->pitchEstimationThreshold_Q16,
- ( SKP_int16 )thrhld_Q15, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity );
-}
--- a/src/SKP_Silk_find_pred_coefs_FIX.c
+++ /dev/null
@@ -1,148 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-
-#define VARQ 1 // EXPERIMENTAL
-#define Qx 0 // EXPERIMENTAL
-
-void SKP_Silk_find_pred_coefs_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
- const SKP_int16 res_pitch[] /* I Residual from pitch analysis */
-)
-{
- SKP_int i;
- SKP_int32 WLTP[ NB_SUBFR * LTP_ORDER * LTP_ORDER ];
- SKP_int32 invGains_Q16[ NB_SUBFR ], local_gains_Qx[ NB_SUBFR ], Wght_Q15[ NB_SUBFR ];
- SKP_int NLSF_Q15[ MAX_LPC_ORDER ];
- const SKP_int16 *x_ptr;
- SKP_int16 *x_pre_ptr, LPC_in_pre[ NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ];
-
- SKP_int32 tmp, min_gain_Q16;
-#if !VARQ
- SKP_int LZ;
-#endif
- SKP_int LTP_corrs_rshift[ NB_SUBFR ];
-
-
- /* weighting for weighted least squares */
- min_gain_Q16 = SKP_int32_MAX >> 6;
- for( i = 0; i < NB_SUBFR; i++ ) {
- min_gain_Q16 = SKP_min( min_gain_Q16, psEncCtrl->Gains_Q16[ i ] );
- }
-#if !VARQ
- LZ = SKP_Silk_CLZ32( min_gain_Q16 ) - 1;
- LZ = SKP_LIMIT( LZ, 0, 16 );
- min_gain_Q16 = SKP_RSHIFT( min_gain_Q16, 2 ); /* Ensure that maximum invGains_Q16 is within range of a 16 bit int */
-#endif
- for( i = 0; i < NB_SUBFR; i++ ) {
- /* Divide to Q16 */
- SKP_assert( psEncCtrl->Gains_Q16[ i ] > 0 );
-#if VARQ
- /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */
- invGains_Q16[ i ] = SKP_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 );
-#else
- invGains_Q16[ i ] = SKP_DIV32( SKP_LSHIFT( min_gain_Q16, LZ ), SKP_RSHIFT( psEncCtrl->Gains_Q16[ i ], 16 - LZ ) );
-#endif
-
- /* Ensure Wght_Q15 a minimum value 1 */
- invGains_Q16[ i ] = SKP_max( invGains_Q16[ i ], 363 );
-
- /* Square the inverted gains */
- SKP_assert( invGains_Q16[ i ] == SKP_SAT16( invGains_Q16[ i ] ) );
- tmp = SKP_SMULWB( invGains_Q16[ i ], invGains_Q16[ i ] );
- Wght_Q15[ i ] = SKP_RSHIFT( tmp, 1 );
-
- /* Invert the inverted and normalized gains */
- local_gains_Qx[ i ] = SKP_DIV32( ( 1 << ( 16 + Qx ) ), invGains_Q16[ i ] );
- }
-
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- /**********/
- /* VOICED */
- /**********/
- SKP_assert( psEnc->sCmn.frame_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->sCmn.pitchL[ 0 ] + LTP_ORDER / 2 );
-
- /* LTP analysis */
- SKP_Silk_find_LTP_FIX( psEncCtrl->LTPCoef_Q14, WLTP, &psEncCtrl->LTPredCodGain_Q7, res_pitch,
- res_pitch + SKP_RSHIFT( psEnc->sCmn.frame_length, 1 ), psEncCtrl->sCmn.pitchL, Wght_Q15,
- psEnc->sCmn.subfr_length, psEnc->sCmn.frame_length, LTP_corrs_rshift );
-
-
- /* Quantize LTP gain parameters */
- SKP_Silk_quant_LTP_gains_FIX( psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.LTPIndex, &psEncCtrl->sCmn.PERIndex,
- WLTP, psEnc->mu_LTP_Q8, psEnc->sCmn.LTPQuantLowComplexity );
-
- /* Control LTP scaling */
- SKP_Silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl );
-
- /* Create LTP residual */
- SKP_Silk_LTP_analysis_filter_FIX( LPC_in_pre, psEnc->x_buf + psEnc->sCmn.frame_length - psEnc->sCmn.predictLPCOrder,
- psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.pitchL, invGains_Q16, 16, psEnc->sCmn.subfr_length, psEnc->sCmn.predictLPCOrder );
-
- } else {
- /************/
- /* UNVOICED */
- /************/
- /* Create signal with prepended subframes, scaled by inverse gains */
- x_ptr = psEnc->x_buf + psEnc->sCmn.frame_length - psEnc->sCmn.predictLPCOrder;
- x_pre_ptr = LPC_in_pre;
- for( i = 0; i < NB_SUBFR; i++ ) {
- SKP_Silk_scale_copy_vector16( x_pre_ptr, x_ptr, invGains_Q16[ i ],
- psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder );
- x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder;
- x_ptr += psEnc->sCmn.subfr_length;
- }
-
- SKP_memset( psEncCtrl->LTPCoef_Q14, 0, NB_SUBFR * LTP_ORDER * sizeof( SKP_int16 ) );
- psEncCtrl->LTPredCodGain_Q7 = 0;
- }
-
- /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */
- TIC(FIND_LPC)
- SKP_Silk_find_LPC_FIX( NLSF_Q15, &psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq_Q15,
- psEnc->sCmn.useInterpolatedNLSFs * ( 1 - psEnc->sCmn.first_frame_after_reset ), psEnc->sCmn.predictLPCOrder,
- LPC_in_pre, psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder );
- TOC(FIND_LPC)
-
-
- /* Quantize LSFs */
- TIC(PROCESS_LSFS)
- SKP_Silk_process_NLSFs_FIX( psEnc, psEncCtrl, NLSF_Q15 );
- TOC(PROCESS_LSFS)
-
- /* Calculate residual energy using quantized LPC coefficients */
- SKP_Silk_residual_energy_FIX( psEncCtrl->ResNrg, psEncCtrl->ResNrgQ, LPC_in_pre, psEncCtrl->PredCoef_Q12, local_gains_Qx, Qx,
- psEnc->sCmn.subfr_length, psEnc->sCmn.predictLPCOrder );
-
- /* Copy to prediction struct for use in next frame for fluctuation reduction */
- SKP_memcpy( psEnc->sPred.prev_NLSFq_Q15, NLSF_Q15, psEnc->sCmn.predictLPCOrder * sizeof( SKP_int ) );
-
-}
-
--- a/src/SKP_Silk_gain_quant.c
+++ /dev/null
@@ -1,94 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-#define OFFSET ( ( MIN_QGAIN_DB * 128 ) / 6 + 16 * 128 )
-#define SCALE_Q16 ( ( 65536 * ( N_LEVELS_QGAIN - 1 ) ) / ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) )
-#define INV_SCALE_Q16 ( ( 65536 * ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) / ( N_LEVELS_QGAIN - 1 ) )
-
-/* Gain scalar quantization with hysteresis, uniform on log scale */
-void SKP_Silk_gains_quant(
- SKP_int ind[ NB_SUBFR ], /* O gain indices */
- SKP_int32 gain_Q16[ NB_SUBFR ], /* I/O gains (quantized out) */
- SKP_int *prev_ind, /* I/O last index in previous frame */
- const SKP_int conditional /* I first gain is delta coded if 1 */
-)
-{
- SKP_int k;
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- /* Add half of previous quantization error, convert to log scale, scale, floor() */
- ind[ k ] = SKP_SMULWB( SCALE_Q16, SKP_Silk_lin2log( gain_Q16[ k ] ) - OFFSET );
-
- /* Round towards previous quantized gain (hysteresis) */
- if( ind[ k ] < *prev_ind ) {
- ind[ k ]++;
- }
-
- /* Compute delta indices and limit */
- if( k == 0 && conditional == 0 ) {
- /* Full index */
- ind[ k ] = SKP_LIMIT( ind[ k ], 0, N_LEVELS_QGAIN - 1 );
- ind[ k ] = SKP_max_int( ind[ k ], *prev_ind + MIN_DELTA_GAIN_QUANT );
- *prev_ind = ind[ k ];
- } else {
- /* Delta index */
- ind[ k ] = SKP_LIMIT( ind[ k ] - *prev_ind, MIN_DELTA_GAIN_QUANT, MAX_DELTA_GAIN_QUANT );
- /* Accumulate deltas */
- *prev_ind += ind[ k ];
- /* Shift to make non-negative */
- ind[ k ] -= MIN_DELTA_GAIN_QUANT;
- }
-
- /* Convert to linear scale and scale */
- gain_Q16[ k ] = SKP_Silk_log2lin( SKP_min_32( SKP_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */
- }
-}
-
-/* Gains scalar dequantization, uniform on log scale */
-void SKP_Silk_gains_dequant(
- SKP_int32 gain_Q16[ NB_SUBFR ], /* O quantized gains */
- const SKP_int ind[ NB_SUBFR ], /* I gain indices */
- SKP_int *prev_ind, /* I/O last index in previous frame */
- const SKP_int conditional /* I first gain is delta coded if 1 */
-)
-{
- SKP_int k;
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- if( k == 0 && conditional == 0 ) {
- *prev_ind = ind[ k ];
- } else {
- /* Delta index */
- *prev_ind += ind[ k ] + MIN_DELTA_GAIN_QUANT;
- }
-
- /* Convert to linear scale and scale */
- gain_Q16[ k ] = SKP_Silk_log2lin( SKP_min_32( SKP_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */
- }
-}
--- a/src/SKP_Silk_init_encoder_FIX.c
+++ /dev/null
@@ -1,64 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/*********************************/
-/* Initialize Silk Encoder state */
-/*********************************/
-SKP_int SKP_Silk_init_encoder_FIX(
- SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk encoder state */
-)
-{
- SKP_int ret = 0;
- /* Clear the entire encoder state */
- SKP_memset( psEnc, 0, sizeof( SKP_Silk_encoder_state_FIX ) );
-
- /* Initialize to 24 kHz sampling, 20 ms packets, 25 kbps, 0% packet loss, and init non-zero values */
- ret = SKP_Silk_control_encoder_FIX( psEnc, 24, 20, 25, 0, 0, 0, 10, 1 );
-
-#if HIGH_PASS_INPUT
- psEnc->variable_HP_smth1_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */
- psEnc->variable_HP_smth2_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */
-#endif
-
- /* Used to deactivate e.g. LSF interpolation and fluctuation reduction */
- psEnc->sCmn.first_frame_after_reset = 1;
- psEnc->sCmn.fs_kHz_changed = 0;
- psEnc->sCmn.LBRR_enabled = 0;
-
- /* Initialize Silk VAD */
- ret += SKP_Silk_VAD_Init( &psEnc->sCmn.sVAD );
-
- /* Initialize NSQ */
- psEnc->sNSQ.prev_inv_gain_Q16 = 65536; /* 1.0 in Q16 */
- psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536; /* 1.0 in Q16 */
-
- psEnc->sCmn.bitstream_v = USE_BIT_STREAM_V;
-
- return( ret );
-}
--- a/src/SKP_Silk_inner_prod_aligned.c
+++ /dev/null
@@ -1,96 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_inner_prod_aligned.c *
- * *
- * *
- * Copyright 2008 (c), Skype Limited *
- * Date: 080601 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* sum= for(i=0;i<len;i++)inVec1[i]*inVec2[i]; --- inner product */
-/* Note for ARM asm: */
-/* * inVec1 and inVec2 should be at least 2 byte aligned. (Or defined as short/int16) */
-/* * len should be positive 16bit integer. */
-/* * only when len>6, memory access can be reduced by half. */
-
-SKP_int32 SKP_Silk_inner_prod_aligned(
- const SKP_int16* const inVec1, /* I input vector 1 */
- const SKP_int16* const inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-)
-{
- SKP_int i;
- SKP_int32 sum = 0;
- for( i = 0; i < len; i++ ) {
- sum = SKP_SMLABB( sum, inVec1[ i ], inVec2[ i ] );
- }
- return sum;
-}
-
-SKP_int64 SKP_Silk_inner_prod_aligned_64(
- const SKP_int32 *inVec1, /* I input vector 1 */
- const SKP_int32 *inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-)
-{
- SKP_int i;
- SKP_int64 sum = 0;
- for( i = 0; i < len; i++ ) {
- sum = SKP_SMLAL( sum, inVec1[ i ], inVec2[ i ] );
- }
- return sum;
-}
-SKP_int64 SKP_Silk_inner_prod16_aligned_64(
- const SKP_int16 *inVec1, /* I input vector 1 */
- const SKP_int16 *inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-)
-{
- SKP_int i;
- SKP_int64 sum = 0;
- for( i = 0; i < len; i++ ) {
- sum = SKP_SMLALBB( sum, inVec1[ i ], inVec2[ i ] );
- }
- return sum;
-}
-
-SKP_int32 SKP_Silk_inner_prod16_aligned_sat(
- const SKP_int16* const inVec1, /* I input vector 1 */
- const SKP_int16* const inVec2, /* I input vector 2 */
- const SKP_int len /* I vector lengths */
-)
-{
- SKP_int i;
- SKP_int32 sum = 0;
- for( i = 0; i < len; i++ ) {
- sum = SKP_ADD_SAT32( sum, SKP_SMULBB( inVec1[ i ], inVec2[ i ] ) );
- }
- return sum;
-}
--- a/src/SKP_Silk_interpolate.c
+++ /dev/null
@@ -1,47 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Interpolate two vectors */
-void SKP_Silk_interpolate(
- SKP_int xi[ MAX_LPC_ORDER ], /* O interpolated vector */
- const SKP_int x0[ MAX_LPC_ORDER ], /* I first vector */
- const SKP_int x1[ MAX_LPC_ORDER ], /* I second vector */
- const SKP_int ifact_Q2, /* I interp. factor, weight on 2nd vector */
- const SKP_int d /* I number of parameters */
-)
-{
- SKP_int i;
-
- SKP_assert( ifact_Q2 >= 0 );
- SKP_assert( ifact_Q2 <= ( 1 << 2 ) );
-
- for( i = 0; i < d; i++ ) {
- xi[ i ] = ( SKP_int )( ( SKP_int32 )x0[ i ] + SKP_RSHIFT( SKP_MUL( ( SKP_int32 )x1[ i ] - ( SKP_int32 )x0[ i ], ifact_Q2 ), 2 ) );
- }
-}
--- a/src/SKP_Silk_k2a.c
+++ /dev/null
@@ -1,58 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_k2a.c *
- * *
- * Step up function, converts reflection coefficients to prediction *
- * coefficients *
- * *
- * Copyright 2008 (c), Skype Limited *
- * Date: 080103 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Step up function, converts reflection coefficients to prediction coefficients */
-void SKP_Silk_k2a(
- SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
- const SKP_int16 *rc_Q15, /* I: Reflection coefficients [order] Q15 */
- const SKP_int32 order /* I: Prediction order */
-)
-{
- SKP_int k, n;
- SKP_int32 Atmp[ SigProc_MAX_ORDER_LPC ];
-
- for( k = 0; k < order; k++ ) {
- for( n = 0; n < k; n++ ) {
- Atmp[ n ] = A_Q24[ n ];
- }
- for( n = 0; n < k; n++ ) {
- A_Q24[ n ] = SKP_SMLAWB( A_Q24[ n ], SKP_LSHIFT( Atmp[ k - n - 1 ], 1 ), rc_Q15[ k ] );
- }
- A_Q24[ k ] = -SKP_LSHIFT( (SKP_int32)rc_Q15[ k ], 9 );
- }
-}
--- a/src/SKP_Silk_k2a_Q16.c
+++ /dev/null
@@ -1,58 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_k2a.c *
- * *
- * Step up function, converts reflection coefficients to prediction *
- * coefficients *
- * *
- * Copyright 2008 (c), Skype Limited *
- * Date: 080103 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Step up function, converts reflection coefficients to prediction coefficients */
-void SKP_Silk_k2a_Q16(
- SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
- const SKP_int32 *rc_Q16, /* I: Reflection coefficients [order] Q16 */
- const SKP_int32 order /* I: Prediction order */
-)
-{
- SKP_int k, n;
- SKP_int32 Atmp[ SigProc_MAX_ORDER_LPC ];
-
- for( k = 0; k < order; k++ ) {
- for( n = 0; n < k; n++ ) {
- Atmp[ n ] = A_Q24[ n ];
- }
- for( n = 0; n < k; n++ ) {
- A_Q24[ n ] = SKP_SMLAWW( A_Q24[ n ], Atmp[ k - n - 1 ], rc_Q16[ k ] );
- }
- A_Q24[ k ] = -SKP_LSHIFT( rc_Q16[ k ], 8 );
- }
-}
--- a/src/SKP_Silk_lin2log.c
+++ /dev/null
@@ -1,49 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_lin2log.c *
- * *
- * Convert input to a log scale *
- * Approximation of 128 * log2() *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-/* Approximation of 128 * log2() (very close inverse of approx 2^() below) */
-/* Convert input to a log scale */
-SKP_int32 SKP_Silk_lin2log( const SKP_int32 inLin ) /* I: Input in linear scale */
-{
- SKP_int32 lz, frac_Q7;
-
- SKP_Silk_CLZ_FRAC( inLin, &lz, &frac_Q7 );
-
- /* Piece-wise parabolic approximation */
- return( SKP_LSHIFT( 31 - lz, 7 ) + SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), 179 ) );
-}
-
--- a/src/SKP_Silk_log2lin.c
+++ /dev/null
@@ -1,58 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_log2lin.c *
- * *
- * Convert input to a linear scale *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Approximation of 2^() (very close inverse of SKP_Silk_lin2log()) */
-/* Convert input to a linear scale */
-SKP_int32 SKP_Silk_log2lin( const SKP_int32 inLog_Q7 ) /* I: Input on log scale */
-{
- SKP_int32 out, frac_Q7;
-
- if( inLog_Q7 < 0 ) {
- return 0;
- }
-
- out = SKP_LSHIFT( 1, SKP_RSHIFT( inLog_Q7, 7 ) );
- frac_Q7 = inLog_Q7 & 0x7F;
- if( inLog_Q7 < 2048 ) {
- /* Piece-wise parabolic approximation */
- out = SKP_ADD_RSHIFT( out, SKP_MUL( out, SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), -174 ) ), 7 );
- } else {
- /* Piece-wise parabolic approximation */
- out = SKP_MLA( out, SKP_RSHIFT( out, 7 ), SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), -174 ) );
- }
- return out;
-}
--- a/src/SKP_Silk_lowpass_int.c
+++ /dev/null
@@ -1,61 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_lowpass_int.c *
- * *
- * First order low-pass filter, with input as SKP_int32, running at *
- * 48 kHz *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* First order low-pass filter, with input as SKP_int32, running at 48 kHz */
-void SKP_Silk_lowpass_int(
- const SKP_int32 *in, /* I: Q25 48 kHz signal; length = len */
- SKP_int32 *S, /* I/O: Q25 state; length = 1 */
- SKP_int32 *out, /* O: Q25 48 kHz signal; length = len */
- const SKP_int32 len /* I: Number of samples */
-)
-{
- SKP_int k;
- SKP_int32 in_tmp, out_tmp, state;
-
- state = S[ 0 ];
- for( k = len; k > 0; k-- ) {
- in_tmp = *in++;
- in_tmp -= SKP_RSHIFT( in_tmp, 2 ); /* multiply by 0.75 */
- out_tmp = state + in_tmp; /* zero at nyquist */
- state = in_tmp - SKP_RSHIFT( out_tmp, 1 ); /* pole */
- *out++ = out_tmp;
- }
- S[ 0 ] = state;
-}
-
-
--- a/src/SKP_Silk_lowpass_short.c
+++ /dev/null
@@ -1,61 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_lowpass_short.c *
- * *
- * First order low-pass filter, with input as SKP_int16, running at *
- * 48 kHz *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-
-/* First order low-pass filter, with input as SKP_int16, running at 48 kHz */
-void SKP_Silk_lowpass_short(
- const SKP_int16 *in, /* I: Q15 48 kHz signal; [len] */
- SKP_int32 *S, /* I/O: Q25 state; length = 1 */
- SKP_int32 *out, /* O: Q25 48 kHz signal; [len] */
- const SKP_int32 len /* O: Signal length */
-)
-{
- SKP_int k;
- SKP_int32 in_tmp, out_tmp, state;
-
- state = S[ 0 ];
- for( k = 0; k < len; k++ ) {
- in_tmp = SKP_MUL( 768, (SKP_int32)in[k] ); /* multiply by 0.75, going from Q15 to Q25 */
- out_tmp = state + in_tmp; /* zero at nyquist */
- state = in_tmp - SKP_RSHIFT( out_tmp, 1 ); /* pole */
- out[ k ] = out_tmp;
- }
- S[ 0 ] = state;
-}
-
-
--- a/src/SKP_Silk_macros.h
+++ /dev/null
@@ -1,122 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef _SKP_SILK_API_C_H_
-#define _SKP_SILK_API_C_H_
-
-// This is an inline header file for general platform.
-
-// (a32 * (SKP_int32)((SKP_int16)(b32))) >> 16 output have to be 32bit int
-#define SKP_SMULWB(a32, b32) ((((a32) >> 16) * (SKP_int32)((SKP_int16)(b32))) + ((((a32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(b32))) >> 16))
-
-// a32 + (b32 * (SKP_int32)((SKP_int16)(c32))) >> 16 output have to be 32bit int
-#define SKP_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (SKP_int32)((SKP_int16)(c32))) + ((((b32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(c32))) >> 16)))
-
-// (a32 * (b32 >> 16)) >> 16
-#define SKP_SMULWT(a32, b32) (((a32) >> 16) * ((b32) >> 16) + ((((a32) & 0x0000FFFF) * ((b32) >> 16)) >> 16))
-
-// a32 + (b32 * (c32 >> 16)) >> 16
-#define SKP_SMLAWT(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16))
-
-// (SKP_int32)((SKP_int16)(a3))) * (SKP_int32)((SKP_int16)(b32)) output have to be 32bit int
-#define SKP_SMULBB(a32, b32) ((SKP_int32)((SKP_int16)(a32)) * (SKP_int32)((SKP_int16)(b32)))
-
-// a32 + (SKP_int32)((SKP_int16)(b32)) * (SKP_int32)((SKP_int16)(c32)) output have to be 32bit int
-#define SKP_SMLABB(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * (SKP_int32)((SKP_int16)(c32)))
-
-// (SKP_int32)((SKP_int16)(a32)) * (b32 >> 16)
-#define SKP_SMULBT(a32, b32) ((SKP_int32)((SKP_int16)(a32)) * ((b32) >> 16))
-
-// a32 + (SKP_int32)((SKP_int16)(b32)) * (c32 >> 16)
-#define SKP_SMLABT(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * ((c32) >> 16))
-
-// a64 + (b32 * c32)
-#define SKP_SMLAL(a64, b32, c32) (SKP_ADD64((a64), ((SKP_int64)(b32) * (SKP_int64)(c32))))
-
-// (a32 * b32) >> 16
-#define SKP_SMULWW(a32, b32) SKP_MLA(SKP_SMULWB((a32), (b32)), (a32), SKP_RSHIFT_ROUND((b32), 16))
-
-// a32 + ((b32 * c32) >> 16)
-#define SKP_SMLAWW(a32, b32, c32) SKP_MLA(SKP_SMLAWB((a32), (b32), (c32)), (b32), SKP_RSHIFT_ROUND((c32), 16))
-
-/* add/subtract with output saturated */
-#define SKP_ADD_SAT32(a, b) ((((a) + (b)) & 0x80000000) == 0 ? \
- ((((a) & (b)) & 0x80000000) != 0 ? SKP_int32_MIN : (a)+(b)) : \
- ((((a) | (b)) & 0x80000000) == 0 ? SKP_int32_MAX : (a)+(b)) )
-
-#define SKP_SUB_SAT32(a, b) ((((a)-(b)) & 0x80000000) == 0 ? \
- (( (a) & ((b)^0x80000000) & 0x80000000) ? SKP_int32_MIN : (a)-(b)) : \
- ((((a)^0x80000000) & (b) & 0x80000000) ? SKP_int32_MAX : (a)-(b)) )
-
-SKP_INLINE SKP_int32 SKP_Silk_CLZ16(SKP_int16 in16)
-{
- SKP_int32 out32 = 0;
- if( in16 == 0 ) {
- return 16;
- }
- /* test nibbles */
- if( in16 & 0xFF00 ) {
- if( in16 & 0xF000 ) {
- in16 >>= 12;
- } else {
- out32 += 4;
- in16 >>= 8;
- }
- } else {
- if( in16 & 0xFFF0 ) {
- out32 += 8;
- in16 >>= 4;
- } else {
- out32 += 12;
- }
- }
- /* test bits and return */
- if( in16 & 0xC ) {
- if( in16 & 0x8 )
- return out32 + 0;
- else
- return out32 + 1;
- } else {
- if( in16 & 0xE )
- return out32 + 2;
- else
- return out32 + 3;
- }
-}
-
-SKP_INLINE SKP_int32 SKP_Silk_CLZ32(SKP_int32 in32)
-{
- /* test highest 16 bits and convert to SKP_int16 */
- if( in32 & 0xFFFF0000 ) {
- return SKP_Silk_CLZ16((SKP_int16)(in32 >> 16));
- } else {
- return SKP_Silk_CLZ16((SKP_int16)in32) + 16;
- }
-}
-
-#endif //_SKP_SILK_API_C_H_
-
--- a/src/SKP_Silk_main.h
+++ /dev/null
@@ -1,405 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_MAIN_H
-#define SKP_SILK_MAIN_H
-
-#include "SKP_Silk_SigProc_FIX.h"
-#include "SKP_Silk_define.h"
-#include "SKP_Silk_structs.h"
-#include "SKP_Silk_tables.h"
-#include "SKP_Silk_PLC.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Encodes signs of excitation */
-void SKP_Silk_encode_signs(
- SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
- const SKP_int q[], /* I pulse signal */
- const SKP_int length, /* I length of input */
- const SKP_int sigtype, /* I Signal type */
- const SKP_int QuantOffsetType, /* I Quantization offset type */
- const SKP_int RateLevelIndex /* I Rate Level Index */
-);
-
-/* Decodes signs of excitation */
-void SKP_Silk_decode_signs(
- SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
- SKP_int q[], /* I/O pulse signal */
- const SKP_int length, /* I length of output */
- const SKP_int sigtype, /* I Signal type */
- const SKP_int QuantOffsetType, /* I Quantization offset type */
- const SKP_int RateLevelIndex /* I Rate Level Index */
-);
-
-/***************/
-/* Shell coder */
-/***************/
-
-/* Encode quantization indices of excitation */
-void SKP_Silk_encode_pulses(
- SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
- const SKP_int sigtype, /* I Sigtype */
- const SKP_int QuantOffsetType, /* I QuantOffsetType */
- const SKP_int q[], /* I quantization indices */
- const SKP_int frame_length /* I Frame length */
-);
-
-/* Shell encoder, operates on one shell code frame of 16 pulses */
-void SKP_Silk_shell_encoder(
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_int *pulses0 /* I data: nonnegative pulse amplitudes */
-);
-
-/* Shell decoder, operates on one shell code frame of 16 pulses */
-void SKP_Silk_shell_decoder(
- SKP_int *pulses0, /* O data: nonnegative pulse amplitudes */
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_int pulses4 /* I number of pulses per pulse-subframe */
-);
-
-/***************/
-/* Range coder */
-/***************/
-/* Range encoder for one symbol */
-void SKP_Silk_range_encoder(
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_int data, /* I uncompressed data */
- const SKP_uint16 prob[] /* I cumulative density functions */
-);
-
-/* Range encoder for multiple symbols */
-void SKP_Silk_range_encoder_multi(
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_int data[], /* I uncompressed data [nSymbols] */
- const SKP_uint16 * const prob[], /* I cumulative density functions */
- const SKP_int nSymbols /* I number of data symbols */
-);
-
-/* Range decoder for one symbol */
-void SKP_Silk_range_decoder(
- SKP_int data[], /* O uncompressed data */
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_uint16 prob[], /* I cumulative density function */
- SKP_int probIx /* I initial (middle) entry of cdf */
-);
-
-/* Range decoder for multiple symbols */
-void SKP_Silk_range_decoder_multi(
- SKP_int data[], /* O uncompressed data [nSymbols] */
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_uint16 * const prob[], /* I cumulative density functions */
- const SKP_int probStartIx[], /* I initial (middle) entries of cdfs [nSymbols] */
- const SKP_int nSymbols /* I number of data symbols */
-);
-
-/* Initialize range coder structure for encoder */
-void SKP_Silk_range_enc_init(
- SKP_Silk_range_coder_state *psRC /* O compressor data structure */
-);
-
-/* Initialize range coder structure for decoder */
-void SKP_Silk_range_dec_init(
- SKP_Silk_range_coder_state *psRC, /* O compressor data structure */
- const SKP_uint8 buffer[], /* I buffer for compressed data [bufferLength] */
- const SKP_int32 bufferLength /* I buffer length (in bytes) */
-);
-
-/* Determine length of bitstream */
-SKP_int SKP_Silk_range_coder_get_length( /* O returns number of BITS in stream */
- const SKP_Silk_range_coder_state *psRC, /* I compressed data structure */
- SKP_int *nBytes /* O number of BYTES in stream */
-);
-
-/* Write decodable stream to buffer, and determine its length */
-void SKP_Silk_range_enc_wrap_up(
- SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */
-);
-
-/* Check that any remaining bits in the last byte are set to 1 */
-void SKP_Silk_range_coder_check_after_decoding(
- SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */
-);
-
-/* Gain scalar quantization with hysteresis, uniform on log scale */
-void SKP_Silk_gains_quant(
- SKP_int ind[ NB_SUBFR ], /* O gain indices */
- SKP_int32 gain_Q16[ NB_SUBFR ], /* I/O gains (quantized out) */
- SKP_int *prev_ind, /* I/O last index in previous frame */
- const SKP_int conditional /* I first gain is delta coded if 1 */
-);
-
-/* Gains scalar dequantization, uniform on log scale */
-void SKP_Silk_gains_dequant(
- SKP_int32 gain_Q16[ NB_SUBFR ], /* O quantized gains */
- const SKP_int ind[ NB_SUBFR ], /* I gain indices */
- SKP_int *prev_ind, /* I/O last index in previous frame */
- const SKP_int conditional /* I first gain is delta coded if 1 */
-);
-
-/* Convert NLSF parameters to stable AR prediction filter coefficients */
-void SKP_Silk_NLSF2A_stable(
- SKP_int16 pAR_Q12[ MAX_LPC_ORDER ], /* O Stabilized AR coefs [LPC_order] */
- const SKP_int pNLSF[ MAX_LPC_ORDER ], /* I NLSF vector [LPC_order] */
- const SKP_int LPC_order /* I LPC/LSF order */
-);
-
-/* Interpolate two vectors */
-void SKP_Silk_interpolate(
- SKP_int xi[ MAX_LPC_ORDER ], /* O interpolated vector */
- const SKP_int x0[ MAX_LPC_ORDER ], /* I first vector */
- const SKP_int x1[ MAX_LPC_ORDER ], /* I second vector */
- const SKP_int ifact_Q2, /* I interp. factor, weight on 2nd vector */
- const SKP_int d /* I number of parameters */
-);
-
-/***********************************/
-/* Noise shaping quantization (NSQ)*/
-/***********************************/
-void SKP_Silk_NSQ(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
- SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- const SKP_int16 x[], /* I prefiltered input signal */
- SKP_int q[], /* O quantized qulse signal */
- const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
- const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefficients */
- const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I Long term prediction coefficients */
- const SKP_int16 AR2_Q13[ NB_SUBFR * SHAPE_LPC_ORDER_MAX ], /* I */
- const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */
- const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */
- const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int Lambda_Q10, /* I */
- const SKP_int LTP_scale_Q14 /* I LTP state scaling */
-);
-
-/* Noise shaping using delayed decision */
-void SKP_Silk_NSQ_del_dec(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
- SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
- SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
- const SKP_int16 x[], /* I Prefiltered input signal */
- SKP_int q[], /* O Quantized pulse signal */
- const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
- const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Prediction coefs */
- const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I LT prediction coefs */
- const SKP_int16 AR2_Q13[ NB_SUBFR * SHAPE_LPC_ORDER_MAX ], /* I */
- const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */
- const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */
- const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */
- const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */
- const SKP_int Lambda_Q10, /* I */
- const SKP_int LTP_scale_Q14 /* I LTP state scaling */
-);
-
-/************/
-/* Silk VAD */
-/************/
-/* Initialize the Silk VAD */
-SKP_int SKP_Silk_VAD_Init( /* O Return value, 0 if success */
- SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
-);
-
-/* Silk VAD noise level estimation */
-void SKP_Silk_VAD_GetNoiseLevels(
- const SKP_int32 pX[ VAD_N_BANDS ], /* I subband energies */
- SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
-);
-
-/* Get speech activity level in Q8 */
-SKP_int SKP_Silk_VAD_GetSA_Q8( /* O Return value, 0 if success */
- SKP_Silk_VAD_state *psSilk_VAD, /* I/O Silk VAD state */
- SKP_int *pSA_Q8, /* O Speech activity level in Q8 */
- SKP_int *pSNR_dB_Q7, /* O SNR for current frame in Q7 */
- SKP_int pQuality_Q15[ VAD_N_BANDS ], /* O Smoothed SNR for each band */
- SKP_int *pTilt_Q15, /* O current frame's frequency tilt */
- const SKP_int16 pIn[], /* I PCM input [framelength] */
- const SKP_int framelength /* I Input frame length */
-);
-
-/* Detect signal in 8 - 12 khz range */
-void SKP_Silk_detect_SWB_input(
- SKP_Silk_detect_SWB_state *psSWBdetect, /* I/O Encoder state */
- const SKP_int16 samplesIn[], /* I Input to encoder */
- SKP_int nSamplesIn /* I Length of input */
-);
-
-#if SWITCH_TRANSITION_FILTERING
-/* Low-pass filter with variable cutoff frequency based on */
-/* piece-wise linear interpolation between elliptic filters */
-/* Start by setting transition_frame_no = 1; */
-void SKP_Silk_LP_variable_cutoff(
- SKP_Silk_LP_state *psLP, /* I/O LP filter state */
- SKP_int16 *out, /* O Low-pass filtered output signal */
- const SKP_int16 *in, /* I Input signal */
- const SKP_int frame_length /* I Frame length */
-);
-#endif
-
-/****************************************************/
-/* Decoder Functions */
-/****************************************************/
-SKP_int SKP_Silk_create_decoder(
- SKP_Silk_decoder_state **ppsDec /* I/O Decoder state pointer pointer */
-);
-
-SKP_int SKP_Silk_free_decoder(
- SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */
-);
-
-SKP_int SKP_Silk_init_decoder(
- SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */
-);
-
-/* Set decoder sampling rate */
-void SKP_Silk_decoder_set_fs(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state pointer */
- SKP_int fs_kHz /* I Sampling frequency (kHz) */
-);
-
-/****************/
-/* Decode frame */
-/****************/
-SKP_int SKP_Silk_decode_frame(
- SKP_Silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */
- SKP_int16 pOut[], /* O Pointer to output speech frame */
- SKP_int16 *pN, /* O Pointer to size of output frame */
- const SKP_uint8 pCode[], /* I Pointer to payload */
- const SKP_int nBytes, /* I Payload length */
- SKP_int action, /* I Action from Jitter Buffer */
- SKP_int *decBytes /* O Used bytes to decode this frame */
-);
-
-/* Decode parameters from payload */
-void SKP_Silk_decode_parameters(
- SKP_Silk_decoder_state *psDec, /* I/O State */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int q[], /* O Excitation signal */
- const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */
-);
-
-/* Decode indices from payload v4 Bitstream */
-void SKP_Silk_decode_indices_v4(
- SKP_Silk_decoder_state *psDec /* I/O State */
-);
-
-/* Decode parameters from payload v4 Bitstream */
-void SKP_Silk_decode_parameters_v4(
- SKP_Silk_decoder_state *psDec, /* I/O State */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int q[ MAX_FRAME_LENGTH ], /* O Excitation signal */
- const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */
-);
-
-/* Core decoder. Performs inverse NSQ operation LTP + LPC */
-void SKP_Silk_decode_core(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */
- SKP_int16 xq[], /* O Decoded speech */
- const SKP_int q[ MAX_FRAME_LENGTH ] /* I Pulse signal */
-);
-
-/* NLSF vector decoder */
-void SKP_Silk_NLSF_MSVQ_decode(
- SKP_int *pNLSF_Q15, /* O Pointer to decoded output [LPC_ORDER x 1] */
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Pointer to NLSF codebook struct */
- const SKP_int *NLSFIndices, /* I Pointer to NLSF indices [nStages x 1] */
- const SKP_int LPC_order /* I LPC order */
-);
-
-/**********************/
-/* Arithmetic coding */
-/*********************/
-
-/* Decode quantization indices of excitation (Shell coding) */
-void SKP_Silk_decode_pulses(
- SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int q[], /* O Excitation signal */
- const SKP_int frame_length /* I Frame length (preliminary) */
-);
-
-/******************/
-/* CNG */
-/******************/
-
-/* Reset CNG */
-void SKP_Silk_CNG_Reset(
- SKP_Silk_decoder_state *psDec /* I/O Decoder state */
-);
-
-/* Updates CNG estimate, and applies the CNG when packet was lost */
-void SKP_Silk_CNG(
- SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
- SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
- SKP_int16 signal[], /* I/O Signal */
- SKP_int length /* I Length of residual */
-);
-
-/* Encoding of various parameters */
-void SKP_Silk_encode_parameters(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */
- SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */
- SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
- const SKP_int *q /* I Quantization indices */
-);
-
-/* Encoding of various parameters */
-void SKP_Silk_encode_parameters_v4(
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */
- SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */
- SKP_Silk_range_coder_state *psRC /* I/O Range encoder state */
-);
-
-/* Extract lowest layer encoding */
-void SKP_Silk_get_low_layer_internal(
- const SKP_uint8 *indata, /* I: Encoded input vector */
- const SKP_int16 nBytesIn, /* I: Number of input Bytes */
- SKP_uint8 *Layer0data, /* O: Layer0 payload */
- SKP_int16 *nLayer0Bytes /* O: Number of FEC Bytes */
-);
-
-/* Resets LBRR buffer, used if packet size changes */
-void SKP_Silk_LBRR_reset(
- SKP_Silk_encoder_state *psEncC /* I/O Pointer to Silk encoder state */
-);
-
-/* Predict number of bytes used to encode q */
-SKP_int SKP_Silk_pulses_to_bytes( /* O Return value, predicted number of bytes used to encode q */
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder State*/
- SKP_int q[] /* I Pulse signal */
-);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/SKP_Silk_main_FIX.h
+++ /dev/null
@@ -1,324 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_MAIN_FIX_H
-#define SKP_SILK_MAIN_FIX_H
-
-#include <stdlib.h>
-#include "SKP_Silk_SigProc_FIX.h"
-#include "SKP_Silk_structs_FIX.h"
-#include "SKP_Silk_main.h"
-#include "SKP_Silk_define_FIX.h"
-#include "SKP_Silk_PLC.h"
-#define TIC(TAG_NAME)
-#define TOC(TAG_NAME)
-
-#ifndef FORCE_CPP_BUILD
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-#endif
-
-/*********************/
-/* Encoder Functions */
-/*********************/
-
-/* Initializes the Silk encoder state */
-SKP_int SKP_Silk_init_encoder_FIX(
- SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */
-);
-
-/* Control the Silk encoder */
-SKP_int SKP_Silk_control_encoder_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */
- const SKP_int API_fs_kHz, /* I External (API) sampling rate (kHz) */
- const SKP_int PacketSize_ms, /* I Packet length (ms) */
- SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) (used if SNR_dB == 0) */
- const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */
- const SKP_int INBandFec_enabled, /* I Enable (1) / disable (0) inband FEC */
- const SKP_int DTX_enabled, /* I Enable / disable DTX */
- const SKP_int InputFramesize_ms, /* I Inputframe in ms */
- const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */
-);
-
-/* Encoder main function */
-SKP_int SKP_Silk_encode_frame_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */
- SKP_uint8 *pCode, /* O Pointer to payload */
- SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes; */
- /* input: max length; output: used */
- const SKP_int16 *pIn /* I Pointer to input speech frame */
-);
-
-/* Low BitRate Redundancy encoding functionality. Reuse all parameters but encode with lower bitrate */
-void SKP_Silk_LBRR_encode_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */
- SKP_uint8 *pCode, /* O Pointer to payload */
- SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */
- SKP_int16 xfw[] /* I Input signal */
-);
-
-/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */
-void SKP_Silk_HP_variable_cutoff_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */
- SKP_int16 *out, /* O high-pass filtered output signal */
- const SKP_int16 *in /* I input signal */
-);
-
-/****************/
-/* Prefiltering */
-/****************/
-void SKP_Silk_prefilter_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */
- const SKP_Silk_encoder_control_FIX *psEncCtrl, /* I Encoder control */
- SKP_int16 xw[], /* O Weighted signal */
- const SKP_int16 x[] /* I Speech signal */
-);
-
-/**************************************************************/
-/* Compute noise shaping coefficients and initial gain values */
-/**************************************************************/
-void SKP_Silk_noise_shape_analysis_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */
- const SKP_int16 *pitch_res, /* I LPC residual from pitch analysis */
- const SKP_int16 *x /* I Input signal [ 2 * frame_length + la_shape ]*/
-);
-
-/* Processing of gains */
-void SKP_Silk_process_gains_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control */
-);
-
-
-/* Control low bitrate redundancy usage */
-void SKP_Silk_LBRR_ctrl_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */
-);
-
-/* Calculation of LTP state scaling */
-void SKP_Silk_LTP_scale_ctrl_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */
-);
-
-/**********************************************/
-/* Prediction Analysis */
-/**********************************************/
-
-/* Find pitch lags */
-void SKP_Silk_find_pitch_lags_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
- SKP_int16 res[], /* O residual */
- const SKP_int16 x[] /* I Speech signal */
-);
-
-void SKP_Silk_find_pred_coefs_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
- const SKP_int16 res_pitch[] /* I Residual from pitch analysis */
-);
-
-void SKP_Silk_find_LPC_FIX(
- SKP_int NLSF_Q15[], /* O LSFs */
- SKP_int *interpIndex, /* O LSF interpolation index, only used for LSF interpolation */
- const SKP_int prev_NLSFq_Q15[], /* I previous LSFs, only used for LSF interpolation */
- const SKP_int useInterpolatedLSFs, /* I Flag */
- const SKP_int LPC_order, /* I LPC order */
- const SKP_int16 x[], /* I Input signal */
- const SKP_int subfr_length /* I Input signal subframe length including preceeding samples */
-);
-
-void SKP_Silk_LTP_analysis_filter_FIX(
- SKP_int16 *LTP_res, /* O: LTP residual signal of length NB_SUBFR * ( pre_length + subfr_length ) */
- const SKP_int16 *x, /* I: Pointer to input signal with at least max( pitchL ) preceeding samples */
- const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ],/* I: LTP_ORDER LTP coefficients for each NB_SUBFR subframe */
- const SKP_int pitchL[ NB_SUBFR ], /* I: Pitch lag, one for each subframe */
- const SKP_int32 invGains_Qxx[ NB_SUBFR ], /* I: Inverse quantization gains, one for each subframe */
- const SKP_int Qxx, /* I: Inverse quantization gains Q domain */
- const SKP_int subfr_length, /* I: Length of each subframe */
- const SKP_int pre_length /* I: Length of the preceeding samples starting at &x[0] for each subframe */
-);
-
-/* Finds LTP vector from correlations */
-void SKP_Silk_find_LTP_FIX(
- SKP_int16 b_Q14[ NB_SUBFR * LTP_ORDER ], /* O LTP coefs */
- SKP_int32 WLTP[ NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */
- SKP_int *LTPredCodGain_Q7, /* O LTP coding gain */
- const SKP_int16 r_first[], /* I residual signal after LPC signal + state for first 10 ms */
- const SKP_int16 r_last[], /* I residual signal after LPC signal + state for last 10 ms */
- const SKP_int lag[ NB_SUBFR ], /* I LTP lags */
- const SKP_int32 Wght_Q15[ NB_SUBFR ], /* I weights */
- const SKP_int subfr_length, /* I subframe length */
- const SKP_int mem_offset, /* I number of samples in LTP memory */
- SKP_int corr_rshifts[ NB_SUBFR ] /* O right shifts applied to correlations */
-);
-
-/* LTP tap quantizer */
-void SKP_Silk_quant_LTP_gains_FIX(
- SKP_int16 B_Q14[], /* I/O (un)quantized LTP gains */
- SKP_int cbk_index[], /* O Codebook Index */
- SKP_int *periodicity_index, /* O Periodicity Index */
- const SKP_int32 W_Q18[], /* I Error Weights in Q18 */
- SKP_int mu_Q8, /* I Mu value (R/D tradeoff) */
- SKP_int lowComplexity /* I Flag for low complexity */
-);
-
-/******************/
-/* NLSF Quantizer */
-/******************/
-
-/* Limit, stabilize, convert and quantize NLSFs. */
-void SKP_Silk_process_NLSFs_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
- SKP_int *pNLSF_Q15 /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */
-);
-
-/* LSF vector encoder */
-void SKP_Silk_NLSF_MSVQ_encode_FIX(
- SKP_int *NLSFIndices, /* O Codebook path vector [ CB_STAGES ] */
- SKP_int *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */
- const SKP_int *pNLSF_q_Q15_prev, /* I Prev. quantized NLSF vector [LPC_ORDER] */
- const SKP_int *pW_Q6, /* I NLSF weight vector [ LPC_ORDER ] */
- const SKP_int NLSF_mu_Q15, /* I Rate weight for the RD optimization */
- const SKP_int NLSF_mu_fluc_red_Q16, /* I Fluctuation reduction error weight */
- const SKP_int NLSF_MSVQ_Survivors, /* I Max survivors from each stage */
- const SKP_int LPC_order, /* I LPC order */
- const SKP_int deactivate_fluc_red /* I Deactivate fluctuation reduction */
-);
-
-/* Rate-Distortion calculations for multiple input data vectors */
-void SKP_Silk_NLSF_VQ_rate_distortion_FIX(
- SKP_int32 *pRD_Q20, /* O Rate-distortion values [psNLSF_CBS->nVectors*N] */
- const SKP_Silk_NLSF_CBS *psNLSF_CBS, /* I NLSF codebook stage struct */
- const SKP_int *in_Q15, /* I Input vectors to be quantized */
- const SKP_int *w_Q6, /* I Weight vector */
- const SKP_int32 *rate_acc_Q5, /* I Accumulated rates from previous stage */
- const SKP_int mu_Q15, /* I Weight between weighted error and rate */
- const SKP_int N, /* I Number of input vectors to be quantized */
- const SKP_int LPC_order /* I LPC order */
-);
-
-/* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */
-void SKP_Silk_NLSF_VQ_sum_error_FIX(
- SKP_int32 *err_Q20, /* O Weighted quantization errors [N*K] */
- const SKP_int *in_Q15, /* I Input vectors to be quantized [N*LPC_order] */
- const SKP_int *w_Q6, /* I Weighting vectors [N*LPC_order] */
- const SKP_int16 *pCB_Q15, /* I Codebook vectors [K*LPC_order] */
- const SKP_int N, /* I Number of input vectors */
- const SKP_int K, /* I Number of codebook vectors */
- const SKP_int LPC_order /* I Number of LPCs */
-);
-
-/* Entropy constrained MATRIX-weighted VQ, for a single input data vector */
-void SKP_Silk_VQ_WMat_EC_FIX(
- SKP_int *ind, /* O index of best codebook vector */
- SKP_int32 *rate_dist_Q14, /* O best weighted quantization error + mu * rate*/
- const SKP_int16 *in_Q14, /* I input vector to be quantized */
- const SKP_int32 *W_Q18, /* I weighting matrix */
- const SKP_int16 *cb_Q14, /* I codebook */
- const SKP_int16 *cl_Q6, /* I code length for each codebook vector */
- const SKP_int mu_Q8, /* I tradeoff between weighted error and rate */
- SKP_int L /* I number of vectors in codebook */
-);
-
-/******************/
-/* Linear Algebra */
-/******************/
-
-/* Calculates correlation matrix X'*X */
-void SKP_Silk_corrMatrix_FIX(
- const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
- const SKP_int L, /* I Length of vectors */
- const SKP_int order, /* I Max lag for correlation */
- SKP_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ]*/
- SKP_int *rshifts /* I/O Right shifts of correlations */
-);
-
-/* Calculates correlation vector X'*t */
-void SKP_Silk_corrVector_FIX(
- const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
- const SKP_int16 *t, /* I target vector [L] */
- const SKP_int L, /* I Length of vectors */
- const SKP_int order, /* I Max lag for correlation */
- SKP_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */
- const SKP_int rshifts /* I Right shifts of correlations */
-);
-
-/* Add noise to matrix diagonal */
-void SKP_Silk_regularize_correlations_FIX(
- SKP_int32 *XX, /* I/O Correlation matrices */
- SKP_int32 *xx, /* I/O Correlation values */
- SKP_int32 noise, /* I Noise to add */
- SKP_int D /* I Dimension of XX */
-);
-
-/* Solves Ax = b, assuming A is symmetric */
-void SKP_Silk_solve_LDL_FIX(
- SKP_int32 *A, /* I Pointer to symetric square matrix A */
- SKP_int M, /* I Size of matrix */
- const SKP_int32 *b, /* I Pointer to b vector */
- SKP_int32 *x_Q16 /* O Pointer to x solution vector */
-);
-
-/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */
-SKP_int32 SKP_Silk_residual_energy16_covar_FIX(
- const SKP_int16 *c, /* I Prediction vector */
- const SKP_int32 *wXX, /* I Correlation matrix */
- const SKP_int32 *wXx, /* I Correlation vector */
- SKP_int32 wxx, /* I Signal energy */
- SKP_int D, /* I Dimension */
- SKP_int cQ /* I Q value for c vector 0 - 15 */
-);
-
-/* Calculates residual energies of input subframes where all subframes have LPC_order */
-/* of preceeding samples */
-void SKP_Silk_residual_energy_FIX(
- SKP_int32 nrgs[ NB_SUBFR ], /* O Residual energy per subframe */
- SKP_int nrgsQ[ NB_SUBFR ], /* O Q value per subframe */
- const SKP_int16 x[], /* I Input signal */
- const SKP_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ],/* I AR coefs for each frame half */
- const SKP_int32 gains_Qx[ NB_SUBFR ], /* I Quantization gains in Qx */
- const SKP_int Qx, /* I Quantization gains Q value */
- const SKP_int subfr_length, /* I Subframe length */
- const SKP_int LPC_order /* I LPC order */
-);
-
-#ifndef FORCE_CPP_BUILD
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* FORCE_CPP_BUILD */
-#endif /* SKP_SILK_MAIN_FIX_H */
--- a/src/SKP_Silk_noise_shape_analysis_FIX.c
+++ /dev/null
@@ -1,338 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-#include "SKP_Silk_perceptual_parameters_FIX.h"
-
-
-/**************************************************************/
-/* Compute noise shaping coefficients and initial gain values */
-/**************************************************************/
-void SKP_Silk_noise_shape_analysis_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */
- const SKP_int16 *pitch_res, /* I LPC residual from pitch analysis */
- const SKP_int16 *x /* I Input signal [ 2 * frame_length + la_shape ]*/
-)
-{
- SKP_Silk_shape_state_FIX *psShapeSt = &psEnc->sShape;
- SKP_int k, nSamples, lz, Qnrg, b_Q14, scale = 0, sz;
- SKP_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp32;
- SKP_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7;
- SKP_int32 delta_Q16, BWExp1_Q16, BWExp2_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8;
- SKP_int32 auto_corr[ SHAPE_LPC_ORDER_MAX + 1 ];
- SKP_int32 refl_coef_Q16[ SHAPE_LPC_ORDER_MAX ];
- SKP_int32 AR_Q24[ SHAPE_LPC_ORDER_MAX ];
- SKP_int16 x_windowed[ SHAPE_LPC_WIN_MAX ];
- const SKP_int16 *x_ptr, *pitch_res_ptr;
-
- SKP_int32 sqrt_nrg[ NB_SUBFR ], Qnrg_vec[ NB_SUBFR ];
-
- /* Point to start of first LPC analysis block */
- x_ptr = x + psEnc->sCmn.la_shape - SKP_SMULBB( SHAPE_LPC_WIN_MS, psEnc->sCmn.fs_kHz ) + psEnc->sCmn.frame_length / NB_SUBFR;
-
- /****************/
- /* CONTROL SNR */
- /****************/
- /* Reduce SNR_dB values if recent bitstream has exceeded TargetRate */
- psEncCtrl->current_SNR_dB_Q7 = psEnc->SNR_dB_Q7 - SKP_SMULWB( SKP_LSHIFT( ( SKP_int32 )psEnc->BufferedInChannel_ms, 7 ), 3277 );
-
- /* Reduce SNR_dB if inband FEC used */
- if( psEnc->speech_activity_Q8 > LBRR_SPEECH_ACTIVITY_THRES_Q8 ) {
- psEncCtrl->current_SNR_dB_Q7 -= SKP_RSHIFT( psEnc->inBandFEC_SNR_comp_Q8, 1 );
- }
-
- /****************/
- /* GAIN CONTROL */
- /****************/
- /* Input quality is the average of the quality in the lowest two VAD bands */
- psEncCtrl->input_quality_Q14 = ( SKP_int )SKP_RSHIFT( ( SKP_int32 )psEncCtrl->input_quality_bands_Q15[ 0 ]
- + psEncCtrl->input_quality_bands_Q15[ 1 ], 2 );
- /* Coding quality level, between 0.0_Q0 and 1.0_Q0, but in Q14 */
- psEncCtrl->coding_quality_Q14 = SKP_RSHIFT( SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( psEncCtrl->current_SNR_dB_Q7 - ( 18 << 7 ), 4 ) ), 1 );
-
- /* Reduce coding SNR during low speech activity */
- b_Q8 = ( 1 << 8 ) - psEnc->speech_activity_Q8;
- b_Q8 = SKP_SMULWB( SKP_LSHIFT( b_Q8, 8 ), b_Q8 );
- SNR_adj_dB_Q7 = SKP_SMLAWB( psEncCtrl->current_SNR_dB_Q7,
- SKP_SMULBB( -BG_SNR_DECR_dB_Q7 >> ( 4 + 1 ), b_Q8 ), // Q11
- SKP_SMULWB( ( 1 << 14 ) + psEncCtrl->input_quality_Q14, psEncCtrl->coding_quality_Q14 ) ); // Q12
-
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- /* Reduce gains for periodic signals */
- SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, HARM_SNR_INCR_dB_Q7 << 1, psEnc->LTPCorr_Q15 );
- } else {
- /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */
- SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7,
- SKP_SMLAWB( 6 << ( 7 + 2 ), -104856, psEncCtrl->current_SNR_dB_Q7 ), //-104856_Q18 = -0.4_Q0, Q9
- ( 1 << 14 ) - psEncCtrl->input_quality_Q14 ); // Q14
- }
-
- /*************************/
- /* SPARSENESS PROCESSING */
- /*************************/
- /* Set quantizer offset */
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- /* Initally set to 0; may be overruled in process_gains(..) */
- psEncCtrl->sCmn.QuantOffsetType = 0;
- psEncCtrl->sparseness_Q8 = 0;
- } else {
- /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */
- nSamples = SKP_LSHIFT( psEnc->sCmn.fs_kHz, 1 );
- energy_variation_Q7 = 0;
- log_energy_prev_Q7 = 0;
- pitch_res_ptr = pitch_res;
- for( k = 0; k < FRAME_LENGTH_MS / 2; k++ ) {
- SKP_Silk_sum_sqr_shift( &nrg, &scale, pitch_res_ptr, nSamples );
- nrg += SKP_RSHIFT( nSamples, scale ); // Q(-scale)
-
- log_energy_Q7 = SKP_Silk_lin2log( nrg );
- if( k > 0 ) {
- energy_variation_Q7 += SKP_abs( log_energy_Q7 - log_energy_prev_Q7 );
- }
- log_energy_prev_Q7 = log_energy_Q7;
- pitch_res_ptr += nSamples;
- }
-
- psEncCtrl->sparseness_Q8 = SKP_RSHIFT( SKP_Silk_sigm_Q15( SKP_SMULWB( energy_variation_Q7 - ( 5 << 7 ), 6554 ) ), 7 ); // 6554_Q16 = 0.1_Q0
-
- /* Set quantization offset depending on sparseness measure */
- if( psEncCtrl->sparseness_Q8 > SPARSENESS_THRESHOLD_QNT_OFFSET_Q8 ) {
- psEncCtrl->sCmn.QuantOffsetType = 0;
- } else {
- psEncCtrl->sCmn.QuantOffsetType = 1;
- }
-
- /* Increase coding SNR for sparse signals */
- SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, SPARSE_SNR_INCR_dB_Q7 << 8, psEncCtrl->sparseness_Q8 - ( 1 << 7 ) );
- }
-
- /*******************************/
- /* Control bandwidth expansion */
- /*******************************/
- delta_Q16 = SKP_SMULWB( ( 1 << 16 ) - SKP_SMULBB( 3, psEncCtrl->coding_quality_Q14 ), LOW_RATE_BANDWIDTH_EXPANSION_DELTA_Q16 );
- BWExp1_Q16 = BANDWIDTH_EXPANSION_Q16 - delta_Q16;
- BWExp2_Q16 = BANDWIDTH_EXPANSION_Q16 + delta_Q16;
- if( psEnc->sCmn.fs_kHz == 24 ) {
- /* Less bandwidth expansion for super wideband */
- BWExp1_Q16 = ( 1 << 16 ) - SKP_SMULWB( SWB_BANDWIDTH_EXPANSION_REDUCTION_Q16, ( 1 << 16 ) - BWExp1_Q16 );
- BWExp2_Q16 = ( 1 << 16 ) - SKP_SMULWB( SWB_BANDWIDTH_EXPANSION_REDUCTION_Q16, ( 1 << 16 ) - BWExp2_Q16 );
- }
- /* BWExp1 will be applied after BWExp2, so make it relative */
- BWExp1_Q16 = SKP_DIV32_16( SKP_LSHIFT( BWExp1_Q16, 14 ), SKP_RSHIFT( BWExp2_Q16, 2 ) );
-
- /********************************************/
- /* Compute noise shaping AR coefs and gains */
- /********************************************/
- sz = ( SKP_int )SKP_SMULBB( SHAPE_LPC_WIN_MS, psEnc->sCmn.fs_kHz );
- for( k = 0; k < NB_SUBFR; k++ ) {
- /* Apply window */
- SKP_Silk_apply_sine_window( x_windowed, x_ptr, 0, SHAPE_LPC_WIN_MS * psEnc->sCmn.fs_kHz );
-
- /* Update pointer: next LPC analysis block */
- x_ptr += psEnc->sCmn.frame_length / NB_SUBFR;
-
- /* Calculate auto correlation */
- SKP_Silk_autocorr( auto_corr, &scale, x_windowed, sz, psEnc->sCmn.shapingLPCOrder + 1 );
-
- /* Add white noise, as a fraction of energy */
- auto_corr[0] = SKP_ADD32( auto_corr[0], SKP_max_32( SKP_SMULWB( SKP_RSHIFT( auto_corr[ 0 ], 4 ), SHAPE_WHITE_NOISE_FRACTION_Q20 ), 1 ) );
-
- /* Calculate the reflection coefficients using schur */
- nrg = SKP_Silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrder );
-
- /* Convert reflection coefficients to prediction coefficients */
- SKP_Silk_k2a_Q16( AR_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder );
-
- /* Bandwidth expansion for synthesis filter shaping */
- SKP_Silk_bwexpander_32( AR_Q24, psEnc->sCmn.shapingLPCOrder, BWExp2_Q16 );
-
- /* Make sure to fit in Q13 SKP_int16 */
- SKP_Silk_LPC_fit( &psEncCtrl->AR2_Q13[ k * SHAPE_LPC_ORDER_MAX ], AR_Q24, 13, psEnc->sCmn.shapingLPCOrder );
-
- /* Compute noise shaping filter coefficients */
- SKP_memcpy(
- &psEncCtrl->AR1_Q13[ k * SHAPE_LPC_ORDER_MAX ],
- &psEncCtrl->AR2_Q13[ k * SHAPE_LPC_ORDER_MAX ],
- psEnc->sCmn.shapingLPCOrder * sizeof( SKP_int16 ) );
-
- /* Bandwidth expansion for analysis filter shaping */
- SKP_assert( BWExp1_Q16 <= ( 1 << 16 ) ); // If ever breaking, use LPC_stabilize() in these cases to stay within range
- SKP_Silk_bwexpander( &psEncCtrl->AR1_Q13[ k * SHAPE_LPC_ORDER_MAX ], psEnc->sCmn.shapingLPCOrder, BWExp1_Q16 );
-
- /* Increase residual energy */
- nrg = SKP_SMLAWB( nrg, SKP_RSHIFT( auto_corr[ 0 ], 8 ), SHAPE_MIN_ENERGY_RATIO_Q24 );
-
- Qnrg = -scale; // range: -12...30
- SKP_assert( Qnrg >= -12 );
- SKP_assert( Qnrg <= 30 );
-
- /* Make sure that Qnrg is an even number */
- if( Qnrg & 1 ) {
- Qnrg -= 1;
- nrg >>= 1;
- }
-
- tmp32 = SKP_Silk_SQRT_APPROX( nrg );
- Qnrg >>= 1; // range: -6...15
-
- sqrt_nrg[ k ] = tmp32;
- Qnrg_vec[ k ] = Qnrg;
-
- psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( tmp32, 16 - Qnrg );
- /* Ratio of prediction gains, in energy domain */
- SKP_Silk_LPC_inverse_pred_gain_Q13( &pre_nrg_Q30, &psEncCtrl->AR2_Q13[ k * SHAPE_LPC_ORDER_MAX ], psEnc->sCmn.shapingLPCOrder );
- SKP_Silk_LPC_inverse_pred_gain_Q13( &nrg, &psEncCtrl->AR1_Q13[ k * SHAPE_LPC_ORDER_MAX ], psEnc->sCmn.shapingLPCOrder );
-
- lz = SKP_min_32( SKP_Silk_CLZ32( pre_nrg_Q30 ) - 1, 19 );
- pre_nrg_Q30 = SKP_DIV32( SKP_LSHIFT( pre_nrg_Q30, lz ), SKP_RSHIFT( nrg, 20 - lz ) + 1 ); // Q20
- pre_nrg_Q30 = SKP_RSHIFT( SKP_LSHIFT_SAT32( pre_nrg_Q30, 9 ), 1 ); /* Q28 */
- psEncCtrl->GainsPre_Q14[ k ] = ( SKP_int )SKP_Silk_SQRT_APPROX( pre_nrg_Q30 );
- }
-
- /*****************/
- /* Gain tweaking */
- /*****************/
- /* Increase gains during low speech activity and put lower limit on gains */
- gain_mult_Q16 = SKP_Silk_log2lin( -SKP_SMLAWB( -16 << 7, SNR_adj_dB_Q7, 10486 ) ); // 10486_Q16 = 0.16_Q0
- gain_add_Q16 = SKP_Silk_log2lin( SKP_SMLAWB( 16 << 7, NOISE_FLOOR_dB_Q7, 10486 ) ); // 10486_Q16 = 0.16_Q0
- tmp32 = SKP_Silk_log2lin( SKP_SMLAWB( 16 << 7, RELATIVE_MIN_GAIN_dB_Q7, 10486 ) ); // 10486_Q16 = 0.16_Q0
- tmp32 = SKP_SMULWW( psEnc->avgGain_Q16, tmp32 );
- gain_add_Q16 = SKP_ADD_SAT32( gain_add_Q16, tmp32 );
- SKP_assert( gain_mult_Q16 >= 0 );
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- psEncCtrl->Gains_Q16[ k ] = SKP_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 );
- SKP_assert( psEncCtrl->Gains_Q16[ k ] >= 0 );
- }
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- psEncCtrl->Gains_Q16[ k ] = SKP_ADD_POS_SAT32( psEncCtrl->Gains_Q16[ k ], gain_add_Q16 );
- psEnc->avgGain_Q16 = SKP_ADD_SAT32(
- psEnc->avgGain_Q16,
- SKP_SMULWB(
- psEncCtrl->Gains_Q16[ k ] - psEnc->avgGain_Q16,
- SKP_RSHIFT_ROUND( SKP_SMULBB( psEnc->speech_activity_Q8, GAIN_SMOOTHING_COEF_Q10 ), 2 )
- ) );
- }
-
- /************************************************/
- /* Decrease level during fricatives (de-essing) */
- /************************************************/
- gain_mult_Q16 = ( 1 << 16 ) + SKP_RSHIFT_ROUND( SKP_MLA( INPUT_TILT_Q26, psEncCtrl->coding_quality_Q14, HIGH_RATE_INPUT_TILT_Q12 ), 10 );
-
- if( psEncCtrl->input_tilt_Q15 <= 0 && psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED ) {
- if( psEnc->sCmn.fs_kHz == 24 ) {
- SKP_int32 essStrength_Q15 = SKP_SMULWW( -psEncCtrl->input_tilt_Q15,
- SKP_SMULBB( psEnc->speech_activity_Q8, ( 1 << 8 ) - psEncCtrl->sparseness_Q8 ) );
- tmp32 = SKP_Silk_log2lin( ( 16 << 7 ) - SKP_SMULWB( essStrength_Q15,
- SKP_SMULWB( DE_ESSER_COEF_SWB_dB_Q7, 20972 ) ) ); // 20972_Q17 = 0.16_Q0
- gain_mult_Q16 = SKP_SMULWW( gain_mult_Q16, tmp32 );
- } else if( psEnc->sCmn.fs_kHz == 16 ) {
- SKP_int32 essStrength_Q15 = SKP_SMULWW(-psEncCtrl->input_tilt_Q15,
- SKP_SMULBB( psEnc->speech_activity_Q8, ( 1 << 8 ) - psEncCtrl->sparseness_Q8 ));
- tmp32 = SKP_Silk_log2lin( ( 16 << 7 ) - SKP_SMULWB( essStrength_Q15,
- SKP_SMULWB( DE_ESSER_COEF_WB_dB_Q7, 20972 ) ) ); // 20972_Q17 = 0.16_Q0
- gain_mult_Q16 = SKP_SMULWW( gain_mult_Q16, tmp32 );
- } else {
- SKP_assert( psEnc->sCmn.fs_kHz == 12 || psEnc->sCmn.fs_kHz == 8 );
- }
- }
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- psEncCtrl->GainsPre_Q14[ k ] = SKP_SMULWB( gain_mult_Q16, psEncCtrl->GainsPre_Q14[ k ] );
- }
-
- /************************************************/
- /* Control low-frequency shaping and noise tilt */
- /************************************************/
- /* Less low frequency shaping for noisy inputs */
- strength_Q16 = SKP_MUL( LOW_FREQ_SHAPING_Q0, ( 1 << 16 ) + SKP_SMULBB( LOW_QUALITY_LOW_FREQ_SHAPING_DECR_Q1, psEncCtrl->input_quality_bands_Q15[ 0 ] - ( 1 << 15 ) ) );
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */
- /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/
- SKP_int fs_kHz_inv = SKP_DIV32_16( 3277, psEnc->sCmn.fs_kHz ); // 0.2_Q0 = 3277_Q14
- for( k = 0; k < NB_SUBFR; k++ ) {
- b_Q14 = fs_kHz_inv + SKP_DIV32_16( ( 3 << 14 ), psEncCtrl->sCmn.pitchL[ k ] );
- /* Pack two coefficients in one int32 */
- psEncCtrl->LF_shp_Q14[ k ] = SKP_LSHIFT( ( 1 << 14 ) - b_Q14 - SKP_SMULWB( strength_Q16, b_Q14 ), 16 );
- psEncCtrl->LF_shp_Q14[ k ] |= (SKP_uint16)( b_Q14 - ( 1 << 14 ) );
- }
- SKP_assert( HARM_HP_NOISE_COEF_Q24 < ( 1 << 23 ) ); // Guarantees that second argument to SMULWB() is within range of an SKP_int16
- Tilt_Q16 = - HP_NOISE_COEF_Q16 -
- SKP_SMULWB( ( 1 << 16 ) - HP_NOISE_COEF_Q16, SKP_SMULWB( HARM_HP_NOISE_COEF_Q24, psEnc->speech_activity_Q8 ) );
- } else {
- b_Q14 = SKP_DIV32_16( 21299, psEnc->sCmn.fs_kHz ); // 1.3_Q0 = 21299_Q14
- /* Pack two coefficients in one int32 */
- psEncCtrl->LF_shp_Q14[ 0 ] = SKP_LSHIFT( ( 1 << 14 ) - b_Q14 - SKP_SMULWB( strength_Q16, SKP_SMULWB( 39322, b_Q14 ) ), 16 ); // 0.6_Q0 = 39322_Q16
- psEncCtrl->LF_shp_Q14[ 0 ] |= (SKP_uint16)( b_Q14 - ( 1 << 14 ) );
- for( k = 1; k < NB_SUBFR; k++ ) {
- psEncCtrl->LF_shp_Q14[ k ] = psEncCtrl->LF_shp_Q14[ k - 1 ];
- }
- Tilt_Q16 = -HP_NOISE_COEF_Q16;
- }
-
- /****************************/
- /* HARMONIC SHAPING CONTROL */
- /****************************/
- /* Control boosting of harmonic frequencies */
- HarmBoost_Q16 = SKP_SMULWB( SKP_SMULWB( ( 1 << 17 ) - SKP_LSHIFT( psEncCtrl->coding_quality_Q14, 3 ),
- psEnc->LTPCorr_Q15 ), LOW_RATE_HARMONIC_BOOST_Q16 );
-
- /* More harmonic boost for noisy input signals */
- HarmBoost_Q16 = SKP_SMLAWB( HarmBoost_Q16,
- ( 1 << 16 ) - SKP_LSHIFT( psEncCtrl->input_quality_Q14, 2 ), LOW_INPUT_QUALITY_HARMONIC_BOOST_Q16 );
-
- if( USE_HARM_SHAPING && psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- /* More harmonic noise shaping for high bitrates or noisy input */
- HarmShapeGain_Q16 = SKP_SMLAWB( HARMONIC_SHAPING_Q16,
- ( 1 << 16 ) - SKP_SMULWB( ( 1 << 18 ) - SKP_LSHIFT( psEncCtrl->coding_quality_Q14, 4 ),
- psEncCtrl->input_quality_Q14 ), HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING_Q16 );
-
- /* Less harmonic noise shaping for less periodic signals */
- HarmShapeGain_Q16 = SKP_SMULWB( SKP_LSHIFT( HarmShapeGain_Q16, 1 ),
- SKP_Silk_SQRT_APPROX( SKP_LSHIFT( psEnc->LTPCorr_Q15, 15 ) ) );
- } else {
- HarmShapeGain_Q16 = 0;
- }
-
- /*************************/
- /* Smooth over subframes */
- /*************************/
- for( k = 0; k < NB_SUBFR; k++ ) {
- psShapeSt->HarmBoost_smth_Q16 =
- SKP_SMLAWB( psShapeSt->HarmBoost_smth_Q16, HarmBoost_Q16 - psShapeSt->HarmBoost_smth_Q16, SUBFR_SMTH_COEF_Q16 );
- psShapeSt->HarmShapeGain_smth_Q16 =
- SKP_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 - psShapeSt->HarmShapeGain_smth_Q16, SUBFR_SMTH_COEF_Q16 );
- psShapeSt->Tilt_smth_Q16 =
- SKP_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 - psShapeSt->Tilt_smth_Q16, SUBFR_SMTH_COEF_Q16 );
-
- psEncCtrl->HarmBoost_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->HarmBoost_smth_Q16, 2 );
- psEncCtrl->HarmShapeGain_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 );
- psEncCtrl->Tilt_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 );
- }
-}
--- a/src/SKP_Silk_perceptual_parameters_FIX.h
+++ /dev/null
@@ -1,121 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_PERCEPTUAL_PARAMETERS_FIX_H
-#define SKP_SILK_PERCEPTUAL_PARAMETERS_FIX_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* reduction in coding SNR during low speech activity */
-#define BG_SNR_DECR_dB_Q7 (3<<7)
-
-/* factor for reducing quantization noise during voiced speech */
-#define HARM_SNR_INCR_dB_Q7 (2<<7)
-
-/* factor for reducing quantization noise for unvoiced sparse signals */
-#define SPARSE_SNR_INCR_dB_Q7 (2<<7)
-
-/* threshold for sparseness measure above which to use lower quantization offset during unvoiced */
-#define SPARSENESS_THRESHOLD_QNT_OFFSET_Q8 (3<<6) // 0.75
-
-
-/* noise shaping filter chirp factor */
-#define BANDWIDTH_EXPANSION_Q16 61604 // 0.94
-
-/* difference between chirp factors for analysis and synthesis noise shaping filters at low bitrates */
-#define LOW_RATE_BANDWIDTH_EXPANSION_DELTA_Q16 655 //0.01f
-
-/* factor to reduce all bandwidth expansion coefficients for super wideband, relative to wideband */
-#define SWB_BANDWIDTH_EXPANSION_REDUCTION_Q16 (1<<16) // 1.0f;
-
-/* gain reduction for fricatives */
-#define DE_ESSER_COEF_SWB_dB_Q7 (2 << 7)
-#define DE_ESSER_COEF_WB_dB_Q7 (1 << 7)
-
-
-/* extra harmonic boosting (signal shaping) at low bitrates */
-#define LOW_RATE_HARMONIC_BOOST_Q16 6554 // 0.1
-
-/* extra harmonic boosting (signal shaping) for noisy input signals */
-#define LOW_INPUT_QUALITY_HARMONIC_BOOST_Q16 6554 // 0.1
-
-/* harmonic noise shaping */
-#define HARMONIC_SHAPING_Q16 19661 // 0.3
-
-/* extra harmonic noise shaping for high bitrates or noisy input */
-#define HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING_Q16 13107 // 0.2
-
-
-/* parameter for shaping noise towards higher frequencies */
-#define HP_NOISE_COEF_Q16 19661 // 0.3
-
-/* parameter for shaping noise extra towards higher frequencies during voiced speech */
-#define HARM_HP_NOISE_COEF_Q24 7549747 // 0.45
-
-/* parameter for applying a high-pass tilt to the input signal */
-#define INPUT_TILT_Q26 2684355 // 0.04
-
-/* parameter for extra high-pass tilt to the input signal at high rates */
-#define HIGH_RATE_INPUT_TILT_Q12 246 // 0.06
-
-/* parameter for reducing noise at the very low frequencies */
-#define LOW_FREQ_SHAPING_Q0 3
-
-/* less reduction of noise at the very low frequencies for signals with low SNR at low frequencies */
-#define LOW_QUALITY_LOW_FREQ_SHAPING_DECR_Q1 1 // 0.5_Q0
-
-/* fraction added to first autocorrelation value */
-#define SHAPE_WHITE_NOISE_FRACTION_Q20 50 // 50_Q20 = 4.7684e-5
-
-/* fraction of first autocorrelation value added to residual energy value; limits prediction gain */
-#define SHAPE_MIN_ENERGY_RATIO_Q24 256
-
-/* noise floor to put a low limit on the quantization step size */
-#define NOISE_FLOOR_dB_Q7 (4 << 7)
-
-/* noise floor relative to active speech gain level */
-#define RELATIVE_MIN_GAIN_dB_Q7 -6400 // -50_Q0 = -6400_Q7
-
-/* subframe smoothing coefficient for determining active speech gain level (lower -> more smoothing) */
-#define GAIN_SMOOTHING_COEF_Q10 1 // 1e-3_Q0 = 1.024_Q10
-
-/* subframe smoothing coefficient for HarmBoost, HarmShapeGain, Tilt (lower -> more smoothing) */
-#define SUBFR_SMTH_COEF_Q16 26214 // 0.4
-
-#define NOISE_GAIN_VL_Q16 7864
-#define NOISE_GAIN_VH_Q16 7864
-#define NOISE_GAIN_UVL_Q16 6554
-#define NOISE_GAIN_UVH_Q16 9830
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif //SKP_SILK_PERCEPTUAL_PARAMETERS_FIX_H
--- a/src/SKP_Silk_pitch_analysis_core.c
+++ /dev/null
@@ -1,747 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/***********************************************************
-* Pitch analyser function
-********************************************************** */
-#include "SKP_Silk_SigProc_FIX.h"
-#include "SKP_Silk_pitch_est_defines.h"
-#include "SKP_Silk_resample_rom.h"
-
-#define SCRATCH_SIZE 22
-
-/************************************************************/
-/* Internally used functions */
-/************************************************************/
-void SKP_FIX_P_Ana_calc_corr_st3(
- SKP_int32 cross_corr_st3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX][PITCH_EST_NB_STAGE3_LAGS],/* (O) 3 DIM correlation array */
- const SKP_int16 signal[], /* I vector to correlate */
- SKP_int start_lag, /* I lag offset to search around */
- SKP_int sf_length, /* I length of a 5 ms subframe */
- SKP_int complexity /* I Complexity setting */
-);
-
-void SKP_FIX_P_Ana_calc_energy_st3(
- SKP_int32 energies_st3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX][PITCH_EST_NB_STAGE3_LAGS],/* (O) 3 DIM energy array */
- const SKP_int16 signal[], /* I vector to calc energy in */
- SKP_int start_lag, /* I lag offset to search around */
- SKP_int sf_length, /* I length of one 5 ms subframe */
- SKP_int complexity /* I Complexity setting */
-);
-
-SKP_int32 SKP_FIX_P_Ana_find_scaling(
- const SKP_int16 *signal,
- const SKP_int signal_length,
- const SKP_int sum_sqr_len
-);
-
-void SKP_Silk_decode_pitch(
- SKP_int lagIndex, /* I */
- SKP_int contourIndex, /* O */
- SKP_int pitch_lags[], /* O 4 pitch values */
- SKP_int Fs_kHz /* I sampling frequency (kHz) */
-)
-{
- SKP_int lag, i, min_lag;
-
- min_lag = SKP_SMULBB( PITCH_EST_MIN_LAG_MS, Fs_kHz );
-
- /* Only for 24 / 16 kHz version for now */
- lag = min_lag + lagIndex;
- if( Fs_kHz == 8 ) {
- /* Only a small codebook for 8 khz */
- for( i = 0; i < PITCH_EST_NB_SUBFR; i++ ) {
- pitch_lags[ i ] = lag + SKP_Silk_CB_lags_stage2[ i ][ contourIndex ];
- }
- } else {
- for( i = 0; i < PITCH_EST_NB_SUBFR; i++ ) {
- pitch_lags[ i ] = lag + SKP_Silk_CB_lags_stage3[ i ][ contourIndex ];
- }
- }
-}
-
-/*************************************************************/
-/* FIXED POINT CORE PITCH ANALYSIS FUNCTION */
-/*************************************************************/
-SKP_int SKP_Silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */
- const SKP_int16 *signal, /* I Signal of length PITCH_EST_FRAME_LENGTH_MS*Fs_kHz */
- SKP_int *pitch_out, /* O 4 pitch lag values */
- SKP_int *lagIndex, /* O Lag Index */
- SKP_int *contourIndex, /* O Pitch contour Index */
- SKP_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */
- SKP_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */
- const SKP_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */
- const SKP_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */
- const SKP_int Fs_kHz, /* I Sample frequency (kHz) */
- const SKP_int complexity /* I Complexity setting, 0-2, where 2 is highest */
-)
-{
- SKP_int16 signal_8kHz[ PITCH_EST_MAX_FRAME_LENGTH_ST_2 ];
- SKP_int16 signal_4kHz[ PITCH_EST_MAX_FRAME_LENGTH_ST_1 ];
- SKP_int32 scratch_mem[ 3 * PITCH_EST_MAX_FRAME_LENGTH ];
- SKP_int16 *input_signal_ptr;
- SKP_int32 filt_state[ PITCH_EST_MAX_DECIMATE_STATE_LENGTH ];
- SKP_int i, k, d, j;
- SKP_int16 C[ PITCH_EST_NB_SUBFR ][ ( PITCH_EST_MAX_LAG >> 1 ) + 5 ];
- const SKP_int16 *target_ptr, *basis_ptr;
- SKP_int32 cross_corr, normalizer, energy, shift, energy_basis, energy_target;
- SKP_int d_srch[ PITCH_EST_D_SRCH_LENGTH ];
- SKP_int16 d_comp[ ( PITCH_EST_MAX_LAG >> 1 ) + 5 ];
- SKP_int Cmax, length_d_srch, length_d_comp;
- SKP_int32 sum, threshold, temp32;
- SKP_int CBimax, CBimax_new, CBimax_old, lag, start_lag, end_lag, lag_new;
- SKP_int32 CC[ PITCH_EST_NB_CBKS_STAGE2_EXT ], CCmax, CCmax_b, CCmax_new_b, CCmax_new;
- SKP_int32 energies_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ];
- SKP_int32 crosscorr_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ];
- SKP_int32 lag_counter;
- SKP_int frame_length, frame_length_8kHz, frame_length_4kHz, max_sum_sq_length;
- SKP_int sf_length, sf_length_8kHz, sf_length_4kHz;
- SKP_int min_lag, min_lag_8kHz, min_lag_4kHz;
- SKP_int max_lag, max_lag_8kHz, max_lag_4kHz;
- SKP_int32 contour_bias, diff;
- SKP_int32 lz, lshift;
- SKP_int cbk_offset, cbk_size, nb_cbks_stage2;
- SKP_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q15, corr_thres_Q15;
-
- /* Check for valid sampling frequency */
- SKP_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 || Fs_kHz == 24 );
-
- /* Check for valid complexity setting */
- SKP_assert( complexity >= SigProc_PITCH_EST_MIN_COMPLEX );
- SKP_assert( complexity <= SigProc_PITCH_EST_MAX_COMPLEX );
-
- SKP_assert( search_thres1_Q16 >= 0 && search_thres1_Q16 <= (1<<16) );
- SKP_assert( search_thres2_Q15 >= 0 && search_thres2_Q15 <= (1<<15) );
-
- /* Setup frame lengths max / min lag for the sampling frequency */
- frame_length = PITCH_EST_FRAME_LENGTH_MS * Fs_kHz;
- frame_length_4kHz = PITCH_EST_FRAME_LENGTH_MS * 4;
- frame_length_8kHz = PITCH_EST_FRAME_LENGTH_MS * 8;
- sf_length = SKP_RSHIFT( frame_length, 3 );
- sf_length_4kHz = SKP_RSHIFT( frame_length_4kHz, 3 );
- sf_length_8kHz = SKP_RSHIFT( frame_length_8kHz, 3 );
- min_lag = PITCH_EST_MIN_LAG_MS * Fs_kHz;
- min_lag_4kHz = PITCH_EST_MIN_LAG_MS * 4;
- min_lag_8kHz = PITCH_EST_MIN_LAG_MS * 8;
- max_lag = PITCH_EST_MAX_LAG_MS * Fs_kHz;
- max_lag_4kHz = PITCH_EST_MAX_LAG_MS * 4;
- max_lag_8kHz = PITCH_EST_MAX_LAG_MS * 8;
-
- SKP_memset( C, 0, sizeof( SKP_int16 ) * PITCH_EST_NB_SUBFR * ( ( PITCH_EST_MAX_LAG >> 1 ) + 5) );
-
- /* Resample from input sampled at Fs_kHz to 8 kHz */
- if( Fs_kHz == 12 ) {
- SKP_int16 R23[ SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ];
- SKP_memset( R23, 0, ( SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ) * sizeof( SKP_int16 ) );
-
- SKP_Silk_resample_2_3_coarsest( signal_8kHz, R23, signal,
- PITCH_EST_FRAME_LENGTH_MS * 12, (SKP_int16*)scratch_mem );
- } else if( Fs_kHz == 16 ) {
- if( complexity == SigProc_PITCH_EST_MAX_COMPLEX ) {
- SKP_assert( 4 <= PITCH_EST_MAX_DECIMATE_STATE_LENGTH );
- SKP_memset( filt_state, 0, 4 * sizeof( SKP_int32 ) );
-
- SKP_Silk_resample_1_2_coarse( signal, filt_state, signal_8kHz,
- scratch_mem, frame_length_8kHz );
- } else {
- SKP_assert( 2 <= PITCH_EST_MAX_DECIMATE_STATE_LENGTH );
- SKP_memset( filt_state, 0, 2 * sizeof( SKP_int32 ) );
-
- SKP_Silk_resample_1_2_coarsest( signal, filt_state, signal_8kHz,
- scratch_mem, frame_length_8kHz );
- }
- } else if( Fs_kHz == 24 ) {
- /* Resample to 24 -> 8 khz */
- SKP_assert( 7 <= PITCH_EST_MAX_DECIMATE_STATE_LENGTH );
- SKP_memset( filt_state, 0, 7 * sizeof( SKP_int32 ) );
-
- SKP_Silk_resample_1_3( signal_8kHz, filt_state, signal, 24 * PITCH_EST_FRAME_LENGTH_MS );
-
- } else {
- SKP_assert( Fs_kHz == 8 );
- SKP_memcpy( signal_8kHz, signal, frame_length_8kHz * sizeof( SKP_int16 ) );
- }
-
- /* Decimate again to 4 kHz. Set mem to zero */
- if( complexity == SigProc_PITCH_EST_MAX_COMPLEX ) {
- SKP_assert( 4 <= PITCH_EST_MAX_DECIMATE_STATE_LENGTH );
- SKP_memset( filt_state, 0, 4 * sizeof( SKP_int32 ) );
- SKP_Silk_resample_1_2_coarse( signal_8kHz, filt_state,
- signal_4kHz, scratch_mem, frame_length_4kHz );
- } else {
- SKP_assert( 2 <= PITCH_EST_MAX_DECIMATE_STATE_LENGTH );
- SKP_memset( filt_state, 0, 2 * sizeof( SKP_int32 ) );
- SKP_Silk_resample_1_2_coarsest( signal_8kHz, filt_state,
- signal_4kHz, scratch_mem, frame_length_4kHz );
- }
-
- /* Low-pass filter */
- for( i = frame_length_4kHz - 1; i > 0; i-- ) {
- signal_4kHz[ i ] = SKP_ADD_SAT16( signal_4kHz[ i ], signal_4kHz[ i - 1 ] );
- }
-
- /*******************************************************************************
- ** Scale 4 kHz signal down to prevent correlations measures from overflowing
- ** find scaling as max scaling for each 8kHz(?) subframe
- *******************************************************************************/
-
- /* Inner product is calculated with different lengths, so scale for the worst case */
- max_sum_sq_length = SKP_max_32( sf_length_8kHz, SKP_RSHIFT( frame_length_4kHz, 1 ) );
- shift = SKP_FIX_P_Ana_find_scaling( signal_4kHz, frame_length_4kHz, max_sum_sq_length );
- if( shift > 0 ) {
- for( i = 0; i < frame_length_4kHz; i++ ) {
- signal_4kHz[ i ] = SKP_RSHIFT( signal_4kHz[ i ], shift );
- }
- }
-
- /******************************************************************************
- * FIRST STAGE, operating in 4 khz
- ******************************************************************************/
- target_ptr = &signal_4kHz[ SKP_RSHIFT( frame_length_4kHz, 1 ) ];
- for( k = 0; k < 2; k++ ) {
- /* Check that we are within range of the array */
- SKP_assert( target_ptr >= signal_4kHz );
- SKP_assert( target_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
-
- basis_ptr = target_ptr - min_lag_4kHz;
-
- /* Check that we are within range of the array */
- SKP_assert( basis_ptr >= signal_4kHz );
- SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
-
- normalizer = 0;
- cross_corr = 0;
- /* Calculate first vector products before loop */
- cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz );
- normalizer = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz );
- normalizer = SKP_ADD_SAT32( normalizer, 1000 );
-
- temp32 = SKP_DIV32( cross_corr, SKP_Silk_SQRT_APPROX( normalizer ) + 1 );
- C[ k ][ min_lag_4kHz ] = (SKP_int16)SKP_SAT16( temp32 ); /* Q0 */
-
- /* From now on normalizer is computed recursively */
- for( d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++ ) {
- basis_ptr--;
-
- /* Check that we are within range of the array */
- SKP_assert( basis_ptr >= signal_4kHz );
- SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
-
- cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz );
-
- /* Add contribution of new sample and remove contribution from oldest sample */
- normalizer +=
- SKP_SMULBB( basis_ptr[ 0 ], basis_ptr[ 0 ] ) -
- SKP_SMULBB( basis_ptr[ sf_length_8kHz ], basis_ptr[ sf_length_8kHz ] );
-
- temp32 = SKP_DIV32( cross_corr, SKP_Silk_SQRT_APPROX( normalizer ) + 1 );
- C[ k ][ d ] = (SKP_int16)SKP_SAT16( temp32 ); /* Q0 */
- }
- /* Update target pointer */
- target_ptr += sf_length_8kHz;
- }
-
- /* Combine two subframes into single correlation measure and apply short-lag bias */
- for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) {
- sum = (SKP_int32)C[ 0 ][ i ] + (SKP_int32)C[ 1 ][ i ]; /* Q0 */
- SKP_assert( SKP_RSHIFT( sum, 1 ) == SKP_SAT16( SKP_RSHIFT( sum, 1 ) ) );
- sum = SKP_RSHIFT( sum, 1 ); /* Q-1 */
- SKP_assert( SKP_LSHIFT( (SKP_int32)-i, 4 ) == SKP_SAT16( SKP_LSHIFT( (SKP_int32)-i, 4 ) ) );
- sum = SKP_SMLAWB( sum, sum, SKP_LSHIFT( -i, 4 ) ); /* Q-1 */
- SKP_assert( sum == SKP_SAT16( sum ) );
- C[ 0 ][ i ] = (SKP_int16)sum; /* Q-1 */
- }
-
- /* Sort */
- length_d_srch = 5 + complexity;
- SKP_assert( length_d_srch <= PITCH_EST_D_SRCH_LENGTH );
- SKP_Silk_insertion_sort_decreasing_int16( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch );
-
- /* Escape if correlation is very low already here */
- target_ptr = &signal_4kHz[ SKP_RSHIFT( frame_length_4kHz, 1 ) ];
- energy = SKP_Silk_inner_prod_aligned( target_ptr, target_ptr, SKP_RSHIFT( frame_length_4kHz, 1 ) );
- energy = SKP_ADD_SAT32( energy, 1000 ); /* Q0 */
- Cmax = (SKP_int)C[ 0 ][ min_lag_4kHz ]; /* Q-1 */
- threshold = SKP_SMULBB( Cmax, Cmax ); /* Q-2 */
- /* Compare in Q-2 domain */
- if( SKP_RSHIFT( energy, 4 + 2 ) > threshold ) {
- SKP_memset( pitch_out, 0, PITCH_EST_NB_SUBFR * sizeof( SKP_int ) );
- *LTPCorr_Q15 = 0;
- *lagIndex = 0;
- *contourIndex = 0;
- return 1;
- }
-
- threshold = SKP_SMULWB( search_thres1_Q16, Cmax );
- for( i = 0; i < length_d_srch; i++ ) {
- /* Convert to 8 kHz indices for the sorted correlation that exceeds the threshold */
- if( C[ 0 ][ min_lag_4kHz + i ] > threshold ) {
- d_srch[ i ] = SKP_LSHIFT( d_srch[ i ] + min_lag_4kHz, 1 );
- } else {
- length_d_srch = i;
- break;
- }
- }
- SKP_assert( length_d_srch > 0 );
-
- for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) {
- d_comp[ i ] = 0;
- }
- for( i = 0; i < length_d_srch; i++ ) {
- d_comp[ d_srch[ i ] ] = 1;
- }
-
- /* Convolution */
- for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) {
- d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ];
- }
-
- length_d_srch = 0;
- for( i = min_lag_8kHz; i < max_lag_8kHz + 1; i++ ) {
- if( d_comp[ i + 1 ] > 0 ) {
- d_srch[ length_d_srch ] = i;
- length_d_srch++;
- }
- }
-
- /* Convolution */
- for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) {
- d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ] + d_comp[ i - 3 ];
- }
-
- length_d_comp = 0;
- for( i = min_lag_8kHz; i < max_lag_8kHz + 4; i++ ) {
- if( d_comp[ i ] > 0 ) {
- d_comp[ length_d_comp ] = i - 2;
- length_d_comp++;
- }
- }
-
- /**********************************************************************************
- ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation
- *************************************************************************************/
-
- /******************************************************************************
- ** Scale signal down to avoid correlations measures from overflowing
- *******************************************************************************/
- /* find scaling as max scaling for each subframe */
- shift = SKP_FIX_P_Ana_find_scaling( signal_8kHz, frame_length_8kHz, sf_length_8kHz );
- if( shift > 0 ) {
- for( i = 0; i < frame_length_8kHz; i++ ) {
- signal_8kHz[ i ] = SKP_RSHIFT( signal_8kHz[ i ], shift );
- }
- }
-
- /*********************************************************************************
- * Find energy of each subframe projected onto its history, for a range of delays
- *********************************************************************************/
- SKP_memset( C, 0, PITCH_EST_NB_SUBFR * ( ( PITCH_EST_MAX_LAG >> 1 ) + 5 ) * sizeof( SKP_int16 ) );
-
- target_ptr = &signal_8kHz[ frame_length_4kHz ]; /* point to middle of frame */
- for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) {
-
- /* Check that we are within range of the array */
- SKP_assert( target_ptr >= signal_8kHz );
- SKP_assert( target_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz );
-
- energy_target = SKP_Silk_inner_prod_aligned( target_ptr, target_ptr, sf_length_8kHz );
- // ToDo: Calculate 1 / energy_target here and save one division inside next for loop
- for( j = 0; j < length_d_comp; j++ ) {
- d = d_comp[ j ];
- basis_ptr = target_ptr - d;
-
- /* Check that we are within range of the array */
- SKP_assert( basis_ptr >= signal_8kHz );
- SKP_assert( basis_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz );
-
- cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz );
- energy_basis = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz );
- if( cross_corr > 0 ) {
- energy = SKP_max( energy_target, energy_basis ); /* Find max to make sure first division < 1.0 */
- lz = SKP_Silk_CLZ32( cross_corr );
- lshift = SKP_LIMIT( lz - 1, 0, 15 );
- temp32 = SKP_DIV32( SKP_LSHIFT( cross_corr, lshift ), SKP_RSHIFT( energy, 15 - lshift ) + 1 ); /* Q15 */
- SKP_assert( temp32 == SKP_SAT16( temp32 ) );
- temp32 = SKP_SMULWB( cross_corr, temp32 ); /* Q(-1), cc * ( cc / max(b, t) ) */
- temp32 = SKP_ADD_SAT32( temp32, temp32 ); /* Q(0) */
- lz = SKP_Silk_CLZ32( temp32 );
- lshift = SKP_LIMIT( lz - 1, 0, 15 );
- energy = SKP_min( energy_target, energy_basis );
- C[ k ][ d ] = SKP_DIV32( SKP_LSHIFT( temp32, lshift ), SKP_RSHIFT( energy, 15 - lshift ) + 1 ); // Q15
- } else {
- C[ k ][ d ] = 0;
- }
- }
- target_ptr += sf_length_8kHz;
- }
-
- /* search over lag range and lags codebook */
- /* scale factor for lag codebook, as a function of center lag */
-
- CCmax = SKP_int32_MIN;
- CCmax_b = SKP_int32_MIN;
-
- CBimax = 0; /* To avoid returning undefined lag values */
- lag = -1; /* To check if lag with strong enough correlation has been found */
-
- if( prevLag > 0 ) {
- if( Fs_kHz == 12 ) {
- prevLag = SKP_DIV32_16( SKP_LSHIFT( prevLag, 1 ), 3 );
- } else if( Fs_kHz == 16 ) {
- prevLag = SKP_RSHIFT( prevLag, 1 );
- } else if( Fs_kHz == 24 ) {
- prevLag = SKP_DIV32_16( prevLag, 3 );
- }
- prevLag_log2_Q7 = SKP_Silk_lin2log( (SKP_int32)prevLag );
- } else {
- prevLag_log2_Q7 = 0;
- }
- SKP_assert( search_thres2_Q15 == SKP_SAT16( search_thres2_Q15 ) );
- corr_thres_Q15 = SKP_RSHIFT( SKP_SMULBB( search_thres2_Q15, search_thres2_Q15 ), 13 );
-
- /* If input is 8 khz use a larger codebook here because it is last stage */
- if( Fs_kHz == 8 && complexity > SigProc_PITCH_EST_MIN_COMPLEX ) {
- nb_cbks_stage2 = PITCH_EST_NB_CBKS_STAGE2_EXT;
- } else {
- nb_cbks_stage2 = PITCH_EST_NB_CBKS_STAGE2;
- }
-
- for( k = 0; k < length_d_srch; k++ ) {
- d = d_srch[ k ];
- for( j = 0; j < nb_cbks_stage2; j++ ) {
- CC[ j ] = 0;
- for( i = 0; i < PITCH_EST_NB_SUBFR; i++ ) {
- /* Try all codebooks */
- CC[ j ] = CC[ j ] + (SKP_int32)C[ i ][ d + SKP_Silk_CB_lags_stage2[ i ][ j ] ];
- }
- }
- /* Find best codebook */
- CCmax_new = SKP_int32_MIN;
- CBimax_new = 0;
- for( i = 0; i < nb_cbks_stage2; i++ ) {
- if( CC[ i ] > CCmax_new ) {
- CCmax_new = CC[ i ];
- CBimax_new = i;
- }
- }
-
- /* Bias towards shorter lags */
- lag_log2_Q7 = SKP_Silk_lin2log( (SKP_int32)d ); /* Q7 */
- SKP_assert( lag_log2_Q7 == SKP_SAT16( lag_log2_Q7 ) );
- SKP_assert( PITCH_EST_NB_SUBFR * PITCH_EST_SHORTLAG_BIAS_Q15 == SKP_SAT16( PITCH_EST_NB_SUBFR * PITCH_EST_SHORTLAG_BIAS_Q15 ) );
- CCmax_new_b = CCmax_new - SKP_RSHIFT( SKP_SMULBB( PITCH_EST_NB_SUBFR * PITCH_EST_SHORTLAG_BIAS_Q15, lag_log2_Q7 ), 7 ); /* Q15 */
-
- /* Bias towards previous lag */
- SKP_assert( PITCH_EST_NB_SUBFR * PITCH_EST_PREVLAG_BIAS_Q15 == SKP_SAT16( PITCH_EST_NB_SUBFR * PITCH_EST_PREVLAG_BIAS_Q15 ) );
- if( prevLag > 0 ) {
- delta_lag_log2_sqr_Q7 = lag_log2_Q7 - prevLag_log2_Q7;
- SKP_assert( delta_lag_log2_sqr_Q7 == SKP_SAT16( delta_lag_log2_sqr_Q7 ) );
- delta_lag_log2_sqr_Q7 = SKP_RSHIFT( SKP_SMULBB( delta_lag_log2_sqr_Q7, delta_lag_log2_sqr_Q7 ), 7 );
- prev_lag_bias_Q15 = SKP_RSHIFT( SKP_SMULBB( PITCH_EST_NB_SUBFR * PITCH_EST_PREVLAG_BIAS_Q15, ( *LTPCorr_Q15 ) ), 15 ); /* Q15 */
- prev_lag_bias_Q15 = SKP_DIV32( SKP_MUL( prev_lag_bias_Q15, delta_lag_log2_sqr_Q7 ), delta_lag_log2_sqr_Q7 + ( 1 << 6 ) );
- CCmax_new_b -= prev_lag_bias_Q15; /* Q15 */
- }
-
- if( CCmax_new_b > CCmax_b && CCmax_new > corr_thres_Q15 ) {
- CCmax_b = CCmax_new_b;
- CCmax = CCmax_new;
- lag = d;
- CBimax = CBimax_new;
- }
- }
-
- if( lag == -1 ) {
- /* No suitable candidate found */
- SKP_memset( pitch_out, 0, PITCH_EST_NB_SUBFR * sizeof( SKP_int ) );
- *LTPCorr_Q15 = 0;
- *lagIndex = 0;
- *contourIndex = 0;
- return 1;
- }
-
- if( Fs_kHz > 8 ) {
-
- /******************************************************************************
- ** Scale input signal down to avoid correlations measures from overflowing
- *******************************************************************************/
- /* find scaling as max scaling for each subframe */
- shift = SKP_FIX_P_Ana_find_scaling( signal, frame_length, sf_length );
- if( shift > 0 ) {
- /* Move signal to scratch mem because the input signal should be unchanged */
- /* Reuse the 32 bit scratch mem vector, use a 16 bit pointer from now */
- input_signal_ptr = (SKP_int16*)scratch_mem;
- for( i = 0; i < frame_length; i++ ) {
- input_signal_ptr[ i ] = SKP_RSHIFT( signal[ i ], shift );
- }
- } else {
- input_signal_ptr = (SKP_int16*)signal;
- }
- /*********************************************************************************/
-
- /* Search in original signal */
-
- CBimax_old = CBimax;
- /* Compensate for decimation */
- SKP_assert( lag == SKP_SAT16( lag ) );
- if( Fs_kHz == 12 ) {
- lag = SKP_RSHIFT( SKP_SMULBB( lag, 3 ), 1 );
- } else if( Fs_kHz == 16 ) {
- lag = SKP_LSHIFT( lag, 1 );
- } else {
- lag = SKP_SMULBB( lag, 3 );
- }
-
- lag = SKP_LIMIT( lag, min_lag, max_lag );
- start_lag = SKP_max_int( lag - 2, min_lag );
- end_lag = SKP_min_int( lag + 2, max_lag );
- lag_new = lag; /* to avoid undefined lag */
- CBimax = 0; /* to avoid undefined lag */
- SKP_assert( SKP_LSHIFT( CCmax, 13 ) >= 0 );
- *LTPCorr_Q15 = (SKP_int)SKP_Silk_SQRT_APPROX( SKP_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */
-
- CCmax = SKP_int32_MIN;
- /* pitch lags according to second stage */
- for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) {
- pitch_out[ k ] = lag + 2 * SKP_Silk_CB_lags_stage2[ k ][ CBimax_old ];
- }
- /* Calculate the correlations and energies needed in stage 3 */
- SKP_FIX_P_Ana_calc_corr_st3( crosscorr_st3, input_signal_ptr, start_lag, sf_length, complexity );
- SKP_FIX_P_Ana_calc_energy_st3( energies_st3, input_signal_ptr, start_lag, sf_length, complexity );
-
- lag_counter = 0;
- SKP_assert( lag == SKP_SAT16( lag ) );
- contour_bias = SKP_DIV32_16( PITCH_EST_FLATCONTOUR_BIAS_Q20, lag );
-
- /* Setup cbk parameters acording to complexity setting */
- cbk_size = (SKP_int)SKP_Silk_cbk_sizes_stage3[ complexity ];
- cbk_offset = (SKP_int)SKP_Silk_cbk_offsets_stage3[ complexity ];
-
- for( d = start_lag; d <= end_lag; d++ ) {
- for( j = cbk_offset; j < ( cbk_offset + cbk_size ); j++ ) {
- cross_corr = 0;
- energy = 0;
- for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) {
- SKP_assert( PITCH_EST_NB_SUBFR == 4 );
- energy += SKP_RSHIFT( energies_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */
- SKP_assert( energy >= 0 );
- cross_corr += SKP_RSHIFT( crosscorr_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */
- }
- if( cross_corr > 0 ) {
- /* Divide cross_corr / energy and get result in Q15 */
- lz = SKP_Silk_CLZ32( cross_corr );
- /* Divide with result in Q13, cross_corr could be larger than energy */
- lshift = SKP_LIMIT( lz - 1, 0, 13 );
- CCmax_new = SKP_DIV32( SKP_LSHIFT( cross_corr, lshift ), SKP_RSHIFT( energy, 13 - lshift ) + 1 );
- CCmax_new = SKP_SAT16( CCmax_new );
- CCmax_new = SKP_SMULWB( cross_corr, CCmax_new );
- /* Saturate */
- if( CCmax_new > SKP_RSHIFT( SKP_int32_MAX, 3 ) ) {
- CCmax_new = SKP_int32_MAX;
- } else {
- CCmax_new = SKP_LSHIFT( CCmax_new, 3 );
- }
- /* Reduce depending on flatness of contour */
- diff = j - SKP_RSHIFT( PITCH_EST_NB_CBKS_STAGE3_MAX, 1 );
- diff = SKP_MUL( diff, diff );
- diff = SKP_int16_MAX - SKP_RSHIFT( SKP_MUL( contour_bias, diff ), 5 ); /* Q20 -> Q15 */
- SKP_assert( diff == SKP_SAT16( diff ) );
- CCmax_new = SKP_LSHIFT( SKP_SMULWB( CCmax_new, diff ), 1 );
- } else {
- CCmax_new = 0;
- }
-
- if( CCmax_new > CCmax ) {
- CCmax = CCmax_new;
- lag_new = d;
- CBimax = j;
- }
- }
- lag_counter++;
- }
-
- for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) {
- pitch_out[ k ] = lag_new + SKP_Silk_CB_lags_stage3[ k ][ CBimax ];
- }
- *lagIndex = lag_new - min_lag;
- *contourIndex = CBimax;
- } else {
- /* Save Lags and correlation */
- CCmax = SKP_max( CCmax, 0 );
- *LTPCorr_Q15 = (SKP_int)SKP_Silk_SQRT_APPROX( SKP_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */
- for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) {
- pitch_out[ k ] = lag + SKP_Silk_CB_lags_stage2[ k ][ CBimax ];
- }
- *lagIndex = lag - min_lag_8kHz;
- *contourIndex = CBimax;
- }
- SKP_assert( *lagIndex >= 0 );
- /* return as voiced */
- return 0;
-}
-
-/*************************************************************************/
-/* Calculates the correlations used in stage 3 search. In order to cover */
-/* the whole lag codebook for all the searched offset lags (lag +- 2), */
-/*************************************************************************/
-void SKP_FIX_P_Ana_calc_corr_st3(
- SKP_int32 cross_corr_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ],/* (O) 3 DIM correlation array */
- const SKP_int16 signal[], /* I vector to correlate */
- SKP_int start_lag, /* I lag offset to search around */
- SKP_int sf_length, /* I length of a 5 ms subframe */
- SKP_int complexity /* I Complexity setting */
-)
-{
- const SKP_int16 *target_ptr, *basis_ptr;
- SKP_int32 cross_corr;
- SKP_int i, j, k, lag_counter;
- SKP_int cbk_offset, cbk_size, delta, idx;
- SKP_int32 scratch_mem[ SCRATCH_SIZE ];
-
- SKP_assert( complexity >= SigProc_PITCH_EST_MIN_COMPLEX );
- SKP_assert( complexity <= SigProc_PITCH_EST_MAX_COMPLEX );
-
- cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ];
- cbk_size = SKP_Silk_cbk_sizes_stage3[ complexity ];
-
- target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */
- for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) {
- lag_counter = 0;
-
- /* Calculate the correlations for each subframe */
- for( j = SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ]; j <= SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 1 ]; j++ ) {
- basis_ptr = target_ptr - ( start_lag + j );
- cross_corr = SKP_Silk_inner_prod_aligned( (SKP_int16*)target_ptr, (SKP_int16*)basis_ptr, sf_length );
- SKP_assert( lag_counter < SCRATCH_SIZE );
- scratch_mem[ lag_counter ] = cross_corr;
- lag_counter++;
- }
-
- delta = SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ];
- for( i = cbk_offset; i < ( cbk_offset + cbk_size ); i++ ) {
- /* Fill out the 3 dim array that stores the correlations for */
- /* each code_book vector for each start lag */
- idx = SKP_Silk_CB_lags_stage3[ k ][ i ] - delta;
- for( j = 0; j < PITCH_EST_NB_STAGE3_LAGS; j++ ) {
- SKP_assert( idx + j < SCRATCH_SIZE );
- SKP_assert( idx + j < lag_counter );
- cross_corr_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ];
- }
- }
- target_ptr += sf_length;
- }
-}
-
-/********************************************************************/
-/* Calculate the energies for first two subframes. The energies are */
-/* calculated recursively. */
-/********************************************************************/
-void SKP_FIX_P_Ana_calc_energy_st3(
- SKP_int32 energies_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ],/* (O) 3 DIM energy array */
- const SKP_int16 signal[], /* I vector to calc energy in */
- SKP_int start_lag, /* I lag offset to search around */
- SKP_int sf_length, /* I length of one 5 ms subframe */
- SKP_int complexity /* I Complexity setting */
-)
-{
- const SKP_int16 *target_ptr, *basis_ptr;
- SKP_int32 energy;
- SKP_int k, i, j, lag_counter;
- SKP_int cbk_offset, cbk_size, delta, idx;
- SKP_int32 scratch_mem[ SCRATCH_SIZE ];
-
- SKP_assert( complexity >= SigProc_PITCH_EST_MIN_COMPLEX );
- SKP_assert( complexity <= SigProc_PITCH_EST_MAX_COMPLEX );
-
- cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ];
- cbk_size = SKP_Silk_cbk_sizes_stage3[ complexity ];
-
- target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ];
- for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) {
- lag_counter = 0;
-
- /* Calculate the energy for first lag */
- basis_ptr = target_ptr - ( start_lag + SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ] );
- energy = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length );
- SKP_assert( energy >= 0 );
- scratch_mem[ lag_counter ] = energy;
- lag_counter++;
-
- for( i = 1; i < ( SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 1 ] - SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ] + 1 ); i++ ) {
- /* remove part outside new window */
- energy -= SKP_SMULBB( basis_ptr[ sf_length - i ], basis_ptr[ sf_length - i ] );
- SKP_assert( energy >= 0 );
-
- /* add part that comes into window */
- energy = SKP_ADD_SAT32( energy, SKP_SMULBB( basis_ptr[ -i ], basis_ptr[ -i ] ) );
- SKP_assert( energy >= 0 );
- SKP_assert( lag_counter < SCRATCH_SIZE );
- scratch_mem[ lag_counter ] = energy;
- lag_counter++;
- }
-
- delta = SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ];
- for( i = cbk_offset; i < ( cbk_offset + cbk_size ); i++ ) {
- /* Fill out the 3 dim array that stores the correlations for */
- /* each code_book vector for each start lag */
- idx = SKP_Silk_CB_lags_stage3[ k ][ i ] - delta;
- for( j = 0; j < PITCH_EST_NB_STAGE3_LAGS; j++ ) {
- SKP_assert( idx + j < SCRATCH_SIZE );
- SKP_assert( idx + j < lag_counter );
- energies_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ];
- SKP_assert( energies_st3[ k ][ i ][ j ] >= 0.0f );
- }
- }
- target_ptr += sf_length;
- }
-}
-
-SKP_int32 SKP_FIX_P_Ana_find_scaling(
- const SKP_int16 *signal,
- const SKP_int signal_length,
- const SKP_int sum_sqr_len
-)
-{
- SKP_int32 nbits, x_max;
-
- x_max = SKP_Silk_int16_array_maxabs( signal, signal_length );
-
- if( x_max < SKP_int16_MAX ) {
- /* Number of bits needed for the sum of the squares */
- nbits = 32 - SKP_Silk_CLZ32( SKP_SMULBB( x_max, x_max ) );
- } else {
- /* Here we don't know if x_max should have been SKP_int16_MAX + 1, so we expect the worst case */
- nbits = 30;
- }
- nbits += 17 - SKP_Silk_CLZ16( sum_sqr_len );
-
- /* Without a guarantee of saturation, we need to keep the 31st bit free */
- if( nbits < 31 ) {
- return 0;
- } else {
- return( nbits - 30 );
- }
-}
--- a/src/SKP_Silk_pitch_est_defines.h
+++ /dev/null
@@ -1,43 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SIGPROCFIX_PITCH_EST_DEFINES_H
-#define SIGPROCFIX_PITCH_EST_DEFINES_H
-
-#include "SKP_Silk_SigProc_FIX.h"
-#include "SKP_Silk_common_pitch_est_defines.h"
-
-/************************************************************/
-/* Definitions For Fix pitch estimator */
-/************************************************************/
-
-#define PITCH_EST_SHORTLAG_BIAS_Q15 6554 /* 0.2f. for logarithmic weighting */
-#define PITCH_EST_PREVLAG_BIAS_Q15 6554 /* Prev lag bias */
-#define PITCH_EST_FLATCONTOUR_BIAS_Q20 52429 /* 0.05f */
-
-#endif
-
--- a/src/SKP_Silk_pitch_est_tables.c
+++ /dev/null
@@ -1,89 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_typedef.h"
-#include "SKP_Silk_pitch_est_defines.h"
-
-/********************************************************/
-/* Auto Generated File from generate_pitch_est_tables.m */
-/********************************************************/
-
-const SKP_int16 SKP_Silk_CB_lags_stage2[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE2_EXT] =
-{
- {0, 2,-1,-1,-1, 0, 0, 1, 1, 0, 1},
- {0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0},
- {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0},
- {0,-1, 2, 1, 0, 1, 1, 0, 0,-1,-1}
-};
-
-const SKP_int16 SKP_Silk_CB_lags_stage3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX] =
-{
- {-9,-7,-6,-5,-5,-4,-4,-3,-3,-2,-2,-2,-1,-1,-1, 0, 0, 0, 1, 1, 0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 5, 6, 8},
- {-3,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 2, 1, 2, 2, 2, 2, 3},
- { 3, 3, 2, 2, 2, 2, 1, 2, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,-1, 0, 0,-1,-1,-1,-1,-1,-2,-2,-2},
- { 9, 8, 6, 5, 6, 5, 4, 4, 3, 3, 2, 2, 2, 1, 0, 1, 1, 0, 0, 0,-1,-1,-1,-2,-2,-2,-3,-3,-4,-4,-5,-5,-6,-7}
- };
-
-const SKP_int16 SKP_Silk_Lag_range_stage3[ SigProc_PITCH_EST_MAX_COMPLEX + 1 ] [ PITCH_EST_NB_SUBFR ][ 2 ] =
-{
- /* Lags to search for low number of stage3 cbks */
- {
- {-2,6},
- {-1,5},
- {-1,5},
- {-2,7}
- },
- /* Lags to search for middle number of stage3 cbks */
- {
- {-4,8},
- {-1,6},
- {-1,6},
- {-4,9}
- },
- /* Lags to search for max number of stage3 cbks */
- {
- {-9,12},
- {-3,7},
- {-2,7},
- {-7,13}
- }
-};
-
-const SKP_int16 SKP_Silk_cbk_sizes_stage3[SigProc_PITCH_EST_MAX_COMPLEX + 1] =
-{
- PITCH_EST_NB_CBKS_STAGE3_MIN,
- PITCH_EST_NB_CBKS_STAGE3_MID,
- PITCH_EST_NB_CBKS_STAGE3_MAX
-};
-
-const SKP_int16 SKP_Silk_cbk_offsets_stage3[SigProc_PITCH_EST_MAX_COMPLEX + 1] =
-{
- ((PITCH_EST_NB_CBKS_STAGE3_MAX - PITCH_EST_NB_CBKS_STAGE3_MIN) >> 1),
- ((PITCH_EST_NB_CBKS_STAGE3_MAX - PITCH_EST_NB_CBKS_STAGE3_MID) >> 1),
- 0
-};
-
--- a/src/SKP_Silk_prefilter_FIX.c
+++ /dev/null
@@ -1,166 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-#include "SKP_Silk_perceptual_parameters_FIX.h"
-
-/* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal */
-SKP_INLINE void SKP_Silk_prefilt_FIX(
- SKP_Silk_prefilter_state_FIX *P, /* I/O state */
- SKP_int32 st_res_Q12[], /* I short term residual signal */
- SKP_int16 xw[], /* O prefiltered signal */
- SKP_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */
- SKP_int Tilt_Q14, /* I Tilt shaping coeficient */
- SKP_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients*/
- SKP_int lag, /* I Lag for harmonic shaping */
- SKP_int length /* I Length of signals */
-);
-
-void SKP_Silk_prefilter_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
- const SKP_Silk_encoder_control_FIX *psEncCtrl, /* I Encoder control FIX */
- SKP_int16 xw[], /* O Weighted signal */
- const SKP_int16 x[] /* I Speech signal */
-)
-{
- SKP_Silk_prefilter_state_FIX *P = &psEnc->sPrefilt;
- SKP_int j, k, lag;
- SKP_int32 tmp_32, B_Q12;
- const SKP_int16 *AR1_shp_Q13;
- const SKP_int16 *px;
- SKP_int16 *pxw, *pst_res;
- SKP_int HarmShapeGain_Q12, Tilt_Q14, LF_shp_Q14;
- SKP_int32 HarmShapeFIRPacked_Q12;
- SKP_int32 x_filt_Q12[ MAX_FRAME_LENGTH / NB_SUBFR ], filterState[ MAX_LPC_ORDER ];
- SKP_int16 st_res[ ( MAX_FRAME_LENGTH / NB_SUBFR ) + MAX_LPC_ORDER ];
-
- /* Setup pointers */
- px = x;
- pxw = xw;
- lag = P->lagPrev;
- for( k = 0; k < NB_SUBFR; k++ ) {
- /* Update Variables that change per sub frame */
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- lag = psEncCtrl->sCmn.pitchL[ k ];
- }
-
- /* Noise shape parameters */
- HarmShapeGain_Q12 = SKP_SMULWB( psEncCtrl->HarmShapeGain_Q14[ k ], 16384 - psEncCtrl->HarmBoost_Q14[ k ] );
- SKP_assert( HarmShapeGain_Q12 >= 0 );
- HarmShapeFIRPacked_Q12 = SKP_RSHIFT( HarmShapeGain_Q12, 2 );
- HarmShapeFIRPacked_Q12 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q12, 1 ), 16 );
- Tilt_Q14 = psEncCtrl->Tilt_Q14[ k ];
- LF_shp_Q14 = psEncCtrl->LF_shp_Q14[ k ];
- AR1_shp_Q13 = &psEncCtrl->AR1_Q13[ k * SHAPE_LPC_ORDER_MAX ];
-
- /* Short term FIR filtering*/
- SKP_memset( filterState, 0, psEnc->sCmn.shapingLPCOrder * sizeof( SKP_int32 ) );
- SKP_Silk_MA_Prediction_Q13( px - psEnc->sCmn.shapingLPCOrder, AR1_shp_Q13, filterState,
- st_res, psEnc->sCmn.subfr_length + psEnc->sCmn.shapingLPCOrder, psEnc->sCmn.shapingLPCOrder );
-
- pst_res = st_res + psEnc->sCmn.shapingLPCOrder; /* Point to first sample */
-
- /* reduce (mainly) low frequencies during harmonic emphasis */
- B_Q12 = SKP_RSHIFT_ROUND( psEncCtrl->GainsPre_Q14[ k ], 2 );
- tmp_32 = SKP_SMLABB( INPUT_TILT_Q26, psEncCtrl->HarmBoost_Q14[ k ], HarmShapeGain_Q12 ); /* Q26 */
- tmp_32 = SKP_SMLABB( tmp_32, psEncCtrl->coding_quality_Q14, HIGH_RATE_INPUT_TILT_Q12 ); /* Q26 */
- tmp_32 = SKP_SMULWB( tmp_32, -psEncCtrl->GainsPre_Q14[ k ] ); /* Q24 */
- tmp_32 = SKP_RSHIFT_ROUND( tmp_32, 12 ); /* Q12 */
- B_Q12 |= SKP_LSHIFT( SKP_SAT16( tmp_32 ), 16 );
-
- /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the */
- /* SMLABB and SMLABT instructions. On a big-endian CPU the two int16 variables would be */
- /* loaded in reverse order and the code will give the wrong result. In that case swapping */
- /* the SMLABB and SMLABT instructions should solve the problem. */
- x_filt_Q12[ 0 ] = SKP_SMLABT( SKP_SMULBB( pst_res[ 0 ], B_Q12 ), P->sHarmHP, B_Q12 );
- for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) {
- x_filt_Q12[ j ] = SKP_SMLABT( SKP_SMULBB( pst_res[ j ], B_Q12 ), pst_res[ j - 1 ], B_Q12 );
- }
- P->sHarmHP = pst_res[ psEnc->sCmn.subfr_length - 1 ];
-
- SKP_Silk_prefilt_FIX( P, x_filt_Q12, pxw, HarmShapeFIRPacked_Q12, Tilt_Q14,
- LF_shp_Q14, lag, psEnc->sCmn.subfr_length );
-
- px += psEnc->sCmn.subfr_length;
- pxw += psEnc->sCmn.subfr_length;
- }
-
- P->lagPrev = psEncCtrl->sCmn.pitchL[ NB_SUBFR - 1 ];
-}
-
-/* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal */
-SKP_INLINE void SKP_Silk_prefilt_FIX(
- SKP_Silk_prefilter_state_FIX *P, /* I/O state */
- SKP_int32 st_res_Q12[], /* I short term residual signal */
- SKP_int16 xw[], /* O prefiltered signal */
- SKP_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */
- SKP_int Tilt_Q14, /* I Tilt shaping coeficient */
- SKP_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients*/
- SKP_int lag, /* I Lag for harmonic shaping */
- SKP_int length /* I Length of signals */
-)
-{
- SKP_int i, idx, LTP_shp_buf_idx;
- SKP_int32 n_LTP_Q12, n_Tilt_Q10, n_LF_Q10;
- SKP_int32 sLF_MA_shp_Q12, sLF_AR_shp_Q12;
- SKP_int16 *LTP_shp_buf;
-
- /* To speed up use temp variables instead of using the struct */
- LTP_shp_buf = P->sLTP_shp1;
- LTP_shp_buf_idx = P->sLTP_shp_buf_idx1;
- sLF_AR_shp_Q12 = P->sLF_AR_shp1_Q12;
- sLF_MA_shp_Q12 = P->sLF_MA_shp1_Q12;
-
- for( i = 0; i < length; i++ ) {
- if( lag > 0 ) {
- /* unrolled loop */
- SKP_assert( HARM_SHAPE_FIR_TAPS == 3 );
- idx = lag + LTP_shp_buf_idx;
- n_LTP_Q12 = SKP_SMULBB( LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 );
- n_LTP_Q12 = SKP_SMLABT( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ], HarmShapeFIRPacked_Q12 );
- n_LTP_Q12 = SKP_SMLABB( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 );
- } else {
- n_LTP_Q12 = 0;
- }
-
- n_LF_Q10 = SKP_SMLAWB( SKP_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 );
- n_Tilt_Q10 = SKP_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 );
-
- sLF_AR_shp_Q12 = SKP_SUB32( st_res_Q12[ i ], SKP_LSHIFT( n_Tilt_Q10, 2 ) );
- sLF_MA_shp_Q12 = SKP_SUB32( sLF_AR_shp_Q12, SKP_LSHIFT( n_LF_Q10, 2 ) );
-
- LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK;
- LTP_shp_buf[ LTP_shp_buf_idx ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) );
-
- xw[i] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 12 ) );
- }
-
- /* Copy temp variable back to state */
- P->sLF_AR_shp1_Q12 = sLF_AR_shp_Q12;
- P->sLF_MA_shp1_Q12 = sLF_MA_shp_Q12;
- P->sLTP_shp_buf_idx1 = LTP_shp_buf_idx;
-}
--- a/src/SKP_Silk_process_NLSFs_FIX.c
+++ /dev/null
@@ -1,127 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Limit, stabilize, convert and quantize NLSFs. */
-void SKP_Silk_process_NLSFs_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
- SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */
- SKP_int *pNLSF_Q15 /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */
-)
-{
- SKP_int doInterpolate;
- SKP_int pNLSFW_Q6[ MAX_LPC_ORDER ];
- SKP_int NLSF_mu_Q15, NLSF_mu_fluc_red_Q16;
- SKP_int32 i_sqr_Q15;
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB;
-
- /* Used only for NLSF interpolation */
- SKP_int pNLSF0_temp_Q15[ MAX_LPC_ORDER ];
- SKP_int pNLSFW0_temp_Q6[ MAX_LPC_ORDER ];
- SKP_int i;
-
- SKP_assert( psEnc->speech_activity_Q8 >= 0 );
- SKP_assert( psEnc->speech_activity_Q8 <= 256 );
- SKP_assert( psEncCtrl->sparseness_Q8 >= 0 );
- SKP_assert( psEncCtrl->sparseness_Q8 <= 256 );
- SKP_assert( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED || psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED );
-
- /***********************/
- /* Calculate mu values */
- /***********************/
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- /* NLSF_mu = 0.002f - 0.001f * psEnc->speech_activity; */
- /* NLSF_mu_fluc_red = 0.1f - 0.05f * psEnc->speech_activity; */
- NLSF_mu_Q15 = SKP_SMLAWB( 66, -8388, psEnc->speech_activity_Q8 );
- NLSF_mu_fluc_red_Q16 = SKP_SMLAWB( 6554, -838848, psEnc->speech_activity_Q8 );
- } else {
- /* NLSF_mu = 0.005f - 0.004f * psEnc->speech_activity; */
- /* NLSF_mu_fluc_red = 0.2f - 0.1f * psEnc->speech_activity - 0.1f * psEncCtrl->sparseness; */
- NLSF_mu_Q15 = SKP_SMLAWB( 164, -33554, psEnc->speech_activity_Q8 );
- NLSF_mu_fluc_red_Q16 = SKP_SMLAWB( 13107, -1677696, psEnc->speech_activity_Q8 + psEncCtrl->sparseness_Q8 );
- }
- SKP_assert( NLSF_mu_Q15 >= 0 );
- SKP_assert( NLSF_mu_Q15 <= 164 );
- SKP_assert( NLSF_mu_fluc_red_Q16 >= 0 );
- SKP_assert( NLSF_mu_fluc_red_Q16 <= 13107 );
-
- NLSF_mu_Q15 = SKP_max( NLSF_mu_Q15, 1 );
-
- /* Calculate NLSF weights */
- TIC(NLSF_weights_FIX)
- SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW_Q6, pNLSF_Q15, psEnc->sCmn.predictLPCOrder );
- TOC(NLSF_weights_FIX)
-
- /* Update NLSF weights for interpolated NLSFs */
- doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEncCtrl->sCmn.NLSFInterpCoef_Q2 < ( 1 << 2 ) );
- if( doInterpolate ) {
-
- /* Calculate the interpolated NLSF vector for the first half */
- SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15,
- psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );
-
- /* Calculate first half NLSF weights for the interpolated NLSFs */
- TIC(NLSF_weights_FIX)
- SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW0_temp_Q6, pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder );
- TOC(NLSF_weights_FIX)
-
- /* Update NLSF weights with contribution from first half */
- i_sqr_Q15 = SKP_LSHIFT( SKP_SMULBB( psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->sCmn.NLSFInterpCoef_Q2 ), 11 );
- for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {
- pNLSFW_Q6[ i ] = SKP_SMLAWB( SKP_RSHIFT( pNLSFW_Q6[ i ], 1 ), pNLSFW0_temp_Q6[ i ], i_sqr_Q15 );
- SKP_assert( pNLSFW_Q6[ i ] <= SKP_int16_MAX );
- SKP_assert( pNLSFW_Q6[ i ] >= 1 );
- }
- }
-
- /* Set pointer to the NLSF codebook for the current signal type and LPC order */
- psNLSF_CB = psEnc->sCmn.psNLSF_CB[ psEncCtrl->sCmn.sigtype ];
-
- /* Quantize NLSF parameters given the trained NLSF codebooks */
- TIC(MSVQ_encode_FIX)
- SKP_Silk_NLSF_MSVQ_encode_FIX( psEncCtrl->sCmn.NLSFIndices, pNLSF_Q15, psNLSF_CB,
- psEnc->sPred.prev_NLSFq_Q15, pNLSFW_Q6, NLSF_mu_Q15, NLSF_mu_fluc_red_Q16,
- psEnc->sCmn.NLSF_MSVQ_Survivors, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.first_frame_after_reset );
- TOC(MSVQ_encode_FIX)
-
- /* Convert quantized NLSFs back to LPC coefficients */
- SKP_Silk_NLSF2A_stable( psEncCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psEnc->sCmn.predictLPCOrder );
-
- if( doInterpolate ) {
- /* Calculate the interpolated, quantized LSF vector for the first half */
- SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15,
- psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );
-
- /* Convert back to LPC coefficients */
- SKP_Silk_NLSF2A_stable( psEncCtrl->PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder );
-
- } else {
- /* Copy LPC coefficients for first half from second half */
- SKP_memcpy( psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->PredCoef_Q12[ 1 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_int16 ) );
- }
-}
--- a/src/SKP_Silk_process_gains_FIX.c
+++ /dev/null
@@ -1,114 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Processing of gains */
-void SKP_Silk_process_gains_FIX(
- SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state_FIX */
- SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control_FIX */
-)
-{
- SKP_Silk_shape_state_FIX *psShapeSt = &psEnc->sShape;
- SKP_int k;
- SKP_int32 s_Q16, InvMaxSqrVal_Q16, gain, gain_squared, ResNrg, ResNrgPart;
-
- /* Gain reduction when LTP coding gain is high */
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- /*s = -0.5f * SKP_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); */
- s_Q16 = -SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( psEncCtrl->LTPredCodGain_Q7 - (12 << 7), 4 ) );
- for( k = 0; k < NB_SUBFR; k++ ) {
- psEncCtrl->Gains_Q16[ k ] = SKP_SMLAWB( psEncCtrl->Gains_Q16[ k ], psEncCtrl->Gains_Q16[ k ], s_Q16 );
- }
- }
-
- /* Limit the quantized signal */
- /* 69 = 21.0f + 16/0.33 */
- InvMaxSqrVal_Q16 = SKP_DIV32_16( SKP_Silk_log2lin(
- SKP_SMULWB( (69 << 7) - psEncCtrl->current_SNR_dB_Q7, SKP_FIX_CONST( 0.33, 16 )) ), psEnc->sCmn.subfr_length );
-
- for( k = 0; k < NB_SUBFR; k++ ) {
- /* Soft limit on ratio residual energy and squared gains */
- ResNrg = psEncCtrl->ResNrg[ k ];
- ResNrgPart = SKP_SMULWW( ResNrg, InvMaxSqrVal_Q16 );
- if( psEncCtrl->ResNrgQ[ k ] > 0 ) {
- if( psEncCtrl->ResNrgQ[ k ] < 32 ) {
- ResNrgPart = SKP_RSHIFT_ROUND( ResNrgPart, psEncCtrl->ResNrgQ[ k ] );
- } else {
- ResNrgPart = 0;
- }
- } else if( psEncCtrl->ResNrgQ[k] != 0 ) {
- if( ResNrgPart > SKP_RSHIFT( SKP_int32_MAX, -psEncCtrl->ResNrgQ[ k ] ) ) {
- ResNrgPart = SKP_int32_MAX;
- } else {
- ResNrgPart = SKP_LSHIFT( ResNrgPart, -psEncCtrl->ResNrgQ[ k ] );
- }
- }
- gain = psEncCtrl->Gains_Q16[ k ];
- gain_squared = SKP_ADD_SAT32( ResNrgPart, SKP_SMMUL( gain, gain ) );
- if( gain_squared < SKP_int16_MAX ) {
- /* recalculate with higher precision */
- gain_squared = SKP_SMLAWW( SKP_LSHIFT( ResNrgPart, 16 ), gain, gain );
- SKP_assert( gain_squared > 0 );
- gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q8 */
- psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 8 ); /* Q16 */
- } else {
- gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q0 */
- psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 16 ); /* Q16 */
- }
- }
-
- /* Noise shaping quantization */
- SKP_Silk_gains_quant( psEncCtrl->sCmn.GainsIndices, psEncCtrl->Gains_Q16,
- &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesInPayloadBuf );
- /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- if( psEncCtrl->LTPredCodGain_Q7 + SKP_RSHIFT( psEncCtrl->input_tilt_Q15, 8 ) > ( 1 << 7 ) ) {
- psEncCtrl->sCmn.QuantOffsetType = 0;
- } else {
- psEncCtrl->sCmn.QuantOffsetType = 1;
- }
- }
-
- /* Quantizer boundary adjustment */
- if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
- psEncCtrl->Lambda_Q10 = SKP_FIX_CONST( 1.3, 10 )
- - SKP_SMULWB( SKP_FIX_CONST( 0.5, 18 ), psEnc->speech_activity_Q8 )
- - SKP_SMULWB( SKP_FIX_CONST( 0.3, 12 ), psEncCtrl->input_quality_Q14 )
- + SKP_SMULBB( SKP_FIX_CONST( 0.2, 10 ), psEncCtrl->sCmn.QuantOffsetType )
- - SKP_SMULWB( SKP_FIX_CONST( 0.1, 12 ), psEncCtrl->coding_quality_Q14 );
- } else {
- psEncCtrl->Lambda_Q10 = SKP_FIX_CONST( 1.3, 10 )
- - SKP_SMULWB( SKP_FIX_CONST( 0.5, 18 ), psEnc->speech_activity_Q8 )
- - SKP_SMULWB( SKP_FIX_CONST( 0.4, 12 ), psEncCtrl->input_quality_Q14 )
- + SKP_SMULBB( SKP_FIX_CONST( 0.4, 10 ), psEncCtrl->sCmn.QuantOffsetType )
- - SKP_SMULWB( SKP_FIX_CONST( 0.1, 12 ), psEncCtrl->coding_quality_Q14 );
- }
- SKP_assert( psEncCtrl->Lambda_Q10 >= 0 );
- SKP_assert( psEncCtrl->Lambda_Q10 < SKP_FIX_CONST( 2, 10 ) );
-
-}
--- a/src/SKP_Silk_pulses_to_bytes.c
+++ /dev/null
@@ -1,77 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/*
- * File Name: SKP_Silk_pulses_to_bytes.c
- */
-
-#include <stdlib.h>
-#include "SKP_Silk_main.h"
-
-/* nBytes = sum_over_shell_blocks( POLY_FIT_0 + POLY_FIT_1 * sum_abs_val + POLY_FIT_2 * sum_abs_val^2 ) */
-#define POLY_FIT_0_Q15 12520
-#define POLY_FIT_1_Q15 15862
-#define POLY_FIT_2_Q20 -9222 // ToDo better training with
-
-/* Predict number of bytes used to encode q */
-SKP_int SKP_Silk_pulses_to_bytes( /* O Return value, predicted number of bytes used to encode q */
- SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
- SKP_int q[] /* I Pulse signal */
-)
-{
- SKP_int i, j, iter, *q_ptr;
- SKP_int32 sum_abs_val, nBytes, acc_nBytes;
- /* Take the absolute value of the pulses */
- iter = psEncC->frame_length / SHELL_CODEC_FRAME_LENGTH;
-
- /* Calculate rate as a nonlinaer mapping of sum abs value of each Shell block */
- q_ptr = q;
- acc_nBytes = 0;
- for( j = 0; j < iter; j++ ) {
- sum_abs_val = 0;
- for(i = 0; i < SHELL_CODEC_FRAME_LENGTH; i+=4){
- sum_abs_val += SKP_abs( q_ptr[ i + 0 ] );
- sum_abs_val += SKP_abs( q_ptr[ i + 1 ] );
- sum_abs_val += SKP_abs( q_ptr[ i + 2 ] );
- sum_abs_val += SKP_abs( q_ptr[ i + 3 ] );
- }
- /* Calculate nBytes used for thi sshell frame */
- nBytes = SKP_SMULWB( SKP_SMULBB( sum_abs_val, sum_abs_val ), POLY_FIT_2_Q20 ); // Q4
- nBytes = SKP_LSHIFT_SAT32( nBytes, 11 ); // Q15
- nBytes += SKP_SMULBB( sum_abs_val, POLY_FIT_1_Q15 ); // Q15
- nBytes += POLY_FIT_0_Q15; // Q15
-
- acc_nBytes += nBytes;
-
- q_ptr += SHELL_CODEC_FRAME_LENGTH; /* update pointer */
- }
-
- acc_nBytes = SKP_RSHIFT_ROUND( acc_nBytes, 15 ); // Q0
- acc_nBytes = SKP_SAT16( acc_nBytes ); // just to be sure // Q0
-
- return(( SKP_int )acc_nBytes);
-}
--- a/src/SKP_Silk_quant_LTP_gains_FIX.c
+++ /dev/null
@@ -1,106 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-void SKP_Silk_quant_LTP_gains_FIX(
- SKP_int16 B_Q14[], /* I/O (un)quantized LTP gains */
- SKP_int cbk_index[], /* O Codebook Index */
- SKP_int *periodicity_index, /* O Periodicity Index */
- const SKP_int32 W_Q18[], /* I Error Weights in Q18 */
- SKP_int mu_Q8, /* I Mu value (R/D tradeoff) */
- SKP_int lowComplexity /* I Flag for low complexity */
-)
-{
- SKP_int j, k, temp_idx[ NB_SUBFR ], cbk_size;
- const SKP_uint16 *cdf_ptr;
- const SKP_int16 *cl_ptr;
- const SKP_int16 *cbk_ptr_Q14;
- const SKP_int16 *b_Q14_ptr;
- const SKP_int32 *W_Q18_ptr;
- SKP_int32 rate_dist_subfr, rate_dist, min_rate_dist;
-
-
-
- /***************************************************/
- /* iterate over different codebooks with different */
- /* rates/distortions, and choose best */
- /***************************************************/
- min_rate_dist = SKP_int32_MAX;
- for( k = 0; k < 3; k++ ) {
- cdf_ptr = SKP_Silk_LTP_gain_CDF_ptrs[ k ];
- cl_ptr = SKP_Silk_LTP_gain_BITS_Q6_ptrs[ k ];
- cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ k ];
- cbk_size = SKP_Silk_LTP_vq_sizes[ k ];
-
- /* Setup pointer to first subframe */
- W_Q18_ptr = W_Q18;
- b_Q14_ptr = B_Q14;
-
- rate_dist = 0;
- for( j = 0; j < NB_SUBFR; j++ ) {
-
- SKP_Silk_VQ_WMat_EC_FIX(
- &temp_idx[ j ], /* O index of best codebook vector */
- &rate_dist_subfr, /* O best weighted quantization error + mu * rate */
- b_Q14_ptr, /* I input vector to be quantized */
- W_Q18_ptr, /* I weighting matrix */
- cbk_ptr_Q14, /* I codebook */
- cl_ptr, /* I code length for each codebook vector */
- mu_Q8, /* I tradeoff between weighted error and rate */
- cbk_size /* I number of vectors in codebook */
- );
-
- rate_dist = SKP_ADD_POS_SAT32( rate_dist, rate_dist_subfr );
-
- b_Q14_ptr += LTP_ORDER;
- W_Q18_ptr += LTP_ORDER * LTP_ORDER;
- }
-
- /* Avoid never finding a codebook */
- rate_dist = SKP_min( SKP_int32_MAX - 1, rate_dist );
-
- if( rate_dist < min_rate_dist ) {
- min_rate_dist = rate_dist;
- SKP_memcpy( cbk_index, temp_idx, NB_SUBFR * sizeof( SKP_int ) );
- *periodicity_index = k;
- }
-
- /* Break early in low-complexity mode if rate distortion is below threshold */
- if( lowComplexity && ( rate_dist < SKP_Silk_LTP_gain_middle_avg_RD_Q14 ) ) {
- break;
- }
- }
-
- cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ *periodicity_index ];
- for( j = 0; j < NB_SUBFR; j++ ) {
- for( k = 0; k < LTP_ORDER; k++ ) {
- B_Q14[ j * LTP_ORDER + k ] = cbk_ptr_Q14[ SKP_MLA( k, cbk_index[ j ], LTP_ORDER ) ];
- }
- }
-}
-
--- a/src/SKP_Silk_range_coder.c
+++ /dev/null
@@ -1,372 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* Range encoder for one symbol */
-void SKP_Silk_range_encoder(
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_int data, /* I uncompressed data */
- const SKP_uint16 prob[] /* I cumulative density functions */
-)
-{
- SKP_uint32 low_Q16, high_Q16;
- SKP_uint32 base_tmp, range_Q32;
-
- /* Copy structure data */
- SKP_uint32 base_Q32 = psRC->base_Q32;
- SKP_uint32 range_Q16 = psRC->range_Q16;
- SKP_int32 bufferIx = psRC->bufferIx;
- SKP_uint8 *buffer = psRC->buffer;
-
- if( psRC->error ) {
- return;
- }
-
- /* Update interval */
- low_Q16 = prob[ data ];
- high_Q16 = prob[ data + 1 ];
- base_tmp = base_Q32; /* save current base, to test for carry */
- base_Q32 += SKP_MUL_uint( range_Q16, low_Q16 );
- range_Q32 = SKP_MUL_uint( range_Q16, high_Q16 - low_Q16 );
-
- /* Check for carry */
- if( base_Q32 < base_tmp ) {
- /* Propagate carry in buffer */
- SKP_int bufferIx_tmp = bufferIx;
- while( ( ++buffer[ --bufferIx_tmp ] ) == 0 );
- }
-
- /* Check normalization */
- if( range_Q32 & 0xFF000000 ) {
- /* No normalization */
- range_Q16 = SKP_RSHIFT_uint( range_Q32, 16 );
- } else {
- if( range_Q32 & 0xFFFF0000 ) {
- /* Normalization of 8 bits shift */
- range_Q16 = SKP_RSHIFT_uint( range_Q32, 8 );
- } else {
- /* Normalization of 16 bits shift */
- range_Q16 = range_Q32;
- /* Make sure not to write beyond buffer */
- if( bufferIx >= psRC->bufferLength ) {
- psRC->error = RANGE_CODER_WRITE_BEYOND_BUFFER;
- return;
- }
- /* Write one byte to buffer */
- buffer[ bufferIx++ ] = (SKP_uint8)( SKP_RSHIFT_uint( base_Q32, 24 ) );
- base_Q32 = SKP_LSHIFT_ovflw( base_Q32, 8 );
- }
- /* Make sure not to write beyond buffer */
- if( bufferIx >= psRC->bufferLength ) {
- psRC->error = RANGE_CODER_WRITE_BEYOND_BUFFER;
- return;
- }
- /* Write one byte to buffer */
- buffer[ bufferIx++ ] = (SKP_uint8)( SKP_RSHIFT_uint( base_Q32, 24 ) );
- base_Q32 = SKP_LSHIFT_ovflw( base_Q32, 8 );
- }
-
- /* Copy structure data back */
- psRC->base_Q32 = base_Q32;
- psRC->range_Q16 = range_Q16;
- psRC->bufferIx = bufferIx;
-}
-
-/* Range encoder for multiple symbols */
-void SKP_Silk_range_encoder_multi(
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_int data[], /* I uncompressed data [nSymbols] */
- const SKP_uint16 * const prob[], /* I cumulative density functions */
- const SKP_int nSymbols /* I number of data symbols */
-)
-{
- SKP_int k;
- for( k = 0; k < nSymbols; k++ ) {
- SKP_Silk_range_encoder( psRC, data[ k ], prob[ k ] );
- }
-}
-
-/* Range decoder for one symbol */
-void SKP_Silk_range_decoder(
- SKP_int data[], /* O uncompressed data */
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_uint16 prob[], /* I cumulative density function */
- SKP_int probIx /* I initial (middle) entry of cdf */
-)
-{
- SKP_uint32 low_Q16, high_Q16;
- SKP_uint32 base_tmp, range_Q32;
-
- /* Copy structure data */
- SKP_uint32 base_Q32 = psRC->base_Q32;
- SKP_uint32 range_Q16 = psRC->range_Q16;
- SKP_int32 bufferIx = psRC->bufferIx;
- SKP_uint8 *buffer = &psRC->buffer[ 4 ];
-
- if( psRC->error ) {
- /* Set output to zero */
- *data = 0;
- return;
- }
-
- high_Q16 = prob[ probIx ];
- base_tmp = SKP_MUL_uint( range_Q16, high_Q16 );
- if( base_tmp > base_Q32 ) {
- while( 1 ) {
- low_Q16 = prob[ --probIx ];
- base_tmp = SKP_MUL_uint( range_Q16, low_Q16 );
- if( base_tmp <= base_Q32 ) {
- break;
- }
- high_Q16 = low_Q16;
- /* Test for out of range */
- if( high_Q16 == 0 ) {
- psRC->error = RANGE_CODER_CDF_OUT_OF_RANGE;
- /* Set output to zero */
- *data = 0;
- return;
- }
- }
- } else {
- while( 1 ) {
- low_Q16 = high_Q16;
- high_Q16 = prob[ ++probIx ];
- base_tmp = SKP_MUL_uint( range_Q16, high_Q16 );
- if( base_tmp > base_Q32 ) {
- probIx--;
- break;
- }
- /* Test for out of range */
- if( high_Q16 == 0xFFFF ) {
- psRC->error = RANGE_CODER_CDF_OUT_OF_RANGE;
- /* Set output to zero */
- *data = 0;
- return;
- }
- }
- }
- *data = probIx;
- base_Q32 -= SKP_MUL_uint( range_Q16, low_Q16 );
- range_Q32 = SKP_MUL_uint( range_Q16, high_Q16 - low_Q16 );
-
- /* Check normalization */
- if( range_Q32 & 0xFF000000 ) {
- /* No normalization */
- range_Q16 = SKP_RSHIFT_uint( range_Q32, 16 );
- } else {
- if( range_Q32 & 0xFFFF0000 ) {
- /* Normalization of 8 bits shift */
- range_Q16 = SKP_RSHIFT_uint( range_Q32, 8 );
- /* Check for errors */
- if( SKP_RSHIFT_uint( base_Q32, 24 ) ) {
- psRC->error = RANGE_CODER_NORMALIZATION_FAILED;
- /* Set output to zero */
- *data = 0;
- return;
- }
- } else {
- /* Normalization of 16 bits shift */
- range_Q16 = range_Q32;
- /* Check for errors */
- if( SKP_RSHIFT( base_Q32, 16 ) ) {
- psRC->error = RANGE_CODER_NORMALIZATION_FAILED;
- /* Set output to zero */
- *data = 0;
- return;
- }
- /* Update base */
- base_Q32 = SKP_LSHIFT_uint( base_Q32, 8 );
- /* Make sure not to read beyond buffer */
- if( bufferIx < psRC->bufferLength ) {
- /* Read one byte from buffer */
- base_Q32 |= (SKP_uint32)buffer[ bufferIx++ ];
- }
- }
- /* Update base */
- base_Q32 = SKP_LSHIFT_uint( base_Q32, 8 );
- /* Make sure not to read beyond buffer */
- if( bufferIx < psRC->bufferLength ) {
- /* Read one byte from buffer */
- base_Q32 |= (SKP_uint32)buffer[ bufferIx++ ];
- }
- }
-
- /* Check for zero interval length */
- if( range_Q16 == 0 ) {
- psRC->error = RANGE_CODER_ZERO_INTERVAL_WIDTH;
- /* Set output to zero */
- *data = 0;
- return;
- }
-
- /* Copy structure data back */
- psRC->base_Q32 = base_Q32;
- psRC->range_Q16 = range_Q16;
- psRC->bufferIx = bufferIx;
-}
-
-/* Range decoder for multiple symbols */
-void SKP_Silk_range_decoder_multi(
- SKP_int data[], /* O uncompressed data [nSymbols] */
- SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
- const SKP_uint16 * const prob[], /* I cumulative density functions */
- const SKP_int probStartIx[], /* I initial (middle) entries of cdfs [nSymbols] */
- const SKP_int nSymbols /* I number of data symbols */
-)
-{
- SKP_int k;
- for( k = 0; k < nSymbols; k++ ) {
- SKP_Silk_range_decoder( &data[ k ], psRC, prob[ k ], probStartIx[ k ] );
- }
-}
-
-/* Initialize range encoder */
-void SKP_Silk_range_enc_init(
- SKP_Silk_range_coder_state *psRC /* O compressor data structure */
-)
-{
- /* Initialize structure */
- psRC->bufferLength = MAX_ARITHM_BYTES;
- psRC->range_Q16 = 0x0000FFFF;
- psRC->bufferIx = 0;
- psRC->base_Q32 = 0;
- psRC->error = 0;
-}
-
-/* Initialize range decoder */
-void SKP_Silk_range_dec_init(
- SKP_Silk_range_coder_state *psRC, /* O compressor data structure */
- const SKP_uint8 buffer[], /* I buffer for compressed data [bufferLength] */
- const SKP_int32 bufferLength /* I buffer length (in bytes) */
-)
-{
- /* check input */
- if( bufferLength > MAX_ARITHM_BYTES ) {
- psRC->error = RANGE_CODER_DEC_PAYLOAD_TOO_LONG;
- return;
- }
- /* Initialize structure */
- /* Copy to internal buffer */
- SKP_memcpy( psRC->buffer, buffer, bufferLength * sizeof( SKP_uint8 ) );
- psRC->bufferLength = bufferLength;
- psRC->bufferIx = 0;
- psRC->base_Q32 =
- SKP_LSHIFT_uint( (SKP_uint32)buffer[ 0 ], 24 ) |
- SKP_LSHIFT_uint( (SKP_uint32)buffer[ 1 ], 16 ) |
- SKP_LSHIFT_uint( (SKP_uint32)buffer[ 2 ], 8 ) |
- (SKP_uint32)buffer[ 3 ];
- psRC->range_Q16 = 0x0000FFFF;
- psRC->error = 0;
-}
-
-/* Determine length of bitstream */
-SKP_int SKP_Silk_range_coder_get_length( /* O returns number of BITS in stream */
- const SKP_Silk_range_coder_state *psRC, /* I compressed data structure */
- SKP_int *nBytes /* O number of BYTES in stream */
-)
-{
- SKP_int nBits;
-
- /* Number of additional bits (1..9) required to be stored to stream */
- nBits = SKP_LSHIFT( psRC->bufferIx, 3 ) + SKP_Silk_CLZ32( psRC->range_Q16 - 1 ) - 14;
-
- *nBytes = SKP_RSHIFT( nBits + 7, 3 );
-
- /* Return number of bits in bitstream */
- return nBits;
-}
-
-/* Write shortest uniquely decodable stream to buffer, and determine its length */
-void SKP_Silk_range_enc_wrap_up(
- SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */
-)
-{
- SKP_int bufferIx_tmp, bits_to_store, bits_in_stream, nBytes, mask;
- SKP_uint32 base_Q24;
-
- /* Lower limit of interval, shifted 8 bits to the right */
- base_Q24 = SKP_RSHIFT_uint( psRC->base_Q32, 8 );
-
- bits_in_stream = SKP_Silk_range_coder_get_length( psRC, &nBytes );
-
- /* Number of additional bits (1..9) required to be stored to stream */
- bits_to_store = bits_in_stream - SKP_LSHIFT( psRC->bufferIx, 3 );
- /* Round up to required resolution */
- base_Q24 += SKP_RSHIFT_uint( 0x00800000, bits_to_store - 1 );
- base_Q24 &= SKP_LSHIFT_ovflw( 0xFFFFFFFF, 24 - bits_to_store );
-
- /* Check for carry */
- if( base_Q24 & 0x01000000 ) {
- /* Propagate carry in buffer */
- bufferIx_tmp = psRC->bufferIx;
- while( ( ++( psRC->buffer[ --bufferIx_tmp ] ) ) == 0 );
- }
-
- /* Store to stream, making sure not to write beyond buffer */
- if( psRC->bufferIx < psRC->bufferLength ) {
- psRC->buffer[ psRC->bufferIx++ ] = (SKP_uint8)SKP_RSHIFT_uint( base_Q24, 16 );
- if( bits_to_store > 8 ) {
- if( psRC->bufferIx < psRC->bufferLength ) {
- psRC->buffer[ psRC->bufferIx++ ] = (SKP_uint8)SKP_RSHIFT_uint( base_Q24, 8 );
- }
- }
- }
-
- /* Fill up any remaining bits in the last byte with 1s */
- if( bits_in_stream & 7 ) {
- mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );
- if( nBytes - 1 < psRC->bufferLength ) {
- psRC->buffer[ nBytes - 1 ] |= mask;
- }
- }
-}
-
-/* Check that any remaining bits in the last byte are set to 1 */
-void SKP_Silk_range_coder_check_after_decoding(
- SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */
-)
-{
- SKP_int bits_in_stream, nBytes, mask;
-
- bits_in_stream = SKP_Silk_range_coder_get_length( psRC, &nBytes );
-
- /* Make sure not to read beyond buffer */
- if( nBytes - 1 >= psRC->bufferLength ) {
- psRC->error = RANGE_CODER_DECODER_CHECK_FAILED;
- return;
- }
-
- /* Test any remaining bits in last byte */
- if( bits_in_stream & 7 ) {
- mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );
- if( ( psRC->buffer[ nBytes - 1 ] & mask ) != mask ) {
- psRC->error = RANGE_CODER_DECODER_CHECK_FAILED;
- return;
- }
- }
-}
--- a/src/SKP_Silk_regularize_correlations_FIX.c
+++ /dev/null
@@ -1,43 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Add noise to matrix diagonal */
-void SKP_Silk_regularize_correlations_FIX(
- SKP_int32 *XX, /* I/O Correlation matrices */
- SKP_int32 *xx, /* I/O Correlation values */
- SKP_int32 noise, /* I Noise to add */
- SKP_int D /* I Dimension of XX */
-)
-{
- SKP_int i;
- for( i = 0; i < D; i++ ) {
- matrix_ptr( &XX[ 0 ], i, i, D ) = SKP_ADD32( matrix_ptr( &XX[ 0 ], i, i, D ), noise );
- }
- xx[ 0 ] += noise;
-}
--- a/src/SKP_Silk_resample_1_2.c
+++ /dev/null
@@ -1,77 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_resample_1_2 *
- * *
- * Downsample by a factor 2 *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Coefficients for 2-fold resampling */
-static SKP_int16 A20_Resample_1_2[ 3 ] = { 1254, 10102, 22898 };
-static SKP_int16 A21_Resample_1_2[ 3 ] = { 4810, 16371, 29374 };
-
-
-/* Downsample by a factor 2 */
-void SKP_Silk_resample_1_2(
- const SKP_int16 *in, /* I: 16 kHz signal [2*len] */
- SKP_int32 *S, /* I/O: State vector [6] */
- SKP_int16 *out, /* O: 8 kHz signal [len] */
- SKP_int32 *scratch, /* I: Scratch memory [4*len] */
- const SKP_int32 len /* I: Number of OUTPUT samples*/
-)
-{
- SKP_int32 k, idx;
-
- /* De-interleave allpass inputs, and convert Q15 -> Q25 */
- for( k = 0; k < len; k++ ) {
- idx = SKP_LSHIFT( k, 1 );
- scratch[ k ] = SKP_LSHIFT( (SKP_int32)in[ idx ], 10 );
- scratch[ k + len ] = SKP_LSHIFT( (SKP_int32)in[ idx + 1 ], 10 );
- }
-
- idx = SKP_LSHIFT( len, 1 );
-
- /* Allpass filters */
- SKP_Silk_allpass_int( scratch, S, A21_Resample_1_2[ 0 ], scratch + idx, len );
- SKP_Silk_allpass_int( scratch + idx, S + 1, A21_Resample_1_2[ 1 ], scratch + idx + len, len );
- SKP_Silk_allpass_int( scratch + idx + len, S + 2, A21_Resample_1_2[ 2 ], scratch, len );
-
- SKP_Silk_allpass_int( scratch + len, S + 3, A20_Resample_1_2[ 0 ], scratch + idx, len );
- SKP_Silk_allpass_int( scratch + idx, S + 4, A20_Resample_1_2[ 1 ], scratch + idx + len, len );
- SKP_Silk_allpass_int( scratch + idx + len, S + 5, A20_Resample_1_2[ 2 ], scratch + len, len );
-
- /* Add two allpass outputs */
- for( k = 0; k < len; k++ ) {
- out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( scratch[ k ] + scratch[ k + len ], 11 ) );
- }
-}
-
--- a/src/SKP_Silk_resample_1_2_coarse.c
+++ /dev/null
@@ -1,74 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_resample_1_2_coarse.c *
- * *
- * Downsample by a factor 2, coarser *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* downsample by a factor 2, coarser */
-void SKP_Silk_resample_1_2_coarse(
- const SKP_int16 *in, /* I: 16 kHz signal [2*len] */
- SKP_int32 *S, /* I/O: State vector [4] */
- SKP_int16 *out, /* O: 8 kHz signal [len] */
- SKP_int32 *scratch, /* I: Scratch memory [3*len] */
- const SKP_int32 len /* I: Number of OUTPUT samples*/
-)
-{
- SKP_int32 k, idx;
-
- /* Coefficients for coarser 2-fold resampling */
- const SKP_int16 A20c[ 2 ] = { 2119, 16663 };
- const SKP_int16 A21c[ 2 ] = { 8050, 26861 };
-
- /* De-interleave allpass inputs, and convert Q15 -> Q25 */
- for( k = 0; k < len; k++ ) {
- idx = SKP_LSHIFT( k, 1 );
- scratch[ k ] = SKP_LSHIFT( (SKP_int32)in[ idx ], 10 );
- scratch[ k + len ] = SKP_LSHIFT( (SKP_int32)in[ idx + 1 ], 10 );
- }
-
- idx = SKP_LSHIFT( len, 1 );
- /* Allpass filters */
- SKP_Silk_allpass_int( scratch, S, A21c[ 0 ], scratch + idx, len );
- SKP_Silk_allpass_int( scratch + idx, S + 1, A21c[ 1 ], scratch, len );
-
- SKP_Silk_allpass_int( scratch + len, S + 2, A20c[ 0 ], scratch + idx, len );
- SKP_Silk_allpass_int( scratch + idx, S + 3, A20c[ 1 ], scratch + len, len );
-
- /* Add two allpass outputs */
- for( k = 0; k < len; k++ ) {
- out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( scratch[ k ] + scratch[ k + len ], 11 ) );
- }
-}
-
-
--- a/src/SKP_Silk_resample_1_2_coarsest.c
+++ /dev/null
@@ -1,71 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_resample_1_2_coarsest.c *
- * *
- * Downsample by a factor 2, coarsest *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-
-/* Coefficients for coarsest 2-fold resampling */
-static SKP_int16 A20cst[ 1 ] = { 3786 };
-static SKP_int16 A21cst[ 1 ] = { 17908 };
-
-/* Downsample by a factor 2, coarsest */
-void SKP_Silk_resample_1_2_coarsest(
- const SKP_int16 *in, /* I: 16 kHz signal [2*len] */
- SKP_int32 *S, /* I/O: State vector [2] */
- SKP_int16 *out, /* O: 8 kHz signal [len] */
- SKP_int32 *scratch, /* I: Scratch memory [3*len] */
- const SKP_int32 len /* I: Number of OUTPUT samples*/
-)
-{
- SKP_int32 k, idx;
-
- /* De-interleave allpass inputs, and convert Q15 -> Q25 */
- for( k = 0; k < len; k++ ) {
- idx = SKP_LSHIFT( k, 1 );
- scratch[ k ] = SKP_LSHIFT( (SKP_int32)in[ idx ], 10 );
- scratch[ k + len ] = SKP_LSHIFT( (SKP_int32)in[ idx + 1 ], 10 );
- }
-
- idx = SKP_LSHIFT( len, 1 );
- /* Allpass filters */
- SKP_Silk_allpass_int( scratch, S, A21cst[ 0 ], scratch + idx, len );
- SKP_Silk_allpass_int( scratch + len, S + 1, A20cst[ 0 ], scratch, len );
-
- /* Add two allpass outputs */
- for( k = 0; k < len; k++ ) {
- out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( scratch[ k ] + scratch[ k + idx ], 11 ) );
- }
-}
-
--- a/src/SKP_Silk_resample_1_3.c
+++ /dev/null
@@ -1,101 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_resample_1_3.c *
- * *
- * Downsamples by a factor 3 *
- * *
- * Copyright 2008 (c), Skype Limited *
- * Date: 081113 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define OUT_SUBFR_LEN 80
-
-/* Downsamples by a factor 3 */
-void SKP_Silk_resample_1_3(
- SKP_int16 *out, /* O: Fs_low signal [inLen/3] */
- SKP_int32 *S, /* I/O: State vector [7] */
- const SKP_int16 *in, /* I: Fs_high signal [inLen] */
- const SKP_int32 inLen /* I: Input length, must be a multiple of 3 */
-)
-{
- SKP_int k, outLen, LSubFrameIn, LSubFrameOut;
- SKP_int32 out_tmp, limit = 102258000; // (102258000 + 1560) * 21 * 2^(-16) = 32767.5
- SKP_int32 scratch0[ 3 * OUT_SUBFR_LEN ];
- SKP_int32 scratch10[ OUT_SUBFR_LEN ], scratch11[ OUT_SUBFR_LEN ], scratch12[ OUT_SUBFR_LEN ];
- /* coefficients for 3-fold resampling */
- const SKP_int16 A30[ 2 ] = { 1773, 17818 };
- const SKP_int16 A31[ 2 ] = { 4942, 25677 };
- const SKP_int16 A32[ 2 ] = { 11786, 29304 };
-
- /* Check that input is multiple of 3 */
- SKP_assert( inLen % 3 == 0 );
-
- outLen = SKP_DIV32_16( inLen, 3 );
- while( outLen > 0 ) {
- LSubFrameOut = SKP_min_int( OUT_SUBFR_LEN, outLen );
- LSubFrameIn = SKP_SMULBB( 3, LSubFrameOut );
-
- /* Low-pass filter, Q15 -> Q25 */
- SKP_Silk_lowpass_short( in, S, scratch0, LSubFrameIn );
-
- /* De-interleave three allpass inputs */
- for( k = 0; k < LSubFrameOut; k++ ) {
- scratch10[ k ] = scratch0[ 3 * k ];
- scratch11[ k ] = scratch0[ 3 * k + 1 ];
- scratch12[ k ] = scratch0[ 3 * k + 2 ];
- }
-
- /* Allpass filters */
- SKP_Silk_allpass_int( scratch10, S + 1, A32[ 0 ], scratch0, LSubFrameOut );
- SKP_Silk_allpass_int( scratch0, S + 2, A32[ 1 ], scratch10, LSubFrameOut );
-
- SKP_Silk_allpass_int( scratch11, S + 3, A31[ 0 ], scratch0, LSubFrameOut );
- SKP_Silk_allpass_int( scratch0, S + 4, A31[ 1 ], scratch11, LSubFrameOut );
-
- SKP_Silk_allpass_int( scratch12, S + 5, A30[ 0 ], scratch0, LSubFrameOut );
- SKP_Silk_allpass_int( scratch0, S + 6, A30[ 1 ], scratch12, LSubFrameOut );
-
- /* Add three allpass outputs */
- for( k = 0; k < LSubFrameOut; k++ ) {
- out_tmp = scratch10[ k ] + scratch11[ k ] + scratch12[ k ];
- if( out_tmp - limit > 0 ) {
- out[ k ] = SKP_int16_MAX;
- } else if( out_tmp + limit < 0 ) {
- out[ k ] = SKP_int16_MIN;
- } else {
- out[ k ] = (SKP_int16) SKP_SMULWB( out_tmp + 1560, 21 );
- }
- }
-
- in += LSubFrameIn;
- out += LSubFrameOut;
- outLen -= LSubFrameOut;
- }
-}
--- a/src/SKP_Silk_resample_2_1_coarse.c
+++ /dev/null
@@ -1,73 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_resample_2_1_coarse.c *
- * *
- * Upsample by a factor 2, coarser *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Upsample by a factor 2, coarser */
-void SKP_Silk_resample_2_1_coarse(
- const SKP_int16 *in, /* I: 8 kHz signal [len] */
- SKP_int32 *S, /* I/O: State vector [4] */
- SKP_int16 *out, /* O: 16 kHz signal [2*len] */
- SKP_int32 *scratch, /* I: Scratch memory [3*len] */
- const SKP_int32 len /* I: Number of INPUT samples */
-)
-{
- SKP_int32 k, idx;
-
- /* Coefficients for coarser 2-fold resampling */
- const SKP_int16 A20c[ 2 ] = { 2119, 16663 };
- const SKP_int16 A21c[ 2 ] = { 8050, 26861 };
-
- /* Convert Q15 -> Q25 */
- for( k = 0; k < len; k++ ) {
- scratch[ k ] = SKP_LSHIFT( (SKP_int32)in[ k ], 10 );
- }
-
- idx = SKP_LSHIFT( len, 1 );
-
- /* Allpass filters */
- SKP_Silk_allpass_int( scratch, S, A20c[ 0 ], scratch + idx, len );
- SKP_Silk_allpass_int( scratch + idx, S + 1, A20c[ 1 ], scratch + len, len );
-
- SKP_Silk_allpass_int( scratch, S + 2, A21c[ 0 ], scratch + idx, len );
- SKP_Silk_allpass_int( scratch + idx, S + 3, A21c[ 1 ], scratch, len );
-
- /* Interleave two allpass outputs */
- for( k = 0; k < len; k++ ) {
- idx = SKP_LSHIFT( k, 1 );
- out[ idx ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( scratch[ k + len ], 10 ) );
- out[ idx + 1 ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( scratch[ k ], 10 ) );
- }
-}
--- a/src/SKP_Silk_resample_2_3.c
+++ /dev/null
@@ -1,74 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_2_3.c *
- * *
- * Resamples by a factor 2/3 *
- * *
- * Copyright 2008 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 081113 *
- * */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define OUT_SUBFR_LEN 80
-
-/* Resamples by a factor 2/3 */
-void SKP_Silk_resample_2_3(
- SKP_int16 *out, /* O: Fs_low signal [inLen * 2/3] */
- SKP_int32 *S, /* I/O: State vector [7+4] */
- const SKP_int16 *in, /* I: Fs_high signal [inLen] */
- const SKP_int inLen /* I: Input length, must be a multiple of 3 */
-)
-{
- SKP_int outLen, LSubFrameIn, LSubFrameOut;
- SKP_int16 outH[ 3 * OUT_SUBFR_LEN ];
- SKP_int32 scratch[ ( 9 * OUT_SUBFR_LEN ) / 2 ];
-
- /* Check that input length is multiple of 3 */
- SKP_assert( inLen % 3 == 0 );
-
- outLen = SKP_DIV32_16( SKP_LSHIFT( inLen, 1 ), 3 );
- while( outLen > 0 ) {
- LSubFrameOut = SKP_min_int( OUT_SUBFR_LEN, outLen );
- LSubFrameIn = SKP_SMULWB( 98304, LSubFrameOut ); /* 98304_Q16 = 3/2_Q0 */
-
- /* Upsample by a factor 2 */
- /* Scratch size needs to be: 3 * LSubFrameIn * sizeof( SKP_int32 ) */
- SKP_Silk_resample_2_1_coarse( in, &S[ 0 ], outH, scratch, LSubFrameIn );
-
- /* Downsample by a factor 3 */
- SKP_Silk_resample_1_3( out, &S[ 4 ], outH, SKP_LSHIFT( LSubFrameIn, 1 ) );
-
- in += LSubFrameIn;
- out += LSubFrameOut;
- outLen -= LSubFrameOut;
- }
-}
--- a/src/SKP_Silk_resample_2_3_coarse.c
+++ /dev/null
@@ -1,112 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_2_3_coarse.c *
- * *
- * Description: Linear phase FIR polyphase implementation of resampling *
- * *
- * Copyright 2009 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 090423 *
- * */
-
-#include "SKP_Silk_SigProc_FIX.h"
-#include "SKP_Silk_resample_rom.h"
-
-/* Resamples input data with a factor 2/3 */
-void SKP_Silk_resample_2_3_coarse(
- SKP_int16 *out, /* O: Output signal */
- SKP_int16 *S, /* I/O: Resampler state [ SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ] */
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int frameLenIn, /* I: Number of input samples */
- SKP_int16 *scratch /* I: Scratch memory [ frameLenIn + SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ] */
-)
-{
- SKP_int32 n, ind, interpol_ind, tmp, index_Q16;
- SKP_int16 *in_ptr;
- SKP_int frameLenOut;
- const SKP_int16 *interpol_ptr;
-
- /* Copy buffered samples to start of scratch */
- SKP_memcpy( scratch, S, ( SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ) * sizeof( SKP_int16 ) );
-
- /* Then append by the input signal */
- SKP_memcpy( &scratch[ SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ], in, frameLenIn * sizeof( SKP_int16 ) );
-
- frameLenOut = SKP_DIV32_16( SKP_MUL( 2, frameLenIn ), 3 );
- index_Q16 = 0;
-
- SKP_assert( frameLenIn == ( ( frameLenOut * 3 ) / 2 ) );
-
- /* Interpolate */
- for( n = frameLenOut; n > 0; n-- ) {
-
- /* Integer part */
- ind = SKP_RSHIFT( index_Q16, 16 );
-
- /* Pointer to buffered input */
- in_ptr = scratch + ind;
-
- /* Fractional part */
- interpol_ind = ( SKP_SMULWB( index_Q16, SigProc_Resample_2_3_coarse_NUM_INTERPOLATORS ) &
- ( SigProc_Resample_2_3_coarse_NUM_INTERPOLATORS - 1 ) );
-
- /* Pointer to FIR taps */
- interpol_ptr = SigProc_Resample_2_3_coarse_INTERPOL[ interpol_ind ];
-
- /* Interpolate */
- /* Hardcoded for 32 FIR taps */
- SKP_assert( SigProc_Resample_2_3_coarse_NUM_FIR_COEFS == 32 );
- tmp = (SKP_int32)interpol_ptr[ 0 ] * in_ptr[ 0 ] + (SKP_int32)interpol_ptr[ 1 ] * in_ptr[ 1 ] +
- (SKP_int32)interpol_ptr[ 2 ] * in_ptr[ 2 ] + (SKP_int32)interpol_ptr[ 3 ] * in_ptr[ 3 ] +
- (SKP_int32)interpol_ptr[ 4 ] * in_ptr[ 4 ] + (SKP_int32)interpol_ptr[ 5 ] * in_ptr[ 5 ] +
- (SKP_int32)interpol_ptr[ 6 ] * in_ptr[ 6 ] + (SKP_int32)interpol_ptr[ 7 ] * in_ptr[ 7 ] +
- (SKP_int32)interpol_ptr[ 8 ] * in_ptr[ 8 ] + (SKP_int32)interpol_ptr[ 9 ] * in_ptr[ 9 ] +
- (SKP_int32)interpol_ptr[ 10 ] * in_ptr[ 10 ] + (SKP_int32)interpol_ptr[ 11 ] * in_ptr[ 11 ] +
- (SKP_int32)interpol_ptr[ 12 ] * in_ptr[ 12 ] + (SKP_int32)interpol_ptr[ 13 ] * in_ptr[ 13 ] +
- (SKP_int32)interpol_ptr[ 14 ] * in_ptr[ 14 ] + (SKP_int32)interpol_ptr[ 15 ] * in_ptr[ 15 ] +
- (SKP_int32)interpol_ptr[ 16 ] * in_ptr[ 16 ] + (SKP_int32)interpol_ptr[ 17 ] * in_ptr[ 17 ] +
- (SKP_int32)interpol_ptr[ 18 ] * in_ptr[ 18 ] + (SKP_int32)interpol_ptr[ 19 ] * in_ptr[ 19 ] +
- (SKP_int32)interpol_ptr[ 20 ] * in_ptr[ 20 ] + (SKP_int32)interpol_ptr[ 21 ] * in_ptr[ 21 ] +
- (SKP_int32)interpol_ptr[ 22 ] * in_ptr[ 22 ] + (SKP_int32)interpol_ptr[ 23 ] * in_ptr[ 23 ] +
- (SKP_int32)interpol_ptr[ 24 ] * in_ptr[ 24 ] + (SKP_int32)interpol_ptr[ 25 ] * in_ptr[ 25 ] +
- (SKP_int32)interpol_ptr[ 26 ] * in_ptr[ 26 ] + (SKP_int32)interpol_ptr[ 27 ] * in_ptr[ 27 ] +
- (SKP_int32)interpol_ptr[ 28 ] * in_ptr[ 28 ] + (SKP_int32)interpol_ptr[ 29 ] * in_ptr[ 29 ];
-
- /* Round, saturate and store to output array */
- *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( tmp, 15 ) );
-
- /* Update index */
- index_Q16 += ( ( 1 << 16 ) + ( 1 << 15 ) ); // (3/2)_Q0;
- }
-
- /* Move last part of input signal to the sample buffer to prepare for the next call */
- SKP_memcpy( S, &in[ frameLenIn - ( SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ) ],
- ( SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ) * sizeof( SKP_int16 ) );
-}
--- a/src/SKP_Silk_resample_2_3_coarsest.c
+++ /dev/null
@@ -1,131 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_2_3_coarsest.c *
- * *
- * Description: Linear phase FIR polyphase implementation of resampling *
- * *
- * Copyright 2009 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 090423 *
- * */
-
-#include "SKP_Silk_SigProc_FIX.h"
-#include "SKP_Silk_resample_rom.h"
-
-/* Resamples input data with a factor 2/3 */
-void SKP_Silk_resample_2_3_coarsest(
- SKP_int16 *out, /* O: Output signal */
- SKP_int16 *S, /* I/O: Resampler state [ SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ] */
- const SKP_int16 *in, /* I: Input signal */
- const SKP_int frameLenIn, /* I: Number of input samples */
- SKP_int16 *scratch /* I: Scratch memory [ frameLenIn + SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ] */
-)
-{
- SKP_int32 n, ind, interpol_ind, tmp, index_Q16;
- SKP_int16 *in_ptr;
- SKP_int frameLenOut;
- const SKP_int16 *interpol_ptr;
-#if ( EMBEDDED_ARM>=6 ) && defined (__GNUC__)
- SKP_int32 in_val, interpol_val;
-#endif
-
- /* Copy buffered samples to start of scratch */
- SKP_memcpy( scratch, S, ( SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ) * sizeof( SKP_int16 ) );
-
- /* Then append by the input signal */
- SKP_memcpy( &scratch[ SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ], in, frameLenIn * sizeof( SKP_int16 ) );
-
- frameLenOut = SKP_SMULWB( SKP_LSHIFT( (SKP_int32)frameLenIn, 1 ), 21846 ); // 21846_Q15 = (2/3)_Q0 rounded _up_
- index_Q16 = 0;
-
- SKP_assert( frameLenIn == ( ( frameLenOut * 3 ) / 2 ) );
-
- /* Interpolate */
- for( n = frameLenOut; n > 0; n-- ) {
-
- /* Integer part */
- ind = SKP_RSHIFT( index_Q16, 16 );
-
- /* Pointer to buffered input */
- in_ptr = scratch + ind;
-
- /* Fractional part */
- interpol_ind = ( SKP_SMULWB( index_Q16, SigProc_Resample_2_3_coarsest_NUM_INTERPOLATORS ) &
- ( SigProc_Resample_2_3_coarsest_NUM_INTERPOLATORS - 1 ) );
-
- /* Pointer to FIR taps */
- interpol_ptr = SigProc_Resample_2_3_coarsest_INTERPOL[ interpol_ind ];
-
- /* Interpolate: Hardcoded for 10 FIR taps */
-#if ( EMBEDDED_ARM>=6 ) && defined (__GNUC__) /*It doesn't improve efficiency on iphone.*/
- /*tmp = SKP_SMUAD( *((SKP_int32 *)interpol_ptr)++, *((SKP_int32 *)in_ptr)++);
- tmp = SKP_SMLAD( tmp, *((SKP_int32 *)interpol_ptr)++, *((SKP_int32 *)in_ptr)++);
- tmp = SKP_SMLAD( tmp, *((SKP_int32 *)interpol_ptr), *((SKP_int32 *)in_ptr) );*/
- __asm__ __volatile__ ( "ldr %1, [%3], #4 \n\t"
- "ldr %2, [%4], #4 \n\t"
- "smuad %0, %1, %2 \n\t"
- "ldr %1, [%3], #4 \n\t"
- "ldr %2, [%4], #4 \n\t"
- "smlad %0, %1, %2, %0\n\t"
- "ldr %1, [%3], #4 \n\t"
- "ldr %2, [%4], #4 \n\t"
- "smlad %0, %1, %2, %0\n\t"
- "ldr %1, [%3], #4 \n\t"
- "ldr %2, [%4], #4 \n\t"
- "smlad %0, %1, %2, %0\n\t"
- "ldr %1, [%3] \n\t"
- "ldr %2, [%4] \n\t"
- "smlad %0, %1, %2, %0\n\t"
- : "=r" (tmp), "=r" (interpol_val), "=r" (in_val), "=r" (interpol_ptr), "=r" (in_ptr)
- : "3" (interpol_ptr), "4" (in_ptr));
-#else
- SKP_assert( SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS == 10 );
- tmp = SKP_SMULBB( interpol_ptr[ 0 ], in_ptr[ 0 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 1 ], in_ptr[ 1 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 2 ], in_ptr[ 2 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 3 ], in_ptr[ 3 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 4 ], in_ptr[ 4 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 5 ], in_ptr[ 5 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 6 ], in_ptr[ 6 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 7 ], in_ptr[ 7 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 8 ], in_ptr[ 8 ] );
- tmp = SKP_SMLABB( tmp, interpol_ptr[ 9 ], in_ptr[ 9 ] );
-#endif
- /* Round, saturate and store to output array */
- *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( tmp, 15 ) );
-
- /* Update index */
- index_Q16 += ( ( 1 << 16 ) + ( 1 << 15 ) ); // (3/2)_Q0;
- }
-
- /* Move last part of input signal to the sample buffer to prepare for the next call */
- SKP_memcpy( S, &in[ frameLenIn - ( SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ) ],
- ( SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS - 1 ) * sizeof( SKP_int16 ) );
-}
--- a/src/SKP_Silk_resample_2_3_rom.c
+++ /dev/null
@@ -1,50 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_2_3_rom.c *
- * *
- * Description: Filter coefficients for FIR polyphase resampling *
- * *
- * Copyright 2009 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 090424 *
- * */
-
-#include "SKP_Silk_resample_rom.h"
-
-const SKP_int16 SigProc_Resample_2_3_coarse_INTERPOL[ SigProc_Resample_2_3_coarse_NUM_INTERPOLATORS ][ SigProc_Resample_2_3_coarse_NUM_FIR_COEFS ] = {
- { 0, -74, 109, 0, -234, 329, 0, -610, 813, 0, -1437, 1954, 0, -4358, 8953, 21845, 8953, -4358, 0, 1954, -1437, 0, 813, -610, 0, 329, -234, 0, 109, -74, 0, 45 },
- { 48, -62, 0, 133, -195, 0, 386, -526, 0, 936, -1243, 0, 2311, -3417, 0, 18026, 18026, 0, -3417, 2311, 0, -1243, 936, 0, -526, 386, 0, -195, 133, 0, -62, 48 },
-};
-
-const SKP_int16 SigProc_Resample_2_3_coarsest_INTERPOL[ SigProc_Resample_2_3_coarsest_NUM_INTERPOLATORS ][ SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS ] = {
- { 379, 0, -3081, 8239, 21845, 8239, -3081, 0, 379, -145 },
- { 0, 696, -1951, 0, 17659, 17659, 0, -1951, 696, 0 },
-};
-
--- a/src/SKP_Silk_resample_3_1.c
+++ /dev/null
@@ -1,100 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_resample_3_1.c *
- * *
- * Upsamples by a factor 3 *
- * *
- * Copyright 2008 (c), Skype Limited *
- * Date: 081113 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define IN_SUBFR_LEN_RESAMPLE_3_1 40
-
-/* Resamples by a factor 3/1 */
-void SKP_Silk_resample_3_1(
- SKP_int16 *out, /* O: Fs_high signal [inLen*3] */
- SKP_int32 *S, /* I/O: State vector [7] */
- const SKP_int16 *in, /* I: Fs_low signal [inLen] */
- const SKP_int32 inLen /* I: Input length */
-)
-{
- SKP_int k, LSubFrameIn, LSubFrameOut;
- SKP_int32 out_tmp, idx, inLenTmp = inLen;
- SKP_int32 scratch00[ IN_SUBFR_LEN_RESAMPLE_3_1 ];
- SKP_int32 scratch0[ 3 * IN_SUBFR_LEN_RESAMPLE_3_1 ];
- SKP_int32 scratch1[ 3 * IN_SUBFR_LEN_RESAMPLE_3_1 ];
-
- /* Coefficients for 3-fold resampling */
- const SKP_int16 A30[ 2 ] = { 1773, 17818 };
- const SKP_int16 A31[ 2 ] = { 4942, 25677 };
- const SKP_int16 A32[ 2 ] = { 11786, 29304 };
-
- while( inLenTmp > 0 ) {
- LSubFrameIn = SKP_min_int( IN_SUBFR_LEN_RESAMPLE_3_1, inLenTmp );
- LSubFrameOut = SKP_SMULBB( 3, LSubFrameIn );
-
- /* Convert Q15 -> Q25 */
- for( k = 0; k < LSubFrameIn; k++ ) {
- scratch00[k] = SKP_LSHIFT( (SKP_int32)in[ k ], 10 );
- }
-
- /* Allpass filtering */
- /* Scratch size: 2 * 3* LSubFrame * sizeof(SKP_int32) */
- SKP_Silk_allpass_int( scratch00, S + 1, A30[ 0 ], scratch1, LSubFrameIn );
- SKP_Silk_allpass_int( scratch1, S + 2, A30[ 1 ], scratch0, LSubFrameIn );
-
- SKP_Silk_allpass_int( scratch00, S + 3, A31[ 0 ], scratch1, LSubFrameIn );
- SKP_Silk_allpass_int( scratch1, S + 4, A31[ 1 ], scratch0 + IN_SUBFR_LEN_RESAMPLE_3_1, LSubFrameIn );
-
- SKP_Silk_allpass_int( scratch00, S + 5, A32[ 0 ], scratch1, LSubFrameIn );
- SKP_Silk_allpass_int( scratch1, S + 6, A32[ 1 ], scratch0 + 2 * IN_SUBFR_LEN_RESAMPLE_3_1, LSubFrameIn );
-
- /* Interleave three allpass outputs */
- for( k = 0; k < LSubFrameIn; k++ ) {
- idx = SKP_SMULBB( 3, k );
- scratch1[ idx ] = scratch0[ k ];
- scratch1[ idx + 1 ] = scratch0[ k + IN_SUBFR_LEN_RESAMPLE_3_1 ];
- scratch1[ idx + 2 ] = scratch0[ k + 2 * IN_SUBFR_LEN_RESAMPLE_3_1 ];
- }
-
- /* Low-pass filtering */
- SKP_Silk_lowpass_int( scratch1, S, scratch0, LSubFrameOut );
-
- /* Saturate and convert to SKP_int16 */
- for( k = 0; k < LSubFrameOut; k++ ) {
- out_tmp = scratch0[ k ];
- out[ k ] = (SKP_int16) SKP_SAT16( SKP_RSHIFT_ROUND( out_tmp, 10 ) );
- }
-
- in += LSubFrameIn;
- inLenTmp -= LSubFrameIn;
- out += LSubFrameOut;
- }
-}
--- a/src/SKP_Silk_resample_3_2.c
+++ /dev/null
@@ -1,73 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_3_2.c *
- * *
- * Resamples by a factor 3/2 *
- * *
- * Copyright 2008 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 081113 *
- * */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define IN_SUBFR_LEN_RESAMPLE_3_2 80
-
-/* Resamples by a factor 3/2 */
-void SKP_Silk_resample_3_2(
- SKP_int16 *out, /* O: Fs_high signal [inLen*3/2] */
- SKP_int32 *S, /* I/O: State vector [7+4] */
- const SKP_int16 *in, /* I: Fs_low signal [inLen] */
- SKP_int inLen /* I: Input length, must be a multiple of 2 */
-)
-{
- SKP_int LSubFrameIn, LSubFrameOut;
- SKP_int16 outH[ 3 * IN_SUBFR_LEN_RESAMPLE_3_2 ];
- SKP_int32 scratch[ ( 9 * IN_SUBFR_LEN_RESAMPLE_3_2 ) / 2 ];
-
- /* Check that input is multiple of 2 */
- SKP_assert( inLen % 2 == 0 );
-
- while( inLen > 0 ) {
- LSubFrameIn = SKP_min_int( IN_SUBFR_LEN_RESAMPLE_3_2, inLen );
- LSubFrameOut = SKP_SMULWB( 98304, LSubFrameIn );
-
- /* Upsample by a factor 3 */
- SKP_Silk_resample_3_1( outH, &S[ 0 ], in, LSubFrameIn );
-
- /* Downsample by a factor 2 */
- /* Scratch size needs to be: 3 * LSubFrameOut * sizeof( SKP_int32 ) */
- SKP_Silk_resample_1_2_coarse( outH, &S[ 7 ], out, scratch, LSubFrameOut );
-
- in += LSubFrameIn;
- out += LSubFrameOut;
- inLen -= LSubFrameIn;
- }
-}
--- a/src/SKP_Silk_resample_3_2_rom.c
+++ /dev/null
@@ -1,46 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_3_2_rom.c *
- * *
- * Description: Filter coefficients for FIR polyphase resampling *
- * *
- * Copyright 2009 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 090424 *
- * */
-
-#include "SKP_Silk_resample_rom.h"
-
-const SKP_int16 SigProc_Resample_3_2_coarse_INTERPOL[ SigProc_Resample_3_2_coarse_NUM_INTERPOLATORS ][ SigProc_Resample_3_2_coarse_NUM_FIR_COEFS ] = {
- { 0, 0, 0, 32768, 0, 0, 0, 0 },
- { -384, 1630, -5217, 26674, 12714, -3572, 1050, -236 },
- { -236, 1050, -3572, 12714, 26674, -5217, 1630, -384 },
-};
-
--- a/src/SKP_Silk_resample_3_4.c
+++ /dev/null
@@ -1,79 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_3_4.c *
- * *
- * Resamples by a factor 3/4 *
- * *
- * Copyright 2009 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 090408 *
- * */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define IN_SUBFR_LEN_RESAMPLE_3_4 80
-
-/* Resamples by a factor 3/4 */
-void SKP_Silk_resample_3_4(
- SKP_int16 *out, /* O: Fs_high signal [inLen*3/4] */
- SKP_int32 *S, /* I/O: State vector [7+2+6] */
- const SKP_int16 *in, /* I: Fs_low signal [inLen] */
- SKP_int inLen /* I: Input length, must be a multiple of 4 */
-)
-{
- SKP_int LSubFrameIn, LSubFrameOut;
- SKP_int16 outH[ 3 * IN_SUBFR_LEN_RESAMPLE_3_4 ];
- SKP_int16 outL[ ( 3 * IN_SUBFR_LEN_RESAMPLE_3_4 ) / 2 ];
- SKP_int32 scratch[ ( 9 * IN_SUBFR_LEN_RESAMPLE_3_4 ) / 2 ];
-
- /* Check that input is multiple of 4 */
- SKP_assert( inLen % 4 == 0 );
-
- while( inLen > 0 ) {
- LSubFrameIn = SKP_min_int( IN_SUBFR_LEN_RESAMPLE_3_4, inLen );
- LSubFrameOut = SKP_SMULWB( 49152, LSubFrameIn );
-
- /* Upsample by a factor 3 */
- SKP_Silk_resample_3_1( outH, &S[ 0 ], in, LSubFrameIn );
-
- /* Downsample by a factor 2 twice */
- /* Scratch size needs to be: 3 * 2 * LSubFrameOut * sizeof( SKP_int32 ) */
- /* I: state vector [2], scratch memory [3*len] */
- SKP_Silk_resample_1_2_coarsest( outH, &S[ 7 ], outL, scratch, SKP_LSHIFT( LSubFrameOut, 1 ) );
-
- /* Scratch size needs to be: 3 * LSubFrameOut * sizeof( SKP_int32 ) */
- /* I: state vector [6], scratch memory [3*len] */
- SKP_Silk_resample_1_2_coarse( outL, &S[ 9 ], out, scratch, LSubFrameOut );
-
- in += LSubFrameIn;
- out += LSubFrameOut;
- inLen -= LSubFrameIn;
- }
-}
--- a/src/SKP_Silk_resample_4_3.c
+++ /dev/null
@@ -1,77 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_4_3.c *
- * *
- * Resamples by a factor 4/3 *
- * *
- * Copyright 2009 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 090407 *
- * */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-#define OUT_SUBFR_LEN 80
-
-/* Resamples by a factor 4/3 */
-void SKP_Silk_resample_4_3(
- SKP_int16 *out, /* O: Fs_low signal [inLen * 4/3] */
- SKP_int32 *S, /* I/O: State vector [7+4+4] */
- const SKP_int16 *in, /* I: Fs_high signal [inLen] */
- const SKP_int inLen /* I: input length, must be a multiple of 3 */
-)
-{
- SKP_int outLen, LSubFrameIn, LSubFrameOut;
- SKP_int16 outH[ 3 * OUT_SUBFR_LEN ];
- SKP_int16 outHH[ 6 * OUT_SUBFR_LEN ];
- SKP_int32 scratch[ 9 * OUT_SUBFR_LEN / 2 ];
-
- /* Check that input is multiple of 3 */
- SKP_assert( inLen % 3 == 0 );
-
- outLen = SKP_DIV32_16( SKP_LSHIFT( inLen, 2 ), 3 );
- while( outLen > 0 ) {
- LSubFrameOut = SKP_min_int( OUT_SUBFR_LEN, outLen );
- LSubFrameIn = SKP_SMULWB( 49152, LSubFrameOut );
-
- /* Upsample two times by a factor 2 */
- /* Scratch size needs to be: 3 * LSubFrameIn * sizeof( SKP_int32 ) */
- SKP_Silk_resample_2_1_coarse( in, &S[ 0 ], outH, scratch, LSubFrameIn );
- /* Scratch size needs to be: 6 * LSubFrameIn * sizeof( SKP_int32 ) */
- SKP_Silk_resample_2_1_coarse( outH, &S[ 4 ], outHH, scratch, SKP_LSHIFT( LSubFrameIn, 1 ) );
-
- /* Downsample by a factor 3 */
- SKP_Silk_resample_1_3( out, &S[ 8 ], outHH, SKP_LSHIFT( LSubFrameIn, 2 ) );
-
- in += LSubFrameIn;
- out += LSubFrameOut;
- outLen -= LSubFrameOut;
- }
-}
--- a/src/SKP_Silk_resample_rom.h
+++ /dev/null
@@ -1,107 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * File Name: SKP_Silk_resample_rom.h *
- * *
- * Description: Header file for FIR resampling of *
- * 32 and 44 kHz input *
- * *
- * Copyright 2007 (c), Skype Limited *
- * All rights reserved. *
- * *
- * Date: 070807 *
- * */
-
-#ifndef _SKP_SILK_FIX_RESAMPLE_ROM_H_
-#define _SKP_SILK_FIX_RESAMPLE_ROM_H_
-
-#include "SKP_Silk_typedef.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define SigProc_Resample_bw_1_4_NUM_INTERPOLATORS_LOG2 7
-#define SigProc_Resample_bw_1_4_NUM_INTERPOLATORS (1 << SigProc_Resample_bw_1_4_NUM_INTERPOLATORS_LOG2)
-#define SigProc_Resample_bw_1_4_NUM_FIR_COEFS 6
-
-extern const SKP_int16 SigProc_Resample_bw_1_4_INTERPOL[SigProc_Resample_bw_1_4_NUM_INTERPOLATORS][SigProc_Resample_bw_1_4_NUM_FIR_COEFS];
-
-
-#define SigProc_Resample_bw_80_441_NUM_INTERPOLATORS_LOG2 6
-#define SigProc_Resample_bw_80_441_NUM_INTERPOLATORS (1 << SigProc_Resample_bw_80_441_NUM_INTERPOLATORS_LOG2)
-#define SigProc_Resample_bw_80_441_NUM_FIR_COEFS 4
-
-extern const SKP_int16 SigProc_Resample_bw_80_441_INTERPOL[SigProc_Resample_bw_80_441_NUM_INTERPOLATORS][SigProc_Resample_bw_80_441_NUM_FIR_COEFS];
-
-#define SigProc_Resample_2_3_coarse_NUM_INTERPOLATORS 2
-#define SigProc_Resample_2_3_coarse_NUM_FIR_COEFS 32
-
-extern const SKP_int16 SigProc_Resample_2_3_coarse_INTERPOL[SigProc_Resample_2_3_coarse_NUM_INTERPOLATORS][SigProc_Resample_2_3_coarse_NUM_FIR_COEFS];
-
-#define SigProc_Resample_2_3_coarsest_NUM_INTERPOLATORS 2
-#define SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS 10
-
-extern const SKP_int16 SigProc_Resample_2_3_coarsest_INTERPOL[SigProc_Resample_2_3_coarsest_NUM_INTERPOLATORS][SigProc_Resample_2_3_coarsest_NUM_FIR_COEFS];
-
-#define SigProc_Resample_3_2_coarse_NUM_INTERPOLATORS 3
-#define SigProc_Resample_3_2_coarse_NUM_FIR_COEFS 8
-
-extern const SKP_int16 SigProc_Resample_3_2_coarse_INTERPOL[SigProc_Resample_3_2_coarse_NUM_INTERPOLATORS][SigProc_Resample_3_2_coarse_NUM_FIR_COEFS];
-
-#define SigProc_Resample_147_40_NUM_INTERPOLATORS 147
-#define SigProc_Resample_147_40_NUM_FIR_COEFS 20
-
-extern const SKP_int16 SigProc_Resample_147_40_INTERPOL[SigProc_Resample_147_40_NUM_INTERPOLATORS][SigProc_Resample_147_40_NUM_FIR_COEFS];
-
-#define SigProc_Resample_147_40_alt_NUM_INTERPOLATORS 147
-#define SigProc_Resample_147_40_alt_NUM_FIR_COEFS 10
-
-extern const SKP_int16 SigProc_Resample_147_40_alt_INTERPOL[SigProc_Resample_147_40_alt_NUM_INTERPOLATORS][SigProc_Resample_147_40_alt_NUM_FIR_COEFS];
-
-#define SigProc_Resample_147_40_coarse_NUM_INTERPOLATORS 147
-#define SigProc_Resample_147_40_coarse_NUM_FIR_COEFS 16
-
-extern const SKP_int16 SigProc_Resample_147_40_coarse_INTERPOL[SigProc_Resample_147_40_coarse_NUM_INTERPOLATORS][SigProc_Resample_147_40_coarse_NUM_FIR_COEFS];
-
-#define SigProc_Resample_40_147_NUM_INTERPOLATORS 40
-#define SigProc_Resample_40_147_NUM_FIR_COEFS 60
-
-extern const SKP_int16 SigProc_Resample_40_147_INTERPOL[SigProc_Resample_40_147_NUM_INTERPOLATORS][SigProc_Resample_40_147_NUM_FIR_COEFS];
-
-#define SigProc_Resample_40_147_coarse_NUM_INTERPOLATORS 40
-#define SigProc_Resample_40_147_coarse_NUM_FIR_COEFS 30
-
-extern const SKP_int16 SigProc_Resample_40_147_coarse_INTERPOL[SigProc_Resample_40_147_coarse_NUM_INTERPOLATORS][SigProc_Resample_40_147_coarse_NUM_FIR_COEFS];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // _SKP_SILK_FIX_RESAMPLE_ROM_H_
--- a/src/SKP_Silk_residual_energy16_FIX.c
+++ /dev/null
@@ -1,99 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */
-SKP_int32 SKP_Silk_residual_energy16_covar_FIX(
- const SKP_int16 *c, /* I Prediction vector */
- const SKP_int32 *wXX, /* I Correlation matrix */
- const SKP_int32 *wXx, /* I Correlation vector */
- SKP_int32 wxx, /* I Signal energy */
- SKP_int D, /* I Dimension */
- SKP_int cQ /* I Q value for c vector 0 - 15 */
-)
-{
- SKP_int i, j, lshifts, Qxtra;
- SKP_int32 c_max, w_max, tmp, tmp2, nrg;
- SKP_int cn[ MAX_MATRIX_SIZE ];
- const SKP_int32 *pRow;
-
- /* Safety checks */
- SKP_assert( D >= 0 );
- SKP_assert( D <= 16 );
- SKP_assert( cQ > 0 );
- SKP_assert( cQ < 16 );
-
- lshifts = 16 - cQ;
- Qxtra = lshifts;
-
- c_max = 0;
- for( i = 0; i < D; i++ ) {
- c_max = SKP_max_32( c_max, SKP_abs( ( SKP_int32 )c[ i ] ) );
- }
- Qxtra = SKP_min_int( Qxtra, SKP_Silk_CLZ32( c_max ) - 17 );
-
- w_max = SKP_max_32( wXX[ 0 ], wXX[ D * D - 1 ] );
- Qxtra = SKP_min_int( Qxtra, SKP_Silk_CLZ32( SKP_MUL( D, SKP_RSHIFT( SKP_SMULWB( w_max, c_max ), 4 ) ) ) - 5 );
- Qxtra = SKP_max_int( Qxtra, 0 );
- for( i = 0; i < D; i++ ) {
- cn[ i ] = SKP_LSHIFT( ( SKP_int )c[ i ], Qxtra );
- SKP_assert( SKP_abs(cn[i]) <= ( SKP_int16_MAX + 1 ) ); /* Check that SKP_SMLAWB can be used */
- }
- lshifts -= Qxtra;
-
- /* Compute wxx - 2 * wXx * c */
- tmp = 0;
- for( i = 0; i < D; i++ ) {
- tmp = SKP_SMLAWB( tmp, wXx[ i ], cn[ i ] );
- }
- nrg = SKP_RSHIFT( wxx, 1 + lshifts ) - tmp; /* Q: -lshifts - 1 */
-
- /* Add c' * wXX * c, assuming wXX is symmetric */
- tmp2 = 0;
- for( i = 0; i < D; i++ ) {
- tmp = 0;
- pRow = &wXX[ i * D ];
- for( j = i + 1; j < D; j++ ) {
- tmp = SKP_SMLAWB( tmp, pRow[ j ], cn[ j ] );
- }
- tmp = SKP_SMLAWB( tmp, SKP_RSHIFT( pRow[ i ], 1 ), cn[ i ] );
- tmp2 = SKP_SMLAWB( tmp2, tmp, cn[ i ] );
- }
- nrg = SKP_ADD_LSHIFT32( nrg, tmp2, lshifts ); /* Q: -lshifts - 1 */
-
- /* Keep one bit free always, because we add them for LSF interpolation */
- if( nrg < 1 ) {
- nrg = 1;
- } else if( nrg > SKP_RSHIFT( SKP_int32_MAX, lshifts + 2 ) ) {
- nrg = SKP_int32_MAX >> 1;
- } else {
- nrg = SKP_LSHIFT( nrg, lshifts + 1 ); /* Q0 */
- }
- return nrg;
-
-}
--- a/src/SKP_Silk_residual_energy_FIX.c
+++ /dev/null
@@ -1,89 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/* Calculates residual energies of input subframes where all subframes have LPC_order */
-/* of preceeding samples */
-void SKP_Silk_residual_energy_FIX(
- SKP_int32 nrgs[ NB_SUBFR ], /* O Residual energy per subframe */
- SKP_int nrgsQ[ NB_SUBFR ], /* O Q value per subframe */
- const SKP_int16 x[], /* I Input signal */
- const SKP_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ],/* I AR coefs for each frame half */
- const SKP_int32 gains_Qx[ NB_SUBFR ], /* I Quantization gains in Qx */
- const SKP_int Qx, /* I Quantization gains Q value */
- const SKP_int subfr_length, /* I Subframe length */
- const SKP_int LPC_order /* I LPC order */
-)
-{
- SKP_int offset, i, j, rshift, lz1, lz2;
- SKP_int16 *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + NB_SUBFR * MAX_LPC_ORDER ) / 2 ];
- const SKP_int16 *x_ptr;
- SKP_int16 S[ MAX_LPC_ORDER ];
- SKP_int32 tmp32;
-
- x_ptr = x;
- offset = LPC_order + subfr_length;
-
- /* Filter input to create the LPC residual for each frame half, and measure subframe energies */
- for( i = 0; i < 2; i++ ) {
- /* Calculate half frame LPC residual signal including preceeding samples */
- SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) );
- SKP_Silk_LPC_analysis_filter( x_ptr, a_Q12[ i ], S, LPC_res, ( NB_SUBFR >> 1 ) * offset, LPC_order );
-
- /* Point to first subframe of the just calculated LPC residual signal */
- LPC_res_ptr = LPC_res + LPC_order;
- for( j = 0; j < ( NB_SUBFR >> 1 ); j++ ) {
- /* Measure subframe energy */
- SKP_Silk_sum_sqr_shift( &nrgs[ i * ( NB_SUBFR >> 1 ) + j ], &rshift, LPC_res_ptr, subfr_length );
-
- /* Set Q values for the measured energy */
- nrgsQ[ i * ( NB_SUBFR >> 1 ) + j ] = -rshift;
-
- /* Move to next subframe */
- LPC_res_ptr += offset;
- }
- /* Move to next frame half */
- x_ptr += ( NB_SUBFR >> 1 ) * offset;
- }
-
- /* Apply the squared subframe gains */
- for( i = 0; i < NB_SUBFR; i++ ) {
- /* Fully upscale gains and energies */
- lz1 = SKP_Silk_CLZ32( nrgs[ i ] ) - 1;
- lz2 = SKP_Silk_CLZ32( gains_Qx[ i ] ) - 1;
-
- tmp32 = SKP_LSHIFT32( gains_Qx[ i ], lz2 );
-
- /* Find squared gains */
- tmp32 = SKP_SMMUL( tmp32, tmp32 ); // Q( 2 * ( Qx + lz2 ) - 32 )
-
- /* Scale energies */
- nrgs[ i ] = SKP_SMMUL( tmp32, SKP_LSHIFT32( nrgs[ i ], lz1 ) ); // Q( nrgsQ[ i ] + lz1 + 2 * ( Qx + lz2 ) - 32 - 32 )
- nrgsQ[ i ] += lz1 + 2 * ( Qx + lz2 ) - 32 - 32;
- }
-}
--- a/src/SKP_Silk_scale_copy_vector16.c
+++ /dev/null
@@ -1,45 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Copy and multiply a vector by a constant */
-void SKP_Silk_scale_copy_vector16(
- SKP_int16 *data_out,
- const SKP_int16 *data_in,
- SKP_int32 gain_Q16, /* (I): gain in Q16 */
- const SKP_int dataSize /* (I): length */
-)
-{
- SKP_int i;
- SKP_int32 tmp32;
-
- for( i = 0; i < dataSize; i++ ) {
- tmp32 = SKP_SMULWB( gain_Q16, data_in[ i ] );
- data_out[ i ] = (SKP_int16)SKP_CHECK_FIT16( tmp32 );
- }
-}
--- a/src/SKP_Silk_scale_vector.c
+++ /dev/null
@@ -1,122 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Multiply a vector by a constant */
-void SKP_Silk_scale_vector16_Q14(
- SKP_int16 *data1,
- SKP_int gain_Q14, /* Gain in Q14 */
- SKP_int dataSize
-)
-{
- SKP_int i;
- SKP_int32 data32, gain_Q16;
-
- SKP_assert( gain_Q14 < 32768 );
- SKP_assert( gain_Q14 >= -32768 );
-
- gain_Q16 = SKP_LSHIFT( gain_Q14, 2 );
-
- if( (SKP_int32)( (SKP_int_ptr_size)data1 & 3 ) != 0 ) {
- /* Input is not 4-byte aligned */
- data1[ 0 ] = SKP_SMULWB( gain_Q16, data1[ 0 ] );
- i = 1;
- } else {
- i = 0;
- }
- dataSize--;
- for( ; i < dataSize; i += 2 ) {
- data32 = *( (SKP_int32 *)&data1[ i ] ); /* load two values at once */
- data1[ i ] = SKP_SMULWB( gain_Q16, data32 );
- data1[ i + 1 ] = SKP_SMULWT( gain_Q16, data32 );
- }
- if( i == dataSize ) {
- /* One sample left to process */
- data1[ i ] = SKP_SMULWB( gain_Q16, data1[ i ] );
- }
-}
-
-/* Multiply a vector by a constant */
-void SKP_Silk_scale_vector32_Q26_lshift_18(
- SKP_int32 *data1, /* (I/O): Q0/Q18 */
- SKP_int32 gain_Q26, /* (I): Q26 */
- SKP_int dataSize /* (I): length */
-)
-{
- SKP_int i;
-
- for( i = 0; i < dataSize; i++ ) {
- data1[ i ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( SKP_SMULL( data1[ i ], gain_Q26 ), 8 ) );// OUTPUT: Q18
- }
-}
-
-/* Multiply a vector by a constant */
-void SKP_Silk_scale_vector32_16_Q14(
- SKP_int32 *data1, /* (I/O): Q0/Q0 */
- SKP_int gain_Q14, /* (I): Q14 */
- SKP_int dataSize /* (I): length */
-)
-{
- SKP_int i, gain_Q16;
-
- if( gain_Q14 < ( SKP_int16_MAX >> 2 ) ) {
- gain_Q16 = SKP_LSHIFT( gain_Q14, 2 );
- for( i = 0; i < dataSize; i++ ) {
- data1[ i ] = SKP_SMULWB( data1[ i ], gain_Q16 );
- }
- } else {
- SKP_assert( gain_Q14 >= SKP_int16_MIN );
- for( i = 0; i < dataSize; i++ ) {
- data1[ i ] = SKP_LSHIFT( SKP_SMULWB( data1[ i ], gain_Q14 ), 2 );
- }
- }
-}
-
-/* Multiply a vector by a constant, does not saturate output data */
-void SKP_Silk_scale_vector32_Q16(
- SKP_int32 *data1, /* (I/O): Q0/Q0 */
- SKP_int32 gain_Q16, /* (I): gain in Q16 ( SKP_int16_MIN <= gain_Q16 <= SKP_int16_MAX + 65536 ) */
- const SKP_int dataSize /* (I): length */
-)
-{
- SKP_int i;
-
- SKP_assert( gain_Q16 <= SKP_int16_MAX + 65536 );
- SKP_assert( gain_Q16 >= SKP_int16_MIN );
-
- if( gain_Q16 > SKP_int16_MAX ) {
- gain_Q16 -= 65536;
- for( i = 0; i < dataSize; i++ ) {
- data1[ i ] = SKP_SMLAWB( data1[ i ], data1[ i ], gain_Q16 );
- }
- } else {
- for( i = 0; i < dataSize; i++ ) {
- data1[ i ] = SKP_SMULWB( data1[ i ], gain_Q16 );
- }
- }
-}
--- a/src/SKP_Silk_schur.c
+++ /dev/null
@@ -1,91 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_schur.c *
- * *
- * Calculates the reflection coefficients from the correlation sequence *
- * *
- * Copyright 2008 (c), Skype Limited *
- * Date: 080103 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Faster than schur64(), but much less accurate. */
-/* uses SMLAWB(), requiring armv5E and higher. */
-void SKP_Silk_schur(
- SKP_int16 *rc_Q15, /* O: reflection coefficients [order] Q15 */
- const SKP_int32 *c, /* I: correlations [order+1] */
- const SKP_int32 order /* I: prediction order */
-)
-{
- SKP_int k, n, lz;
- SKP_int32 C[ SigProc_MAX_ORDER_LPC + 1 ][ 2 ];
- SKP_int32 Ctmp1, Ctmp2, rc_tmp_Q15;
-
- /* Get number of leading zeros */
- lz = SKP_Silk_CLZ32( c[ 0 ] );
-
- /* Copy correlations and adjust level to Q30 */
- if( lz < 2 ) {
- /* lz must be 1, so shift one to the right */
- for( k = 0; k < order + 1; k++ ) {
- C[ k ][ 0 ] = C[ k ][ 1 ] = SKP_RSHIFT( c[ k ], 1 );
- }
- } else if( lz > 2 ) {
- /* Shift to the left */
- lz -= 2;
- for( k = 0; k < order + 1; k++ ) {
- C[ k ][ 0 ] = C[ k ][ 1 ] = SKP_LSHIFT( c[k], lz );
- }
- } else {
- /* No need to shift */
- for( k = 0; k < order + 1; k++ ) {
- C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ];
- }
- }
-
- for( k = 0; k < order; k++ ) {
-
- /* Get reflection coefficient */
- rc_tmp_Q15 = -SKP_DIV32_16( C[ k + 1 ][ 0 ], SKP_max_32( SKP_RSHIFT( C[ 0 ][ 1 ], 15 ), 1 ) );
-
- /* Clip (shouldn't happen for properly conditioned inputs) */
- rc_tmp_Q15 = SKP_SAT16( rc_tmp_Q15 );
-
- /* Store */
- rc_Q15[ k ] = (SKP_int16)rc_tmp_Q15;
-
- /* Update correlations */
- for( n = 0; n < order - k; n++ ) {
- Ctmp1 = C[ n + k + 1 ][ 0 ];
- Ctmp2 = C[ n ][ 1 ];
- C[ n + k + 1 ][ 0 ] = SKP_SMLAWB( Ctmp1, SKP_LSHIFT( Ctmp2, 1 ), rc_tmp_Q15 );
- C[ n ][ 1 ] = SKP_SMLAWB( Ctmp2, SKP_LSHIFT( Ctmp1, 1 ), rc_tmp_Q15 );
- }
- }
-}
--- a/src/SKP_Silk_schur64.c
+++ /dev/null
@@ -1,80 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_schur64.c *
- * *
- * Calculates the reflection coefficients from the correlation sequence *
- * using extra precision *
- * *
- * Copyright 2008 (c), Skype Limited *
- * Date: 080103 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-
-/* Slower than schur(), but more accurate. */
-/* Uses SMULL(), available on armv4 */
-SKP_int32 SKP_Silk_schur64( /* O: Returns residual energy */
- SKP_int32 rc_Q16[], /* O: Reflection coefficients [order] Q16 */
- const SKP_int32 c[], /* I: Correlations [order+1] */
- SKP_int32 order /* I: Prediction order */
-)
-{
- SKP_int k, n;
- SKP_int32 C[ SigProc_MAX_ORDER_LPC + 1 ][ 2 ];
- SKP_int32 Ctmp1_Q30, Ctmp2_Q30, rc_tmp_Q31;
-
- /* Check for invalid input */
- if( c[ 0 ] <= 0 ) {
- SKP_memset( rc_Q16, 0, order * sizeof( SKP_int32 ) );
- return 0;
- }
-
- for( k = 0; k < order + 1; k++ ) {
- C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ];
- }
-
- for( k = 0; k < order; k++ ) {
- /* Get reflection coefficient: divide two Q30 values and get result in Q31 */
- rc_tmp_Q31 = SKP_DIV32_varQ( -C[ k + 1 ][ 0 ], C[ 0 ][ 1 ], 31 );
-
- /* Save the output */
- rc_Q16[ k ] = SKP_RSHIFT_ROUND( rc_tmp_Q31, 15 );
-
- /* Update correlations */
- for( n = 0; n < order - k; n++ ) {
- Ctmp1_Q30 = C[ n + k + 1 ][ 0 ];
- Ctmp2_Q30 = C[ n ][ 1 ];
-
- /* Multiply and add the highest int32 */
- C[ n + k + 1 ][ 0 ] = Ctmp1_Q30 + SKP_SMMUL( SKP_LSHIFT( Ctmp2_Q30, 1 ), rc_tmp_Q31 );
- C[ n ][ 1 ] = Ctmp2_Q30 + SKP_SMMUL( SKP_LSHIFT( Ctmp1_Q30, 1 ), rc_tmp_Q31 );
- }
- }
-
- return( C[ 0 ][ 1 ] );
-}
--- a/src/SKP_Silk_shell_coder.c
+++ /dev/null
@@ -1,155 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main.h"
-
-/* shell coder; pulse-subframe length is hardcoded */
-
-SKP_INLINE void combine_pulses(
- SKP_int *out, /* O: combined pulses vector [len] */
- const SKP_int *in, /* I: input vector [2 * len] */
- const SKP_int len /* I: number of OUTPUT samples */
-)
-{
- SKP_int k;
- for( k = 0; k < len; k++ ) {
- out[ k ] = in[ 2 * k ] + in[ 2 * k + 1 ];
- }
-}
-
-SKP_INLINE void encode_split(
- SKP_Silk_range_coder_state *sRC, /* I/O: compressor data structure */
- const SKP_int p_child1, /* I: pulse amplitude of first child subframe */
- const SKP_int p, /* I: pulse amplitude of current subframe */
- const SKP_uint16 *shell_table /* I: table of shell cdfs */
-)
-{
- const SKP_uint16 *cdf;
-
- if( p > 0 ) {
- cdf = &shell_table[ SKP_Silk_shell_code_table_offsets[ p ] ];
- SKP_Silk_range_encoder( sRC, p_child1, cdf );
- }
-}
-
-SKP_INLINE void decode_split(
- SKP_int *p_child1, /* O: pulse amplitude of first child subframe */
- SKP_int *p_child2, /* O: pulse amplitude of second child subframe */
- SKP_Silk_range_coder_state *sRC, /* I/O: compressor data structure */
- const SKP_int p, /* I: pulse amplitude of current subframe */
- const SKP_uint16 *shell_table /* I: table of shell cdfs */
-)
-{
- SKP_int cdf_middle;
- const SKP_uint16 *cdf;
-
- if( p > 0 ) {
- cdf_middle = SKP_RSHIFT( p, 1 );
- cdf = &shell_table[ SKP_Silk_shell_code_table_offsets[ p ] ];
- SKP_Silk_range_decoder( p_child1, sRC, cdf, cdf_middle );
- p_child2[ 0 ] = p - p_child1[ 0 ];
- } else {
- p_child1[ 0 ] = 0;
- p_child2[ 0 ] = 0;
- }
-}
-
-/* Shell encoder, operates on one shell code frame of 16 pulses */
-void SKP_Silk_shell_encoder(
- SKP_Silk_range_coder_state *sRC, /* I/O compressor data structure */
- const SKP_int *pulses0 /* I data: nonnegative pulse amplitudes */
-)
-{
- SKP_int pulses1[ 8 ], pulses2[ 4 ], pulses3[ 2 ], pulses4[ 1 ];
-
- /* this function operates on one shell code frame of 16 pulses */
- SKP_assert( SHELL_CODEC_FRAME_LENGTH == 16 );
-
- /* tree representation per pulse-subframe */
- combine_pulses( pulses1, pulses0, 8 );
- combine_pulses( pulses2, pulses1, 4 );
- combine_pulses( pulses3, pulses2, 2 );
- combine_pulses( pulses4, pulses3, 1 );
-
- encode_split( sRC, pulses3[ 0 ], pulses4[ 0 ], SKP_Silk_shell_code_table3 );
-
- encode_split( sRC, pulses2[ 0 ], pulses3[ 0 ], SKP_Silk_shell_code_table2 );
-
- encode_split( sRC, pulses1[ 0 ], pulses2[ 0 ], SKP_Silk_shell_code_table1 );
- encode_split( sRC, pulses0[ 0 ], pulses1[ 0 ], SKP_Silk_shell_code_table0 );
- encode_split( sRC, pulses0[ 2 ], pulses1[ 1 ], SKP_Silk_shell_code_table0 );
-
- encode_split( sRC, pulses1[ 2 ], pulses2[ 1 ], SKP_Silk_shell_code_table1 );
- encode_split( sRC, pulses0[ 4 ], pulses1[ 2 ], SKP_Silk_shell_code_table0 );
- encode_split( sRC, pulses0[ 6 ], pulses1[ 3 ], SKP_Silk_shell_code_table0 );
-
- encode_split( sRC, pulses2[ 2 ], pulses3[ 1 ], SKP_Silk_shell_code_table2 );
-
- encode_split( sRC, pulses1[ 4 ], pulses2[ 2 ], SKP_Silk_shell_code_table1 );
- encode_split( sRC, pulses0[ 8 ], pulses1[ 4 ], SKP_Silk_shell_code_table0 );
- encode_split( sRC, pulses0[ 10 ], pulses1[ 5 ], SKP_Silk_shell_code_table0 );
-
- encode_split( sRC, pulses1[ 6 ], pulses2[ 3 ], SKP_Silk_shell_code_table1 );
- encode_split( sRC, pulses0[ 12 ], pulses1[ 6 ], SKP_Silk_shell_code_table0 );
- encode_split( sRC, pulses0[ 14 ], pulses1[ 7 ], SKP_Silk_shell_code_table0 );
-}
-
-
-/* Shell decoder, operates on one shell code frame of 16 pulses */
-void SKP_Silk_shell_decoder(
- SKP_int *pulses0, /* O data: nonnegative pulse amplitudes */
- SKP_Silk_range_coder_state *sRC, /* I/O compressor data structure */
- const SKP_int pulses4 /* I number of pulses per pulse-subframe */
-)
-{
- SKP_int pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ];
-
- /* this function operates on one shell code frame of 16 pulses */
- SKP_assert( SHELL_CODEC_FRAME_LENGTH == 16 );
-
- decode_split( &pulses3[ 0 ], &pulses3[ 1 ], sRC, pulses4, SKP_Silk_shell_code_table3 );
-
- decode_split( &pulses2[ 0 ], &pulses2[ 1 ], sRC, pulses3[ 0 ], SKP_Silk_shell_code_table2 );
-
- decode_split( &pulses1[ 0 ], &pulses1[ 1 ], sRC, pulses2[ 0 ], SKP_Silk_shell_code_table1 );
- decode_split( &pulses0[ 0 ], &pulses0[ 1 ], sRC, pulses1[ 0 ], SKP_Silk_shell_code_table0 );
- decode_split( &pulses0[ 2 ], &pulses0[ 3 ], sRC, pulses1[ 1 ], SKP_Silk_shell_code_table0 );
-
- decode_split( &pulses1[ 2 ], &pulses1[ 3 ], sRC, pulses2[ 1 ], SKP_Silk_shell_code_table1 );
- decode_split( &pulses0[ 4 ], &pulses0[ 5 ], sRC, pulses1[ 2 ], SKP_Silk_shell_code_table0 );
- decode_split( &pulses0[ 6 ], &pulses0[ 7 ], sRC, pulses1[ 3 ], SKP_Silk_shell_code_table0 );
-
- decode_split( &pulses2[ 2 ], &pulses2[ 3 ], sRC, pulses3[ 1 ], SKP_Silk_shell_code_table2 );
-
- decode_split( &pulses1[ 4 ], &pulses1[ 5 ], sRC, pulses2[ 2 ], SKP_Silk_shell_code_table1 );
- decode_split( &pulses0[ 8 ], &pulses0[ 9 ], sRC, pulses1[ 4 ], SKP_Silk_shell_code_table0 );
- decode_split( &pulses0[ 10 ], &pulses0[ 11 ], sRC, pulses1[ 5 ], SKP_Silk_shell_code_table0 );
-
- decode_split( &pulses1[ 6 ], &pulses1[ 7 ], sRC, pulses2[ 3 ], SKP_Silk_shell_code_table1 );
- decode_split( &pulses0[ 12 ], &pulses0[ 13 ], sRC, pulses1[ 6 ], SKP_Silk_shell_code_table0 );
- decode_split( &pulses0[ 14 ], &pulses0[ 15 ], sRC, pulses1[ 7 ], SKP_Silk_shell_code_table0 );
-}
--- a/src/SKP_Silk_sigm_Q15.c
+++ /dev/null
@@ -1,78 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_sigm_Q15.c *
- * *
- * Approximate sigmoid function *
- * *
- * Copyright 2006 (c), Skype Limited *
- * Date: 060221 *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-/********************************/
-/* approximate sigmoid function */
-/********************************/
-/* fprintf(1, '%d, ', round(1024 * ([1 ./ (1 + exp(-(1:5))), 1] - 1 ./ (1 + exp(-(0:5)))))); */
-static const SKP_int32 sigm_LUT_slope_Q10[ 6 ] = {
- 237, 153, 73, 30, 12, 7
-};
-/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp(-(0:5))))); */
-static const SKP_int32 sigm_LUT_pos_Q15[ 6 ] = {
- 16384, 23955, 28861, 31213, 32178, 32548
-};
-/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp((0:5))))); */
-static const SKP_int32 sigm_LUT_neg_Q15[ 6 ] = {
- 16384, 8812, 3906, 1554, 589, 219
-};
-
-SKP_int SKP_Silk_sigm_Q15( SKP_int in_Q5 )
-{
- SKP_int ind;
-
- if( in_Q5 < 0 ) {
- /* Negative input */
- in_Q5 = -in_Q5;
- if( in_Q5 >= 6 * 32 ) {
- return 0; /* Clip */
- } else {
- /* Linear interpolation of look up table */
- ind = SKP_RSHIFT( in_Q5, 5 );
- return( sigm_LUT_neg_Q15[ ind ] - SKP_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) );
- }
- } else {
- /* Positive input */
- if( in_Q5 >= 6 * 32 ) {
- return 32767; /* clip */
- } else {
- /* Linear interpolation of look up table */
- ind = SKP_RSHIFT( in_Q5, 5 );
- return( sigm_LUT_pos_Q15[ ind ] + SKP_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) );
- }
- }
-}
-
--- a/src/SKP_Silk_solve_LS_FIX.c
+++ /dev/null
@@ -1,240 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_main_FIX.h"
-
-/*****************************/
-/* Internal function headers */
-/*****************************/
-
-typedef struct {
- SKP_int32 Q36_part;
- SKP_int32 Q48_part;
-} inv_D_t;
-
-/* Factorize square matrix A into LDL form */
-SKP_INLINE void SKP_Silk_LDL_factorize_FIX(
- SKP_int32 *A, /* I/O Pointer to Symetric Square Matrix */
- SKP_int M, /* I Size of Matrix */
- SKP_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */
- inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */
-);
-
-/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */
-SKP_INLINE void SKP_Silk_LS_SolveFirst_FIX(
- const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
- SKP_int M, /* I Dim of Matrix equation */
- const SKP_int32 *b, /* I b Vector */
- SKP_int32 *x_Q16 /* O x Vector */
-);
-
-/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */
-SKP_INLINE void SKP_Silk_LS_SolveLast_FIX(
- const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
- const SKP_int M, /* I Dim of Matrix equation */
- const SKP_int32 *b, /* I b Vector */
- SKP_int32 *x_Q16 /* O x Vector */
-);
-
-SKP_INLINE void SKP_Silk_LS_divide_Q16_FIX(
- SKP_int32 T[], /* I/O Numenator vector */
- inv_D_t *inv_D, /* I 1 / D vector */
- SKP_int M /* I dimension */
-);
-
-/* Solves Ax = b, assuming A is symmetric */
-void SKP_Silk_solve_LDL_FIX(
- SKP_int32 *A, /* I Pointer to symetric square matrix A */
- SKP_int M, /* I Size of matrix */
- const SKP_int32 *b, /* I Pointer to b vector */
- SKP_int32 *x_Q16 /* O Pointer to x solution vector */
-)
-{
- SKP_int32 L_Q16[ MAX_MATRIX_SIZE * MAX_MATRIX_SIZE ];
- SKP_int32 Y[ MAX_MATRIX_SIZE ];
- inv_D_t inv_D[ MAX_MATRIX_SIZE ];
-
- SKP_assert( M <= MAX_MATRIX_SIZE );
-
- /***************************************************
- Factorize A by LDL such that A = L*D*L',
- where L is lower triangular with ones on diagonal
- ****************************************************/
- SKP_Silk_LDL_factorize_FIX( A, M, L_Q16, inv_D );
-
- /****************************************************
- * substitute D*L'*x = Y. ie:
- L*D*L'*x = b => L*Y = b <=> Y = inv(L)*b
- ******************************************************/
- SKP_Silk_LS_SolveFirst_FIX( L_Q16, M, b, Y );
-
- /****************************************************
- D*L'*x = Y <=> L'*x = inv(D)*Y, because D is
- diagonal just multiply with 1/d_i
- ****************************************************/
- SKP_Silk_LS_divide_Q16_FIX( Y, inv_D, M );
-
- /****************************************************
- x = inv(L') * inv(D) * Y
- *****************************************************/
- SKP_Silk_LS_SolveLast_FIX( L_Q16, M, Y, x_Q16 );
-}
-
-SKP_INLINE void SKP_Silk_LDL_factorize_FIX(
- SKP_int32 *A, /* I Pointer to Symetric Square Matrix */
- SKP_int M, /* I Size of Matrix */
- SKP_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */
- inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */
-)
-{
- SKP_int i, j, k, status, loop_count;
- const SKP_int32 *ptr1, *ptr2;
- SKP_int32 diag_min_value, tmp_32, err;
- SKP_int32 v_Q0[ MAX_MATRIX_SIZE ], D_Q0[ MAX_MATRIX_SIZE ];
- SKP_int32 one_div_diag_Q36, one_div_diag_Q40, one_div_diag_Q48;
-
- SKP_assert( M <= MAX_MATRIX_SIZE );
-
- status = 1;
- diag_min_value = SKP_max_32( SKP_SMMUL( SKP_ADD_SAT32( A[ 0 ], A[ SKP_SMULBB( M, M ) - 1 ] ), FIND_LTP_COND_FAC_Q31 ), 1 << 9 );
- for( loop_count = 0; loop_count < M && status == 1; loop_count++ ) {
- status = 0;
- for( j = 0; j < M; j++ ) {
- ptr1 = matrix_adr( L_Q16, j, 0, M );
- tmp_32 = 0;
- for( i = 0; i < j; i++ ) {
- v_Q0[ i ] = SKP_SMULWW( D_Q0[ i ], ptr1[ i ] ); /* Q0 */
- tmp_32 = SKP_SMLAWW( tmp_32, v_Q0[ i ], ptr1[ i ] ); /* Q0 */
- }
- tmp_32 = SKP_SUB32( matrix_ptr( A, j, j, M ), tmp_32 );
-
- if( tmp_32 < diag_min_value ) {
- tmp_32 = SKP_SUB32( SKP_SMULBB( loop_count + 1, diag_min_value ), tmp_32 );
- /* Matrix not positive semi-definite, or ill conditioned */
- for( i = 0; i < M; i++ ) {
- matrix_ptr( A, i, i, M ) = SKP_ADD32( matrix_ptr( A, i, i, M ), tmp_32 );
- }
- status = 1;
- break;
- }
- D_Q0[ j ] = tmp_32; /* always < max(Correlation) */
-
- /* two-step division */
- one_div_diag_Q36 = SKP_INVERSE32_varQ( tmp_32, 36 ); /* Q36 */
- one_div_diag_Q40 = SKP_LSHIFT( one_div_diag_Q36, 4 ); /* Q40 */
- err = SKP_SUB32( 1 << 24, SKP_SMULWW( tmp_32, one_div_diag_Q40 ) ); /* Q24 */
- one_div_diag_Q48 = SKP_SMULWW( err, one_div_diag_Q40 ); /* Q48 */
-
- /* Save 1/Ds */
- inv_D[ j ].Q36_part = one_div_diag_Q36;
- inv_D[ j ].Q48_part = one_div_diag_Q48;
-
- matrix_ptr( L_Q16, j, j, M ) = 65536; /* 1.0 in Q16 */
- ptr1 = matrix_adr( A, j, 0, M );
- ptr2 = matrix_adr( L_Q16, j + 1, 0, M );
- for( i = j + 1; i < M; i++ ) {
- tmp_32 = 0;
- for( k = 0; k < j; k++ ) {
- tmp_32 = SKP_SMLAWW( tmp_32, v_Q0[ k ], ptr2[ k ] ); /* Q0 */
- }
- tmp_32 = SKP_SUB32( ptr1[ i ], tmp_32 ); /* always < max(Correlation) */
-
- /* tmp_32 / D_Q0[j] : Divide to Q16 */
- matrix_ptr( L_Q16, i, j, M ) = SKP_ADD32( SKP_SMMUL( tmp_32, one_div_diag_Q48 ),
- SKP_RSHIFT( SKP_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) );
-
- /* go to next column */
- ptr2 += M;
- }
- }
- }
-
- SKP_assert( status == 0 );
-}
-
-SKP_INLINE void SKP_Silk_LS_divide_Q16_FIX(
- SKP_int32 T[], /* I/O Numenator vector */
- inv_D_t *inv_D, /* I 1 / D vector */
- SKP_int M /* I Order */
-)
-{
- SKP_int i;
- SKP_int32 tmp_32;
- SKP_int32 one_div_diag_Q36, one_div_diag_Q48;
-
- for( i = 0; i < M; i++ ) {
- one_div_diag_Q36 = inv_D[ i ].Q36_part;
- one_div_diag_Q48 = inv_D[ i ].Q48_part;
-
- tmp_32 = T[ i ];
- T[ i ] = SKP_ADD32( SKP_SMMUL( tmp_32, one_div_diag_Q48 ), SKP_RSHIFT( SKP_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) );
- }
-}
-
-/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */
-SKP_INLINE void SKP_Silk_LS_SolveFirst_FIX(
- const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
- SKP_int M, /* I Dim of Matrix equation */
- const SKP_int32 *b, /* I b Vector */
- SKP_int32 *x_Q16 /* O x Vector */
-)
-{
- SKP_int i, j;
- const SKP_int32 *ptr32;
- SKP_int32 tmp_32;
-
- for( i = 0; i < M; i++ ) {
- ptr32 = matrix_adr( L_Q16, i, 0, M );
- tmp_32 = 0;
- for( j = 0; j < i; j++ ) {
- tmp_32 = SKP_SMLAWW( tmp_32, ptr32[ j ], x_Q16[ j ] );
- }
- x_Q16[ i ] = SKP_SUB32( b[ i ], tmp_32 );
- }
-}
-
-/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */
-SKP_INLINE void SKP_Silk_LS_SolveLast_FIX(
- const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
- const SKP_int M, /* I Dim of Matrix equation */
- const SKP_int32 *b, /* I b Vector */
- SKP_int32 *x_Q16 /* O x Vector */
-)
-{
- SKP_int i, j;
- const SKP_int32 *ptr32;
- SKP_int32 tmp_32;
-
- for( i = M - 1; i >= 0; i-- ) {
- ptr32 = matrix_adr( L_Q16, 0, i, M );
- tmp_32 = 0;
- for( j = M - 1; j > i; j-- ) {
- tmp_32 = SKP_SMLAWW( tmp_32, ptr32[ SKP_SMULBB( j, M ) ], x_Q16[ j ] );
- }
- x_Q16[ i ] = SKP_SUB32( b[ i ], tmp_32 );
- }
-}
--- a/src/SKP_Silk_sort.c
+++ /dev/null
@@ -1,195 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* Insertion sort (fast for already almost sorted arrays): */
-/* Best case: O(n) for an already sorted array */
-/* Worst case: O(n^2) for an inversely sorted array */
-/* */
-/* To be implemented: */
-/* Shell short: http://en.wikipedia.org/wiki/Shell_sort */
-
-#include "SKP_Silk_SigProc_FIX.h"
-
-void SKP_Silk_insertion_sort_increasing(
- SKP_int32 *a, /* I/O: Unsorted / Sorted vector */
- SKP_int *index, /* O: Index vector for the sorted elements */
- const SKP_int L, /* I: Vector length */
- const SKP_int K /* I: Number of correctly sorted positions */
-)
-{
- SKP_int32 value;
- SKP_int i, j;
-
- /* Safety checks */
- SKP_assert( K > 0 );
- SKP_assert( L > 0 );
- SKP_assert( L >= K );
-
- /* Write start indices in index vector */
- for( i = 0; i < K; i++ ) {
- index[ i ] = i;
- }
-
- /* Sort vector elements by value, increasing order */
- for( i = 1; i < K; i++ ) {
- value = a[ i ];
- for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
- a[ j + 1 ] = a[ j ]; /* Shift value */
- index[ j + 1 ] = index[ j ]; /* Shift index */
- }
- a[ j + 1 ] = value; /* Write value */
- index[ j + 1 ] = i; /* Write index */
- }
-
- /* If less than L values are asked check the remaining values, */
- /* but only spend CPU to ensure that the K first values are correct */
- for( i = K; i < L; i++ ) {
- value = a[ i ];
- if( value < a[ K - 1 ] ) {
- for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
- a[ j + 1 ] = a[ j ]; /* Shift value */
- index[ j + 1 ] = index[ j ]; /* Shift index */
- }
- a[ j + 1 ] = value; /* Write value */
- index[ j + 1 ] = i; /* Write index */
- }
- }
-}
-
-void SKP_Silk_insertion_sort_decreasing(
- SKP_int *a, /* I/O: Unsorted / Sorted vector */
- SKP_int *index, /* O: Index vector for the sorted elements */
- const SKP_int L, /* I: Vector length */
- const SKP_int K /* I: Number of correctly sorted positions */
-)
-{
- SKP_int value;
- SKP_int i, j;
-
- /* Safety checks */
- SKP_assert( K > 0 );
- SKP_assert( L > 0 );
- SKP_assert( L >= K );
-
- /* Write start indices in index vector */
- for( i = 0; i < K; i++ ) {
- index[ i ] = i;
- }
-
- /* Sort vector elements by value, decreasing order */
- for( i = 1; i < K; i++ ) {
- value = a[ i ];
- for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
- a[ j + 1 ] = a[ j ]; /* Shift value */
- index[ j + 1 ] = index[ j ]; /* Shift index */
- }
- a[ j + 1 ] = value; /* Write value */
- index[ j + 1 ] = i; /* Write index */
- }
-
- /* If less than L values are asked check the remaining values, */
- /* but only spend CPU to ensure that the K first values are correct */
- for( i = K; i < L; i++ ) {
- value = a[ i ];
- if( value > a[ K - 1 ] ) {
- for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
- a[ j + 1 ] = a[ j ]; /* Shift value */
- index[ j + 1 ] = index[ j ]; /* Shift index */
- }
- a[ j + 1 ] = value; /* Write value */
- index[ j + 1 ] = i; /* Write index */
- }
- }
-}
-
-void SKP_Silk_insertion_sort_decreasing_int16(
- SKP_int16 *a, /* I/O: Unsorted / Sorted vector */
- SKP_int *index, /* O: Index vector for the sorted elements */
- const SKP_int L, /* I: Vector length */
- const SKP_int K /* I: Number of correctly sorted positions */
-)
-{
- SKP_int i, j;
- SKP_int value;
-
- /* Safety checks */
- SKP_assert( K > 0 );
- SKP_assert( L > 0 );
- SKP_assert( L >= K );
-
- /* Write start indices in index vector */
- for( i = 0; i < K; i++ ) {
- index[ i ] = i;
- }
-
- /* Sort vector elements by value, decreasing order */
- for( i = 1; i < K; i++ ) {
- value = a[ i ];
- for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
- a[ j + 1 ] = a[ j ]; /* Shift value */
- index[ j + 1 ] = index[ j ]; /* Shift index */
- }
- a[ j + 1 ] = value; /* Write value */
- index[ j + 1 ] = i; /* Write index */
- }
-
- /* If less than L values are asked check the remaining values, */
- /* but only spend CPU to ensure that the K first values are correct */
- for( i = K; i < L; i++ ) {
- value = a[ i ];
- if( value > a[ K - 1 ] ) {
- for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
- a[ j + 1 ] = a[ j ]; /* Shift value */
- index[ j + 1 ] = index[ j ]; /* Shift index */
- }
- a[ j + 1 ] = value; /* Write value */
- index[ j + 1 ] = i; /* Write index */
- }
- }
-}
-
-void SKP_Silk_insertion_sort_increasing_all_values(
- SKP_int *a, /* I/O: Unsorted / Sorted vector */
- const SKP_int L /* I: Vector length */
-)
-{
- SKP_int value;
- SKP_int i, j;
-
- /* Safety checks */
- SKP_assert( L > 0 );
-
- /* Sort vector elements by value, increasing order */
- for( i = 1; i < L; i++ ) {
- value = a[ i ];
- for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
- a[ j + 1 ] = a[ j ]; /* Shift value */
- }
- a[ j + 1 ] = value; /* Write value */
- }
-}
-
--- a/src/SKP_Silk_structs.h
+++ /dev/null
@@ -1,381 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_STRUCTS_H
-#define SKP_SILK_STRUCTS_H
-
-#include "SKP_Silk_typedef.h"
-#include "SKP_Silk_SigProc_FIX.h"
-#include "SKP_Silk_define.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
-/************************************/
-/* Noise shaping quantization state */
-/************************************/
-typedef struct {
- SKP_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */
- SKP_int32 sLTP_shp_Q10[ 2 * MAX_FRAME_LENGTH ];
- SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + MAX_LPC_ORDER ];
- SKP_int32 sLF_AR_shp_Q12;
- SKP_int lagPrev;
- SKP_int sLTP_buf_idx;
- SKP_int sLTP_shp_buf_idx;
- SKP_int32 rand_seed;
- SKP_int32 prev_inv_gain_Q16;
- SKP_int rewhite_flag;
-} SKP_Silk_nsq_state; /* FIX*/
-
-/* Struct for Low BitRate Redundant (LBRR) information */
-typedef struct {
- SKP_uint8 payload[ MAX_ARITHM_BYTES ];
- SKP_int nBytes; /* Number of bytes in payload */
- SKP_int usage; /* Tells how the payload should be used as FEC */
-} SKP_SILK_LBRR_struct;
-
-/********************************/
-/* VAD state */
-/********************************/
-typedef struct {
- SKP_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */
- SKP_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */
- SKP_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */
- SKP_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */
- SKP_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */
- SKP_int16 HPstate; /* State of differentiator in the lowest band */
- SKP_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */
- SKP_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */
- SKP_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */
- SKP_int32 counter; /* Frame counter used in the initial phase */
-} SKP_Silk_VAD_state;
-
-/*******************************/
-/* Range encoder/decoder state */
-/*******************************/
-typedef struct {
- SKP_int32 bufferLength;
- SKP_int32 bufferIx;
- SKP_uint32 base_Q32;
- SKP_uint32 range_Q16;
- SKP_int32 error;
- SKP_uint8 buffer[ MAX_ARITHM_BYTES ]; /* Buffer containing payload */
-} SKP_Silk_range_coder_state;
-
-/* Input frequency range detection struct */
-typedef struct {
- SKP_int32 S_HP_8_kHz[ NB_SOS ][ 2 ]; /* HP filter State */
- SKP_int32 ConsecSmplsAboveThres;
- SKP_int32 ActiveSpeech_ms; /* Accumulated time with active speech */
- SKP_int SWB_detected; /* Flag to indicate SWB input */
- SKP_int WB_detected; /* Flag to indicate WB input */
-} SKP_Silk_detect_SWB_state;
-
-#if SWITCH_TRANSITION_FILTERING
-/* Variable cut-off low-pass filter state */
-typedef struct {
- SKP_int32 In_LP_State[ 2 ]; /* Low pass filter state */
- SKP_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */
- SKP_int mode; /* Operating mode, 0: switch down, 1: switch up */
-} SKP_Silk_LP_state;
-#endif
-
-/* Structure for one stage of MSVQ */
-typedef struct {
- const SKP_int32 nVectors;
- const SKP_int16 *CB_NLSF_Q15;
- const SKP_int16 *Rates_Q5;
-} SKP_Silk_NLSF_CBS;
-
-/* Structure containing NLSF MSVQ codebook */
-typedef struct {
- const SKP_int32 nStages;
-
- /* Fields for (de)quantizing */
- const SKP_Silk_NLSF_CBS *CBStages;
- const SKP_int *NDeltaMin_Q15;
-
- /* Fields for arithmetic (de)coding */
- const SKP_uint16 *CDF;
- const SKP_uint16 * const *StartPtr;
- const SKP_int *MiddleIx;
-} SKP_Silk_NLSF_CB_struct;
-
-/********************************/
-/* Encoder state */
-/********************************/
-typedef struct {
- SKP_Silk_range_coder_state sRC; /* Range coder state */
- SKP_Silk_range_coder_state sRC_LBRR; /* Range coder state (for low bitrate redundancy) */
-#if HIGH_PASS_INPUT
- SKP_int32 In_HP_State[ 2 ]; /* High pass filter state */
-#endif
-#if SWITCH_TRANSITION_FILTERING
- SKP_Silk_LP_state sLP; /* Low pass filter state */
-#endif
- SKP_Silk_VAD_state sVAD; /* Voice activity detector state */
-
- SKP_int LBRRprevLastGainIndex;
- SKP_int prev_sigtype;
- SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */
- SKP_int prevLag;
- SKP_int prev_lagIndex;
- SKP_int fs_kHz; /* Sampling frequency (kHz) */
- SKP_int fs_kHz_changed; /* Did we switch yet? */
- SKP_int frame_length; /* Frame length (samples) */
- SKP_int subfr_length; /* Subframe length (samples) */
- SKP_int la_pitch; /* Look-ahead for pitch analysis (samples) */
- SKP_int la_shape; /* Look-ahead for noise shape analysis (samples) */
- SKP_int32 TargetRate_bps; /* Target bitrate (bps) */
- SKP_int PacketSize_ms; /* Number of milliseconds to put in each packet */
- SKP_int PacketLoss_perc; /* Packet loss rate measured by farend */
- SKP_int32 frameCounter;
- SKP_int Complexity; /* Complexity setting: 0-> low; 1-> medium; 2->high */
- SKP_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */
- SKP_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */
- SKP_int shapingLPCOrder; /* Filter order for noise shaping filters */
- SKP_int predictLPCOrder; /* Filter order for prediction filters */
- SKP_int pitchEstimationComplexity; /* Complexity level for pitch estimator */
- SKP_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */
- SKP_int LTPQuantLowComplexity; /* Flag for low complexity LTP quantization */
- SKP_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */
- SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */
-
- /* Input/output buffering */
- SKP_int16 inputBuf[ MAX_FRAME_LENGTH ]; /* buffer containin input signal */
- SKP_int inputBufIx;
- SKP_int nFramesInPayloadBuf; /* number of frames sitting in outputBuf */
- SKP_int nBytesInPayloadBuf; /* number of bytes sitting in outputBuf */
-
- /* Parameters For LTP scaling Control */
- SKP_int frames_since_onset;
-
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
-
- /* Struct for Inband LBRR */
- SKP_SILK_LBRR_struct LBRR_buffer[ MAX_LBRR_DELAY ];
- SKP_int oldest_LBRR_idx;
- SKP_int LBRR_enabled;
- SKP_int LBRR_GainIncreases; /* Number of shifts to Gains to get LBRR rate Voiced frames */
-
- /* Bitrate control */
- SKP_int32 bitrateDiff; /* accumulated diff. between the target bitrate and the SWB/WB limits */
-
-#if LOW_COMPLEXITY_ONLY
- /* state for downsampling from 24 to 16 kHz in low complexity mode */
- SKP_int16 resample24To16state[ SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ];
-#else
- SKP_int32 resample24To16state[ 11 ]; /* state for downsampling from 24 to 16 kHz */
-#endif
- SKP_int32 resample24To12state[ 6 ]; /* state for downsampling from 24 to 12 kHz */
- SKP_int32 resample24To8state[ 7 ]; /* state for downsampling from 24 to 8 kHz */
- SKP_int32 resample16To12state[ 15 ]; /* state for downsampling from 16 to 12 kHz */
- SKP_int32 resample16To8state[ 6 ]; /* state for downsampling from 16 to 8 kHz */
-#if LOW_COMPLEXITY_ONLY
- /* state for downsampling from 12 to 8 kHz in low complexity mode */
- SKP_int16 resample12To8state[ SigProc_Resample_2_3_coarse_NUM_FIR_COEFS - 1 ];
-#else
- SKP_int32 resample12To8state[ 11 ]; /* state for downsampling from 12 to 8 kHz */
-#endif
-
- /* DTX */
- SKP_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */
- SKP_int useDTX; /* Flag to enable DTX */
- SKP_int inDTX; /* Flag to signal DTX period */
- SKP_int vadFlag; /* Flag to indicate Voice Activity */
-
- /* Struct for detecting SWB input */
- SKP_Silk_detect_SWB_state sSWBdetect;
-
-
- /********************************************/
- /* Buffers etc used by the new bitstream V4 */
- /********************************************/
- SKP_int q[ MAX_FRAME_LENGTH * MAX_FRAMES_PER_PACKET ]; /* pulse signal buffer */
- SKP_int q_LBRR[ MAX_FRAME_LENGTH * MAX_FRAMES_PER_PACKET ]; /* pulse signal buffer */
- SKP_int sigtype[ MAX_FRAMES_PER_PACKET ];
- SKP_int QuantOffsetType[ MAX_FRAMES_PER_PACKET ];
- SKP_int extension_layer; /* Add extension layer */
- SKP_int bitstream_v; /* Holds bitstream version */
-} SKP_Silk_encoder_state;
-
-
-/************************/
-/* Encoder control */
-/************************/
-typedef struct {
- /* Quantization indices */
- SKP_int lagIndex;
- SKP_int contourIndex;
- SKP_int PERIndex;
- SKP_int LTPIndex[ NB_SUBFR ];
- SKP_int NLSFIndices[ NLSF_MSVQ_MAX_CB_STAGES ]; /* NLSF path of quantized LSF vector */
- SKP_int NLSFInterpCoef_Q2;
- SKP_int GainsIndices[ NB_SUBFR ];
- SKP_int32 Seed;
- SKP_int LTP_scaleIndex;
- SKP_int RateLevelIndex;
- SKP_int QuantOffsetType;
- SKP_int sigtype;
-
- /* Prediction and coding parameters */
- SKP_int pitchL[ NB_SUBFR ];
-
- SKP_int LBRR_usage; /* Low bitrate redundancy usage */
-} SKP_Silk_encoder_control;
-
-/* Struct for Packet Loss Concealment */
-typedef struct {
- SKP_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */
- SKP_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */
- SKP_int16 prevLPC_Q12[ MAX_LPC_ORDER ];
- SKP_int last_frame_lost; /* Was previous frame lost */
- SKP_int32 rand_seed; /* Seed for unvoiced signal generation */
- SKP_int16 randScale_Q14; /* Scaling of unvoiced random signal */
- SKP_int32 conc_energy;
- SKP_int conc_energy_shift;
- SKP_int16 prevLTP_scale_Q14;
- SKP_int32 prevGain_Q16[ NB_SUBFR ];
- SKP_int fs_kHz;
-} SKP_Silk_PLC_struct;
-
-/* Struct for CNG */
-typedef struct {
- SKP_int32 CNG_exc_buf_Q10[ MAX_FRAME_LENGTH ];
- SKP_int CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ];
- SKP_int32 CNG_synth_state[ MAX_LPC_ORDER ];
- SKP_int32 CNG_smth_Gain_Q16;
- SKP_int32 rand_seed;
- SKP_int fs_kHz;
-} SKP_Silk_CNG_struct;
-
-/********************************/
-/* Decoder state */
-/********************************/
-typedef struct {
- SKP_Silk_range_coder_state sRC; /* Range coder state */
- SKP_int32 prev_inv_gain_Q16;
- SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ];
- SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + MAX_LPC_ORDER ];
- SKP_int32 exc_Q10[ MAX_FRAME_LENGTH ];
- SKP_int32 res_Q10[ MAX_FRAME_LENGTH ];
- SKP_int16 outBuf[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for output signal */
- SKP_int sLTP_buf_idx; /* LTP_buf_index */
- SKP_int lagPrev; /* Previous Lag */
- SKP_int LastGainIndex; /* Previous gain index */
- SKP_int LastGainIndex_EnhLayer; /* Previous gain index */
- SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */
- SKP_int32 HPState[ DEC_HP_ORDER ]; /* HP filter state */
- const SKP_int16 *HP_A; /* HP filter AR coefficients */
- const SKP_int16 *HP_B; /* HP filter MA coefficients */
- SKP_int fs_kHz; /* Sampling frequency in kHz */
- SKP_int frame_length; /* Frame length (samples) */
- SKP_int subfr_length; /* Subframe length (samples) */
- SKP_int LPC_order; /* LPC order */
- SKP_int prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */
- SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */
-
- /* For buffering payload in case of more frames per packet */
- SKP_int nBytesLeft;
- SKP_int nFramesDecoded;
- SKP_int nFramesInPacket;
- SKP_int moreInternalDecoderFrames;
- SKP_int FrameTermination;
-
- SKP_int32 resampleState[ 15 ];
-
- const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
-
- SKP_int sigtype[ MAX_FRAMES_PER_PACKET ];
- SKP_int QuantOffsetType[ MAX_FRAMES_PER_PACKET ];
- SKP_int GainsIndices[ MAX_FRAMES_PER_PACKET ][ NB_SUBFR ];
- SKP_int GainsIndices_EnhLayer[ MAX_FRAMES_PER_PACKET ][ NB_SUBFR ];
- SKP_int NLSFIndices[ MAX_FRAMES_PER_PACKET ][ NLSF_MSVQ_MAX_CB_STAGES ];
- SKP_int NLSFInterpCoef_Q2[ MAX_FRAMES_PER_PACKET ];
- SKP_int lagIndex[ MAX_FRAMES_PER_PACKET ];
- SKP_int contourIndex[ MAX_FRAMES_PER_PACKET ];
- SKP_int PERIndex[ MAX_FRAMES_PER_PACKET ];
- SKP_int LTPIndex[ MAX_FRAMES_PER_PACKET ][ NB_SUBFR ];
- SKP_int LTP_scaleIndex[ MAX_FRAMES_PER_PACKET ];
- SKP_int Seed[ MAX_FRAMES_PER_PACKET ];
- SKP_int vadFlagBuf[ MAX_FRAMES_PER_PACKET ];
-
- /* Parameters used to investigate if inband FEC is used */
- SKP_int vadFlag;
- SKP_int no_FEC_counter; /* Counts number of frames wo inband FEC */
- SKP_int inband_FEC_offset; /* 0: no FEC, 1: FEC with 1 packet offset, 2: FEC w 2 packets offset */
-
- /* CNG state */
- SKP_Silk_CNG_struct sCNG;
-
- /* Stuff used for PLC */
- SKP_Silk_PLC_struct sPLC;
- SKP_int lossCnt;
- SKP_int prev_sigtype; /* Previous sigtype */
-#ifdef USE_INTERPOLATION_PLC
- SKP_int16 prevQuant[ MAX_FRAME_LENGTH ];
- SKP_int prevPitchL[ NB_SUBFR ]; /* Previous Lags used */
- SKP_int16 prevLTPCoef_Q14[ NB_SUBFR * LTP_ORDER ]; /* Previous LTCoefs used */
- SKP_int16 prevAR_Q12[ MAX_LPC_ORDER ];
- SKP_int interpolDistance; /* Number of frames between old and new recieved packet */
-#endif
-
-
-
-
- SKP_int bitstream_v; /* Holds bitstream version */
-} SKP_Silk_decoder_state;
-
-/************************/
-/* Decoder control */
-/************************/
-typedef struct {
- /* prediction and coding parameters */
- SKP_int pitchL[ NB_SUBFR ];
- SKP_int32 Gains_Q16[ NB_SUBFR ];
- SKP_int32 Seed;
- /* holds interpolated and final coefficients, 4-byte aligned */
- SKP_array_of_int16_4_byte_aligned( PredCoef_Q12[ 2 ], MAX_LPC_ORDER );
- SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ];
- SKP_int LTP_scale_Q14;
-
- /* quantization indices */
- SKP_int PERIndex;
- SKP_int RateLevelIndex;
- SKP_int QuantOffsetType;
- SKP_int sigtype;
- SKP_int NLSFInterpCoef_Q2;
-} SKP_Silk_decoder_control;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/SKP_Silk_structs_FIX.h
+++ /dev/null
@@ -1,195 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_STRUCTS_FIX_H
-#define SKP_SILK_STRUCTS_FIX_H
-
-#include "SKP_Silk_typedef.h"
-#include "SKP_Silk_define_FIX.h"
-#include "SKP_Silk_main.h"
-#include "SKP_Silk_structs.h"
-
-#if LOW_COMPLEXITY_ONLY
-#include "SKP_Silk_resample_rom.h"
-#endif
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/********************************/
-/* Noise shaping analysis state */
-/********************************/
-typedef struct {
- SKP_int LastGainIndex;
- SKP_int32 HarmBoost_smth_Q16;
- SKP_int32 HarmShapeGain_smth_Q16;
- SKP_int32 Tilt_smth_Q16;
-} SKP_Silk_shape_state_FIX;
-
-/********************************/
-/* Prefilter state */
-/********************************/
-typedef struct {
- SKP_int16 sLTP_shp1[ LTP_BUF_LENGTH ];
- SKP_int32 sAR_shp2_Q14[ SHAPE_LPC_ORDER_MAX ];
- SKP_int16 sLTP_shp2_FIX[ LTP_BUF_LENGTH ];
- SKP_int sLTP_shp_buf_idx1;
- SKP_int sAR_shp_buf_idx2;
- SKP_int sLTP_shp_buf_idx2;
- SKP_int32 sLF_AR_shp1_Q12;
- SKP_int32 sLF_MA_shp1_Q12;
- SKP_int32 sLF_AR_shp2_Q12;
- SKP_int32 sLF_MA_shp2_Q12;
- SKP_int sHarmHP;
- SKP_int32 rand_seed;
- SKP_int lagPrev;
-} SKP_Silk_prefilter_state_FIX;
-
-/*****************************/
-/* Prediction analysis state */
-/*****************************/
-typedef struct {
- SKP_int pitch_LPC_win_length;
- SKP_int min_pitch_lag; /* Lowest possible pitch lag (samples) */
- SKP_int max_pitch_lag; /* Highest possible pitch lag (samples) */
- SKP_int prev_NLSFq_Q15[ MAX_LPC_ORDER ]; /* Prev. quant. normalized LSF vector */
-} SKP_Silk_predict_state_FIX;
-
-#if( defined( SAVE_ALL_INTERNAL_DATA ) || defined( USE_FLT2FIX_WRAPPER ) )
-/*******************************************/
-/* Structure containing NLSF MSVQ codebook */
-/*******************************************/
-/* structure for one stage of MSVQ */
-typedef struct {
- const SKP_int32 nVectors;
- const SKP_float *CB;
- const SKP_float *Rates;
-} SKP_Silk_NLSF_CBS_FLP_TMP;
-
-typedef struct {
- const SKP_int32 nStages;
-
- /* fields for (de)quantizing */
- const SKP_Silk_NLSF_CBS_FLP_TMP *CBStages;
- const SKP_float *NDeltaMin;
-
- /* fields for arithmetic (de)coding */
- const SKP_uint16 *CDF;
- const SKP_uint16 * const *StartPtr;
- const SKP_int *MiddleIx;
-} SKP_Silk_NLSF_CB_struct_FLP_TMP;
-#endif
-
-/********************************/
-/* Encoder state FIX */
-/********************************/
-typedef struct {
- SKP_Silk_encoder_state sCmn; /* Common struct, shared with floating-point code */
-
-#if HIGH_PASS_INPUT
- SKP_int32 variable_HP_smth1_Q15; /* State of first smoother */
- SKP_int32 variable_HP_smth2_Q15; /* State of second smoother */
-#endif
- SKP_Silk_shape_state_FIX sShape; /* Shape state */
- SKP_Silk_prefilter_state_FIX sPrefilt; /* Prefilter State */
- SKP_Silk_predict_state_FIX sPred; /* Prediction state */
- SKP_Silk_nsq_state sNSQ; /* Noise Shape Quantizer State */
- SKP_Silk_nsq_state sNSQ_LBRR; /* Noise Shape Quantizer State ( for low bitrate redundancy ) */
-
- /* Function pointer to noise shaping quantizer (will be set to SKP_Silk_NSQ or SKP_Silk_NSQ_del_dec) */
- void (* NoiseShapingQuantizer)( SKP_Silk_encoder_state *, SKP_Silk_encoder_control *, SKP_Silk_nsq_state *, const SKP_int16 *,
- SKP_int *, const SKP_int, const SKP_int16 *, const SKP_int16 *, const SKP_int16 *, const SKP_int *,
- const SKP_int *, const SKP_int32 *, const SKP_int32 *, SKP_int, const SKP_int
- );
-
- /* Buffer for find pitch and noise shape analysis */
- SKP_array_of_int16_4_byte_aligned( x_buf, 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX );
- SKP_int LTPCorr_Q15; /* Normalized correlation from pitch lag estimator */
- SKP_int mu_LTP_Q8; /* Rate-distortion tradeoff in LTP quantization */
- SKP_int32 SNR_dB_Q7; /* Quality setting */
- SKP_int32 avgGain_Q16; /* average gain during active speech */
- SKP_int32 avgGain_Q16_one_bit_per_sample; /* average gain during active speech */
- SKP_int BufferedInChannel_ms; /* Simulated number of ms buffer because of exceeded TargetRate_bps */
- SKP_int speech_activity_Q8; /* Speech activity in Q8 */
- SKP_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */
-
- /* Parameters For LTP scaling Control */
- SKP_int prevLTPredCodGain_Q7;
- SKP_int HPLTPredCodGain_Q7;
-
- SKP_int32 inBandFEC_SNR_comp_Q8; /* Compensation to SNR_dB when using inband FEC Voiced */
-
-#ifdef USE_FLT2FIX_WRAPPER
- const SKP_Silk_NLSF_CB_struct_FLP_TMP *psNLSF_CB_FLP[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
-#endif
-} SKP_Silk_encoder_state_FIX;
-
-/************************/
-/* Encoder control FIX */
-/************************/
-typedef struct {
- SKP_Silk_encoder_control sCmn; /* Common struct, shared with floating-point code */
-
- /* Prediction and coding parameters */
- SKP_int32 Gains_Q16[ NB_SUBFR ];
- SKP_array_of_int16_4_byte_aligned( PredCoef_Q12[ 2 ], MAX_LPC_ORDER );
- SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ];
- SKP_int LTP_scale_Q14;
-
- /* Noise shaping parameters */
- /* Testing */
- SKP_array_of_int16_4_byte_aligned( AR1_Q13, NB_SUBFR * SHAPE_LPC_ORDER_MAX );
- SKP_array_of_int16_4_byte_aligned( AR2_Q13, NB_SUBFR * SHAPE_LPC_ORDER_MAX );
- SKP_int32 LF_shp_Q14[ NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */
- SKP_int GainsPre_Q14[ NB_SUBFR ];
- SKP_int HarmBoost_Q14[ NB_SUBFR ];
- SKP_int Tilt_Q14[ NB_SUBFR ];
- SKP_int HarmShapeGain_Q14[ NB_SUBFR ];
- SKP_int Lambda_Q10;
- SKP_int input_quality_Q14;
- SKP_int coding_quality_Q14;
- SKP_int32 pitch_freq_low_Hz;
- SKP_int current_SNR_dB_Q7;
-
- /* measures */
- SKP_int sparseness_Q8;
- SKP_int LTPredCodGain_Q7;
- SKP_int input_quality_bands_Q15[ VAD_N_BANDS ];
- SKP_int input_tilt_Q15;
- SKP_int32 ResNrg[ NB_SUBFR ]; /* Residual energy per subframe */
- SKP_int ResNrgQ[ NB_SUBFR ]; /* Q domain for the residual energy > 0 */
-
-} SKP_Silk_encoder_control_FIX;
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/SKP_Silk_sum_sqr_shift.c
+++ /dev/null
@@ -1,98 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/* *
- * SKP_Silk_sum_sqr_shift.c *
- * *
- * compute number of bits to right shift the sum of squares of a vector *
- * of int16s to make it fit in an int32 *
- * *
- * Copyright 2006-2008 (c), Skype Limited *
- * */
-#include "SKP_Silk_SigProc_FIX.h"
-/* Compute number of bits to right shift the sum of squares of a vector */
-/* of int16s to make it fit in an int32 */
-void SKP_Silk_sum_sqr_shift(
- SKP_int32 *energy, /* O Energy of x, after shifting to the right */
- SKP_int *shift, /* O Number of bits right shift applied to energy */
- const SKP_int16 *x, /* I Input vector */
- SKP_int len /* I Length of input vector */
-)
-{
- SKP_int i, shft;
- SKP_int32 in32, nrg_tmp, nrg;
-
- if( (SKP_int32)( (SKP_int_ptr_size)x & 2 ) != 0 ) {
- /* Input is not 4-byte aligned */
- nrg = SKP_SMULBB( x[ 0 ], x[ 0 ] );
- i = 1;
- } else {
- nrg = 0;
- i = 0;
- }
- shft = 0;
- len--;
- for( ; i < len; i += 2 ) {
- /* Load two values at once */
- in32 = *( (SKP_int32 *)&x[ i ] );
- nrg = SKP_SMLABB_ovflw( nrg, in32, in32 );
- nrg = SKP_SMLATT_ovflw( nrg, in32, in32 );
- if( nrg < 0 ) {
- /* Scale down */
- nrg = (SKP_int32)SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 );
- shft = 2;
- break;
- }
- }
- for( ; i < len; i += 2 ) {
- /* Load two values at once */
- in32 = *( (SKP_int32 *)&x[ i ] );
- nrg_tmp = SKP_SMULBB( in32, in32 );
- nrg_tmp = SKP_SMLATT_ovflw( nrg_tmp, in32, in32 );
- nrg = (SKP_int32)SKP_ADD_RSHIFT_uint( nrg, (SKP_uint32)nrg_tmp, shft );
- if( nrg < 0 ) {
- /* Scale down */
- nrg = (SKP_int32)SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 );
- shft += 2;
- }
- }
- if( i == len ) {
- /* One sample left to process */
- nrg_tmp = SKP_SMULBB( x[ i ], x[ i ] );
- nrg = (SKP_int32)SKP_ADD_RSHIFT_uint( nrg, nrg_tmp, shft );
- }
-
- /* Make sure to have at least one extra leading zero (two leading zeros in total) */
- if( nrg & 0xC0000000 ) {
- nrg = SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 );
- shft += 2;
- }
-
- /* Output arguments */
- *shift = shft;
- *energy = nrg;
-}
--- a/src/SKP_Silk_tables.h
+++ /dev/null
@@ -1,171 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_TABLES_H
-#define SKP_SILK_TABLES_H
-
-#include "SKP_Silk_define.h"
-#include "SKP_Silk_structs.h"
-
-#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */
-#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* entropy coding tables */
-extern const SKP_uint16 SKP_Silk_type_offset_CDF[ 5 ]; /* 5 */
-extern const SKP_uint16 SKP_Silk_type_offset_joint_CDF[ 4 ][ 5 ]; /* 20 */
-extern const SKP_int SKP_Silk_type_offset_CDF_offset;
-
-extern const SKP_uint16 SKP_Silk_gain_CDF[ 2 ][ N_LEVELS_QGAIN + 1 ]; /* 130 */
-extern const SKP_int SKP_Silk_gain_CDF_offset;
-extern const SKP_uint16 SKP_Silk_delta_gain_CDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 2 ]; /* 46 */
-extern const SKP_int SKP_Silk_delta_gain_CDF_offset;
-
-extern const SKP_uint16 SKP_Silk_pitch_lag_NB_CDF[ 8 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 130 */
-extern const SKP_int SKP_Silk_pitch_lag_NB_CDF_offset;
-extern const SKP_uint16 SKP_Silk_pitch_lag_MB_CDF[ 12 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 194 */
-extern const SKP_int SKP_Silk_pitch_lag_MB_CDF_offset;
-extern const SKP_uint16 SKP_Silk_pitch_lag_WB_CDF[ 16 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 258 */
-extern const SKP_int SKP_Silk_pitch_lag_WB_CDF_offset;
-extern const SKP_uint16 SKP_Silk_pitch_lag_SWB_CDF[ 24 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 386 */
-extern const SKP_int SKP_Silk_pitch_lag_SWB_CDF_offset;
-
-extern const SKP_uint16 SKP_Silk_pitch_contour_CDF[ 35 ]; /* 35 */
-extern const SKP_int SKP_Silk_pitch_contour_CDF_offset;
-extern const SKP_uint16 SKP_Silk_pitch_contour_NB_CDF[ 12 ]; /* 12 */
-extern const SKP_int SKP_Silk_pitch_contour_NB_CDF_offset;
-extern const SKP_uint16 SKP_Silk_pitch_delta_CDF[23]; /* 23 */
-extern const SKP_int SKP_Silk_pitch_delta_CDF_offset;
-
-extern const SKP_uint16 SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS ][ MAX_PULSES + 3 ]; /* 210 */
-extern const SKP_int SKP_Silk_pulses_per_block_CDF_offset;
-extern const SKP_int16 SKP_Silk_pulses_per_block_BITS_Q6[ N_RATE_LEVELS - 1 ][ MAX_PULSES + 2 ]; /* 180 */
-
-extern const SKP_uint16 SKP_Silk_rate_levels_CDF[ 2 ][ N_RATE_LEVELS ]; /* 20 */
-extern const SKP_int SKP_Silk_rate_levels_CDF_offset;
-extern const SKP_int16 SKP_Silk_rate_levels_BITS_Q6[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */
-
-extern const SKP_int SKP_Silk_max_pulses_table[ 4 ]; /* 4 */
-
-extern const SKP_uint16 SKP_Silk_shell_code_table0[ 33 ]; /* 33 */
-extern const SKP_uint16 SKP_Silk_shell_code_table1[ 52 ]; /* 52 */
-extern const SKP_uint16 SKP_Silk_shell_code_table2[ 102 ]; /* 102 */
-extern const SKP_uint16 SKP_Silk_shell_code_table3[ 207 ]; /* 207 */
-extern const SKP_uint16 SKP_Silk_shell_code_table_offsets[ 19 ]; /* 19 */
-
-extern const SKP_uint16 SKP_Silk_lsb_CDF[ 3 ]; /* 3 */
-
-extern const SKP_uint16 SKP_Silk_sign_CDF[ 36 ][ 3 ]; /* 108 */
-
-extern const SKP_uint16 SKP_Silk_LTP_per_index_CDF[ 4 ]; /* 4 */
-extern const SKP_int SKP_Silk_LTP_per_index_CDF_offset;
-extern const SKP_int16 * const SKP_Silk_LTP_gain_BITS_Q6_ptrs[ NB_LTP_CBKS ]; /* 3 */
-extern const SKP_uint16 * const SKP_Silk_LTP_gain_CDF_ptrs[ NB_LTP_CBKS ]; /* 3 */
-extern const SKP_int SKP_Silk_LTP_gain_CDF_offsets[ NB_LTP_CBKS ]; /* 3 */
-extern const SKP_int32 SKP_Silk_LTP_gain_middle_avg_RD_Q14;
-extern const SKP_uint16 SKP_Silk_LTPscale_CDF[ 4 ]; /* 4 */
-extern const SKP_int SKP_Silk_LTPscale_offset;
-
-/* Tables for LTPScale */
-extern const SKP_int16 SKP_Silk_LTPScales_table_Q14[ 3 ];
-
-extern const SKP_uint16 SKP_Silk_vadflag_CDF[ 3 ]; /* 3 */
-extern const SKP_int SKP_Silk_vadflag_offset;
-
-extern const SKP_int SKP_Silk_SamplingRates_table[ 4 ]; /* 4 */
-extern const SKP_uint16 SKP_Silk_SamplingRates_CDF[ 5 ]; /* 5 */
-extern const SKP_int SKP_Silk_SamplingRates_offset;
-
-extern const SKP_uint16 SKP_Silk_NLSF_interpolation_factor_CDF[ 6 ];
-extern const SKP_int SKP_Silk_NLSF_interpolation_factor_offset;
-
-/* NLSF codebooks */
-extern const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_16, SKP_Silk_NLSF_CB1_16;
-extern const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_10, SKP_Silk_NLSF_CB1_10;
-
-/* quantization tables */
-extern const SKP_int16 * const SKP_Silk_LTP_vq_ptrs_Q14[ NB_LTP_CBKS ]; /* 168 */
-extern const SKP_int SKP_Silk_LTP_vq_sizes[ NB_LTP_CBKS ]; /* 3 */
-
-/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */
-extern const SKP_int32 TargetRate_table_NB[ TARGET_RATE_TAB_SZ ];
-extern const SKP_int32 TargetRate_table_MB[ TARGET_RATE_TAB_SZ ];
-extern const SKP_int32 TargetRate_table_WB[ TARGET_RATE_TAB_SZ ];
-extern const SKP_int32 TargetRate_table_SWB[ TARGET_RATE_TAB_SZ ];
-extern const SKP_int32 SNR_table_Q1[ TARGET_RATE_TAB_SZ ];
-
-extern const SKP_int32 SNR_table_one_bit_per_sample_Q7[ 4 ];
-
-/* Filter coeficicnts for HP filter: 4. Order filter implementad as two biquad filters */
-extern const SKP_int16 SKP_Silk_SWB_detect_B_HP_Q13[ NB_SOS ][ 3 ];
-extern const SKP_int16 SKP_Silk_SWB_detect_A_HP_Q13[ NB_SOS ][ 2 ];
-
-/* Decoder high-pass filter coefficients for 24 kHz sampling */
-extern const SKP_int16 SKP_Silk_Dec_A_HP_24[ DEC_HP_ORDER ]; /* 2 */
-extern const SKP_int16 SKP_Silk_Dec_B_HP_24[ DEC_HP_ORDER + 1 ]; /* 3 */
-
-/* Decoder high-pass filter coefficients for 16 kHz sampling */
-extern const SKP_int16 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ]; /* 2 */
-extern const SKP_int16 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ]; /* 3 */
-
-/* Decoder high-pass filter coefficients for 12 kHz sampling */
-extern const SKP_int16 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ]; /* 2 */
-extern const SKP_int16 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ]; /* 3 */
-
-/* Decoder high-pass filter coefficients for 8 kHz sampling */
-extern const SKP_int16 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ]; /* 2 */
-extern const SKP_int16 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ]; /* 3 */
-
-/* Table for frame termination indication */
-extern const SKP_uint16 SKP_Silk_FrameTermination_CDF[ 5 ];
-extern const SKP_int SKP_Silk_FrameTermination_offset;
-
-extern const SKP_uint16 SKP_Silk_FrameTermination_v4_CDF[ 6 ];
-extern const SKP_int SKP_Silk_FrameTermination_v4_offset;
-
-/* Table for random seed */
-extern const SKP_uint16 SKP_Silk_Seed_CDF[ 5 ];
-extern const SKP_int SKP_Silk_Seed_offset;
-
-/* Quantization offsets */
-extern const SKP_int16 SKP_Silk_Quantization_Offsets_Q10[ 2 ][ 2 ];
-
-#if SWITCH_TRANSITION_FILTERING
-/* Interpolation points for filter coefficients used in the bandwidth transition smoother */
-extern const SKP_int32 SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ];
-extern const SKP_int32 SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ];
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/SKP_Silk_tables_LTP.c
+++ /dev/null
@@ -1,324 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_tables.h"
-
-const SKP_uint16 SKP_Silk_LTP_per_index_CDF[ 4 ] = {
- 0, 20992, 40788, 65535
-};
-
-const SKP_int SKP_Silk_LTP_per_index_CDF_offset = 1;
-
-
-const SKP_uint16 SKP_Silk_LTP_gain_CDF_0[ 11 ] = {
- 0, 49380, 54463, 56494, 58437, 60101, 61683, 62985,
- 64066, 64823, 65535
-};
-
-const SKP_uint16 SKP_Silk_LTP_gain_CDF_1[ 21 ] = {
- 0, 25290, 30654, 35710, 40386, 42937, 45250, 47459,
- 49411, 51348, 52974, 54517, 55976, 57423, 58865, 60285,
- 61667, 62895, 63827, 64724, 65535
-};
-
-const SKP_uint16 SKP_Silk_LTP_gain_CDF_2[ 41 ] = {
- 0, 4958, 9439, 13581, 17638, 21651, 25015, 28025,
- 30287, 32406, 34330, 36240, 38130, 39790, 41281, 42764,
- 44229, 45676, 47081, 48431, 49675, 50849, 51932, 52966,
- 53957, 54936, 55869, 56789, 57708, 58504, 59285, 60043,
- 60796, 61542, 62218, 62871, 63483, 64076, 64583, 65062,
- 65535
-};
-
-const SKP_int SKP_Silk_LTP_gain_CDF_offsets[ 3 ] = {
- 1, 3, 10
-};
-
-const SKP_int32 SKP_Silk_LTP_gain_middle_avg_RD_Q14 = 11010;
-
-const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_0[ 10 ] = {
- 26, 236, 321, 325, 339, 344, 362, 379,
- 412, 418
-};
-
-const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_1[ 20 ] = {
- 88, 231, 237, 244, 300, 309, 313, 324,
- 325, 341, 346, 351, 352, 352, 354, 356,
- 367, 393, 396, 406
-};
-
-const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_2[ 40 ] = {
- 238, 248, 255, 257, 258, 274, 284, 311,
- 317, 326, 326, 327, 339, 349, 350, 351,
- 352, 355, 358, 366, 371, 379, 383, 387,
- 388, 393, 394, 394, 407, 409, 412, 412,
- 413, 422, 426, 432, 434, 449, 454, 455
-};
-
-const SKP_uint16 * const SKP_Silk_LTP_gain_CDF_ptrs[ NB_LTP_CBKS ] = {
- SKP_Silk_LTP_gain_CDF_0,
- SKP_Silk_LTP_gain_CDF_1,
- SKP_Silk_LTP_gain_CDF_2
-};
-
-const SKP_int16 * const SKP_Silk_LTP_gain_BITS_Q6_ptrs[ NB_LTP_CBKS ] = {
- SKP_Silk_LTP_gain_BITS_Q6_0,
- SKP_Silk_LTP_gain_BITS_Q6_1,
- SKP_Silk_LTP_gain_BITS_Q6_2
-};
-
-const SKP_int16 SKP_Silk_LTP_gain_vq_0_Q14[ 10 ][ 5 ] =
-{
-{
- 594, 984, 2840, 1021, 669
-},
-{
- 10, 35, 304, -1, 23
-},
-{
- -694, 1923, 4603, 2975, 2335
-},
-{
- 2437, 3176, 3778, 1940, 481
-},
-{
- 214, -46, 7870, 4406, -521
-},
-{
- -896, 4818, 8501, 1623, -887
-},
-{
- -696, 3178, 6480, -302, 1081
-},
-{
- 517, 599, 1002, 567, 560
-},
-{
- -2075, -834, 4712, -340, 896
-},
-{
- 1435, -644, 3993, -612, -2063
-}
-};
-
-const SKP_int16 SKP_Silk_LTP_gain_vq_1_Q14[ 20 ][ 5 ] =
-{
-{
- 1655, 2918, 5001, 3010, 1775
-},
-{
- 113, 198, 856, 176, 178
-},
-{
- -843, 2479, 7858, 5371, 574
-},
-{
- 59, 5356, 7648, 2850, -315
-},
-{
- 3840, 4851, 6527, 1583, -1233
-},
-{
- 1620, 1760, 2330, 1876, 2045
-},
-{
- -545, 1854, 11792, 1547, -307
-},
-{
- -604, 689, 5369, 5074, 4265
-},
-{
- 521, -1331, 9829, 6209, -1211
-},
-{
- -1315, 6747, 9929, -1410, 546
-},
-{
- 117, -144, 2810, 1649, 5240
-},
-{
- 5392, 3476, 2425, -38, 633
-},
-{
- 14, -449, 5274, 3547, -171
-},
-{
- -98, 395, 9114, 1676, 844
-},
-{
- -908, 3843, 8861, -957, 1474
-},
-{
- 396, 6747, 5379, -329, 1269
-},
-{
- -335, 2830, 4281, 270, -54
-},
-{
- 1502, 5609, 8958, 6045, 2059
-},
-{
- -370, 479, 5267, 5726, 1174
-},
-{
- 5237, -1144, 6510, 455, 512
-}
-};
-
-const SKP_int16 SKP_Silk_LTP_gain_vq_2_Q14[ 40 ][ 5 ] =
-{
-{
- -278, 415, 9345, 7106, -431
-},
-{
- -1006, 3863, 9524, 4724, -871
-},
-{
- -954, 4624, 11722, 973, -300
-},
-{
- -117, 7066, 8331, 1959, -901
-},
-{
- 593, 3412, 6070, 4914, 1567
-},
-{
- 54, -51, 12618, 4228, -844
-},
-{
- 3157, 4822, 5229, 2313, 717
-},
-{
- -244, 1161, 14198, 779, 69
-},
-{
- -1218, 5603, 12894, -2301, 1001
-},
-{
- -132, 3960, 9526, 577, 1806
-},
-{
- -1633, 8815, 10484, -2452, 895
-},
-{
- 235, 450, 1243, 667, 437
-},
-{
- 959, -2630, 10897, 8772, -1852
-},
-{
- 2420, 2046, 8893, 4427, -1569
-},
-{
- 23, 7091, 8356, -1285, 1508
-},
-{
- -1133, 835, 7662, 6043, 2800
-},
-{
- 439, 391, 11016, 2253, 1362
-},
-{
- -1020, 2876, 13436, 4015, -3020
-},
-{
- 1060, -2690, 13512, 5565, -1394
-},
-{
- -1420, 8007, 11421, -152, -1672
-},
-{
- -893, 2895, 15434, -1490, 159
-},
-{
- -1054, 428, 12208, 8538, -3344
-},
-{
- 1772, -1304, 7593, 6185, 561
-},
-{
- 525, -1207, 6659, 11151, -1170
-},
-{
- 439, 2667, 4743, 2359, 5515
-},
-{
- 2951, 7432, 7909, -230, -1564
-},
-{
- -72, 2140, 5477, 1391, 1580
-},
-{
- 476, -1312, 15912, 2174, -1027
-},
-{
- 5737, 441, 2493, 2043, 2757
-},
-{
- 228, -43, 1803, 6663, 7064
-},
-{
- 4596, 9182, 1917, -200, 203
-},
-{
- -704, 12039, 5451, -1188, 542
-},
-{
- 1782, -1040, 10078, 7513, -2767
-},
-{
- -2626, 7747, 9019, 62, 1710
-},
-{
- 235, -233, 2954, 10921, 1947
-},
-{
- 10854, 2814, 1232, -111, 222
-},
-{
- 2267, 2778, 12325, 156, -1658
-},
-{
- -2950, 8095, 16330, 268, -3626
-},
-{
- 67, 2083, 7950, -80, -2432
-},
-{
- 518, -66, 1718, 415, 11435
-}
-};
-
-const SKP_int16 * const SKP_Silk_LTP_vq_ptrs_Q14[ NB_LTP_CBKS ] = {
- &SKP_Silk_LTP_gain_vq_0_Q14[ 0 ][ 0 ],
- &SKP_Silk_LTP_gain_vq_1_Q14[ 0 ][ 0 ],
- &SKP_Silk_LTP_gain_vq_2_Q14[ 0 ][ 0 ]
-};
-
-const SKP_int SKP_Silk_LTP_vq_sizes[ NB_LTP_CBKS ] = {
- 10, 20, 40
-};
--- a/src/SKP_Silk_tables_NLSF_CB0_10.c
+++ /dev/null
@@ -1,889 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/**********************************************/
-/* This file has been automatically generated */
-/* */
-/* ROM usage: 138+1331 Words */
-/**********************************************/
-
-#include "SKP_Silk_structs.h"
-#include "SKP_Silk_tables_NLSF_CB0_10.h"
-
-const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS + NLSF_MSVQ_CB0_10_STAGES ] =
-{
- 0,
- 2658,
- 4420,
- 6107,
- 7757,
- 9408,
- 10955,
- 12502,
- 13983,
- 15432,
- 16882,
- 18331,
- 19750,
- 21108,
- 22409,
- 23709,
- 25010,
- 26256,
- 27501,
- 28747,
- 29965,
- 31158,
- 32351,
- 33544,
- 34736,
- 35904,
- 36997,
- 38091,
- 39185,
- 40232,
- 41280,
- 42327,
- 43308,
- 44290,
- 45271,
- 46232,
- 47192,
- 48132,
- 49032,
- 49913,
- 50775,
- 51618,
- 52462,
- 53287,
- 54095,
- 54885,
- 55675,
- 56449,
- 57222,
- 57979,
- 58688,
- 59382,
- 60076,
- 60726,
- 61363,
- 61946,
- 62505,
- 63052,
- 63543,
- 63983,
- 64396,
- 64766,
- 65023,
- 65279,
- 65535,
- 0,
- 4977,
- 9542,
- 14106,
- 18671,
- 23041,
- 27319,
- 31596,
- 35873,
- 39969,
- 43891,
- 47813,
- 51652,
- 55490,
- 59009,
- 62307,
- 65535,
- 0,
- 8571,
- 17142,
- 25529,
- 33917,
- 42124,
- 49984,
- 57844,
- 65535,
- 0,
- 8732,
- 17463,
- 25825,
- 34007,
- 42189,
- 50196,
- 58032,
- 65535,
- 0,
- 8948,
- 17704,
- 25733,
- 33762,
- 41791,
- 49821,
- 57678,
- 65535,
- 0,
- 4374,
- 8655,
- 12936,
- 17125,
- 21313,
- 25413,
- 29512,
- 33611,
- 37710,
- 41809,
- 45820,
- 49832,
- 53843,
- 57768,
- 61694,
- 65535
-};
-
-const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr[ NLSF_MSVQ_CB0_10_STAGES ] =
-{
- &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 0 ],
- &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 65 ],
- &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 82 ],
- &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 91 ],
- &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 100 ],
- &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 109 ]
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx[ NLSF_MSVQ_CB0_10_STAGES ] =
-{
- 23,
- 8,
- 5,
- 5,
- 5,
- 9
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ NLSF_MSVQ_CB0_10_VECTORS ] =
-{
- 148, 167,
- 169, 170,
- 170, 173,
- 173, 175,
- 176, 176,
- 176, 177,
- 179, 181,
- 181, 181,
- 183, 183,
- 183, 184,
- 185, 185,
- 185, 185,
- 186, 189,
- 189, 189,
- 191, 191,
- 191, 194,
- 194, 194,
- 195, 195,
- 196, 198,
- 199, 200,
- 201, 201,
- 202, 203,
- 204, 204,
- 205, 205,
- 206, 209,
- 210, 210,
- 213, 214,
- 218, 220,
- 221, 226,
- 231, 234,
- 239, 256,
- 256, 256,
- 119, 123,
- 123, 123,
- 125, 126,
- 126, 126,
- 128, 130,
- 130, 131,
- 131, 135,
- 138, 139,
- 94, 94,
- 95, 95,
- 96, 98,
- 98, 99,
- 93, 93,
- 95, 96,
- 96, 97,
- 98, 100,
- 92, 93,
- 97, 97,
- 97, 97,
- 98, 98,
- 125, 126,
- 126, 127,
- 127, 128,
- 128, 128,
- 128, 128,
- 129, 129,
- 129, 130,
- 130, 131
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min_Q15[ 10 + 1 ] =
-{
- 563,
- 3,
- 22,
- 20,
- 3,
- 3,
- 132,
- 119,
- 358,
- 86,
- 964
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * NLSF_MSVQ_CB0_10_VECTORS ] =
-{
- 2210, 4023,
- 6981, 9260,
- 12573, 15687,
- 19207, 22383,
- 25981, 29142,
- 3285, 4172,
- 6116, 10856,
- 15289, 16826,
- 19701, 22010,
- 24721, 29313,
- 1554, 2511,
- 6577, 10337,
- 13837, 16511,
- 20086, 23214,
- 26480, 29464,
- 3062, 4017,
- 5771, 10037,
- 13365, 14952,
- 20140, 22891,
- 25229, 29603,
- 2085, 3457,
- 5934, 8718,
- 11501, 13670,
- 17997, 21817,
- 24935, 28745,
- 2776, 4093,
- 6421, 10413,
- 15111, 16806,
- 20825, 23826,
- 26308, 29411,
- 2717, 4034,
- 5697, 8463,
- 14301, 16354,
- 19007, 23413,
- 25812, 28506,
- 2872, 3702,
- 5881, 11034,
- 17141, 18879,
- 21146, 23451,
- 25817, 29600,
- 2999, 4015,
- 7357, 11219,
- 12866, 17307,
- 20081, 22644,
- 26774, 29107,
- 2942, 3866,
- 5918, 11915,
- 13909, 16072,
- 20453, 22279,
- 27310, 29826,
- 2271, 3527,
- 6606, 9729,
- 12943, 17382,
- 20224, 22345,
- 24602, 28290,
- 2207, 3310,
- 5844, 9339,
- 11141, 15651,
- 18576, 21177,
- 25551, 28228,
- 3963, 4975,
- 6901, 11588,
- 13466, 15577,
- 19231, 21368,
- 25510, 27759,
- 2749, 3549,
- 6966, 13808,
- 15653, 17645,
- 20090, 22599,
- 26467, 28537,
- 2126, 3504,
- 5109, 9954,
- 12550, 14620,
- 19703, 21687,
- 26457, 29106,
- 3966, 5745,
- 7442, 9757,
- 14468, 16404,
- 19135, 23048,
- 25375, 28391,
- 3197, 4751,
- 6451, 9298,
- 13038, 14874,
- 17962, 20627,
- 23835, 28464,
- 3195, 4081,
- 6499, 12252,
- 14289, 16040,
- 18357, 20730,
- 26980, 29309,
- 1533, 2471,
- 4486, 7796,
- 12332, 15758,
- 19567, 22298,
- 25673, 29051,
- 2002, 2971,
- 4985, 8083,
- 13181, 15435,
- 18237, 21517,
- 24595, 28351,
- 3808, 4925,
- 6710, 10201,
- 12011, 14300,
- 18457, 20391,
- 26525, 28956,
- 2281, 3418,
- 4979, 8726,
- 15964, 18104,
- 20250, 22771,
- 25286, 28954,
- 3051, 5479,
- 7290, 9848,
- 12744, 14503,
- 18665, 23684,
- 26065, 28947,
- 2364, 3565,
- 5502, 9621,
- 14922, 16621,
- 19005, 20996,
- 26310, 29302,
- 4093, 5212,
- 6833, 9880,
- 16303, 18286,
- 20571, 23614,
- 26067, 29128,
- 2941, 3996,
- 6038, 10638,
- 12668, 14451,
- 16798, 19392,
- 26051, 28517,
- 3863, 5212,
- 7019, 9468,
- 11039, 13214,
- 19942, 22344,
- 25126, 29539,
- 4615, 6172,
- 7853, 10252,
- 12611, 14445,
- 19719, 22441,
- 24922, 29341,
- 3566, 4512,
- 6985, 8684,
- 10544, 16097,
- 18058, 22475,
- 26066, 28167,
- 4481, 5489,
- 7432, 11414,
- 13191, 15225,
- 20161, 22258,
- 26484, 29716,
- 3320, 4320,
- 6621, 9867,
- 11581, 14034,
- 21168, 23210,
- 26588, 29903,
- 3794, 4689,
- 6916, 8655,
- 10143, 16144,
- 19568, 21588,
- 27557, 29593,
- 2446, 3276,
- 5918, 12643,
- 16601, 18013,
- 21126, 23175,
- 27300, 29634,
- 2450, 3522,
- 5437, 8560,
- 15285, 19911,
- 21826, 24097,
- 26567, 29078,
- 2580, 3796,
- 5580, 8338,
- 9969, 12675,
- 18907, 22753,
- 25450, 29292,
- 3325, 4312,
- 6241, 7709,
- 9164, 14452,
- 21665, 23797,
- 27096, 29857,
- 3338, 4163,
- 7738, 11114,
- 12668, 14753,
- 16931, 22736,
- 25671, 28093,
- 3840, 4755,
- 7755, 13471,
- 15338, 17180,
- 20077, 22353,
- 27181, 29743,
- 2504, 4079,
- 8351, 12118,
- 15046, 18595,
- 21684, 24704,
- 27519, 29937,
- 5234, 6342,
- 8267, 11821,
- 15155, 16760,
- 20667, 23488,
- 25949, 29307,
- 2681, 3562,
- 6028, 10827,
- 18458, 20458,
- 22303, 24701,
- 26912, 29956,
- 3374, 4528,
- 6230, 8256,
- 9513, 12730,
- 18666, 20720,
- 26007, 28425,
- 2731, 3629,
- 8320, 12450,
- 14112, 16431,
- 18548, 22098,
- 25329, 27718,
- 3481, 4401,
- 7321, 9319,
- 11062, 13093,
- 15121, 22315,
- 26331, 28740,
- 3577, 4945,
- 6669, 8792,
- 10299, 12645,
- 19505, 24766,
- 26996, 29634,
- 4058, 5060,
- 7288, 10190,
- 11724, 13936,
- 15849, 18539,
- 26701, 29845,
- 4262, 5390,
- 7057, 8982,
- 10187, 15264,
- 20480, 22340,
- 25958, 28072,
- 3404, 4329,
- 6629, 7946,
- 10121, 17165,
- 19640, 22244,
- 25062, 27472,
- 3157, 4168,
- 6195, 9319,
- 10771, 13325,
- 15416, 19816,
- 24672, 27634,
- 2503, 3473,
- 5130, 6767,
- 8571, 14902,
- 19033, 21926,
- 26065, 28728,
- 4133, 5102,
- 7553, 10054,
- 11757, 14924,
- 17435, 20186,
- 23987, 26272,
- 4972, 6139,
- 7894, 9633,
- 11320, 14295,
- 21737, 24306,
- 26919, 29907,
- 2958, 3816,
- 6851, 9204,
- 10895, 18052,
- 20791, 23338,
- 27556, 29609,
- 5234, 6028,
- 8034, 10154,
- 11242, 14789,
- 18948, 20966,
- 26585, 29127,
- 5241, 6838,
- 10526, 12819,
- 14681, 17328,
- 19928, 22336,
- 26193, 28697,
- 3412, 4251,
- 5988, 7094,
- 9907, 18243,
- 21669, 23777,
- 26969, 29087,
- 2470, 3217,
- 7797, 15296,
- 17365, 19135,
- 21979, 24256,
- 27322, 29442,
- 4939, 5804,
- 8145, 11809,
- 13873, 15598,
- 17234, 19423,
- 26476, 29645,
- 5051, 6167,
- 8223, 9655,
- 12159, 17995,
- 20464, 22832,
- 26616, 28462,
- 4987, 5907,
- 9319, 11245,
- 13132, 15024,
- 17485, 22687,
- 26011, 28273,
- 5137, 6884,
- 11025, 14950,
- 17191, 19425,
- 21807, 24393,
- 26938, 29288,
- 7057, 7884,
- 9528, 10483,
- 10960, 14811,
- 19070, 21675,
- 25645, 28019,
- 6759, 7160,
- 8546, 11779,
- 12295, 13023,
- 16627, 21099,
- 24697, 28287,
- 3863, 9762,
- 11068, 11445,
- 12049, 13960,
- 18085, 21507,
- 25224, 28997,
- 397, 335,
- 651, 1168,
- 640, 765,
- 465, 331,
- 214, -194,
- -578, -647,
- -657, 750,
- 564, 613,
- 549, 630,
- 304, -52,
- 828, 922,
- 443, 111,
- 138, 124,
- 169, 14,
- 144, 83,
- 132, 58,
- -413, -752,
- 869, 336,
- 385, 69,
- 56, 830,
- -227, -266,
- -368, -440,
- -1195, 163,
- 126, -228,
- 802, 156,
- 188, 120,
- 376, 59,
- -358, -558,
- -1326, -254,
- -202, -789,
- 296, 92,
- -70, -129,
- -718, -1135,
- 292, -29,
- -631, 487,
- -157, -153,
- -279, 2,
- -419, -342,
- -34, -514,
- -799, -1571,
- -687, -609,
- -546, -130,
- -215, -252,
- -446, -574,
- -1337, 207,
- -72, 32,
- 103, -642,
- 942, 733,
- 187, 29,
- -211, -814,
- 143, 225,
- 20, 24,
- -268, -377,
- 1623, 1133,
- 667, 164,
- 307, 366,
- 187, 34,
- 62, -313,
- -832, -1482,
- -1181, 483,
- -42, -39,
- -450, -1406,
- -587, -52,
- -760, 334,
- 98, -60,
- -500, -488,
- -1058, 299,
- 131, -250,
- -251, -703,
- 1037, 568,
- -413, -265,
- 1687, 573,
- 345, 323,
- 98, 61,
- -102, 31,
- 135, 149,
- 617, 365,
- -39, 34,
- -611, 1201,
- 1421, 736,
- -414, -393,
- -492, -343,
- -316, -532,
- 528, 172,
- 90, 322,
- -294, -319,
- -541, 503,
- 639, 401,
- 1, -149,
- -73, -167,
- 150, 118,
- 308, 218,
- 121, 195,
- -143, -261,
- -1013, -802,
- 387, 436,
- 130, -427,
- -448, -681,
- 123, -87,
- -251, -113,
- 274, 310,
- 445, 501,
- 354, 272,
- 141, -285,
- 569, 656,
- 37, -49,
- 251, -386,
- -263, 1122,
- 604, 606,
- 336, 95,
- 34, 0,
- 85, 180,
- 207, -367,
- -622, 1070,
- -6, -79,
- -160, -92,
- -137, -276,
- -323, -371,
- -696, -1036,
- 407, 102,
- -86, -214,
- -482, -647,
- -28, -291,
- -97, -180,
- -250, -435,
- -18, -76,
- -332, 410,
- 407, 168,
- 539, 411,
- 254, 111,
- 58, -145,
- 200, 30,
- 187, 116,
- 131, -367,
- -475, 781,
- -559, 561,
- 195, -115,
- 8, -168,
- 30, 55,
- -122, 131,
- 82, -5,
- -273, -50,
- -632, 668,
- 4, 32,
- -26, -279,
- 315, 165,
- 197, 377,
- 155, -41,
- -138, -324,
- -109, -617,
- 360, 98,
- -53, -319,
- -114, -245,
- -82, 507,
- 468, 263,
- -137, -389,
- 652, 354,
- -18, -227,
- -462, -135,
- 317, 53,
- -16, 66,
- -72, -126,
- -356, -347,
- -328, -72,
- -337, 324,
- 152, 349,
- 169, -196,
- 179, 254,
- 260, 325,
- -74, -80,
- 75, -31,
- 270, 275,
- 87, 278,
- -446, -301,
- 309, 71,
- -25, -242,
- 516, 161,
- -162, -83,
- 329, 230,
- -311, -259,
- 177, -26,
- -462, 89,
- 257, 6,
- -130, -93,
- -456, -317,
- -221, -206,
- -417, -182,
- -74, 234,
- 48, 261,
- 359, 231,
- 258, 85,
- -282, 252,
- -147, -222,
- 251, -207,
- 443, 123,
- -417, -36,
- 273, -241,
- 240, -112,
- 44, -167,
- 126, -124,
- -77, 58,
- -401, 333,
- -118, 82,
- 126, 151,
- -433, 359,
- -130, -102,
- 131, -244,
- 86, 85,
- -462, 414,
- -240, 16,
- 145, 28,
- -205, -481,
- 373, 293,
- -72, -174,
- 62, 259,
- -8, -18,
- 362, 233,
- 185, 43,
- 278, 27,
- 193, 570,
- -248, 189,
- 92, 31,
- -275, -3,
- 243, 176,
- 438, 209,
- 206, -51,
- 79, 109,
- 168, -185,
- -308, -68,
- -618, 385,
- -310, -108,
- -164, 165,
- 61, -152,
- -101, -412,
- -268, -257,
- -40, -20,
- -28, -158,
- -301, 271,
- 380, -338,
- -367, -132,
- 64, 114,
- -131, -225,
- -156, -260,
- -63, -116,
- 155, -586,
- -202, 254,
- -287, 178,
- 227, -106,
- -294, 164,
- 298, -100,
- 185, 317,
- 193, -45,
- 28, 80,
- -87, -433,
- 22, -48,
- 48, -237,
- -229, -139,
- 120, -364,
- 268, -136,
- 396, 125,
- 130, -89,
- -272, 118,
- -256, -68,
- -451, 488,
- 143, -165,
- -48, -190,
- 106, 219,
- 47, 435,
- 245, 97,
- 75, -418,
- 121, -187,
- 570, -200,
- -351, 225,
- -21, -217,
- 234, -111,
- 194, 14,
- 242, 118,
- 140, -397,
- 355, 361,
- -45, -195
-};
-
-const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_10_Stage_info[ NLSF_MSVQ_CB0_10_STAGES ] =
-{
- { 64, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 0 ] },
- { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 64 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 80 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 80 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 88 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 88 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 96 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 96 ] },
- { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 104 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 104 ] }
-};
-
-const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_10 =
-{
- NLSF_MSVQ_CB0_10_STAGES,
- SKP_Silk_NLSF_CB0_10_Stage_info,
- SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min_Q15,
- SKP_Silk_NLSF_MSVQ_CB0_10_CDF,
- SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr,
- SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx
-};
-
--- a/src/SKP_Silk_tables_NLSF_CB0_10.h
+++ /dev/null
@@ -1,51 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_TABLES_NLSF_CB0_10_H
-#define SKP_SILK_TABLES_NLSF_CB0_10_H
-
-#include "SKP_Silk_define.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define NLSF_MSVQ_CB0_10_STAGES 6
-#define NLSF_MSVQ_CB0_10_VECTORS 120
-
-/* NLSF codebook entropy coding tables */
-extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS + NLSF_MSVQ_CB0_10_STAGES ];
-extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr[ NLSF_MSVQ_CB0_10_STAGES ];
-extern const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx[ NLSF_MSVQ_CB0_10_STAGES ];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/src/SKP_Silk_tables_NLSF_CB0_16.c
+++ /dev/null
@@ -1,1319 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/**********************************************/
-/* This file has been automatically generated */
-/* */
-/* ROM usage: 246+3689 Words */
-/**********************************************/
-
-#include "SKP_Silk_structs.h"
-#include "SKP_Silk_tables_NLSF_CB0_16.h"
-
-const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS + NLSF_MSVQ_CB0_16_STAGES ] =
-{
- 0,
- 1449,
- 2749,
- 4022,
- 5267,
- 6434,
- 7600,
- 8647,
- 9695,
- 10742,
- 11681,
- 12601,
- 13444,
- 14251,
- 15008,
- 15764,
- 16521,
- 17261,
- 18002,
- 18710,
- 19419,
- 20128,
- 20837,
- 21531,
- 22225,
- 22919,
- 23598,
- 24277,
- 24956,
- 25620,
- 26256,
- 26865,
- 27475,
- 28071,
- 28667,
- 29263,
- 29859,
- 30443,
- 31026,
- 31597,
- 32168,
- 32727,
- 33273,
- 33808,
- 34332,
- 34855,
- 35379,
- 35902,
- 36415,
- 36927,
- 37439,
- 37941,
- 38442,
- 38932,
- 39423,
- 39914,
- 40404,
- 40884,
- 41364,
- 41844,
- 42324,
- 42805,
- 43285,
- 43754,
- 44224,
- 44694,
- 45164,
- 45623,
- 46083,
- 46543,
- 46993,
- 47443,
- 47892,
- 48333,
- 48773,
- 49213,
- 49653,
- 50084,
- 50515,
- 50946,
- 51377,
- 51798,
- 52211,
- 52614,
- 53018,
- 53422,
- 53817,
- 54212,
- 54607,
- 55002,
- 55388,
- 55775,
- 56162,
- 56548,
- 56910,
- 57273,
- 57635,
- 57997,
- 58352,
- 58698,
- 59038,
- 59370,
- 59702,
- 60014,
- 60325,
- 60630,
- 60934,
- 61239,
- 61537,
- 61822,
- 62084,
- 62346,
- 62602,
- 62837,
- 63072,
- 63302,
- 63517,
- 63732,
- 63939,
- 64145,
- 64342,
- 64528,
- 64701,
- 64867,
- 65023,
- 65151,
- 65279,
- 65407,
- 65535,
- 0,
- 5099,
- 9982,
- 14760,
- 19538,
- 24213,
- 28595,
- 32976,
- 36994,
- 41012,
- 44944,
- 48791,
- 52557,
- 56009,
- 59388,
- 62694,
- 65535,
- 0,
- 9955,
- 19697,
- 28825,
- 36842,
- 44686,
- 52198,
- 58939,
- 65535,
- 0,
- 8949,
- 17335,
- 25720,
- 33926,
- 41957,
- 49987,
- 57845,
- 65535,
- 0,
- 9724,
- 18642,
- 26998,
- 35355,
- 43532,
- 51534,
- 59365,
- 65535,
- 0,
- 8750,
- 17499,
- 26249,
- 34448,
- 42471,
- 50494,
- 58178,
- 65535,
- 0,
- 8730,
- 17273,
- 25816,
- 34176,
- 42536,
- 50203,
- 57869,
- 65535,
- 0,
- 8769,
- 17538,
- 26307,
- 34525,
- 42742,
- 50784,
- 58319,
- 65535,
- 0,
- 8736,
- 17101,
- 25466,
- 33653,
- 41839,
- 50025,
- 57864,
- 65535,
- 0,
- 4368,
- 8735,
- 12918,
- 17100,
- 21283,
- 25465,
- 29558,
- 33651,
- 37744,
- 41836,
- 45929,
- 50022,
- 54027,
- 57947,
- 61782,
- 65535
-};
-
-const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr[ NLSF_MSVQ_CB0_16_STAGES ] =
-{
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 0 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 129 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 146 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 155 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 164 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 173 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 182 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 191 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 200 ],
- &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 209 ]
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx[ NLSF_MSVQ_CB0_16_STAGES ] =
-{
- 42,
- 8,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 9
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ NLSF_MSVQ_CB0_16_VECTORS ] =
-{
- 176, 181,
- 182, 183,
- 186, 186,
- 191, 191,
- 191, 196,
- 197, 201,
- 203, 206,
- 206, 206,
- 207, 207,
- 209, 209,
- 209, 209,
- 210, 210,
- 210, 211,
- 211, 211,
- 212, 214,
- 216, 216,
- 217, 217,
- 217, 217,
- 218, 218,
- 219, 219,
- 220, 221,
- 222, 223,
- 223, 223,
- 223, 224,
- 224, 224,
- 225, 225,
- 226, 226,
- 226, 226,
- 227, 227,
- 227, 227,
- 227, 227,
- 228, 228,
- 228, 228,
- 229, 229,
- 229, 230,
- 230, 230,
- 231, 231,
- 231, 231,
- 232, 232,
- 232, 232,
- 233, 234,
- 235, 235,
- 235, 236,
- 236, 236,
- 236, 237,
- 237, 237,
- 237, 240,
- 240, 240,
- 240, 241,
- 242, 243,
- 244, 244,
- 247, 247,
- 248, 248,
- 248, 249,
- 251, 255,
- 255, 256,
- 260, 260,
- 261, 264,
- 264, 266,
- 266, 268,
- 271, 274,
- 276, 279,
- 288, 288,
- 288, 288,
- 118, 120,
- 121, 121,
- 122, 125,
- 125, 129,
- 129, 130,
- 131, 132,
- 136, 137,
- 138, 145,
- 87, 88,
- 91, 97,
- 98, 100,
- 105, 106,
- 92, 95,
- 95, 96,
- 97, 97,
- 98, 99,
- 88, 92,
- 95, 95,
- 96, 97,
- 98, 109,
- 93, 93,
- 93, 96,
- 97, 97,
- 99, 101,
- 93, 94,
- 94, 95,
- 95, 99,
- 99, 99,
- 93, 93,
- 93, 96,
- 96, 97,
- 100, 102,
- 93, 95,
- 95, 96,
- 96, 96,
- 98, 99,
- 125, 125,
- 127, 127,
- 127, 127,
- 128, 128,
- 128, 128,
- 128, 128,
- 129, 130,
- 131, 132
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min_Q15[ 16 + 1 ] =
-{
- 266,
- 3,
- 40,
- 3,
- 3,
- 16,
- 78,
- 89,
- 107,
- 141,
- 188,
- 146,
- 272,
- 240,
- 235,
- 215,
- 632
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * NLSF_MSVQ_CB0_16_VECTORS ] =
-{
- 1170, 2278, 3658, 5374,
- 7666, 9113, 11298, 13304,
- 15371, 17549, 19587, 21487,
- 23798, 26038, 28318, 30201,
- 1628, 2334, 4115, 6036,
- 7818, 9544, 11777, 14021,
- 15787, 17408, 19466, 21261,
- 22886, 24565, 26714, 28059,
- 1724, 2670, 4056, 6532,
- 8357, 10119, 12093, 14061,
- 16491, 18795, 20417, 22402,
- 24251, 26224, 28410, 29956,
- 1493, 3427, 4789, 6399,
- 8435, 10168, 12000, 14066,
- 16229, 18210, 20040, 22098,
- 24153, 26095, 28183, 30121,
- 1119, 2089, 4295, 6245,
- 8691, 10741, 12688, 15057,
- 17028, 18792, 20717, 22514,
- 24497, 26548, 28619, 30630,
- 1363, 2417, 3927, 5556,
- 7422, 9315, 11879, 13767,
- 16143, 18520, 20458, 22578,
- 24539, 26436, 28318, 30318,
- 1122, 2503, 5216, 7148,
- 9310, 11078, 13175, 14800,
- 16864, 18700, 20436, 22488,
- 24572, 26602, 28555, 30426,
- 600, 1317, 2970, 5609,
- 7694, 9784, 12169, 14087,
- 16379, 18378, 20551, 22686,
- 24739, 26697, 28646, 30355,
- 941, 1882, 4274, 5540,
- 8482, 9858, 11940, 14287,
- 16091, 18501, 20326, 22612,
- 24711, 26638, 28814, 30430,
- 635, 1699, 4376, 5948,
- 8097, 10115, 12274, 14178,
- 16111, 17813, 19695, 21773,
- 23927, 25866, 28022, 30134,
- 1408, 2222, 3524, 5615,
- 7345, 8849, 10989, 12772,
- 15352, 17026, 18919, 21062,
- 23329, 25215, 27209, 29023,
- 701, 1307, 3548, 6301,
- 7744, 9574, 11227, 12978,
- 15170, 17565, 19775, 22097,
- 24230, 26335, 28377, 30231,
- 1752, 2364, 4879, 6569,
- 7813, 9796, 11199, 14290,
- 15795, 18000, 20396, 22417,
- 24308, 26124, 28360, 30633,
- 901, 1629, 3356, 4635,
- 7256, 8767, 9971, 11558,
- 15215, 17544, 19523, 21852,
- 23900, 25978, 28133, 30184,
- 981, 1669, 3323, 4693,
- 6213, 8692, 10614, 12956,
- 15211, 17711, 19856, 22122,
- 24344, 26592, 28723, 30481,
- 1607, 2577, 4220, 5512,
- 8532, 10388, 11627, 13671,
- 15752, 17199, 19840, 21859,
- 23494, 25786, 28091, 30131,
- 811, 1471, 3144, 5041,
- 7430, 9389, 11174, 13255,
- 15157, 16741, 19583, 22167,
- 24115, 26142, 28383, 30395,
- 1543, 2144, 3629, 6347,
- 7333, 9339, 10710, 13596,
- 15099, 17340, 20102, 21886,
- 23732, 25637, 27818, 29917,
- 492, 1185, 2940, 5488,
- 7095, 8751, 11596, 13579,
- 16045, 18015, 20178, 22127,
- 24265, 26406, 28484, 30357,
- 1547, 2282, 3693, 6341,
- 7758, 9607, 11848, 13236,
- 16564, 18069, 19759, 21404,
- 24110, 26606, 28786, 30655,
- 685, 1338, 3409, 5262,
- 6950, 9222, 11414, 14523,
- 16337, 17893, 19436, 21298,
- 23293, 25181, 27973, 30520,
- 887, 1581, 3057, 4318,
- 7192, 8617, 10047, 13106,
- 16265, 17893, 20233, 22350,
- 24379, 26384, 28314, 30189,
- 2285, 3745, 5662, 7576,
- 9323, 11320, 13239, 15191,
- 17175, 19225, 21108, 22972,
- 24821, 26655, 28561, 30460,
- 1496, 2108, 3448, 6898,
- 8328, 9656, 11252, 12823,
- 14979, 16482, 18180, 20085,
- 22962, 25160, 27705, 29629,
- 575, 1261, 3861, 6627,
- 8294, 10809, 12705, 14768,
- 17076, 19047, 20978, 23055,
- 24972, 26703, 28720, 30345,
- 1682, 2213, 3882, 6238,
- 7208, 9646, 10877, 13431,
- 14805, 16213, 17941, 20873,
- 23550, 25765, 27756, 29461,
- 888, 1616, 3924, 5195,
- 7206, 8647, 9842, 11473,
- 16067, 18221, 20343, 22774,
- 24503, 26412, 28054, 29731,
- 805, 1454, 2683, 4472,
- 7936, 9360, 11398, 14345,
- 16205, 17832, 19453, 21646,
- 23899, 25928, 28387, 30463,
- 1640, 2383, 3484, 5082,
- 6032, 8606, 11640, 12966,
- 15842, 17368, 19346, 21182,
- 23638, 25889, 28368, 30299,
- 1632, 2204, 4510, 7580,
- 8718, 10512, 11962, 14096,
- 15640, 17194, 19143, 22247,
- 24563, 26561, 28604, 30509,
- 2043, 2612, 3985, 6851,
- 8038, 9514, 10979, 12789,
- 15426, 16728, 18899, 20277,
- 22902, 26209, 28711, 30618,
- 2224, 2798, 4465, 5320,
- 7108, 9436, 10986, 13222,
- 14599, 18317, 20141, 21843,
- 23601, 25700, 28184, 30582,
- 835, 1541, 4083, 5769,
- 7386, 9399, 10971, 12456,
- 15021, 18642, 20843, 23100,
- 25292, 26966, 28952, 30422,
- 1795, 2343, 4809, 5896,
- 7178, 8545, 10223, 13370,
- 14606, 16469, 18273, 20736,
- 23645, 26257, 28224, 30390,
- 1734, 2254, 4031, 5188,
- 6506, 7872, 9651, 13025,
- 14419, 17305, 19495, 22190,
- 24403, 26302, 28195, 30177,
- 1841, 2349, 3968, 4764,
- 6376, 9825, 11048, 13345,
- 14682, 16252, 18183, 21363,
- 23918, 26156, 28031, 29935,
- 1432, 2047, 5631, 6927,
- 8198, 9675, 11358, 13506,
- 14802, 16419, 18339, 22019,
- 24124, 26177, 28130, 30586,
- 1730, 2320, 3744, 4808,
- 6007, 9666, 10997, 13622,
- 15234, 17495, 20088, 22002,
- 23603, 25400, 27379, 29254,
- 1267, 1915, 5483, 6812,
- 8229, 9919, 11589, 13337,
- 14747, 17965, 20552, 22167,
- 24519, 26819, 28883, 30642,
- 1526, 2229, 4240, 7388,
- 8953, 10450, 11899, 13718,
- 16861, 18323, 20379, 22672,
- 24797, 26906, 28906, 30622,
- 2175, 2791, 4104, 6875,
- 8612, 9798, 12152, 13536,
- 15623, 17682, 19213, 21060,
- 24382, 26760, 28633, 30248,
- 454, 1231, 4339, 5738,
- 7550, 9006, 10320, 13525,
- 16005, 17849, 20071, 21992,
- 23949, 26043, 28245, 30175,
- 2250, 2791, 4230, 5283,
- 6762, 10607, 11879, 13821,
- 15797, 17264, 20029, 22266,
- 24588, 26437, 28244, 30419,
- 1696, 2216, 4308, 8385,
- 9766, 11030, 12556, 14099,
- 16322, 17640, 19166, 20590,
- 23967, 26858, 28798, 30562,
- 2452, 3236, 4369, 6118,
- 7156, 9003, 11509, 12796,
- 15749, 17291, 19491, 22241,
- 24530, 26474, 28273, 30073,
- 1811, 2541, 3555, 5480,
- 9123, 10527, 11894, 13659,
- 15262, 16899, 19366, 21069,
- 22694, 24314, 27256, 29983,
- 1553, 2246, 4559, 5500,
- 6754, 7874, 11739, 13571,
- 15188, 17879, 20281, 22510,
- 24614, 26649, 28786, 30755,
- 1982, 2768, 3834, 5964,
- 8732, 9908, 11797, 14813,
- 16311, 17946, 21097, 22851,
- 24456, 26304, 28166, 29755,
- 1824, 2529, 3817, 5449,
- 6854, 8714, 10381, 12286,
- 14194, 15774, 19524, 21374,
- 23695, 26069, 28096, 30212,
- 2212, 2854, 3947, 5898,
- 9930, 11556, 12854, 14788,
- 16328, 17700, 20321, 22098,
- 23672, 25291, 26976, 28586,
- 2023, 2599, 4024, 4916,
- 6613, 11149, 12457, 14626,
- 16320, 17822, 19673, 21172,
- 23115, 26051, 28825, 30758,
- 1628, 2206, 3467, 4364,
- 8679, 10173, 11864, 13679,
- 14998, 16938, 19207, 21364,
- 23850, 26115, 28124, 30273,
- 2014, 2603, 4114, 7254,
- 8516, 10043, 11822, 13503,
- 16329, 17826, 19697, 21280,
- 23151, 24661, 26807, 30161,
- 2376, 2980, 4422, 5770,
- 7016, 9723, 11125, 13516,
- 15485, 16985, 19160, 20587,
- 24401, 27180, 29046, 30647,
- 2454, 3502, 4624, 6019,
- 7632, 8849, 10792, 13964,
- 15523, 17085, 19611, 21238,
- 22856, 25108, 28106, 29890,
- 1573, 2274, 3308, 5999,
- 8977, 10104, 12457, 14258,
- 15749, 18180, 19974, 21253,
- 23045, 25058, 27741, 30315,
- 1943, 2730, 4140, 6160,
- 7491, 8986, 11309, 12775,
- 14820, 16558, 17909, 19757,
- 21512, 23605, 27274, 29527,
- 2021, 2582, 4494, 5835,
- 6993, 8245, 9827, 14733,
- 16462, 17894, 19647, 21083,
- 23764, 26667, 29072, 30990,
- 1052, 1775, 3218, 4378,
- 7666, 9403, 11248, 13327,
- 14972, 17962, 20758, 22354,
- 25071, 27209, 29001, 30609,
- 2218, 2866, 4223, 5352,
- 6581, 9980, 11587, 13121,
- 15193, 16583, 18386, 20080,
- 22013, 25317, 28127, 29880,
- 2146, 2840, 4397, 5840,
- 7449, 8721, 10512, 11936,
- 13595, 17253, 19310, 20891,
- 23417, 25627, 27749, 30231,
- 1972, 2619, 3756, 6367,
- 7641, 8814, 12286, 13768,
- 15309, 18036, 19557, 20904,
- 22582, 24876, 27800, 30440,
- 2005, 2577, 4272, 7373,
- 8558, 10223, 11770, 13402,
- 16502, 18000, 19645, 21104,
- 22990, 26806, 29505, 30942,
- 1153, 1822, 3724, 5443,
- 6990, 8702, 10289, 11899,
- 13856, 15315, 17601, 21064,
- 23692, 26083, 28586, 30639,
- 1304, 1869, 3318, 7195,
- 9613, 10733, 12393, 13728,
- 15822, 17474, 18882, 20692,
- 23114, 25540, 27684, 29244,
- 2093, 2691, 4018, 6658,
- 7947, 9147, 10497, 11881,
- 15888, 17821, 19333, 21233,
- 23371, 25234, 27553, 29998,
- 575, 1331, 5304, 6910,
- 8425, 10086, 11577, 13498,
- 16444, 18527, 20565, 22847,
- 24914, 26692, 28759, 30157,
- 1435, 2024, 3283, 4156,
- 7611, 10592, 12049, 13927,
- 15459, 18413, 20495, 22270,
- 24222, 26093, 28065, 30099,
- 1632, 2168, 5540, 7478,
- 8630, 10391, 11644, 14321,
- 15741, 17357, 18756, 20434,
- 22799, 26060, 28542, 30696,
- 1407, 2245, 3405, 5639,
- 9419, 10685, 12104, 13495,
- 15535, 18357, 19996, 21689,
- 24351, 26550, 28853, 30564,
- 1675, 2226, 4005, 8223,
- 9975, 11155, 12822, 14316,
- 16504, 18137, 19574, 21050,
- 22759, 24912, 28296, 30634,
- 1080, 1614, 3622, 7565,
- 8748, 10303, 11713, 13848,
- 15633, 17434, 19761, 21825,
- 23571, 25393, 27406, 29063,
- 1693, 2229, 3456, 4354,
- 5670, 10890, 12563, 14167,
- 15879, 17377, 19817, 21971,
- 24094, 26131, 28298, 30099,
- 2042, 2959, 4195, 5740,
- 7106, 8267, 11126, 14973,
- 16914, 18295, 20532, 21982,
- 23711, 25769, 27609, 29351,
- 984, 1612, 3808, 5265,
- 6885, 8411, 9547, 10889,
- 12522, 16520, 19549, 21639,
- 23746, 26058, 28310, 30374,
- 2036, 2538, 4166, 7761,
- 9146, 10412, 12144, 13609,
- 15588, 17169, 18559, 20113,
- 21820, 24313, 28029, 30612,
- 1871, 2355, 4061, 5143,
- 7464, 10129, 11941, 15001,
- 16680, 18354, 19957, 22279,
- 24861, 26872, 28988, 30615,
- 2566, 3161, 4643, 6227,
- 7406, 9970, 11618, 13416,
- 15889, 17364, 19121, 20817,
- 22592, 24720, 28733, 31082,
- 1700, 2327, 4828, 5939,
- 7567, 9154, 11087, 12771,
- 14209, 16121, 20222, 22671,
- 24648, 26656, 28696, 30745,
- 3169, 3873, 5046, 6868,
- 8184, 9480, 12335, 14068,
- 15774, 17971, 20231, 21711,
- 23520, 25245, 27026, 28730,
- 1564, 2391, 4229, 6730,
- 8905, 10459, 13026, 15033,
- 17265, 19809, 21849, 23741,
- 25490, 27312, 29061, 30527,
- 2864, 3559, 4719, 6441,
- 9592, 11055, 12763, 14784,
- 16428, 18164, 20486, 22262,
- 24183, 26263, 28383, 30224,
- 2673, 3449, 4581, 5983,
- 6863, 8311, 12464, 13911,
- 15738, 17791, 19416, 21182,
- 24025, 26561, 28723, 30440,
- 2419, 3049, 4274, 6384,
- 8564, 9661, 11288, 12676,
- 14447, 17578, 19816, 21231,
- 23099, 25270, 26899, 28926,
- 1278, 2001, 3000, 5353,
- 9995, 11777, 13018, 14570,
- 16050, 17762, 19982, 21617,
- 23371, 25083, 27656, 30172,
- 932, 1624, 2798, 4570,
- 8592, 9988, 11552, 13050,
- 16921, 18677, 20415, 22810,
- 24817, 26819, 28804, 30385,
- 2324, 2973, 4156, 5702,
- 6919, 8806, 10259, 12503,
- 15015, 16567, 19418, 21375,
- 22943, 24550, 27024, 29849,
- 1564, 2373, 3455, 4907,
- 5975, 7436, 11786, 14505,
- 16107, 18148, 20019, 21653,
- 23740, 25814, 28578, 30372,
- 3025, 3729, 4866, 6520,
- 9487, 10943, 12358, 14258,
- 16174, 17501, 19476, 21408,
- 23227, 24906, 27347, 29407,
- 1270, 1965, 6802, 7995,
- 9204, 10828, 12507, 14230,
- 15759, 17860, 20369, 22502,
- 24633, 26514, 28535, 30525,
- 2210, 2749, 4266, 7487,
- 9878, 11018, 12823, 14431,
- 16247, 18626, 20450, 22054,
- 23739, 25291, 27074, 29169,
- 1275, 1926, 4330, 6573,
- 8441, 10920, 13260, 15008,
- 16927, 18573, 20644, 22217,
- 23983, 25474, 27372, 28645,
- 3015, 3670, 5086, 6372,
- 7888, 9309, 10966, 12642,
- 14495, 16172, 18080, 19972,
- 22454, 24899, 27362, 29975,
- 2882, 3733, 5113, 6482,
- 8125, 9685, 11598, 13288,
- 15405, 17192, 20178, 22426,
- 24801, 27014, 29212, 30811,
- 2300, 2968, 4101, 5442,
- 6327, 7910, 12455, 13862,
- 15747, 17505, 19053, 20679,
- 22615, 24658, 27499, 30065,
- 2257, 2940, 4430, 5991,
- 7042, 8364, 9414, 11224,
- 15723, 17420, 19253, 21469,
- 23915, 26053, 28430, 30384,
- 1227, 2045, 3818, 5011,
- 6990, 9231, 11024, 13011,
- 17341, 19017, 20583, 22799,
- 25195, 26876, 29351, 30805,
- 1354, 1924, 3789, 8077,
- 10453, 11639, 13352, 14817,
- 16743, 18189, 20095, 22014,
- 24593, 26677, 28647, 30256,
- 3142, 4049, 6197, 7417,
- 8753, 10156, 11533, 13181,
- 15947, 17655, 19606, 21402,
- 23487, 25659, 28123, 30304,
- 1317, 2263, 4725, 7611,
- 9667, 11634, 14143, 16258,
- 18724, 20698, 22379, 24007,
- 25775, 27251, 28930, 30593,
- 1570, 2323, 3818, 6215,
- 9893, 11556, 13070, 14631,
- 16152, 18290, 21386, 23346,
- 25114, 26923, 28712, 30168,
- 2297, 3905, 6287, 8558,
- 10668, 12766, 15019, 17102,
- 19036, 20677, 22341, 23871,
- 25478, 27085, 28851, 30520,
- 1915, 2507, 4033, 5749,
- 7059, 8871, 10659, 12198,
- 13937, 15383, 16869, 18707,
- 23175, 25818, 28514, 30501,
- 2404, 2918, 5190, 6252,
- 7426, 9887, 12387, 14795,
- 16754, 18368, 20338, 22003,
- 24236, 26456, 28490, 30397,
- 1621, 2227, 3479, 5085,
- 9425, 12892, 14246, 15652,
- 17205, 18674, 20446, 22209,
- 23778, 25867, 27931, 30093,
- 1869, 2390, 4105, 7021,
- 11221, 12775, 14059, 15590,
- 17024, 18608, 20595, 22075,
- 23649, 25154, 26914, 28671,
- 2551, 3252, 4688, 6562,
- 7869, 9125, 10475, 11800,
- 15402, 18780, 20992, 22555,
- 24289, 25968, 27465, 29232,
- 2705, 3493, 4735, 6360,
- 7905, 9352, 11538, 13430,
- 15239, 16919, 18619, 20094,
- 21800, 23342, 25200, 29257,
- 2166, 2791, 4011, 5081,
- 5896, 9038, 13407, 14703,
- 16543, 18189, 19896, 21857,
- 24872, 26971, 28955, 30514,
- 1865, 3021, 4696, 6534,
- 8343, 9914, 12789, 14103,
- 16533, 17729, 21340, 22439,
- 24873, 26330, 28428, 30154,
- 3369, 4345, 6573, 8763,
- 10309, 11713, 13367, 14784,
- 16483, 18145, 19839, 21247,
- 23292, 25477, 27555, 29447,
- 1265, 2184, 5443, 7893,
- 10591, 13139, 15105, 16639,
- 18402, 19826, 21419, 22995,
- 24719, 26437, 28363, 30125,
- 1584, 2004, 3535, 4450,
- 8662, 10764, 12832, 14978,
- 16972, 18794, 20932, 22547,
- 24636, 26521, 28701, 30567,
- 3419, 4528, 6602, 7890,
- 9508, 10875, 12771, 14357,
- 16051, 18330, 20630, 22490,
- 25070, 26936, 28946, 30542,
- 1726, 2252, 4597, 6950,
- 8379, 9823, 11363, 12794,
- 14306, 15476, 16798, 18018,
- 21671, 25550, 28148, 30367,
- 3385, 3870, 5307, 6388,
- 7141, 8684, 12695, 14939,
- 16480, 18277, 20537, 22048,
- 23947, 25965, 28214, 29956,
- 2771, 3306, 4450, 5560,
- 6453, 9493, 13548, 14754,
- 16743, 18447, 20028, 21736,
- 23746, 25353, 27141, 29066,
- 3028, 3900, 6617, 7893,
- 9211, 10480, 12047, 13583,
- 15182, 16662, 18502, 20092,
- 22190, 24358, 26302, 28957,
- 2000, 2550, 4067, 6837,
- 9628, 11002, 12594, 14098,
- 15589, 17195, 18679, 20099,
- 21530, 23085, 24641, 29022,
- 2844, 3302, 5103, 6107,
- 6911, 8598, 12416, 14054,
- 16026, 18567, 20672, 22270,
- 23952, 25771, 27658, 30026,
- 4043, 5150, 7268, 9056,
- 10916, 12638, 14543, 16184,
- 17948, 19691, 21357, 22981,
- 24825, 26591, 28479, 30233,
- 2109, 2625, 4320, 5525,
- 7454, 10220, 12980, 14698,
- 17627, 19263, 20485, 22381,
- 24279, 25777, 27847, 30458,
- 1550, 2667, 6473, 9496,
- 10985, 12352, 13795, 15233,
- 17099, 18642, 20461, 22116,
- 24197, 26291, 28403, 30132,
- 2411, 3084, 4145, 5394,
- 6367, 8154, 13125, 16049,
- 17561, 19125, 21258, 22762,
- 24459, 26317, 28255, 29702,
- 4159, 4516, 5956, 7635,
- 8254, 8980, 11208, 14133,
- 16210, 17875, 20196, 21864,
- 23840, 25747, 28058, 30012,
- 2026, 2431, 2845, 3618,
- 7950, 9802, 12721, 14460,
- 16576, 18984, 21376, 23319,
- 24961, 26718, 28971, 30640,
- 3429, 3833, 4472, 4912,
- 7723, 10386, 12981, 15322,
- 16699, 18807, 20778, 22551,
- 24627, 26494, 28334, 30482,
- 4740, 5169, 5796, 6485,
- 6998, 8830, 11777, 14414,
- 16831, 18413, 20789, 22369,
- 24236, 25835, 27807, 30021,
- 150, 168, -17, -107,
- -142, -229, -320, -406,
- -503, -620, -867, -935,
- -902, -680, -398, -114,
- -398, -355, 49, 255,
- 114, 260, 399, 264,
- 317, 431, 514, 531,
- 435, 356, 238, 106,
- -43, -36, -169, -224,
- -391, -633, -776, -970,
- -844, -455, -181, -12,
- 85, 85, 164, 195,
- 122, 85, -158, -640,
- -903, 9, 7, -124,
- 149, 32, 220, 369,
- 242, 115, 79, 84,
- -146, -216, -70, 1024,
- 751, 574, 440, 377,
- 352, 203, 30, 16,
- -3, 81, 161, 100,
- -148, -176, 933, 750,
- 404, 171, -2, -146,
- -411, -442, -541, -552,
- -442, -269, -240, -52,
- 603, 635, 405, 178,
- 215, 19, -153, -167,
- -290, -219, 151, 271,
- 151, 119, 303, 266,
- 100, 69, -293, -657,
- 939, 659, 442, 351,
- 132, 98, -16, -1,
- -135, -200, -223, -89,
- 167, 154, 172, 237,
- -45, -183, -228, -486,
- 263, 608, 158, -125,
- -390, -227, -118, 43,
- -457, -392, -769, -840,
- 20, -117, -194, -189,
- -173, -173, -33, 32,
- 174, 144, 115, 167,
- 57, 44, 14, 147,
- 96, -54, -142, -129,
- -254, -331, 304, 310,
- -52, -419, -846, -1060,
- -88, -123, -202, -343,
- -554, -961, -951, 327,
- 159, 81, 255, 227,
- 120, 203, 256, 192,
- 164, 224, 290, 195,
- 216, 209, 128, 832,
- 1028, 889, 698, 504,
- 408, 355, 218, 32,
- -115, -84, -276, -100,
- -312, -484, 899, 682,
- 465, 456, 241, -12,
- -275, -425, -461, -367,
- -33, -28, -102, -194,
- -527, 863, 906, 463,
- 245, 13, -212, -305,
- -105, 163, 279, 176,
- 93, 67, 115, 192,
- 61, -50, -132, -175,
- -224, -271, -629, -252,
- 1158, 972, 638, 280,
- 300, 326, 143, -152,
- -214, -287, 53, -42,
- -236, -352, -423, -248,
- -129, -163, -178, -119,
- 85, 57, 514, 382,
- 374, 402, 424, 423,
- 271, 197, 97, 40,
- 39, -97, -191, -164,
- -230, -256, -410, 396,
- 327, 127, 10, -119,
- -167, -291, -274, -141,
- -99, -226, -218, -139,
- -224, -209, -268, -442,
- -413, 222, 58, 521,
- 344, 258, 76, -42,
- -142, -165, -123, -92,
- 47, 8, -3, -191,
- -11, -164, -167, -351,
- -740, 311, 538, 291,
- 184, 29, -105, 9,
- -30, -54, -17, -77,
- -271, -412, -622, -648,
- 476, 186, -66, -197,
- -73, -94, -15, 47,
- 28, 112, -58, -33,
- 65, 19, 84, 86,
- 276, 114, 472, 786,
- 799, 625, 415, 178,
- -35, -26, 5, 9,
- 83, 39, 37, 39,
- -184, -374, -265, -362,
- -501, 337, 716, 478,
- -60, -125, -163, 362,
- 17, -122, -233, 279,
- 138, 157, 318, 193,
- 189, 209, 266, 252,
- -46, -56, -277, -429,
- 464, 386, 142, 44,
- -43, 66, 264, 182,
- 47, 14, -26, -79,
- 49, 15, -128, -203,
- -400, -478, 325, 27,
- 234, 411, 205, 129,
- 12, 58, 123, 57,
- 171, 137, 96, 128,
- -32, 134, -12, 57,
- 119, 26, -22, -165,
- -500, -701, -528, -116,
- 64, -8, 97, -9,
- -162, -66, -156, -194,
- -303, -546, -341, 546,
- 358, 95, 45, 76,
- 270, 403, 205, 100,
- 123, 50, -53, -144,
- -110, -13, 32, -228,
- -130, 353, 296, 56,
- -372, -253, 365, 73,
- 10, -34, -139, -191,
- -96, 5, 44, -85,
- -179, -129, -192, -246,
- -85, -110, -155, -44,
- -27, 145, 138, 79,
- 32, -148, -577, -634,
- 191, 94, -9, -35,
- -77, -84, -56, -171,
- -298, -271, -243, -156,
- -328, -235, -76, -128,
- -121, 129, 13, -22,
- 32, 45, -248, -65,
- 193, -81, 299, 57,
- -147, 192, -165, -354,
- -334, -106, -156, -40,
- -3, -68, 124, -257,
- 78, 124, 170, 412,
- 227, 105, -104, 12,
- 154, 250, 274, 258,
- 4, -27, 235, 152,
- 51, 338, 300, 7,
- -314, -411, 215, 170,
- -9, -93, -77, 76,
- 67, 54, 200, 315,
- 163, 72, -91, -402,
- 158, 187, -156, -91,
- 290, 267, 167, 91,
- 140, 171, 112, 9,
- -42, -177, -440, 385,
- 80, 15, 172, 129,
- 41, -129, -372, -24,
- -75, -30, -170, 10,
- -118, 57, 78, -101,
- 232, 161, 123, 256,
- 277, 101, -192, -629,
- -100, -60, -232, 66,
- 13, -13, -80, -239,
- 239, 37, 32, 89,
- -319, -579, 450, 360,
- 3, -29, -299, -89,
- -54, -110, -246, -164,
- 6, -188, 338, 176,
- -92, 197, 137, 134,
- 12, -2, 56, -183,
- 114, -36, -131, -204,
- 75, -25, -174, 191,
- -15, -290, -429, -267,
- 79, 37, 106, 23,
- -384, 425, 70, -14,
- 212, 105, 15, -2,
- -42, -37, -123, 108,
- 28, -48, 193, 197,
- 173, -33, 37, 73,
- -57, 256, 137, -58,
- -430, -228, 217, -51,
- -10, -58, -6, 22,
- 104, 61, -119, 169,
- 144, 16, -46, -394,
- 60, 454, -80, -298,
- -65, 25, 0, -24,
- -65, -417, 465, 276,
- -3, -194, -13, 130,
- 19, -6, -21, -24,
- -180, -53, -85, 20,
- 118, 147, 113, -75,
- -289, 226, -122, 227,
- 270, 125, 109, 197,
- 125, 138, 44, 60,
- 25, -55, -167, -32,
- -139, -193, -173, -316,
- 287, -208, 253, 239,
- 27, -80, -188, -28,
- -182, -235, 156, -117,
- 128, -48, -58, -226,
- 172, 181, 167, 19,
- 62, 10, 2, 181,
- 151, 108, -16, -11,
- -78, -331, 411, 133,
- 17, 104, 64, -184,
- 24, -30, -3, -283,
- 121, 204, -8, -199,
- -21, -80, -169, -157,
- -191, -136, 81, 155,
- 14, -131, 244, 74,
- -57, -47, -280, 347,
- 111, -77, -128, -142,
- -194, -125, -6, -68,
- 91, 1, 23, 14,
- -154, -34, 23, -38,
- -343, 503, 146, -38,
- -46, -41, 58, 31,
- 63, -48, -117, 45,
- 28, 1, -89, -5,
- -44, -29, -448, 487,
- 204, 81, 46, -106,
- -302, 380, 120, -38,
- -12, -39, 70, -3,
- 25, -65, 30, -11,
- 34, -15, 22, -115,
- 0, -79, -83, 45,
- 114, 43, 150, 36,
- 233, 149, 195, 5,
- 25, -52, -475, 274,
- 28, -39, -8, -66,
- -255, 258, 56, 143,
- -45, -190, 165, -60,
- 20, 2, 125, -129,
- 51, -8, -335, 288,
- 38, 59, 25, -42,
- 23, -118, -112, 11,
- -55, -133, -109, 24,
- -105, 78, -64, -245,
- 202, -65, -127, 162,
- 40, -94, 89, -85,
- -119, -103, 97, 9,
- -70, -28, 194, 86,
- -112, -92, -114, 74,
- -49, 46, -84, -178,
- 113, 52, -205, 333,
- 88, 222, 56, -55,
- 13, 86, 4, -77,
- 224, 114, -105, 112,
- 125, -29, -18, -144,
- 22, -58, -99, 28,
- 114, -66, -32, -169,
- -314, 285, 72, -74,
- 179, 28, -79, -182,
- 13, -55, 147, 13,
- 12, -54, 31, -84,
- -17, -75, -228, 83,
- -375, 436, 110, -63,
- -27, -136, 169, -56,
- -8, -171, 184, -42,
- 148, 68, 204, 235,
- 110, -229, 91, 171,
- -43, -3, -26, -99,
- -111, 71, -170, 202,
- -67, 181, -37, 109,
- -120, 3, -55, -260,
- -16, 152, 91, 142,
- 42, 44, 134, 47,
- 17, -35, 22, 79,
- -169, 41, 46, 277,
- -93, -49, -126, 37,
- -103, -34, -22, -90,
- -134, -205, 92, -9,
- 1, -195, -239, 45,
- 54, 18, -23, -1,
- -80, -98, -20, -261,
- 306, 72, 20, -89,
- -217, 11, 6, -82,
- 89, 13, -129, -89,
- 83, -71, -55, 130,
- -98, -146, -27, -57,
- 53, 275, 17, 170,
- -5, -54, 132, -64,
- 72, 160, -125, -168,
- 72, 40, 170, 78,
- 248, 116, 20, 84,
- 31, -34, 190, 38,
- 13, -106, 225, 27,
- -168, 24, -157, -122,
- 165, 11, -161, -213,
- -12, -51, -101, 42,
- 101, 27, 55, 111,
- 75, 71, -96, -1,
- 65, -277, 393, -26,
- -44, -68, -84, -66,
- -95, 235, 179, -25,
- -41, 27, -91, -128,
- -222, 146, -72, -30,
- -24, 55, -126, -68,
- -58, -127, 13, -97,
- -106, 174, -100, 155,
- 101, -146, -21, 261,
- 22, 38, -66, 65,
- 4, 70, 64, 144,
- 59, 213, 71, -337,
- 303, -52, 51, -56,
- 1, 10, -15, -5,
- 34, 52, 228, 131,
- 161, -127, -214, 238,
- 123, 64, -147, -50,
- -34, -127, 204, 162,
- 85, 41, 5, -140,
- 73, -150, 56, -96,
- -66, -20, 2, -235,
- 59, -22, -107, 150,
- -16, -47, -4, 81,
- -67, 167, 149, 149,
- -157, 288, -156, -27,
- -8, 18, 83, -24,
- -41, -167, 158, -100,
- 93, 53, 201, 15,
- 42, 266, 278, -12,
- -6, -37, 85, 6,
- 20, -188, -271, 107,
- -13, -80, 51, 202,
- 173, -69, 78, -188,
- 46, 4, 153, 12,
- -138, 169, 5, -58,
- -123, -108, -243, 150,
- 10, -191, 246, -15,
- 38, 25, -10, 14,
- 61, 50, -206, -215,
- -220, 90, 5, -149,
- -219, 56, 142, 24,
- -376, 77, -80, 75,
- 6, 42, -101, 16,
- 56, 14, -57, 3,
- -17, 80, 57, -36,
- 88, -59, -97, -19,
- -148, 46, -219, 226,
- 114, -4, -72, -15,
- 37, -49, -28, 247,
- 44, 123, 47, -122,
- -38, 17, 4, -113,
- -32, -224, 154, -134,
- 196, 71, -267, -85,
- 28, -70, 89, -120,
- 99, -2, 64, 76,
- -166, -48, 189, -35,
- -92, -169, -123, 339,
- 38, -25, 38, -35,
- 225, -139, -50, -63,
- 246, 60, -185, -109,
- -49, -53, -167, 51,
- 149, 60, -101, -33,
- 25, -76, 120, 32,
- -30, -83, 102, 91,
- -186, -261, 131, -197
-};
-
-const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_16_Stage_info[ NLSF_MSVQ_CB0_16_STAGES ] =
-{
- { 128, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 0 ] },
- { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 128 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 128 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 144 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 144 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 152 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 152 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 160 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 160 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 168 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 168 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 176 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 176 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 184 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 184 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 192 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 192 ] },
- { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 200 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 200 ] }
-};
-
-const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_16 =
-{
- NLSF_MSVQ_CB0_16_STAGES,
- SKP_Silk_NLSF_CB0_16_Stage_info,
- SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min_Q15,
- SKP_Silk_NLSF_MSVQ_CB0_16_CDF,
- SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr,
- SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx
-};
-
--- a/src/SKP_Silk_tables_NLSF_CB0_16.h
+++ /dev/null
@@ -1,51 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_TABLES_NLSF_CB0_16_H
-#define SKP_SILK_TABLES_NLSF_CB0_16_H
-
-#include "SKP_Silk_define.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define NLSF_MSVQ_CB0_16_STAGES 10
-#define NLSF_MSVQ_CB0_16_VECTORS 216
-
-/* NLSF codebook entropy coding tables */
-extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS + NLSF_MSVQ_CB0_16_STAGES ];
-extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr[ NLSF_MSVQ_CB0_16_STAGES ];
-extern const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx[ NLSF_MSVQ_CB0_16_STAGES ];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/src/SKP_Silk_tables_NLSF_CB1_10.c
+++ /dev/null
@@ -1,577 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/**********************************************/
-/* This file has been automatically generated */
-/* */
-/* ROM usage: 90+803 Words */
-/**********************************************/
-
-#include "SKP_Silk_structs.h"
-#include "SKP_Silk_tables_NLSF_CB1_10.h"
-
-const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS + NLSF_MSVQ_CB1_10_STAGES ] =
-{
- 0,
- 17096,
- 24130,
- 28997,
- 33179,
- 36696,
- 40213,
- 42493,
- 44252,
- 45973,
- 47551,
- 49095,
- 50542,
- 51898,
- 53196,
- 54495,
- 55685,
- 56851,
- 57749,
- 58628,
- 59435,
- 60207,
- 60741,
- 61220,
- 61700,
- 62179,
- 62659,
- 63138,
- 63617,
- 64097,
- 64576,
- 65056,
- 65535,
- 0,
- 20378,
- 33032,
- 40395,
- 46721,
- 51707,
- 56585,
- 61157,
- 65535,
- 0,
- 15055,
- 25472,
- 35447,
- 42501,
- 48969,
- 54773,
- 60212,
- 65535,
- 0,
- 12069,
- 22440,
- 32812,
- 40145,
- 46870,
- 53595,
- 59630,
- 65535,
- 0,
- 10839,
- 19954,
- 27957,
- 35961,
- 43965,
- 51465,
- 58805,
- 65535,
- 0,
- 8933,
- 17674,
- 26415,
- 34785,
- 42977,
- 50820,
- 58496,
- 65535
-};
-
-const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr[ NLSF_MSVQ_CB1_10_STAGES ] =
-{
- &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 0 ],
- &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 33 ],
- &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 42 ],
- &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 51 ],
- &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 60 ],
- &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 69 ]
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx[ NLSF_MSVQ_CB1_10_STAGES ] =
-{
- 5,
- 3,
- 4,
- 4,
- 5,
- 5
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ NLSF_MSVQ_CB1_10_VECTORS ] =
-{
- 62, 103,
- 120, 127,
- 135, 135,
- 155, 167,
- 168, 172,
- 173, 176,
- 179, 181,
- 181, 185,
- 186, 198,
- 199, 203,
- 205, 222,
- 227, 227,
- 227, 227,
- 227, 227,
- 227, 227,
- 227, 227,
- 54, 76,
- 101, 108,
- 119, 120,
- 123, 125,
- 68, 85,
- 87, 103,
- 107, 112,
- 115, 116,
- 78, 85,
- 85, 101,
- 105, 105,
- 110, 111,
- 83, 91,
- 97, 97,
- 97, 100,
- 101, 105,
- 92, 93,
- 93, 95,
- 96, 98,
- 99, 103
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min_Q15[ 10 + 1 ] =
-{
- 462,
- 3,
- 64,
- 74,
- 98,
- 50,
- 97,
- 68,
- 120,
- 53,
- 639
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * NLSF_MSVQ_CB1_10_VECTORS ] =
-{
- 1877, 4646,
- 7712, 10745,
- 13964, 17028,
- 20239, 23182,
- 26471, 29287,
- 1612, 3278,
- 7086, 9975,
- 13228, 16264,
- 19596, 22690,
- 26037, 28965,
- 2169, 3830,
- 6460, 8958,
- 11960, 14750,
- 18408, 21659,
- 25018, 28043,
- 3680, 6024,
- 8986, 12256,
- 15201, 18188,
- 21741, 24460,
- 27484, 30059,
- 2584, 5187,
- 7799, 10902,
- 13179, 15765,
- 19017, 22431,
- 25891, 28698,
- 3731, 5751,
- 8650, 11742,
- 15090, 17407,
- 20391, 23421,
- 26228, 29247,
- 2107, 6323,
- 8915, 12226,
- 14775, 17791,
- 20664, 23679,
- 26829, 29353,
- 1677, 2870,
- 5386, 8077,
- 11817, 15176,
- 18657, 22006,
- 25513, 28689,
- 2111, 3625,
- 7027, 10588,
- 14059, 17193,
- 21137, 24260,
- 27577, 30036,
- 2428, 4010,
- 5765, 9376,
- 13805, 15821,
- 19444, 22389,
- 25295, 29310,
- 2256, 4628,
- 8377, 12441,
- 15283, 19462,
- 22257, 25551,
- 28432, 30304,
- 2352, 3675,
- 6129, 11868,
- 14551, 16655,
- 19624, 21883,
- 26526, 28849,
- 5243, 7248,
- 10558, 13269,
- 15651, 17919,
- 21141, 23827,
- 27102, 29519,
- 4422, 6725,
- 10449, 13273,
- 16124, 19921,
- 22826, 26061,
- 28763, 30583,
- 4508, 6291,
- 9504, 11809,
- 13827, 15950,
- 19077, 22084,
- 25740, 28658,
- 2540, 4297,
- 8579, 13578,
- 16634, 19101,
- 21547, 23887,
- 26777, 29146,
- 3377, 6358,
- 10224, 14518,
- 17905, 21056,
- 23637, 25784,
- 28161, 30109,
- 4177, 5942,
- 8159, 10108,
- 12130, 15470,
- 20191, 23326,
- 26782, 29359,
- 2492, 3801,
- 6144, 9825,
- 16000, 18671,
- 20893, 23663,
- 25899, 28974,
- 3011, 4727,
- 6834, 10505,
- 12465, 14496,
- 17065, 20052,
- 25265, 28057,
- 4149, 7197,
- 12338, 15076,
- 18002, 20190,
- 22187, 24723,
- 27083, 29125,
- 2975, 4578,
- 6448, 8378,
- 9671, 13225,
- 19502, 22277,
- 26058, 28850,
- 4102, 5760,
- 7744, 9484,
- 10744, 12308,
- 14677, 19607,
- 24841, 28381,
- 4931, 9287,
- 12477, 13395,
- 13712, 14351,
- 16048, 19867,
- 24188, 28994,
- 4141, 7867,
- 13140, 17720,
- 20064, 21108,
- 21692, 22722,
- 23736, 27449,
- 4011, 8720,
- 13234, 16206,
- 17601, 18289,
- 18524, 19689,
- 23234, 27882,
- 3420, 5995,
- 11230, 15117,
- 15907, 16783,
- 17762, 23347,
- 26898, 29946,
- 3080, 6786,
- 10465, 13676,
- 18059, 23615,
- 27058, 29082,
- 29563, 29905,
- 3038, 5620,
- 9266, 12870,
- 18803, 19610,
- 20010, 20802,
- 23882, 29306,
- 3314, 6420,
- 9046, 13262,
- 15869, 23117,
- 23667, 24215,
- 24487, 25915,
- 3469, 6963,
- 10103, 15282,
- 20531, 23240,
- 25024, 26021,
- 26736, 27255,
- 3041, 6459,
- 9777, 12896,
- 16315, 19410,
- 24070, 29353,
- 31795, 32075,
- -200, -134,
- -113, -204,
- -347, -440,
- -352, -211,
- -418, -172,
- -313, 59,
- 495, 772,
- 721, 614,
- 334, 444,
- 225, 242,
- 161, 16,
- 274, 564,
- -73, -188,
- -395, -171,
- 777, 508,
- 1340, 1145,
- 699, 196,
- 223, 173,
- 90, 25,
- -26, 18,
- 133, -105,
- -360, -277,
- 859, 634,
- 41, -557,
- -768, -926,
- -601, -1021,
- -1189, -365,
- 225, 107,
- 374, -50,
- 433, 417,
- 156, 39,
- -597, -1397,
- -1594, -592,
- -485, -292,
- 253, 87,
- -0, -6,
- -25, -345,
- -240, 120,
- 1261, 946,
- 166, -277,
- 241, 167,
- 170, 429,
- 518, 714,
- 602, 254,
- 134, 92,
- -152, -324,
- -394, 49,
- -151, -304,
- -724, -657,
- -162, -369,
- -35, 3,
- -2, -312,
- -200, -92,
- -227, 242,
- 628, 565,
- -124, 1056,
- 770, 101,
- -84, -33,
- 4, -192,
- -272, 5,
- -627, -977,
- 419, 472,
- 53, -103,
- 145, 322,
- -95, -31,
- -100, -303,
- -560, -1067,
- -413, 714,
- 283, 2,
- -223, -367,
- 523, 360,
- -38, -115,
- 378, -591,
- -718, 448,
- -481, -274,
- 180, -88,
- -581, -157,
- -696, -1265,
- 394, -479,
- -23, 124,
- -43, 19,
- -113, -236,
- -412, -659,
- -200, 2,
- -69, -342,
- 199, 55,
- 58, -36,
- -51, -62,
- 507, 507,
- 427, 442,
- 36, 601,
- -141, 68,
- 274, 274,
- 68, -12,
- -4, 71,
- -193, -464,
- -425, -383,
- 408, 203,
- -337, 236,
- 410, -59,
- -25, -341,
- -449, 28,
- -9, 90,
- 332, -14,
- -905, 96,
- -540, -242,
- 679, -59,
- 192, -24,
- 60, -217,
- 5, -37,
- 179, -20,
- 311, 519,
- 274, 72,
- -326, -1030,
- -262, 213,
- 380, 82,
- 328, 411,
- -540, 574,
- -283, 151,
- 181, -402,
- -278, -240,
- -110, -227,
- -264, -89,
- -250, -259,
- -27, 106,
- -239, -98,
- -390, 118,
- 61, 104,
- 294, 532,
- 92, -13,
- 60, -233,
- 335, 541,
- 307, -26,
- -110, -91,
- -231, -460,
- 170, 201,
- 96, -372,
- 132, 435,
- -302, 216,
- -279, -41,
- 74, 190,
- 368, 273,
- -186, -608,
- -157, 159,
- 12, 278,
- 245, 307,
- 25, -187,
- -16, 55,
- 30, -163,
- 548, -307,
- 106, -5,
- 27, 330,
- -416, 475,
- 438, -235,
- 104, 137,
- 21, -5,
- -300, -468,
- 521, -347,
- 170, -200,
- -219, 308,
- -122, -133,
- 219, -16,
- 359, 412,
- -89, -111,
- 48, 322,
- 142, 177,
- -286, -127,
- -39, -63,
- -42, -451,
- 160, 308,
- -57, 193,
- -48, 74,
- -346, 59,
- -27, 27,
- -469, -277,
- -344, 282,
- 262, 122,
- 171, -249,
- 27, 258,
- 188, -3,
- 67, -206,
- -284, 291,
- -117, -88,
- -477, 375,
- 50, 106,
- 99, -182,
- 438, -376,
- -401, -49,
- 119, -23,
- -10, -48,
- -116, -200,
- -310, 121,
- 73, 7,
- 237, -226,
- 139, -456,
- 397, 35,
- 3, -108,
- 323, -75,
- 332, 198,
- -99, -21
-};
-
-const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_10_Stage_info[ NLSF_MSVQ_CB1_10_STAGES ] =
-{
- { 32, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 0 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 32 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 40 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 48 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 56 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 64 ] }
-};
-
-const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB1_10 =
-{
- NLSF_MSVQ_CB1_10_STAGES,
- SKP_Silk_NLSF_CB1_10_Stage_info,
- SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min_Q15,
- SKP_Silk_NLSF_MSVQ_CB1_10_CDF,
- SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr,
- SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx
-};
-
--- a/src/SKP_Silk_tables_NLSF_CB1_10.h
+++ /dev/null
@@ -1,51 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_TABLES_NLSF_CB1_10_H
-#define SKP_SILK_TABLES_NLSF_CB1_10_H
-
-#include "SKP_Silk_define.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define NLSF_MSVQ_CB1_10_STAGES 6
-#define NLSF_MSVQ_CB1_10_VECTORS 72
-
-/* NLSF codebook entropy coding tables */
-extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS + NLSF_MSVQ_CB1_10_STAGES ];
-extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr[ NLSF_MSVQ_CB1_10_STAGES ];
-extern const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx[ NLSF_MSVQ_CB1_10_STAGES ];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/src/SKP_Silk_tables_NLSF_CB1_16.c
+++ /dev/null
@@ -1,703 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-/**********************************************/
-/* This file has been automatically generated */
-/* */
-/* ROM usage: 134+1785 Words */
-/**********************************************/
-
-#include "SKP_Silk_structs.h"
-#include "SKP_Silk_tables_NLSF_CB1_16.h"
-
-const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS + NLSF_MSVQ_CB1_16_STAGES ] =
-{
- 0,
- 19099,
- 26957,
- 30639,
- 34242,
- 37546,
- 40447,
- 43287,
- 46005,
- 48445,
- 49865,
- 51284,
- 52673,
- 53975,
- 55221,
- 56441,
- 57267,
- 58025,
- 58648,
- 59232,
- 59768,
- 60248,
- 60729,
- 61210,
- 61690,
- 62171,
- 62651,
- 63132,
- 63613,
- 64093,
- 64574,
- 65054,
- 65535,
- 0,
- 28808,
- 38775,
- 46801,
- 51785,
- 55886,
- 59410,
- 62572,
- 65535,
- 0,
- 27376,
- 38639,
- 45052,
- 51465,
- 55448,
- 59021,
- 62594,
- 65535,
- 0,
- 33403,
- 39569,
- 45102,
- 49961,
- 54047,
- 57959,
- 61788,
- 65535,
- 0,
- 25851,
- 43356,
- 47828,
- 52204,
- 55964,
- 59413,
- 62507,
- 65535,
- 0,
- 34277,
- 40337,
- 45432,
- 50311,
- 54326,
- 58171,
- 61853,
- 65535,
- 0,
- 33538,
- 39865,
- 45302,
- 50076,
- 54549,
- 58478,
- 62159,
- 65535,
- 0,
- 27445,
- 35258,
- 40665,
- 46072,
- 51362,
- 56540,
- 61086,
- 65535,
- 0,
- 22080,
- 30779,
- 37065,
- 43085,
- 48849,
- 54613,
- 60133,
- 65535,
- 0,
- 13417,
- 21748,
- 30078,
- 38231,
- 46383,
- 53091,
- 59515,
- 65535
-};
-
-const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr[ NLSF_MSVQ_CB1_16_STAGES ] =
-{
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 0 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 33 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 42 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 51 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 60 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 69 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 78 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 87 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 96 ],
- &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 105 ]
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx[ NLSF_MSVQ_CB1_16_STAGES ] =
-{
- 5,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 3,
- 3,
- 4
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ NLSF_MSVQ_CB1_16_VECTORS ] =
-{
- 57, 98,
- 133, 134,
- 138, 144,
- 145, 147,
- 152, 177,
- 177, 178,
- 181, 183,
- 184, 202,
- 206, 215,
- 218, 222,
- 227, 227,
- 227, 227,
- 227, 227,
- 227, 227,
- 227, 227,
- 227, 227,
- 38, 87,
- 97, 119,
- 128, 135,
- 140, 143,
- 40, 81,
- 107, 107,
- 129, 134,
- 134, 143,
- 31, 109,
- 114, 120,
- 128, 130,
- 131, 132,
- 43, 61,
- 124, 125,
- 132, 136,
- 141, 142,
- 30, 110,
- 118, 120,
- 129, 131,
- 133, 133,
- 31, 108,
- 115, 121,
- 124, 130,
- 133, 137,
- 40, 98,
- 115, 115,
- 116, 117,
- 123, 124,
- 50, 93,
- 108, 110,
- 112, 112,
- 114, 115,
- 73, 95,
- 95, 96,
- 96, 105,
- 107, 110
-};
-
-const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min_Q15[ 16 + 1 ] =
-{
- 148,
- 3,
- 60,
- 68,
- 117,
- 86,
- 121,
- 124,
- 152,
- 153,
- 207,
- 151,
- 225,
- 239,
- 126,
- 183,
- 792
-};
-
-const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * NLSF_MSVQ_CB1_16_VECTORS ] =
-{
- 1309, 3060, 5071, 6996,
- 9028, 10938, 12934, 14891,
- 16933, 18854, 20792, 22764,
- 24753, 26659, 28626, 30501,
- 1264, 2745, 4610, 6408,
- 8286, 10043, 12084, 14108,
- 16118, 18163, 20095, 22164,
- 24264, 26316, 28329, 30251,
- 1044, 2080, 3672, 5179,
- 7140, 9100, 11070, 13065,
- 15423, 17790, 19931, 22101,
- 24290, 26361, 28499, 30418,
- 1131, 2476, 4478, 6149,
- 7902, 9875, 11938, 13809,
- 15869, 17730, 19948, 21707,
- 23761, 25535, 27426, 28917,
- 1040, 2004, 4026, 6100,
- 8432, 10494, 12610, 14694,
- 16797, 18775, 20799, 22782,
- 24772, 26682, 28631, 30516,
- 2310, 3812, 5913, 7933,
- 10033, 11881, 13885, 15798,
- 17751, 19576, 21482, 23276,
- 25157, 27010, 28833, 30623,
- 1254, 2847, 5013, 6781,
- 8626, 10370, 12726, 14633,
- 16281, 17852, 19870, 21472,
- 23002, 24629, 26710, 27960,
- 1468, 3059, 4987, 7026,
- 8741, 10412, 12281, 14020,
- 15970, 17723, 19640, 21522,
- 23472, 25661, 27986, 30225,
- 2171, 3566, 5605, 7384,
- 9404, 11220, 13030, 14758,
- 16687, 18417, 20346, 22091,
- 24055, 26212, 28356, 30397,
- 2409, 4676, 7543, 9786,
- 11419, 12935, 14368, 15653,
- 17366, 18943, 20762, 22477,
- 24440, 26327, 28284, 30242,
- 2354, 4222, 6820, 9107,
- 11596, 13934, 15973, 17682,
- 19158, 20517, 21991, 23420,
- 25178, 26936, 28794, 30527,
- 1323, 2414, 4184, 6039,
- 7534, 9398, 11099, 13097,
- 14799, 16451, 18434, 20887,
- 23490, 25838, 28046, 30225,
- 1361, 3243, 6048, 8511,
- 11001, 13145, 15073, 16608,
- 18126, 19381, 20912, 22607,
- 24660, 26668, 28663, 30566,
- 1216, 2648, 5901, 8422,
- 10037, 11425, 12973, 14603,
- 16686, 18600, 20555, 22415,
- 24450, 26280, 28206, 30077,
- 2417, 4048, 6316, 8433,
- 10510, 12757, 15072, 17295,
- 19573, 21503, 23329, 24782,
- 26235, 27689, 29214, 30819,
- 1012, 2345, 4991, 7377,
- 9465, 11916, 14296, 16566,
- 18672, 20544, 22292, 23838,
- 25415, 27050, 28848, 30551,
- 1937, 3693, 6267, 8019,
- 10372, 12194, 14287, 15657,
- 17431, 18864, 20769, 22206,
- 24037, 25463, 27383, 28602,
- 1969, 3305, 5017, 6726,
- 8375, 9993, 11634, 13280,
- 15078, 16751, 18464, 20119,
- 21959, 23858, 26224, 29298,
- 1198, 2647, 5428, 7423,
- 9775, 12155, 14665, 16344,
- 18121, 19790, 21557, 22847,
- 24484, 25742, 27639, 28711,
- 1636, 3353, 5447, 7597,
- 9837, 11647, 13964, 16019,
- 17862, 20116, 22319, 24037,
- 25966, 28086, 29914, 31294,
- 2676, 4105, 6378, 8223,
- 10058, 11549, 13072, 14453,
- 15956, 17355, 18931, 20402,
- 22183, 23884, 25717, 27723,
- 1373, 2593, 4449, 5633,
- 7300, 8425, 9474, 10818,
- 12769, 15722, 19002, 21429,
- 23682, 25924, 28135, 30333,
- 1596, 3183, 5378, 7164,
- 8670, 10105, 11470, 12834,
- 13991, 15042, 16642, 17903,
- 20759, 25283, 27770, 30240,
- 2037, 3987, 6237, 8117,
- 9954, 12245, 14217, 15892,
- 17775, 20114, 22314, 25942,
- 26305, 26483, 26796, 28561,
- 2181, 3858, 5760, 7924,
- 10041, 11577, 13769, 15700,
- 17429, 19879, 23583, 24538,
- 25212, 25693, 28688, 30507,
- 1992, 3882, 6474, 7883,
- 9381, 12672, 14340, 15701,
- 16658, 17832, 20850, 22885,
- 24677, 26457, 28491, 30460,
- 2391, 3988, 5448, 7432,
- 11014, 12579, 13140, 14146,
- 15898, 18592, 21104, 22993,
- 24673, 27186, 28142, 29612,
- 1713, 5102, 6989, 7798,
- 8670, 10110, 12746, 14881,
- 16709, 18407, 20126, 22107,
- 24181, 26198, 28237, 30137,
- 1612, 3617, 6148, 8359,
- 9576, 11528, 14936, 17809,
- 18287, 18729, 19001, 21111,
- 24631, 26596, 28740, 30643,
- 2266, 4168, 7862, 9546,
- 9618, 9703, 10134, 13897,
- 16265, 18432, 20587, 22605,
- 24754, 26994, 29125, 30840,
- 1840, 3917, 6272, 7809,
- 9714, 11438, 13767, 15799,
- 19244, 21972, 22980, 23180,
- 23723, 25650, 29117, 31085,
- 1458, 3612, 6008, 7488,
- 9827, 11893, 14086, 15734,
- 17440, 19535, 22424, 24767,
- 29246, 29928, 30516, 30947,
- -102, -121, -31, -6,
- 5, -2, 8, -18,
- -4, 6, 14, -2,
- -12, -16, -12, -60,
- -126, -353, -574, -677,
- -657, -617, -498, -393,
- -348, -277, -225, -164,
- -102, -70, -31, 33,
- 4, 379, 387, 551,
- 605, 620, 532, 482,
- 442, 454, 385, 347,
- 322, 299, 266, 200,
- 1168, 951, 672, 246,
- 60, -161, -259, -234,
- -253, -282, -203, -187,
- -155, -176, -198, -178,
- 10, 170, 393, 609,
- 555, 208, -330, -571,
- -769, -633, -319, -43,
- 95, 105, 106, 116,
- -152, -140, -125, 5,
- 173, 274, 264, 331,
- -37, -293, -609, -786,
- -959, -814, -645, -238,
- -91, 36, -11, -101,
- -279, -227, -40, 90,
- 530, 677, 890, 1104,
- 999, 835, 564, 295,
- -280, -364, -340, -331,
- -284, 288, 761, 880,
- 988, 627, 146, -226,
- -203, -181, -142, 39,
- 24, -26, -107, -92,
- -161, -135, -131, -88,
- -160, -156, -75, -43,
- -36, -6, -33, 33,
- -324, -415, -108, 124,
- 157, 191, 203, 197,
- 144, 109, 152, 176,
- 190, 122, 101, 159,
- 663, 668, 480, 400,
- 379, 444, 446, 458,
- 343, 351, 310, 228,
- 133, 44, 75, 63,
- -84, 39, -29, 35,
- -94, -233, -261, -354,
- 77, 262, -24, -145,
- -333, -409, -404, -597,
- -488, -300, 910, 592,
- 412, 120, 130, -51,
- -37, -77, -172, -181,
- -159, -148, -72, -62,
- 510, 516, 113, -585,
- -1075, -957, -417, -195,
- 9, 7, -88, -173,
- -91, 54, 98, 95,
- -28, 197, -527, -621,
- 157, 122, -168, 147,
- 309, 300, 336, 315,
- 396, 408, 376, 106,
- -162, -170, -315, 98,
- 821, 908, 570, -33,
- -312, -568, -572, -378,
- -107, 23, 156, 93,
- -129, -87, 20, -72,
- -37, 40, 21, 27,
- 48, 75, 77, 65,
- 46, 71, 66, 47,
- 136, 344, 236, 322,
- 170, 283, 269, 291,
- 162, -43, -204, -259,
- -240, -305, -350, -312,
- 447, 348, 345, 257,
- 71, -131, -77, -190,
- -202, -40, 35, 133,
- 261, 365, 438, 303,
- -8, 22, 140, 137,
- -300, -641, -764, -268,
- -23, -25, 73, -162,
- -150, -212, -72, 6,
- 39, 78, 104, -93,
- -308, -136, 117, -71,
- -513, -820, -700, -450,
- -161, -23, 29, 78,
- 337, 106, -406, -782,
- -112, 233, 383, 62,
- -126, 6, -77, -29,
- -146, -123, -51, -27,
- -27, -381, -641, 402,
- 539, 8, -207, -366,
- -36, -27, -204, -227,
- -237, -189, -64, 51,
- -92, -137, -281, 62,
- 233, 92, 148, 294,
- 363, 416, 564, 625,
- 370, -36, -469, -462,
- 102, 168, 32, 117,
- -21, 97, 139, 89,
- 104, 35, 4, 82,
- 66, 58, 73, 93,
- -76, -320, -236, -189,
- -203, -142, -27, -73,
- 9, -9, -25, 12,
- -15, 4, 4, -50,
- 314, 180, 162, -49,
- 199, -108, -227, -66,
- -447, -67, -264, -394,
- 5, 55, -133, -176,
- -116, -241, 272, 109,
- 282, 262, 192, -64,
- -392, -514, 156, 203,
- 154, 72, -34, -160,
- -73, 3, -33, -431,
- 321, 18, -567, -590,
- -108, 88, 66, 51,
- -31, -193, -46, 65,
- -29, -23, 215, -31,
- 101, -113, 32, 304,
- 88, 320, 448, 5,
- -439, -562, -508, -135,
- -13, -171, -8, 182,
- -99, -181, -149, 376,
- 476, 64, -396, -652,
- -150, 176, 222, 65,
- -590, 719, 271, 399,
- 245, 72, -156, -152,
- -176, 59, 94, 125,
- -9, -7, 9, 1,
- -61, -116, -82, 1,
- 79, 22, -44, -15,
- -48, -65, -62, -101,
- -102, -54, -70, -78,
- -80, -25, 398, 71,
- 139, 38, 90, 194,
- 222, 249, 165, 94,
- 221, 262, 163, 91,
- -206, 573, 200, -287,
- -147, 5, -18, -85,
- -74, -125, -87, 85,
- 141, 4, -4, 28,
- 234, 48, -150, -111,
- -506, 237, -209, 345,
- 94, -124, 77, 121,
- 143, 12, -80, -48,
- 191, 144, -93, -65,
- -151, -643, 435, 106,
- 87, 7, 65, 102,
- 94, 68, 5, 99,
- 222, 93, 94, 355,
- -13, -89, -228, -503,
- 287, 109, 108, 449,
- 253, -29, -109, -116,
- 15, -73, -20, 131,
- -147, 72, 59, -150,
- -594, 273, 316, 132,
- 199, 106, 198, 212,
- 220, 82, 45, -13,
- 223, 137, 270, 38,
- 252, 135, -177, -207,
- -360, -102, 403, 406,
- -14, 83, 64, 51,
- -7, -99, -97, -88,
- -124, -65, 42, 32,
- 28, 29, 12, 20,
- 119, -26, -212, -201,
- 373, 251, 141, 103,
- 36, -52, 66, 18,
- -6, -95, -196, 5,
- 98, -85, -108, 218,
- -164, 20, 356, 172,
- 37, 266, 23, 112,
- -24, -99, -92, -178,
- 29, -278, 388, -60,
- -220, 300, -13, 154,
- 191, 15, -37, -110,
- -153, -150, -114, -7,
- -94, -31, -62, -177,
- 4, -70, 35, 453,
- 147, -247, -328, 101,
- 20, -114, 147, 108,
- -119, -109, -102, -238,
- 55, -102, 173, -89,
- 129, 138, -330, -160,
- 485, 154, -59, -170,
- -20, -34, -261, -40,
- -129, 77, -84, 69,
- 83, 160, 169, 63,
- -516, 30, 336, 52,
- -0, -52, -124, 158,
- 19, 197, -10, -375,
- 405, 285, 114, -395,
- -47, 196, 62, 87,
- -106, -65, -75, -69,
- -13, 34, 99, 59,
- 83, 98, 44, 0,
- 24, 18, 17, 70,
- -22, 194, 208, 144,
- -79, -15, 32, -104,
- -28, -105, -186, -212,
- -228, -79, -76, 51,
- -71, 72, 118, -34,
- -3, -171, 5, 2,
- -108, -125, 62, -58,
- 58, -121, 73, -466,
- 92, 63, -94, -78,
- -76, 212, 36, -225,
- -71, -354, 152, 143,
- -79, -246, -51, -31,
- -6, -270, 240, 210,
- 30, -157, -231, 74,
- -146, 88, -273, 156,
- 92, 56, 71, 2,
- 318, 164, 32, -110,
- -35, -41, -95, -106,
- 11, 132, -68, 55,
- 123, -83, -149, 212,
- 132, 0, -194, 55,
- 206, -108, -353, 289,
- -195, 1, 233, -22,
- -60, 20, 26, 68,
- 166, 27, -58, 130,
- 112, 107, 27, -165,
- 115, -93, -37, 38,
- 83, 483, 65, -229,
- -13, 157, 85, 50,
- 136, 10, 32, 83,
- 82, 55, 5, -9,
- -52, -78, -81, -51,
- 40, 18, -127, -224,
- -41, 53, -210, -113,
- 24, -17, -187, -89,
- 8, 121, 83, 77,
- 91, -74, -35, -112,
- -161, -173, 102, 132,
- -125, -61, 103, -260,
- 52, 166, -32, -156,
- -87, -56, 60, -70,
- -124, 242, 114, -251,
- -166, 201, 127, 28,
- -11, 23, -80, -115,
- -20, -51, -348, 340,
- -34, 133, 13, 92,
- -124, -136, -120, -26,
- -6, 17, 28, 21,
- 120, -168, 160, -35,
- 115, 28, 9, 7,
- -56, 39, 156, 256,
- -18, 1, 277, 82,
- -70, -144, -88, -13,
- -59, -157, 8, -134,
- 21, -40, 58, -21,
- 194, -276, 97, 279,
- -56, -140, 125, 57,
- -184, -204, -70, -2,
- 128, -202, -78, 230,
- -23, 161, -102, 1,
- 1, 180, -31, -86,
- -167, -57, -60, 27,
- -13, 99, 108, 111,
- 76, 69, 34, -21,
- 53, 38, 34, 78,
- 73, 219, 51, 15,
- -72, -103, -207, 30,
- 213, -14, 31, -94,
- -40, -144, 67, 4,
- 105, 59, -240, 25,
- 244, 69, 58, 23,
- -24, -5, -15, -133,
- -71, -67, 181, 29,
- -45, 121, 96, 51,
- -72, -53, 56, -153,
- -27, 85, 183, 211,
- 105, -34, -46, 43,
- -72, -93, 36, -128,
- 29, 111, -95, -156,
- -179, -235, 21, -39,
- -71, -33, -61, -252,
- 230, -131, 157, -21,
- -85, -28, -123, 80,
- -160, 63, 47, -6,
- -49, -96, -19, 17,
- -58, 17, -0, -13,
- -170, 25, -35, 59,
- 10, -31, -413, 81,
- 62, 18, -164, 245,
- 92, -165, 42, 26,
- 126, -248, 193, -55,
- 16, 39, 14, 50
-};
-
-const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_16_Stage_info[ NLSF_MSVQ_CB1_16_STAGES ] =
-{
- { 32, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 0 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 32 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 40 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 48 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 56 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 64 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 72 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 72 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 80 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 80 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 88 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 88 ] },
- { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 96 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 96 ] }
-};
-
-const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB1_16 =
-{
- NLSF_MSVQ_CB1_16_STAGES,
- SKP_Silk_NLSF_CB1_16_Stage_info,
- SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min_Q15,
- SKP_Silk_NLSF_MSVQ_CB1_16_CDF,
- SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr,
- SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx
-};
-
--- a/src/SKP_Silk_tables_NLSF_CB1_16.h
+++ /dev/null
@@ -1,51 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef SKP_SILK_TABLES_NLSF_CB1_16_H
-#define SKP_SILK_TABLES_NLSF_CB1_16_H
-
-#include "SKP_Silk_define.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define NLSF_MSVQ_CB1_16_STAGES 10
-#define NLSF_MSVQ_CB1_16_VECTORS 104
-
-/* NLSF codebook entropy coding tables */
-extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS + NLSF_MSVQ_CB1_16_STAGES ];
-extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr[ NLSF_MSVQ_CB1_16_STAGES ];
-extern const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx[ NLSF_MSVQ_CB1_16_STAGES ];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/src/SKP_Silk_tables_gain.c
+++ /dev/null
@@ -1,77 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_tables.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-const SKP_uint16 SKP_Silk_gain_CDF[ 2 ][ 65 ] =
-{
-{
- 0, 18, 45, 94, 181, 320, 519, 777,
- 1093, 1468, 1909, 2417, 2997, 3657, 4404, 5245,
- 6185, 7228, 8384, 9664, 11069, 12596, 14244, 16022,
- 17937, 19979, 22121, 24345, 26646, 29021, 31454, 33927,
- 36438, 38982, 41538, 44068, 46532, 48904, 51160, 53265,
- 55184, 56904, 58422, 59739, 60858, 61793, 62568, 63210,
- 63738, 64165, 64504, 64769, 64976, 65133, 65249, 65330,
- 65386, 65424, 65451, 65471, 65487, 65501, 65513, 65524,
- 65535
-},
-{
- 0, 214, 581, 1261, 2376, 3920, 5742, 7632,
- 9449, 11157, 12780, 14352, 15897, 17427, 18949, 20462,
- 21957, 23430, 24889, 26342, 27780, 29191, 30575, 31952,
- 33345, 34763, 36200, 37642, 39083, 40519, 41930, 43291,
- 44602, 45885, 47154, 48402, 49619, 50805, 51959, 53069,
- 54127, 55140, 56128, 57101, 58056, 58979, 59859, 60692,
- 61468, 62177, 62812, 63368, 63845, 64242, 64563, 64818,
- 65023, 65184, 65306, 65391, 65447, 65482, 65505, 65521,
- 65535
-}
-};
-
-const SKP_int SKP_Silk_gain_CDF_offset = 32;
-
-
-const SKP_uint16 SKP_Silk_delta_gain_CDF[ 46 ] = {
- 0, 2358, 3856, 7023, 15376, 53058, 59135, 61555,
- 62784, 63498, 63949, 64265, 64478, 64647, 64783, 64894,
- 64986, 65052, 65113, 65169, 65213, 65252, 65284, 65314,
- 65338, 65359, 65377, 65392, 65403, 65415, 65424, 65432,
- 65440, 65448, 65455, 65462, 65470, 65477, 65484, 65491,
- 65499, 65506, 65513, 65521, 65528, 65535
-};
-
-const SKP_int SKP_Silk_delta_gain_CDF_offset = 5;
-
-#ifdef __cplusplus
-}
-#endif
--- a/src/SKP_Silk_tables_other.c
+++ /dev/null
@@ -1,151 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_structs.h"
-#include "SKP_Silk_define.h"
-#include "SKP_Silk_tables.h"
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */
-const SKP_int32 TargetRate_table_NB[ TARGET_RATE_TAB_SZ ] = {
- 0, 8000, 9000, 11000, 13000, 16000, 22000, 100000
-};
-const SKP_int32 TargetRate_table_MB[ TARGET_RATE_TAB_SZ ] = {
- 0, 10000, 12000, 14000, 17000, 21000, 28000, 100000
-};
-const SKP_int32 TargetRate_table_WB[ TARGET_RATE_TAB_SZ ] = {
- 0, 11000, 14000, 17000, 21000, 26000, 36000, 100000
-};
-const SKP_int32 TargetRate_table_SWB[ TARGET_RATE_TAB_SZ ] = {
- 0, 13000, 16000, 19000, 25000, 32000, 46000, 100000
-};
-const SKP_int32 SNR_table_Q1[ TARGET_RATE_TAB_SZ ] = {
- 19, 31, 35, 39, 43, 47, 54, 59
-};
-
-const SKP_int32 SNR_table_one_bit_per_sample_Q7[ 4 ] = {
- 1984, 2240, 2408, 2708
-};
-
-/* Filter coeficicnts for HP filter: 4. Order filter implementad as two biquad filters */
-const SKP_int16 SKP_Silk_SWB_detect_B_HP_Q13[ NB_SOS ][ 3 ] = {
- //{400, -550, 400}, {400, 130, 400}, {400, 390, 400}
- {575, -948, 575}, {575, -221, 575}, {575, 104, 575}
-};
-const SKP_int16 SKP_Silk_SWB_detect_A_HP_Q13[ NB_SOS ][ 2 ] = {
- {14613, 6868}, {12883, 7337}, {11586, 7911}
- //{14880, 6900}, {14400, 7300}, {13700, 7800}
-};
-
-/* Decoder high-pass filter coefficients for 24 kHz sampling, -6 dB @ 44 Hz */
-const SKP_int16 SKP_Silk_Dec_A_HP_24[ DEC_HP_ORDER ] = {-16220, 8030}; // second order AR coefs, Q13
-const SKP_int16 SKP_Silk_Dec_B_HP_24[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
-
-/* Decoder high-pass filter coefficients for 16 kHz sampling, - 6 dB @ 46 Hz */
-const SKP_int16 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ] = {-16127, 7940}; // second order AR coefs, Q13
-const SKP_int16 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
-
-/* Decoder high-pass filter coefficients for 12 kHz sampling, -6 dB @ 44 Hz */
-const SKP_int16 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ] = {-16043, 7859}; // second order AR coefs, Q13
-const SKP_int16 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
-
-/* Decoder high-pass filter coefficients for 8 kHz sampling, -6 dB @ 43 Hz */
-const SKP_int16 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ] = {-15885, 7710}; // second order AR coefs, Q13
-const SKP_int16 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
-
-/* table for LSB coding */
-const SKP_uint16 SKP_Silk_lsb_CDF[ 3 ] = {0, 40000, 65535};
-
-/* tables for LTPScale */
-const SKP_uint16 SKP_Silk_LTPscale_CDF[ 4 ] = {0, 32000, 48000, 65535};
-const SKP_int SKP_Silk_LTPscale_offset = 2;
-
-/* tables for VAD flag */
-const SKP_uint16 SKP_Silk_vadflag_CDF[ 3 ] = {0, 22000, 65535}; // 66% for speech, 33% for no speech
-const SKP_int SKP_Silk_vadflag_offset = 1;
-
-/* tables for sampling rate */
-const SKP_int SKP_Silk_SamplingRates_table[ 4 ] = {8, 12, 16, 24};
-const SKP_uint16 SKP_Silk_SamplingRates_CDF[ 5 ] = {0, 16000, 32000, 48000, 65535};
-const SKP_int SKP_Silk_SamplingRates_offset = 2;
-
-/* tables for NLSF interpolation factor */
-const SKP_uint16 SKP_Silk_NLSF_interpolation_factor_CDF[ 6 ] = {0, 3706, 8703, 19226, 30926, 65535};
-const SKP_int SKP_Silk_NLSF_interpolation_factor_offset = 4;
-
-/* Table for frame termination indication */
-const SKP_uint16 SKP_Silk_FrameTermination_CDF[ 5 ] = {0, 20000, 45000, 56000, 65535};
-const SKP_int SKP_Silk_FrameTermination_offset = 2;
-
-const SKP_uint16 SKP_Silk_FrameTermination_v4_CDF[ 6 ] = {0, 13107, 26214, 39321, 52428, 65535};
-const SKP_int SKP_Silk_FrameTermination_v4_offset = 4;
-
-/* Table for random seed */
-const SKP_uint16 SKP_Silk_Seed_CDF[ 5 ] = {0, 16384, 32768, 49152, 65535};
-const SKP_int SKP_Silk_Seed_offset = 2;
-
-/* Quantization offsets */
-const SKP_int16 SKP_Silk_Quantization_Offsets_Q10[ 2 ][ 2 ] = {
- { OFFSET_VL_Q10, OFFSET_VH_Q10 }, { OFFSET_UVL_Q10, OFFSET_UVH_Q10 }
-};
-
-/* Table for LTPScale */
-const SKP_int16 SKP_Silk_LTPScales_table_Q14[ 3 ] = { 15565, 11469, 8192 };
-
-#if SWITCH_TRANSITION_FILTERING
-/* Elliptic/Cauer filters designed with 0.1 dB passband ripple,
- 80 dB minimum stopband attenuation, and
- [0.95 : 0.15 : 0.35] normalized cut off frequencies. */
-
-/* Interpolation points for filter coefficients used in the bandwidth transition smoother */
-const SKP_int32 SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ] =
-{
-{ 250767114, 501534038, 250767114 },
-{ 209867381, 419732057, 209867381 },
-{ 170987846, 341967853, 170987846 },
-{ 131531482, 263046905, 131531482 },
-{ 89306658, 178584282, 89306658 }
-};
-
-/* Interpolation points for filter coefficients used in the bandwidth transition smoother */
-const SKP_int32 SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ] =
-{
-{ 506393414, 239854379 },
-{ 411067935, 169683996 },
-{ 306733530, 116694253 },
-{ 185807084, 77959395 },
-{ 35497197, 57401098 }
-};
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
--- a/src/SKP_Silk_tables_pitch_lag.c
+++ /dev/null
@@ -1,199 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_tables.h"
-
-const SKP_uint16 SKP_Silk_pitch_lag_NB_CDF[ 8 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
- 0, 194, 395, 608, 841, 1099, 1391, 1724,
- 2105, 2544, 3047, 3624, 4282, 5027, 5865, 6799,
- 7833, 8965, 10193, 11510, 12910, 14379, 15905, 17473,
- 19065, 20664, 22252, 23814, 25335, 26802, 28206, 29541,
- 30803, 31992, 33110, 34163, 35156, 36098, 36997, 37861,
- 38698, 39515, 40319, 41115, 41906, 42696, 43485, 44273,
- 45061, 45847, 46630, 47406, 48175, 48933, 49679, 50411,
- 51126, 51824, 52502, 53161, 53799, 54416, 55011, 55584,
- 56136, 56666, 57174, 57661, 58126, 58570, 58993, 59394,
- 59775, 60134, 60472, 60790, 61087, 61363, 61620, 61856,
- 62075, 62275, 62458, 62625, 62778, 62918, 63045, 63162,
- 63269, 63368, 63459, 63544, 63623, 63698, 63769, 63836,
- 63901, 63963, 64023, 64081, 64138, 64194, 64248, 64301,
- 64354, 64406, 64457, 64508, 64558, 64608, 64657, 64706,
- 64754, 64803, 64851, 64899, 64946, 64994, 65041, 65088,
- 65135, 65181, 65227, 65272, 65317, 65361, 65405, 65449,
- 65492, 65535
-};
-
-const SKP_int SKP_Silk_pitch_lag_NB_CDF_offset = 43;
-
-const SKP_uint16 SKP_Silk_pitch_contour_NB_CDF[ 12 ] = {
- 0, 14445, 18587, 25628, 30013, 34859, 40597, 48426,
- 54460, 59033, 62990, 65535
-};
-
-const SKP_int SKP_Silk_pitch_contour_NB_CDF_offset = 5;
-
-const SKP_uint16 SKP_Silk_pitch_lag_MB_CDF[ 12 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
- 0, 132, 266, 402, 542, 686, 838, 997,
- 1167, 1349, 1546, 1760, 1993, 2248, 2528, 2835,
- 3173, 3544, 3951, 4397, 4882, 5411, 5984, 6604,
- 7270, 7984, 8745, 9552, 10405, 11300, 12235, 13206,
- 14209, 15239, 16289, 17355, 18430, 19507, 20579, 21642,
- 22688, 23712, 24710, 25677, 26610, 27507, 28366, 29188,
- 29971, 30717, 31427, 32104, 32751, 33370, 33964, 34537,
- 35091, 35630, 36157, 36675, 37186, 37692, 38195, 38697,
- 39199, 39701, 40206, 40713, 41222, 41733, 42247, 42761,
- 43277, 43793, 44309, 44824, 45336, 45845, 46351, 46851,
- 47347, 47836, 48319, 48795, 49264, 49724, 50177, 50621,
- 51057, 51484, 51902, 52312, 52714, 53106, 53490, 53866,
- 54233, 54592, 54942, 55284, 55618, 55944, 56261, 56571,
- 56873, 57167, 57453, 57731, 58001, 58263, 58516, 58762,
- 58998, 59226, 59446, 59656, 59857, 60050, 60233, 60408,
- 60574, 60732, 60882, 61024, 61159, 61288, 61410, 61526,
- 61636, 61742, 61843, 61940, 62033, 62123, 62210, 62293,
- 62374, 62452, 62528, 62602, 62674, 62744, 62812, 62879,
- 62945, 63009, 63072, 63135, 63196, 63256, 63316, 63375,
- 63434, 63491, 63549, 63605, 63661, 63717, 63772, 63827,
- 63881, 63935, 63988, 64041, 64094, 64147, 64199, 64252,
- 64304, 64356, 64409, 64461, 64513, 64565, 64617, 64669,
- 64721, 64773, 64824, 64875, 64925, 64975, 65024, 65072,
- 65121, 65168, 65215, 65262, 65308, 65354, 65399, 65445,
- 65490, 65535
-};
-
-const SKP_int SKP_Silk_pitch_lag_MB_CDF_offset = 64;
-
-const SKP_uint16 SKP_Silk_pitch_lag_WB_CDF[ 16 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
- 0, 106, 213, 321, 429, 539, 651, 766,
- 884, 1005, 1132, 1264, 1403, 1549, 1705, 1870,
- 2047, 2236, 2439, 2658, 2893, 3147, 3420, 3714,
- 4030, 4370, 4736, 5127, 5546, 5993, 6470, 6978,
- 7516, 8086, 8687, 9320, 9985, 10680, 11405, 12158,
- 12938, 13744, 14572, 15420, 16286, 17166, 18057, 18955,
- 19857, 20759, 21657, 22547, 23427, 24293, 25141, 25969,
- 26774, 27555, 28310, 29037, 29736, 30406, 31048, 31662,
- 32248, 32808, 33343, 33855, 34345, 34815, 35268, 35704,
- 36127, 36537, 36938, 37330, 37715, 38095, 38471, 38844,
- 39216, 39588, 39959, 40332, 40707, 41084, 41463, 41844,
- 42229, 42615, 43005, 43397, 43791, 44186, 44583, 44982,
- 45381, 45780, 46179, 46578, 46975, 47371, 47765, 48156,
- 48545, 48930, 49312, 49690, 50064, 50433, 50798, 51158,
- 51513, 51862, 52206, 52544, 52877, 53204, 53526, 53842,
- 54152, 54457, 54756, 55050, 55338, 55621, 55898, 56170,
- 56436, 56697, 56953, 57204, 57449, 57689, 57924, 58154,
- 58378, 58598, 58812, 59022, 59226, 59426, 59620, 59810,
- 59994, 60173, 60348, 60517, 60681, 60840, 60993, 61141,
- 61284, 61421, 61553, 61679, 61800, 61916, 62026, 62131,
- 62231, 62326, 62417, 62503, 62585, 62663, 62737, 62807,
- 62874, 62938, 62999, 63057, 63113, 63166, 63217, 63266,
- 63314, 63359, 63404, 63446, 63488, 63528, 63567, 63605,
- 63642, 63678, 63713, 63748, 63781, 63815, 63847, 63879,
- 63911, 63942, 63973, 64003, 64033, 64063, 64092, 64121,
- 64150, 64179, 64207, 64235, 64263, 64291, 64319, 64347,
- 64374, 64401, 64428, 64455, 64481, 64508, 64534, 64560,
- 64585, 64610, 64635, 64660, 64685, 64710, 64734, 64758,
- 64782, 64807, 64831, 64855, 64878, 64902, 64926, 64950,
- 64974, 64998, 65022, 65045, 65069, 65093, 65116, 65139,
- 65163, 65186, 65209, 65231, 65254, 65276, 65299, 65321,
- 65343, 65364, 65386, 65408, 65429, 65450, 65471, 65493,
- 65514, 65535
-};
-
-const SKP_int SKP_Silk_pitch_lag_WB_CDF_offset = 86;
-
-
-const SKP_uint16 SKP_Silk_pitch_lag_SWB_CDF[ 24 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
- 0, 253, 505, 757, 1008, 1258, 1507, 1755,
- 2003, 2249, 2494, 2738, 2982, 3225, 3469, 3713,
- 3957, 4202, 4449, 4698, 4949, 5203, 5460, 5720,
- 5983, 6251, 6522, 6798, 7077, 7361, 7650, 7942,
- 8238, 8539, 8843, 9150, 9461, 9775, 10092, 10411,
- 10733, 11057, 11383, 11710, 12039, 12370, 12701, 13034,
- 13368, 13703, 14040, 14377, 14716, 15056, 15398, 15742,
- 16087, 16435, 16785, 17137, 17492, 17850, 18212, 18577,
- 18946, 19318, 19695, 20075, 20460, 20849, 21243, 21640,
- 22041, 22447, 22856, 23269, 23684, 24103, 24524, 24947,
- 25372, 25798, 26225, 26652, 27079, 27504, 27929, 28352,
- 28773, 29191, 29606, 30018, 30427, 30831, 31231, 31627,
- 32018, 32404, 32786, 33163, 33535, 33902, 34264, 34621,
- 34973, 35320, 35663, 36000, 36333, 36662, 36985, 37304,
- 37619, 37929, 38234, 38535, 38831, 39122, 39409, 39692,
- 39970, 40244, 40513, 40778, 41039, 41295, 41548, 41796,
- 42041, 42282, 42520, 42754, 42985, 43213, 43438, 43660,
- 43880, 44097, 44312, 44525, 44736, 44945, 45153, 45359,
- 45565, 45769, 45972, 46175, 46377, 46578, 46780, 46981,
- 47182, 47383, 47585, 47787, 47989, 48192, 48395, 48599,
- 48804, 49009, 49215, 49422, 49630, 49839, 50049, 50259,
- 50470, 50682, 50894, 51107, 51320, 51533, 51747, 51961,
- 52175, 52388, 52601, 52813, 53025, 53236, 53446, 53655,
- 53863, 54069, 54274, 54477, 54679, 54879, 55078, 55274,
- 55469, 55662, 55853, 56042, 56230, 56415, 56598, 56779,
- 56959, 57136, 57311, 57484, 57654, 57823, 57989, 58152,
- 58314, 58473, 58629, 58783, 58935, 59084, 59230, 59373,
- 59514, 59652, 59787, 59919, 60048, 60174, 60297, 60417,
- 60533, 60647, 60757, 60865, 60969, 61070, 61167, 61262,
- 61353, 61442, 61527, 61609, 61689, 61765, 61839, 61910,
- 61979, 62045, 62109, 62170, 62230, 62287, 62343, 62396,
- 62448, 62498, 62547, 62594, 62640, 62685, 62728, 62770,
- 62811, 62852, 62891, 62929, 62967, 63004, 63040, 63075,
- 63110, 63145, 63178, 63212, 63244, 63277, 63308, 63340,
- 63371, 63402, 63432, 63462, 63491, 63521, 63550, 63578,
- 63607, 63635, 63663, 63690, 63718, 63744, 63771, 63798,
- 63824, 63850, 63875, 63900, 63925, 63950, 63975, 63999,
- 64023, 64046, 64069, 64092, 64115, 64138, 64160, 64182,
- 64204, 64225, 64247, 64268, 64289, 64310, 64330, 64351,
- 64371, 64391, 64411, 64431, 64450, 64470, 64489, 64508,
- 64527, 64545, 64564, 64582, 64600, 64617, 64635, 64652,
- 64669, 64686, 64702, 64719, 64735, 64750, 64766, 64782,
- 64797, 64812, 64827, 64842, 64857, 64872, 64886, 64901,
- 64915, 64930, 64944, 64959, 64974, 64988, 65003, 65018,
- 65033, 65048, 65063, 65078, 65094, 65109, 65125, 65141,
- 65157, 65172, 65188, 65204, 65220, 65236, 65252, 65268,
- 65283, 65299, 65314, 65330, 65345, 65360, 65375, 65390,
- 65405, 65419, 65434, 65449, 65463, 65477, 65492, 65506,
- 65521, 65535
-};
-
-const SKP_int SKP_Silk_pitch_lag_SWB_CDF_offset = 128;
-
-
-const SKP_uint16 SKP_Silk_pitch_contour_CDF[ 35 ] = {
- 0, 372, 843, 1315, 1836, 2644, 3576, 4719,
- 6088, 7621, 9396, 11509, 14245, 17618, 20777, 24294,
- 27992, 33116, 40100, 44329, 47558, 50679, 53130, 55557,
- 57510, 59022, 60285, 61345, 62316, 63140, 63762, 64321,
- 64729, 65099, 65535
-};
-
-const SKP_int SKP_Silk_pitch_contour_CDF_offset = 17;
-
-const SKP_uint16 SKP_Silk_pitch_delta_CDF[23] = {
- 0, 343, 740, 1249, 1889, 2733, 3861, 5396,
- 7552, 10890, 16053, 24152, 30220, 34680, 37973, 40405,
- 42243, 43708, 44823, 45773, 46462, 47055, 65535
-};
-
-const SKP_int SKP_Silk_pitch_delta_CDF_offset = 11;
--- a/src/SKP_Silk_tables_pulses_per_block.c
+++ /dev/null
@@ -1,235 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_tables.h"
-
-const SKP_int SKP_Silk_max_pulses_table[ 4 ] = {
- 6, 8, 12, 18
-};
-
-const SKP_uint16 SKP_Silk_pulses_per_block_CDF[ 10 ][ 21 ] =
-{
-{
- 0, 47113, 61501, 64590, 65125, 65277, 65352, 65407,
- 65450, 65474, 65488, 65501, 65508, 65514, 65516, 65520,
- 65521, 65523, 65524, 65526, 65535
-},
-{
- 0, 26368, 47760, 58803, 63085, 64567, 65113, 65333,
- 65424, 65474, 65498, 65511, 65517, 65520, 65523, 65525,
- 65526, 65528, 65529, 65530, 65535
-},
-{
- 0, 9601, 28014, 45877, 57210, 62560, 64611, 65260,
- 65447, 65500, 65511, 65519, 65521, 65525, 65526, 65529,
- 65530, 65531, 65532, 65534, 65535
-},
-{
- 0, 3351, 12462, 25972, 39782, 50686, 57644, 61525,
- 63521, 64506, 65009, 65255, 65375, 65441, 65471, 65488,
- 65497, 65505, 65509, 65512, 65535
-},
-{
- 0, 488, 2944, 9295, 19712, 32160, 43976, 53121,
- 59144, 62518, 64213, 65016, 65346, 65470, 65511, 65515,
- 65525, 65529, 65531, 65534, 65535
-},
-{
- 0, 17013, 30405, 40812, 48142, 53466, 57166, 59845,
- 61650, 62873, 63684, 64223, 64575, 64811, 64959, 65051,
- 65111, 65143, 65165, 65183, 65535
-},
-{
- 0, 2994, 8323, 15845, 24196, 32300, 39340, 45140,
- 49813, 53474, 56349, 58518, 60167, 61397, 62313, 62969,
- 63410, 63715, 63906, 64056, 65535
-},
-{
- 0, 88, 721, 2795, 7542, 14888, 24420, 34593,
- 43912, 51484, 56962, 60558, 62760, 64037, 64716, 65069,
- 65262, 65358, 65398, 65420, 65535
-},
-{
- 0, 287, 789, 2064, 4398, 8174, 13534, 20151,
- 27347, 34533, 41295, 47242, 52070, 55772, 58458, 60381,
- 61679, 62533, 63109, 63519, 65535
-},
-{
- 0, 1, 3, 91, 4521, 14708, 28329, 41955,
- 52116, 58375, 61729, 63534, 64459, 64924, 65092, 65164,
- 65182, 65198, 65203, 65211, 65535
-}
-};
-
-const SKP_int SKP_Silk_pulses_per_block_CDF_offset = 6;
-
-
-const SKP_int16 SKP_Silk_pulses_per_block_BITS_Q6[ 9 ][ 20 ] =
-{
-{
- 30, 140, 282, 444, 560, 625, 654, 677,
- 731, 780, 787, 844, 859, 960, 896, 1024,
- 960, 1024, 960, 821
-},
-{
- 84, 103, 164, 252, 350, 442, 526, 607,
- 663, 731, 787, 859, 923, 923, 960, 1024,
- 960, 1024, 1024, 875
-},
-{
- 177, 117, 120, 162, 231, 320, 426, 541,
- 657, 803, 832, 960, 896, 1024, 923, 1024,
- 1024, 1024, 960, 1024
-},
-{
- 275, 182, 146, 144, 166, 207, 261, 322,
- 388, 450, 516, 582, 637, 710, 762, 821,
- 832, 896, 923, 734
-},
-{
- 452, 303, 216, 170, 153, 158, 182, 220,
- 274, 337, 406, 489, 579, 681, 896, 811,
- 896, 960, 923, 1024
-},
-{
- 125, 147, 170, 202, 232, 265, 295, 332,
- 368, 406, 443, 483, 520, 563, 606, 646,
- 704, 739, 757, 483
-},
-{
- 285, 232, 200, 190, 193, 206, 224, 244,
- 266, 289, 315, 340, 367, 394, 425, 462,
- 496, 539, 561, 350
-},
-{
- 611, 428, 319, 242, 202, 178, 172, 180,
- 199, 229, 268, 313, 364, 422, 482, 538,
- 603, 683, 739, 586
-},
-{
- 501, 450, 364, 308, 264, 231, 212, 204,
- 204, 210, 222, 241, 265, 295, 326, 362,
- 401, 437, 469, 321
-}
-};
-
-const SKP_uint16 SKP_Silk_rate_levels_CDF[ 2 ][ 10 ] =
-{
-{
- 0, 2005, 12717, 20281, 31328, 36234, 45816, 57753,
- 63104, 65535
-},
-{
- 0, 8553, 23489, 36031, 46295, 53519, 56519, 59151,
- 64185, 65535
-}
-};
-
-const SKP_int SKP_Silk_rate_levels_CDF_offset = 4;
-
-
-const SKP_int16 SKP_Silk_rate_levels_BITS_Q6[ 2 ][ 9 ] =
-{
-{
- 322, 167, 199, 164, 239, 178, 157, 231,
- 304
-},
-{
- 188, 137, 153, 171, 204, 285, 297, 237,
- 358
-}
-};
-
-const SKP_uint16 SKP_Silk_shell_code_table0[ 33 ] = {
- 0, 32748, 65535, 0, 9505, 56230, 65535, 0,
- 4093, 32204, 61720, 65535, 0, 2285, 16207, 48750,
- 63424, 65535, 0, 1709, 9446, 32026, 55752, 63876,
- 65535, 0, 1623, 6986, 21845, 45381, 59147, 64186,
- 65535
-};
-
-const SKP_uint16 SKP_Silk_shell_code_table1[ 52 ] = {
- 0, 32691, 65535, 0, 12782, 52752, 65535, 0,
- 4847, 32665, 60899, 65535, 0, 2500, 17305, 47989,
- 63369, 65535, 0, 1843, 10329, 32419, 55433, 64277,
- 65535, 0, 1485, 7062, 21465, 43414, 59079, 64623,
- 65535, 0, 0, 4841, 14797, 31799, 49667, 61309,
- 65535, 65535, 0, 0, 0, 8032, 21695, 41078,
- 56317, 65535, 65535, 65535
-};
-
-const SKP_uint16 SKP_Silk_shell_code_table2[ 102 ] = {
- 0, 32615, 65535, 0, 14447, 50912, 65535, 0,
- 6301, 32587, 59361, 65535, 0, 3038, 18640, 46809,
- 62852, 65535, 0, 1746, 10524, 32509, 55273, 64278,
- 65535, 0, 1234, 6360, 21259, 43712, 59651, 64805,
- 65535, 0, 1020, 4461, 14030, 32286, 51249, 61904,
- 65100, 65535, 0, 851, 3435, 10006, 23241, 40797,
- 55444, 63009, 65252, 65535, 0, 0, 2075, 7137,
- 17119, 31499, 46982, 58723, 63976, 65535, 65535, 0,
- 0, 0, 3820, 11572, 23038, 37789, 51969, 61243,
- 65535, 65535, 65535, 0, 0, 0, 0, 6882,
- 16828, 30444, 44844, 57365, 65535, 65535, 65535, 65535,
- 0, 0, 0, 0, 0, 10093, 22963, 38779,
- 54426, 65535, 65535, 65535, 65535, 65535
-};
-
-const SKP_uint16 SKP_Silk_shell_code_table3[ 207 ] = {
- 0, 32324, 65535, 0, 15328, 49505, 65535, 0,
- 7474, 32344, 57955, 65535, 0, 3944, 19450, 45364,
- 61873, 65535, 0, 2338, 11698, 32435, 53915, 63734,
- 65535, 0, 1506, 7074, 21778, 42972, 58861, 64590,
- 65535, 0, 1027, 4490, 14383, 32264, 50980, 61712,
- 65043, 65535, 0, 760, 3022, 9696, 23264, 41465,
- 56181, 63253, 65251, 65535, 0, 579, 2256, 6873,
- 16661, 31951, 48250, 59403, 64198, 65360, 65535, 0,
- 464, 1783, 5181, 12269, 24247, 39877, 53490, 61502,
- 64591, 65410, 65535, 0, 366, 1332, 3880, 9273,
- 18585, 32014, 45928, 56659, 62616, 64899, 65483, 65535,
- 0, 286, 1065, 3089, 6969, 14148, 24859, 38274,
- 50715, 59078, 63448, 65091, 65481, 65535, 0, 0,
- 482, 2010, 5302, 10408, 18988, 30698, 43634, 54233,
- 60828, 64119, 65288, 65535, 65535, 0, 0, 0,
- 1006, 3531, 7857, 14832, 24543, 36272, 47547, 56883,
- 62327, 64746, 65535, 65535, 65535, 0, 0, 0,
- 0, 1863, 4950, 10730, 19284, 29397, 41382, 52335,
- 59755, 63834, 65535, 65535, 65535, 65535, 0, 0,
- 0, 0, 0, 2513, 7290, 14487, 24275, 35312,
- 46240, 55841, 62007, 65535, 65535, 65535, 65535, 65535,
- 0, 0, 0, 0, 0, 0, 3606, 9573,
- 18764, 28667, 40220, 51290, 59924, 65535, 65535, 65535,
- 65535, 65535, 65535, 0, 0, 0, 0, 0,
- 0, 0, 4879, 13091, 23376, 36061, 49395, 59315,
- 65535, 65535, 65535, 65535, 65535, 65535, 65535
-};
-
-const SKP_uint16 SKP_Silk_shell_code_table_offsets[ 19 ] = {
- 0, 0, 3, 7, 12, 18, 25, 33,
- 42, 52, 63, 75, 88, 102, 117, 133,
- 150, 168, 187
-};
-
--- a/src/SKP_Silk_tables_sign.c
+++ /dev/null
@@ -1,141 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_tables.h"
-
-const SKP_uint16 SKP_Silk_sign_CDF[ 36 ][ 3 ] =
-{
-{
- 0, 37840, 65535
-},
-{
- 0, 36944, 65535
-},
-{
- 0, 36251, 65535
-},
-{
- 0, 35304, 65535
-},
-{
- 0, 34715, 65535
-},
-{
- 0, 35503, 65535
-},
-{
- 0, 34529, 65535
-},
-{
- 0, 34296, 65535
-},
-{
- 0, 34016, 65535
-},
-{
- 0, 47659, 65535
-},
-{
- 0, 44945, 65535
-},
-{
- 0, 42503, 65535
-},
-{
- 0, 40235, 65535
-},
-{
- 0, 38569, 65535
-},
-{
- 0, 40254, 65535
-},
-{
- 0, 37851, 65535
-},
-{
- 0, 37243, 65535
-},
-{
- 0, 36595, 65535
-},
-{
- 0, 43410, 65535
-},
-{
- 0, 44121, 65535
-},
-{
- 0, 43127, 65535
-},
-{
- 0, 40978, 65535
-},
-{
- 0, 38845, 65535
-},
-{
- 0, 40433, 65535
-},
-{
- 0, 38252, 65535
-},
-{
- 0, 37795, 65535
-},
-{
- 0, 36637, 65535
-},
-{
- 0, 59159, 65535
-},
-{
- 0, 55630, 65535
-},
-{
- 0, 51806, 65535
-},
-{
- 0, 48073, 65535
-},
-{
- 0, 45036, 65535
-},
-{
- 0, 48416, 65535
-},
-{
- 0, 43857, 65535
-},
-{
- 0, 42678, 65535
-},
-{
- 0, 41146, 65535
-}
-};
-
--- a/src/SKP_Silk_tables_type_offset.c
+++ /dev/null
@@ -1,52 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2010, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#include "SKP_Silk_tables.h"
-
-const SKP_uint16 SKP_Silk_type_offset_CDF[ 5 ] = {
- 0, 37522, 41030, 44212, 65535
-};
-
-const SKP_int SKP_Silk_type_offset_CDF_offset = 2;
-
-
-const SKP_uint16 SKP_Silk_type_offset_joint_CDF[ 4 ][ 5 ] =
-{
-{
- 0, 57686, 61230, 62358, 65535
-},
-{
- 0, 18346, 40067, 43659, 65535
-},
-{
- 0, 22694, 24279, 35507, 65535
-},
-{
- 0, 6067, 7215, 13010, 65535
-}
-};
-
--- a/src/Silk_FIX.2008.vcproj
+++ /dev/null
@@ -1,837 +1,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="Silk_FIX"
- ProjectGUID="{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
- RootNamespace="Silk"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="0"
- AdditionalIncludeDirectories="../interface"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- FloatingPointModel="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="0"
- FavorSizeOrSpeed="0"
- AdditionalIncludeDirectories="../interface"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- GeneratePreprocessedFile="0"
- RuntimeLibrary="0"
- FloatingPointModel="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="0"
- AdditionalIncludeDirectories="../interface"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- FloatingPointModel="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="0"
- FavorSizeOrSpeed="0"
- AdditionalIncludeDirectories="../interface"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- GeneratePreprocessedFile="0"
- RuntimeLibrary="0"
- FloatingPointModel="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\SKP_Silk_A2NLSF.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_allpass_int.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_ana_filt_bank_1.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_apply_sine_window.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_array_maxabs.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_autocorr.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_biquad.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_biquad_alt.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_burg_modified.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_bwexpander.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_bwexpander_32.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_CNG.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_code_signs.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_control_codec_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_corrMatrix_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_create_init_destroy.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_dec_API.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_core.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_frame.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_indices_v4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_parameters.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_parameters_v4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_pulses.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decoder_set_fs.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_detect_SWB_input.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_enc_API.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_frame_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_parameters.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_parameters_v4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_pulses.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_LPC_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_LTP_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_pitch_lags_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_pred_coefs_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_gain_quant.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_HP_variable_cutoff_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_init_encoder_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_inner_prod_aligned.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_interpolate.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_k2a.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_k2a_Q16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LBRR_reset.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_lin2log.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_log2lin.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_lowpass_int.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_lowpass_short.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LP_variable_cutoff.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_inv_pred_gain.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_stabilize.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_synthesis_filter.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_synthesis_order16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LSF_cos_table.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LTP_analysis_filter_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LTP_scale_ctrl_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_MA.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF2A.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF2A_stable.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_MSVQ_decode.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_MSVQ_encode_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_stabilize.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_VQ_rate_distortion_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_VQ_sum_error_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_VQ_weights_laroia.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_noise_shape_analysis_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NSQ.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NSQ_del_dec.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pitch_analysis_core.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pitch_est_tables.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_PLC.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_prefilter_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_process_gains_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_process_NLSFs_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pulses_to_bytes.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_quant_LTP_gains_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_range_coder.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_regularize_correlations_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_2.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_2_coarse.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_2_coarsest.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_3.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_1_coarse.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3_coarse.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3_coarsest.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3_rom.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_1.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_2.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_2_rom.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_4_3.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_residual_energy16_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_residual_energy_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_scale_copy_vector16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_scale_vector.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_schur.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_schur64.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_shell_coder.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_sigm_Q15.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_solve_LS_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_sort.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_sum_sqr_shift.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_gain.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_LTP.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB0_10.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB0_16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB1_10.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB1_16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_other.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_pitch_lag.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_pulses_per_block.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_sign.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_type_offset.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_VAD.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_VQ_nearest_neighbor_FIX.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\interface\SKP_Silk_control.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_define.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_define_FIX.h"
- >
- </File>
- <File
- RelativePath="..\interface\SKP_Silk_errors.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_Inlines.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_macros.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_main.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_main_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_perceptual_parameters_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pitch_est_defines.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_PLC.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_rom.h"
- >
- </File>
- <File
- RelativePath="..\interface\SKP_Silk_SDK_API.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_SigProc_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_structs.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_structs_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables.h"
- >
- </File>
- <File
- RelativePath="..\interface\SKP_Silk_typedef.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
--- a/src/Silk_FIX.2010.vcxproj
+++ /dev/null
@@ -1,300 +1,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectName>Silk_FIX</ProjectName>
- <ProjectGuid>{56B91D01-9150-4BBF-AFA1-5B68AB991B76}</ProjectGuid>
- <RootNamespace>Silk</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../interface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>true</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <FloatingPointModel>Fast</FloatingPointModel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- <PostBuildEvent>
- <Command>
- </Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <InlineFunctionExpansion>Default</InlineFunctionExpansion>
- <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../interface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessToFile>false</PreprocessToFile>
- <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FloatingPointModel>Fast</FloatingPointModel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <PostBuildEvent>
- <Command>
- </Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../interface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>true</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <FloatingPointModel>Fast</FloatingPointModel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <PostBuildEvent>
- <Command>
- </Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
- <ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <InlineFunctionExpansion>Default</InlineFunctionExpansion>
- <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../interface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessToFile>false</PreprocessToFile>
- <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FloatingPointModel>Fast</FloatingPointModel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <PostBuildEvent>
- <Command>
- </Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="SKP_Silk_A2NLSF.c" />
- <ClCompile Include="SKP_Silk_allpass_int.c" />
- <ClCompile Include="SKP_Silk_ana_filt_bank_1.c" />
- <ClCompile Include="SKP_Silk_apply_sine_window.c" />
- <ClCompile Include="SKP_Silk_array_maxabs.c" />
- <ClCompile Include="SKP_Silk_autocorr.c" />
- <ClCompile Include="SKP_Silk_biquad.c" />
- <ClCompile Include="SKP_Silk_biquad_alt.c" />
- <ClCompile Include="SKP_Silk_burg_modified.c" />
- <ClCompile Include="SKP_Silk_bwexpander.c" />
- <ClCompile Include="SKP_Silk_bwexpander_32.c" />
- <ClCompile Include="SKP_Silk_CNG.c" />
- <ClCompile Include="SKP_Silk_code_signs.c" />
- <ClCompile Include="SKP_Silk_control_codec_FIX.c" />
- <ClCompile Include="SKP_Silk_corrMatrix_FIX.c" />
- <ClCompile Include="SKP_Silk_create_init_destroy.c" />
- <ClCompile Include="SKP_Silk_dec_API.c" />
- <ClCompile Include="SKP_Silk_decode_core.c" />
- <ClCompile Include="SKP_Silk_decode_frame.c" />
- <ClCompile Include="SKP_Silk_decode_indices_v4.c" />
- <ClCompile Include="SKP_Silk_decode_parameters.c" />
- <ClCompile Include="SKP_Silk_decode_parameters_v4.c" />
- <ClCompile Include="SKP_Silk_decode_pulses.c" />
- <ClCompile Include="SKP_Silk_decoder_set_fs.c" />
- <ClCompile Include="SKP_Silk_detect_SWB_input.c" />
- <ClCompile Include="SKP_Silk_enc_API.c" />
- <ClCompile Include="SKP_Silk_encode_frame_FIX.c" />
- <ClCompile Include="SKP_Silk_encode_parameters.c" />
- <ClCompile Include="SKP_Silk_encode_parameters_v4.c" />
- <ClCompile Include="SKP_Silk_encode_pulses.c" />
- <ClCompile Include="SKP_Silk_find_LPC_FIX.c" />
- <ClCompile Include="SKP_Silk_find_LTP_FIX.c" />
- <ClCompile Include="SKP_Silk_find_pitch_lags_FIX.c" />
- <ClCompile Include="SKP_Silk_find_pred_coefs_FIX.c" />
- <ClCompile Include="SKP_Silk_gain_quant.c" />
- <ClCompile Include="SKP_Silk_HP_variable_cutoff_FIX.c" />
- <ClCompile Include="SKP_Silk_init_encoder_FIX.c" />
- <ClCompile Include="SKP_Silk_inner_prod_aligned.c" />
- <ClCompile Include="SKP_Silk_interpolate.c" />
- <ClCompile Include="SKP_Silk_k2a.c" />
- <ClCompile Include="SKP_Silk_k2a_Q16.c" />
- <ClCompile Include="SKP_Silk_LBRR_reset.c" />
- <ClCompile Include="SKP_Silk_lin2log.c" />
- <ClCompile Include="SKP_Silk_log2lin.c" />
- <ClCompile Include="SKP_Silk_lowpass_int.c" />
- <ClCompile Include="SKP_Silk_lowpass_short.c" />
- <ClCompile Include="SKP_Silk_LP_variable_cutoff.c" />
- <ClCompile Include="SKP_Silk_LPC_inv_pred_gain.c" />
- <ClCompile Include="SKP_Silk_LPC_stabilize.c" />
- <ClCompile Include="SKP_Silk_LPC_synthesis_filter.c" />
- <ClCompile Include="SKP_Silk_LPC_synthesis_order16.c" />
- <ClCompile Include="SKP_Silk_LSF_cos_table.c" />
- <ClCompile Include="SKP_Silk_LTP_analysis_filter_FIX.c" />
- <ClCompile Include="SKP_Silk_LTP_scale_ctrl_FIX.c" />
- <ClCompile Include="SKP_Silk_MA.c" />
- <ClCompile Include="SKP_Silk_NLSF2A.c" />
- <ClCompile Include="SKP_Silk_NLSF2A_stable.c" />
- <ClCompile Include="SKP_Silk_NLSF_MSVQ_decode.c" />
- <ClCompile Include="SKP_Silk_NLSF_MSVQ_encode_FIX.c" />
- <ClCompile Include="SKP_Silk_NLSF_stabilize.c" />
- <ClCompile Include="SKP_Silk_NLSF_VQ_rate_distortion_FIX.c" />
- <ClCompile Include="SKP_Silk_NLSF_VQ_sum_error_FIX.c" />
- <ClCompile Include="SKP_Silk_NLSF_VQ_weights_laroia.c" />
- <ClCompile Include="SKP_Silk_noise_shape_analysis_FIX.c" />
- <ClCompile Include="SKP_Silk_NSQ.c" />
- <ClCompile Include="SKP_Silk_NSQ_del_dec.c" />
- <ClCompile Include="SKP_Silk_pitch_analysis_core.c" />
- <ClCompile Include="SKP_Silk_pitch_est_tables.c" />
- <ClCompile Include="SKP_Silk_PLC.c" />
- <ClCompile Include="SKP_Silk_prefilter_FIX.c" />
- <ClCompile Include="SKP_Silk_process_gains_FIX.c" />
- <ClCompile Include="SKP_Silk_process_NLSFs_FIX.c" />
- <ClCompile Include="SKP_Silk_pulses_to_bytes.c" />
- <ClCompile Include="SKP_Silk_quant_LTP_gains_FIX.c" />
- <ClCompile Include="SKP_Silk_range_coder.c" />
- <ClCompile Include="SKP_Silk_regularize_correlations_FIX.c" />
- <ClCompile Include="SKP_Silk_resample_1_2.c" />
- <ClCompile Include="SKP_Silk_resample_1_2_coarse.c" />
- <ClCompile Include="SKP_Silk_resample_1_2_coarsest.c" />
- <ClCompile Include="SKP_Silk_resample_1_3.c" />
- <ClCompile Include="SKP_Silk_resample_2_1_coarse.c" />
- <ClCompile Include="SKP_Silk_resample_2_3.c" />
- <ClCompile Include="SKP_Silk_resample_2_3_coarse.c" />
- <ClCompile Include="SKP_Silk_resample_2_3_coarsest.c" />
- <ClCompile Include="SKP_Silk_resample_2_3_rom.c" />
- <ClCompile Include="SKP_Silk_resample_3_1.c" />
- <ClCompile Include="SKP_Silk_resample_3_2.c" />
- <ClCompile Include="SKP_Silk_resample_3_2_rom.c" />
- <ClCompile Include="SKP_Silk_resample_3_4.c" />
- <ClCompile Include="SKP_Silk_resample_4_3.c" />
- <ClCompile Include="SKP_Silk_residual_energy16_FIX.c" />
- <ClCompile Include="SKP_Silk_residual_energy_FIX.c" />
- <ClCompile Include="SKP_Silk_scale_copy_vector16.c" />
- <ClCompile Include="SKP_Silk_scale_vector.c" />
- <ClCompile Include="SKP_Silk_schur.c" />
- <ClCompile Include="SKP_Silk_schur64.c" />
- <ClCompile Include="SKP_Silk_shell_coder.c" />
- <ClCompile Include="SKP_Silk_sigm_Q15.c" />
- <ClCompile Include="SKP_Silk_solve_LS_FIX.c" />
- <ClCompile Include="SKP_Silk_sort.c" />
- <ClCompile Include="SKP_Silk_sum_sqr_shift.c" />
- <ClCompile Include="SKP_Silk_tables_gain.c" />
- <ClCompile Include="SKP_Silk_tables_LTP.c" />
- <ClCompile Include="SKP_Silk_tables_NLSF_CB0_10.c" />
- <ClCompile Include="SKP_Silk_tables_NLSF_CB0_16.c" />
- <ClCompile Include="SKP_Silk_tables_NLSF_CB1_10.c" />
- <ClCompile Include="SKP_Silk_tables_NLSF_CB1_16.c" />
- <ClCompile Include="SKP_Silk_tables_other.c" />
- <ClCompile Include="SKP_Silk_tables_pitch_lag.c" />
- <ClCompile Include="SKP_Silk_tables_pulses_per_block.c" />
- <ClCompile Include="SKP_Silk_tables_sign.c" />
- <ClCompile Include="SKP_Silk_tables_type_offset.c" />
- <ClCompile Include="SKP_Silk_VAD.c" />
- <ClCompile Include="SKP_Silk_VQ_nearest_neighbor_FIX.c" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\interface\SKP_Silk_control.h" />
- <ClInclude Include="SKP_Silk_define.h" />
- <ClInclude Include="SKP_Silk_define_FIX.h" />
- <ClInclude Include="..\interface\SKP_Silk_errors.h" />
- <ClInclude Include="SKP_Silk_Inlines.h" />
- <ClInclude Include="SKP_Silk_macros.h" />
- <ClInclude Include="SKP_Silk_main.h" />
- <ClInclude Include="SKP_Silk_main_FIX.h" />
- <ClInclude Include="SKP_Silk_perceptual_parameters_FIX.h" />
- <ClInclude Include="SKP_Silk_pitch_est_defines.h" />
- <ClInclude Include="SKP_Silk_PLC.h" />
- <ClInclude Include="SKP_Silk_resample_rom.h" />
- <ClInclude Include="..\interface\SKP_Silk_SDK_API.h" />
- <ClInclude Include="SKP_Silk_SigProc_FIX.h" />
- <ClInclude Include="SKP_Silk_structs.h" />
- <ClInclude Include="SKP_Silk_structs_FIX.h" />
- <ClInclude Include="SKP_Silk_tables.h" />
- <ClInclude Include="..\interface\SKP_Silk_typedef.h" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project>
\ No newline at end of file
--- a/src/Silk_FIX.vcproj
+++ /dev/null
@@ -1,700 +1,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="Silk_FIX"
- ProjectGUID="{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
- RootNamespace="Silk"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="0"
- AdditionalIncludeDirectories="../interface"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- FloatingPointModel="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="SKP_Silk_FIX_Win32_debug.lib"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="0"
- FavorSizeOrSpeed="0"
- AdditionalIncludeDirectories="../interface"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- GeneratePreprocessedFile="0"
- RuntimeLibrary="0"
- FloatingPointModel="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="SKP_Silk_FIX_Win32_mt.lib"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\SKP_Silk_A2NLSF.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_allpass_int.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_ana_filt_bank_1.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_apply_sine_window.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_array_maxabs.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_autocorr.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_biquad.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_biquad_alt.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_burg_modified.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_bwexpander.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_bwexpander_32.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_CNG.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_code_signs.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_control_codec_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_corrMatrix_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_create_init_destroy.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_dec_API.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_core.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_frame.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_indices_v4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_parameters.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_parameters_v4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decode_pulses.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_decoder_set_fs.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_detect_SWB_input.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_enc_API.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_frame_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_parameters.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_parameters_v4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_encode_pulses.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_LPC_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_LTP_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_pitch_lags_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_find_pred_coefs_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_gain_quant.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_HP_variable_cutoff_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_init_encoder_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_inner_prod_aligned.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_interpolate.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_k2a.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_k2a_Q16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LBRR_reset.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_lin2log.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_log2lin.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_lowpass_int.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_lowpass_short.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LP_variable_cutoff.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_inv_pred_gain.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_stabilize.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_synthesis_filter.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LPC_synthesis_order16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LSF_cos_table.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LTP_analysis_filter_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_LTP_scale_ctrl_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_MA.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF2A.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF2A_stable.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_MSVQ_decode.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_MSVQ_encode_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_stabilize.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_VQ_rate_distortion_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_VQ_sum_error_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NLSF_VQ_weights_laroia.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_noise_shape_analysis_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NSQ.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_NSQ_del_dec.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pitch_analysis_core.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pitch_est_tables.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_PLC.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_prefilter_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_process_gains_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_process_NLSFs_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pulses_to_bytes.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_quant_LTP_gains_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_range_coder.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_regularize_correlations_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_2.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_2_coarse.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_2_coarsest.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_1_3.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_1_coarse.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3_coarse.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3_coarsest.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_2_3_rom.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_1.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_2.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_2_rom.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_3_4.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_4_3.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_residual_energy16_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_residual_energy_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_scale_copy_vector16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_scale_vector.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_schur.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_schur64.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_shell_coder.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_sigm_Q15.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_solve_LS_FIX.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_sort.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_sum_sqr_shift.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_gain.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_LTP.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB0_10.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB0_16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB1_10.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_NLSF_CB1_16.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_other.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_pitch_lag.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_pulses_per_block.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_sign.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables_type_offset.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_VAD.c"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_VQ_nearest_neighbor_FIX.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\interface\SKP_Silk_control.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_define.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_define_FIX.h"
- >
- </File>
- <File
- RelativePath="..\interface\SKP_Silk_errors.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_Inlines.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_macros.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_main.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_main_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_perceptual_parameters_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_pitch_est_defines.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_PLC.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_resample_rom.h"
- >
- </File>
- <File
- RelativePath="..\interface\SKP_Silk_SDK_API.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_SigProc_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_structs.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_structs_FIX.h"
- >
- </File>
- <File
- RelativePath=".\SKP_Silk_tables.h"
- >
- </File>
- <File
- RelativePath="..\interface\SKP_Silk_typedef.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
--- /dev/null
+++ b/src_FIX/SKP_Silk_HP_variable_cutoff_FIX.c
@@ -1,0 +1,118 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+#if HIGH_PASS_INPUT
+
+#define SKP_RADIANS_CONSTANT_Q19 1482 // 0.45f * 2.0f * 3.14159265359 / 1000
+#define SKP_LOG2_VARIABLE_HP_MIN_FREQ_Q7 809 // log(80) in Q7
+
+/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */
+void SKP_Silk_HP_variable_cutoff_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */
+ SKP_int16 *out, /* O high-pass filtered output signal */
+ const SKP_int16 *in /* I input signal */
+)
+{
+ SKP_int quality_Q15;
+ SKP_int32 B_Q28[ 3 ], A_Q28[ 2 ];
+ SKP_int32 Fc_Q19, r_Q28, r_Q22;
+ SKP_int32 pitch_freq_Hz_Q16, pitch_freq_log_Q7, delta_freq_Q7;
+
+ /*********************************************/
+ /* Estimate Low End of Pitch Frequency Range */
+ /*********************************************/
+ if( psEnc->sCmn.prev_sigtype == SIG_TYPE_VOICED ) {
+ /* difference, in log domain */
+ pitch_freq_Hz_Q16 = SKP_DIV32_16( SKP_LSHIFT( SKP_MUL( psEnc->sCmn.fs_kHz, 1000 ), 16 ), psEnc->sCmn.prevLag );
+ pitch_freq_log_Q7 = SKP_Silk_lin2log( pitch_freq_Hz_Q16 ) - ( 16 << 7 ); //0x70
+
+ /* adjustment based on quality */
+ quality_Q15 = psEncCtrl->input_quality_bands_Q15[ 0 ];
+ pitch_freq_log_Q7 = SKP_SUB32( pitch_freq_log_Q7, SKP_SMULWB( SKP_SMULWB( SKP_LSHIFT( quality_Q15, 2 ), quality_Q15 ),
+ pitch_freq_log_Q7 - SKP_LOG2_VARIABLE_HP_MIN_FREQ_Q7 ) );
+ pitch_freq_log_Q7 = SKP_ADD32( pitch_freq_log_Q7, SKP_RSHIFT( 19661 - quality_Q15, 9 ) ); // 19661_Q15 = 0.6_Q0
+
+ //delta_freq = pitch_freq_log - psEnc->variable_HP_smth1;
+ delta_freq_Q7 = pitch_freq_log_Q7 - SKP_RSHIFT( psEnc->variable_HP_smth1_Q15, 8 );
+ if( delta_freq_Q7 < 0 ) {
+ /* less smoothing for decreasing pitch frequency, to track something close to the minimum */
+ delta_freq_Q7 = SKP_MUL( delta_freq_Q7, 3 );
+ }
+
+ /* limit delta, to reduce impact of outliers */
+ delta_freq_Q7 = SKP_LIMIT_32( delta_freq_Q7, -VARIABLE_HP_MAX_DELTA_FREQ_Q7, VARIABLE_HP_MAX_DELTA_FREQ_Q7 );
+
+ /* update smoother */
+ psEnc->variable_HP_smth1_Q15 = SKP_SMLAWB( psEnc->variable_HP_smth1_Q15,
+ SKP_MUL( SKP_LSHIFT( psEnc->speech_activity_Q8, 1 ), delta_freq_Q7 ), VARIABLE_HP_SMTH_COEF1_Q16 );
+ }
+ /* second smoother */
+ psEnc->variable_HP_smth2_Q15 = SKP_SMLAWB( psEnc->variable_HP_smth2_Q15,
+ psEnc->variable_HP_smth1_Q15 - psEnc->variable_HP_smth2_Q15, VARIABLE_HP_SMTH_COEF2_Q16 );
+
+ /* convert from log scale to Hertz */
+ psEncCtrl->pitch_freq_low_Hz = SKP_Silk_log2lin( SKP_RSHIFT( psEnc->variable_HP_smth2_Q15, 8 ) ); //pow( 2.0, psEnc->variable_HP_smth2 );
+
+ /* limit frequency range */
+ psEncCtrl->pitch_freq_low_Hz = SKP_LIMIT_32( psEncCtrl->pitch_freq_low_Hz, VARIABLE_HP_MIN_FREQ_Q0, VARIABLE_HP_MAX_FREQ_Q0 );
+
+ /********************************/
+ /* Compute Filter Coefficients */
+ /********************************/
+ /* compute cut-off frequency, in radians */
+ //Fc_num = (SKP_float)( 0.45f * 2.0f * 3.14159265359 * psEncCtrl->pitch_freq_low_Hz );
+ //Fc_denom = (SKP_float)( 1e3f * psEnc->sCmn.fs_kHz );
+ SKP_assert( psEncCtrl->pitch_freq_low_Hz <= SKP_int32_MAX / SKP_RADIANS_CONSTANT_Q19 );
+ Fc_Q19 = SKP_DIV32_16( SKP_SMULBB( SKP_RADIANS_CONSTANT_Q19, psEncCtrl->pitch_freq_low_Hz ), psEnc->sCmn.fs_kHz ); // range: 3704 - 27787, 11-15 bits
+ SKP_assert( Fc_Q19 >= 3704 );
+ SKP_assert( Fc_Q19 <= 27787 );
+
+ r_Q28 = ( 1 << 28 ) - SKP_MUL( 471, Fc_Q19 ); // 471_Q9 = 0.92_Q0, range: 255347779 to 266690872, 27-28 bits
+ SKP_assert( r_Q28 >= 255347779 );
+ SKP_assert( r_Q28 <= 266690872 );
+
+ /* b = r * [ 1; -2; 1 ]; */
+ /* a = [ 1; -2 * r * ( 1 - 0.5 * Fc^2 ); r^2 ]; */
+ B_Q28[ 0 ] = r_Q28;
+ B_Q28[ 1 ] = SKP_LSHIFT( -r_Q28, 1 );
+ B_Q28[ 2 ] = r_Q28;
+
+ // -r * ( 2 - Fc * Fc );
+ r_Q22 = SKP_RSHIFT( r_Q28, 6 );
+ A_Q28[ 0 ] = SKP_SMULWW( r_Q22, SKP_SMULWW( Fc_Q19, Fc_Q19 ) - ( 2 << 22 ) );
+ A_Q28[ 1 ] = SKP_SMULWW( r_Q22, r_Q22 );
+
+ /********************************/
+ /* High-Pass Filter */
+ /********************************/
+ SKP_Silk_biquad_alt( in, B_Q28, A_Q28, psEnc->sCmn.In_HP_State, out, psEnc->sCmn.frame_length );
+}
+
+#endif // HIGH_PASS_INPUT
--- /dev/null
+++ b/src_FIX/SKP_Silk_LTP_analysis_filter_FIX.c
@@ -1,0 +1,81 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+void SKP_Silk_LTP_analysis_filter_FIX(
+ SKP_int16 *LTP_res, /* O: LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */
+ const SKP_int16 *x, /* I: Pointer to input signal with at least max( pitchL ) preceeding samples */
+ const SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I: LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */
+ const SKP_int pitchL[ MAX_NB_SUBFR ], /* I: Pitch lag, one for each subframe */
+ const SKP_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I: Inverse quantization gains, one for each subframe */
+ const SKP_int subfr_length, /* I: Length of each subframe */
+ const SKP_int nb_subfr, /* I: Number of subframes */
+ const SKP_int pre_length /* I: Length of the preceeding samples starting at &x[0] for each subframe */
+)
+{
+ const SKP_int16 *x_ptr, *x_lag_ptr;
+ SKP_int16 Btmp_Q14[ LTP_ORDER ];
+ SKP_int16 *LTP_res_ptr;
+ SKP_int k, i, j;
+ SKP_int32 LTP_est;
+
+ x_ptr = x;
+ LTP_res_ptr = LTP_res;
+ for( k = 0; k < nb_subfr; k++ ) {
+
+ x_lag_ptr = x_ptr - pitchL[ k ];
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ Btmp_Q14[ i ] = LTPCoef_Q14[ k * LTP_ORDER + i ];
+ }
+
+ /* LTP analysis FIR filter */
+ for( i = 0; i < subfr_length + pre_length; i++ ) {
+ LTP_res_ptr[ i ] = x_ptr[ i ];
+
+ /* Long-term prediction */
+ LTP_est = SKP_SMULBB( x_lag_ptr[ LTP_ORDER / 2 ], Btmp_Q14[ 0 ] );
+ for( j = 1; j < LTP_ORDER; j++ ) {
+ LTP_est = SKP_SMLABB_ovflw( LTP_est, x_lag_ptr[ LTP_ORDER / 2 - j ], Btmp_Q14[ j ] );
+ }
+ LTP_est = SKP_RSHIFT_ROUND( LTP_est, 14 ); // round and -> Q0
+
+ /* Subtract long-term prediction */
+ LTP_res_ptr[ i ] = ( SKP_int16 )SKP_SAT16( ( SKP_int32 )x_ptr[ i ] - LTP_est );
+
+ /* Scale residual */
+ LTP_res_ptr[ i ] = SKP_SMULWB( invGains_Q16[ k ], LTP_res_ptr[ i ] );
+
+ x_lag_ptr++;
+ }
+
+ /* Update pointers */
+ LTP_res_ptr += subfr_length + pre_length;
+ x_ptr += subfr_length;
+ }
+}
+
--- /dev/null
+++ b/src_FIX/SKP_Silk_LTP_scale_ctrl_FIX.c
@@ -1,0 +1,81 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+#define NB_THRESHOLDS 11
+
+/* Table containing trained thresholds for LTP scaling */
+static const SKP_int16 LTPScaleThresholds_Q15[ NB_THRESHOLDS ] =
+{
+ 31129, 26214, 16384, 13107, 9830, 6554,
+ 4915, 3276, 2621, 2458, 0
+};
+
+void SKP_Silk_LTP_scale_ctrl_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state FIX */
+ SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control FIX */
+)
+{
+ SKP_int round_loss, frames_per_packet;
+ SKP_int g_out_Q5, g_limit_Q15, thrld1_Q15, thrld2_Q15;
+
+ /* 1st order high-pass filter */
+ psEnc->HPLTPredCodGain_Q7 = SKP_max_int( psEncCtrl->LTPredCodGain_Q7 - psEnc->prevLTPredCodGain_Q7, 0 )
+ + SKP_RSHIFT_ROUND( psEnc->HPLTPredCodGain_Q7, 1 );
+
+ psEnc->prevLTPredCodGain_Q7 = psEncCtrl->LTPredCodGain_Q7;
+
+ /* combine input and filtered input */
+ g_out_Q5 = SKP_RSHIFT_ROUND( SKP_RSHIFT( psEncCtrl->LTPredCodGain_Q7, 1 ) + SKP_RSHIFT( psEnc->HPLTPredCodGain_Q7, 1 ), 3 );
+ g_limit_Q15 = SKP_Silk_sigm_Q15( g_out_Q5 - ( 3 << 5 ) ); /* mulitplid with 0.5 */
+
+ /* Default is minimum scaling */
+ psEncCtrl->sCmn.LTP_scaleIndex = 0;
+
+ /* Round the loss measure to whole pct */
+ round_loss = ( SKP_int )psEnc->sCmn.PacketLoss_perc;
+
+ /* Only scale if first frame in packet 0% */
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+
+ frames_per_packet = SKP_DIV32_16( psEnc->sCmn.PacketSize_ms, SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) );
+
+ round_loss += frames_per_packet - 1;
+ thrld1_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss, NB_THRESHOLDS - 1 ) ];
+ thrld2_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss + 1, NB_THRESHOLDS - 1 ) ];
+
+ if( g_limit_Q15 > thrld1_Q15 ) {
+ /* Maximum scaling */
+ psEncCtrl->sCmn.LTP_scaleIndex = 2;
+ } else if( g_limit_Q15 > thrld2_Q15 ) {
+ /* Medium scaling */
+ psEncCtrl->sCmn.LTP_scaleIndex = 1;
+ }
+ }
+ psEncCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ];
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_NLSF_MSVQ_encode_FIX.c
@@ -1,0 +1,250 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/***********************/
+/* NLSF vector encoder */
+/***********************/
+void SKP_Silk_NLSF_MSVQ_encode_FIX(
+ SKP_int *NLSFIndices, /* O Codebook path vector [ CB_STAGES ] */
+ SKP_int *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */
+ const SKP_int *pNLSF_q_Q15_prev, /* I Prev. quantized NLSF vector [LPC_ORDER] */
+ const SKP_int *pW_Q6, /* I NLSF weight vector [ LPC_ORDER ] */
+ const SKP_int NLSF_mu_Q15, /* I Rate weight for the RD optimization */
+ const SKP_int NLSF_mu_fluc_red_Q16, /* I Fluctuation reduction error weight */
+ const SKP_int NLSF_MSVQ_Survivors, /* I Max survivors from each stage */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_int deactivate_fluc_red /* I Deactivate fluctuation reduction */
+)
+{
+ SKP_int i, s, k, cur_survivors = 0, prev_survivors, input_index, cb_index, bestIndex;
+ SKP_int32 rateDistThreshold_Q18;
+ SKP_int pNLSF_in_Q15[ MAX_LPC_ORDER ];
+#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 1 )
+ SKP_int32 se_Q15, wsse_Q20, bestRateDist_Q20;
+#endif
+
+#if( LOW_COMPLEXITY_ONLY == 1 )
+ SKP_int32 pRateDist_Q18[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE ];
+ SKP_int32 pRate_Q5[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
+ SKP_int32 pRate_new_Q5[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
+ SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
+ SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_int pRes_Q15[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ];
+ SKP_int pRes_new_Q15[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ];
+#else
+ SKP_int32 pRateDist_Q18[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED ];
+ SKP_int32 pRate_Q5[ MAX_NLSF_MSVQ_SURVIVORS ];
+ SKP_int32 pRate_new_Q5[ MAX_NLSF_MSVQ_SURVIVORS ];
+ SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS ];
+ SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_int pRes_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];
+ SKP_int pRes_new_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];
+#endif
+
+ const SKP_int *pConstInt;
+ SKP_int *pInt;
+ const SKP_int16 *pCB_element;
+ const SKP_Silk_NLSF_CBS *pCurrentCBStage;
+
+ SKP_assert( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS );
+ SKP_assert( ( LOW_COMPLEXITY_ONLY == 0 ) || ( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ) );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ /* Use sigtype.dat to seperate into signal types */
+ DEBUG_STORE_DATA( NLSF.dat, pNLSF_Q15, LPC_order * sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( WNLSF.dat, pW_Q6, LPC_order * sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( NLSF_mu.dat, &NLSF_mu_Q15, sizeof( SKP_int32 ) );
+#endif
+
+
+ /* Copy the input vector */
+ SKP_memcpy( pNLSF_in_Q15, pNLSF_Q15, LPC_order * sizeof( SKP_int ) );
+
+ /****************************************************/
+ /* Tree search for the multi-stage vector quantizer */
+ /****************************************************/
+
+ /* Clear accumulated rates */
+ SKP_memset( pRate_Q5, 0, NLSF_MSVQ_Survivors * sizeof( SKP_int32 ) );
+
+ /* Copy NLSFs into residual signal vector */
+ for( i = 0; i < LPC_order; i++ ) {
+ pRes_Q15[ i ] = pNLSF_Q15[ i ];
+ }
+
+ /* Set first stage values */
+ prev_survivors = 1;
+
+ /* Loop over all stages */
+ for( s = 0; s < psNLSF_CB->nStages; s++ ) {
+
+ /* Set a pointer to the current stage codebook */
+ pCurrentCBStage = &psNLSF_CB->CBStages[ s ];
+
+ /* Calculate the number of survivors in the current stage */
+ cur_survivors = SKP_min_32( NLSF_MSVQ_Survivors, SKP_SMULBB( prev_survivors, pCurrentCBStage->nVectors ) );
+
+#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 0 )
+ /* Find a single best survivor in the last stage, if we */
+ /* do not need candidates for fluctuation reduction */
+ if( s == psNLSF_CB->nStages - 1 ) {
+ cur_survivors = 1;
+ }
+#endif
+
+ /* Nearest neighbor clustering for multiple input data vectors */
+ SKP_Silk_NLSF_VQ_rate_distortion_FIX( pRateDist_Q18, pCurrentCBStage, pRes_Q15, pW_Q6,
+ pRate_Q5, NLSF_mu_Q15, prev_survivors, LPC_order );
+
+ /* Sort the rate-distortion errors */
+ SKP_Silk_insertion_sort_increasing( pRateDist_Q18, pTempIndices,
+ prev_survivors * pCurrentCBStage->nVectors, cur_survivors );
+
+ /* Discard survivors with rate-distortion values too far above the best one */
+ if( pRateDist_Q18[ 0 ] < SKP_int32_MAX / NLSF_MSVQ_SURV_MAX_REL_RD ) {
+ rateDistThreshold_Q18 = SKP_MUL( NLSF_MSVQ_SURV_MAX_REL_RD, pRateDist_Q18[ 0 ] );
+ while( pRateDist_Q18[ cur_survivors - 1 ] > rateDistThreshold_Q18 && cur_survivors > 1 ) {
+ cur_survivors--;
+ }
+ }
+ /* Update accumulated codebook contributions for the 'cur_survivors' best codebook indices */
+ for( k = 0; k < cur_survivors; k++ ) {
+ if( s > 0 ) {
+ /* Find the indices of the input and the codebook vector */
+ if( pCurrentCBStage->nVectors == 8 ) {
+ input_index = SKP_RSHIFT( pTempIndices[ k ], 3 );
+ cb_index = pTempIndices[ k ] & 7;
+ } else {
+ input_index = SKP_DIV32_16( pTempIndices[ k ], pCurrentCBStage->nVectors );
+ cb_index = pTempIndices[ k ] - SKP_SMULBB( input_index, pCurrentCBStage->nVectors );
+ }
+ } else {
+ /* Find the indices of the input and the codebook vector */
+ input_index = 0;
+ cb_index = pTempIndices[ k ];
+ }
+
+ /* Subtract new contribution from the previous residual vector for each of 'cur_survivors' */
+ pConstInt = &pRes_Q15[ SKP_SMULBB( input_index, LPC_order ) ];
+ pCB_element = &pCurrentCBStage->CB_NLSF_Q15[ SKP_SMULBB( cb_index, LPC_order ) ];
+ pInt = &pRes_new_Q15[ SKP_SMULBB( k, LPC_order ) ];
+ for( i = 0; i < LPC_order; i++ ) {
+ pInt[ i ] = pConstInt[ i ] - ( SKP_int )pCB_element[ i ];
+ }
+
+ /* Update accumulated rate for stage 1 to the current */
+ pRate_new_Q5[ k ] = pRate_Q5[ input_index ] + pCurrentCBStage->Rates_Q5[ cb_index ];
+
+ /* Copy paths from previous matrix, starting with the best path */
+ pConstInt = &pPath[ SKP_SMULBB( input_index, psNLSF_CB->nStages ) ];
+ pInt = &pPath_new[ SKP_SMULBB( k, psNLSF_CB->nStages ) ];
+ for( i = 0; i < s; i++ ) {
+ pInt[ i ] = pConstInt[ i ];
+ }
+ /* Write the current stage indices for the 'cur_survivors' to the best path matrix */
+ pInt[ s ] = cb_index;
+ }
+
+ if( s < psNLSF_CB->nStages - 1 ) {
+ /* Copy NLSF residual matrix for next stage */
+ SKP_memcpy( pRes_Q15, pRes_new_Q15, SKP_SMULBB( cur_survivors, LPC_order ) * sizeof( SKP_int ) );
+
+ /* Copy rate vector for next stage */
+ SKP_memcpy( pRate_Q5, pRate_new_Q5, cur_survivors * sizeof( SKP_int32 ) );
+
+ /* Copy best path matrix for next stage */
+ SKP_memcpy( pPath, pPath_new, SKP_SMULBB( cur_survivors, psNLSF_CB->nStages ) * sizeof( SKP_int ) );
+ }
+
+ prev_survivors = cur_survivors;
+ }
+
+ /* (Preliminary) index of the best survivor, later to be decoded */
+ bestIndex = 0;
+
+#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 1 )
+ /******************************/
+ /* NLSF fluctuation reduction */
+ /******************************/
+ if( deactivate_fluc_red != 1 ) {
+
+ /* Search among all survivors, now taking also weighted fluctuation errors into account */
+ bestRateDist_Q20 = SKP_int32_MAX;
+ for( s = 0; s < cur_survivors; s++ ) {
+ /* Decode survivor to compare with previous quantized NLSF vector */
+ SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, &pPath_new[ SKP_SMULBB( s, psNLSF_CB->nStages ) ], LPC_order );
+
+ /* Compare decoded NLSF vector with the previously quantized vector */
+ wsse_Q20 = 0;
+ for( i = 0; i < LPC_order; i += 2 ) {
+ /* Compute weighted squared quantization error for index i */
+ se_Q15 = pNLSF_Q15[ i ] - pNLSF_q_Q15_prev[ i ]; // range: [ -32767 : 32767 ]
+ wsse_Q20 = SKP_SMLAWB( wsse_Q20, SKP_SMULBB( se_Q15, se_Q15 ), pW_Q6[ i ] );
+
+ /* Compute weighted squared quantization error for index i + 1 */
+ se_Q15 = pNLSF_Q15[ i + 1 ] - pNLSF_q_Q15_prev[ i + 1 ]; // range: [ -32767 : 32767 ]
+ wsse_Q20 = SKP_SMLAWB( wsse_Q20, SKP_SMULBB( se_Q15, se_Q15 ), pW_Q6[ i + 1 ] );
+ }
+ SKP_assert( wsse_Q20 >= 0 );
+
+ /* Add the fluctuation reduction penalty to the rate distortion error */
+ wsse_Q20 = SKP_ADD_POS_SAT32( pRateDist_Q18[ s ], SKP_SMULWB( wsse_Q20, NLSF_mu_fluc_red_Q16 ) );
+
+ /* Keep index of best survivor */
+ if( wsse_Q20 < bestRateDist_Q20 ) {
+ bestRateDist_Q20 = wsse_Q20;
+ bestIndex = s;
+ }
+ }
+ }
+#endif
+
+ /* Copy best path to output argument */
+ SKP_memcpy( NLSFIndices, &pPath_new[ SKP_SMULBB( bestIndex, psNLSF_CB->nStages ) ], psNLSF_CB->nStages * sizeof( SKP_int ) );
+
+ /* Decode and stabilize the best survivor */
+ SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, NLSFIndices, LPC_order );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ {
+ SKP_float rateBPF_LSF;
+ SKP_float NLSF_coef;
+
+ rateBPF_LSF = (SKP_float)pRate_new_Q5[ bestIndex ] / 32.0f; // Q5 -> Q0
+ DEBUG_STORE_DATA( rateBPF_LSF.dat, &rateBPF_LSF, sizeof( SKP_float ));
+ for( i = 0; i < LPC_order; i++ ) {
+ NLSF_coef = ( (SKP_float)pNLSF_Q15[ i ] ) * ( 1.0f / 32768.0f );
+ DEBUG_STORE_DATA( NLSFq.dat, &NLSF_coef, sizeof( SKP_float ) );
+ }
+ }
+#endif
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c
@@ -1,0 +1,61 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Rate-Distortion calculations for multiple input data vectors */
+void SKP_Silk_NLSF_VQ_rate_distortion_FIX(
+ SKP_int32 *pRD_Q20, /* O Rate-distortion values [psNLSF_CBS->nVectors*N] */
+ const SKP_Silk_NLSF_CBS *psNLSF_CBS, /* I NLSF codebook stage struct */
+ const SKP_int *in_Q15, /* I Input vectors to be quantized */
+ const SKP_int *w_Q6, /* I Weight vector */
+ const SKP_int32 *rate_acc_Q5, /* I Accumulated rates from previous stage */
+ const SKP_int mu_Q15, /* I Weight between weighted error and rate */
+ const SKP_int N, /* I Number of input vectors to be quantized */
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_int i, n;
+ SKP_int32 *pRD_vec_Q20;
+
+ /* Compute weighted quantization errors for all input vectors over one codebook stage */
+ SKP_Silk_NLSF_VQ_sum_error_FIX( pRD_Q20, in_Q15, w_Q6, psNLSF_CBS->CB_NLSF_Q15,
+ N, psNLSF_CBS->nVectors, LPC_order );
+
+ /* Loop over input vectors */
+ pRD_vec_Q20 = pRD_Q20;
+ for( n = 0; n < N; n++ ) {
+ /* Add rate cost to error for each codebook vector */
+ for( i = 0; i < psNLSF_CBS->nVectors; i++ ) {
+ SKP_assert( rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ] >= 0 );
+ SKP_assert( rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ] <= SKP_int16_MAX );
+ pRD_vec_Q20[ i ] = SKP_SMLABB( pRD_vec_Q20[ i ], rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ], mu_Q15 );
+ SKP_assert( pRD_vec_Q20[ i ] >= 0 );
+ }
+ pRD_vec_Q20 += psNLSF_CBS->nVectors;
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_NLSF_VQ_sum_error_FIX.c
@@ -1,0 +1,79 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */
+void SKP_Silk_NLSF_VQ_sum_error_FIX(
+ SKP_int32 *err_Q20, /* O Weighted quantization errors [N*K] */
+ const SKP_int *in_Q15, /* I Input vectors to be quantized [N*LPC_order] */
+ const SKP_int *w_Q6, /* I Weighting vectors [N*LPC_order] */
+ const SKP_int16 *pCB_Q15, /* I Codebook vectors [K*LPC_order] */
+ const SKP_int N, /* I Number of input vectors */
+ const SKP_int K, /* I Number of codebook vectors */
+ const SKP_int LPC_order /* I Number of LPCs */
+)
+{
+ SKP_int i, n, m;
+ SKP_int32 diff_Q15, sum_error, Wtmp_Q6;
+ SKP_int32 Wcpy_Q6[ MAX_LPC_ORDER / 2 ];
+ const SKP_int16 *cb_vec_Q15;
+
+ SKP_assert( LPC_order <= 16 );
+ SKP_assert( ( LPC_order & 1 ) == 0 );
+
+ /* Copy to local stack and pack two weights per int32 */
+ for( m = 0; m < SKP_RSHIFT( LPC_order, 1 ); m++ ) {
+ Wcpy_Q6[ m ] = w_Q6[ 2 * m ] | SKP_LSHIFT( ( SKP_int32 )w_Q6[ 2 * m + 1 ], 16 );
+ }
+
+ /* Loop over input vectors */
+ for( n = 0; n < N; n++ ) {
+ /* Loop over codebook */
+ cb_vec_Q15 = pCB_Q15;
+ for( i = 0; i < K; i++ ) {
+ sum_error = 0;
+ for( m = 0; m < LPC_order; m += 2 ) {
+ /* Get two weights packed in an int32 */
+ Wtmp_Q6 = Wcpy_Q6[ SKP_RSHIFT( m, 1 ) ];
+
+ /* Compute weighted squared quantization error for index m */
+ diff_Q15 = in_Q15[ m ] - *cb_vec_Q15++; // range: [ -32767 : 32767 ]
+ sum_error = SKP_SMLAWB( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 );
+
+ /* Compute weighted squared quantization error for index m + 1 */
+ diff_Q15 = in_Q15[m + 1] - *cb_vec_Q15++; // range: [ -32767 : 32767 ]
+ sum_error = SKP_SMLAWT( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 );
+ }
+ SKP_assert( sum_error >= 0 );
+ err_Q20[ i ] = sum_error;
+ }
+ err_Q20 += K;
+ in_Q15 += LPC_order;
+ }
+}
+
--- /dev/null
+++ b/src_FIX/SKP_Silk_VQ_nearest_neighbor_FIX.c
@@ -1,0 +1,107 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Entropy constrained MATRIX-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */
+void SKP_Silk_VQ_WMat_EC_FIX(
+ SKP_int *ind, /* O index of best codebook vector */
+ SKP_int32 *rate_dist_Q14, /* O best weighted quantization error + mu * rate*/
+ const SKP_int16 *in_Q14, /* I input vector to be quantized */
+ const SKP_int32 *W_Q18, /* I weighting matrix */
+ const SKP_int16 *cb_Q14, /* I codebook */
+ const SKP_int16 *cl_Q6, /* I code length for each codebook vector */
+ const SKP_int mu_Q8, /* I tradeoff between weighted error and rate */
+ SKP_int L /* I number of vectors in codebook */
+)
+{
+ SKP_int k;
+ const SKP_int16 *cb_row_Q14;
+ SKP_int16 diff_Q14[ 5 ];
+ SKP_int32 sum1_Q14, sum2_Q16;
+
+ /* Loop over codebook */
+ *rate_dist_Q14 = SKP_int32_MAX;
+ cb_row_Q14 = cb_Q14;
+ for( k = 0; k < L; k++ ) {
+ diff_Q14[ 0 ] = in_Q14[ 0 ] - cb_row_Q14[ 0 ];
+ diff_Q14[ 1 ] = in_Q14[ 1 ] - cb_row_Q14[ 1 ];
+ diff_Q14[ 2 ] = in_Q14[ 2 ] - cb_row_Q14[ 2 ];
+ diff_Q14[ 3 ] = in_Q14[ 3 ] - cb_row_Q14[ 3 ];
+ diff_Q14[ 4 ] = in_Q14[ 4 ] - cb_row_Q14[ 4 ];
+
+ /* Weighted rate */
+ sum1_Q14 = SKP_SMULBB( mu_Q8, cl_Q6[ k ] );
+
+ SKP_assert( sum1_Q14 >= 0 );
+
+ /* first row of W_Q18 */
+ sum2_Q16 = SKP_SMULWB( W_Q18[ 1 ], diff_Q14[ 1 ] );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 2 ], diff_Q14[ 2 ] );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 3 ], diff_Q14[ 3 ] );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 4 ], diff_Q14[ 4 ] );
+ sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14[ 0 ] );
+ sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 0 ] );
+
+ /* second row of W_Q18 */
+ sum2_Q16 = SKP_SMULWB( W_Q18[ 7 ], diff_Q14[ 2 ] );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 8 ], diff_Q14[ 3 ] );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14[ 4 ] );
+ sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 6 ], diff_Q14[ 1 ] );
+ sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 1 ] );
+
+ /* third row of W_Q18 */
+ sum2_Q16 = SKP_SMULWB( W_Q18[ 13 ], diff_Q14[ 3 ] );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14[ 4 ] );
+ sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14[ 2 ] );
+ sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 2 ] );
+
+ /* fourth row of W_Q18 */
+ sum2_Q16 = SKP_SMULWB( W_Q18[ 19 ], diff_Q14[ 4 ] );
+ sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 );
+ sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 18 ], diff_Q14[ 3 ] );
+ sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 3 ] );
+
+ /* last row of W_Q18 */
+ sum2_Q16 = SKP_SMULWB( W_Q18[ 24 ], diff_Q14[ 4 ] );
+ sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 4 ] );
+
+ SKP_assert( sum1_Q14 >= 0 );
+
+ /* find best */
+ if( sum1_Q14 < *rate_dist_Q14 ) {
+ *rate_dist_Q14 = sum1_Q14;
+ *ind = k;
+ }
+
+ /* Go to next cbk vector */
+ cb_row_Q14 += LTP_ORDER;
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_control_codec_FIX.c
@@ -1,0 +1,583 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* ToDo: Move the functions belowto common to be able to use them in FLP control codec also */
+SKP_INLINE SKP_int SKP_Silk_setup_resamplers(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int API_fs_Hz, /* I */
+ SKP_int fs_kHz /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_packetsize(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int PacketSize_ms, /* I */
+ SKP_int fs_kHz /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_fs(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int fs_kHz /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_complexity(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int Complexity /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_rate(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int TargetRate_bps /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_LBRR(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int INBandFEC_enabled /* I */
+);
+
+/* Control encoder SNR */
+SKP_int SKP_Silk_control_encoder_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */
+ const SKP_int32 API_fs_Hz, /* I External (API) sampling rate (Hz) */
+ const SKP_int max_internal_fs_kHz,/* I Maximum internal sampling rate (kHz) */
+ const SKP_int PacketSize_ms, /* I Packet length (ms) */
+ SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) (used if SNR_dB == 0) */
+ const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */
+ const SKP_int INBandFEC_enabled, /* I Enable (1) / disable (0) inband FEC */
+ const SKP_int DTX_enabled, /* I Enable / disable DTX */
+ const SKP_int InputFramesize_ms, /* I Inputframe in ms */
+ const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */
+)
+{
+ SKP_int fs_kHz, ret = 0;
+
+ /* State machine for the SWB/WB switching */
+ fs_kHz = psEnc->sCmn.fs_kHz;
+
+ /* Only switch during low speech activity, when no frames are sitting in the payload buffer */
+ if( API_fs_Hz == 8000 || fs_kHz == 0 || API_fs_Hz < SKP_SMULBB( fs_kHz, 1000 ) || fs_kHz > max_internal_fs_kHz ) {
+ /* Switching is not possible, encoder just initialized, internal mode higher than external, */
+ /* or internal mode higher than maximum allowed internal mode */
+ fs_kHz = SKP_min( SKP_DIV32_16( API_fs_Hz, 1000 ), max_internal_fs_kHz );
+ } else {
+ /* Accumulate the difference between the target rate and limit for switching down */
+ psEnc->sCmn.bitrateDiff += SKP_MUL( InputFramesize_ms, TargetRate_bps - psEnc->sCmn.bitrate_threshold_down );
+ psEnc->sCmn.bitrateDiff = SKP_min( psEnc->sCmn.bitrateDiff, 0 );
+
+ if( psEnc->speech_activity_Q8 < 128 && psEnc->sCmn.nFramesInPayloadBuf == 0 ) { /* Low speech activity and payload buffer empty */
+ /* Check if we should switch down */
+#if SWITCH_TRANSITION_FILTERING
+ if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* Transition phase not active */
+ ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD || /* Bitrate threshold is met */
+ ( psEnc->sCmn.sSWBdetect.WB_detected * psEnc->sCmn.fs_kHz == 24 ) ) ) { /* Forced down-switching due to WB input */
+ psEnc->sCmn.sLP.transition_frame_no = 1; /* Begin transition phase */
+ psEnc->sCmn.sLP.mode = 0; /* Switch down */
+ } else if(
+ ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_DOWN ) && /* Transition phase complete */
+ ( psEnc->sCmn.sLP.mode == 0 ) ) { /* Ready to switch down */
+ psEnc->sCmn.sLP.transition_frame_no = 0; /* Ready for new transition phase */
+#else
+ if( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD ) { /* Bitrate threshold is met */
+#endif
+ psEnc->sCmn.bitrateDiff = 0;
+
+ /* Switch to a lower sample frequency */
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ fs_kHz = 16;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ fs_kHz = 12;
+ } else {
+ SKP_assert( psEnc->sCmn.fs_kHz == 12 );
+ fs_kHz = 8;
+ }
+ }
+
+ /* Check if we should switch up */
+ if( ( ( SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ) < API_fs_Hz ) &&
+ ( TargetRate_bps >= psEnc->sCmn.bitrate_threshold_up ) &&
+ ( psEnc->sCmn.sSWBdetect.WB_detected * psEnc->sCmn.fs_kHz != 16 ) ) &&
+ ( ( psEnc->sCmn.fs_kHz == 16 ) && ( max_internal_fs_kHz >= 24 ) ||
+ ( psEnc->sCmn.fs_kHz == 12 ) && ( max_internal_fs_kHz >= 16 ) ||
+ ( psEnc->sCmn.fs_kHz == 8 ) && ( max_internal_fs_kHz >= 12 ) )
+#if SWITCH_TRANSITION_FILTERING
+ && ( psEnc->sCmn.sLP.transition_frame_no == 0 ) ) { /* No transition phase running, ready to switch */
+ psEnc->sCmn.sLP.mode = 1; /* Switch up */
+#else
+ ) {
+#endif
+ psEnc->sCmn.bitrateDiff = 0;
+
+ /* Switch to a higher sample frequency */
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ fs_kHz = 12;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ fs_kHz = 16;
+ } else {
+ SKP_assert( psEnc->sCmn.fs_kHz == 16 );
+ fs_kHz = 24;
+ }
+ }
+ }
+ }
+
+#if SWITCH_TRANSITION_FILTERING
+ /* After switching up, stop transition filter during speech inactivity */
+ if( ( psEnc->sCmn.sLP.mode == 1 ) &&
+ ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_UP ) &&
+ ( psEnc->speech_activity_Q8 < 128 ) &&
+ ( psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
+
+ psEnc->sCmn.sLP.transition_frame_no = 0;
+
+ /* Reset transition filter state */
+ SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );
+ }
+#endif
+
+#ifdef FORCE_FS_KHZ
+ SKP_assert( FORCE_FS_KHZ == 8 || FORCE_FS_KHZ == 12 || FORCE_FS_KHZ == 16 || FORCE_FS_KHZ == 24 );
+ if( psEnc->sCmn.fs_kHz != 0 ) {
+ /* Force except during init */
+ fs_kHz = FORCE_FS_KHZ;
+ }
+#endif
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( bitrate.dat, &TargetRate_bps, 1 * sizeof( SKP_int32 ) );
+ DEBUG_STORE_DATA( fs.dat, &fs_kHz, 1 * sizeof( SKP_int32 ) );
+ DEBUG_STORE_DATA( diff.dat, &psEnc->sCmn.bitrateDiff, 1 * sizeof( SKP_int32 ) );
+ DEBUG_STORE_DATA( lashape.dat, &psEnc->sCmn.la_shape, 1 * sizeof( SKP_int32 ) );
+#endif
+ /********************************************/
+ /* Prepare resampler and buffered data */
+ /********************************************/
+ SKP_Silk_setup_resamplers( psEnc, API_fs_Hz, fs_kHz );
+
+ /********************************************/
+ /* Set packet size */
+ /********************************************/
+ ret += SKP_Silk_setup_packetsize( psEnc, PacketSize_ms, fs_kHz );
+
+ /********************************************/
+ /* Set internal sampling frequency */
+ /********************************************/
+ ret += SKP_Silk_setup_fs( psEnc, fs_kHz );
+
+ /********************************************/
+ /* Set encoding complexity */
+ /********************************************/
+ ret += SKP_Silk_setup_complexity( psEnc, Complexity );
+
+ /********************************************/
+ /* Set bitrate/coding quality */
+ /********************************************/
+ ret += SKP_Silk_setup_rate( psEnc, TargetRate_bps );
+
+ /********************************************/
+ /* Set packet loss rate measured by farend */
+ /********************************************/
+ if( ( PacketLoss_perc < 0 ) || ( PacketLoss_perc > 100 ) ) {
+ ret = SKP_SILK_ENC_INVALID_LOSS_RATE;
+ }
+ psEnc->sCmn.PacketLoss_perc = PacketLoss_perc;
+
+ /********************************************/
+ /* Set LBRR usage */
+ /********************************************/
+ ret += SKP_Silk_setup_LBRR( psEnc, INBandFEC_enabled );
+
+ /********************************************/
+ /* Set DTX mode */
+ /********************************************/
+ if( DTX_enabled < 0 || DTX_enabled > 1 ) {
+ ret = SKP_SILK_ENC_INVALID_DTX_SETTING;
+ }
+ psEnc->sCmn.useDTX = DTX_enabled;
+
+ return ret;
+}
+
+/* Control low bitrate redundancy usage */
+void SKP_Silk_LBRR_ctrl_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */
+)
+{
+ SKP_int LBRR_usage;
+
+ if( psEnc->sCmn.LBRR_enabled ) {
+ /* Control LBRR */
+
+ /* Usage Control based on sensitivity and packet loss caracteristics */
+ /* For now only enable adding to next for active frames. Make more complex later */
+ LBRR_usage = SKP_SILK_NO_LBRR;
+ if( psEnc->speech_activity_Q8 > LBRR_SPEECH_ACTIVITY_THRES_Q8 && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) { // nb! maybe multiply loss prob and speech activity
+ LBRR_usage = SKP_SILK_ADD_LBRR_TO_PLUS1;
+ }
+ psEncCtrl->sCmn.LBRR_usage = LBRR_usage;
+ } else {
+ psEncCtrl->sCmn.LBRR_usage = SKP_SILK_NO_LBRR;
+ }
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_packetsize(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int PacketSize_ms, /* I */
+ SKP_int fs_kHz /* I */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+ if( ( PacketSize_ms != 10 ) &&
+ ( PacketSize_ms != 20 ) &&
+ ( PacketSize_ms != 40 ) &&
+ ( PacketSize_ms != 60 ) &&
+ ( PacketSize_ms != 80 ) &&
+ ( PacketSize_ms != 100 ) ) {
+ ret = SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED;
+ } else {
+ if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) {
+ if( PacketSize_ms == 10 ) {
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ /* Only allowed when the payload buffer is empty */
+ psEnc->sCmn.nb_subfr = MAX_NB_SUBFR >> 1;
+ psEnc->sCmn.frame_length = SKP_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr );
+ psEnc->sCmn.PacketSize_ms = PacketSize_ms;
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );
+ /* Packet length changes. Reset LBRR buffer */
+ SKP_Silk_LBRR_reset( &psEnc->sCmn );
+ }
+ } else{
+ psEnc->sCmn.nb_subfr = MAX_NB_SUBFR;
+ psEnc->sCmn.frame_length = SKP_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr );
+ psEnc->sCmn.PacketSize_ms = PacketSize_ms;
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
+ /* Packet length changes. Reset LBRR buffer */
+ SKP_Silk_LBRR_reset( &psEnc->sCmn );
+ }
+ }
+ }
+ return(ret);
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_resamplers(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int API_fs_Hz, /* I */
+ SKP_int fs_kHz /* I */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+ if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != API_fs_Hz ) {
+
+ /* Allocate space for worst case temporary upsampling, 8 to 48 kHz, so a factor 6 */
+ SKP_int16 x_buf_API_fs_Hz[ ( MAX_API_FS_KHZ / 8 ) * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
+
+ SKP_int32 nSamples_temp = SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + psEnc->sCmn.la_shape;
+
+ if( SKP_SMULBB( fs_kHz, 1000 ) < API_fs_Hz && psEnc->sCmn.fs_kHz != 0 ) {
+ /* Resample buffered data in x_buf to API_fs_Hz */
+
+ SKP_Silk_resampler_state_struct temp_resampler_state;
+
+ /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */
+ ret += SKP_Silk_resampler_init( &temp_resampler_state, SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), API_fs_Hz );
+
+ /* Temporary resampling of x_buf data to API_fs_Hz */
+ ret += SKP_Silk_resampler( &temp_resampler_state, x_buf_API_fs_Hz, psEnc->x_buf, nSamples_temp );
+
+ /* Calculate number of samples that has been temporarily upsampled */
+ nSamples_temp = SKP_DIV32_16( nSamples_temp * API_fs_Hz, SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ) );
+
+ /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
+ ret += SKP_Silk_resampler_init( &psEnc->sCmn.resampler_state, API_fs_Hz, SKP_SMULBB( fs_kHz, 1000 ) );
+
+ } else {
+ /* Copy data */
+ SKP_memcpy( x_buf_API_fs_Hz, psEnc->x_buf, nSamples_temp * sizeof( SKP_int16 ) );
+ }
+
+ if( 1000 * fs_kHz != API_fs_Hz ) {
+ /* Correct resampler state (unless resampling by a factor 1) by resampling buffered data from API_fs_Hz to fs_kHz */
+ ret += SKP_Silk_resampler( &psEnc->sCmn.resampler_state, psEnc->x_buf, x_buf_API_fs_Hz, nSamples_temp );
+ }
+ }
+ psEnc->sCmn.prev_API_fs_Hz = API_fs_Hz;
+
+ return(ret);
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_fs(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int fs_kHz /* I */
+)
+{
+ SKP_int ret = 0;
+
+ if( psEnc->sCmn.fs_kHz != fs_kHz ) {
+ /* reset part of the state */
+ SKP_memset( &psEnc->sShape, 0, sizeof( SKP_Silk_shape_state_FIX ) );
+ SKP_memset( &psEnc->sPrefilt, 0, sizeof( SKP_Silk_prefilter_state_FIX ) );
+ SKP_memset( &psEnc->sNSQ, 0, sizeof( SKP_Silk_nsq_state ) );
+ SKP_memset( &psEnc->sPred, 0, sizeof( SKP_Silk_predict_state_FIX ) );
+ SKP_memset( psEnc->sNSQ.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) );
+ SKP_memset( psEnc->sNSQ_LBRR.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) );
+ SKP_memset( psEnc->sCmn.LBRR_buffer, 0, MAX_LBRR_DELAY * sizeof( SKP_SILK_LBRR_struct ) );
+#if SWITCH_TRANSITION_FILTERING
+ SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );
+ if( psEnc->sCmn.sLP.mode == 1 ) {
+ /* Begin transition phase */
+ psEnc->sCmn.sLP.transition_frame_no = 1;
+ } else {
+ /* End transition phase */
+ psEnc->sCmn.sLP.transition_frame_no = 0;
+ }
+#endif
+ psEnc->sCmn.inputBufIx = 0;
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ psEnc->sCmn.nBytesInPayloadBuf = 0;
+ psEnc->sCmn.oldest_LBRR_idx = 0;
+ psEnc->sCmn.TargetRate_bps = 0; /* Ensures that psEnc->SNR_dB is recomputed */
+
+ SKP_memset( psEnc->sPred.prev_NLSFq_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) );
+
+ /* Initialize non-zero parameters */
+ psEnc->sCmn.prevLag = 100;
+ psEnc->sCmn.prev_sigtype = SIG_TYPE_UNVOICED;
+ psEnc->sCmn.first_frame_after_reset = 1;
+ psEnc->sPrefilt.lagPrev = 100;
+ psEnc->sShape.LastGainIndex = 1;
+ psEnc->sNSQ.lagPrev = 100;
+ psEnc->sNSQ.prev_inv_gain_Q16 = 65536;
+ psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536;
+ psEnc->sCmn.fs_kHz = fs_kHz;
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER;
+ psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_10;
+ psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_10;
+ } else {
+ psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER;
+ psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_16;
+ psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_16;
+ }
+ psEnc->sCmn.subfr_length = SKP_SMULBB( SUB_FRAME_LENGTH_MS, fs_kHz );
+ psEnc->sCmn.frame_length = SKP_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr );
+ psEnc->sCmn.ltp_mem_length = SKP_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz );
+ psEnc->sCmn.la_pitch = SKP_SMULBB( LA_PITCH_MS, fs_kHz );
+ psEnc->sCmn.la_shape = SKP_SMULBB( LA_SHAPE_MS, fs_kHz );
+ psEnc->sPred.min_pitch_lag = SKP_SMULBB( 3, fs_kHz );
+ psEnc->sPred.max_pitch_lag = SKP_SMULBB( 18, fs_kHz );
+ if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ){
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
+ } else {
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );
+ }
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ psEnc->mu_LTP_Q8 = MU_LTP_QUANT_SWB_Q8;
+ psEnc->sCmn.bitrate_threshold_up = SKP_int32_MAX;
+ psEnc->sCmn.bitrate_threshold_down = SWB2WB_BITRATE_BPS;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ psEnc->mu_LTP_Q8 = MU_LTP_QUANT_WB_Q8;
+ psEnc->sCmn.bitrate_threshold_up = WB2SWB_BITRATE_BPS;
+ psEnc->sCmn.bitrate_threshold_down = WB2MB_BITRATE_BPS;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ psEnc->mu_LTP_Q8 = MU_LTP_QUANT_MB_Q8;
+ psEnc->sCmn.bitrate_threshold_up = MB2WB_BITRATE_BPS;
+ psEnc->sCmn.bitrate_threshold_down = MB2NB_BITRATE_BPS;
+ } else {
+ psEnc->mu_LTP_Q8 = MU_LTP_QUANT_NB_Q8;
+ psEnc->sCmn.bitrate_threshold_up = NB2MB_BITRATE_BPS;
+ psEnc->sCmn.bitrate_threshold_down = 0;
+ }
+ psEnc->sCmn.fs_kHz_changed = 1;
+
+ /* Check that settings are valid */
+ SKP_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length );
+ }
+ return( ret );
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_complexity(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int Complexity /* I */
+)
+{
+ SKP_int ret = 0;
+
+ /* Check that settings are valid */
+ if( LOW_COMPLEXITY_ONLY && Complexity != 0 ) {
+ ret = SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING;
+ }
+
+ /* Set encoding complexity */
+ if( Complexity == 0 || LOW_COMPLEXITY_ONLY ) {
+ /* Low complexity */
+ psEnc->sCmn.Complexity = 0;
+ psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_LC_MODE;
+ psEnc->pitchEstimationThreshold_Q16 = FIND_PITCH_CORRELATION_THRESHOLD_Q16_LC_MODE;
+ psEnc->sCmn.pitchEstimationLPCOrder = 8;
+ psEnc->sCmn.shapingLPCOrder = 8;
+ psEnc->sCmn.nStatesDelayedDecision = 1;
+ psEnc->sCmn.useInterpolatedNLSFs = 0;
+ psEnc->sCmn.LTPQuantLowComplexity = 1;
+ psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS_LC_MODE;
+ } else if( Complexity == 1 ) {
+ /* Medium complexity */
+ psEnc->sCmn.Complexity = 1;
+ psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_MC_MODE;
+ psEnc->pitchEstimationThreshold_Q16 = FIND_PITCH_CORRELATION_THRESHOLD_Q16_MC_MODE;
+ psEnc->sCmn.pitchEstimationLPCOrder = 12;
+ psEnc->sCmn.shapingLPCOrder = 12;
+ psEnc->sCmn.nStatesDelayedDecision = 2;
+ psEnc->sCmn.useInterpolatedNLSFs = 0;
+ psEnc->sCmn.LTPQuantLowComplexity = 0;
+ psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS_MC_MODE;
+ } else if( Complexity == 2 ) {
+ /* High complexity */
+ psEnc->sCmn.Complexity = 2;
+ psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_HC_MODE;
+ psEnc->pitchEstimationThreshold_Q16 = FIND_PITCH_CORRELATION_THRESHOLD_Q16_HC_MODE;
+ psEnc->sCmn.pitchEstimationLPCOrder = 16;
+ psEnc->sCmn.shapingLPCOrder = 16;
+ psEnc->sCmn.nStatesDelayedDecision = 4;
+ psEnc->sCmn.useInterpolatedNLSFs = 1;
+ psEnc->sCmn.LTPQuantLowComplexity = 0;
+ psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS;
+ } else {
+ ret = SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING;
+ }
+
+ /* Do not allow higher pitch estimation LPC order than predict LPC order */
+ psEnc->sCmn.pitchEstimationLPCOrder = SKP_min_int( psEnc->sCmn.pitchEstimationLPCOrder, psEnc->sCmn.predictLPCOrder );
+
+ SKP_assert( psEnc->sCmn.pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER );
+ SKP_assert( psEnc->sCmn.shapingLPCOrder <= MAX_SHAPE_LPC_ORDER );
+ SKP_assert( psEnc->sCmn.nStatesDelayedDecision <= MAX_DEL_DEC_STATES );
+
+ return( ret );
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_rate(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int TargetRate_bps /* I */
+)
+{
+ SKP_int k, ret = 0;
+ SKP_int32 frac_Q6;
+ const SKP_int32 *rateTable;
+
+ TargetRate_bps = SKP_min( TargetRate_bps, 100000 );
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_NB_BPS );
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_MB_BPS );
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_WB_BPS );
+ } else {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_SWB_BPS );
+ }
+ if( TargetRate_bps != psEnc->sCmn.TargetRate_bps ) {
+ psEnc->sCmn.TargetRate_bps = TargetRate_bps;
+
+ /* If new TargetRate_bps, translate to SNR_dB value */
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ rateTable = TargetRate_table_NB;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ rateTable = TargetRate_table_MB;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ rateTable = TargetRate_table_WB;
+ } else {
+ rateTable = TargetRate_table_SWB;
+ }
+ for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) {
+ /* Find bitrate interval in table and interpolate */
+ if( TargetRate_bps < rateTable[ k ] ) {
+ frac_Q6 = SKP_DIV32( SKP_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ),
+ rateTable[ k ] - rateTable[ k - 1 ] );
+ psEnc->SNR_dB_Q7 = SKP_LSHIFT( SNR_table_Q1[ k - 1 ], 6 ) + SKP_MUL( frac_Q6, SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] );
+ break;
+ }
+ }
+ }
+ return( ret );
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_LBRR(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O */
+ SKP_int INBandFEC_enabled /* I */
+)
+{
+ SKP_int ret = 0;
+ SKP_int32 LBRRRate_thres_bps;
+
+#if USE_LBRR
+ if( INBandFEC_enabled < 0 || INBandFEC_enabled > 1 ) {
+ ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;
+ }
+
+ /* Only change settings if first frame in packet */
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+
+ psEnc->sCmn.LBRR_enabled = INBandFEC_enabled;
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 9000;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 6000;;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 3000;
+ } else {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS;
+ }
+
+ if( psEnc->sCmn.TargetRate_bps >= LBRRRate_thres_bps ) {
+ /* Set gain increase / rate reduction for LBRR usage */
+ /* Coarsely tuned with PESQ for now. */
+ /* Linear regression coefs G = 8 - 0.5 * loss */
+ /* Meaning that at 16% loss main rate and redundant rate is the same, -> G = 0 */
+ psEnc->sCmn.LBRR_GainIncreases = SKP_max_int( 8 - SKP_RSHIFT( psEnc->sCmn.PacketLoss_perc, 1 ), 0 );
+
+ /* Set main stream rate compensation */
+ if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) {
+ /* Tuned to give aprox same mean / weighted bitrate as no inband FEC */
+ psEnc->inBandFEC_SNR_comp_Q8 = ( 6 << 8 ) - SKP_LSHIFT( psEnc->sCmn.LBRR_GainIncreases, 7 );
+ } else {
+ psEnc->inBandFEC_SNR_comp_Q8 = 0;
+ psEnc->sCmn.LBRR_enabled = 0;
+ }
+ } else {
+ psEnc->inBandFEC_SNR_comp_Q8 = 0;
+ psEnc->sCmn.LBRR_enabled = 0;
+ }
+ }
+#else
+ if( INBandFEC_enabled != 0 ) {
+ ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;
+ }
+ psEnc->sCmn.LBRR_enabled = 0;
+#endif
+ return( ret );
+}
\ No newline at end of file
--- /dev/null
+++ b/src_FIX/SKP_Silk_corrMatrix_FIX.c
@@ -1,0 +1,152 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************************************
+ * Correlation Matrix Computations for LS estimate.
+ **********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Calculates correlation vector X'*t */
+void SKP_Silk_corrVector_FIX(
+ const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
+ const SKP_int16 *t, /* I target vector [L] */
+ const SKP_int L, /* I Length of vectors */
+ const SKP_int order, /* I Max lag for correlation */
+ SKP_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */
+ const SKP_int rshifts /* I Right shifts of correlations */
+)
+{
+ SKP_int lag, i;
+ const SKP_int16 *ptr1, *ptr2;
+ SKP_int32 inner_prod;
+
+ ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */
+ ptr2 = t;
+ /* Calculate X'*t */
+ if( rshifts > 0 ) {
+ /* Right shifting used */
+ for( lag = 0; lag < order; lag++ ) {
+ inner_prod = 0;
+ for( i = 0; i < L; i++ ) {
+ inner_prod += SKP_RSHIFT32( SKP_SMULBB( ptr1[ i ], ptr2[i] ), rshifts );
+ }
+ Xt[ lag ] = inner_prod; /* X[:,lag]'*t */
+ ptr1--; /* Go to next column of X */
+ }
+ } else {
+ SKP_assert( rshifts == 0 );
+ for( lag = 0; lag < order; lag++ ) {
+ Xt[ lag ] = SKP_Silk_inner_prod_aligned( ptr1, ptr2, L ); /* X[:,lag]'*t */
+ ptr1--; /* Go to next column of X */
+ }
+ }
+}
+
+/* Calculates correlation matrix X'*X */
+void SKP_Silk_corrMatrix_FIX(
+ const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
+ const SKP_int L, /* I Length of vectors */
+ const SKP_int order, /* I Max lag for correlation */
+ SKP_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ]*/
+ SKP_int *rshifts /* I/O Right shifts of correlations */
+)
+{
+ SKP_int i, j, lag, rshifts_local, head_room_rshifts;
+ SKP_int32 energy;
+ const SKP_int16 *ptr1, *ptr2;
+
+ /* Calculate energy to find shift used to fit in 32 bits */
+ SKP_Silk_sum_sqr_shift( &energy, &rshifts_local, x, L + order - 1 );
+ /* Add shifts to get the wanted head room */
+
+ head_room_rshifts = SKP_max( LTP_CORRS_HEAD_ROOM - SKP_Silk_CLZ32( energy ), 0 );
+
+ energy = SKP_RSHIFT32( energy, head_room_rshifts );
+ rshifts_local += head_room_rshifts;
+
+ /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */
+ /* Remove contribution of first order - 1 samples */
+ for( i = 0; i < order - 1; i++ ) {
+ energy -= SKP_RSHIFT32( SKP_SMULBB( x[ i ], x[ i ] ), rshifts_local );
+ }
+ if( rshifts_local < *rshifts ) {
+ /* Adjust energy */
+ energy = SKP_RSHIFT32( energy, *rshifts - rshifts_local );
+ rshifts_local = *rshifts;
+ }
+
+ /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */
+ /* Fill out the diagonal of the correlation matrix */
+ matrix_ptr( XX, 0, 0, order ) = energy;
+ ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */
+ for( j = 1; j < order; j++ ) {
+ energy = SKP_SUB32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), rshifts_local ) );
+ energy = SKP_ADD32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ -j ], ptr1[ -j ] ), rshifts_local ) );
+ matrix_ptr( XX, j, j, order ) = energy;
+ }
+
+ ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */
+ /* Calculate the remaining elements of the correlation matrix */
+ if( rshifts_local > 0 ) {
+ /* Right shifting used */
+ for( lag = 1; lag < order; lag++ ) {
+ /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */
+ energy = 0;
+ for( i = 0; i < L; i++ ) {
+ energy += SKP_RSHIFT32( SKP_SMULBB( ptr1[ i ], ptr2[i] ), rshifts_local );
+ }
+ /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */
+ matrix_ptr( XX, lag, 0, order ) = energy;
+ matrix_ptr( XX, 0, lag, order ) = energy;
+ for( j = 1; j < ( order - lag ); j++ ) {
+ energy = SKP_SUB32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), rshifts_local ) );
+ energy = SKP_ADD32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ -j ], ptr2[ -j ] ), rshifts_local ) );
+ matrix_ptr( XX, lag + j, j, order ) = energy;
+ matrix_ptr( XX, j, lag + j, order ) = energy;
+ }
+ ptr2--; /* Update pointer to first sample of next column (lag) in X */
+ }
+ } else {
+ for( lag = 1; lag < order; lag++ ) {
+ /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */
+ energy = SKP_Silk_inner_prod_aligned( ptr1, ptr2, L );
+ matrix_ptr( XX, lag, 0, order ) = energy;
+ matrix_ptr( XX, 0, lag, order ) = energy;
+ /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */
+ for( j = 1; j < ( order - lag ); j++ ) {
+ energy = SKP_SUB32( energy, SKP_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) );
+ energy = SKP_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] );
+ matrix_ptr( XX, lag + j, j, order ) = energy;
+ matrix_ptr( XX, j, lag + j, order ) = energy;
+ }
+ ptr2--;/* Update pointer to first sample of next column (lag) in X */
+ }
+ }
+ *rshifts = rshifts_local;
+}
+
--- /dev/null
+++ b/src_FIX/SKP_Silk_define_FIX.h
@@ -1,0 +1,92 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_DEFINE_FIX_H
+#define SKP_SILK_DEFINE_FIX_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Head room for correlations */
+#define LTP_CORRS_HEAD_ROOM 2
+#define LPC_CORRS_HEAD_ROOM 10
+
+#define WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES_Q8 179 // 179.2_Q8 = 0.7f required speech activity for counting frame as active
+
+/* DTX settings */
+#define SPEECH_ACTIVITY_DTX_THRES_Q8 26 // 25.60_Q8 = 0.1f
+
+#define LBRR_SPEECH_ACTIVITY_THRES_Q8 128
+
+/* level of noise floor for whitening filter LPC analysis in pitch analysis */
+#define FIND_PITCH_WHITE_NOISE_FRACTION_Q16 66
+
+/* bandwdith expansion for whitening filter in pitch analysis */
+#define FIND_PITCH_BANDWITH_EXPANSION_Q16 64881
+
+/* Threshold used by pitch estimator for early escape */
+#define FIND_PITCH_CORRELATION_THRESHOLD_Q16_HC_MODE 45875 // 0.7
+#define FIND_PITCH_CORRELATION_THRESHOLD_Q16_MC_MODE 49152 // 0.75
+#define FIND_PITCH_CORRELATION_THRESHOLD_Q16_LC_MODE 52429 // 0.8
+
+/* Regualarization factor for correlation matrix. Equivalent to adding noise at -50 dB */
+#define FIND_LTP_COND_FAC_Q31 21475
+#define FIND_LPC_COND_FAC_Q32 257698 // 6e-5
+
+/* Find Pred Coef defines */
+#define INACTIVE_BWExp_Q16 64225 // 0.98
+#define ACTIVE_BWExp_Q16 65470 // 0.999
+#define LTP_DAMPING_Q16 66
+#define LTP_SMOOTHING_Q26 6710886
+
+/* LTP quantization settings */
+#define MU_LTP_QUANT_NB_Q8 8
+#define MU_LTP_QUANT_MB_Q8 6
+#define MU_LTP_QUANT_WB_Q8 5
+#define MU_LTP_QUANT_SWB_Q8 4
+
+/***********************/
+/* High pass filtering */
+/***********************/
+/* Smoothing parameters for low end of pitch frequency range estimation */
+#define VARIABLE_HP_SMTH_COEF1_Q16 6554 // 0.1
+#define VARIABLE_HP_SMTH_COEF2_Q16 983 // 0.015
+
+/* Min and max values for low end of pitch frequency range estimation */
+#define VARIABLE_HP_MIN_FREQ_Q0 80
+#define VARIABLE_HP_MAX_FREQ_Q0 150
+
+/* Max absolute difference between log2 of pitch frequency and smoother state, to enter the smoother */
+#define VARIABLE_HP_MAX_DELTA_FREQ_Q7 51 // 0.4 in Q7
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_FIX/SKP_Silk_encode_frame_FIX.c
@@ -1,0 +1,529 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/****************/
+/* Encode frame */
+/****************/
+SKP_int SKP_Silk_encode_frame_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */
+ SKP_uint8 *pCode, /* O Pointer to payload */
+ SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */
+ /* input: max length; output: used */
+ const SKP_int16 *pIn /* I Pointer to input speech frame */
+)
+{
+ SKP_Silk_encoder_control_FIX sEncCtrl;
+ SKP_int i, nBytes, ret = 0;
+ SKP_int16 *x_frame, *res_pitch_frame;
+ SKP_int16 xfw[ MAX_FRAME_LENGTH ];
+ SKP_int16 pIn_HP[ MAX_FRAME_LENGTH ];
+ SKP_int16 res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ];
+ SKP_int LBRR_idx, frame_terminator;
+ const SKP_uint16 *FrameTermination_CDF;
+
+ /* Low bitrate redundancy parameters */
+ SKP_uint8 LBRRpayload[ MAX_ARITHM_BYTES ];
+ SKP_int16 nBytesLBRR;
+ ec_byte_buffer range_enc_celt_buf;
+
+ sEncCtrl.sCmn.Seed = psEnc->sCmn.frameCounter++ & 3;
+
+TIC(ENCODE_FRAME)
+
+ /**************************************************************/
+ /* Setup Input Pointers, and insert frame in input buffer */
+ /*************************************************************/
+ x_frame = psEnc->x_buf + psEnc->sCmn.ltp_mem_length; /* start of frame to encode */
+ res_pitch_frame = res_pitch + psEnc->sCmn.ltp_mem_length; /* start of pitch LPC residual frame */
+
+ /****************************/
+ /* Voice Activity Detection */
+ /****************************/
+TIC(VAD)
+ ret = SKP_Silk_VAD_GetSA_Q8( &psEnc->sCmn.sVAD, &psEnc->speech_activity_Q8,
+ sEncCtrl.input_quality_bands_Q15, &sEncCtrl.input_tilt_Q15,
+ pIn, psEnc->sCmn.frame_length, psEnc->sCmn.fs_kHz );
+TOC(VAD)
+
+ /*******************************************/
+ /* High-pass filtering of the input signal */
+ /*******************************************/
+TIC(HP_IN)
+#if HIGH_PASS_INPUT
+ /* Variable high-pass filter */
+ SKP_Silk_HP_variable_cutoff_FIX( psEnc, &sEncCtrl, pIn_HP, pIn );
+#else
+ SKP_memcpy( pIn_HP, pIn,psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
+#endif
+TOC(HP_IN)
+
+#if SWITCH_TRANSITION_FILTERING
+ /* Ensure smooth bandwidth transitions */
+ SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, x_frame + psEnc->sCmn.la_shape, pIn_HP, psEnc->sCmn.frame_length );
+#else
+ SKP_memcpy( x_frame + psEnc->sCmn.la_shape, pIn_HP,psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
+#endif
+
+ /*****************************************/
+ /* Find pitch lags, initial LPC analysis */
+ /*****************************************/
+TIC(FIND_PITCH)
+ SKP_Silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame );
+TOC(FIND_PITCH)
+
+ /************************/
+ /* Noise shape analysis */
+ /************************/
+TIC(NOISE_SHAPE_ANALYSIS)
+ SKP_Silk_noise_shape_analysis_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame );
+TOC(NOISE_SHAPE_ANALYSIS)
+
+ /*****************************************/
+ /* Prefiltering for noise shaper */
+ /*****************************************/
+TIC(PREFILTER)
+ SKP_Silk_prefilter_FIX( psEnc, &sEncCtrl, xfw, x_frame );
+TOC(PREFILTER)
+
+ /***************************************************/
+ /* Find linear prediction coefficients (LPC + LTP) */
+ /***************************************************/
+TIC(FIND_PRED_COEF)
+ SKP_Silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch );
+TOC(FIND_PRED_COEF)
+
+ /****************************************/
+ /* Process gains */
+ /****************************************/
+TIC(PROCESS_GAINS)
+ SKP_Silk_process_gains_FIX( psEnc, &sEncCtrl );
+TOC(PROCESS_GAINS)
+
+ psEnc->sCmn.sigtype[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.sigtype;
+ psEnc->sCmn.QuantOffsetType[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.QuantOffsetType;
+
+ /****************************************/
+ /* Low Bitrate Redundant Encoding */
+ /****************************************/
+ nBytesLBRR = MAX_ARITHM_BYTES;
+TIC(LBRR)
+ SKP_Silk_LBRR_encode_FIX( psEnc, &sEncCtrl, LBRRpayload, &nBytesLBRR, xfw );
+TOC(LBRR)
+
+ /*****************************************/
+ /* Noise shaping quantization */
+ /*****************************************/
+TIC(NSQ)
+ if( psEnc->sCmn.nStatesDelayedDecision > 1 ) {
+ SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sNSQ, xfw,
+ &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf *psEnc->sCmn.frame_length ], sEncCtrl.sCmn.NLSFInterpCoef_Q2,
+ sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14,
+ sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.Lambda_Q10,
+ sEncCtrl.LTP_scale_Q14 );
+ } else {
+ SKP_Silk_NSQ( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sNSQ, xfw,
+ &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf *psEnc->sCmn.frame_length ], sEncCtrl.sCmn.NLSFInterpCoef_Q2,
+ sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14,
+ sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.Lambda_Q10,
+ sEncCtrl.LTP_scale_Q14 );
+ }
+TOC(NSQ)
+
+ /**************************************************/
+ /* Convert speech activity into VAD and DTX flags */
+ /**************************************************/
+ if( psEnc->speech_activity_Q8 < SPEECH_ACTIVITY_DTX_THRES_Q8 ) {
+ psEnc->sCmn.vadFlag = NO_VOICE_ACTIVITY;
+ psEnc->sCmn.noSpeechCounter++;
+ if( psEnc->sCmn.noSpeechCounter > NO_SPEECH_FRAMES_BEFORE_DTX ) {
+ psEnc->sCmn.inDTX = 1;
+ }
+ if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX ) {
+ psEnc->sCmn.noSpeechCounter = 0;
+ psEnc->sCmn.inDTX = 0;
+ }
+ } else {
+ psEnc->sCmn.noSpeechCounter = 0;
+ psEnc->sCmn.inDTX = 0;
+ psEnc->sCmn.vadFlag = VOICE_ACTIVITY;
+ }
+
+ /****************************************/
+ /* Initialize arithmetic coder */
+ /****************************************/
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ ec_byte_writeinit_buffer( &range_enc_celt_buf, psEnc->sCmn.sRC.buffer, MAX_ARITHM_BYTES );
+ ec_enc_init( &psEnc->sCmn.sRC.range_enc_celt_state, &range_enc_celt_buf );
+
+ SKP_Silk_range_enc_init( &psEnc->sCmn.sRC );
+ psEnc->sCmn.nBytesInPayloadBuf = 0;
+ }
+
+ /****************************************/
+ /* Encode Parameters */
+ /****************************************/
+TIC(ENCODE_PARAMS)
+ SKP_Silk_encode_parameters_v4( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sCmn.sRC );
+ FrameTermination_CDF = SKP_Silk_FrameTermination_v4_CDF;
+TOC(ENCODE_PARAMS)
+
+ /****************************************/
+ /* Update Buffers and State */
+ /****************************************/
+ /* Update Input buffer */
+ SKP_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ], ( psEnc->sCmn.ltp_mem_length + psEnc->sCmn.la_shape ) * sizeof( SKP_int16 ) );
+
+ /* parameters needed for next frame */
+ psEnc->sCmn.prev_sigtype = sEncCtrl.sCmn.sigtype;
+ psEnc->sCmn.prevLag = sEncCtrl.sCmn.pitchL[ psEnc->sCmn.nb_subfr - 1 ];
+ psEnc->sCmn.first_frame_after_reset = 0;
+
+ if( psEnc->sCmn.sRC.error ) {
+ /* encoder returned error: clear payload buffer */
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ } else {
+ psEnc->sCmn.nFramesInPayloadBuf++;
+ }
+
+ /****************************************/
+ /* finalize payload and copy to output */
+ /****************************************/
+ if( psEnc->sCmn.nFramesInPayloadBuf * SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr >= psEnc->sCmn.PacketSize_ms ) {
+
+ LBRR_idx = ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK;
+
+ /* Check if FEC information should be added */
+ frame_terminator = SKP_SILK_LAST_FRAME;
+ if( psEnc->sCmn.LBRR_buffer[ LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS1 ) {
+ frame_terminator = SKP_SILK_LBRR_VER1;
+ }
+ if( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS2 ) {
+ frame_terminator = SKP_SILK_LBRR_VER2;
+ LBRR_idx = psEnc->sCmn.oldest_LBRR_idx;
+ }
+
+ /* Add the frame termination info to stream */
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF );
+
+ /* Code excitation signal */
+ for( i = 0; i <psEnc->sCmn.nFramesInPayloadBuf; i++ ) {
+ SKP_Silk_encode_pulses( &psEnc->sCmn.sRC, psEnc->sCmn.sigtype[ i ],psEnc->sCmn.QuantOffsetType[ i ],
+ &psEnc->sCmn.q[ i * psEnc->sCmn.frame_length],psEnc->sCmn.frame_length );
+ }
+ /* payload length so far */
+ SKP_Silk_range_encoder_get_length( &psEnc->sCmn.sRC, &nBytes );
+
+ /* check that there is enough space in external output buffer, and move data */
+ if( *pnBytesOut >= nBytes ) {
+ SKP_int bits_in_stream, mask;
+ bits_in_stream = ec_enc_tell( &psEnc->sCmn.sRC.range_enc_celt_state, 0 );
+ ec_enc_done( &psEnc->sCmn.sRC.range_enc_celt_state );
+
+ /* Fill up any remaining bits in the last byte with 1s */
+ if( bits_in_stream & 7 ) {
+ mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );
+ if( nBytes - 1 < *pnBytesOut ) {
+ psEnc->sCmn.sRC.range_enc_celt_state.buf->buf[ nBytes - 1 ] |= mask;
+ }
+ }
+ SKP_memcpy( pCode, psEnc->sCmn.sRC.range_enc_celt_state.buf->buf, nBytes * sizeof( SKP_uint8 ) );
+
+ if( frame_terminator > SKP_SILK_MORE_FRAMES &&
+ *pnBytesOut >= nBytes + psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes ) {
+ /* Get old packet and add to payload. */
+ SKP_memcpy( &pCode[ nBytes ],
+ psEnc->sCmn.LBRR_buffer[ LBRR_idx ].payload,
+ psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes * sizeof( SKP_uint8 ) );
+ nBytes += psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes;
+ }
+
+ *pnBytesOut = nBytes;
+
+ /* Update FEC buffer */
+ SKP_memcpy( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].payload, LBRRpayload,
+ nBytesLBRR * sizeof( SKP_uint8 ) );
+ psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].nBytes = nBytesLBRR;
+ /* This line tells describes how FEC should be used */
+ psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage = sEncCtrl.sCmn.LBRR_usage;
+ psEnc->sCmn.oldest_LBRR_idx = ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK;
+
+ /* Reset number of frames in payload buffer */
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ } else {
+ /* Not enough space: Payload will be discarded */
+ *pnBytesOut = 0;
+ nBytes = 0;
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ ret = SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT;
+ }
+ } else {
+ /* no payload for you this time */
+ *pnBytesOut = 0;
+
+ /* Encode that more frames follows */
+ frame_terminator = SKP_SILK_MORE_FRAMES;
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF );
+
+ /* payload length so far */
+ SKP_Silk_range_encoder_get_length( &psEnc->sCmn.sRC, &nBytes );
+
+ /* Take into account the q signal that isnt in the bitstream yet */
+ nBytes += SKP_Silk_pulses_to_bytes( &psEnc->sCmn,
+ &psEnc->sCmn.q[ (psEnc->sCmn.nFramesInPayloadBuf - 1) * psEnc->sCmn.frame_length ] );
+ }
+
+ /* Check for arithmetic coder errors */
+ if( psEnc->sCmn.sRC.error ) {
+ ret = SKP_SILK_ENC_INTERNAL_ERROR;
+ }
+
+ /* simulate number of ms buffered in channel because of exceeding TargetRate */
+ SKP_assert( ( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) ==
+ SKP_SAT32( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) );
+ SKP_assert( psEnc->sCmn.TargetRate_bps > 0 );
+ psEnc->BufferedInChannel_ms += SKP_DIV32( 8 * 1000 * ( nBytes -psEnc->sCmn.nBytesInPayloadBuf ),psEnc->sCmn.TargetRate_bps );
+ psEnc->BufferedInChannel_ms -= SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr );
+ psEnc->BufferedInChannel_ms = SKP_LIMIT_int( psEnc->BufferedInChannel_ms, 0, 100 );
+ psEnc->sCmn.nBytesInPayloadBuf = nBytes;
+
+ if( psEnc->speech_activity_Q8 > WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES_Q8 ) {
+ psEnc->sCmn.sSWBdetect.ActiveSpeech_ms = SKP_ADD_POS_SAT32( psEnc->sCmn.sSWBdetect.ActiveSpeech_ms, SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) );
+ }
+
+TOC(ENCODE_FRAME)
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ {
+ SKP_float tmp[ MAX_NB_SUBFR * LTP_ORDER ];
+ int i;
+ DEBUG_STORE_DATA( xf.dat, x_frame +psEnc->sCmn.la_shape, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
+ DEBUG_STORE_DATA( xfw.dat, xfw, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
+ // DEBUG_STORE_DATA( q.dat, &psEnc->sCmn.q[ ( psEnc->sCmn.nFramesInPayloadBuf - 1)*psEnc->sCmn.frame_length ], psEnc->sCmn.frame_length * sizeof( SKP_int8 ) );
+ DEBUG_STORE_DATA( pitchL.dat, sEncCtrl.sCmn.pitchL, psEnc->sCmn.nb_subfr * sizeof( SKP_int ) );
+ for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) {
+ tmp[ i ] = (SKP_float)sEncCtrl.LTPCoef_Q14[ i ] / 16384.0f;
+ }
+ DEBUG_STORE_DATA( pitchG_quantized.dat, tmp, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( SKP_float ) );
+ for( i = 0; i <psEnc->sCmn.predictLPCOrder; i++ ) {
+ tmp[ i ] = (SKP_float)sEncCtrl.PredCoef_Q12[ 1 ][ i ] / 4096.0f;
+ }
+ DEBUG_STORE_DATA( PredCoef.dat, tmp, psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );
+
+ tmp[ 0 ] = (SKP_float)sEncCtrl.pitch_freq_low_Hz;
+ DEBUG_STORE_DATA( pitch_freq_low_Hz.dat, tmp, sizeof( SKP_float ) );
+ tmp[ 0 ] = (SKP_float)sEncCtrl.LTPredCodGain_Q7 / 128.0f;
+ DEBUG_STORE_DATA( LTPredCodGain.dat, tmp, sizeof( SKP_float ) );
+ tmp[ 0 ] = (SKP_float)psEnc->LTPCorr_Q15 / 32768.0f;
+ DEBUG_STORE_DATA( LTPcorr.dat, tmp, sizeof( SKP_float ) );
+ tmp[ 0 ] = (SKP_float)sEncCtrl.input_tilt_Q15 / 32768.0f;
+ DEBUG_STORE_DATA( tilt.dat, tmp, sizeof( SKP_float ) );
+ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {
+ tmp[ i ] = (SKP_float)sEncCtrl.Gains_Q16[ i ] / 65536.0f;
+ }
+ DEBUG_STORE_DATA( gains.dat, tmp, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( gains_indices.dat, &sEncCtrl.sCmn.GainsIndices, psEnc->sCmn.nb_subfr * sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( nBytes.dat, &nBytes, sizeof( SKP_int ) );
+ tmp[ 0 ] = (SKP_float)sEncCtrl.current_SNR_dB_Q7 / 128.0f;
+ DEBUG_STORE_DATA( current_SNR_db.dat, tmp, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( QuantOffsetType.dat, &sEncCtrl.sCmn.QuantOffsetType, sizeof( SKP_int ) );
+ tmp[ 0 ] = (SKP_float)psEnc->speech_activity_Q8 / 256.0f;
+ DEBUG_STORE_DATA( speech_activity.dat, tmp, sizeof( SKP_float ) );
+ for( i = 0; i < VAD_N_BANDS; i++ ) {
+ tmp[ i ] = (SKP_float)sEncCtrl.input_quality_bands_Q15[ i ] / 32768.0f;
+ }
+ DEBUG_STORE_DATA( input_quality_bands.dat, tmp, VAD_N_BANDS * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( sigtype.dat, &sEncCtrl.sCmn.sigtype, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( ratelevel.dat, &sEncCtrl.sCmn.RateLevelIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( lag_index.dat, &sEncCtrl.sCmn.lagIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( contour_index.dat, &sEncCtrl.sCmn.contourIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( per_index.dat, &sEncCtrl.sCmn.PERIndex, sizeof( SKP_int ) );
+ }
+#endif
+ return( ret );
+}
+
+/* Low BitRate Redundancy encoding functionality. Reuse all parameters but encode residual with lower bitrate */
+void SKP_Silk_LBRR_encode_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk encoder control struct */
+ SKP_uint8 *pCode, /* O Pointer to payload */
+ SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */
+ SKP_int16 xfw[] /* I Input signal */
+)
+{
+ SKP_int i, TempGainsIndices[ MAX_NB_SUBFR ], frame_terminator;
+ SKP_int nBytes, nFramesInPayloadBuf;
+ SKP_int32 TempGains_Q16[ MAX_NB_SUBFR ];
+ SKP_int typeOffset, LTP_scaleIndex, Rate_only_parameters = 0;
+ ec_byte_buffer range_enc_celt_buf;
+
+ /*******************************************/
+ /* Control use of inband LBRR */
+ /*******************************************/
+ SKP_Silk_LBRR_ctrl_FIX( psEnc, psEncCtrl );
+
+ if( psEnc->sCmn.LBRR_enabled ) {
+ /* Save original Gains */
+ SKP_memcpy( TempGainsIndices, psEncCtrl->sCmn.GainsIndices, MAX_NB_SUBFR * sizeof( SKP_int ) );
+ SKP_memcpy( TempGains_Q16, psEncCtrl->Gains_Q16, MAX_NB_SUBFR * sizeof( SKP_int32 ) );
+
+ typeOffset = psEnc->sCmn.typeOffsetPrev; // Temp save as cannot be overwritten
+ LTP_scaleIndex = psEncCtrl->sCmn.LTP_scaleIndex;
+
+ /* Set max rate where quant signal is encoded */
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ Rate_only_parameters = 13500;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ Rate_only_parameters = 15500;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ Rate_only_parameters = 17500;
+ } else if( psEnc->sCmn.fs_kHz == 24 ) {
+ Rate_only_parameters = 19500;
+ } else {
+ SKP_assert( 0 );
+ }
+
+ if( psEnc->sCmn.Complexity > 0 && psEnc->sCmn.TargetRate_bps > Rate_only_parameters ) {
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ /* First frame in packet copy Everything */
+ SKP_memcpy( &psEnc->sNSQ_LBRR, &psEnc->sNSQ, sizeof( SKP_Silk_nsq_state ) );
+
+ psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex;
+ /* Increase Gains to get target LBRR rate */
+ psEncCtrl->sCmn.GainsIndices[ 0 ] = psEncCtrl->sCmn.GainsIndices[ 0 ] + psEnc->sCmn.LBRR_GainIncreases;
+ psEncCtrl->sCmn.GainsIndices[ 0 ] = SKP_LIMIT_int( psEncCtrl->sCmn.GainsIndices[ 0 ], 0, N_LEVELS_QGAIN - 1 );
+ }
+ /* Decode to get Gains in sync with decoder */
+ /* Overwrite unquantized gains with quantized gains */
+ SKP_Silk_gains_dequant( psEncCtrl->Gains_Q16, psEncCtrl->sCmn.GainsIndices,
+ &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );
+ /*****************************************/
+ /* Noise shaping quantization */
+ /*****************************************/
+ if( psEnc->sCmn.nStatesDelayedDecision > 1 ) {
+ SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEncCtrl->sCmn,
+ &psEnc->sNSQ_LBRR, xfw, &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ],
+ psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14,
+ psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14,
+ psEncCtrl->Gains_Q16, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 );
+ } else {
+ SKP_Silk_NSQ( &psEnc->sCmn, &psEncCtrl->sCmn,
+ &psEnc->sNSQ_LBRR, xfw, &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ],
+ psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14,
+ psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14,
+ psEncCtrl->Gains_Q16, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 );
+ }
+ } else {
+ SKP_memset( &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf *psEnc->sCmn.frame_length ], 0,
+ psEnc->sCmn.frame_length * sizeof( SKP_int ) );
+ psEncCtrl->sCmn.LTP_scaleIndex = 0;
+ }
+ /****************************************/
+ /* Initialize arithmetic coder */
+ /****************************************/
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ ec_byte_writeinit_buffer( &range_enc_celt_buf, psEnc->sCmn.sRC_LBRR.buffer, MAX_ARITHM_BYTES );
+ ec_enc_init( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state, &range_enc_celt_buf );
+
+ SKP_Silk_range_enc_init( &psEnc->sCmn.sRC_LBRR );
+ psEnc->sCmn.nBytesInPayloadBuf = 0;
+ }
+
+ /****************************************/
+ /* Encode Parameters */
+ /****************************************/
+ SKP_Silk_encode_parameters_v4( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sCmn.sRC_LBRR );
+
+ if( psEnc->sCmn.sRC_LBRR.error ) {
+ /* encoder returned error: clear payload buffer */
+ nFramesInPayloadBuf = 0;
+ } else {
+ nFramesInPayloadBuf = psEnc->sCmn.nFramesInPayloadBuf + 1;
+ }
+
+ /****************************************/
+ /* finalize payload and copy to output */
+ /****************************************/
+ if( SKP_SMULBB( nFramesInPayloadBuf, SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) ) >= psEnc->sCmn.PacketSize_ms ) {
+
+ /* Check if FEC information should be added */
+ frame_terminator = SKP_SILK_LAST_FRAME;
+
+ /* Add the frame termination info to stream */
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_v4_CDF );
+
+ /*********************************************/
+ /* Encode quantization indices of excitation */
+ /*********************************************/
+ for( i = 0; i < nFramesInPayloadBuf; i++ ) {
+ SKP_Silk_encode_pulses( &psEnc->sCmn.sRC_LBRR, psEnc->sCmn.sigtype[ i ], psEnc->sCmn.QuantOffsetType[ i ],
+ &psEnc->sCmn.q_LBRR[ i * psEnc->sCmn.frame_length ], psEnc->sCmn.frame_length );
+ }
+ /* payload length so far */
+ SKP_Silk_range_encoder_get_length( &psEnc->sCmn.sRC_LBRR, &nBytes );
+
+ /* check that there is enough space in external output buffer, and move data */
+ if( *pnBytesOut >= nBytes ) {
+ SKP_int bits_in_stream, mask;
+ bits_in_stream = ec_enc_tell( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state, 0 );
+ ec_enc_done( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state );
+
+ /* Fill up any remaining bits in the last byte with 1s */
+ if( bits_in_stream & 7 ) {
+ mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );
+ if( nBytes - 1 < *pnBytesOut ) {
+ psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf[ nBytes - 1 ] |= mask;
+ }
+ }
+ SKP_memcpy( pCode, psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf, nBytes * sizeof( SKP_uint8 ) );
+//#endif
+ *pnBytesOut = nBytes;
+ } else {
+ /* not enough space: payload will be discarded */
+ *pnBytesOut = 0;
+ SKP_assert( 0 );
+ }
+ } else {
+ /* no payload for you this time */
+ *pnBytesOut = 0;
+
+ /* Encode that more frames follows */
+ frame_terminator = SKP_SILK_MORE_FRAMES;
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_v4_CDF );
+ }
+
+ /* Restore original Gains */
+ SKP_memcpy( psEncCtrl->sCmn.GainsIndices, TempGainsIndices, MAX_NB_SUBFR * sizeof( SKP_int ) );
+ SKP_memcpy( psEncCtrl->Gains_Q16, TempGains_Q16, MAX_NB_SUBFR * sizeof( SKP_int32 ) );
+
+ /* Restore LTP scale index and typeoffset */
+ psEncCtrl->sCmn.LTP_scaleIndex = LTP_scaleIndex;
+ psEnc->sCmn.typeOffsetPrev = typeOffset;
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_find_LPC_FIX.c
@@ -1,0 +1,148 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Finds LPC vector from correlations, and converts to NLSF */
+void SKP_Silk_find_LPC_FIX(
+ SKP_int NLSF_Q15[], /* O NLSFs */
+ SKP_int *interpIndex, /* O NLSF interpolation index, only used for NLSF interpolation */
+ const SKP_int prev_NLSFq_Q15[], /* I previous NLSFs, only used for NLSF interpolation */
+ const SKP_int useInterpolatedNLSFs, /* I Flag */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_int16 x[], /* I Input signal */
+ const SKP_int subfr_length, /* I Input signal subframe length including preceeding samples */
+ const SKP_int nb_subfr /* I: Number of subframes */
+)
+{
+ SKP_int k;
+ SKP_int32 a_Q16[ MAX_LPC_ORDER ];
+
+ SKP_int isInterpLower, shift;
+ SKP_int16 S[ MAX_LPC_ORDER ];
+ SKP_int32 res_nrg0, res_nrg1;
+ SKP_int rshift0, rshift1;
+
+ /* Used only for LSF interpolation */
+ SKP_int32 a_tmp_Q16[ MAX_LPC_ORDER ], res_nrg_interp, res_nrg, res_tmp_nrg, res_nrg_2nd;
+ SKP_int res_nrg_interp_Q, res_nrg_Q, res_tmp_nrg_Q, res_nrg_2nd_Q;
+ SKP_int16 a_tmp_Q12[ MAX_LPC_ORDER ];
+ SKP_int NLSF0_Q15[ MAX_LPC_ORDER ];
+ SKP_int16 LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ];
+
+ /* Default: no interpolation */
+ *interpIndex = 4;
+
+ /* Burg AR analysis for the full frame */
+ SKP_Silk_burg_modified( &res_nrg, &res_nrg_Q, a_Q16, x, subfr_length, nb_subfr, FIND_LPC_COND_FAC_Q32, LPC_order );
+
+ if( useInterpolatedNLSFs == 1 && nb_subfr == MAX_NB_SUBFR ) {
+
+ /* Optimal solution for last 10 ms */
+ SKP_Silk_burg_modified( &res_tmp_nrg, &res_tmp_nrg_Q, a_tmp_Q16, x + ( MAX_NB_SUBFR >> 1 ) * subfr_length,
+ subfr_length, ( MAX_NB_SUBFR >> 1 ), FIND_LPC_COND_FAC_Q32, LPC_order );
+
+ /* subtract residual energy here, as that's easier than adding it to the */
+ /* residual energy of the first 10 ms in each iteration of the search below */
+ shift = res_tmp_nrg_Q - res_nrg_Q;
+ if( shift >= 0 ) {
+ if( shift < 32 ) {
+ res_nrg = res_nrg - SKP_RSHIFT( res_tmp_nrg, shift );
+ }
+ } else {
+ SKP_assert( shift > -32 );
+ res_nrg = SKP_RSHIFT( res_nrg, -shift ) - res_tmp_nrg;
+ res_nrg_Q = res_tmp_nrg_Q;
+ }
+
+ /* Convert to NLSFs */
+ SKP_Silk_A2NLSF( NLSF_Q15, a_tmp_Q16, LPC_order );
+
+ /* Search over interpolation indices to find the one with lowest residual energy */
+ res_nrg_2nd = SKP_int32_MAX;
+ for( k = 3; k >= 0; k-- ) {
+ /* Interpolate NLSFs for first half */
+ SKP_Silk_interpolate( NLSF0_Q15, prev_NLSFq_Q15, NLSF_Q15, k, LPC_order );
+
+ /* Convert to LPC for residual energy evaluation */
+ SKP_Silk_NLSF2A_stable( a_tmp_Q12, NLSF0_Q15, LPC_order );
+
+ /* Calculate residual energy with NLSF interpolation */
+ SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) );
+ SKP_Silk_LPC_analysis_filter( x, a_tmp_Q12, S, LPC_res, 2 * subfr_length, LPC_order );
+
+ SKP_Silk_sum_sqr_shift( &res_nrg0, &rshift0, LPC_res + LPC_order, subfr_length - LPC_order );
+ SKP_Silk_sum_sqr_shift( &res_nrg1, &rshift1, LPC_res + LPC_order + subfr_length, subfr_length - LPC_order );
+
+ /* Add subframe energies from first half frame */
+ shift = rshift0 - rshift1;
+ if( shift >= 0 ) {
+ res_nrg1 = SKP_RSHIFT( res_nrg1, shift );
+ res_nrg_interp_Q = -rshift0;
+ } else {
+ res_nrg0 = SKP_RSHIFT( res_nrg0, -shift );
+ res_nrg_interp_Q = -rshift1;
+ }
+ res_nrg_interp = SKP_ADD32( res_nrg0, res_nrg1 );
+
+ /* Compare with first half energy without NLSF interpolation, or best interpolated value so far */
+ shift = res_nrg_interp_Q - res_nrg_Q;
+ if( shift >= 0 ) {
+ if( SKP_RSHIFT( res_nrg_interp, shift ) < res_nrg ) {
+ isInterpLower = SKP_TRUE;
+ } else {
+ isInterpLower = SKP_FALSE;
+ }
+ } else {
+ if( -shift < 32 ) {
+ if( res_nrg_interp < SKP_RSHIFT( res_nrg, -shift ) ) {
+ isInterpLower = SKP_TRUE;
+ } else {
+ isInterpLower = SKP_FALSE;
+ }
+ } else {
+ isInterpLower = SKP_FALSE;
+ }
+ }
+
+ /* Determine whether current interpolated NLSFs are best so far */
+ if( isInterpLower == SKP_TRUE ) {
+ /* Interpolation has lower residual energy */
+ res_nrg = res_nrg_interp;
+ res_nrg_Q = res_nrg_interp_Q;
+ *interpIndex = k;
+ }
+ res_nrg_2nd = res_nrg_interp;
+ res_nrg_2nd_Q = res_nrg_interp_Q;
+ }
+ }
+
+ if( *interpIndex == 4 ) {
+ /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */
+ SKP_Silk_A2NLSF( NLSF_Q15, a_Q16, LPC_order );
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_find_LTP_FIX.c
@@ -1,0 +1,232 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+void SKP_Silk_fit_LTP(
+ SKP_int32 LTP_coefs_Q16[ LTP_ORDER ],
+ SKP_int16 LTP_coefs_Q14[ LTP_ORDER ]
+);
+
+void SKP_Silk_find_LTP_FIX(
+ SKP_int16 b_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */
+ SKP_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */
+ SKP_int *LTPredCodGain_Q7, /* O LTP coding gain */
+ const SKP_int16 r_lpc[] , /* I residual signal after LPC signal + state for first 10 ms */
+ const SKP_int lag[ MAX_NB_SUBFR ], /* I LTP lags */
+ const SKP_int32 Wght_Q15[ MAX_NB_SUBFR ], /* I weights */
+ const SKP_int subfr_length, /* I subframe length */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int mem_offset, /* I number of samples in LTP memory */
+ SKP_int corr_rshifts[ MAX_NB_SUBFR ] /* O right shifts applied to correlations */
+)
+{
+ SKP_int i, k, lshift;
+ const SKP_int16 *r_ptr, *lag_ptr;
+ SKP_int16 *b_Q14_ptr;
+
+ SKP_int32 regu;
+ SKP_int32 *WLTP_ptr;
+ SKP_int32 b_Q16[ LTP_ORDER ], delta_b_Q14[ LTP_ORDER ], d_Q14[ MAX_NB_SUBFR ], nrg[ MAX_NB_SUBFR ], g_Q26;
+ SKP_int32 w[ MAX_NB_SUBFR ], WLTP_max, max_abs_d_Q14, max_w_bits;
+
+ SKP_int32 temp32, denom32;
+ SKP_int extra_shifts;
+ SKP_int rr_shifts, maxRshifts, maxRshifts_wxtra, LZs;
+ SKP_int32 LPC_res_nrg, LPC_LTP_res_nrg, div_Q16;
+ SKP_int32 Rr[ LTP_ORDER ], rr[ MAX_NB_SUBFR ];
+ SKP_int32 wd, m_Q12;
+
+ b_Q14_ptr = b_Q14;
+ WLTP_ptr = WLTP;
+ r_ptr = &r_lpc[ mem_offset ];
+ for( k = 0; k < nb_subfr; k++ ) {
+ lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 );
+
+ SKP_Silk_sum_sqr_shift( &rr[ k ], &rr_shifts, r_ptr, subfr_length ); /* rr[ k ] in Q( -rr_shifts ) */
+ /* Assure headroom */
+ LZs = SKP_Silk_CLZ32( rr[k] );
+ if( LZs < LTP_CORRS_HEAD_ROOM ) {
+ rr[ k ] = SKP_RSHIFT_ROUND( rr[ k ], LTP_CORRS_HEAD_ROOM - LZs );
+ rr_shifts += (LTP_CORRS_HEAD_ROOM - LZs);
+ }
+ corr_rshifts[ k ] = rr_shifts;
+ SKP_Silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, WLTP_ptr, &corr_rshifts[ k ] ); /* WLTP_fix_ptr in Q( -corr_rshifts[ k ] ) */
+ /* The correlation vector always have lower max abs value than rr and/or RR so head room is assured */
+ SKP_Silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr, corr_rshifts[ k ] ); /* Rr_fix_ptr in Q( -corr_rshifts[ k ] ) */
+ if( corr_rshifts[ k ] > rr_shifts ) {
+ rr[ k ] = SKP_RSHIFT( rr[ k ], corr_rshifts[ k ] - rr_shifts ); /* rr[ k ] in Q( -corr_rshifts[ k ] ) */
+ }
+ SKP_assert( rr[ k ] >= 0 );
+
+ regu = SKP_SMULWB( rr[ k ] + 1, LTP_DAMPING_Q16 );
+ SKP_Silk_regularize_correlations_FIX( WLTP_ptr, &rr[k], regu, LTP_ORDER );
+
+ SKP_Silk_solve_LDL_FIX( WLTP_ptr, LTP_ORDER, Rr, b_Q16 ); /* WLTP_fix_ptr and Rr_fix_ptr both in Q(-corr_rshifts[k]) */
+
+ /* Limit and store in Q14 */
+ SKP_Silk_fit_LTP( b_Q16, b_Q14_ptr );
+
+ /* Calculate residual energy */
+ nrg[ k ] = SKP_Silk_residual_energy16_covar_FIX( b_Q14_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER, 14 ); /* nrg_fix in Q( -corr_rshifts[ k ] ) */
+
+ /* temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length ); */
+ extra_shifts = SKP_min_int( corr_rshifts[ k ], LTP_CORRS_HEAD_ROOM );
+ denom32 = SKP_LSHIFT_SAT32( SKP_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 + extra_shifts ) + /* Q( -corr_rshifts[ k ] + extra_shifts ) */
+ SKP_RSHIFT( SKP_SMULWB( subfr_length, 655 ), corr_rshifts[ k ] - extra_shifts ); /* Q( -corr_rshifts[ k ] + extra_shifts ) */
+ denom32 = SKP_max( denom32, 1 );
+ SKP_assert( ((SKP_int64)Wght_Q15[ k ] << 16 ) < SKP_int32_MAX ); /* Wght always < 0.5 in Q0 */
+ temp32 = SKP_DIV32( SKP_LSHIFT( ( SKP_int32 )Wght_Q15[ k ], 16 ), denom32 ); /* Q( 15 + 16 + corr_rshifts[k] - extra_shifts ) */
+ temp32 = SKP_RSHIFT( temp32, 31 + corr_rshifts[ k ] - extra_shifts - 26 ); /* Q26 */
+
+ /* Limit temp such that the below scaling never wraps around */
+ WLTP_max = 0;
+ for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) {
+ WLTP_max = SKP_max( WLTP_ptr[ i ], WLTP_max );
+ }
+ lshift = SKP_Silk_CLZ32( WLTP_max ) - 1 - 3; /* keep 3 bits free for vq_nearest_neighbor_fix */
+ SKP_assert( 26 - 18 + lshift >= 0 );
+ if( 26 - 18 + lshift < 31 ) {
+ temp32 = SKP_min_32( temp32, SKP_LSHIFT( ( SKP_int32 )1, 26 - 18 + lshift ) );
+ }
+
+ SKP_Silk_scale_vector32_Q26_lshift_18( WLTP_ptr, temp32, LTP_ORDER * LTP_ORDER ); /* WLTP_ptr in Q( 18 - corr_rshifts[ k ] ) */
+
+ w[ k ] = matrix_ptr( WLTP_ptr, ( LTP_ORDER >> 1 ), ( LTP_ORDER >> 1 ), LTP_ORDER ); /* w in Q( 18 - corr_rshifts[ k ] ) */
+ SKP_assert( w[k] >= 0 );
+
+ r_ptr += subfr_length;
+ b_Q14_ptr += LTP_ORDER;
+ WLTP_ptr += LTP_ORDER * LTP_ORDER;
+ }
+
+ maxRshifts = 0;
+ for( k = 0; k < nb_subfr; k++ ) {
+ maxRshifts = SKP_max_int( corr_rshifts[ k ], maxRshifts );
+ }
+
+ /* compute LTP coding gain */
+ if( LTPredCodGain_Q7 != NULL ) {
+ LPC_LTP_res_nrg = 0;
+ LPC_res_nrg = 0;
+ SKP_assert( LTP_CORRS_HEAD_ROOM >= 2 ); /* Check that no overflow will happen when adding */
+ for( k = 0; k < nb_subfr; k++ ) {
+ LPC_res_nrg = SKP_ADD32( LPC_res_nrg, SKP_RSHIFT( SKP_ADD32( SKP_SMULWB( rr[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */
+ LPC_LTP_res_nrg = SKP_ADD32( LPC_LTP_res_nrg, SKP_RSHIFT( SKP_ADD32( SKP_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */
+ }
+ LPC_LTP_res_nrg = SKP_max( LPC_LTP_res_nrg, 1 ); /* avoid division by zero */
+
+ div_Q16 = SKP_DIV32_varQ( LPC_res_nrg, LPC_LTP_res_nrg, 16 );
+ *LTPredCodGain_Q7 = ( SKP_int )SKP_SMULBB( 3, SKP_Silk_lin2log( div_Q16 ) - ( 16 << 7 ) );
+
+ SKP_assert( *LTPredCodGain_Q7 == ( SKP_int )SKP_SAT16( SKP_MUL( 3, SKP_Silk_lin2log( div_Q16 ) - ( 16 << 7 ) ) ) );
+ }
+
+ /* smoothing */
+ /* d = sum( B, 1 ); */
+ b_Q14_ptr = b_Q14;
+ for( k = 0; k < nb_subfr; k++ ) {
+ d_Q14[ k ] = 0;
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ d_Q14[ k ] += b_Q14_ptr[ i ];
+ }
+ b_Q14_ptr += LTP_ORDER;
+ }
+
+ /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */
+
+ /* Find maximum absolute value of d_Q14 and the bits used by w in Q0 */
+ max_abs_d_Q14 = 0;
+ max_w_bits = 0;
+ for( k = 0; k < nb_subfr; k++ ) {
+ max_abs_d_Q14 = SKP_max_32( max_abs_d_Q14, SKP_abs( d_Q14[ k ] ) );
+ /* w[ k ] is in Q( 18 - corr_rshifts[ k ] ) */
+ /* Find bits needed in Q( 18 - maxRshifts ) */
+ max_w_bits = SKP_max_32( max_w_bits, 32 - SKP_Silk_CLZ32( w[ k ] ) + corr_rshifts[ k ] - maxRshifts );
+ }
+
+ /* max_abs_d_Q14 = (5 << 15); worst case, i.e. LTP_ORDER * -SKP_int16_MIN */
+ SKP_assert( max_abs_d_Q14 <= ( 5 << 15 ) );
+
+ /* How many bits is needed for w*d' in Q( 18 - maxRshifts ) in the worst case, of all d_Q14's being equal to max_abs_d_Q14 */
+ extra_shifts = max_w_bits + 32 - SKP_Silk_CLZ32( max_abs_d_Q14 ) - 14;
+
+ /* Subtract what we got available; bits in output var plus maxRshifts */
+ extra_shifts -= ( 32 - 1 - 2 + maxRshifts ); /* Keep sign bit free as well as 2 bits for accumulation */
+ extra_shifts = SKP_max_int( extra_shifts, 0 );
+
+ maxRshifts_wxtra = maxRshifts + extra_shifts;
+
+ temp32 = SKP_RSHIFT( 262, maxRshifts + extra_shifts ) + 1; /* 1e-3f in Q( 18 - (maxRshifts + extra_shifts) ) */
+ wd = 0;
+ for( k = 0; k < nb_subfr; k++ ) {
+ /* w has at least 2 bits of headroom so no overflow should happen */
+ temp32 = SKP_ADD32( temp32, SKP_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ) ); /* Q( 18 - maxRshifts_wxtra ) */
+ wd = SKP_ADD32( wd, SKP_LSHIFT( SKP_SMULWW( SKP_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ), d_Q14[ k ] ), 2 ) ); /* Q( 18 - maxRshifts_wxtra ) */
+ }
+ m_Q12 = SKP_DIV32_varQ( wd, temp32, 12 );
+
+ b_Q14_ptr = b_Q14;
+ for( k = 0; k < nb_subfr; k++ ) {
+ /* w_fix[ k ] from Q( 18 - corr_rshifts[ k ] ) to Q( 16 ) */
+ if( 2 - corr_rshifts[k] > 0 ) {
+ temp32 = SKP_RSHIFT( w[ k ], 2 - corr_rshifts[ k ] );
+ } else {
+ temp32 = SKP_LSHIFT_SAT32( w[ k ], corr_rshifts[ k ] - 2 );
+ }
+
+ g_Q26 = SKP_MUL(
+ SKP_DIV32(
+ LTP_SMOOTHING_Q26,
+ SKP_RSHIFT( LTP_SMOOTHING_Q26, 10 ) + temp32 ), /* Q10 */
+ SKP_LSHIFT_SAT32( SKP_SUB_SAT32( ( SKP_int32 )m_Q12, SKP_RSHIFT( d_Q14[ k ], 2 ) ), 4 ) ); /* Q16 */
+
+ temp32 = 0;
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ delta_b_Q14[ i ] = SKP_max_16( b_Q14_ptr[ i ], 1638 ); /* 1638_Q14 = 0.1_Q0 */
+ temp32 += delta_b_Q14[ i ]; /* Q14 */
+ }
+ temp32 = SKP_DIV32( g_Q26, temp32 ); /* Q14->Q12 */
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ b_Q14_ptr[ i ] = SKP_LIMIT_32( ( SKP_int32 )b_Q14_ptr[ i ] + SKP_SMULWB( SKP_LSHIFT_SAT32( temp32, 4 ), delta_b_Q14[ i ] ), -16000, 28000 );
+ }
+ b_Q14_ptr += LTP_ORDER;
+ }
+TOC(find_LTP_FIX)
+}
+
+void SKP_Silk_fit_LTP(
+ SKP_int32 LTP_coefs_Q16[ LTP_ORDER ],
+ SKP_int16 LTP_coefs_Q14[ LTP_ORDER ]
+)
+{
+ SKP_int i;
+
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ LTP_coefs_Q14[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( LTP_coefs_Q16[ i ], 2 ) );
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_find_pitch_lags_FIX.c
@@ -1,0 +1,124 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+#include "SKP_Silk_common_pitch_est_defines.h"
+
+/* Find pitch lags */
+void SKP_Silk_find_pitch_lags_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
+ SKP_int16 res[], /* O residual */
+ const SKP_int16 x[] /* I Speech signal */
+)
+{
+ SKP_Silk_predict_state_FIX *psPredSt = &psEnc->sPred;
+ SKP_int buf_len, i, scale;
+ SKP_int32 thrhld_Q15;
+ const SKP_int16 *x_buf, *x_buf_ptr;
+ SKP_int16 Wsig[ FIND_PITCH_LPC_WIN_MAX ], *Wsig_ptr;
+ SKP_int32 auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ];
+ SKP_int16 rc_Q15[ MAX_FIND_PITCH_LPC_ORDER ];
+ SKP_int32 A_Q24[ MAX_FIND_PITCH_LPC_ORDER ];
+ SKP_int32 FiltState[ MAX_FIND_PITCH_LPC_ORDER ];
+ SKP_int16 A_Q12[ MAX_FIND_PITCH_LPC_ORDER ];
+
+ /******************************************/
+ /* Setup buffer lengths etc based on Fs */
+ /******************************************/
+ buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length;
+
+ /* Safty check */
+ SKP_assert( buf_len >= psPredSt->pitch_LPC_win_length );
+
+ x_buf = x - psEnc->sCmn.ltp_mem_length;
+
+ /*************************************/
+ /* Estimate LPC AR coefficients */
+ /*************************************/
+
+ /* Calculate windowed signal */
+
+ /* First LA_LTP samples */
+ x_buf_ptr = x_buf + buf_len - psPredSt->pitch_LPC_win_length;
+ Wsig_ptr = Wsig;
+ SKP_Silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch );
+
+ /* Middle un - windowed samples */
+ Wsig_ptr += psEnc->sCmn.la_pitch;
+ x_buf_ptr += psEnc->sCmn.la_pitch;
+ SKP_memcpy( Wsig_ptr, x_buf_ptr, ( psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( SKP_int16 ) );
+
+ /* Last LA_LTP samples */
+ Wsig_ptr += psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 );
+ x_buf_ptr += psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 );
+ SKP_Silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch );
+
+ /* Calculate autocorrelation sequence */
+ SKP_Silk_autocorr( auto_corr, &scale, Wsig, psPredSt->pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1 );
+
+ /* add white noise, as fraction of energy */
+ auto_corr[ 0 ] = SKP_SMLAWB( auto_corr[ 0 ], auto_corr[ 0 ], FIND_PITCH_WHITE_NOISE_FRACTION_Q16 );
+
+ /* calculate the reflection coefficients using schur */
+ SKP_Silk_schur( rc_Q15, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder );
+
+ /* convert reflection coefficients to prediction coefficients */
+ SKP_Silk_k2a( A_Q24, rc_Q15, psEnc->sCmn.pitchEstimationLPCOrder );
+
+ /* Convert From 32 bit Q24 to 16 bit Q12 coefs */
+ for( i = 0; i < psEnc->sCmn.pitchEstimationLPCOrder; i++ ) {
+ A_Q12[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT( A_Q24[ i ], 12 ) );
+ }
+
+ /* Do BWE */
+ SKP_Silk_bwexpander( A_Q12, psEnc->sCmn.pitchEstimationLPCOrder, FIND_PITCH_BANDWITH_EXPANSION_Q16 );
+
+ /*****************************************/
+ /* LPC analysis filtering */
+ /*****************************************/
+ SKP_memset( FiltState, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int32 ) ); /* Not really necessary, but Valgrind will complain otherwise */
+ SKP_Silk_MA_Prediction( x_buf, A_Q12, FiltState, res, buf_len, psEnc->sCmn.pitchEstimationLPCOrder );
+ SKP_memset( res, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int16 ) );
+
+ /* Threshold for pitch estimator */
+ thrhld_Q15 = ( 1 << 14 ); // 0.5f in Q15
+ thrhld_Q15 = SKP_SMLABB( thrhld_Q15, -131, psEnc->sCmn.pitchEstimationLPCOrder );
+ thrhld_Q15 = SKP_SMLABB( thrhld_Q15, -13, ( SKP_int16 )SKP_Silk_SQRT_APPROX( SKP_LSHIFT( ( SKP_int32 )psEnc->speech_activity_Q8, 8 ) ) );
+ thrhld_Q15 = SKP_SMLABB( thrhld_Q15, 4587, psEnc->sCmn.prev_sigtype );
+ thrhld_Q15 = SKP_MLA( thrhld_Q15, -31, SKP_RSHIFT( psEncCtrl->input_tilt_Q15, 8 ) );
+ thrhld_Q15 = SKP_SAT16( thrhld_Q15 );
+
+ /*****************************************/
+ /* Call pitch estimator */
+ /*****************************************/
+TIC(pitch_analysis_core_FIX)
+ psEncCtrl->sCmn.sigtype = SKP_Silk_pitch_analysis_core( res, psEncCtrl->sCmn.pitchL, &psEncCtrl->sCmn.lagIndex,
+ &psEncCtrl->sCmn.contourIndex, &psEnc->LTPCorr_Q15, psEnc->sCmn.prevLag, psEnc->pitchEstimationThreshold_Q16,
+ ( SKP_int16 )thrhld_Q15, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr );
+TOC(pitch_analysis_core_FIX)
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_find_pred_coefs_FIX.c
@@ -1,0 +1,442 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+#include <math.h>
+
+void SKP_Silk_LTP_ana_core(
+ SKP_float r_LPC[], /* I LPC residual */
+ SKP_float r_LTP[], /* O LTP residual */
+ const SKP_int pitchL[], /* I pitch lags */
+ const SKP_float LTPCoef[], /* I LTP Coeficients */
+ SKP_int subfr_length, /* I smpls in one sub frame */
+ SKP_int LTP_mem_length /* I Length of LTP state of input */
+);
+
+void SKP_Silk_LPC_analysis_filter_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coeficicnts */
+ const SKP_float s[], /* I Input Signal */
+ SKP_int length, /* I length of signal */
+ SKP_int Order /* I LPC order */
+);
+
+double SKP_Silk_energy_FLP(
+ const SKP_float *data,
+ SKP_int dataSize
+);
+
+/* integer to floating-point conversion */
+SKP_INLINE void SKP_short2float_array(
+ SKP_float *out,
+ const SKP_int16 *in,
+ SKP_int32 length
+);
+
+SKP_INLINE SKP_float SKP_Silk_log2( double x ) { return ( SKP_float )( 3.32192809488736 * log10( x ) ); }
+
+#endif
+
+void SKP_Silk_find_pred_coefs_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
+ const SKP_int16 res_pitch[] /* I Residual from pitch analysis */
+)
+{
+ SKP_int i;
+ SKP_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ];
+ SKP_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ], Wght_Q15[ MAX_NB_SUBFR ];
+ SKP_int NLSF_Q15[ MAX_LPC_ORDER ];
+ const SKP_int16 *x_ptr;
+ SKP_int16 *x_pre_ptr, LPC_in_pre[ MAX_NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ];
+ SKP_int32 tmp, min_gain_Q16;
+ SKP_int LTP_corrs_rshift[ MAX_NB_SUBFR ];
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_int16 uq_PredCoef_Q12[ MAX_NB_SUBFR >> 1 ][ MAX_LPC_ORDER ];
+ SKP_float uq_PredCoef[ MAX_NB_SUBFR >> 1 ][ MAX_LPC_ORDER ];
+ SKP_float uq_LTPCoef[ MAX_NB_SUBFR * LTP_ORDER ];
+#endif
+
+ /* weighting for weighted least squares */
+ min_gain_Q16 = SKP_int32_MAX >> 6;
+ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {
+ min_gain_Q16 = SKP_min( min_gain_Q16, psEncCtrl->Gains_Q16[ i ] );
+ }
+ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {
+ /* Divide to Q16 */
+ SKP_assert( psEncCtrl->Gains_Q16[ i ] > 0 );
+ /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */
+ invGains_Q16[ i ] = SKP_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 );
+
+ /* Ensure Wght_Q15 a minimum value 1 */
+ invGains_Q16[ i ] = SKP_max( invGains_Q16[ i ], 363 );
+
+ /* Square the inverted gains */
+ SKP_assert( invGains_Q16[ i ] == SKP_SAT16( invGains_Q16[ i ] ) );
+ tmp = SKP_SMULWB( invGains_Q16[ i ], invGains_Q16[ i ] );
+ Wght_Q15[ i ] = SKP_RSHIFT( tmp, 1 );
+
+ /* Invert the inverted and normalized gains */
+ local_gains[ i ] = SKP_DIV32( ( 1 << 16 ), invGains_Q16[ i ] );
+ }
+
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /**********/
+ /* VOICED */
+ /**********/
+ SKP_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->sCmn.pitchL[ 0 ] + LTP_ORDER / 2 );
+
+ /* LTP analysis */
+ SKP_Silk_find_LTP_FIX( psEncCtrl->LTPCoef_Q14, WLTP, &psEncCtrl->LTPredCodGain_Q7,
+ res_pitch, psEncCtrl->sCmn.pitchL, Wght_Q15, psEnc->sCmn.subfr_length,
+ psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length, LTP_corrs_rshift );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ /* Save unquantized LTP coefficients */
+ for( i = 0; i < LTP_ORDER * psEnc->sCmn.nb_subfr; i++ ) {
+ uq_LTPCoef[ i ] = (SKP_float)psEncCtrl->LTPCoef_Q14[ i ] / 16384.0f;
+ }
+#endif
+
+ /* Quantize LTP gain parameters */
+ SKP_Silk_quant_LTP_gains_FIX( psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.LTPIndex, &psEncCtrl->sCmn.PERIndex,
+ WLTP, psEnc->mu_LTP_Q8, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr);
+
+ /* Control LTP scaling */
+ SKP_Silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl );
+
+ /* Create LTP residual */
+ SKP_Silk_LTP_analysis_filter_FIX( LPC_in_pre, psEnc->x_buf + psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder,
+ psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );
+
+ } else {
+ /************/
+ /* UNVOICED */
+ /************/
+ /* Create signal with prepended subframes, scaled by inverse gains */
+ x_ptr = psEnc->x_buf + psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder;
+ x_pre_ptr = LPC_in_pre;
+ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {
+ SKP_Silk_scale_copy_vector16( x_pre_ptr, x_ptr, invGains_Q16[ i ],
+ psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder );
+ x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder;
+ x_ptr += psEnc->sCmn.subfr_length;
+ }
+
+ SKP_memset( psEncCtrl->LTPCoef_Q14, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( SKP_int16 ) );
+ psEncCtrl->LTPredCodGain_Q7 = 0;
+ }
+
+ /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */
+ TIC(FIND_LPC)
+ SKP_Silk_find_LPC_FIX( NLSF_Q15, &psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq_Q15,
+ psEnc->sCmn.useInterpolatedNLSFs * ( 1 - psEnc->sCmn.first_frame_after_reset ), psEnc->sCmn.predictLPCOrder,
+ LPC_in_pre, psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder, psEnc->sCmn.nb_subfr );
+ TOC(FIND_LPC)
+
+#ifdef SAVE_ALL_INTERNAL_DATA /* Save unquantized LPC's */
+ if( psEnc->sCmn.useInterpolatedNLSFs == 0 ) {
+ /* Convert back to filter representation */
+ SKP_Silk_NLSF2A_stable( uq_PredCoef_Q12[ 0 ], NLSF_Q15, psEnc->sCmn.predictLPCOrder );
+ SKP_memcpy( uq_PredCoef_Q12[ 1 ], uq_PredCoef_Q12[ 0 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_int16 ) );
+ } else { /* i.e. if( psEnc->useInterpolatedLSFs != 0 ) */
+ SKP_int iNLSF_Q15[ MAX_LPC_ORDER ];
+
+ /* Update interpolated LSF0 coefficients taking quantization of LSF1 coefficients into account */
+ SKP_Silk_interpolate( iNLSF_Q15, psEnc->sPred.prev_NLSFq_Q15, NLSF_Q15,
+ psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );
+
+ /* Convert back to filter representation */
+ SKP_Silk_NLSF2A_stable( uq_PredCoef_Q12[ 0 ], iNLSF_Q15, psEnc->sCmn.predictLPCOrder );
+
+ /* Convert back to filter representation */
+ SKP_Silk_NLSF2A_stable( uq_PredCoef_Q12[ 1 ], NLSF_Q15, psEnc->sCmn.predictLPCOrder );
+ }
+
+ /* Convert to FLP */
+ for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {
+ uq_PredCoef[ 0 ][ i ] = (SKP_float)uq_PredCoef_Q12[ 0 ][ i ] / 4096.0f;
+ uq_PredCoef[ 1 ][ i ] = (SKP_float)uq_PredCoef_Q12[ 1 ][ i ] / 4096.0f;
+ }
+#endif
+
+ /* Quantize LSFs */
+ TIC(PROCESS_LSFS)
+ SKP_Silk_process_NLSFs_FIX( psEnc, psEncCtrl, NLSF_Q15 );
+ TOC(PROCESS_LSFS)
+
+ /* Calculate residual energy using quantized LPC coefficients */
+ SKP_Silk_residual_energy_FIX( psEncCtrl->ResNrg, psEncCtrl->ResNrgQ, LPC_in_pre, psEncCtrl->PredCoef_Q12, local_gains,
+ psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );
+
+ /* Copy to prediction struct for use in next frame for fluctuation reduction */
+ SKP_memcpy( psEnc->sPred.prev_NLSFq_Q15, NLSF_Q15, psEnc->sCmn.predictLPCOrder * sizeof( SKP_int ) );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ {
+ SKP_int j, k;
+ SKP_float in_nrg, *in_ptr;
+ SKP_float LPC_res_nrg, qLPC_res_nrg, LTP_res_nrg, qLTP_res_nrg;
+ SKP_float LPC_predCodGain, QLPC_predCodGain, QLTP_predCodGain, LTPredCodGain, predCodGain;
+ SKP_float LPC_res[ MAX_FRAME_LENGTH << 1 ], LTP_res[ MAX_FRAME_LENGTH ];
+ SKP_float SF_resNrg[ MAX_NB_SUBFR ];
+
+ SKP_float x_flp[ 2 * MAX_FRAME_LENGTH ];
+ SKP_float Wght[ MAX_NB_SUBFR ];
+ SKP_float PredCoef[ 2 ][ MAX_LPC_ORDER ];
+ SKP_float LTPCoef[ MAX_NB_SUBFR * LTP_ORDER ];
+
+ /* Convert various FIX data to FLP */
+ SKP_short2float_array( x_flp, psEnc->x_buf, psEnc->sCmn.ltp_mem_length + psEnc->sCmn.frame_length );
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ Wght[ k ] = ( (SKP_float)Wght_Q15[ k ] / 32768.0f );
+ }
+ for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {
+ PredCoef[ 0 ][ i ] = (SKP_float)psEncCtrl->PredCoef_Q12[ 0 ][ i ] / 4096.0f;
+ PredCoef[ 1 ][ i ] = (SKP_float)psEncCtrl->PredCoef_Q12[ 1 ][ i ] / 4096.0f;
+ }
+ for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) {
+ LTPCoef[ i ] = (SKP_float)psEncCtrl->LTPCoef_Q14[ i ] / 16384.0f;
+ }
+
+ /* Weighted input energy */
+ in_ptr = &x_flp[ psEnc->sCmn.ltp_mem_length ];
+ DEBUG_STORE_DATA( x_flp.dat, x_flp, psEnc->sCmn.frame_length * sizeof(SKP_float));
+ DEBUG_STORE_DATA( in_ptr.dat, in_ptr, psEnc->sCmn.frame_length * sizeof(SKP_float));
+ in_nrg = 0.0f;
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ in_nrg += (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length ) * Wght[ k ];
+ in_ptr += psEnc->sCmn.subfr_length;
+ }
+
+ if( psEnc->sCmn.useInterpolatedNLSFs == 0 ) {
+ SKP_memcpy( PredCoef[ 0 ], PredCoef[ 1 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );
+ }
+
+ DEBUG_STORE_DATA( uq_PredCoef.dat, uq_PredCoef[0], psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( PredCoef.dat, PredCoef[0], psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );
+
+ LPC_res_nrg = 0.0f;
+ LTP_res_nrg = 0.0f;
+ qLPC_res_nrg = 0.0f;
+ qLTP_res_nrg = 0.0f;
+ for( j = 0; j < psEnc->sCmn.nb_subfr; j+=2 ) {
+ /* Calculate LPC residual with unquantized LPC */
+ SKP_Silk_LPC_analysis_filter_FLP( LPC_res, uq_PredCoef[ j >> 1 ], &x_flp[ j * psEnc->sCmn.subfr_length ],
+ ( psEnc->sCmn.ltp_mem_length + ( psEnc->sCmn.subfr_length << 1 ) ), psEnc->sCmn.predictLPCOrder );
+
+ /* Weighted energy */
+ in_ptr = &LPC_res[ psEnc->sCmn.ltp_mem_length ];
+ for( k = 0; k < 2; k++ ) {
+ LPC_res_nrg += (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length ) * Wght[ j + k ];
+ in_ptr += psEnc->sCmn.subfr_length;
+ }
+
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Calculate LTP residual with unquantized LTP and unquantized LPC */
+ SKP_Silk_LTP_ana_core( LPC_res, LTP_res, &psEncCtrl->sCmn.pitchL[ j ],
+ &uq_LTPCoef[ j * LTP_ORDER ], psEnc->sCmn.subfr_length, psEnc->sCmn.ltp_mem_length );
+
+ /* Weighted energy */
+ in_ptr = LTP_res;
+ for( k = 0; k < 2; k++ ) {
+ LTP_res_nrg += (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length ) * Wght[ j + k ];
+ in_ptr += psEnc->sCmn.subfr_length;
+ }
+ }
+
+ /* Calculate LPC residual with quantized LPC */
+ SKP_Silk_LPC_analysis_filter_FLP( LPC_res, PredCoef[ j >> 1 ], &x_flp[ j * psEnc->sCmn.subfr_length ],
+ ( psEnc->sCmn.ltp_mem_length + ( psEnc->sCmn.subfr_length << 1 ) ), psEnc->sCmn.predictLPCOrder );
+
+ /* Weighted energy */
+ in_ptr = &LPC_res[ psEnc->sCmn.ltp_mem_length ];
+ for( k = 0; k < 2; k++ ) {
+ SF_resNrg[ k + j ] = (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length );
+ qLPC_res_nrg += SF_resNrg[ k + j ] * Wght[ j + k ];
+ in_ptr += psEnc->sCmn.subfr_length;
+ }
+
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Calculate LTP residual with unquantized LTP and unquantized LPC */
+ SKP_Silk_LTP_ana_core( LPC_res, LTP_res, &psEncCtrl->sCmn.pitchL[ j ],
+ <PCoef[ j * LTP_ORDER ], psEnc->sCmn.subfr_length, psEnc->sCmn.ltp_mem_length );
+
+ /* Weighted energy */
+ in_ptr = LTP_res;
+ for( k = 0; k < 2; k++ ) {
+ SF_resNrg[ k + j ] = (SKP_float)SKP_Silk_energy_FLP( in_ptr, psEnc->sCmn.subfr_length );
+ qLTP_res_nrg += SF_resNrg[ k + j ] * Wght[ j + k ];
+ in_ptr += psEnc->sCmn.subfr_length;
+ }
+ } else {
+ SKP_memcpy( LTP_res, &LPC_res[ psEnc->sCmn.ltp_mem_length ], ( psEnc->sCmn.subfr_length << 1 ) * sizeof( SKP_float ) );
+ }
+ /* Save residual */
+ DEBUG_STORE_DATA( LPC_res.dat, &LPC_res[ psEnc->sCmn.ltp_mem_length ], (psEnc->sCmn.subfr_length << 1) * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( res.dat, LTP_res, ( psEnc->sCmn.subfr_length << 1 ) * sizeof( SKP_float ) );
+ }
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ LPC_predCodGain = 3.0f * SKP_Silk_log2( in_nrg / LPC_res_nrg );
+ QLPC_predCodGain = 3.0f * SKP_Silk_log2( in_nrg / qLPC_res_nrg );
+ LTPredCodGain = 3.0f * SKP_Silk_log2( LPC_res_nrg / LTP_res_nrg );
+ QLTP_predCodGain = 3.0f * SKP_Silk_log2( qLPC_res_nrg / qLTP_res_nrg );
+ } else {
+ LPC_predCodGain = 3.0f * SKP_Silk_log2( in_nrg / LPC_res_nrg );
+ QLPC_predCodGain = 3.0f * SKP_Silk_log2( in_nrg / qLPC_res_nrg );
+ LTPredCodGain = 0.0f;
+ QLTP_predCodGain = 0.0f;
+ }
+ predCodGain = QLPC_predCodGain + QLTP_predCodGain;
+
+ DEBUG_STORE_DATA( LTPredCodGain.dat, <PredCodGain, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( QLTP_predCodGain.dat, &QLTP_predCodGain, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( LPC_predCodGain.dat, &LPC_predCodGain, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( QLPC_predCodGain.dat, &QLPC_predCodGain, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( predCodGain.dat, &predCodGain, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( ResNrg.dat, SF_resNrg, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );
+ }
+#endif
+}
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+/****************************************************/
+/* LTP analysis filter. Filters two subframes */
+/****************************************************/
+void SKP_Silk_LTP_ana_core(
+ SKP_float r_LPC[], /* I LPC residual */
+ SKP_float r_LTP[], /* O LTP residual */
+ const SKP_int pitchL[], /* I pitch lags */
+ const SKP_float LTPCoef[], /* I LTP Coeficients */
+ SKP_int subfr_length, /* I smpls in one sub frame */
+ SKP_int LTP_mem_length /* I Length of LTP state of input */
+)
+{
+ SKP_int k, i;
+ SKP_float LTP_pred;
+ const SKP_float *r, *b_ptr, *lag_ptr;
+
+ r = &r_LPC[ LTP_mem_length ];
+ b_ptr = LTPCoef;
+ for( k = 0; k < (MAX_NB_SUBFR >> 1); k++ ) {
+ lag_ptr = r - pitchL[k];
+ /* LTP analysis FIR filter */
+ for( i = 0; i < subfr_length; i++ ) {
+ /* long-term prediction */
+ LTP_pred = lag_ptr[LTP_ORDER/2] * b_ptr[0];
+ LTP_pred += lag_ptr[LTP_ORDER/2 - 1] * b_ptr[1];
+ LTP_pred += lag_ptr[LTP_ORDER/2 - 2] * b_ptr[2];
+ LTP_pred += lag_ptr[LTP_ORDER/2 - 3] * b_ptr[3];
+ LTP_pred += lag_ptr[LTP_ORDER/2 - 4] * b_ptr[4];
+
+ /* subtract prediction */
+ r_LTP[i] = r[i] - LTP_pred;
+ lag_ptr++;
+ }
+ r += subfr_length;
+ r_LTP += subfr_length;
+ b_ptr += LTP_ORDER;
+ }
+}
+
+/*******************************************/
+/* LPC analysis filter */
+/* NB! State is kept internally and the */
+/* filter always starts with zero state */
+/* first Order output samples are not set */
+/*******************************************/
+void SKP_Silk_LPC_analysis_filter_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coeficicnts */
+ const SKP_float s[], /* I Input Signal */
+ SKP_int length, /* I length of signal */
+ SKP_int Order /* I LPC order */
+)
+{
+ SKP_int i, j;
+ SKP_float LPC_pred;
+ const SKP_float *s_ptr;
+
+ for ( i = Order; i < length; i++ ) {
+ s_ptr = &s[i - 1];
+
+ LPC_pred = 0;
+ /* short-term prediction */
+ for( j = 0; j < Order; j++ ) {
+ LPC_pred += s_ptr[ -j ] * PredCoef[ j ];
+ }
+
+ /* prediction error */
+ r_LPC[ i ] = s_ptr[ 1 ] - LPC_pred;
+ }
+}
+
+/* sum of squares of a SKP_float array, with result as double */
+double SKP_Silk_energy_FLP(
+ const SKP_float *data,
+ SKP_int dataSize
+)
+{
+ SKP_int i, dataSize4;
+ double result;
+
+ /* 4x unrolled loop */
+ result = 0.0f;
+ dataSize4 = dataSize & 0xFFFC;
+ for( i = 0; i < dataSize4; i += 4 ) {
+ result += data[ i + 0 ] * data[ i + 0 ] +
+ data[ i + 1 ] * data[ i + 1 ] +
+ data[ i + 2 ] * data[ i + 2 ] +
+ data[ i + 3 ] * data[ i + 3 ];
+ }
+
+ /* add any remaining products */
+ for( ; i < dataSize; i++ ) {
+ result += data[ i ] * data[ i ];
+ }
+
+ SKP_assert( result >= 0.0 );
+ return result;
+}
+
+/* integer to floating-point conversion */
+SKP_INLINE void SKP_short2float_array(
+ SKP_float *out,
+ const SKP_int16 *in,
+ SKP_int32 length
+)
+{
+ SKP_int32 k;
+ for (k = length-1; k >= 0; k--) {
+ out[k] = (SKP_float)in[k];
+ }
+}
+
+#endif
--- /dev/null
+++ b/src_FIX/SKP_Silk_init_encoder_FIX.c
@@ -1,0 +1,61 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/*********************************/
+/* Initialize Silk Encoder state */
+/*********************************/
+SKP_int SKP_Silk_init_encoder_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk encoder state */
+) {
+ SKP_int ret = 0;
+ /* Clear the entire encoder state */
+ SKP_memset( psEnc, 0, sizeof( SKP_Silk_encoder_state_FIX ) );
+
+ /* Initialize to 24 kHz API sampling, 24 kHz max internal sampling, 20 ms packets, 25 kbps, 0% packet loss, and init non-zero values */
+ ret = SKP_Silk_control_encoder_FIX( psEnc, 24000, 24, 20, 25, 0, 0, 0, 10, 0 );
+
+#if HIGH_PASS_INPUT
+ psEnc->variable_HP_smth1_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */
+ psEnc->variable_HP_smth2_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */
+#endif
+
+ /* Used to deactivate e.g. LSF interpolation and fluctuation reduction */
+ psEnc->sCmn.first_frame_after_reset = 1;
+ psEnc->sCmn.fs_kHz_changed = 0;
+ psEnc->sCmn.LBRR_enabled = 0;
+
+ /* Initialize Silk VAD */
+ ret += SKP_Silk_VAD_Init( &psEnc->sCmn.sVAD );
+
+ /* Initialize NSQ */
+ psEnc->sNSQ.prev_inv_gain_Q16 = 65536;
+ psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536;
+
+ return( ret );
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_main_FIX.h
@@ -1,0 +1,336 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_MAIN_FIX_H
+#define SKP_SILK_MAIN_FIX_H
+
+#include <stdlib.h>
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_structs_FIX.h"
+#include "SKP_Silk_main.h"
+#include "SKP_Silk_define_FIX.h"
+#include "SKP_Silk_PLC.h"
+#include "SKP_debug.h"
+#include "entenc.h"
+
+#ifndef FORCE_CPP_BUILD
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+#endif
+
+/*********************/
+/* Encoder Functions */
+/*********************/
+
+/* Initializes the Silk encoder state */
+SKP_int SKP_Silk_init_encoder_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */
+);
+
+/* Control the Silk encoder */
+SKP_int SKP_Silk_control_encoder_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */
+ const SKP_int32 API_fs_Hz, /* I External (API) sampling rate (Hz) */
+ const SKP_int max_internal_fs_kHz,/* I Maximum internal sampling rate (kHz) */
+ const SKP_int PacketSize_ms, /* I Packet length (ms) */
+ SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) (used if SNR_dB == 0) */
+ const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */
+ const SKP_int INBandFEC_enabled, /* I Enable (1) / disable (0) inband FEC */
+ const SKP_int DTX_enabled, /* I Enable / disable DTX */
+ const SKP_int InputFramesize_ms, /* I Inputframe in ms */
+ const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */
+);
+
+/* Encoder main function */
+SKP_int SKP_Silk_encode_frame_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */
+ SKP_uint8 *pCode, /* O Pointer to payload */
+ SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes; */
+ /* input: max length; output: used */
+ const SKP_int16 *pIn /* I Pointer to input speech frame */
+);
+
+/* Low BitRate Redundancy encoding functionality. Reuse all parameters but encode with lower bitrate */
+void SKP_Silk_LBRR_encode_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */
+ SKP_uint8 *pCode, /* O Pointer to payload */
+ SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */
+ SKP_int16 xfw[] /* I Input signal */
+);
+
+/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */
+void SKP_Silk_HP_variable_cutoff_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */
+ SKP_int16 *out, /* O high-pass filtered output signal */
+ const SKP_int16 *in /* I input signal */
+);
+
+/****************/
+/* Prefiltering */
+/****************/
+void SKP_Silk_prefilter_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */
+ const SKP_Silk_encoder_control_FIX *psEncCtrl, /* I Encoder control */
+ SKP_int16 xw[], /* O Weighted signal */
+ const SKP_int16 x[] /* I Speech signal */
+);
+
+/**************************************************************/
+/* Compute noise shaping coefficients and initial gain values */
+/**************************************************************/
+void SKP_Silk_noise_shape_analysis_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */
+ const SKP_int16 *pitch_res, /* I LPC residual from pitch analysis */
+ const SKP_int16 *x /* I Input signal [ frame_length + la_shape ] */
+);
+
+/* Autocorrelations for a warped frequency axis */
+void SKP_Silk_warped_autocorrelation_FIX(
+ SKP_int32 *corr, /* O Result [order + 1] */
+ SKP_int *scale, /* O Scaling of the correlation vector */
+ const SKP_int16 *input, /* I Input data to correlate */
+ const SKP_int16 warping_Q16, /* I Warping coefficient */
+ const SKP_int length, /* I Length of input */
+ const SKP_int order /* I Correlation order (even) */
+);
+
+/* Processing of gains */
+void SKP_Silk_process_gains_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control */
+);
+
+/* Control low bitrate redundancy usage */
+void SKP_Silk_LBRR_ctrl_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */
+);
+
+/* Calculation of LTP state scaling */
+void SKP_Silk_LTP_scale_ctrl_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */
+);
+
+/**********************************************/
+/* Prediction Analysis */
+/**********************************************/
+
+/* Find pitch lags */
+void SKP_Silk_find_pitch_lags_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
+ SKP_int16 res[], /* O residual */
+ const SKP_int16 x[] /* I Speech signal */
+);
+
+void SKP_Silk_find_pred_coefs_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
+ const SKP_int16 res_pitch[] /* I Residual from pitch analysis */
+);
+
+void SKP_Silk_find_LPC_FIX(
+ SKP_int NLSF_Q15[], /* O NLSFs */
+ SKP_int *interpIndex, /* O NLSF interpolation index, only used for NLSF interpolation */
+ const SKP_int prev_NLSFq_Q15[], /* I previous NLSFs, only used for NLSF interpolation */
+ const SKP_int useInterpolatedNLSFs, /* I Flag */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_int16 x[], /* I Input signal */
+ const SKP_int subfr_length, /* I Input signal subframe length including preceeding samples */
+ const SKP_int nb_subfr /* I: Number of subframes */
+);
+
+void SKP_Silk_LTP_analysis_filter_FIX(
+ SKP_int16 *LTP_res, /* O: LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */
+ const SKP_int16 *x, /* I: Pointer to input signal with at least max( pitchL ) preceeding samples */
+ const SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I: LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */
+ const SKP_int pitchL[ MAX_NB_SUBFR ], /* I: Pitch lag, one for each subframe */
+ const SKP_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I: Inverse quantization gains, one for each subframe */
+ const SKP_int subfr_length, /* I: Length of each subframe */
+ const SKP_int nb_subfr, /* I: Number of subframes */
+ const SKP_int pre_length /* I: Length of the preceeding samples starting at &x[0] for each subframe */
+);
+
+/* Finds LTP vector from correlations */
+void SKP_Silk_find_LTP_FIX(
+ SKP_int16 b_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */
+ SKP_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */
+ SKP_int *LTPredCodGain_Q7, /* O LTP coding gain */
+ const SKP_int16 r_lpc[], /* I residual signal after LPC signal + state for first 10 ms */
+ const SKP_int lag[ MAX_NB_SUBFR ], /* I LTP lags */
+ const SKP_int32 Wght_Q15[ MAX_NB_SUBFR ], /* I weights */
+ const SKP_int subfr_length, /* I subframe length */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int mem_offset, /* I number of samples in LTP memory */
+ SKP_int corr_rshifts[ MAX_NB_SUBFR ] /* O right shifts applied to correlations */
+);
+
+/* LTP tap quantizer */
+void SKP_Silk_quant_LTP_gains_FIX(
+ SKP_int16 B_Q14[], /* I/O (un)quantized LTP gains */
+ SKP_int cbk_index[], /* O Codebook Index */
+ SKP_int *periodicity_index, /* O Periodicity Index */
+ const SKP_int32 W_Q18[], /* I Error Weights in Q18 */
+ SKP_int mu_Q8, /* I Mu value (R/D tradeoff) */
+ SKP_int lowComplexity, /* I Flag for low complexity */
+ const SKP_int nb_subfr /* I number of subframes */
+);
+
+/******************/
+/* NLSF Quantizer */
+/******************/
+
+/* Limit, stabilize, convert and quantize NLSFs. */
+void SKP_Silk_process_NLSFs_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */
+ SKP_int *pNLSF_Q15 /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */
+);
+
+/* LSF vector encoder */
+void SKP_Silk_NLSF_MSVQ_encode_FIX(
+ SKP_int *NLSFIndices, /* O Codebook path vector [ CB_STAGES ] */
+ SKP_int *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */
+ const SKP_int *pNLSF_q_Q15_prev, /* I Prev. quantized NLSF vector [LPC_ORDER] */
+ const SKP_int *pW_Q6, /* I NLSF weight vector [ LPC_ORDER ] */
+ const SKP_int NLSF_mu_Q15, /* I Rate weight for the RD optimization */
+ const SKP_int NLSF_mu_fluc_red_Q16, /* I Fluctuation reduction error weight */
+ const SKP_int NLSF_MSVQ_Survivors, /* I Max survivors from each stage */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_int deactivate_fluc_red /* I Deactivate fluctuation reduction */
+);
+
+/* Rate-Distortion calculations for multiple input data vectors */
+void SKP_Silk_NLSF_VQ_rate_distortion_FIX(
+ SKP_int32 *pRD_Q20, /* O Rate-distortion values [psNLSF_CBS->nVectors*N] */
+ const SKP_Silk_NLSF_CBS *psNLSF_CBS, /* I NLSF codebook stage struct */
+ const SKP_int *in_Q15, /* I Input vectors to be quantized */
+ const SKP_int *w_Q6, /* I Weight vector */
+ const SKP_int32 *rate_acc_Q5, /* I Accumulated rates from previous stage */
+ const SKP_int mu_Q15, /* I Weight between weighted error and rate */
+ const SKP_int N, /* I Number of input vectors to be quantized */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+/* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */
+void SKP_Silk_NLSF_VQ_sum_error_FIX(
+ SKP_int32 *err_Q20, /* O Weighted quantization errors [N*K] */
+ const SKP_int *in_Q15, /* I Input vectors to be quantized [N*LPC_order] */
+ const SKP_int *w_Q6, /* I Weighting vectors [N*LPC_order] */
+ const SKP_int16 *pCB_Q15, /* I Codebook vectors [K*LPC_order] */
+ const SKP_int N, /* I Number of input vectors */
+ const SKP_int K, /* I Number of codebook vectors */
+ const SKP_int LPC_order /* I Number of LPCs */
+);
+
+/* Entropy constrained MATRIX-weighted VQ, for a single input data vector */
+void SKP_Silk_VQ_WMat_EC_FIX(
+ SKP_int *ind, /* O index of best codebook vector */
+ SKP_int32 *rate_dist_Q14, /* O best weighted quantization error + mu * rate*/
+ const SKP_int16 *in_Q14, /* I input vector to be quantized */
+ const SKP_int32 *W_Q18, /* I weighting matrix */
+ const SKP_int16 *cb_Q14, /* I codebook */
+ const SKP_int16 *cl_Q6, /* I code length for each codebook vector */
+ const SKP_int mu_Q8, /* I tradeoff between weighted error and rate */
+ SKP_int L /* I number of vectors in codebook */
+);
+
+/******************/
+/* Linear Algebra */
+/******************/
+
+/* Calculates correlation matrix X'*X */
+void SKP_Silk_corrMatrix_FIX(
+ const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
+ const SKP_int L, /* I Length of vectors */
+ const SKP_int order, /* I Max lag for correlation */
+ SKP_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ]*/
+ SKP_int *rshifts /* I/O Right shifts of correlations */
+);
+
+/* Calculates correlation vector X'*t */
+void SKP_Silk_corrVector_FIX(
+ const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
+ const SKP_int16 *t, /* I Target vector [L] */
+ const SKP_int L, /* I Length of vectors */
+ const SKP_int order, /* I Max lag for correlation */
+ SKP_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */
+ const SKP_int rshifts /* I Right shifts of correlations */
+);
+
+/* Add noise to matrix diagonal */
+void SKP_Silk_regularize_correlations_FIX(
+ SKP_int32 *XX, /* I/O Correlation matrices */
+ SKP_int32 *xx, /* I/O Correlation values */
+ SKP_int32 noise, /* I Noise to add */
+ SKP_int D /* I Dimension of XX */
+);
+
+/* Solves Ax = b, assuming A is symmetric */
+void SKP_Silk_solve_LDL_FIX(
+ SKP_int32 *A, /* I Pointer to symetric square matrix A */
+ SKP_int M, /* I Size of matrix */
+ const SKP_int32 *b, /* I Pointer to b vector */
+ SKP_int32 *x_Q16 /* O Pointer to x solution vector */
+);
+
+/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */
+SKP_int32 SKP_Silk_residual_energy16_covar_FIX(
+ const SKP_int16 *c, /* I Prediction vector */
+ const SKP_int32 *wXX, /* I Correlation matrix */
+ const SKP_int32 *wXx, /* I Correlation vector */
+ SKP_int32 wxx, /* I Signal energy */
+ SKP_int D, /* I Dimension */
+ SKP_int cQ /* I Q value for c vector 0 - 15 */
+);
+
+/* Calculates residual energies of input subframes where all subframes have LPC_order */
+/* of preceeding samples */
+void SKP_Silk_residual_energy_FIX(
+ SKP_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */
+ SKP_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */
+ const SKP_int16 x[], /* I Input signal */
+ const SKP_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */
+ const SKP_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */
+ const SKP_int subfr_length, /* I Subframe length */
+ const SKP_int nb_subfr, /* I Number of subframes */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+#ifndef FORCE_CPP_BUILD
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* FORCE_CPP_BUILD */
+#endif /* SKP_SILK_MAIN_FIX_H */
--- /dev/null
+++ b/src_FIX/SKP_Silk_noise_shape_analysis_FIX.c
@@ -1,0 +1,451 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+#include "SKP_Silk_perceptual_parameters_FIX.h"
+
+/* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */
+/* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */
+SKP_INLINE SKP_int32 warped_gain( // gain in Q16
+ const SKP_int32 *coefs_Q24,
+ SKP_int lambda_Q16,
+ SKP_int order
+) {
+ SKP_int i;
+ SKP_int32 gain_Q24;
+
+ lambda_Q16 = -lambda_Q16;
+ gain_Q24 = coefs_Q24[ order - 1 ];
+ for( i = order - 2; i >= 0; i-- ) {
+ gain_Q24 = SKP_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 );
+ }
+ gain_Q24 = SKP_SMLAWB( 1 << 24, gain_Q24, -lambda_Q16 );
+ return SKP_INVERSE32_varQ( gain_Q24, 40 );
+}
+
+/* Convert warped filter coefficients to monic pseudo-warped coefficients */
+SKP_INLINE void warped_true2monic_coefs(
+ SKP_int32 *coefs_Q24,
+ SKP_int lambda_Q16,
+ SKP_int order
+) {
+ SKP_int i;
+ SKP_int32 gain_Q16, nom_Q16, den_Q24;
+
+ lambda_Q16 = -lambda_Q16;
+ for( i = order - 1; i > 0; i-- ) {
+ coefs_Q24[ i - 1 ] = SKP_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 );
+ }
+ nom_Q16 = SKP_SMLAWB( 1 << 16, lambda_Q16, -lambda_Q16 );
+ den_Q24 = SKP_SMLAWB( 1 << 24, coefs_Q24[ 0 ], -lambda_Q16 );
+ gain_Q16 = SKP_DIV32_varQ( nom_Q16, den_Q24, 24 );
+ for( i = 0; i < order; i++ ) {
+ coefs_Q24[ i ] = SKP_SMULWW( gain_Q16, coefs_Q24[ i ] );
+ }
+}
+
+/* Limit max amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */
+SKP_INLINE void limit_warped_coefs(
+ SKP_int32 *coefs_syn_Q24,
+ SKP_int32 *coefs_ana_Q24,
+ SKP_int lambda_Q16,
+ SKP_int32 limit_Q24,
+ SKP_int order
+) {
+ SKP_int i, iter, ind;
+ SKP_int32 tmp, maxabs_Q24, chirp_Q16;
+
+ for( iter = 0; iter < 10; iter++ ) {
+ /* Find maximum absolute value */
+ ind = 1;
+ maxabs_Q24 = SKP_abs( coefs_syn_Q24[ ind ] );
+ for( i = 2; i < order - 1; i++ ) {
+ tmp = SKP_abs( coefs_syn_Q24[ i ] );
+ if( tmp > maxabs_Q24 ) {
+ maxabs_Q24 = tmp;
+ ind = i;
+ }
+ }
+ if( maxabs_Q24 <= limit_Q24 ) {
+ return;
+ }
+
+ /* Convert to true warped coefficients */
+ for( i = 1; i < order; i++ ) {
+ coefs_syn_Q24[ i - 1 ] = SKP_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 );
+ coefs_ana_Q24[ i - 1 ] = SKP_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 );
+ }
+
+ /* Apply bandwidth expansion */
+ chirp_Q16 = SKP_FIX_CONST( 0.99, 16 ) - SKP_DIV32_varQ(
+ SKP_SMULWB( maxabs_Q24 - limit_Q24, SKP_SMLABB( SKP_FIX_CONST( 0.8, 10 ), SKP_FIX_CONST( 0.1, 10 ), iter ) ),
+ SKP_MUL( maxabs_Q24, ind + 1 ), 22 );
+ SKP_Silk_bwexpander_32( coefs_syn_Q24, order, chirp_Q16 );
+ SKP_Silk_bwexpander_32( coefs_ana_Q24, order, chirp_Q16 );
+
+ /* Convert back to monic warped coefficients */
+ lambda_Q16 = -lambda_Q16;
+ for( i = order - 1; i > 0; i-- ) {
+ coefs_syn_Q24[ i - 1 ] = SKP_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 );
+ coefs_ana_Q24[ i - 1 ] = SKP_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 );
+ }
+ lambda_Q16 = -lambda_Q16;
+ }
+}
+
+/**************************************************************/
+/* Compute noise shaping coefficients and initial gain values */
+/**************************************************************/
+void SKP_Silk_noise_shape_analysis_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */
+ const SKP_int16 *pitch_res, /* I LPC residual from pitch analysis */
+ const SKP_int16 *x /* I Input signal [ frame_length + la_shape ] */
+)
+{
+ SKP_Silk_shape_state_FIX *psShapeSt = &psEnc->sShape;
+ SKP_int k, i, nSamples, Qnrg, b_Q14, scale = 0, sz;
+ SKP_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp32;
+ SKP_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7;
+ SKP_int32 delta_Q16, BWExp1_Q16, BWExp2_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8;
+ SKP_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ];
+ SKP_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ];
+ SKP_int32 AR1_Q24[ MAX_SHAPE_LPC_ORDER ];
+ SKP_int32 AR2_Q24[ MAX_SHAPE_LPC_ORDER ];
+ SKP_int16 x_windowed[ SHAPE_LPC_WIN_MAX ];
+ const SKP_int16 *x_ptr, *pitch_res_ptr;
+
+ SKP_int32 sqrt_nrg[ MAX_NB_SUBFR ], Qnrg_vec[ MAX_NB_SUBFR ];
+
+ /* Point to start of first LPC analysis block */
+ x_ptr = x + psEnc->sCmn.la_shape - SKP_SMULBB( SHAPE_LPC_WIN_MS, psEnc->sCmn.fs_kHz ) + psEnc->sCmn.subfr_length;
+
+ /****************/
+ /* CONTROL SNR */
+ /****************/
+#if DEACTIVATE_SNR_FEEDBACK
+ psEncCtrl->current_SNR_dB_Q7 = psEnc->SNR_dB_Q7;
+#else
+ /* Reduce SNR_dB values if recent bitstream has exceeded TargetRate */
+ psEncCtrl->current_SNR_dB_Q7 = psEnc->SNR_dB_Q7 - SKP_SMULWB( SKP_LSHIFT( ( SKP_int32 )psEnc->BufferedInChannel_ms, 7 ), 3277 );
+#endif
+
+ /* Reduce SNR_dB if inband FEC used */
+ if( psEnc->speech_activity_Q8 > LBRR_SPEECH_ACTIVITY_THRES_Q8 ) {
+ psEncCtrl->current_SNR_dB_Q7 -= SKP_RSHIFT( psEnc->inBandFEC_SNR_comp_Q8, 1 );
+ }
+
+ /****************/
+ /* GAIN CONTROL */
+ /****************/
+ /* Input quality is the average of the quality in the lowest two VAD bands */
+ psEncCtrl->input_quality_Q14 = ( SKP_int )SKP_RSHIFT( ( SKP_int32 )psEncCtrl->input_quality_bands_Q15[ 0 ]
+ + psEncCtrl->input_quality_bands_Q15[ 1 ], 2 );
+
+ /* Coding quality level, between 0.0_Q0 and 1.0_Q0, but in Q14 */
+ psEncCtrl->coding_quality_Q14 = SKP_RSHIFT( SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( psEncCtrl->current_SNR_dB_Q7 - ( 17 << 7 ), 4 ) ), 1 );
+
+ /* Reduce coding SNR during low speech activity */
+ b_Q8 = ( 1 << 8 ) - psEnc->speech_activity_Q8;
+ b_Q8 = SKP_SMULWB( SKP_LSHIFT( b_Q8, 8 ), b_Q8 );
+ SNR_adj_dB_Q7 = SKP_SMLAWB( psEncCtrl->current_SNR_dB_Q7,
+ SKP_SMULBB( -BG_SNR_DECR_dB_Q7 >> ( 4 + 1 ), b_Q8 ), // Q11
+ SKP_SMULWB( ( 1 << 14 ) + psEncCtrl->input_quality_Q14, psEncCtrl->coding_quality_Q14 ) ); // Q12
+
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Reduce gains for periodic signals */
+ SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, HARM_SNR_INCR_dB_Q7 << 1, psEnc->LTPCorr_Q15 );
+ } else {
+ /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */
+ SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7,
+ SKP_SMLAWB( 6 << ( 7 + 2 ), -104856, psEncCtrl->current_SNR_dB_Q7 ), //-104856_Q18 = -0.4_Q0, Q9
+ ( 1 << 14 ) - psEncCtrl->input_quality_Q14 ); // Q14
+ }
+
+ /*************************/
+ /* SPARSENESS PROCESSING */
+ /*************************/
+ /* Set quantizer offset */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Initally set to 0; may be overruled in process_gains(..) */
+ psEncCtrl->sCmn.QuantOffsetType = 0;
+ psEncCtrl->sparseness_Q8 = 0;
+ } else {
+ /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */
+ nSamples = SKP_LSHIFT( psEnc->sCmn.fs_kHz, 1 );
+ energy_variation_Q7 = 0;
+ log_energy_prev_Q7 = 0;
+ pitch_res_ptr = pitch_res;
+ for( k = 0; k < SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; k++ ) {
+ SKP_Silk_sum_sqr_shift( &nrg, &scale, pitch_res_ptr, nSamples );
+ nrg += SKP_RSHIFT( nSamples, scale ); // Q(-scale)
+
+ log_energy_Q7 = SKP_Silk_lin2log( nrg );
+ if( k > 0 ) {
+ energy_variation_Q7 += SKP_abs( log_energy_Q7 - log_energy_prev_Q7 );
+ }
+ log_energy_prev_Q7 = log_energy_Q7;
+ pitch_res_ptr += nSamples;
+ }
+
+ psEncCtrl->sparseness_Q8 = SKP_RSHIFT( SKP_Silk_sigm_Q15( SKP_SMULWB( energy_variation_Q7 - ( 5 << 7 ), 6554 ) ), 7 ); // 6554_Q16 = 0.1_Q0
+
+ /* Set quantization offset depending on sparseness measure */
+ if( psEncCtrl->sparseness_Q8 > SPARSENESS_THRESHOLD_QNT_OFFSET_Q8 ) {
+ psEncCtrl->sCmn.QuantOffsetType = 0;
+ } else {
+ psEncCtrl->sCmn.QuantOffsetType = 1;
+ }
+
+ /* Increase coding SNR for sparse signals */
+ SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, SPARSE_SNR_INCR_dB_Q7 << 8, psEncCtrl->sparseness_Q8 - ( 1 << 7 ) );
+ }
+
+ /*******************************/
+ /* Control bandwidth expansion */
+ /*******************************/
+ delta_Q16 = SKP_SMULWB( ( 1 << 16 ) - SKP_SMULBB( 3, psEncCtrl->coding_quality_Q14 ), LOW_RATE_BANDWIDTH_EXPANSION_DELTA_Q16 );
+ BWExp1_Q16 = BANDWIDTH_EXPANSION_Q16 - delta_Q16;
+ BWExp2_Q16 = BANDWIDTH_EXPANSION_Q16 + delta_Q16;
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ /* Less bandwidth expansion for super wideband */
+ BWExp1_Q16 = ( 1 << 16 ) - SKP_SMULWB( SWB_BANDWIDTH_EXPANSION_REDUCTION_Q16, ( 1 << 16 ) - BWExp1_Q16 );
+ BWExp2_Q16 = ( 1 << 16 ) - SKP_SMULWB( SWB_BANDWIDTH_EXPANSION_REDUCTION_Q16, ( 1 << 16 ) - BWExp2_Q16 );
+ }
+ /* BWExp1 will be applied after BWExp2, so make it relative */
+ BWExp1_Q16 = SKP_DIV32_16( SKP_LSHIFT( BWExp1_Q16, 14 ), SKP_RSHIFT( BWExp2_Q16, 2 ) );
+
+ /* Warping coefficient */
+ psEncCtrl->sCmn.warping_Q16 = psEnc->sCmn.fs_kHz * WARPING_MULTIPLIER_Q16;
+ psEncCtrl->sCmn.warping_Q16 = SKP_min( psEncCtrl->sCmn.warping_Q16, 32767 );
+
+ /********************************************/
+ /* Compute noise shaping AR coefs and gains */
+ /********************************************/
+ sz = ( SKP_int )SKP_SMULBB( SHAPE_LPC_WIN_MS, psEnc->sCmn.fs_kHz );
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ /* Apply window */
+ SKP_Silk_apply_sine_window( x_windowed, x_ptr, 0, SHAPE_LPC_WIN_MS * psEnc->sCmn.fs_kHz );
+
+ /* Update pointer: next LPC analysis block */
+ x_ptr += psEnc->sCmn.subfr_length;
+
+ /* Calculate warped auto correlation */
+ SKP_Silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, psEncCtrl->sCmn.warping_Q16, sz, psEnc->sCmn.shapingLPCOrder );
+
+ /* Add white noise, as a fraction of energy */
+ auto_corr[0] = SKP_ADD32( auto_corr[0], SKP_max_32( SKP_SMULWB( SKP_RSHIFT( auto_corr[ 0 ], 4 ), SHAPE_WHITE_NOISE_FRACTION_Q20 ), 1 ) );
+
+ /* Calculate the reflection coefficients using schur */
+ nrg = SKP_Silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrder );
+ SKP_assert( nrg >= 0 );
+
+ /* Convert reflection coefficients to prediction coefficients */
+ SKP_Silk_k2a_Q16( AR2_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder );
+
+ /* Convert residual energy to non-warped scale */
+ gain_mult_Q16 = warped_gain( AR2_Q24, psEncCtrl->sCmn.warping_Q16, psEnc->sCmn.shapingLPCOrder );
+ gain_mult_Q16 = SKP_SMULWW( gain_mult_Q16, gain_mult_Q16 );
+ SKP_assert( gain_mult_Q16 >= 0 ); // If breaking, add dynamic scaling
+ nrg = SKP_SMULWW( nrg, gain_mult_Q16 );
+ SKP_assert( nrg >= 0 ); // If breaking, add dynamic scaling
+
+ /* Bandwidth expansion for synthesis filter shaping */
+ SKP_Silk_bwexpander_32( AR2_Q24, psEnc->sCmn.shapingLPCOrder, BWExp2_Q16 );
+
+ /* Compute noise shaping filter coefficients */
+ SKP_memcpy( AR1_Q24, AR2_Q24, psEnc->sCmn.shapingLPCOrder * sizeof( SKP_int32 ) );
+
+ /* Bandwidth expansion for analysis filter shaping */
+ SKP_assert( BWExp1_Q16 <= ( 1 << 16 ) ); // If ever breaking, use LPC_stabilize() in these cases to stay within range
+ SKP_Silk_bwexpander_32( AR1_Q24, psEnc->sCmn.shapingLPCOrder, BWExp1_Q16 );
+
+ /* Increase residual energy */
+ nrg = SKP_SMLAWB( nrg, SKP_RSHIFT( auto_corr[ 0 ], 8 ), SHAPE_MIN_ENERGY_RATIO_Q24 );
+
+ Qnrg = -scale; // range: -12...30
+ SKP_assert( Qnrg >= -12 );
+ SKP_assert( Qnrg <= 30 );
+
+ /* Make sure that Qnrg is an even number */
+ if( Qnrg & 1 ) {
+ Qnrg -= 1;
+ nrg >>= 1;
+ }
+
+ tmp32 = SKP_Silk_SQRT_APPROX( nrg );
+ Qnrg >>= 1; // range: -6...15
+
+ sqrt_nrg[ k ] = tmp32;
+ Qnrg_vec[ k ] = Qnrg;
+
+ psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( tmp32, 16 - Qnrg );
+
+ /* Ratio of prediction gains, in energy domain */
+ SKP_Silk_LPC_inverse_pred_gain_Q24( &pre_nrg_Q30, AR2_Q24, psEnc->sCmn.shapingLPCOrder );
+ SKP_Silk_LPC_inverse_pred_gain_Q24( &nrg, AR1_Q24, psEnc->sCmn.shapingLPCOrder );
+
+ //psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ) = 0.3f + 0.7f * pre_nrg / nrg;
+ pre_nrg_Q30 = SKP_LSHIFT32( SKP_SMULWB( pre_nrg_Q30, SKP_FIX_CONST( 0.7, 15 ) ), 1 );
+ psEncCtrl->GainsPre_Q14[ k ] = ( SKP_int ) SKP_FIX_CONST( 0.3, 14 ) + SKP_DIV32_varQ( pre_nrg_Q30, nrg, 14 );
+
+ /* Convert to monic warped prediction coefficients */
+ warped_true2monic_coefs( AR1_Q24, psEncCtrl->sCmn.warping_Q16, psEnc->sCmn.shapingLPCOrder );
+ warped_true2monic_coefs( AR2_Q24, psEncCtrl->sCmn.warping_Q16, psEnc->sCmn.shapingLPCOrder );
+
+ /* Limit absolute values */
+ limit_warped_coefs( AR2_Q24, AR1_Q24, psEncCtrl->sCmn.warping_Q16, SKP_FIX_CONST( 3.999, 24 ), psEnc->sCmn.shapingLPCOrder );
+
+ /* Convert from Q24 to Q13 and store in int16 */
+ for( i = 0; i < psEnc->sCmn.shapingLPCOrder; i++ ) {
+ psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( AR1_Q24[ i ], 11 ) );
+ psEncCtrl->AR2_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( AR2_Q24[ i ], 11 ) );
+ }
+ }
+
+ /*****************/
+ /* Gain tweaking */
+ /*****************/
+ /* Increase gains during low speech activity and put lower limit on gains */
+ gain_mult_Q16 = SKP_Silk_log2lin( -SKP_SMLAWB( -16 << 7, SNR_adj_dB_Q7, 10486 ) ); // 10486_Q16 = 0.16_Q0
+ gain_add_Q16 = SKP_Silk_log2lin( SKP_SMLAWB( 16 << 7, NOISE_FLOOR_dB_Q7, 10486 ) ); // 10486_Q16 = 0.16_Q0
+ tmp32 = SKP_Silk_log2lin( SKP_SMLAWB( 16 << 7, RELATIVE_MIN_GAIN_dB_Q7, 10486 ) ); // 10486_Q16 = 0.16_Q0
+ tmp32 = SKP_SMULWW( psEnc->avgGain_Q16, tmp32 );
+ gain_add_Q16 = SKP_ADD_SAT32( gain_add_Q16, tmp32 );
+ SKP_assert( gain_mult_Q16 >= 0 );
+
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->Gains_Q16[ k ] = SKP_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 );
+ SKP_assert( psEncCtrl->Gains_Q16[ k ] >= 0 );
+ }
+
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->Gains_Q16[ k ] = SKP_ADD_POS_SAT32( psEncCtrl->Gains_Q16[ k ], gain_add_Q16 );
+ psEnc->avgGain_Q16 = SKP_ADD_SAT32(
+ psEnc->avgGain_Q16,
+ SKP_SMULWB(
+ psEncCtrl->Gains_Q16[ k ] - psEnc->avgGain_Q16,
+ SKP_RSHIFT_ROUND( SKP_SMULBB( psEnc->speech_activity_Q8, GAIN_SMOOTHING_COEF_Q10 ), 2 )
+ ) );
+ }
+
+ /************************************************/
+ /* Decrease level during fricatives (de-essing) */
+ /************************************************/
+ gain_mult_Q16 = ( 1 << 16 ) + SKP_RSHIFT_ROUND( SKP_MLA( INPUT_TILT_Q26, psEncCtrl->coding_quality_Q14, HIGH_RATE_INPUT_TILT_Q12 ), 10 );
+
+ if( psEncCtrl->input_tilt_Q15 <= 0 && psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED ) {
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ SKP_int32 essStrength_Q15 = SKP_SMULWW( -psEncCtrl->input_tilt_Q15,
+ SKP_SMULBB( psEnc->speech_activity_Q8, ( 1 << 8 ) - psEncCtrl->sparseness_Q8 ) );
+ tmp32 = SKP_Silk_log2lin( ( 16 << 7 ) - SKP_SMULWB( essStrength_Q15,
+ SKP_SMULWB( DE_ESSER_COEF_SWB_dB_Q7, 20972 ) ) ); // 20972_Q17 = 0.16_Q0
+ gain_mult_Q16 = SKP_SMULWW( gain_mult_Q16, tmp32 );
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ SKP_int32 essStrength_Q15 = SKP_SMULWW(-psEncCtrl->input_tilt_Q15,
+ SKP_SMULBB( psEnc->speech_activity_Q8, ( 1 << 8 ) - psEncCtrl->sparseness_Q8 ));
+ tmp32 = SKP_Silk_log2lin( ( 16 << 7 ) - SKP_SMULWB( essStrength_Q15,
+ SKP_SMULWB( DE_ESSER_COEF_WB_dB_Q7, 20972 ) ) ); // 20972_Q17 = 0.16_Q0
+ gain_mult_Q16 = SKP_SMULWW( gain_mult_Q16, tmp32 );
+ } else {
+ SKP_assert( psEnc->sCmn.fs_kHz == 12 || psEnc->sCmn.fs_kHz == 8 );
+ }
+ }
+
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->GainsPre_Q14[ k ] = SKP_SMULWB( gain_mult_Q16, psEncCtrl->GainsPre_Q14[ k ] );
+ }
+
+ /************************************************/
+ /* Control low-frequency shaping and noise tilt */
+ /************************************************/
+ /* Less low frequency shaping for noisy inputs */
+ strength_Q16 = SKP_MUL( LOW_FREQ_SHAPING_Q0, ( 1 << 16 ) + SKP_SMULBB( LOW_QUALITY_LOW_FREQ_SHAPING_DECR_Q1, psEncCtrl->input_quality_bands_Q15[ 0 ] - ( 1 << 15 ) ) );
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */
+ /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/
+ SKP_int fs_kHz_inv = SKP_DIV32_16( 3277, psEnc->sCmn.fs_kHz ); // 0.2_Q0 = 3277_Q14
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ b_Q14 = fs_kHz_inv + SKP_DIV32_16( ( 3 << 14 ), psEncCtrl->sCmn.pitchL[ k ] );
+ /* Pack two coefficients in one int32 */
+ psEncCtrl->LF_shp_Q14[ k ] = SKP_LSHIFT( ( 1 << 14 ) - b_Q14 - SKP_SMULWB( strength_Q16, b_Q14 ), 16 );
+ psEncCtrl->LF_shp_Q14[ k ] |= (SKP_uint16)( b_Q14 - ( 1 << 14 ) );
+ }
+ SKP_assert( HARM_HP_NOISE_COEF_Q24 < ( 1 << 23 ) ); // Guarantees that second argument to SMULWB() is within range of an SKP_int16
+ Tilt_Q16 = - HP_NOISE_COEF_Q16 -
+ SKP_SMULWB( ( 1 << 16 ) - HP_NOISE_COEF_Q16, SKP_SMULWB( HARM_HP_NOISE_COEF_Q24, psEnc->speech_activity_Q8 ) );
+ } else {
+ b_Q14 = SKP_DIV32_16( 21299, psEnc->sCmn.fs_kHz ); // 1.3_Q0 = 21299_Q14
+ /* Pack two coefficients in one int32 */
+ psEncCtrl->LF_shp_Q14[ 0 ] = SKP_LSHIFT( ( 1 << 14 ) - b_Q14 - SKP_SMULWB( strength_Q16, SKP_SMULWB( 39322, b_Q14 ) ), 16 ); // 0.6_Q0 = 39322_Q16
+ psEncCtrl->LF_shp_Q14[ 0 ] |= (SKP_uint16)( b_Q14 - ( 1 << 14 ) );
+ for( k = 1; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->LF_shp_Q14[ k ] = psEncCtrl->LF_shp_Q14[ k - 1 ];
+ }
+ Tilt_Q16 = -HP_NOISE_COEF_Q16;
+ }
+
+ /****************************/
+ /* HARMONIC SHAPING CONTROL */
+ /****************************/
+ /* Control boosting of harmonic frequencies */
+ HarmBoost_Q16 = SKP_SMULWB( SKP_SMULWB( ( 1 << 17 ) - SKP_LSHIFT( psEncCtrl->coding_quality_Q14, 3 ),
+ psEnc->LTPCorr_Q15 ), LOW_RATE_HARMONIC_BOOST_Q16 );
+
+ /* More harmonic boost for noisy input signals */
+ HarmBoost_Q16 = SKP_SMLAWB( HarmBoost_Q16,
+ ( 1 << 16 ) - SKP_LSHIFT( psEncCtrl->input_quality_Q14, 2 ), LOW_INPUT_QUALITY_HARMONIC_BOOST_Q16 );
+
+ if( USE_HARM_SHAPING && psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* More harmonic noise shaping for high bitrates or noisy input */
+ HarmShapeGain_Q16 = SKP_SMLAWB( HARMONIC_SHAPING_Q16,
+ ( 1 << 16 ) - SKP_SMULWB( ( 1 << 18 ) - SKP_LSHIFT( psEncCtrl->coding_quality_Q14, 4 ),
+ psEncCtrl->input_quality_Q14 ), HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING_Q16 );
+
+ /* Less harmonic noise shaping for less periodic signals */
+ HarmShapeGain_Q16 = SKP_SMULWB( SKP_LSHIFT( HarmShapeGain_Q16, 1 ),
+ SKP_Silk_SQRT_APPROX( SKP_LSHIFT( psEnc->LTPCorr_Q15, 15 ) ) );
+ } else {
+ HarmShapeGain_Q16 = 0;
+ }
+
+ /*************************/
+ /* Smooth over subframes */
+ /*************************/
+ for( k = 0; k < MAX_NB_SUBFR; k++ ) {
+ psShapeSt->HarmBoost_smth_Q16 =
+ SKP_SMLAWB( psShapeSt->HarmBoost_smth_Q16, HarmBoost_Q16 - psShapeSt->HarmBoost_smth_Q16, SUBFR_SMTH_COEF_Q16 );
+ psShapeSt->HarmShapeGain_smth_Q16 =
+ SKP_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 - psShapeSt->HarmShapeGain_smth_Q16, SUBFR_SMTH_COEF_Q16 );
+ psShapeSt->Tilt_smth_Q16 =
+ SKP_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 - psShapeSt->Tilt_smth_Q16, SUBFR_SMTH_COEF_Q16 );
+
+ psEncCtrl->HarmBoost_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->HarmBoost_smth_Q16, 2 );
+ psEncCtrl->HarmShapeGain_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 );
+ psEncCtrl->Tilt_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 );
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_perceptual_parameters_FIX.h
@@ -1,0 +1,117 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_PERCEPTUAL_PARAMETERS_FIX_H
+#define SKP_SILK_PERCEPTUAL_PARAMETERS_FIX_H
+
+#include "SKP_Silk_perceptual_parameters.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* reduction in coding SNR during low speech activity */
+#define BG_SNR_DECR_dB_Q7 SKP_FIX_CONST( BG_SNR_DECR_dB, 7 )
+
+/* factor for reducing quantization noise during voiced speech */
+#define HARM_SNR_INCR_dB_Q7 SKP_FIX_CONST( HARM_SNR_INCR_dB, 7 )
+
+/* factor for reducing quantization noise for unvoiced sparse signals */
+#define SPARSE_SNR_INCR_dB_Q7 SKP_FIX_CONST( SPARSE_SNR_INCR_dB, 7 )
+
+/* threshold for sparseness measure above which to use lower quantization offset during unvoiced */
+#define SPARSENESS_THRESHOLD_QNT_OFFSET_Q8 SKP_FIX_CONST( SPARSENESS_THRESHOLD_QNT_OFFSET, 8 )
+
+
+/* noise shaping filter chirp factor */
+#define BANDWIDTH_EXPANSION_Q16 SKP_FIX_CONST( BANDWIDTH_EXPANSION, 16 )
+
+/* difference between chirp factors for analysis and synthesis noise shaping filters at low bitrates */
+#define LOW_RATE_BANDWIDTH_EXPANSION_DELTA_Q16 SKP_FIX_CONST( LOW_RATE_BANDWIDTH_EXPANSION_DELTA, 16 )
+
+/* factor to reduce all bandwidth expansion coefficients for super wideband, relative to wideband */
+#define SWB_BANDWIDTH_EXPANSION_REDUCTION_Q16 SKP_FIX_CONST( SWB_BANDWIDTH_EXPANSION_REDUCTION, 16 )
+
+/* gain reduction for fricatives */
+#define DE_ESSER_COEF_SWB_dB_Q7 SKP_FIX_CONST( DE_ESSER_COEF_SWB_dB, 7 )
+#define DE_ESSER_COEF_WB_dB_Q7 SKP_FIX_CONST( DE_ESSER_COEF_WB_dB, 7 )
+
+/* extra harmonic boosting (signal shaping) at low bitrates */
+#define LOW_RATE_HARMONIC_BOOST_Q16 SKP_FIX_CONST( LOW_RATE_HARMONIC_BOOST, 16 )
+
+/* extra harmonic boosting (signal shaping) for noisy input signals */
+#define LOW_INPUT_QUALITY_HARMONIC_BOOST_Q16 SKP_FIX_CONST( LOW_INPUT_QUALITY_HARMONIC_BOOST, 16 )
+
+/* harmonic noise shaping */
+#define HARMONIC_SHAPING_Q16 SKP_FIX_CONST( HARMONIC_SHAPING, 16 )
+
+/* extra harmonic noise shaping for high bitrates or noisy input */
+#define HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING_Q16 SKP_FIX_CONST( HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING, 16 )
+
+
+/* parameter for shaping noise towards higher frequencies */
+#define HP_NOISE_COEF_Q16 SKP_FIX_CONST( HP_NOISE_COEF, 16 )
+
+/* parameter for shaping noise extra towards higher frequencies during voiced speech */
+#define HARM_HP_NOISE_COEF_Q24 SKP_FIX_CONST( HARM_HP_NOISE_COEF, 24 )
+
+/* parameter for applying a high-pass tilt to the input signal */
+#define INPUT_TILT_Q26 SKP_FIX_CONST( INPUT_TILT, 26 )
+
+/* parameter for extra high-pass tilt to the input signal at high rates */
+#define HIGH_RATE_INPUT_TILT_Q12 SKP_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 )
+
+/* parameter for reducing noise at the very low frequencies */
+#define LOW_FREQ_SHAPING_Q0 SKP_FIX_CONST( LOW_FREQ_SHAPING, 0 )
+
+/* less reduction of noise at the very low frequencies for signals with low SNR at low frequencies */
+#define LOW_QUALITY_LOW_FREQ_SHAPING_DECR_Q1 SKP_FIX_CONST( LOW_QUALITY_LOW_FREQ_SHAPING_DECR, 1 )
+
+/* fraction added to first autocorrelation value */
+#define SHAPE_WHITE_NOISE_FRACTION_Q20 SKP_FIX_CONST( SHAPE_WHITE_NOISE_FRACTION, 20 )
+
+/* fraction of first autocorrelation value added to residual energy value; limits prediction gain */
+#define SHAPE_MIN_ENERGY_RATIO_Q24 SKP_FIX_CONST( SHAPE_MIN_ENERGY_RATIO, 24 )
+
+/* noise floor to put a low limit on the quantization step size */
+#define NOISE_FLOOR_dB_Q7 SKP_FIX_CONST( NOISE_FLOOR_dB, 7 )
+
+/* noise floor relative to active speech gain level */
+#define RELATIVE_MIN_GAIN_dB_Q7 SKP_FIX_CONST( RELATIVE_MIN_GAIN_dB, 7 )
+
+/* subframe smoothing coefficient for determining active speech gain level (lower -> more smoothing) */
+#define GAIN_SMOOTHING_COEF_Q10 SKP_FIX_CONST( GAIN_SMOOTHING_COEF, 10 )
+
+/* subframe smoothing coefficient for HarmBoost, HarmShapeGain, Tilt (lower -> more smoothing) */
+#define SUBFR_SMTH_COEF_Q16 SKP_FIX_CONST( SUBFR_SMTH_COEF, 16 )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //SKP_SILK_PERCEPTUAL_PARAMETERS_FIX_H
--- /dev/null
+++ b/src_FIX/SKP_Silk_prefilter_FIX.c
@@ -1,0 +1,201 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+#include "SKP_Silk_perceptual_parameters_FIX.h"
+
+/* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal */
+SKP_INLINE void SKP_Silk_prefilt_FIX(
+ SKP_Silk_prefilter_state_FIX *P, /* I/O state */
+ SKP_int32 st_res_Q12[], /* I short term residual signal */
+ SKP_int16 xw[], /* O prefiltered signal */
+ SKP_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */
+ SKP_int Tilt_Q14, /* I Tilt shaping coeficient */
+ SKP_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients*/
+ SKP_int lag, /* I Lag for harmonic shaping */
+ SKP_int length /* I Length of signals */
+);
+
+void SKP_Silk_warped_LPC_analysis_filter_FIX(
+ SKP_int32 state[], /* I/O State [order + 1] */
+ SKP_int16 res[], /* O Residual signal [length] */
+ const SKP_int16 coef_Q13[], /* I Coefficients [order] */
+ const SKP_int16 input[], /* I Input signal [length] */
+ const SKP_int16 lambda_Q16, /* I Warping factor */
+ const SKP_int length, /* I Length of input signal */
+ const SKP_int order /* I Filter order (even) */
+)
+{
+ SKP_int n, i;
+ SKP_int32 acc_Q11, tmp1, tmp2;
+
+ /* Order must be even */
+ SKP_assert( ( order & 1 ) == 0 );
+
+ for( n = 0; n < length; n++ ) {
+ /* Output of lowpass section */
+ tmp2 = SKP_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 );
+ state[ 0 ] = SKP_LSHIFT( input[ n ], 14 );
+ /* Output of allpass section */
+ tmp1 = SKP_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 );
+ state[ 1 ] = tmp2;
+ acc_Q11 = SKP_SMULWB( tmp2, coef_Q13[ 0 ] );
+ /* Loop over allpass sections */
+ for( i = 2; i < order; i += 2 ) {
+ /* Output of allpass section */
+ tmp2 = SKP_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 );
+ state[ i ] = tmp1;
+ acc_Q11 = SKP_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] );
+ /* Output of allpass section */
+ tmp1 = SKP_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 );
+ state[ i + 1 ] = tmp2;
+ acc_Q11 = SKP_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] );
+ }
+ state[ order ] = tmp1;
+ acc_Q11 = SKP_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] );
+ res[ n ] = ( SKP_int16 )SKP_SAT16( ( SKP_int32 )input[ n ] - SKP_RSHIFT_ROUND( acc_Q11, 11 ) );
+ }
+}
+
+void SKP_Silk_prefilter_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
+ const SKP_Silk_encoder_control_FIX *psEncCtrl, /* I Encoder control FIX */
+ SKP_int16 xw[], /* O Weighted signal */
+ const SKP_int16 x[] /* I Speech signal */
+)
+{
+ SKP_Silk_prefilter_state_FIX *P = &psEnc->sPrefilt;
+ SKP_int j, k, lag;
+ SKP_int32 tmp_32;
+ const SKP_int16 *AR1_shp_Q13;
+ const SKP_int16 *px;
+ SKP_int16 *pxw;
+ SKP_int HarmShapeGain_Q12, Tilt_Q14;
+ SKP_int32 HarmShapeFIRPacked_Q12, LF_shp_Q14;
+ SKP_int32 x_filt_Q12[ MAX_FRAME_LENGTH / MAX_NB_SUBFR ];
+ SKP_int16 st_res[ ( MAX_FRAME_LENGTH / MAX_NB_SUBFR ) + MAX_LPC_ORDER ];
+ SKP_int16 B_Q12[ 2 ];
+
+ /* Setup pointers */
+ px = x;
+ pxw = xw;
+ lag = P->lagPrev;
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ /* Update Variables that change per sub frame */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ lag = psEncCtrl->sCmn.pitchL[ k ];
+ }
+
+ /* Noise shape parameters */
+ HarmShapeGain_Q12 = SKP_SMULWB( psEncCtrl->HarmShapeGain_Q14[ k ], 16384 - psEncCtrl->HarmBoost_Q14[ k ] );
+ SKP_assert( HarmShapeGain_Q12 >= 0 );
+ HarmShapeFIRPacked_Q12 = SKP_RSHIFT( HarmShapeGain_Q12, 2 );
+ HarmShapeFIRPacked_Q12 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q12, 1 ), 16 );
+ Tilt_Q14 = psEncCtrl->Tilt_Q14[ k ];
+ LF_shp_Q14 = psEncCtrl->LF_shp_Q14[ k ];
+ AR1_shp_Q13 = &psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER ];
+
+ /* Short term FIR filtering*/
+ SKP_Silk_warped_LPC_analysis_filter_FIX( P->sAR_shp1, st_res, AR1_shp_Q13, px,
+ psEncCtrl->sCmn.warping_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder );
+
+ /* reduce (mainly) low frequencies during harmonic emphasis */
+ B_Q12[ 0 ] = SKP_RSHIFT_ROUND( psEncCtrl->GainsPre_Q14[ k ], 2 );
+ tmp_32 = SKP_SMLABB( INPUT_TILT_Q26, psEncCtrl->HarmBoost_Q14[ k ], HarmShapeGain_Q12 ); /* Q26 */
+ tmp_32 = SKP_SMLABB( tmp_32, psEncCtrl->coding_quality_Q14, HIGH_RATE_INPUT_TILT_Q12 ); /* Q26 */
+ tmp_32 = SKP_SMULWB( tmp_32, -psEncCtrl->GainsPre_Q14[ k ] ); /* Q24 */
+ tmp_32 = SKP_RSHIFT_ROUND( tmp_32, 12 ); /* Q12 */
+ B_Q12[ 1 ]= SKP_SAT16( tmp_32 );
+
+ x_filt_Q12[ 0 ] = SKP_SMLABB( SKP_SMULBB( st_res[ 0 ], B_Q12[ 0 ] ), P->sHarmHP, B_Q12[ 1 ] );
+ for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) {
+ x_filt_Q12[ j ] = SKP_SMLABB( SKP_SMULBB( st_res[ j ], B_Q12[ 0 ] ), st_res[ j - 1 ], B_Q12[ 1 ] );
+ }
+ P->sHarmHP = st_res[ psEnc->sCmn.subfr_length - 1 ];
+
+ SKP_Silk_prefilt_FIX( P, x_filt_Q12, pxw, HarmShapeFIRPacked_Q12, Tilt_Q14,
+ LF_shp_Q14, lag, psEnc->sCmn.subfr_length );
+
+ px += psEnc->sCmn.subfr_length;
+ pxw += psEnc->sCmn.subfr_length;
+ }
+
+ P->lagPrev = psEncCtrl->sCmn.pitchL[ MAX_NB_SUBFR - 1 ];
+}
+
+/* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal */
+SKP_INLINE void SKP_Silk_prefilt_FIX(
+ SKP_Silk_prefilter_state_FIX *P, /* I/O state */
+ SKP_int32 st_res_Q12[], /* I short term residual signal */
+ SKP_int16 xw[], /* O prefiltered signal */
+ SKP_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */
+ SKP_int Tilt_Q14, /* I Tilt shaping coeficient */
+ SKP_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients*/
+ SKP_int lag, /* I Lag for harmonic shaping */
+ SKP_int length /* I Length of signals */
+)
+{
+ SKP_int i, idx, LTP_shp_buf_idx;
+ SKP_int32 n_LTP_Q12, n_Tilt_Q10, n_LF_Q10;
+ SKP_int32 sLF_MA_shp_Q12, sLF_AR_shp_Q12;
+ SKP_int16 *LTP_shp_buf;
+
+ /* To speed up use temp variables instead of using the struct */
+ LTP_shp_buf = P->sLTP_shp1;
+ LTP_shp_buf_idx = P->sLTP_shp_buf_idx1;
+ sLF_AR_shp_Q12 = P->sLF_AR_shp1_Q12;
+ sLF_MA_shp_Q12 = P->sLF_MA_shp1_Q12;
+
+ for( i = 0; i < length; i++ ) {
+ if( lag > 0 ) {
+ /* unrolled loop */
+ SKP_assert( HARM_SHAPE_FIR_TAPS == 3 );
+ idx = lag + LTP_shp_buf_idx;
+ n_LTP_Q12 = SKP_SMULBB( LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 );
+ n_LTP_Q12 = SKP_SMLABT( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ], HarmShapeFIRPacked_Q12 );
+ n_LTP_Q12 = SKP_SMLABB( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 );
+ } else {
+ n_LTP_Q12 = 0;
+ }
+
+ n_Tilt_Q10 = SKP_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 );
+ n_LF_Q10 = SKP_SMLAWB( SKP_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 );
+
+ sLF_AR_shp_Q12 = SKP_SUB32( st_res_Q12[ i ], SKP_LSHIFT( n_Tilt_Q10, 2 ) );
+ sLF_MA_shp_Q12 = SKP_SUB32( sLF_AR_shp_Q12, SKP_LSHIFT( n_LF_Q10, 2 ) );
+
+ LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK;
+ LTP_shp_buf[ LTP_shp_buf_idx ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) );
+
+ xw[i] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 12 ) );
+ }
+
+ /* Copy temp variable back to state */
+ P->sLF_AR_shp1_Q12 = sLF_AR_shp_Q12;
+ P->sLF_MA_shp1_Q12 = sLF_MA_shp_Q12;
+ P->sLTP_shp_buf_idx1 = LTP_shp_buf_idx;
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_process_NLSFs_FIX.c
@@ -1,0 +1,127 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Limit, stabilize, convert and quantize NLSFs. */
+void SKP_Silk_process_NLSFs_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */
+ SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */
+ SKP_int *pNLSF_Q15 /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */
+)
+{
+ SKP_int doInterpolate;
+ SKP_int pNLSFW_Q6[ MAX_LPC_ORDER ];
+ SKP_int NLSF_mu_Q15, NLSF_mu_fluc_red_Q16;
+ SKP_int32 i_sqr_Q15;
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB;
+
+ /* Used only for NLSF interpolation */
+ SKP_int pNLSF0_temp_Q15[ MAX_LPC_ORDER ];
+ SKP_int pNLSFW0_temp_Q6[ MAX_LPC_ORDER ];
+ SKP_int i;
+
+ SKP_assert( psEnc->speech_activity_Q8 >= 0 );
+ SKP_assert( psEnc->speech_activity_Q8 <= 256 );
+ SKP_assert( psEncCtrl->sparseness_Q8 >= 0 );
+ SKP_assert( psEncCtrl->sparseness_Q8 <= 256 );
+ SKP_assert( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED || psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED );
+
+ /***********************/
+ /* Calculate mu values */
+ /***********************/
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* NLSF_mu = 0.002f - 0.001f * psEnc->speech_activity; */
+ /* NLSF_mu_fluc_red = 0.1f - 0.05f * psEnc->speech_activity; */
+ NLSF_mu_Q15 = SKP_SMLAWB( 66, -8388, psEnc->speech_activity_Q8 );
+ NLSF_mu_fluc_red_Q16 = SKP_SMLAWB( 6554, -838848, psEnc->speech_activity_Q8 );
+ } else {
+ /* NLSF_mu = 0.005f - 0.004f * psEnc->speech_activity; */
+ /* NLSF_mu_fluc_red = 0.2f - 0.1f * psEnc->speech_activity - 0.1f * psEncCtrl->sparseness; */
+ NLSF_mu_Q15 = SKP_SMLAWB( 164, -33554, psEnc->speech_activity_Q8 );
+ NLSF_mu_fluc_red_Q16 = SKP_SMLAWB( 13107, -1677696, psEnc->speech_activity_Q8 + psEncCtrl->sparseness_Q8 );
+ }
+ SKP_assert( NLSF_mu_Q15 >= 0 );
+ SKP_assert( NLSF_mu_Q15 <= 164 );
+ SKP_assert( NLSF_mu_fluc_red_Q16 >= 0 );
+ SKP_assert( NLSF_mu_fluc_red_Q16 <= 13107 );
+
+ NLSF_mu_Q15 = SKP_max( NLSF_mu_Q15, 1 );
+
+ /* Calculate NLSF weights */
+ TIC(NLSF_weights_FIX)
+ SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW_Q6, pNLSF_Q15, psEnc->sCmn.predictLPCOrder );
+ TOC(NLSF_weights_FIX)
+
+ /* Update NLSF weights for interpolated NLSFs */
+ doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEncCtrl->sCmn.NLSFInterpCoef_Q2 < ( 1 << 2 ) );
+ if( doInterpolate ) {
+
+ /* Calculate the interpolated NLSF vector for the first half */
+ SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15,
+ psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );
+
+ /* Calculate first half NLSF weights for the interpolated NLSFs */
+ TIC(NLSF_weights_FIX)
+ SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW0_temp_Q6, pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder );
+ TOC(NLSF_weights_FIX)
+
+ /* Update NLSF weights with contribution from first half */
+ i_sqr_Q15 = SKP_LSHIFT( SKP_SMULBB( psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->sCmn.NLSFInterpCoef_Q2 ), 11 );
+ for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {
+ pNLSFW_Q6[ i ] = SKP_SMLAWB( SKP_RSHIFT( pNLSFW_Q6[ i ], 1 ), pNLSFW0_temp_Q6[ i ], i_sqr_Q15 );
+ SKP_assert( pNLSFW_Q6[ i ] <= SKP_int16_MAX );
+ SKP_assert( pNLSFW_Q6[ i ] >= 1 );
+ }
+ }
+
+ /* Set pointer to the NLSF codebook for the current signal type and LPC order */
+ psNLSF_CB = psEnc->sCmn.psNLSF_CB[ psEncCtrl->sCmn.sigtype ];
+
+ /* Quantize NLSF parameters given the trained NLSF codebooks */
+ TIC(MSVQ_encode_FIX)
+ SKP_Silk_NLSF_MSVQ_encode_FIX( psEncCtrl->sCmn.NLSFIndices, pNLSF_Q15, psNLSF_CB,
+ psEnc->sPred.prev_NLSFq_Q15, pNLSFW_Q6, NLSF_mu_Q15, NLSF_mu_fluc_red_Q16,
+ psEnc->sCmn.NLSF_MSVQ_Survivors, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.first_frame_after_reset );
+ TOC(MSVQ_encode_FIX)
+
+ /* Convert quantized NLSFs back to LPC coefficients */
+ SKP_Silk_NLSF2A_stable( psEncCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psEnc->sCmn.predictLPCOrder );
+
+ if( doInterpolate ) {
+ /* Calculate the interpolated, quantized LSF vector for the first half */
+ SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15,
+ psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder );
+
+ /* Convert back to LPC coefficients */
+ SKP_Silk_NLSF2A_stable( psEncCtrl->PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder );
+
+ } else {
+ /* Copy LPC coefficients for first half from second half */
+ SKP_memcpy( psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->PredCoef_Q12[ 1 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_int16 ) );
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_process_gains_FIX.c
@@ -1,0 +1,113 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Processing of gains */
+void SKP_Silk_process_gains_FIX(
+ SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state_FIX */
+ SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control_FIX */
+)
+{
+ SKP_Silk_shape_state_FIX *psShapeSt = &psEnc->sShape;
+ SKP_int k;
+ SKP_int32 s_Q16, InvMaxSqrVal_Q16, gain, gain_squared, ResNrg, ResNrgPart;
+
+ /* Gain reduction when LTP coding gain is high */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /*s = -0.5f * SKP_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); */
+ s_Q16 = -SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( psEncCtrl->LTPredCodGain_Q7 - (12 << 7), 4 ) );
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->Gains_Q16[ k ] = SKP_SMLAWB( psEncCtrl->Gains_Q16[ k ], psEncCtrl->Gains_Q16[ k ], s_Q16 );
+ }
+ }
+
+ /* Limit the quantized signal */
+ /* 69 = 21.0f + 16/0.33 */
+ InvMaxSqrVal_Q16 = SKP_DIV32_16( SKP_Silk_log2lin(
+ SKP_SMULWB( (69 << 7) - psEncCtrl->current_SNR_dB_Q7, SKP_FIX_CONST( 0.33, 16 )) ), psEnc->sCmn.subfr_length );
+
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ /* Soft limit on ratio residual energy and squared gains */
+ ResNrg = psEncCtrl->ResNrg[ k ];
+ ResNrgPart = SKP_SMULWW( ResNrg, InvMaxSqrVal_Q16 );
+ if( psEncCtrl->ResNrgQ[ k ] > 0 ) {
+ if( psEncCtrl->ResNrgQ[ k ] < 32 ) {
+ ResNrgPart = SKP_RSHIFT_ROUND( ResNrgPart, psEncCtrl->ResNrgQ[ k ] );
+ } else {
+ ResNrgPart = 0;
+ }
+ } else if( psEncCtrl->ResNrgQ[k] != 0 ) {
+ if( ResNrgPart > SKP_RSHIFT( SKP_int32_MAX, -psEncCtrl->ResNrgQ[ k ] ) ) {
+ ResNrgPart = SKP_int32_MAX;
+ } else {
+ ResNrgPart = SKP_LSHIFT( ResNrgPart, -psEncCtrl->ResNrgQ[ k ] );
+ }
+ }
+ gain = psEncCtrl->Gains_Q16[ k ];
+ gain_squared = SKP_ADD_SAT32( ResNrgPart, SKP_SMMUL( gain, gain ) );
+ if( gain_squared < SKP_int16_MAX ) {
+ /* recalculate with higher precision */
+ gain_squared = SKP_SMLAWW( SKP_LSHIFT( ResNrgPart, 16 ), gain, gain );
+ SKP_assert( gain_squared > 0 );
+ gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q8 */
+ psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 8 ); /* Q16 */
+ } else {
+ gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q0 */
+ psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 16 ); /* Q16 */
+ }
+ }
+
+ /* Noise shaping quantization */
+ SKP_Silk_gains_quant( psEncCtrl->sCmn.GainsIndices, psEncCtrl->Gains_Q16,
+ &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );
+ /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ if( psEncCtrl->LTPredCodGain_Q7 + SKP_RSHIFT( psEncCtrl->input_tilt_Q15, 8 ) > ( 1 << 7 ) ) {
+ psEncCtrl->sCmn.QuantOffsetType = 0;
+ } else {
+ psEncCtrl->sCmn.QuantOffsetType = 1;
+ }
+ }
+
+ /* Quantizer boundary adjustment */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ psEncCtrl->Lambda_Q10 = SKP_FIX_CONST( 1.2, 10 )
+ - SKP_SMULWB( SKP_FIX_CONST( 0.4, 18 ), psEnc->speech_activity_Q8 )
+ - SKP_SMULWB( SKP_FIX_CONST( 0.3, 12 ), psEncCtrl->input_quality_Q14 )
+ + SKP_SMULBB( SKP_FIX_CONST( 0.2, 10 ), psEncCtrl->sCmn.QuantOffsetType )
+ - SKP_SMULWB( SKP_FIX_CONST( 0.1, 12 ), psEncCtrl->coding_quality_Q14 );
+ } else {
+ psEncCtrl->Lambda_Q10 = SKP_FIX_CONST( 1.2, 10 )
+ - SKP_SMULWB( SKP_FIX_CONST( 0.4, 18 ), psEnc->speech_activity_Q8 )
+ - SKP_SMULWB( SKP_FIX_CONST( 0.4, 12 ), psEncCtrl->input_quality_Q14 )
+ + SKP_SMULBB( SKP_FIX_CONST( 0.4, 10 ), psEncCtrl->sCmn.QuantOffsetType )
+ - SKP_SMULWB( SKP_FIX_CONST( 0.1, 12 ), psEncCtrl->coding_quality_Q14 );
+ }
+ SKP_assert( psEncCtrl->Lambda_Q10 >= 0 );
+ SKP_assert( psEncCtrl->Lambda_Q10 < SKP_FIX_CONST( 2, 10 ) );
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_quant_LTP_gains_FIX.c
@@ -1,0 +1,124 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+void SKP_Silk_quant_LTP_gains_FIX(
+ SKP_int16 B_Q14[], /* I/O (un)quantized LTP gains */
+ SKP_int cbk_index[], /* O Codebook Index */
+ SKP_int *periodicity_index, /* O Periodicity Index */
+ const SKP_int32 W_Q18[], /* I Error Weights in Q18 */
+ SKP_int mu_Q8, /* I Mu value (R/D tradeoff) */
+ SKP_int lowComplexity, /* I Flag for low complexity */
+ const SKP_int nb_subfr /* I number of subframes */
+)
+{
+ SKP_int j, k, temp_idx[ MAX_NB_SUBFR ], cbk_size;
+ const SKP_uint16 *cdf_ptr;
+ const SKP_int16 *cl_ptr;
+ const SKP_int16 *cbk_ptr_Q14;
+ const SKP_int16 *b_Q14_ptr;
+ const SKP_int32 *W_Q18_ptr;
+ SKP_int32 rate_dist_subfr, rate_dist, min_rate_dist;
+
+
+TIC(quant_LTP_fix)
+
+ /***************************************************/
+ /* iterate over different codebooks with different */
+ /* rates/distortions, and choose best */
+ /***************************************************/
+ min_rate_dist = SKP_int32_MAX;
+ for( k = 0; k < 3; k++ ) {
+ cdf_ptr = SKP_Silk_LTP_gain_CDF_ptrs[ k ];
+ cl_ptr = SKP_Silk_LTP_gain_BITS_Q6_ptrs[ k ];
+ cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ k ];
+ cbk_size = SKP_Silk_LTP_vq_sizes[ k ];
+
+ /* Setup pointer to first subframe */
+ W_Q18_ptr = W_Q18;
+ b_Q14_ptr = B_Q14;
+
+ rate_dist = 0;
+ for( j = 0; j < nb_subfr; j++ ) {
+
+ SKP_Silk_VQ_WMat_EC_FIX(
+ &temp_idx[ j ], /* O index of best codebook vector */
+ &rate_dist_subfr, /* O best weighted quantization error + mu * rate */
+ b_Q14_ptr, /* I input vector to be quantized */
+ W_Q18_ptr, /* I weighting matrix */
+ cbk_ptr_Q14, /* I codebook */
+ cl_ptr, /* I code length for each codebook vector */
+ mu_Q8, /* I tradeoff between weighted error and rate */
+ cbk_size /* I number of vectors in codebook */
+ );
+
+ rate_dist = SKP_ADD_POS_SAT32( rate_dist, rate_dist_subfr );
+
+ b_Q14_ptr += LTP_ORDER;
+ W_Q18_ptr += LTP_ORDER * LTP_ORDER;
+ }
+
+ /* Avoid never finding a codebook */
+ rate_dist = SKP_min( SKP_int32_MAX - 1, rate_dist );
+
+ if( rate_dist < min_rate_dist ) {
+ min_rate_dist = rate_dist;
+ SKP_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( SKP_int ) );
+ *periodicity_index = k;
+ }
+
+ /* Break early in low-complexity mode if rate distortion is below threshold */
+ if( lowComplexity && ( rate_dist < SKP_Silk_LTP_gain_middle_avg_RD_Q14 ) ) {
+ break;
+ }
+ }
+
+ cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ *periodicity_index ];
+ for( j = 0; j < nb_subfr; j++ ) {
+ for( k = 0; k < LTP_ORDER; k++ ) {
+ B_Q14[ j * LTP_ORDER + k ] = cbk_ptr_Q14[ SKP_MLA( k, cbk_index[ j ], LTP_ORDER ) ];
+ }
+ }
+TOC(quant_LTP_fix)
+#ifdef SAVE_ALL_INTERNAL_DATA
+ /* save rate */
+ {
+ SKP_int nbits_LTP;
+ SKP_float rateBPF_LTP;
+
+ cl_ptr = SKP_Silk_LTP_gain_BITS_Q6_ptrs[*periodicity_index];
+ nbits_LTP = 0;
+ for(j = 0; j < nb_subfr; j++){
+ nbits_LTP += cl_ptr[cbk_index[j]];
+ }
+ rateBPF_LTP = (SKP_float)nbits_LTP / 64.0f; // Q6 -> Q0
+ SAVE_DATA( rateBPF_LTP.dat, &rateBPF_LTP, sizeof(SKP_float));
+ }
+#endif
+}
+
--- /dev/null
+++ b/src_FIX/SKP_Silk_regularize_correlations_FIX.c
@@ -1,0 +1,43 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Add noise to matrix diagonal */
+void SKP_Silk_regularize_correlations_FIX(
+ SKP_int32 *XX, /* I/O Correlation matrices */
+ SKP_int32 *xx, /* I/O Correlation values */
+ SKP_int32 noise, /* I Noise to add */
+ SKP_int D /* I Dimension of XX */
+)
+{
+ SKP_int i;
+ for( i = 0; i < D; i++ ) {
+ matrix_ptr( &XX[ 0 ], i, i, D ) = SKP_ADD32( matrix_ptr( &XX[ 0 ], i, i, D ), noise );
+ }
+ xx[ 0 ] += noise;
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_residual_energy16_FIX.c
@@ -1,0 +1,99 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */
+SKP_int32 SKP_Silk_residual_energy16_covar_FIX(
+ const SKP_int16 *c, /* I Prediction vector */
+ const SKP_int32 *wXX, /* I Correlation matrix */
+ const SKP_int32 *wXx, /* I Correlation vector */
+ SKP_int32 wxx, /* I Signal energy */
+ SKP_int D, /* I Dimension */
+ SKP_int cQ /* I Q value for c vector 0 - 15 */
+)
+{
+ SKP_int i, j, lshifts, Qxtra;
+ SKP_int32 c_max, w_max, tmp, tmp2, nrg;
+ SKP_int cn[ MAX_MATRIX_SIZE ];
+ const SKP_int32 *pRow;
+
+ /* Safety checks */
+ SKP_assert( D >= 0 );
+ SKP_assert( D <= 16 );
+ SKP_assert( cQ > 0 );
+ SKP_assert( cQ < 16 );
+
+ lshifts = 16 - cQ;
+ Qxtra = lshifts;
+
+ c_max = 0;
+ for( i = 0; i < D; i++ ) {
+ c_max = SKP_max_32( c_max, SKP_abs( ( SKP_int32 )c[ i ] ) );
+ }
+ Qxtra = SKP_min_int( Qxtra, SKP_Silk_CLZ32( c_max ) - 17 );
+
+ w_max = SKP_max_32( wXX[ 0 ], wXX[ D * D - 1 ] );
+ Qxtra = SKP_min_int( Qxtra, SKP_Silk_CLZ32( SKP_MUL( D, SKP_RSHIFT( SKP_SMULWB( w_max, c_max ), 4 ) ) ) - 5 );
+ Qxtra = SKP_max_int( Qxtra, 0 );
+ for( i = 0; i < D; i++ ) {
+ cn[ i ] = SKP_LSHIFT( ( SKP_int )c[ i ], Qxtra );
+ SKP_assert( SKP_abs(cn[i]) <= ( SKP_int16_MAX + 1 ) ); /* Check that SKP_SMLAWB can be used */
+ }
+ lshifts -= Qxtra;
+
+ /* Compute wxx - 2 * wXx * c */
+ tmp = 0;
+ for( i = 0; i < D; i++ ) {
+ tmp = SKP_SMLAWB( tmp, wXx[ i ], cn[ i ] );
+ }
+ nrg = SKP_RSHIFT( wxx, 1 + lshifts ) - tmp; /* Q: -lshifts - 1 */
+
+ /* Add c' * wXX * c, assuming wXX is symmetric */
+ tmp2 = 0;
+ for( i = 0; i < D; i++ ) {
+ tmp = 0;
+ pRow = &wXX[ i * D ];
+ for( j = i + 1; j < D; j++ ) {
+ tmp = SKP_SMLAWB( tmp, pRow[ j ], cn[ j ] );
+ }
+ tmp = SKP_SMLAWB( tmp, SKP_RSHIFT( pRow[ i ], 1 ), cn[ i ] );
+ tmp2 = SKP_SMLAWB( tmp2, tmp, cn[ i ] );
+ }
+ nrg = SKP_ADD_LSHIFT32( nrg, tmp2, lshifts ); /* Q: -lshifts - 1 */
+
+ /* Keep one bit free always, because we add them for LSF interpolation */
+ if( nrg < 1 ) {
+ nrg = 1;
+ } else if( nrg > SKP_RSHIFT( SKP_int32_MAX, lshifts + 2 ) ) {
+ nrg = SKP_int32_MAX >> 1;
+ } else {
+ nrg = SKP_LSHIFT( nrg, lshifts + 1 ); /* Q0 */
+ }
+ return nrg;
+
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_residual_energy_FIX.c
@@ -1,0 +1,89 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/* Calculates residual energies of input subframes where all subframes have LPC_order */
+/* of preceeding samples */
+void SKP_Silk_residual_energy_FIX(
+ SKP_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */
+ SKP_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */
+ const SKP_int16 x[], /* I Input signal */
+ const SKP_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */
+ const SKP_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */
+ const SKP_int subfr_length, /* I Subframe length */
+ const SKP_int nb_subfr, /* I Number of subframes */
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_int offset, i, j, rshift, lz1, lz2;
+ SKP_int16 *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ];
+ const SKP_int16 *x_ptr;
+ SKP_int16 S[ MAX_LPC_ORDER ];
+ SKP_int32 tmp32;
+
+ x_ptr = x;
+ offset = LPC_order + subfr_length;
+
+ /* Filter input to create the LPC residual for each frame half, and measure subframe energies */
+ for( i = 0; i < nb_subfr >> 1; i++ ) {
+ /* Calculate half frame LPC residual signal including preceeding samples */
+ SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) );
+ SKP_Silk_LPC_analysis_filter( x_ptr, a_Q12[ i ], S, LPC_res, ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order );
+
+ /* Point to first subframe of the just calculated LPC residual signal */
+ LPC_res_ptr = LPC_res + LPC_order;
+ for( j = 0; j < ( MAX_NB_SUBFR >> 1 ); j++ ) {
+ /* Measure subframe energy */
+ SKP_Silk_sum_sqr_shift( &nrgs[ i * ( MAX_NB_SUBFR >> 1 ) + j ], &rshift, LPC_res_ptr, subfr_length );
+
+ /* Set Q values for the measured energy */
+ nrgsQ[ i * ( MAX_NB_SUBFR >> 1 ) + j ] = -rshift;
+
+ /* Move to next subframe */
+ LPC_res_ptr += offset;
+ }
+ /* Move to next frame half */
+ x_ptr += ( MAX_NB_SUBFR >> 1 ) * offset;
+ }
+
+ /* Apply the squared subframe gains */
+ for( i = 0; i < nb_subfr; i++ ) {
+ /* Fully upscale gains and energies */
+ lz1 = SKP_Silk_CLZ32( nrgs[ i ] ) - 1;
+ lz2 = SKP_Silk_CLZ32( gains[ i ] ) - 1;
+
+ tmp32 = SKP_LSHIFT32( gains[ i ], lz2 );
+
+ /* Find squared gains */
+ tmp32 = SKP_SMMUL( tmp32, tmp32 ); // Q( 2 * lz2 - 32 )
+
+ /* Scale energies */
+ nrgs[ i ] = SKP_SMMUL( tmp32, SKP_LSHIFT32( nrgs[ i ], lz1 ) ); // Q( nrgsQ[ i ] + lz1 + 2 * lz2 - 32 - 32 )
+ nrgsQ[ i ] += lz1 + 2 * lz2 - 32 - 32;
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_solve_LS_FIX.c
@@ -1,0 +1,240 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+/*****************************/
+/* Internal function headers */
+/*****************************/
+
+typedef struct {
+ SKP_int32 Q36_part;
+ SKP_int32 Q48_part;
+} inv_D_t;
+
+/* Factorize square matrix A into LDL form */
+SKP_INLINE void SKP_Silk_LDL_factorize_FIX(
+ SKP_int32 *A, /* I/O Pointer to Symetric Square Matrix */
+ SKP_int M, /* I Size of Matrix */
+ SKP_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */
+ inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */
+);
+
+/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */
+SKP_INLINE void SKP_Silk_LS_SolveFirst_FIX(
+ const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
+ SKP_int M, /* I Dim of Matrix equation */
+ const SKP_int32 *b, /* I b Vector */
+ SKP_int32 *x_Q16 /* O x Vector */
+);
+
+/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */
+SKP_INLINE void SKP_Silk_LS_SolveLast_FIX(
+ const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
+ const SKP_int M, /* I Dim of Matrix equation */
+ const SKP_int32 *b, /* I b Vector */
+ SKP_int32 *x_Q16 /* O x Vector */
+);
+
+SKP_INLINE void SKP_Silk_LS_divide_Q16_FIX(
+ SKP_int32 T[], /* I/O Numenator vector */
+ inv_D_t *inv_D, /* I 1 / D vector */
+ SKP_int M /* I dimension */
+);
+
+/* Solves Ax = b, assuming A is symmetric */
+void SKP_Silk_solve_LDL_FIX(
+ SKP_int32 *A, /* I Pointer to symetric square matrix A */
+ SKP_int M, /* I Size of matrix */
+ const SKP_int32 *b, /* I Pointer to b vector */
+ SKP_int32 *x_Q16 /* O Pointer to x solution vector */
+)
+{
+ SKP_int32 L_Q16[ MAX_MATRIX_SIZE * MAX_MATRIX_SIZE ];
+ SKP_int32 Y[ MAX_MATRIX_SIZE ];
+ inv_D_t inv_D[ MAX_MATRIX_SIZE ];
+
+ SKP_assert( M <= MAX_MATRIX_SIZE );
+
+ /***************************************************
+ Factorize A by LDL such that A = L*D*L',
+ where L is lower triangular with ones on diagonal
+ ****************************************************/
+ SKP_Silk_LDL_factorize_FIX( A, M, L_Q16, inv_D );
+
+ /****************************************************
+ * substitute D*L'*x = Y. ie:
+ L*D*L'*x = b => L*Y = b <=> Y = inv(L)*b
+ ******************************************************/
+ SKP_Silk_LS_SolveFirst_FIX( L_Q16, M, b, Y );
+
+ /****************************************************
+ D*L'*x = Y <=> L'*x = inv(D)*Y, because D is
+ diagonal just multiply with 1/d_i
+ ****************************************************/
+ SKP_Silk_LS_divide_Q16_FIX( Y, inv_D, M );
+
+ /****************************************************
+ x = inv(L') * inv(D) * Y
+ *****************************************************/
+ SKP_Silk_LS_SolveLast_FIX( L_Q16, M, Y, x_Q16 );
+}
+
+SKP_INLINE void SKP_Silk_LDL_factorize_FIX(
+ SKP_int32 *A, /* I Pointer to Symetric Square Matrix */
+ SKP_int M, /* I Size of Matrix */
+ SKP_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */
+ inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */
+)
+{
+ SKP_int i, j, k, status, loop_count;
+ const SKP_int32 *ptr1, *ptr2;
+ SKP_int32 diag_min_value, tmp_32, err;
+ SKP_int32 v_Q0[ MAX_MATRIX_SIZE ], D_Q0[ MAX_MATRIX_SIZE ];
+ SKP_int32 one_div_diag_Q36, one_div_diag_Q40, one_div_diag_Q48;
+
+ SKP_assert( M <= MAX_MATRIX_SIZE );
+
+ status = 1;
+ diag_min_value = SKP_max_32( SKP_SMMUL( SKP_ADD_SAT32( A[ 0 ], A[ SKP_SMULBB( M, M ) - 1 ] ), FIND_LTP_COND_FAC_Q31 ), 1 << 9 );
+ for( loop_count = 0; loop_count < M && status == 1; loop_count++ ) {
+ status = 0;
+ for( j = 0; j < M; j++ ) {
+ ptr1 = matrix_adr( L_Q16, j, 0, M );
+ tmp_32 = 0;
+ for( i = 0; i < j; i++ ) {
+ v_Q0[ i ] = SKP_SMULWW( D_Q0[ i ], ptr1[ i ] ); /* Q0 */
+ tmp_32 = SKP_SMLAWW( tmp_32, v_Q0[ i ], ptr1[ i ] ); /* Q0 */
+ }
+ tmp_32 = SKP_SUB32( matrix_ptr( A, j, j, M ), tmp_32 );
+
+ if( tmp_32 < diag_min_value ) {
+ tmp_32 = SKP_SUB32( SKP_SMULBB( loop_count + 1, diag_min_value ), tmp_32 );
+ /* Matrix not positive semi-definite, or ill conditioned */
+ for( i = 0; i < M; i++ ) {
+ matrix_ptr( A, i, i, M ) = SKP_ADD32( matrix_ptr( A, i, i, M ), tmp_32 );
+ }
+ status = 1;
+ break;
+ }
+ D_Q0[ j ] = tmp_32; /* always < max(Correlation) */
+
+ /* two-step division */
+ one_div_diag_Q36 = SKP_INVERSE32_varQ( tmp_32, 36 ); /* Q36 */
+ one_div_diag_Q40 = SKP_LSHIFT( one_div_diag_Q36, 4 ); /* Q40 */
+ err = SKP_SUB32( 1 << 24, SKP_SMULWW( tmp_32, one_div_diag_Q40 ) ); /* Q24 */
+ one_div_diag_Q48 = SKP_SMULWW( err, one_div_diag_Q40 ); /* Q48 */
+
+ /* Save 1/Ds */
+ inv_D[ j ].Q36_part = one_div_diag_Q36;
+ inv_D[ j ].Q48_part = one_div_diag_Q48;
+
+ matrix_ptr( L_Q16, j, j, M ) = 65536; /* 1.0 in Q16 */
+ ptr1 = matrix_adr( A, j, 0, M );
+ ptr2 = matrix_adr( L_Q16, j + 1, 0, M );
+ for( i = j + 1; i < M; i++ ) {
+ tmp_32 = 0;
+ for( k = 0; k < j; k++ ) {
+ tmp_32 = SKP_SMLAWW( tmp_32, v_Q0[ k ], ptr2[ k ] ); /* Q0 */
+ }
+ tmp_32 = SKP_SUB32( ptr1[ i ], tmp_32 ); /* always < max(Correlation) */
+
+ /* tmp_32 / D_Q0[j] : Divide to Q16 */
+ matrix_ptr( L_Q16, i, j, M ) = SKP_ADD32( SKP_SMMUL( tmp_32, one_div_diag_Q48 ),
+ SKP_RSHIFT( SKP_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) );
+
+ /* go to next column */
+ ptr2 += M;
+ }
+ }
+ }
+
+ SKP_assert( status == 0 );
+}
+
+SKP_INLINE void SKP_Silk_LS_divide_Q16_FIX(
+ SKP_int32 T[], /* I/O Numenator vector */
+ inv_D_t *inv_D, /* I 1 / D vector */
+ SKP_int M /* I Order */
+)
+{
+ SKP_int i;
+ SKP_int32 tmp_32;
+ SKP_int32 one_div_diag_Q36, one_div_diag_Q48;
+
+ for( i = 0; i < M; i++ ) {
+ one_div_diag_Q36 = inv_D[ i ].Q36_part;
+ one_div_diag_Q48 = inv_D[ i ].Q48_part;
+
+ tmp_32 = T[ i ];
+ T[ i ] = SKP_ADD32( SKP_SMMUL( tmp_32, one_div_diag_Q48 ), SKP_RSHIFT( SKP_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) );
+ }
+}
+
+/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */
+SKP_INLINE void SKP_Silk_LS_SolveFirst_FIX(
+ const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
+ SKP_int M, /* I Dim of Matrix equation */
+ const SKP_int32 *b, /* I b Vector */
+ SKP_int32 *x_Q16 /* O x Vector */
+)
+{
+ SKP_int i, j;
+ const SKP_int32 *ptr32;
+ SKP_int32 tmp_32;
+
+ for( i = 0; i < M; i++ ) {
+ ptr32 = matrix_adr( L_Q16, i, 0, M );
+ tmp_32 = 0;
+ for( j = 0; j < i; j++ ) {
+ tmp_32 = SKP_SMLAWW( tmp_32, ptr32[ j ], x_Q16[ j ] );
+ }
+ x_Q16[ i ] = SKP_SUB32( b[ i ], tmp_32 );
+ }
+}
+
+/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */
+SKP_INLINE void SKP_Silk_LS_SolveLast_FIX(
+ const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */
+ const SKP_int M, /* I Dim of Matrix equation */
+ const SKP_int32 *b, /* I b Vector */
+ SKP_int32 *x_Q16 /* O x Vector */
+)
+{
+ SKP_int i, j;
+ const SKP_int32 *ptr32;
+ SKP_int32 tmp_32;
+
+ for( i = M - 1; i >= 0; i-- ) {
+ ptr32 = matrix_adr( L_Q16, 0, i, M );
+ tmp_32 = 0;
+ for( j = M - 1; j > i; j-- ) {
+ tmp_32 = SKP_SMLAWW( tmp_32, ptr32[ SKP_SMULBB( j, M ) ], x_Q16[ j ] );
+ }
+ x_Q16[ i ] = SKP_SUB32( b[ i ], tmp_32 );
+ }
+}
--- /dev/null
+++ b/src_FIX/SKP_Silk_structs_FIX.h
@@ -1,0 +1,159 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_STRUCTS_FIX_H
+#define SKP_SILK_STRUCTS_FIX_H
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_define_FIX.h"
+#include "SKP_Silk_main.h"
+#include "SKP_Silk_structs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/********************************/
+/* Noise shaping analysis state */
+/********************************/
+typedef struct {
+ SKP_int LastGainIndex;
+ SKP_int32 HarmBoost_smth_Q16;
+ SKP_int32 HarmShapeGain_smth_Q16;
+ SKP_int32 Tilt_smth_Q16;
+} SKP_Silk_shape_state_FIX;
+
+/********************************/
+/* Prefilter state */
+/********************************/
+typedef struct {
+ SKP_int16 sLTP_shp1[ LTP_BUF_LENGTH ];
+ SKP_int32 sAR_shp1[ MAX_SHAPE_LPC_ORDER + 1 ];
+ SKP_int32 sAR_shp2_Q14[ MAX_SHAPE_LPC_ORDER ];
+ SKP_int16 sLTP_shp2_FIX[ LTP_BUF_LENGTH ];
+ SKP_int sLTP_shp_buf_idx1;
+ SKP_int sAR_shp_buf_idx2;
+ SKP_int sLTP_shp_buf_idx2;
+ SKP_int32 sLF_AR_shp1_Q12;
+ SKP_int32 sLF_MA_shp1_Q12;
+ SKP_int32 sLF_AR_shp2_Q12;
+ SKP_int32 sLF_MA_shp2_Q12;
+ SKP_int sHarmHP;
+ SKP_int32 rand_seed;
+ SKP_int lagPrev;
+} SKP_Silk_prefilter_state_FIX;
+
+/*****************************/
+/* Prediction analysis state */
+/*****************************/
+typedef struct {
+ SKP_int pitch_LPC_win_length;
+ SKP_int min_pitch_lag; /* Lowest possible pitch lag (samples) */
+ SKP_int max_pitch_lag; /* Highest possible pitch lag (samples) */
+ SKP_int prev_NLSFq_Q15[ MAX_LPC_ORDER ]; /* Previously quantized NLSF vector */
+} SKP_Silk_predict_state_FIX;
+
+
+/********************************/
+/* Encoder state FIX */
+/********************************/
+typedef struct {
+ SKP_Silk_encoder_state sCmn; /* Common struct, shared with floating-point code */
+
+#if HIGH_PASS_INPUT
+ SKP_int32 variable_HP_smth1_Q15; /* State of first smoother */
+ SKP_int32 variable_HP_smth2_Q15; /* State of second smoother */
+#endif
+ SKP_Silk_shape_state_FIX sShape; /* Shape state */
+ SKP_Silk_prefilter_state_FIX sPrefilt; /* Prefilter State */
+ SKP_Silk_predict_state_FIX sPred; /* Prediction state */
+ SKP_Silk_nsq_state sNSQ; /* Noise Shape Quantizer State */
+ SKP_Silk_nsq_state sNSQ_LBRR; /* Noise Shape Quantizer State ( for low bitrate redundancy ) */
+
+ /* Buffer for find pitch and noise shape analysis */
+ SKP_array_of_int16_4_byte_aligned( x_buf, 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX );
+ SKP_int LTPCorr_Q15; /* Normalized correlation from pitch lag estimator */
+ SKP_int mu_LTP_Q8; /* Rate-distortion tradeoff in LTP quantization */
+ SKP_int32 SNR_dB_Q7; /* Quality setting */
+ SKP_int32 avgGain_Q16; /* average gain during active speech */
+ SKP_int32 avgGain_Q16_one_bit_per_sample; /* average gain during active speech */
+ SKP_int BufferedInChannel_ms; /* Simulated number of ms buffer because of exceeded TargetRate_bps */
+ SKP_int speech_activity_Q8; /* Speech activity in Q8 */
+ SKP_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */
+
+ /* Parameters For LTP scaling Control */
+ SKP_int prevLTPredCodGain_Q7;
+ SKP_int HPLTPredCodGain_Q7;
+
+ SKP_int32 inBandFEC_SNR_comp_Q8; /* Compensation to SNR_dB when using inband FEC Voiced */
+
+} SKP_Silk_encoder_state_FIX;
+
+/************************/
+/* Encoder control FIX */
+/************************/
+typedef struct {
+ SKP_Silk_encoder_control sCmn; /* Common struct, shared with floating-point code */
+
+ /* Prediction and coding parameters */
+ SKP_int32 Gains_Q16[ MAX_NB_SUBFR ];
+ SKP_array_of_int16_4_byte_aligned( PredCoef_Q12[ 2 ], MAX_LPC_ORDER );
+ SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ];
+ SKP_int LTP_scale_Q14;
+
+ /* Noise shaping parameters */
+ /* Testing */
+ SKP_array_of_int16_4_byte_aligned( AR1_Q13, MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER );
+ SKP_array_of_int16_4_byte_aligned( AR2_Q13, MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER );
+ SKP_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */
+ SKP_int GainsPre_Q14[ MAX_NB_SUBFR ];
+ SKP_int HarmBoost_Q14[ MAX_NB_SUBFR ];
+ SKP_int Tilt_Q14[ MAX_NB_SUBFR ];
+ SKP_int HarmShapeGain_Q14[ MAX_NB_SUBFR ];
+ SKP_int Lambda_Q10;
+ SKP_int input_quality_Q14;
+ SKP_int coding_quality_Q14;
+ SKP_int32 pitch_freq_low_Hz;
+ SKP_int current_SNR_dB_Q7;
+
+ /* measures */
+ SKP_int sparseness_Q8;
+ SKP_int LTPredCodGain_Q7;
+ SKP_int input_quality_bands_Q15[ VAD_N_BANDS ];
+ SKP_int input_tilt_Q15;
+ SKP_int32 ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */
+ SKP_int ResNrgQ[ MAX_NB_SUBFR ]; /* Q domain for the residual energy > 0 */
+
+} SKP_Silk_encoder_control_FIX;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_FIX/SKP_Silk_warped_autocorrelation_FIX.c
@@ -1,0 +1,82 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FIX.h"
+
+#define QC 10
+
+/* Autocorrelations for a warped frequency axis */
+void SKP_Silk_warped_autocorrelation_FIX(
+ SKP_int32 *corr, /* O Result [order + 1] */
+ SKP_int *scale, /* O Scaling of the correlation vector */
+ const SKP_int16 *input, /* I Input data to correlate */
+ const SKP_int16 warping_Q16, /* I Warping coefficient */
+ const SKP_int length, /* I Length of input */
+ const SKP_int order /* I Correlation order (even) */
+)
+{
+ SKP_int n, i, lsh;
+ SKP_int32 tmp1_Q16, tmp2_Q16;
+ SKP_int32 state_Q16[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
+ SKP_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
+
+ /* Order must be even */
+ SKP_assert( ( order & 1 ) == 0 );
+
+ /* Loop over samples */
+ for( n = 0; n < length; n++ ) {
+ tmp1_Q16 = SKP_LSHIFT32( ( SKP_int32 )input[ n ], 16 );
+ /* Loop over allpass sections */
+ for( i = 0; i < order; i += 2 ) {
+ /* Output of allpass section */
+ tmp2_Q16 = SKP_SMLAWB( state_Q16[ i ], state_Q16[ i + 1 ] - tmp1_Q16, warping_Q16 );
+ state_Q16[ i ] = tmp1_Q16;
+ corr_QC[ i ] += SKP_RSHIFT64( SKP_SMULL( tmp1_Q16, state_Q16[ 0 ] ), 32 - QC );
+ /* Output of allpass section */
+ tmp1_Q16 = SKP_SMLAWB( state_Q16[ i + 1 ], state_Q16[ i + 2 ] - tmp2_Q16, warping_Q16 );
+ state_Q16[ i + 1 ] = tmp2_Q16;
+ corr_QC[ i + 1 ] += SKP_RSHIFT64( SKP_SMULL( tmp2_Q16, state_Q16[ 0 ] ), 32 - QC );
+ }
+ state_Q16[ order ] = tmp1_Q16;
+ corr_QC[ order ] += SKP_RSHIFT64( SKP_SMULL( tmp1_Q16, state_Q16[ 0 ] ), 32 - QC );
+ }
+
+ lsh = SKP_Silk_CLZ64( corr_QC[ 0 ] ) - 35;
+ lsh = SKP_LIMIT( lsh, -12 - QC, 30 - QC );
+ *scale = -( QC + lsh );
+ SKP_assert( *scale >= -30 && *scale <= 12 );
+ if( lsh >= 0 ) {
+ for( i = 0; i < order + 1; i++ ) {
+ corr[ i ] = ( SKP_int32 )SKP_CHECK_FIT32( SKP_LSHIFT64( corr_QC[ i ], lsh ) );
+ }
+ } else {
+ for( i = 0; i < order + 1; i++ ) {
+ corr[ i ] = ( SKP_int32 )SKP_CHECK_FIT32( SKP_RSHIFT64( corr_QC[ i ], -lsh ) );
+ }
+ }
+ SKP_assert( corr_QC[ 0 ] >= 0 ); // If breaking, decrease QC
+}
--- /dev/null
+++ b/src_FIX/Silk_FIX.vcproj
@@ -1,0 +1,288 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="Silk_FIX"
+ ProjectGUID="{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
+ RootNamespace="Silk"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories=""../../../celt-0.8.0/libcelt";../interface;../src_common;../src_SigProc_FIX"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_FIX_Win32_debug.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories=""../../../celt-0.8.0/libcelt";../interface;../src_common;../src_SigProc_FIX"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;HAVE_CONFIG_H"
+ GeneratePreprocessedFile="0"
+ RuntimeLibrary="0"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_FIX_Win32_mt.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_control_codec_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_corrMatrix_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_encode_frame_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_LPC_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_LTP_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_pitch_lags_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_pred_coefs_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_HP_variable_cutoff_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_init_encoder_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LTP_analysis_filter_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LTP_scale_ctrl_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_MSVQ_encode_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_VQ_rate_distortion_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_VQ_sum_error_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_noise_shape_analysis_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_prefilter_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_process_gains_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_process_NLSFs_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_quant_LTP_gains_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_regularize_correlations_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_residual_energy16_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_residual_energy_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_solve_LS_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_VQ_nearest_neighbor_FIX.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_warped_autocorrelation_FIX.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_define_FIX.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_main_FIX.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_perceptual_parameters_FIX.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_structs_FIX.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+++ b/src_FLP/SKP_Silk_HP_variable_cutoff_FLP.c
@@ -1,0 +1,103 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+#if HIGH_PASS_INPUT
+
+/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */
+void SKP_Silk_HP_variable_cutoff_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_int16 *out, /* O High-pass filtered output signal */
+ const SKP_int16 *in /* I Input signal */
+)
+{
+ SKP_float pitch_freq_Hz, pitch_freq_log, quality, delta_freq, smth_coef, Fc, r;
+ SKP_int32 B_Q28[ 3 ], A_Q28[ 2 ];
+
+ /*********************************************/
+ /* Estimate low end of pitch frequency range */
+ /*********************************************/
+ if( psEnc->sCmn.prev_sigtype == SIG_TYPE_VOICED ) {
+
+ /* Difference, in log domain */
+ pitch_freq_Hz = 1e3f * psEnc->sCmn.fs_kHz / psEnc->sCmn.prevLag;
+ pitch_freq_log = SKP_Silk_log2( pitch_freq_Hz );
+
+ /* Adjustment based on quality */
+ quality = psEncCtrl->input_quality_bands[ 0 ];
+ pitch_freq_log -= quality * quality * ( pitch_freq_log - SKP_Silk_log2( VARIABLE_HP_MIN_FREQ ) );
+ pitch_freq_log += 0.5f * ( 0.6f - quality );
+
+ delta_freq = pitch_freq_log - psEnc->variable_HP_smth1;
+ if( delta_freq < 0.0 ) {
+ /* Less smoothing for decreasing pitch frequency, to track something close to the minimum */
+ delta_freq *= 3.0f;
+ }
+
+ /* Limit delta, to reduce impact of outliers */
+ delta_freq = SKP_LIMIT_float( delta_freq, -VARIABLE_HP_MAX_DELTA_FREQ, VARIABLE_HP_MAX_DELTA_FREQ );
+
+ /* Update smoother */
+ smth_coef = VARIABLE_HP_SMTH_COEF1 * psEnc->speech_activity;
+ psEnc->variable_HP_smth1 += smth_coef * delta_freq;
+ }
+
+ /* Second smoother */
+ psEnc->variable_HP_smth2 += VARIABLE_HP_SMTH_COEF2 * ( psEnc->variable_HP_smth1 - psEnc->variable_HP_smth2 );
+
+ /* Convert from log scale to Hertz */
+ psEncCtrl->pitch_freq_low_Hz = ( SKP_float )pow( 2.0, psEnc->variable_HP_smth2 );
+
+ /* Limit frequency range */
+ psEncCtrl->pitch_freq_low_Hz = SKP_LIMIT_float( psEncCtrl->pitch_freq_low_Hz, VARIABLE_HP_MIN_FREQ, VARIABLE_HP_MAX_FREQ );
+
+ /*******************************/
+ /* Compute filter coefficients */
+ /*******************************/
+ /* Compute cut-off frequency, in radians */
+ Fc = ( SKP_float )( 0.45f * 2.0f * 3.14159265359 * psEncCtrl->pitch_freq_low_Hz / ( 1e3f * psEnc->sCmn.fs_kHz ) );
+
+ /* 2nd order ARMA coefficients */
+ r = 1.0f - 0.92f * Fc;
+
+ /* b = r * [1; -2; 1]; */
+ /* a = [1; -2 * r * (1 - 0.5 * Fc^2); r^2]; */
+ B_Q28[ 0 ] = SKP_float2int( ( 1 << 28 ) * r );
+ B_Q28[ 1 ] = SKP_float2int( ( 1 << 28 ) * -2.0f * r );
+ B_Q28[ 2 ] = B_Q28[ 0 ];
+ A_Q28[ 0 ] = SKP_float2int( ( 1 << 28 ) * -2.0f * r * ( 1.0f - 0.5f * Fc * Fc ) );
+ A_Q28[ 1 ] = SKP_float2int( ( 1 << 28 ) * r * r );
+
+ /********************/
+ /* High-pass filter */
+ /********************/
+ SKP_Silk_biquad_alt( in, B_Q28, A_Q28, psEnc->sCmn.In_HP_State, out, psEnc->sCmn.frame_length );
+}
+
+#endif // HIGH_PASS_INPUT
--- /dev/null
+++ b/src_FLP/SKP_Silk_LPC_analysis_filter_FLP.c
@@ -1,0 +1,206 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include <stdlib.h>
+#include "SKP_Silk_main_FLP.h"
+
+/*******************************************/
+/* LPC analysis filter */
+/* NB! State is kept internally and the */
+/* filter always starts with zero state */
+/* first Order output samples are not set */
+/*******************************************/
+
+void SKP_Silk_LPC_analysis_filter_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length, /* I Length of input signal */
+ const SKP_int Order /* I LPC order */
+)
+{
+ SKP_assert( Order <= length );
+
+ switch( Order ) {
+ case 8:
+ SKP_Silk_LPC_analysis_filter8_FLP( r_LPC, PredCoef, s, length );
+ break;
+
+ case 10:
+ SKP_Silk_LPC_analysis_filter10_FLP( r_LPC, PredCoef, s, length );
+ break;
+
+ case 12:
+ SKP_Silk_LPC_analysis_filter12_FLP( r_LPC, PredCoef, s, length );
+ break;
+
+ case 16:
+ SKP_Silk_LPC_analysis_filter16_FLP( r_LPC, PredCoef, s, length );
+ break;
+
+ default:
+ SKP_assert( 0 );
+ break;
+ }
+
+ /* Set first LPC Order samples to zero instead of undefined */
+ SKP_memset( r_LPC, 0, Order * sizeof( SKP_float ) );
+}
+
+/* 16th order LPC analysis filter, does not write first 16 samples */
+void SKP_Silk_LPC_analysis_filter16_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+)
+{
+ SKP_int ix = 16;
+ SKP_float LPC_pred;
+ const SKP_float *s_ptr;
+
+ for ( ; ix < length; ix++) {
+ s_ptr = &s[ix - 1];
+
+ /* short-term prediction */
+ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] +
+ s_ptr[-1] * PredCoef[ 1 ] +
+ s_ptr[-2] * PredCoef[ 2 ] +
+ s_ptr[-3] * PredCoef[ 3 ] +
+ s_ptr[-4] * PredCoef[ 4 ] +
+ s_ptr[-5] * PredCoef[ 5 ] +
+ s_ptr[-6] * PredCoef[ 6 ] +
+ s_ptr[-7] * PredCoef[ 7 ] +
+ s_ptr[-8] * PredCoef[ 8 ] +
+ s_ptr[-9] * PredCoef[ 9 ] +
+ s_ptr[-10] * PredCoef[ 10 ] +
+ s_ptr[-11] * PredCoef[ 11 ] +
+ s_ptr[-12] * PredCoef[ 12 ] +
+ s_ptr[-13] * PredCoef[ 13 ] +
+ s_ptr[-14] * PredCoef[ 14 ] +
+ s_ptr[-15] * PredCoef[ 15 ];
+
+ /* prediction error */
+ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred;
+ }
+}
+
+/* 12th order LPC analysis filter, does not write first 12 samples */
+void SKP_Silk_LPC_analysis_filter12_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+)
+{
+ SKP_int ix = 12;
+ SKP_float LPC_pred;
+ const SKP_float *s_ptr;
+
+ for ( ; ix < length; ix++) {
+ s_ptr = &s[ix - 1];
+
+ /* short-term prediction */
+ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] +
+ s_ptr[-1] * PredCoef[ 1 ] +
+ s_ptr[-2] * PredCoef[ 2 ] +
+ s_ptr[-3] * PredCoef[ 3 ] +
+ s_ptr[-4] * PredCoef[ 4 ] +
+ s_ptr[-5] * PredCoef[ 5 ] +
+ s_ptr[-6] * PredCoef[ 6 ] +
+ s_ptr[-7] * PredCoef[ 7 ] +
+ s_ptr[-8] * PredCoef[ 8 ] +
+ s_ptr[-9] * PredCoef[ 9 ] +
+ s_ptr[-10] * PredCoef[ 10 ] +
+ s_ptr[-11] * PredCoef[ 11 ];
+
+ /* prediction error */
+ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred;
+ }
+}
+
+/* 10th order LPC analysis filter, does not write first 10 samples */
+void SKP_Silk_LPC_analysis_filter10_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+)
+{
+ SKP_int ix = 10;
+ SKP_float LPC_pred;
+ const SKP_float *s_ptr;
+
+ for ( ; ix < length; ix++) {
+ s_ptr = &s[ix - 1];
+
+ /* short-term prediction */
+ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] +
+ s_ptr[-1] * PredCoef[ 1 ] +
+ s_ptr[-2] * PredCoef[ 2 ] +
+ s_ptr[-3] * PredCoef[ 3 ] +
+ s_ptr[-4] * PredCoef[ 4 ] +
+ s_ptr[-5] * PredCoef[ 5 ] +
+ s_ptr[-6] * PredCoef[ 6 ] +
+ s_ptr[-7] * PredCoef[ 7 ] +
+ s_ptr[-8] * PredCoef[ 8 ] +
+ s_ptr[-9] * PredCoef[ 9 ];
+
+ /* prediction error */
+ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred;
+ }
+}
+
+/* 8th order LPC analysis filter, does not write first 8 samples */
+void SKP_Silk_LPC_analysis_filter8_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+)
+{
+ SKP_int ix = 8;
+ SKP_float LPC_pred;
+ const SKP_float *s_ptr;
+
+ for ( ; ix < length; ix++) {
+ s_ptr = &s[ix - 1];
+
+ /* short-term prediction */
+ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] +
+ s_ptr[ -1 ] * PredCoef[ 1 ] +
+ s_ptr[ -2 ] * PredCoef[ 2 ] +
+ s_ptr[ -3 ] * PredCoef[ 3 ] +
+ s_ptr[ -4 ] * PredCoef[ 4 ] +
+ s_ptr[ -5 ] * PredCoef[ 5 ] +
+ s_ptr[ -6 ] * PredCoef[ 6 ] +
+ s_ptr[ -7 ] * PredCoef[ 7 ];
+
+ /* prediction error */
+ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_LTP_analysis_filter_FLP.c
@@ -1,0 +1,71 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+void SKP_Silk_LTP_analysis_filter_FLP(
+ SKP_float *LTP_res, /* O LTP res MAX_NB_SUBFR*(pre_lgth+subfr_lngth) */
+ const SKP_float *x, /* I Input signal, with preceeding samples */
+ const SKP_float B[ LTP_ORDER * MAX_NB_SUBFR ], /* I LTP coefficients for each subframe */
+ const SKP_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */
+ const SKP_float invGains[ MAX_NB_SUBFR ], /* I Inverse quantization gains */
+ const SKP_int subfr_length, /* I Length of each subframe */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int pre_length /* I Preceeding samples for each subframe */
+)
+{
+ const SKP_float *x_ptr, *x_lag_ptr;
+ SKP_float Btmp[ LTP_ORDER ];
+ SKP_float *LTP_res_ptr;
+ SKP_float inv_gain;
+ SKP_int k, i, j;
+
+ x_ptr = x;
+ LTP_res_ptr = LTP_res;
+ for( k = 0; k < nb_subfr; k++ ) {
+ x_lag_ptr = x_ptr - pitchL[ k ];
+ inv_gain = invGains[ k ];
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ Btmp[ i ] = B[ k * LTP_ORDER + i ];
+ }
+
+ /* LTP analysis FIR filter */
+ for( i = 0; i < subfr_length + pre_length; i++ ) {
+ LTP_res_ptr[ i ] = x_ptr[ i ];
+ /* Subtract long-term prediction */
+ for( j = 0; j < LTP_ORDER; j++ ) {
+ LTP_res_ptr[ i ] -= Btmp[ j ] * x_lag_ptr[ LTP_ORDER / 2 - j ];
+ }
+ LTP_res_ptr[ i ] *= inv_gain;
+ x_lag_ptr++;
+ }
+
+ /* Update pointers */
+ LTP_res_ptr += subfr_length + pre_length;
+ x_ptr += subfr_length;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c
@@ -1,0 +1,84 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+#define NB_THRESHOLDS 11
+/* Table containing trained thresholds for LTP scaling */
+static const SKP_float LTPScaleThresholds[ NB_THRESHOLDS ] =
+{
+ 0.95f, 0.8f, 0.50f, 0.400f, 0.3f, 0.2f,
+ 0.15f, 0.1f, 0.08f, 0.075f, 0.0f
+};
+
+
+void SKP_Silk_LTP_scale_ctrl_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */
+)
+{
+ SKP_int round_loss, frames_per_packet;
+ SKP_float g_out, g_limit, thrld1, thrld2;
+
+ /* 1st order high-pass filter */
+ //g_HP(n) = g(n) - g(n-1) + 0.5 * g_HP(n-1); // tune the 0.5: higher means longer impact of jump
+ psEnc->HPLTPredCodGain = SKP_max_float( psEncCtrl->LTPredCodGain - psEnc->prevLTPredCodGain, 0.0f )
+ + 0.5f * psEnc->HPLTPredCodGain;
+
+ psEnc->prevLTPredCodGain = psEncCtrl->LTPredCodGain;
+
+ /* combine input and filtered input */
+ g_out = 0.5f * psEncCtrl->LTPredCodGain + ( 1.0f - 0.5f ) * psEnc->HPLTPredCodGain;
+ g_limit = SKP_sigmoid( 0.5f * ( g_out - 6 ) );
+
+
+ /* Default is minimum scaling */
+ psEncCtrl->sCmn.LTP_scaleIndex = 0;
+
+ /* Round the loss measure to whole pct */
+ round_loss = ( SKP_int )( psEnc->sCmn.PacketLoss_perc );
+ round_loss = SKP_max( 0, round_loss );
+
+ /* Only scale if first frame in packet 0% */
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ){
+
+ frames_per_packet = psEnc->sCmn.PacketSize_ms / ( SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr );
+
+ round_loss += ( frames_per_packet - 1 );
+ thrld1 = LTPScaleThresholds[ SKP_min_int( round_loss, NB_THRESHOLDS - 1 ) ];
+ thrld2 = LTPScaleThresholds[ SKP_min_int( round_loss + 1, NB_THRESHOLDS - 1 ) ];
+
+ if( g_limit > thrld1 ) {
+ /* High Scaling */
+ psEncCtrl->sCmn.LTP_scaleIndex = 2;
+ } else if( g_limit > thrld2 ) {
+ /* Middle Scaling */
+ psEncCtrl->sCmn.LTP_scaleIndex = 1;
+ }
+ }
+ psEncCtrl->LTP_scale = ( SKP_float)SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ] / 16384.0f;
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_NLSF_MSVQ_decode_FLP.c
@@ -1,0 +1,90 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* NLSF vector decoder */
+void SKP_Silk_NLSF_MSVQ_decode_FLP(
+ SKP_float *pNLSF, /* O Decoded output vector [ LPC_ORDER ] */
+ const SKP_Silk_NLSF_CB_FLP *psNLSF_CB_FLP, /* I NLSF codebook struct */
+ const SKP_int *NLSFIndices, /* I NLSF indices [ nStages ] */
+ const SKP_int LPC_order /* I LPC order used */
+)
+{
+ const SKP_float *pCB_element;
+ SKP_int s;
+ SKP_int i;
+
+
+ /* Check that each index is within valid range */
+ SKP_assert( 0 <= NLSFIndices[ 0 ] && NLSFIndices[ 0 ] < psNLSF_CB_FLP->CBStages[ 0 ].nVectors );
+
+ /* Point to the first vector element */
+ pCB_element = &psNLSF_CB_FLP->CBStages[ 0 ].CB[ SKP_MUL( NLSFIndices[ 0 ], LPC_order ) ];
+
+ /* Initialize with the codebook vector from stage 0 */
+ SKP_memcpy( pNLSF, pCB_element, LPC_order * sizeof( SKP_float ) );
+
+ for( s = 1; s < psNLSF_CB_FLP->nStages; s++ ) {
+ /* Check that each index is within valid range */
+ SKP_assert( 0 <= NLSFIndices[ s ] && NLSFIndices[ s ] < psNLSF_CB_FLP->CBStages[ s ].nVectors );
+
+ if( LPC_order == 16 ) {
+ /* Point to the first vector element */
+ pCB_element = &psNLSF_CB_FLP->CBStages[ s ].CB[ SKP_LSHIFT( NLSFIndices[ s ], 4 ) ];
+
+ /* Add the codebook vector from the current stage */
+ pNLSF[ 0 ] += pCB_element[ 0 ];
+ pNLSF[ 1 ] += pCB_element[ 1 ];
+ pNLSF[ 2 ] += pCB_element[ 2 ];
+ pNLSF[ 3 ] += pCB_element[ 3 ];
+ pNLSF[ 4 ] += pCB_element[ 4 ];
+ pNLSF[ 5 ] += pCB_element[ 5 ];
+ pNLSF[ 6 ] += pCB_element[ 6 ];
+ pNLSF[ 7 ] += pCB_element[ 7 ];
+ pNLSF[ 8 ] += pCB_element[ 8 ];
+ pNLSF[ 9 ] += pCB_element[ 9 ];
+ pNLSF[ 10 ] += pCB_element[ 10 ];
+ pNLSF[ 11 ] += pCB_element[ 11 ];
+ pNLSF[ 12 ] += pCB_element[ 12 ];
+ pNLSF[ 13 ] += pCB_element[ 13 ];
+ pNLSF[ 14 ] += pCB_element[ 14 ];
+ pNLSF[ 15 ] += pCB_element[ 15 ];
+ } else {
+ /* Point to the first vector element */
+ pCB_element = &psNLSF_CB_FLP->CBStages[ s ].CB[ NLSFIndices[ s ] * LPC_order ];
+
+ /* Add the codebook vector from the current stage */
+ for( i = 0; i < LPC_order; i++ ) {
+ pNLSF[ i ] += pCB_element[ i ];
+ }
+ }
+ }
+
+ /* NLSF stabilization */
+ SKP_Silk_NLSF_stabilize_FLP( pNLSF, psNLSF_CB_FLP->NDeltaMin, LPC_order );
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_NLSF_MSVQ_encode_FLP.c
@@ -1,0 +1,225 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/***********************/
+/* NLSF vector encoder */
+/***********************/
+void SKP_Silk_NLSF_MSVQ_encode_FLP(
+ SKP_int *NLSFIndices, /* O Codebook path vector [ CB_STAGES ] */
+ SKP_float *pNLSF, /* I/O Quantized NLSF vector [ LPC_ORDER ] */
+ const SKP_Silk_NLSF_CB_FLP *psNLSF_CB_FLP, /* I Codebook object */
+ const SKP_float *pNLSF_q_prev, /* I Prev. quantized NLSF vector [LPC_ORDER] */
+ const SKP_float *pW, /* I NLSF weight vector [ LPC_ORDER ] */
+ const SKP_float NLSF_mu, /* I Rate weight for the RD optimization */
+ const SKP_float NLSF_mu_fluc_red, /* I Fluctuation reduction error weight */
+ const SKP_int NLSF_MSVQ_Survivors,/* I Max survivors from each stage */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_int deactivate_fluc_red /* I Deactivate fluctuation reduction */
+)
+{
+ SKP_int i, s, k, cur_survivors, prev_survivors, input_index, cb_index, bestIndex;
+ SKP_float se, wsse, rateDistThreshold, bestRateDist;
+ SKP_float pNLSF_in[ MAX_LPC_ORDER ];
+
+#if( LOW_COMPLEXITY_ONLY == 1 )
+ SKP_float pRateDist[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE ];
+ SKP_float pRate[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
+ SKP_float pRate_new[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
+ SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ];
+ SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_float pRes[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ];
+ SKP_float pRes_new[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ];
+#else
+ SKP_float pRateDist[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED ];
+ SKP_float pRate[ MAX_NLSF_MSVQ_SURVIVORS ];
+ SKP_float pRate_new[ MAX_NLSF_MSVQ_SURVIVORS ];
+ SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS ];
+ SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_float pRes[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];
+ SKP_float pRes_new[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ];
+#endif
+
+ const SKP_float *pConstFloat;
+ SKP_float *pFloat;
+ const SKP_int *pConstInt;
+ SKP_int *pInt;
+ const SKP_float *pCB_element;
+ const SKP_Silk_NLSF_CBS_FLP *pCurrentCBStage;
+
+ SKP_assert( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS );
+ SKP_assert( ( LOW_COMPLEXITY_ONLY == 0 ) || ( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ) );
+
+ cur_survivors = NLSF_MSVQ_Survivors;
+
+
+
+ /* Copy the input vector */
+ SKP_memcpy( pNLSF_in, pNLSF, LPC_order * sizeof(SKP_float) );
+
+ /****************************************************/
+ /* Tree search for the multi-stage vector quantizer */
+ /****************************************************/
+
+ /* Clear accumulated rates */
+ SKP_memset( pRate, 0, NLSF_MSVQ_Survivors * sizeof( SKP_float ) );
+
+ /* Copy NLSFs into residual signal vector */
+ SKP_memcpy( pRes, pNLSF, LPC_order * sizeof( SKP_float ) );
+
+ /* Set first stage values */
+ prev_survivors = 1;
+
+ /* Loop over all stages */
+ for( s = 0; s < psNLSF_CB_FLP->nStages; s++ ) {
+
+ /* Set a pointer to the current stage codebook */
+ pCurrentCBStage = &psNLSF_CB_FLP->CBStages[ s ];
+
+ /* Calculate the number of survivors in the current stage */
+ cur_survivors = SKP_min_32( NLSF_MSVQ_Survivors, prev_survivors * pCurrentCBStage->nVectors );
+
+#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 0 )
+ /* Find a single best survivor in the last stage, if we */
+ /* do not need candidates for fluctuation reduction */
+ if( s == psNLSF_CB_FLP->nStages - 1 ) {
+ cur_survivors = 1;
+ }
+#endif
+ /* Nearest neighbor clustering for multiple input data vectors */
+ SKP_Silk_NLSF_VQ_rate_distortion_FLP( pRateDist, pCurrentCBStage, pRes, pW, pRate, NLSF_mu, prev_survivors, LPC_order );
+
+ /* Sort the rate-distortion errors */
+ SKP_Silk_insertion_sort_increasing_FLP( pRateDist, pTempIndices, prev_survivors * pCurrentCBStage->nVectors, cur_survivors );
+
+ /* Discard survivors with rate-distortion values too far above the best one */
+ rateDistThreshold = NLSF_MSVQ_SURV_MAX_REL_RD * pRateDist[ 0 ];
+ while( pRateDist[ cur_survivors - 1 ] > rateDistThreshold && cur_survivors > 1 ) {
+ cur_survivors--;
+ }
+
+ /* Update accumulated codebook contributions for the 'cur_survivors' best codebook indices */
+ for( k = 0; k < cur_survivors; k++ ) {
+ if( s > 0 ) {
+ /* Find the indices of the input and the codebook vector */
+ if( pCurrentCBStage->nVectors == 8 ) {
+ input_index = SKP_RSHIFT( pTempIndices[ k ], 3 );
+ cb_index = pTempIndices[ k ] & 7;
+ } else {
+ input_index = pTempIndices[ k ] / pCurrentCBStage->nVectors;
+ cb_index = pTempIndices[ k ] - input_index * pCurrentCBStage->nVectors;
+ }
+ } else {
+ /* Find the indices of the input and the codebook vector */
+ input_index = 0;
+ cb_index = pTempIndices[ k ];
+ }
+
+ /* Subtract new contribution from the previous residual vector for each of 'cur_survivors' */
+ pConstFloat = &pRes[ input_index * LPC_order ];
+ pCB_element = &pCurrentCBStage->CB[ cb_index * LPC_order ];
+ pFloat = &pRes_new[ k * LPC_order ];
+ for( i = 0; i < LPC_order; i++ ) {
+ pFloat[ i ] = pConstFloat[ i ] - pCB_element[ i ];
+ }
+
+ /* Update accumulated rate for stage 1 to the current */
+ pRate_new[ k ] = pRate[ input_index ] + pCurrentCBStage->Rates[ cb_index ];
+
+ /* Copy paths from previous matrix, starting with the best path */
+ pConstInt = &pPath[ input_index * psNLSF_CB_FLP->nStages ];
+ pInt = &pPath_new[ k * psNLSF_CB_FLP->nStages ];
+ for( i = 0; i < s; i++ ) {
+ pInt[ i ] = pConstInt[ i ];
+ }
+ /* Write the current stage indices for the 'cur_survivors' to the best path matrix */
+ pInt[ s ] = cb_index;
+ }
+
+ if( s < psNLSF_CB_FLP->nStages - 1 ) {
+ /* Copy NLSF residual matrix for next stage */
+ SKP_memcpy(pRes, pRes_new, cur_survivors * LPC_order * sizeof( SKP_float ) );
+
+ /* Copy rate vector for next stage */
+ SKP_memcpy(pRate, pRate_new, cur_survivors * sizeof( SKP_float ) );
+
+ /* Copy best path matrix for next stage */
+ SKP_memcpy(pPath, pPath_new, cur_survivors * psNLSF_CB_FLP->nStages * sizeof( SKP_int ) );
+ }
+
+ prev_survivors = cur_survivors;
+ }
+
+ /* (Preliminary) index of the best survivor, later to be decoded */
+ bestIndex = 0;
+
+#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 1 )
+ /******************************/
+ /* NLSF fluctuation reduction */
+ /******************************/
+ if( deactivate_fluc_red != 1 ) {
+
+ /* Search among all survivors, now taking also weighted fluctuation errors into account */
+ bestRateDist = SKP_float_MAX;
+ for( s = 0; s < cur_survivors; s++ ) {
+ /* Decode survivor to compare with previous quantized NLSF vector */
+ SKP_Silk_NLSF_MSVQ_decode_FLP( pNLSF, psNLSF_CB_FLP, &pPath_new[ s * psNLSF_CB_FLP->nStages ], LPC_order );
+
+ /* Compare decoded NLSF vector with the previously quantized vector */
+ wsse = 0;
+ for( i = 0; i < LPC_order; i += 2 ) {
+ /* Compute weighted squared quantization error for index i */
+ se = pNLSF[ i ] - pNLSF_q_prev[ i ];
+ wsse += pW[ i ] * se * se;
+
+ /* Compute weighted squared quantization error for index i + 1 */
+ se = pNLSF[ i + 1 ] - pNLSF_q_prev[ i + 1 ];
+ wsse += pW[ i + 1 ] * se * se;
+ }
+
+ /* Add the fluctuation reduction penalty to the rate distortion error */
+ wsse = pRateDist[s] + wsse * NLSF_mu_fluc_red;
+
+ /* Keep index of best survivor */
+ if( wsse < bestRateDist ) {
+ bestRateDist = wsse;
+ bestIndex = s;
+ }
+ }
+ }
+#endif
+
+ /* Copy best path to output argument */
+ SKP_memcpy( NLSFIndices, &pPath_new[ bestIndex * psNLSF_CB_FLP->nStages ], psNLSF_CB_FLP->nStages * sizeof( SKP_int ) );
+
+ /* Decode and stabilize the best survivor */
+ SKP_Silk_NLSF_MSVQ_decode_FLP( pNLSF, psNLSF_CB_FLP, NLSFIndices, LPC_order );
+
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_NLSF_VQ_rate_distortion_FLP.c
@@ -1,0 +1,57 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* Rate-Distortion calculations for multiple input data vectors */
+void SKP_Silk_NLSF_VQ_rate_distortion_FLP(
+ SKP_float *pRD, /* O Rate-distortion values [psNLSF_CBS_FLP->nVectors*N] */
+ const SKP_Silk_NLSF_CBS_FLP *psNLSF_CBS_FLP, /* I NLSF codebook stage struct */
+ const SKP_float *in, /* I Input vectors to be quantized */
+ const SKP_float *w, /* I Weight vector */
+ const SKP_float *rate_acc, /* I Accumulated rates from previous stage */
+ const SKP_float mu, /* I Weight between weighted error and rate */
+ const SKP_int N, /* I Number of input vectors to be quantized */
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_float *pRD_vec;
+ SKP_int i, n;
+
+ /* Compute weighted quantization errors for all input vectors over one codebook stage */
+ SKP_Silk_NLSF_VQ_sum_error_FLP( pRD, in, w, psNLSF_CBS_FLP->CB, N, psNLSF_CBS_FLP->nVectors, LPC_order );
+
+ /* Loop over input vectors */
+ pRD_vec = pRD;
+ for( n = 0; n < N; n++ ) {
+ /* Add rate cost to error for each codebook vector */
+ for( i = 0; i < psNLSF_CBS_FLP->nVectors; i++ ) {
+ pRD_vec[ i ] += mu * ( rate_acc[n] + psNLSF_CBS_FLP->Rates[ i ] );
+ }
+ pRD_vec += psNLSF_CBS_FLP->nVectors;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_NLSF_VQ_sum_error_FLP.c
@@ -1,0 +1,132 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* compute weighted quantization errors for LPC_order element input vectors, over one codebook stage */
+void SKP_Silk_NLSF_VQ_sum_error_FLP(
+ SKP_float *err, /* O Weighted quantization errors [ N * K ] */
+ const SKP_float *in, /* I Input vectors [ N * LPC_order ] */
+ const SKP_float *w, /* I Weighting vectors [ N * LPC_order ] */
+ const SKP_float *pCB, /* I Codebook vectors [ K * LPC_order ] */
+ const SKP_int N, /* I Number of input vectors */
+ const SKP_int K, /* I Number of codebook vectors */
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_int i, n;
+ SKP_float diff, sum_error;
+ SKP_float Wcpy[ MAX_LPC_ORDER ];
+ const SKP_float *cb_vec;
+
+ /* Copy to local stack */
+ SKP_memcpy( Wcpy, w, LPC_order * sizeof( SKP_float ) );
+
+ if( LPC_order == 16 ) {
+ /* Loop over input vectors */
+ for( n = 0; n < N; n++ ) {
+ /* Loop over codebook */
+ cb_vec = pCB;
+ for( i = 0; i < K; i++ ) {
+ /* Compute weighted squared quantization error */
+ diff = in[ 0 ] - cb_vec[ 0 ];
+ sum_error = Wcpy[ 0 ] * diff * diff;
+ diff = in[ 1 ] - cb_vec[ 1 ];
+ sum_error += Wcpy[ 1 ] * diff * diff;
+ diff = in[ 2 ] - cb_vec[ 2 ];
+ sum_error += Wcpy[ 2 ] * diff * diff;
+ diff = in[ 3 ] - cb_vec[ 3 ];
+ sum_error += Wcpy[ 3 ] * diff * diff;
+ diff = in[ 4 ] - cb_vec[ 4 ];
+ sum_error += Wcpy[ 4 ] * diff * diff;
+ diff = in[ 5 ] - cb_vec[ 5 ];
+ sum_error += Wcpy[ 5 ] * diff * diff;
+ diff = in[ 6 ] - cb_vec[ 6 ];
+ sum_error += Wcpy[ 6 ] * diff * diff;
+ diff = in[ 7 ] - cb_vec[ 7 ];
+ sum_error += Wcpy[ 7 ] * diff * diff;
+ diff = in[ 8 ] - cb_vec[ 8 ];
+ sum_error += Wcpy[ 8 ] * diff * diff;
+ diff = in[ 9 ] - cb_vec[ 9 ];
+ sum_error += Wcpy[ 9 ] * diff * diff;
+ diff = in[ 10 ] - cb_vec[ 10 ];
+ sum_error += Wcpy[ 10 ] * diff * diff;
+ diff = in[ 11 ] - cb_vec[ 11 ];
+ sum_error += Wcpy[ 11 ] * diff * diff;
+ diff = in[ 12 ] - cb_vec[ 12 ];
+ sum_error += Wcpy[ 12 ] * diff * diff;
+ diff = in[ 13 ] - cb_vec[ 13 ];
+ sum_error += Wcpy[ 13 ] * diff * diff;
+ diff = in[ 14 ] - cb_vec[ 14 ];
+ sum_error += Wcpy[ 14 ] * diff * diff;
+ diff = in[ 15 ] - cb_vec[ 15 ];
+ sum_error += Wcpy[ 15 ] * diff * diff;
+
+ err[ i ] = sum_error;
+ cb_vec += 16;
+ }
+ err += K;
+ in += 16;
+ }
+ } else {
+ SKP_assert( LPC_order == 10 );
+
+ /* Loop over input vectors */
+ for( n = 0; n < N; n++ ) {
+ /* Loop over codebook */
+ cb_vec = pCB;
+ for( i = 0; i < K; i++ ) {
+ /* Compute weighted squared quantization error */
+ diff = in[ 0 ] - cb_vec[ 0 ];
+ sum_error = Wcpy[ 0 ] * diff * diff;
+ diff = in[ 1 ] - cb_vec[ 1 ];
+ sum_error += Wcpy[ 1 ] * diff * diff;
+ diff = in[ 2 ] - cb_vec[ 2 ];
+ sum_error += Wcpy[ 2 ] * diff * diff;
+ diff = in[ 3 ] - cb_vec[ 3 ];
+ sum_error += Wcpy[ 3 ] * diff * diff;
+ diff = in[ 4 ] - cb_vec[ 4 ];
+ sum_error += Wcpy[ 4 ] * diff * diff;
+ diff = in[ 5 ] - cb_vec[ 5 ];
+ sum_error += Wcpy[ 5 ] * diff * diff;
+ diff = in[ 6 ] - cb_vec[ 6 ];
+ sum_error += Wcpy[ 6 ] * diff * diff;
+ diff = in[ 7 ] - cb_vec[ 7 ];
+ sum_error += Wcpy[ 7 ] * diff * diff;
+ diff = in[ 8 ] - cb_vec[ 8 ];
+ sum_error += Wcpy[ 8 ] * diff * diff;
+ diff = in[ 9 ] - cb_vec[ 9 ];
+ sum_error += Wcpy[ 9 ] * diff * diff;
+
+ err[ i ] = sum_error;
+ cb_vec += 10;
+ }
+ err += K;
+ in += 10;
+ }
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_NLSF_VQ_weights_laroia_FLP.c
@@ -1,0 +1,69 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+/*
+R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP
+Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech,
+Signal Processing, pp. 641-644, 1991.
+*/
+
+#define MIN_NDELTA ( 1e-6f / PI )
+
+/* Laroia low complexity NLSF weights */
+void SKP_Silk_NLSF_VQ_weights_laroia_FLP(
+ SKP_float *pXW, /* 0: Pointer to input vector weights [D x 1] */
+ const SKP_float *pX, /* I: Pointer to input vector [D x 1] */
+ const SKP_int D /* I: Input vector dimension */
+)
+{
+ SKP_int k;
+ SKP_float tmp1, tmp2;
+
+ /* Safety checks */
+ SKP_assert( D > 0 );
+ SKP_assert( ( D & 1 ) == 0 );
+
+ /* First value */
+ tmp1 = 1.0f / SKP_max_float( pX[ 0 ], MIN_NDELTA );
+ tmp2 = 1.0f / SKP_max_float( pX[ 1 ] - pX[ 0 ], MIN_NDELTA );
+ pXW[ 0 ] = tmp1 + tmp2;
+
+ /* Main loop */
+ for( k = 1; k < D - 1; k += 2 ) {
+ tmp1 = 1.0f / SKP_max_float( pX[ k + 1 ] - pX[ k ], MIN_NDELTA );
+ pXW[ k ] = tmp1 + tmp2;
+
+ tmp2 = 1.0f / SKP_max_float( pX[ k + 2 ] - pX[ k + 1 ], MIN_NDELTA );
+ pXW[ k + 1 ] = tmp1 + tmp2;
+ }
+
+ /* Last value */
+ tmp1 = 1.0f / SKP_max_float( 1.0f - pX[ D - 1 ], MIN_NDELTA );
+ pXW[ D - 1 ] = tmp1 + tmp2;
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_VQ_nearest_neighbor_FLP.c
@@ -1,0 +1,96 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* entropy constrained MATRIX-weighted VQ, for a single input data vector */
+void SKP_Silk_VQ_WMat_EC_FLP(
+ SKP_int *ind, /* O Index of best codebook vector */
+ SKP_float *rate_dist, /* O Best weighted quant. error + mu * rate */
+ const SKP_float *in, /* I Input vector to be quantized */
+ const SKP_float *W, /* I Weighting matrix */
+ const SKP_int16 *cb, /* I Codebook */
+ const SKP_int16 *cl_Q6, /* I Code length for each codebook vector */
+ const SKP_float mu, /* I Tradeoff between WSSE and rate */
+ const SKP_int L /* I Number of vectors in codebook */
+)
+{
+ SKP_int k;
+ SKP_float sum1;
+ SKP_float diff[ 5 ];
+ const SKP_int16 *cb_row;
+
+ /* Loop over codebook */
+ *rate_dist = SKP_float_MAX;
+ cb_row = cb;
+ for( k = 0; k < L; k++ ) {
+ /* Calc difference between in vector and cbk vector */
+ diff[ 0 ] = in[ 0 ] - ( SKP_float )cb_row[ 0 ] * Q14_CONVERSION_FAC;
+ diff[ 1 ] = in[ 1 ] - ( SKP_float )cb_row[ 1 ] * Q14_CONVERSION_FAC;
+ diff[ 2 ] = in[ 2 ] - ( SKP_float )cb_row[ 2 ] * Q14_CONVERSION_FAC;
+ diff[ 3 ] = in[ 3 ] - ( SKP_float )cb_row[ 3 ] * Q14_CONVERSION_FAC;
+ diff[ 4 ] = in[ 4 ] - ( SKP_float )cb_row[ 4 ] * Q14_CONVERSION_FAC;
+
+ /* Weighted rate */
+ sum1 = mu * cl_Q6[ k ] / 64.0f;
+
+ /* Add weighted quantization error, assuming W is symmetric */
+ /* first row of W */
+ sum1 += diff[ 0 ] * ( W[ 0 ] * diff[ 0 ] +
+ 2.0f * ( W[ 1 ] * diff[ 1 ] +
+ W[ 2 ] * diff[ 2 ] +
+ W[ 3 ] * diff[ 3 ] +
+ W[ 4 ] * diff[ 4 ] ) );
+
+ /* second row of W */
+ sum1 += diff[ 1 ] * ( W[ 6 ] * diff[ 1 ] +
+ 2.0f * ( W[ 7 ] * diff[ 2 ] +
+ W[ 8 ] * diff[ 3 ] +
+ W[ 9 ] * diff[ 4 ] ) );
+
+ /* third row of W */
+ sum1 += diff[ 2 ] * ( W[ 12 ] * diff[ 2 ] +
+ 2.0f * ( W[ 13 ] * diff[ 3 ] +
+ W[ 14 ] * diff[ 4 ] ) );
+
+ /* fourth row of W */
+ sum1 += diff[ 3 ] * ( W[ 18 ] * diff[ 3 ] +
+ 2.0f * ( W[ 19 ] * diff[ 4 ] ) );
+
+ /* last row of W */
+ sum1 += diff[ 4 ] * ( W[ 24 ] * diff[ 4 ] );
+
+ /* find best */
+ if( sum1 < *rate_dist ) {
+ *rate_dist = sum1;
+ *ind = k;
+ }
+
+ /* Go to next cbk vector */
+ cb_row += LTP_ORDER;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_apply_sine_window_FLP.c
@@ -1,0 +1,79 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* Apply sine window to signal vector. */
+/* Window types: */
+/* 0 -> sine window from 0 to pi */
+/* 1 -> sine window from 0 to pi/2 */
+/* 2 -> sine window from pi/2 to pi */
+void SKP_Silk_apply_sine_window_FLP(
+ SKP_float px_win[], /* O Pointer to windowed signal */
+ const SKP_float px[], /* I Pointer to input signal */
+ const SKP_int win_type, /* I Selects a window type */
+ const SKP_int length /* I Window length, multiple of 4 */
+)
+{
+ SKP_int k;
+ SKP_float freq, c, S0, S1;
+
+ /* Length must be multiple of 4 */
+ SKP_assert( ( length & 3 ) == 0 );
+
+ freq = PI / ( length + 1 );
+ if( win_type == 0 ) {
+ freq = 2.0f * freq;
+ }
+
+ /* Approximation of 2 * cos(f) */
+ c = 2.0f - freq * freq;
+
+ /* Initialize state */
+ if( win_type < 2 ) {
+ /* Start from 0 */
+ S0 = 0.0f;
+ /* Approximation of sin(f) */
+ S1 = freq;
+ } else {
+ /* Start from 1 */
+ S0 = 1.0f;
+ /* Approximation of cos(f) */
+ S1 = 0.5f * c;
+ }
+
+ /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */
+ /* 4 samples at a time */
+ for( k = 0; k < length; k += 4 ) {
+ px_win[ k + 0 ] = px[ k + 0 ] * 0.5f * ( S0 + S1 );
+ px_win[ k + 1 ] = px[ k + 1 ] * S1;
+ S0 = c * S1 - S0;
+ px_win[ k + 2 ] = px[ k + 2 ] * 0.5f * ( S1 + S0 );
+ px_win[ k + 3 ] = px[ k + 3 ] * S0;
+ S1 = c * S0 - S1;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_assembler_FLP.h
@@ -1,0 +1,42 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_ASSEMBLER_FLP_H
+#define SKP_SILK_ASSEMBLER_FLP_H
+
+#include "SKP_Silk_typedef.h"
+
+/* Declaration of assembler functions */
+
+void SKP_Silk_LPC_ana_sse(
+ float *r_LPC, /* O LPC residual signal */
+ const float *coefs, /* I LPC coefficients */
+ const float *speech, /* I Input signal */
+ int len /* I Length of input signal */
+);
+
+#endif
--- /dev/null
+++ b/src_FLP/SKP_Silk_control_codec_FLP.c
@@ -1,0 +1,578 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* ToDo: Move the functions below to common to be able to use them in FLP control codec also */
+SKP_INLINE SKP_int SKP_Silk_setup_resamplers(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int API_fs_Hz, /* I */
+ SKP_int fs_kHz /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_packetsize(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int PacketSize_ms /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_fs(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int fs_kHz /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_complexity(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int Complexity /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_rate(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int TargetRate_bps /* I */
+);
+
+SKP_INLINE SKP_int SKP_Silk_setup_LBRR(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int INBandFEC_enabled /* I */
+);
+
+/* Control encoder SNR */
+SKP_int SKP_Silk_control_encoder_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */
+ const SKP_int32 API_fs_Hz, /* I External (API) sampling rate (Hz) */
+ const SKP_int max_internal_fs_kHz,/* I Maximum internal sampling rate (kHz) */
+ const SKP_int PacketSize_ms, /* I Packet length (ms) */
+ SKP_int32 TargetRate_bps, /* I Target max bitrate (if SNR_dB == 0) */
+ const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */
+ const SKP_int INBandFEC_enabled, /* I Enable (1) / disable (0) inband FEC */
+ const SKP_int DTX_enabled, /* I Enable / disable DTX */
+ const SKP_int InputFramesize_ms, /* I Inputframe in ms */
+ const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */
+)
+{
+ SKP_int fs_kHz, ret = 0;
+
+ /* State machine for the SWB/WB switching */
+ fs_kHz = psEnc->sCmn.fs_kHz;
+
+ /* Only switch during low speech activity, when no frames are sitting in the payload buffer */
+ if( API_fs_Hz == 8000 || fs_kHz == 0 || API_fs_Hz < fs_kHz * 1000 || fs_kHz > max_internal_fs_kHz ) {
+ /* Switching is not possible, encoder just initialized, internal mode higher than external, */
+ /* or internal mode higher than maximum allowed internal mode */
+ fs_kHz = SKP_min( SKP_DIV32_16( API_fs_Hz, 1000 ), max_internal_fs_kHz );
+ } else {
+ /* Accumulate the difference between the target rate and limit for switching down */
+ psEnc->sCmn.bitrateDiff += SKP_MUL( InputFramesize_ms, TargetRate_bps - psEnc->sCmn.bitrate_threshold_down );
+ psEnc->sCmn.bitrateDiff = SKP_min( psEnc->sCmn.bitrateDiff, 0 );
+
+ if( psEnc->speech_activity < 0.5f && psEnc->sCmn.nFramesInPayloadBuf == 0 ) { /* Low speech activity and payload buffer empty */
+ /* Check if we should switch down */
+#if SWITCH_TRANSITION_FILTERING
+ if( ( psEnc->sCmn.sLP.transition_frame_no == 0 ) && /* Transition phase not active */
+ ( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD || /* Bitrate threshold is met */
+ ( psEnc->sCmn.sSWBdetect.WB_detected * psEnc->sCmn.fs_kHz == 24 ) ) ) { /* Forced down-switching due to WB input */
+ psEnc->sCmn.sLP.transition_frame_no = 1; /* Begin transition phase */
+ psEnc->sCmn.sLP.mode = 0; /* Switch down */
+ } else if(
+ ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_DOWN ) && /* Transition phase complete */
+ ( psEnc->sCmn.sLP.mode == 0 ) ) { /* Ready to switch down */
+ psEnc->sCmn.sLP.transition_frame_no = 0; /* Ready for new transition phase */
+#else
+ if( psEnc->sCmn.bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD ) { /* Bitrate threshold is met */
+#endif
+ psEnc->sCmn.bitrateDiff = 0;
+
+ /* Switch to a lower sample frequency */
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ fs_kHz = 16;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ fs_kHz = 12;
+ } else {
+ SKP_assert( psEnc->sCmn.fs_kHz == 12 );
+ fs_kHz = 8;
+ }
+ }
+
+ /* Check if we should switch up */
+ if( ( ( psEnc->sCmn.fs_kHz * 1000 < API_fs_Hz ) &&
+ ( TargetRate_bps >= psEnc->sCmn.bitrate_threshold_up ) &&
+ ( psEnc->sCmn.sSWBdetect.WB_detected * psEnc->sCmn.fs_kHz != 16 ) ) &&
+ ( ( psEnc->sCmn.fs_kHz == 16 ) && ( max_internal_fs_kHz >= 24 ) ||
+ ( psEnc->sCmn.fs_kHz == 12 ) && ( max_internal_fs_kHz >= 16 ) ||
+ ( psEnc->sCmn.fs_kHz == 8 ) && ( max_internal_fs_kHz >= 12 ) )
+#if SWITCH_TRANSITION_FILTERING
+ && ( psEnc->sCmn.sLP.transition_frame_no == 0 ) ) { /* No transition phase running, ready to switch */
+ psEnc->sCmn.sLP.mode = 1; /* Switch up */
+#else
+ ) {
+#endif
+ psEnc->sCmn.bitrateDiff = 0;
+
+ /* Switch to a higher sample frequency */
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ fs_kHz = 12;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ fs_kHz = 16;
+ } else {
+ SKP_assert( psEnc->sCmn.fs_kHz == 16 );
+ fs_kHz = 24;
+ }
+ }
+ }
+ }
+
+#if SWITCH_TRANSITION_FILTERING
+ /* After switching up, stop transition filter during speech inactivity */
+ if( ( psEnc->sCmn.sLP.mode == 1 ) &&
+ ( psEnc->sCmn.sLP.transition_frame_no >= TRANSITION_FRAMES_UP ) &&
+ ( psEnc->speech_activity < 0.5f ) &&
+ ( psEnc->sCmn.nFramesInPayloadBuf == 0 ) ) {
+
+ psEnc->sCmn.sLP.transition_frame_no = 0;
+
+ /* Reset transition filter state */
+ SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );
+ }
+#endif
+
+ /********************************************/
+ /* Prepare resampler and buffered data */
+ /********************************************/
+ SKP_Silk_setup_resamplers( psEnc, API_fs_Hz, fs_kHz );
+
+ /********************************************/
+ /* Set packet size */
+ /********************************************/
+ ret += SKP_Silk_setup_packetsize( psEnc, PacketSize_ms );
+
+ /********************************************/
+ /* Set internal sampling frequency */
+ /********************************************/
+ ret += SKP_Silk_setup_fs( psEnc, fs_kHz );
+
+ /********************************************/
+ /* Set encoding complexity */
+ /********************************************/
+ ret += SKP_Silk_setup_complexity( psEnc, Complexity );
+
+ /********************************************/
+ /* Set bitrate/coding quality */
+ /********************************************/
+ ret += SKP_Silk_setup_rate( psEnc, TargetRate_bps );
+
+ /********************************************/
+ /* Set packet loss rate measured by farend */
+ /********************************************/
+ if( ( PacketLoss_perc < 0 ) || ( PacketLoss_perc > 100 ) ) {
+ ret = SKP_SILK_ENC_INVALID_LOSS_RATE;
+ }
+ psEnc->sCmn.PacketLoss_perc = PacketLoss_perc;
+
+ /********************************************/
+ /* Set LBRR usage */
+ /********************************************/
+ ret += SKP_Silk_setup_LBRR( psEnc, INBandFEC_enabled );
+
+ /********************************************/
+ /* Set DTX mode */
+ /********************************************/
+ if( DTX_enabled < 0 || DTX_enabled > 1 ) {
+ ret = SKP_SILK_ENC_INVALID_DTX_SETTING;
+ }
+ psEnc->sCmn.useDTX = DTX_enabled;
+
+ return ret;
+}
+
+/* Control low bitrate redundancy usage */
+void SKP_Silk_LBRR_ctrl_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I Encoder state FLP */
+ SKP_Silk_encoder_control *psEncCtrl /* I/O Encoder control */
+)
+{
+ SKP_int LBRR_usage;
+
+ if( psEnc->sCmn.LBRR_enabled ) {
+ /* Control LBRR */
+
+ /* Usage Control based on sensitivity and packet loss caracteristics */
+ /* For now only enable adding to next for active frames. Make more complex later */
+ LBRR_usage = SKP_SILK_NO_LBRR;
+ if( psEnc->speech_activity > LBRR_SPEECH_ACTIVITY_THRES && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) { // nb! maybe multiply loss prob and speech activity
+ LBRR_usage = SKP_SILK_ADD_LBRR_TO_PLUS1;
+ }
+ psEncCtrl->LBRR_usage = LBRR_usage;
+ } else {
+ psEncCtrl->LBRR_usage = SKP_SILK_NO_LBRR;
+ }
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_packetsize(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int PacketSize_ms /* I */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+ if( ( PacketSize_ms != 10 ) &&
+ ( PacketSize_ms != 20 ) &&
+ ( PacketSize_ms != 40 ) &&
+ ( PacketSize_ms != 60 ) &&
+ ( PacketSize_ms != 80 ) &&
+ ( PacketSize_ms != 100 ) ) {
+ ret = SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED;
+ } else {
+ if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) {
+ if( PacketSize_ms == 10 ) {
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ /* Only allowed when the payload buffer is empty */
+ psEnc->sCmn.nb_subfr = MAX_NB_SUBFR >> 1;
+ psEnc->sCmn.frame_length = SKP_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr );
+ psEnc->sCmn.PacketSize_ms = PacketSize_ms;
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, psEnc->sCmn.fs_kHz );
+ /* Packet length changes. Reset LBRR buffer */
+ SKP_Silk_LBRR_reset( &psEnc->sCmn );
+ }
+ } else{
+ psEnc->sCmn.nb_subfr = MAX_NB_SUBFR;
+ psEnc->sCmn.frame_length = SKP_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr );
+ psEnc->sCmn.PacketSize_ms = PacketSize_ms;
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, psEnc->sCmn.fs_kHz );
+ /* Packet length changes. Reset LBRR buffer */
+ SKP_Silk_LBRR_reset( &psEnc->sCmn );
+ }
+ }
+ }
+ return(ret);
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_resamplers(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int API_fs_Hz, /* I */
+ SKP_int fs_kHz /* I */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+ if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != API_fs_Hz ) {
+
+ /* Allocate space for worst case temporary upsampling, 8 to 48 kHz, so a factor 6 */
+ SKP_int16 x_buf_API_fs_Hz[ ( MAX_API_FS_KHZ / 8 ) * ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) ];
+ SKP_int16 x_bufFIX[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];
+
+ SKP_int32 nSamples_temp = 2 * psEnc->sCmn.frame_length + psEnc->sCmn.la_shape;
+
+ SKP_float2short_array( x_bufFIX, psEnc->x_buf, 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX );
+
+ if( fs_kHz * 1000 < API_fs_Hz && psEnc->sCmn.fs_kHz != 0 ) {
+ /* Resample buffered data in x_buf to API_fs_Hz */
+
+ SKP_Silk_resampler_state_struct temp_resampler_state;
+
+ /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */
+ ret += SKP_Silk_resampler_init( &temp_resampler_state, psEnc->sCmn.fs_kHz * 1000, API_fs_Hz );
+
+ /* Temporary resampling of x_buf data to API_fs_Hz */
+ ret += SKP_Silk_resampler( &temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, nSamples_temp );
+
+ /* Calculate number of samples that has been temporarily upsampled */
+ nSamples_temp = SKP_DIV32_16( nSamples_temp * API_fs_Hz, psEnc->sCmn.fs_kHz * 1000 );
+
+ /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
+ ret += SKP_Silk_resampler_init( &psEnc->sCmn.resampler_state, API_fs_Hz, fs_kHz * 1000 );
+
+ } else {
+ /* Copy data */
+ SKP_memcpy( x_buf_API_fs_Hz, x_bufFIX, nSamples_temp * sizeof( SKP_int16 ) );
+ }
+
+ if( 1000 * fs_kHz != API_fs_Hz ) {
+ /* Correct resampler state (unless resampling by a factor 1) by resampling buffered data from API_fs_Hz to fs_kHz */
+ ret += SKP_Silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, nSamples_temp );
+ }
+ SKP_short2float_array( psEnc->x_buf, x_bufFIX, 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX );
+ }
+
+ psEnc->sCmn.prev_API_fs_Hz = API_fs_Hz;
+
+ return(ret);
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_fs(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int fs_kHz /* I */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+ /* Set internal sampling frequency */
+ if( psEnc->sCmn.fs_kHz != fs_kHz ) {
+ /* reset part of the state */
+ SKP_memset( &psEnc->sShape, 0, sizeof( SKP_Silk_shape_state_FLP ) );
+ SKP_memset( &psEnc->sPrefilt, 0, sizeof( SKP_Silk_prefilter_state_FLP ) );
+ SKP_memset( &psEnc->sNSQ, 0, sizeof( SKP_Silk_nsq_state ) );
+ SKP_memset( &psEnc->sPred, 0, sizeof( SKP_Silk_predict_state_FLP ) );
+ SKP_memset( psEnc->sNSQ.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) );
+ SKP_memset( psEnc->sNSQ_LBRR.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) );
+ SKP_memset( psEnc->sCmn.LBRR_buffer, 0, MAX_LBRR_DELAY * sizeof( SKP_SILK_LBRR_struct ) );
+#if SWITCH_TRANSITION_FILTERING
+ SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) );
+ if( psEnc->sCmn.sLP.mode == 1 ) {
+ /* Begin transition phase */
+ psEnc->sCmn.sLP.transition_frame_no = 1;
+ } else {
+ /* End transition phase */
+ psEnc->sCmn.sLP.transition_frame_no = 0;
+ }
+#endif
+ psEnc->sCmn.inputBufIx = 0;
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ psEnc->sCmn.nBytesInPayloadBuf = 0;
+ psEnc->sCmn.oldest_LBRR_idx = 0;
+ psEnc->sCmn.TargetRate_bps = 0; /* Ensures that psEnc->SNR_dB is recomputed */
+
+ SKP_memset( psEnc->sPred.prev_NLSFq, 0, MAX_LPC_ORDER * sizeof( SKP_float ) );
+
+ /* Initialize non-zero parameters */
+ psEnc->sCmn.prevLag = 100;
+ psEnc->sCmn.prev_sigtype = SIG_TYPE_UNVOICED;
+ psEnc->sCmn.first_frame_after_reset = 1;
+ psEnc->sPrefilt.lagPrev = 100;
+ psEnc->sShape.LastGainIndex = 1;
+ psEnc->sNSQ.lagPrev = 100;
+ psEnc->sNSQ.prev_inv_gain_Q16 = 65536;
+ psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536;
+
+ psEnc->sCmn.fs_kHz = fs_kHz;
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER;
+ psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_10;
+ psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_10;
+ psEnc->psNLSF_CB_FLP[ 0 ] = &SKP_Silk_NLSF_CB0_10_FLP;
+ psEnc->psNLSF_CB_FLP[ 1 ] = &SKP_Silk_NLSF_CB1_10_FLP;
+ } else {
+ psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER;
+ psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_16;
+ psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_16;
+ psEnc->psNLSF_CB_FLP[ 0 ] = &SKP_Silk_NLSF_CB0_16_FLP;
+ psEnc->psNLSF_CB_FLP[ 1 ] = &SKP_Silk_NLSF_CB1_16_FLP;
+ }
+ psEnc->sCmn.subfr_length = SUB_FRAME_LENGTH_MS * fs_kHz;
+ psEnc->sCmn.frame_length = psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr;
+ psEnc->sCmn.ltp_mem_length = LTP_MEM_LENGTH_MS * fs_kHz;
+ psEnc->sCmn.la_pitch = LA_PITCH_MS * fs_kHz;
+ psEnc->sCmn.la_shape = LA_SHAPE_MS * fs_kHz;
+ psEnc->sPred.min_pitch_lag = 3 * fs_kHz;
+ psEnc->sPred.max_pitch_lag = 18 * fs_kHz;
+ if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ){
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
+ } else {
+ psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );
+ }
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ psEnc->mu_LTP = MU_LTP_QUANT_SWB;
+ psEnc->sCmn.bitrate_threshold_up = SKP_int32_MAX;
+ psEnc->sCmn.bitrate_threshold_down = SWB2WB_BITRATE_BPS;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ psEnc->mu_LTP = MU_LTP_QUANT_WB;
+ psEnc->sCmn.bitrate_threshold_up = WB2SWB_BITRATE_BPS;
+ psEnc->sCmn.bitrate_threshold_down = WB2MB_BITRATE_BPS;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ psEnc->mu_LTP = MU_LTP_QUANT_MB;
+ psEnc->sCmn.bitrate_threshold_up = MB2WB_BITRATE_BPS;
+ psEnc->sCmn.bitrate_threshold_down = MB2NB_BITRATE_BPS;
+ } else {
+ psEnc->mu_LTP = MU_LTP_QUANT_NB;
+ psEnc->sCmn.bitrate_threshold_up = NB2MB_BITRATE_BPS;
+ psEnc->sCmn.bitrate_threshold_down = 0;
+ }
+ psEnc->sCmn.fs_kHz_changed = 1;
+
+ /* Check that settings are valid */
+ SKP_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length );
+ }
+ return( ret );
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_complexity(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int Complexity /* I */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+ /* Check that settings are valid */
+ if( LOW_COMPLEXITY_ONLY && Complexity != 0 ) {
+ ret = SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING;
+ }
+
+ /* Set encoding complexity */
+ if( Complexity == 0 || LOW_COMPLEXITY_ONLY ) {
+ /* Low complexity */
+ psEnc->sCmn.Complexity = 0;
+ psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_LC_MODE;
+ psEnc->pitchEstimationThreshold = FIND_PITCH_CORRELATION_THRESHOLD_LC_MODE;
+ psEnc->sCmn.pitchEstimationLPCOrder = 8;
+ psEnc->sCmn.shapingLPCOrder = 8;
+ psEnc->sCmn.nStatesDelayedDecision = 1;
+ psEnc->sCmn.useInterpolatedNLSFs = 0;
+ psEnc->sCmn.LTPQuantLowComplexity = 1;
+ psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS_LC_MODE;
+ } else if( Complexity == 1 ) {
+ /* Medium complexity */
+ psEnc->sCmn.Complexity = 1;
+ psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_MC_MODE;
+ psEnc->pitchEstimationThreshold = FIND_PITCH_CORRELATION_THRESHOLD_MC_MODE;
+ psEnc->sCmn.pitchEstimationLPCOrder = 12;
+ psEnc->sCmn.shapingLPCOrder = 12;
+ psEnc->sCmn.nStatesDelayedDecision = 2;
+ psEnc->sCmn.useInterpolatedNLSFs = 0;
+ psEnc->sCmn.LTPQuantLowComplexity = 0;
+ psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS_MC_MODE;
+ } else if( Complexity == 2 ) {
+ /* High complexity */
+ psEnc->sCmn.Complexity = 2;
+ psEnc->sCmn.pitchEstimationComplexity = PITCH_EST_COMPLEXITY_HC_MODE;
+ psEnc->pitchEstimationThreshold = FIND_PITCH_CORRELATION_THRESHOLD_HC_MODE;
+ psEnc->sCmn.pitchEstimationLPCOrder = 16;
+ psEnc->sCmn.shapingLPCOrder = 16;
+ psEnc->sCmn.nStatesDelayedDecision = 4;
+ psEnc->sCmn.useInterpolatedNLSFs = 1;
+ psEnc->sCmn.LTPQuantLowComplexity = 0;
+ psEnc->sCmn.NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS;
+ } else {
+ ret = SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING;
+ }
+
+ /* Do not allow higher pitch estimation LPC order than predict LPC order */
+ psEnc->sCmn.pitchEstimationLPCOrder = SKP_min_int( psEnc->sCmn.pitchEstimationLPCOrder, psEnc->sCmn.predictLPCOrder );
+
+ SKP_assert( psEnc->sCmn.pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER );
+ SKP_assert( psEnc->sCmn.shapingLPCOrder <= MAX_SHAPE_LPC_ORDER );
+ SKP_assert( psEnc->sCmn.nStatesDelayedDecision <= MAX_DEL_DEC_STATES );
+ return( ret );
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_rate(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int TargetRate_bps /* I */
+)
+{
+ SKP_int k, ret = SKP_SILK_NO_ERROR;
+ SKP_float frac;
+ const SKP_int32 *rateTable;
+
+ /* Set bitrate/coding quality */
+ TargetRate_bps = SKP_min( TargetRate_bps, 100000 );
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_NB_BPS );
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_MB_BPS );
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_WB_BPS );
+ } else {
+ TargetRate_bps = SKP_max( TargetRate_bps, MIN_TARGET_RATE_SWB_BPS );
+ }
+ if( TargetRate_bps != psEnc->sCmn.TargetRate_bps ) {
+ psEnc->sCmn.TargetRate_bps = TargetRate_bps;
+
+ /* If new TargetRate_bps, translate to SNR_dB value */
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ rateTable = TargetRate_table_NB;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ rateTable = TargetRate_table_MB;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ rateTable = TargetRate_table_WB;
+ } else {
+ rateTable = TargetRate_table_SWB;
+ }
+ for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) {
+ /* Find bitrate interval in table and interpolate */
+ if( TargetRate_bps < rateTable[ k ] ) {
+ frac = (SKP_float)( TargetRate_bps - rateTable[ k - 1 ] ) /
+ (SKP_float)( rateTable[ k ] - rateTable[ k - 1 ] );
+ psEnc->SNR_dB = 0.5f * ( SNR_table_Q1[ k - 1 ] + frac * ( SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] ) );
+ break;
+ }
+ }
+ }
+ return( ret );
+}
+
+SKP_INLINE SKP_int SKP_Silk_setup_LBRR(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O */
+ SKP_int INBandFEC_enabled /* I */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+ SKP_int32 LBRRRate_thres_bps;
+
+#if USE_LBRR
+ if( INBandFEC_enabled < 0 || INBandFEC_enabled > 1 ) {
+ ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;
+ }
+
+ /* Only change settings if first frame in packet */
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+
+ psEnc->sCmn.LBRR_enabled = INBandFEC_enabled;
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 9000;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 6000;;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 3000;
+ } else {
+ LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS;
+ }
+
+ if( psEnc->sCmn.TargetRate_bps >= LBRRRate_thres_bps ) {
+ /* Set gain increase / rate reduction for LBRR usage */
+ /* Coarsely tuned with PESQ for now. */
+ /* Linear regression coefs G = 8 - 0.5 * loss */
+ /* Meaning that at 16% loss main rate and redundant rate is the same, -> G = 0 */
+ psEnc->sCmn.LBRR_GainIncreases = SKP_max_int( 8 - SKP_RSHIFT( psEnc->sCmn.PacketLoss_perc, 1 ), 0 );
+
+ /* Set main stream rate compensation */
+ if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) {
+ /* Tuned to give aprox same mean / weighted bitrate as no inband FEC */
+ psEnc->inBandFEC_SNR_comp = 6.0f - 0.5f * psEnc->sCmn.LBRR_GainIncreases;
+ } else {
+ psEnc->inBandFEC_SNR_comp = 0;
+ psEnc->sCmn.LBRR_enabled = 0;
+ }
+ } else {
+ psEnc->inBandFEC_SNR_comp = 0;
+ psEnc->sCmn.LBRR_enabled = 0;
+ }
+ }
+#else
+ if( INBandFEC_enabled != 0 ) {
+ ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING;
+ }
+ psEnc->sCmn.LBRR_enabled = 0;
+#endif
+ return( ret );
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_corrMatrix_FLP.c
@@ -1,0 +1,89 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************************************
+ * Correlation matrix computations for LS estimate.
+ **********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* Calculates correlation vector X'*t */
+void SKP_Silk_corrVector_FLP(
+ const SKP_float *x, /* I x vector [L+order-1] used to create X */
+ const SKP_float *t, /* I Target vector [L] */
+ const SKP_int L, /* I Length of vecors */
+ const SKP_int Order, /* I Max lag for correlation */
+ SKP_float *Xt /* O X'*t correlation vector [order] */
+)
+{
+ SKP_int lag;
+ const SKP_float *ptr1;
+
+ ptr1 = &x[ Order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */
+ for( lag = 0; lag < Order; lag++ ) {
+ /* Calculate X[:,lag]'*t */
+ Xt[ lag ] = (SKP_float)SKP_Silk_inner_product_FLP( ptr1, t, L );
+ ptr1--; /* Next column of X */
+ }
+}
+
+/* Calculates correlation matrix X'*X */
+void SKP_Silk_corrMatrix_FLP(
+ const SKP_float *x, /* I x vector [ L+order-1 ] used to create X */
+ const SKP_int L, /* I Length of vectors */
+ const SKP_int Order, /* I Max lag for correlation */
+ SKP_float *XX /* O X'*X correlation matrix [order x order] */
+)
+{
+ SKP_int j, lag;
+ double energy;
+ const SKP_float *ptr1, *ptr2;
+
+ ptr1 = &x[ Order - 1 ]; /* First sample of column 0 of X */
+ energy = SKP_Silk_energy_FLP( ptr1, L ); /* X[:,0]'*X[:,0] */
+ matrix_ptr( XX, 0, 0, Order ) = ( SKP_float )energy;
+ for( j = 1; j < Order; j++ ) {
+ /* Calculate X[:,j]'*X[:,j] */
+ energy += ptr1[ -j ] * ptr1[ -j ] - ptr1[ L - j ] * ptr1[ L - j ];
+ matrix_ptr( XX, j, j, Order ) = ( SKP_float )energy;
+ }
+
+ ptr2 = &x[ Order - 2 ]; /* First sample of column 1 of X */
+ for( lag = 1; lag < Order; lag++ ) {
+ /* Calculate X[:,0]'*X[:,lag] */
+ energy = SKP_Silk_inner_product_FLP( ptr1, ptr2, L );
+ matrix_ptr( XX, lag, 0, Order ) = ( SKP_float )energy;
+ matrix_ptr( XX, 0, lag, Order ) = ( SKP_float )energy;
+ /* Calculate X[:,j]'*X[:,j + lag] */
+ for( j = 1; j < ( Order - lag ); j++ ) {
+ energy += ptr1[ -j ] * ptr2[ -j ] - ptr1[ L - j ] * ptr2[ L - j ];
+ matrix_ptr( XX, lag + j, j, Order ) = ( SKP_float )energy;
+ matrix_ptr( XX, j, lag + j, Order ) = ( SKP_float )energy;
+ }
+ ptr2--; /* Next column of X */
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_define_FLP.h
@@ -1,0 +1,103 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_DEFINE_FLP_H
+#define SKP_SILK_DEFINE_FLP_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*******************/
+/* Pitch estimator */
+/*******************/
+
+/* Level of noise floor for whitening filter LPC analysis in pitch analysis */
+#define FIND_PITCH_WHITE_NOISE_FRACTION 1e-3f
+
+/* Bandwidth expansion for whitening filter in pitch analysis */
+#define FIND_PITCH_BANDWITH_EXPANSION 0.99f
+
+/* Threshold used by pitch estimator for early escape */
+#define FIND_PITCH_CORRELATION_THRESHOLD_HC_MODE 0.7f
+#define FIND_PITCH_CORRELATION_THRESHOLD_MC_MODE 0.75f
+#define FIND_PITCH_CORRELATION_THRESHOLD_LC_MODE 0.8f
+
+/***********************/
+/* Long-Term predictor */
+/***********************/
+
+/* Regualarization factor for correlation matrix. Equivalent to adding noise at -50 dB */
+#define FIND_LTP_COND_FAC 1e-5f
+#define FIND_LPC_COND_FAC 6e-5f
+
+/* Find prediction coefficients defines */
+#define LTP_DAMPING 0.001f
+#define LTP_SMOOTHING 0.1f
+
+/* LTP quantization settings */
+#define MU_LTP_QUANT_NB 0.03f
+#define MU_LTP_QUANT_MB 0.025f
+#define MU_LTP_QUANT_WB 0.02f
+#define MU_LTP_QUANT_SWB 0.016f
+
+/***********************/
+/* High pass filtering */
+/***********************/
+
+/* Smoothing parameters for low end of pitch frequency range estimation */
+#define VARIABLE_HP_SMTH_COEF1 0.1f
+#define VARIABLE_HP_SMTH_COEF2 0.015f
+
+/* Min and max values for low end of pitch frequency range estimation */
+#define VARIABLE_HP_MIN_FREQ 80.0f
+#define VARIABLE_HP_MAX_FREQ 150.0f
+
+/* Max absolute difference between log2 of pitch frequency and smoother state, to enter the smoother */
+#define VARIABLE_HP_MAX_DELTA_FREQ 0.4f
+
+/***********/
+/* Various */
+/***********/
+
+/* Required speech activity for counting frame as active */
+#define WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES 0.7f
+
+#define SPEECH_ACTIVITY_DTX_THRES 0.1f
+
+/* Speech Activity LBRR enable threshold (needs tuning) */
+#define LBRR_SPEECH_ACTIVITY_THRES 0.5f
+
+#define Q14_CONVERSION_FAC 6.1035e-005f // 1 / 2^14
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_FLP/SKP_Silk_encode_frame_FLP.c
@@ -1,0 +1,472 @@
+#include <stdlib.h>
+#include "SKP_Silk_main_FLP.h"
+
+/****************/
+/* Encode frame */
+/****************/
+SKP_int SKP_Silk_encode_frame_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_uint8 *pCode, /* O Payload */
+ SKP_int16 *pnBytesOut, /* I/O Number of payload bytes; */
+ /* input: max length; output: used */
+ const SKP_int16 *pIn /* I Input speech frame */
+)
+{
+ SKP_Silk_encoder_control_FLP sEncCtrl;
+ SKP_int k, i, nBytes, ret = 0;
+ SKP_float *x_frame, *res_pitch_frame;
+ SKP_int16 pIn_HP[ MAX_FRAME_LENGTH ];
+ SKP_int16 pIn_HP_LP[ MAX_FRAME_LENGTH ];
+ SKP_float xfw[ MAX_FRAME_LENGTH ];
+ SKP_float res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ];
+ SKP_int LBRR_idx, frame_terminator;
+
+ /* Low bitrate redundancy parameters */
+ SKP_uint8 LBRRpayload[ MAX_ARITHM_BYTES ];
+ SKP_int16 nBytesLBRR;
+
+ ec_byte_buffer range_enc_celt_buf;
+
+ const SKP_uint16 *FrameTermination_CDF;
+
+TIC(ENCODE_FRAME)
+
+ sEncCtrl.sCmn.Seed = psEnc->sCmn.frameCounter++ & 3;
+ /**************************************************************/
+ /* Setup Input Pointers, and insert frame in input buffer */
+ /*************************************************************/
+ /* pointers aligned with start of frame to encode */
+ x_frame = psEnc->x_buf + psEnc->sCmn.ltp_mem_length; /* start of frame to encode */
+ res_pitch_frame = res_pitch + psEnc->sCmn.ltp_mem_length; /* start of pitch LPC residual frame */
+
+ /****************************/
+ /* Voice Activity Detection */
+ /****************************/
+TIC(VAD)
+ SKP_Silk_VAD_FLP( psEnc, &sEncCtrl, pIn );
+TOC(VAD)
+
+ /*******************************************/
+ /* High-pass filtering of the input signal */
+ /*******************************************/
+TIC(HP_IN)
+#if HIGH_PASS_INPUT
+ /* Variable high-pass filter */
+ SKP_Silk_HP_variable_cutoff_FLP( psEnc, &sEncCtrl, pIn_HP, pIn );
+#else
+ SKP_memcpy( pIn_HP, pIn, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
+#endif
+TOC(HP_IN)
+
+#if SWITCH_TRANSITION_FILTERING
+ /* Ensure smooth bandwidth transitions */
+ SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, pIn_HP_LP, pIn_HP, psEnc->sCmn.frame_length );
+#else
+ SKP_memcpy( pIn_HP_LP, pIn_HP, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
+#endif
+
+ /*******************************************/
+ /* Copy new frame to front of input buffer */
+ /*******************************************/
+ SKP_short2float_array( x_frame + psEnc->sCmn.la_shape, pIn_HP_LP, psEnc->sCmn.frame_length );
+
+ /* Add tiny signal to avoid high CPU load from denormalized floating point numbers */
+ for( k = 0; k < 8; k++ ) {
+ x_frame[ psEnc->sCmn.la_shape + k * ( psEnc->sCmn.frame_length >> 3 ) ] += ( 1 - ( k & 2 ) ) * 1e-6f;
+ }
+
+ /*****************************************/
+ /* Find pitch lags, initial LPC analysis */
+ /*****************************************/
+TIC(FIND_PITCH)
+ SKP_Silk_find_pitch_lags_FLP( psEnc, &sEncCtrl, res_pitch, x_frame );
+TOC(FIND_PITCH)
+
+ /************************/
+ /* Noise shape analysis */
+ /************************/
+TIC(NOISE_SHAPE_ANALYSIS)
+ SKP_Silk_noise_shape_analysis_FLP( psEnc, &sEncCtrl, res_pitch_frame, x_frame );
+TOC(NOISE_SHAPE_ANALYSIS)
+
+ /*****************************************/
+ /* Prefiltering for noise shaper */
+ /*****************************************/
+TIC(PREFILTER)
+ SKP_Silk_prefilter_FLP( psEnc, &sEncCtrl, xfw, x_frame );
+TOC(PREFILTER)
+
+ /***************************************************/
+ /* Find linear prediction coefficients (LPC + LTP) */
+ /***************************************************/
+TIC(FIND_PRED_COEF)
+ SKP_Silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch );
+TOC(FIND_PRED_COEF)
+
+ /****************************************/
+ /* Process gains */
+ /****************************************/
+TIC(PROCESS_GAINS)
+ SKP_Silk_process_gains_FLP( psEnc, &sEncCtrl );
+TOC(PROCESS_GAINS)
+
+ psEnc->sCmn.sigtype[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.sigtype;
+ psEnc->sCmn.QuantOffsetType[ psEnc->sCmn.nFramesInPayloadBuf ] = sEncCtrl.sCmn.QuantOffsetType;
+ /****************************************/
+ /* Low Bitrate Redundant Encoding */
+ /****************************************/
+ nBytesLBRR = MAX_ARITHM_BYTES;
+TIC(LBRR)
+ SKP_Silk_LBRR_encode_FLP( psEnc, &sEncCtrl, LBRRpayload, &nBytesLBRR, xfw );
+TOC(LBRR)
+
+ /*****************************************/
+ /* Noise shaping quantization */
+ /*****************************************/
+TIC(NSQ)
+ SKP_Silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, xfw,
+ &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ], 0 );
+TOC(NSQ)
+
+ /**************************************************/
+ /* Convert speech activity into VAD and DTX flags */
+ /**************************************************/
+ if( psEnc->speech_activity < SPEECH_ACTIVITY_DTX_THRES ) {
+ psEnc->sCmn.vadFlag = NO_VOICE_ACTIVITY;
+ psEnc->sCmn.noSpeechCounter++;
+ if( psEnc->sCmn.noSpeechCounter > NO_SPEECH_FRAMES_BEFORE_DTX ) {
+ psEnc->sCmn.inDTX = 1;
+ }
+ if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX ) {
+ psEnc->sCmn.noSpeechCounter = 0;
+ psEnc->sCmn.inDTX = 0;
+ }
+ } else {
+ psEnc->sCmn.noSpeechCounter = 0;
+ psEnc->sCmn.inDTX = 0;
+ psEnc->sCmn.vadFlag = VOICE_ACTIVITY;
+ }
+
+ /****************************************/
+ /* Initialize arithmetic coder */
+ /****************************************/
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ ec_byte_writeinit_buffer( &range_enc_celt_buf, psEnc->sCmn.sRC.buffer, MAX_ARITHM_BYTES );
+ ec_enc_init( &psEnc->sCmn.sRC.range_enc_celt_state, &range_enc_celt_buf );
+
+ SKP_Silk_range_enc_init( &psEnc->sCmn.sRC );
+ psEnc->sCmn.nBytesInPayloadBuf = 0;
+ }
+
+ /****************************************/
+ /* Encode Parameters */
+ /****************************************/
+TIC(ENCODE_PARAMS)
+ SKP_Silk_encode_parameters_v4( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sCmn.sRC );
+ FrameTermination_CDF = SKP_Silk_FrameTermination_v4_CDF;
+TOC(ENCODE_PARAMS)
+
+ /****************************************/
+ /* Update Buffers and State */
+ /****************************************/
+ /* Update input buffer */
+ SKP_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ],
+ ( psEnc->sCmn.ltp_mem_length + psEnc->sCmn.la_shape ) * sizeof( SKP_float ) );
+
+ /* Parameters needed for next frame */
+ psEnc->sCmn.prev_sigtype = sEncCtrl.sCmn.sigtype;
+ psEnc->sCmn.prevLag = sEncCtrl.sCmn.pitchL[ psEnc->sCmn.nb_subfr - 1 ];
+ psEnc->sCmn.first_frame_after_reset = 0;
+
+ if( psEnc->sCmn.sRC.error ) {
+ /* Encoder returned error: Clear payload buffer */
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ } else {
+ psEnc->sCmn.nFramesInPayloadBuf++;
+ }
+
+ /****************************************/
+ /* Finalize payload and copy to output */
+ /****************************************/
+ if( psEnc->sCmn.nFramesInPayloadBuf * SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr >= psEnc->sCmn.PacketSize_ms ) {
+
+ LBRR_idx = ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK;
+
+ /* Check if FEC information should be added */
+ frame_terminator = SKP_SILK_LAST_FRAME;
+ if( psEnc->sCmn.LBRR_buffer[ LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS1 ) {
+ frame_terminator = SKP_SILK_LBRR_VER1;
+ }
+ if( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS2 ) {
+ frame_terminator = SKP_SILK_LBRR_VER2;
+ LBRR_idx = psEnc->sCmn.oldest_LBRR_idx;
+ }
+
+ /* Add the frame termination info to stream */
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF );
+ for( i = 0; i < psEnc->sCmn.nFramesInPayloadBuf; i++ ) {
+ SKP_Silk_encode_pulses( &psEnc->sCmn.sRC, psEnc->sCmn.sigtype[ i ], psEnc->sCmn.QuantOffsetType[ i ],
+ &psEnc->sCmn.q[ i * psEnc->sCmn.frame_length ], psEnc->sCmn.frame_length );
+ }
+
+ /* Payload length so far */
+ SKP_Silk_range_encoder_get_length( &psEnc->sCmn.sRC, &nBytes );
+
+ /* Check that there is enough space in external output buffer, and move data */
+ if( *pnBytesOut >= nBytes ) {
+ SKP_int bits_in_stream, mask;
+ bits_in_stream = ec_enc_tell( &psEnc->sCmn.sRC.range_enc_celt_state, 0 );
+ ec_enc_done( &psEnc->sCmn.sRC.range_enc_celt_state );
+
+ /* Fill up any remaining bits in the last byte with 1s */
+ if( bits_in_stream & 7 ) {
+ mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );
+ if( nBytes - 1 < *pnBytesOut ) {
+ psEnc->sCmn.sRC.range_enc_celt_state.buf->buf[ nBytes - 1 ] |= mask;
+ }
+ }
+ SKP_memcpy( pCode, psEnc->sCmn.sRC.range_enc_celt_state.buf->buf, nBytes * sizeof( SKP_uint8 ) );
+
+ if( frame_terminator > SKP_SILK_MORE_FRAMES &&
+ *pnBytesOut >= nBytes + psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes ) {
+ /* Get old packet and add to payload. */
+ SKP_memcpy( &pCode[ nBytes ],
+ psEnc->sCmn.LBRR_buffer[ LBRR_idx ].payload,
+ psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes * sizeof( SKP_uint8 ) );
+ nBytes += psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes;
+ }
+ *pnBytesOut = nBytes;
+
+ /* Update FEC buffer */
+ SKP_memcpy( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].payload, LBRRpayload,
+ nBytesLBRR * sizeof( SKP_uint8 ) );
+ psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].nBytes = nBytesLBRR;
+ /* The below line describes how FEC should be used */
+ psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage = sEncCtrl.sCmn.LBRR_usage;
+ psEnc->sCmn.oldest_LBRR_idx = ( ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK );
+
+ /* Reset the number of frames in payload buffer */
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ } else {
+ /* Not enough space: Payload will be discarded */
+ *pnBytesOut = 0;
+ nBytes = 0;
+ psEnc->sCmn.nFramesInPayloadBuf = 0;
+ ret = SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT;
+ }
+ } else {
+ /* No payload for you this time */
+ *pnBytesOut = 0;
+
+ /* Encode that more frames follows */
+ frame_terminator = SKP_SILK_MORE_FRAMES;
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF );
+
+ /* Payload length so far */
+ SKP_Silk_range_encoder_get_length( &psEnc->sCmn.sRC, &nBytes );
+
+ /* Take into account the q signal that isn't in the bitstream yet */
+ nBytes += SKP_Silk_pulses_to_bytes( &psEnc->sCmn,
+ &psEnc->sCmn.q[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ] );
+ }
+
+ /* Check for arithmetic coder errors */
+ if( psEnc->sCmn.sRC.error ) {
+ ret = SKP_SILK_ENC_INTERNAL_ERROR;
+ }
+
+ /* simulate number of ms buffered in channel because of exceeding TargetRate */
+ psEnc->BufferedInChannel_ms += ( 8.0f * 1000.0f * ( nBytes - psEnc->sCmn.nBytesInPayloadBuf ) ) / psEnc->sCmn.TargetRate_bps;
+ psEnc->BufferedInChannel_ms -= SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr;
+ psEnc->BufferedInChannel_ms = SKP_LIMIT_float( psEnc->BufferedInChannel_ms, 0.0f, 100.0f );
+ psEnc->sCmn.nBytesInPayloadBuf = nBytes;
+
+ if( psEnc->speech_activity > WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES ) {
+ psEnc->sCmn.sSWBdetect.ActiveSpeech_ms = SKP_ADD_POS_SAT32( psEnc->sCmn.sSWBdetect.ActiveSpeech_ms, SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr );
+ }
+
+TOC(ENCODE_FRAME)
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( xf.dat, pIn_HP_LP, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) );
+ DEBUG_STORE_DATA( xfw.dat, xfw, psEnc->sCmn.frame_length * sizeof( SKP_float ) );
+// DEBUG_STORE_DATA( q.dat, q, psEnc->sCmn.frame_length * sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( pitchL.dat, sEncCtrl.sCmn.pitchL, MAX_NB_SUBFR * sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( pitchG_quantized.dat, sEncCtrl.LTPCoef, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( pitch_freq_low_Hz.dat, &sEncCtrl.pitch_freq_low_Hz, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( LTPcorr.dat, &psEnc->LTPCorr, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( tilt.dat, &sEncCtrl.input_tilt, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( gains.dat, sEncCtrl.Gains, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );
+// DEBUG_STORE_DATA( gains_indices.dat, sEncCtrl.sCmn.GainsIndices, MAX_LAYERS * psEnc->sCmn.nb_subfr * sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( nBytes.dat, &nBytes, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( current_SNR_db.dat, &sEncCtrl.current_SNR_dB, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( QuantOffsetType.dat, &sEncCtrl.sCmn.QuantOffsetType, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( speech_activity.dat, &psEnc->speech_activity, sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( input_quality_bands.dat, sEncCtrl.input_quality_bands, VAD_N_BANDS * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( sigtype.dat, &sEncCtrl.sCmn.sigtype, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( ratelevel.dat, &sEncCtrl.sCmn.RateLevelIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( lag_index.dat, &sEncCtrl.sCmn.lagIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( contour_index.dat, &sEncCtrl.sCmn.contourIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( per_index.dat, &sEncCtrl.sCmn.PERIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( PredCoef.dat, &sEncCtrl.PredCoef[ 1 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( ltp_scale_idx.dat, &sEncCtrl.sCmn.LTP_scaleIndex, sizeof( SKP_int ) );
+// DEBUG_STORE_DATA( xq.dat, psEnc->sNSQ.xqBuf, psEnc->sCmn.frame_length * sizeof( SKP_float ) );
+#endif
+ return( ret );
+}
+
+/* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */
+void SKP_Silk_LBRR_encode_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_uint8 *pCode, /* O Payload */
+ SKP_int16 *pnBytesOut, /* I/O Payload bytes; in: max; out: used */
+ const SKP_float xfw[] /* I Input signal */
+)
+{
+ SKP_int32 Gains_Q16[ MAX_NB_SUBFR ];
+ SKP_int i, k, TempGainsIndices[ MAX_NB_SUBFR ], frame_terminator;
+ SKP_int nBytes, nFramesInPayloadBuf;
+ SKP_float TempGains[ MAX_NB_SUBFR ];
+ SKP_int typeOffset, LTP_scaleIndex, Rate_only_parameters = 0;
+ ec_byte_buffer range_enc_celt_buf;
+
+ /* Control use of inband LBRR */
+ SKP_Silk_LBRR_ctrl_FLP( psEnc, &psEncCtrl->sCmn );
+
+ if( psEnc->sCmn.LBRR_enabled ) {
+ /* Save original gains */
+ SKP_memcpy( TempGainsIndices, psEncCtrl->sCmn.GainsIndices, MAX_NB_SUBFR * sizeof( SKP_int ) );
+ SKP_memcpy( TempGains, psEncCtrl->Gains, MAX_NB_SUBFR * sizeof( SKP_float ) );
+
+ typeOffset = psEnc->sCmn.typeOffsetPrev; // Temp save as cannot be overwritten
+ LTP_scaleIndex = psEncCtrl->sCmn.LTP_scaleIndex;
+
+ /* Set max rate where quant signal is encoded */
+ if( psEnc->sCmn.fs_kHz == 8 ) {
+ Rate_only_parameters = 13500;
+ } else if( psEnc->sCmn.fs_kHz == 12 ) {
+ Rate_only_parameters = 15500;
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ Rate_only_parameters = 17500;
+ } else if( psEnc->sCmn.fs_kHz == 24 ) {
+ Rate_only_parameters = 19500;
+ } else {
+ SKP_assert( 0 );
+ }
+
+ if( psEnc->sCmn.Complexity > 0 && psEnc->sCmn.TargetRate_bps > Rate_only_parameters ) {
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ /* First frame in packet copy everything */
+ SKP_memcpy( &psEnc->sNSQ_LBRR, &psEnc->sNSQ, sizeof( SKP_Silk_nsq_state ) );
+ psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex;
+ /* Increase Gains to get target LBRR rate */
+ psEncCtrl->sCmn.GainsIndices[ 0 ] += psEnc->sCmn.LBRR_GainIncreases;
+ psEncCtrl->sCmn.GainsIndices[ 0 ] = SKP_LIMIT( psEncCtrl->sCmn.GainsIndices[ 0 ], 0, N_LEVELS_QGAIN - 1 );
+ }
+ /* Decode to get Gains in sync with decoder */
+ SKP_Silk_gains_dequant( Gains_Q16, psEncCtrl->sCmn.GainsIndices,
+ &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );
+
+ /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->Gains[ k ] = Gains_Q16[ k ] / 65536.0f;
+ }
+
+ /*****************************************/
+ /* Noise shaping quantization */
+ /*****************************************/
+ SKP_Silk_NSQ_wrapper_FLP( psEnc, psEncCtrl, xfw,
+ &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ], 1 );
+ } else {
+ SKP_memset( &psEnc->sCmn.q_LBRR[ psEnc->sCmn.nFramesInPayloadBuf * psEnc->sCmn.frame_length ], 0,
+ psEnc->sCmn.frame_length * sizeof( SKP_int ) );
+
+ psEncCtrl->sCmn.LTP_scaleIndex = 0;
+ }
+ /****************************************/
+ /* Initialize arithmetic coder */
+ /****************************************/
+ if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) {
+ ec_byte_writeinit_buffer( &range_enc_celt_buf, psEnc->sCmn.sRC_LBRR.buffer, MAX_ARITHM_BYTES );
+ ec_enc_init( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state, &range_enc_celt_buf );
+
+ SKP_Silk_range_enc_init( &psEnc->sCmn.sRC_LBRR );
+ psEnc->sCmn.nBytesInPayloadBuf = 0;
+ }
+
+ /****************************************/
+ /* Encode Parameters */
+ /****************************************/
+ SKP_Silk_encode_parameters_v4( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sCmn.sRC_LBRR );
+
+ /****************************************/
+ /* Encode Parameters */
+ /****************************************/
+ if( psEnc->sCmn.sRC_LBRR.error ) {
+ /* Encoder returned error: Clear payload buffer */
+ nFramesInPayloadBuf = 0;
+ } else {
+ nFramesInPayloadBuf = psEnc->sCmn.nFramesInPayloadBuf + 1;
+ }
+
+ /****************************************/
+ /* Finalize payload and copy to output */
+ /****************************************/
+ if( psEnc->sCmn.nFramesInPayloadBuf * SUB_FRAME_LENGTH_MS * psEnc->sCmn.nb_subfr >= psEnc->sCmn.PacketSize_ms ) {
+
+ /* Check if FEC information should be added */
+ frame_terminator = SKP_SILK_LAST_FRAME;
+
+ /* Add the frame termination info to stream */
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_v4_CDF );
+
+ /*********************************************/
+ /* Encode quantization indices of excitation */
+ /*********************************************/
+ for( i = 0; i < nFramesInPayloadBuf; i++ ) {
+ SKP_Silk_encode_pulses( &psEnc->sCmn.sRC_LBRR, psEnc->sCmn.sigtype[ i ], psEnc->sCmn.QuantOffsetType[ i ],
+ &psEnc->sCmn.q_LBRR[ i * psEnc->sCmn.frame_length ], psEnc->sCmn.frame_length );
+ }
+
+ /* Payload length so far */
+ SKP_Silk_range_encoder_get_length( &psEnc->sCmn.sRC_LBRR, &nBytes );
+
+ /* Check that there is enough space in external output buffer and move data */
+ if( *pnBytesOut >= nBytes ) {
+ SKP_int bits_in_stream, mask;
+ bits_in_stream = ec_enc_tell( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state, 0 );
+ ec_enc_done( &psEnc->sCmn.sRC_LBRR.range_enc_celt_state );
+
+ /* Fill up any remaining bits in the last byte with 1s */
+ if( bits_in_stream & 7 ) {
+ mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );
+ if( nBytes - 1 < *pnBytesOut ) {
+ psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf[ nBytes - 1 ] |= mask;
+ }
+ }
+ SKP_memcpy( pCode, psEnc->sCmn.sRC_LBRR.range_enc_celt_state.buf->buf, nBytes * sizeof( SKP_uint8 ) );
+
+ *pnBytesOut = nBytes;
+ } else {
+ /* Not enough space: Payload will be discarded */
+ *pnBytesOut = 0;
+ SKP_assert( 0 );
+ }
+ } else {
+ /* No payload for you this time */
+ *pnBytesOut = 0;
+
+ /* Encode that more frames follows */
+ frame_terminator = SKP_SILK_MORE_FRAMES;
+ SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_v4_CDF );
+ }
+
+ /* Restore original Gains */
+ SKP_memcpy( psEncCtrl->sCmn.GainsIndices, TempGainsIndices, psEnc->sCmn.nb_subfr * sizeof( SKP_int ) );
+ SKP_memcpy( psEncCtrl->Gains, TempGains, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) );
+
+ /* Restore LTP scale index and typeoffset */
+ psEncCtrl->sCmn.LTP_scaleIndex = LTP_scaleIndex;
+ psEnc->sCmn.typeOffsetPrev = typeOffset;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_find_LPC_FLP.c
@@ -1,0 +1,97 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+void SKP_Silk_find_LPC_FLP(
+ SKP_float NLSF[], /* O NLSFs */
+ SKP_int *interpIndex, /* O NLSF interp. index for NLSF interp. */
+ const SKP_float prev_NLSFq[], /* I Previous NLSFs, for NLSF interpolation */
+ const SKP_int useInterpNLSFs, /* I Flag */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_float x[], /* I Input signal */
+ const SKP_int subfr_length, /* I Subframe length incl preceeding samples */
+ const SKP_int nb_subfr /* I: Number of subframes */
+)
+{
+ SKP_int k;
+ SKP_float a[ MAX_LPC_ORDER ];
+
+ /* Used only for NLSF interpolation */
+ double res_nrg, res_nrg_2nd, res_nrg_interp;
+ SKP_float a_tmp[ MAX_LPC_ORDER ], NLSF0[ MAX_LPC_ORDER ];
+ SKP_float LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ];
+
+ /* Default: No interpolation */
+ *interpIndex = 4;
+
+ /* Burg AR analysis for the full frame */
+ res_nrg = SKP_Silk_burg_modified_FLP( a, x, subfr_length, nb_subfr, FIND_LPC_COND_FAC, LPC_order );
+
+ if( useInterpNLSFs == 1 && nb_subfr == MAX_NB_SUBFR ) {
+ /* Optimal solution for last 10 ms; subtract residual energy here, as that's easier than */
+ /* adding it to the residual energy of the first 10 ms in each iteration of the search below */
+ res_nrg -= SKP_Silk_burg_modified_FLP( a_tmp, x + ( MAX_NB_SUBFR / 2 ) * subfr_length,
+ subfr_length, MAX_NB_SUBFR / 2, FIND_LPC_COND_FAC, LPC_order );
+
+ /* Convert to NLSFs */
+ SKP_Silk_A2NLSF_FLP( NLSF, a_tmp, LPC_order );
+
+ /* Search over interpolation indices to find the one with lowest residual energy */
+ res_nrg_2nd = SKP_float_MAX;
+ for( k = 3; k >= 0; k-- ) {
+ /* Interpolate NLSFs for first half */
+ SKP_Silk_interpolate_wrapper_FLP( NLSF0, prev_NLSFq, NLSF, 0.25f * k, LPC_order );
+
+ /* Convert to LPC for residual energy evaluation */
+ SKP_Silk_NLSF2A_stable_FLP( a_tmp, NLSF0, LPC_order );
+
+ /* Calculate residual energy with LSF interpolation */
+ SKP_Silk_LPC_analysis_filter_FLP( LPC_res, a_tmp, x, 2 * subfr_length, LPC_order );
+ res_nrg_interp =
+ SKP_Silk_energy_FLP( LPC_res + LPC_order, subfr_length - LPC_order ) +
+ SKP_Silk_energy_FLP( LPC_res + LPC_order + subfr_length, subfr_length - LPC_order );
+
+ /* Determine whether current interpolated NLSFs are best so far */
+ if( res_nrg_interp < res_nrg ) {
+ /* Interpolation has lower residual energy */
+ res_nrg = res_nrg_interp;
+ *interpIndex = k;
+ } else if( res_nrg_interp > res_nrg_2nd ) {
+ /* No reason to continue iterating - residual energies will continue to climb */
+ break;
+ }
+ res_nrg_2nd = res_nrg_interp;
+ }
+ }
+
+ if( *interpIndex == 4 ) {
+ /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */
+ SKP_Silk_A2NLSF_FLP( NLSF, a, LPC_order );
+ }
+
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_find_LTP_FLP.c
@@ -1,0 +1,124 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+void SKP_Silk_find_LTP_FLP(
+ SKP_float b[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */
+ SKP_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */
+ SKP_float *LTPredCodGain, /* O LTP coding gain */
+ const SKP_float r_lpc[], /* I LPC residual */
+ const SKP_int lag[ MAX_NB_SUBFR ], /* I LTP lags */
+ const SKP_float Wght[ MAX_NB_SUBFR ], /* I Weights */
+ const SKP_int subfr_length, /* I Subframe length */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int mem_offset /* I Number of samples in LTP memory */
+)
+{
+ SKP_int i, k;
+ SKP_float *b_ptr, temp, *WLTP_ptr;
+ SKP_float LPC_res_nrg, LPC_LTP_res_nrg;
+ SKP_float d[ MAX_NB_SUBFR ], m, g, delta_b[ LTP_ORDER ];
+ SKP_float w[ MAX_NB_SUBFR ], nrg[ MAX_NB_SUBFR ], regu;
+ SKP_float Rr[ LTP_ORDER ], rr[ MAX_NB_SUBFR ];
+ const SKP_float *r_ptr, *lag_ptr;
+
+ b_ptr = b;
+ WLTP_ptr = WLTP;
+ r_ptr = &r_lpc[ mem_offset ];
+ for( k = 0; k < nb_subfr; k++ ) {
+ lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 );
+
+ SKP_Silk_corrMatrix_FLP( lag_ptr, subfr_length, LTP_ORDER, WLTP_ptr );
+ SKP_Silk_corrVector_FLP( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr );
+
+ rr[ k ] = ( SKP_float )SKP_Silk_energy_FLP( r_ptr, subfr_length );
+ regu = LTP_DAMPING * ( rr[ k ] + 1.0f );
+ SKP_Silk_regularize_correlations_FLP( WLTP_ptr, &rr[ k ], regu, LTP_ORDER );
+ SKP_Silk_solve_LDL_FLP( WLTP_ptr, LTP_ORDER, Rr, b_ptr );
+
+ /* Calculate residual energy */
+ nrg[ k ] = SKP_Silk_residual_energy_covar_FLP( b_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER );
+
+ temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length );
+ SKP_Silk_scale_vector_FLP( WLTP_ptr, temp, LTP_ORDER * LTP_ORDER );
+ w[ k ] = matrix_ptr( WLTP_ptr, LTP_ORDER / 2, LTP_ORDER / 2, LTP_ORDER );
+
+ r_ptr += subfr_length;
+ b_ptr += LTP_ORDER;
+ WLTP_ptr += LTP_ORDER * LTP_ORDER;
+ }
+
+ /* Compute LTP coding gain */
+ if( LTPredCodGain != NULL ) {
+ LPC_LTP_res_nrg = 1e-6f;
+ LPC_res_nrg = 0.0f;
+ for( k = 0; k < nb_subfr; k++ ) {
+ LPC_res_nrg += rr[ k ] * Wght[ k ];
+ LPC_LTP_res_nrg += nrg[ k ] * Wght[ k ];
+ }
+
+ SKP_assert( LPC_LTP_res_nrg > 0 );
+ *LTPredCodGain = 3.0f * SKP_Silk_log2( LPC_res_nrg / LPC_LTP_res_nrg );
+ }
+
+ /* Smoothing */
+ /* d = sum( B, 1 ); */
+ b_ptr = b;
+ for( k = 0; k < nb_subfr; k++ ) {
+ d[ k ] = 0;
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ d[ k ] += b_ptr[ i ];
+ }
+ b_ptr += LTP_ORDER;
+ }
+ /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */
+ temp = 1e-3f;
+ for( k = 0; k < nb_subfr; k++ ) {
+ temp += w[ k ];
+ }
+ m = 0;
+ for( k = 0; k < nb_subfr; k++ ) {
+ m += d[ k ] * w[ k ];
+ }
+ m = m / temp;
+
+ b_ptr = b;
+ for( k = 0; k < nb_subfr; k++ ) {
+ g = LTP_SMOOTHING / ( LTP_SMOOTHING + w[ k ] ) * ( m - d[ k ] );
+ temp = 0;
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ delta_b[ i ] = SKP_max_float( b_ptr[ i ], 0.1f );
+ temp += delta_b[ i ];
+ }
+ temp = g / temp;
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ b_ptr[ i ] = b_ptr[ i ] + delta_b[ i ] * temp;
+ }
+ b_ptr += LTP_ORDER;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_find_pitch_lags_FLP.c
@@ -1,0 +1,112 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include <stdlib.h>
+#include "SKP_Silk_main_FLP.h"
+
+void SKP_Silk_find_pitch_lags_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_float res[], /* O Residual */
+ const SKP_float x[] /* I Speech signal */
+)
+{
+ SKP_Silk_predict_state_FLP *psPredSt = &psEnc->sPred;
+ const SKP_float *x_buf_ptr, *x_buf;
+ SKP_float auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ];
+ SKP_float A[ MAX_FIND_PITCH_LPC_ORDER ];
+ SKP_float refl_coef[ MAX_FIND_PITCH_LPC_ORDER ];
+ SKP_float Wsig[ FIND_PITCH_LPC_WIN_MAX ];
+ SKP_float thrhld, *Wsig_ptr;
+ SKP_int buf_len;
+
+ /******************************************/
+ /* Setup buffer lengths etc based on Fs */
+ /******************************************/
+ buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length;
+
+ /* Safty check */
+ SKP_assert( buf_len >= psPredSt->pitch_LPC_win_length );
+
+ x_buf = x - psEnc->sCmn.ltp_mem_length;
+
+ /******************************************/
+ /* Estimate LPC AR coeficients */
+ /******************************************/
+
+ /* Calculate windowed signal */
+
+ /* First LA_LTP samples */
+ x_buf_ptr = x_buf + buf_len - psPredSt->pitch_LPC_win_length;
+ Wsig_ptr = Wsig;
+ SKP_Silk_apply_sine_window_FLP( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch );
+
+ /* Middle non-windowed samples */
+ Wsig_ptr += psEnc->sCmn.la_pitch;
+ x_buf_ptr += psEnc->sCmn.la_pitch;
+ SKP_memcpy( Wsig_ptr, x_buf_ptr, ( psPredSt->pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 ) ) * sizeof( SKP_float ) );
+
+ /* Last LA_LTP samples */
+ Wsig_ptr += psPredSt->pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 );
+ x_buf_ptr += psPredSt->pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 );
+ SKP_Silk_apply_sine_window_FLP( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch );
+
+ /* Calculate autocorrelation sequence */
+ SKP_Silk_autocorrelation_FLP( auto_corr, Wsig, psPredSt->pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1 );
+
+ /* Add white noise, as a fraction of the energy */
+ auto_corr[ 0 ] += auto_corr[ 0 ] * FIND_PITCH_WHITE_NOISE_FRACTION;
+
+ /* Calculate the reflection coefficients using Schur */
+ SKP_Silk_schur_FLP( refl_coef, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder );
+
+ /* Convert reflection coefficients to prediction coefficients */
+ SKP_Silk_k2a_FLP( A, refl_coef, psEnc->sCmn.pitchEstimationLPCOrder );
+
+ /* Bandwidth expansion */
+ SKP_Silk_bwexpander_FLP( A, psEnc->sCmn.pitchEstimationLPCOrder, FIND_PITCH_BANDWITH_EXPANSION );
+
+ /*****************************************/
+ /* LPC analysis filtering */
+ /*****************************************/
+ SKP_Silk_LPC_analysis_filter_FLP( res, A, x_buf, buf_len, psEnc->sCmn.pitchEstimationLPCOrder );
+ SKP_memset( res, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_float ) );
+
+ /* Threshold for pitch estimator */
+ thrhld = 0.5f;
+ thrhld -= 0.004f * psEnc->sCmn.pitchEstimationLPCOrder;
+ thrhld -= 0.1f * ( SKP_float )sqrt( psEnc->speech_activity );
+ thrhld += 0.14f * psEnc->sCmn.prev_sigtype;
+ thrhld -= 0.12f * psEncCtrl->input_tilt;
+
+ /*****************************************/
+ /* Call Pitch estimator */
+ /*****************************************/
+ psEncCtrl->sCmn.sigtype = SKP_Silk_pitch_analysis_core_FLP( res, psEncCtrl->sCmn.pitchL, &psEncCtrl->sCmn.lagIndex,
+ &psEncCtrl->sCmn.contourIndex, &psEnc->LTPCorr, psEnc->sCmn.prevLag, psEnc->pitchEstimationThreshold,
+ thrhld, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr );
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_find_pred_coefs_FLP.c
@@ -1,0 +1,110 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+
+void SKP_Silk_find_pred_coefs_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_float res_pitch[] /* I Residual from pitch analysis */
+)
+{
+ SKP_int i;
+ SKP_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ];
+ SKP_float invGains[ MAX_NB_SUBFR ], Wght[ MAX_NB_SUBFR ];
+ SKP_float NLSF[ MAX_LPC_ORDER ];
+ const SKP_float *x_ptr;
+ SKP_float *x_pre_ptr, LPC_in_pre[ MAX_NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ];
+
+
+ /* Weighting for weighted least squares */
+ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {
+ SKP_assert( psEncCtrl->Gains[ i ] > 0.0f );
+ invGains[ i ] = 1.0f / psEncCtrl->Gains[ i ];
+ Wght[ i ] = invGains[ i ] * invGains[ i ];
+ }
+
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /**********/
+ /* VOICED */
+ /**********/
+ SKP_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->sCmn.pitchL[ 0 ] + LTP_ORDER / 2 );
+
+ /* LTP analysis */
+ SKP_Silk_find_LTP_FLP( psEncCtrl->LTPCoef, WLTP, &psEncCtrl->LTPredCodGain, res_pitch,
+ psEncCtrl->sCmn.pitchL, Wght, psEnc->sCmn.subfr_length,
+ psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length );
+
+ /* Quantize LTP gain parameters */
+ SKP_Silk_quant_LTP_gains_FLP( psEncCtrl->LTPCoef, psEncCtrl->sCmn.LTPIndex, &psEncCtrl->sCmn.PERIndex,
+ WLTP, psEnc->mu_LTP, psEnc->sCmn.LTPQuantLowComplexity , psEnc->sCmn.nb_subfr );
+
+ /* Control LTP scaling */
+ SKP_Silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl );
+
+ /* Create LTP residual */
+ SKP_Silk_LTP_analysis_filter_FLP( LPC_in_pre, psEnc->x_buf + psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder,
+ psEncCtrl->LTPCoef, psEncCtrl->sCmn.pitchL, invGains, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );
+
+ } else {
+ /************/
+ /* UNVOICED */
+ /************/
+ /* Create signal with prepended subframes, scaled by inverse gains */
+ x_ptr = psEnc->x_buf + psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder;
+ x_pre_ptr = LPC_in_pre;
+ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) {
+ SKP_Silk_scale_copy_vector_FLP( x_pre_ptr, x_ptr, invGains[ i ],
+ psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder );
+ x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder;
+ x_ptr += psEnc->sCmn.subfr_length;
+ }
+
+ SKP_memset( psEncCtrl->LTPCoef, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( SKP_float ) );
+ psEncCtrl->LTPredCodGain = 0.0f;
+ }
+
+ /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */
+ SKP_Silk_find_LPC_FLP( NLSF, &psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq,
+ psEnc->sCmn.useInterpolatedNLSFs * ( 1 - psEnc->sCmn.first_frame_after_reset ), psEnc->sCmn.predictLPCOrder,
+ LPC_in_pre, psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder, psEnc->sCmn.nb_subfr );
+
+
+ /* Quantize LSFs */
+ SKP_Silk_process_NLSFs_FLP( psEnc, psEncCtrl, NLSF );
+
+ /* Calculate residual energy using quantized LPC coefficients */
+ SKP_Silk_residual_energy_FLP( psEncCtrl->ResNrg, LPC_in_pre, psEncCtrl->PredCoef, psEncCtrl->Gains,
+ psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder );
+
+ /* Copy to prediction struct for use in next frame for fluctuation reduction */
+ SKP_memcpy( psEnc->sPred.prev_NLSFq, NLSF, psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );
+
+
+}
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_init_encoder_FLP.c
@@ -1,0 +1,63 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include <stdlib.h>
+#include "SKP_Silk_main_FLP.h"
+
+/*********************************/
+/* Initialize Silk Encoder state */
+/*********************************/
+SKP_int SKP_Silk_init_encoder_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */
+) {
+ SKP_int ret = 0;
+
+ /* Clear the entire encoder state */
+ SKP_memset( psEnc, 0, sizeof( SKP_Silk_encoder_state_FLP ) );
+
+ /* Initialize to 24 kHz API sampling, 24 kHz max internal sampling, 20 ms packets, 25 kbps, 0% packet loss, and init non-zero values */
+ ret = SKP_Silk_control_encoder_FLP( psEnc, 24000, 24, 20, 25, 0, 0, 0, 10, 0 );
+
+#if HIGH_PASS_INPUT
+ psEnc->variable_HP_smth1 = SKP_Silk_log2( 70.0 );
+ psEnc->variable_HP_smth2 = SKP_Silk_log2( 70.0 );
+#endif
+
+ /* Used to deactivate e.g. LSF interpolation and fluctuation reduction */
+ psEnc->sCmn.first_frame_after_reset = 1;
+ psEnc->sCmn.fs_kHz_changed = 0;
+ psEnc->sCmn.LBRR_enabled = 0;
+
+ /* Initialize Silk VAD */
+ ret += SKP_Silk_VAD_Init( &psEnc->sCmn.sVAD );
+
+ /* Initialize NSQ */
+ psEnc->sNSQ.prev_inv_gain_Q16 = 65536;
+ psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536;
+
+ return( ret );
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_main_FLP.h
@@ -1,0 +1,435 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_MAIN_FLP_H
+#define SKP_SILK_MAIN_FLP_H
+
+#include "SKP_Silk_SigProc_FLP.h"
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_structs_FLP.h"
+#include "SKP_Silk_tables_FLP.h"
+#include "SKP_Silk_main.h"
+#include "SKP_Silk_define_FLP.h"
+
+/* uncomment to compile without SSE optimizations */
+//#undef SKP_USE_SSE
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+void SKP_Silk_LBRR_ctrl_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I Encoder state FLP */
+ SKP_Silk_encoder_control *psEncCtrl /* I/O Encoder control */
+);
+
+void SKP_Silk_LTP_scale_ctrl_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */
+);
+
+void SKP_Silk_quant_LTP_gains_FLP(
+ SKP_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */
+ SKP_int cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */
+ SKP_int *periodicity_index, /* O Periodicity index */
+ const SKP_float W[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Error weights */
+ const SKP_float mu, /* I Mu value (R/D tradeoff) */
+ const SKP_int lowComplexity, /* I Flag for low complexity */
+ const SKP_int nb_subfr /* I number of subframes */
+);
+
+/*********************/
+/* Encoder Functions */
+/*********************/
+
+/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */
+void SKP_Silk_HP_variable_cutoff_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_int16 *out, /* O High-pass filtered output signal */
+ const SKP_int16 *in /* I Input signal */
+);
+
+/* Encoder main function */
+SKP_int SKP_Silk_encode_frame_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_uint8 *pCode, /* O Payload */
+ SKP_int16 *pnBytesOut, /* I/O Number of payload bytes; */
+ /* input: max length; output: used */
+ const SKP_int16 *pIn /* I Input speech frame */
+);
+
+/* Limit, stabilize, and quantize NLSFs */
+void SKP_Silk_process_NLSFs_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_float *pNLSF /* I/O NLSFs (quantized output) */
+);
+
+/* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */
+void SKP_Silk_LBRR_encode_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_uint8 *pCode, /* O Payload */
+ SKP_int16 *pnBytesOut, /* I/O Payload bytes; in: max; out: used */
+ const SKP_float xfw[] /* I Input signal */
+);
+
+/* Initializes the Silk encoder state */
+SKP_int SKP_Silk_init_encoder_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */
+);
+
+/* Control the Silk encoder */
+SKP_int SKP_Silk_control_encoder_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */
+ const SKP_int32 API_fs_Hz, /* I External (API) sampling rate (Hz) */
+ const SKP_int max_internal_fs_kHz,/* I Maximum internal sampling rate (kHz) */
+ const SKP_int PacketSize_ms, /* I Packet length (ms) */
+ SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) (used if SNR_dB == 0) */
+ const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */
+ const SKP_int INBandFEC_enabled, /* I Enable (1) / disable (0) inband FEC */
+ const SKP_int DTX_enabled, /* I Enable / disable DTX */
+ const SKP_int InputFramesize_ms, /* I Inputframe in ms */
+ const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */
+);
+
+/****************/
+/* Prefiltering */
+/****************/
+/* Main Prefilter Function */
+void SKP_Silk_prefilter_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ const SKP_Silk_encoder_control_FLP *psEncCtrl, /* I Encoder control FLP */
+ SKP_float xw[], /* O Weighted signal */
+ const SKP_float x[] /* I Speech signal */
+);
+
+/**************************/
+/* Noise shaping analysis */
+/**************************/
+/* Compute noise shaping coefficients and initial gain values */
+void SKP_Silk_noise_shape_analysis_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_float *pitch_res, /* I LPC residual from pitch analysis */
+ const SKP_float *x /* I Input signal [frame_length + la_shape] */
+);
+
+/* Autocorrelations for a warped frequency axis */
+void SKP_Silk_warped_autocorrelation_FLP(
+ SKP_float *corr, /* O Result [order + 1] */
+ const SKP_float *input, /* I Input data to correlate */
+ const SKP_float warping, /* I Warping coefficient */
+ const SKP_int length, /* I Length of input */
+ const SKP_int order /* I Correlation order (even) */
+);
+
+/**************/
+/* Find pitch */
+/**************/
+void SKP_Silk_find_pitch_lags_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_float res[], /* O Residual */
+ const SKP_float x[] /* I Speech signal */
+);
+
+/******************/
+/* NLSF Quantizer */
+/******************/
+/* NLSF vector encoder */
+void SKP_Silk_NLSF_MSVQ_encode_FLP(
+ SKP_int *NLSFIndices, /* O Codebook path vector [ CB_STAGES ] */
+ SKP_float *pNLSF, /* I/O Quantized NLSF vector [ LPC_ORDER ] */
+ const SKP_Silk_NLSF_CB_FLP *psNLSF_CB_FLP, /* I Codebook object */
+ const SKP_float *pNLSF_q_prev, /* I Prev. quantized NLSF vector [LPC_ORDER] */
+ const SKP_float *pW, /* I NLSF weight vector [ LPC_ORDER ] */
+ const SKP_float NLSF_mu, /* I Rate weight for the RD optimization */
+ const SKP_float NLSF_mu_fluc_red, /* I Fluctuation reduction error weight */
+ const SKP_int NLSF_MSVQ_Survivors,/* I Max survivors from each stage */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_int deactivate_fluc_red /* I Deactivate fluctuation reduction */
+);
+
+/* NLSF vector decoder */
+void SKP_Silk_NLSF_MSVQ_decode_FLP(
+ SKP_float *pNLSF, /* O Decoded output vector [ LPC_ORDER ] */
+ const SKP_Silk_NLSF_CB_FLP *psNLSF_CB_FLP, /* I NLSF codebook struct */
+ const SKP_int *NLSFIndices, /* I NLSF indices [ nStages ] */
+ const SKP_int LPC_order /* I LPC order used */
+);
+
+/* Rate-Distortion calculations for multiple input data vectors */
+void SKP_Silk_NLSF_VQ_rate_distortion_FLP(
+ SKP_float *pRD, /* O Rate-distortion values [psNLSF_CBS_FLP->nVectors*N] */
+ const SKP_Silk_NLSF_CBS_FLP *psNLSF_CBS_FLP, /* I NLSF codebook stage struct */
+ const SKP_float *in, /* I Input vectors to be quantized */
+ const SKP_float *w, /* I Weight vector */
+ const SKP_float *rate_acc, /* I Accumulated rates from previous stage */
+ const SKP_float mu, /* I Weight between weighted error and rate */
+ const SKP_int N, /* I Number of input vectors to be quantized */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+/* compute weighted quantization errors for LPC_order element input vectors, over one codebook stage */
+void SKP_Silk_NLSF_VQ_sum_error_FLP(
+ SKP_float *err, /* O Weighted quantization errors [ N * K ] */
+ const SKP_float *in, /* I Input vectors [ N * LPC_order ] */
+ const SKP_float *w, /* I Weighting vectors [ N * LPC_order ] */
+ const SKP_float *pCB, /* I Codebook vectors [ K * LPC_order ] */
+ const SKP_int N, /* I Number of input vectors */
+ const SKP_int K, /* I Number of codebook vectors */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */
+SKP_float SKP_Silk_residual_energy_covar_FLP( /* O Weighted residual energy */
+ const SKP_float *c, /* I Filter coefficients */
+ SKP_float *wXX, /* I/O Weighted correlation matrix, reg. out */
+ const SKP_float *wXx, /* I Weighted correlation vector */
+ const SKP_float wxx, /* I Weighted correlation value */
+ const SKP_int D /* I Dimension */
+);
+
+/* Entropy constrained MATRIX-weighted VQ, for a single input data vector */
+void SKP_Silk_VQ_WMat_EC_FLP(
+ SKP_int *ind, /* O Index of best codebook vector */
+ SKP_float *rate_dist, /* O Best weighted quant. error + mu * rate */
+ const SKP_float *in, /* I Input vector to be quantized */
+ const SKP_float *W, /* I Weighting matrix */
+ const SKP_int16 *cb, /* I Codebook */
+ const SKP_int16 *cl_Q6, /* I Code length for each codebook vector */
+ const SKP_float mu, /* I Tradeoff between WSSE and rate */
+ const SKP_int L /* I Number of vectors in codebook */
+);
+
+/* Processing of gains */
+void SKP_Silk_process_gains_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */
+);
+
+void SKP_Silk_find_LTP_FLP(
+ SKP_float b[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */
+ SKP_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */
+ SKP_float *LTPredCodGain, /* O LTP coding gain */
+ const SKP_float r_lpc[], /* I LPC residual */
+ const SKP_int lag[ MAX_NB_SUBFR ], /* I LTP lags */
+ const SKP_float Wght[ MAX_NB_SUBFR ], /* I Weights */
+ const SKP_int subfr_length, /* I Subframe length */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int mem_offset /* I Number of samples in LTP memory */
+);
+
+void SKP_Silk_find_LPC_FLP(
+ SKP_float NLSF[], /* O NLSFs */
+ SKP_int *interpIndex, /* O NLSF interp. index for NLSF interp. */
+ const SKP_float prev_NLSFq[], /* I Previous NLSFs, for NLSF interpolation */
+ const SKP_int useInterpNLSFs, /* I Flag */
+ const SKP_int LPC_order, /* I LPC order */
+ const SKP_float x[], /* I Input signal */
+ const SKP_int subfr_length, /* I Subframe length incl preceeding samples */
+ const SKP_int nb_subfr /* I: Number of subframes */
+);
+
+void SKP_Silk_LTP_analysis_filter_FLP(
+ SKP_float *LTP_res, /* O LTP res MAX_NB_SUBFR*(pre_lgth+subfr_lngth) */
+ const SKP_float *x, /* I Input signal, with preceeding samples */
+ const SKP_float B[ LTP_ORDER * MAX_NB_SUBFR ], /* I LTP coefficients for each subframe */
+ const SKP_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */
+ const SKP_float invGains[ MAX_NB_SUBFR ], /* I Inverse quantization gains */
+ const SKP_int subfr_length, /* I Length of each subframe */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int pre_length /* I Preceeding samples for each subframe */
+);
+
+void SKP_Silk_residual_energy_FLP(
+ SKP_float nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */
+ const SKP_float x[], /* I Input signal */
+ const SKP_float a[ 2 ][ MAX_LPC_ORDER ],/* I AR coefs for each frame half */
+ const SKP_float gains[], /* I Quantization gains */
+ const SKP_int subfr_length, /* I Subframe length */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+void SKP_Silk_find_pred_coefs_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_float res_pitch[] /* I Residual from pitch analysis */
+);
+
+/* 16th order LPC analysis filter */
+void SKP_Silk_LPC_analysis_filter_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length, /* I Length of input signal */
+ const SKP_int Order /* I LPC order */
+);
+
+/* 16th order LPC analysis filter, does not write first 16 samples */
+void SKP_Silk_LPC_analysis_filter16_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+);
+
+/* 12th order LPC analysis filter, does not write first 12 samples */
+void SKP_Silk_LPC_analysis_filter12_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+);
+
+/* 10th order LPC analysis filter, does not write first 10 samples */
+void SKP_Silk_LPC_analysis_filter10_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+);
+
+/* 8th order LPC analysis filter, does not write first 8 samples */
+void SKP_Silk_LPC_analysis_filter8_FLP(
+ SKP_float r_LPC[], /* O LPC residual signal */
+ const SKP_float PredCoef[], /* I LPC coefficients */
+ const SKP_float s[], /* I Input signal */
+ const SKP_int length /* I Length of input signal */
+);
+
+/******************/
+/* Linear Algebra */
+/******************/
+/* Calculates correlation matrix X'*X */
+void SKP_Silk_corrMatrix_FLP(
+ const SKP_float *x, /* I x vector [ L+order-1 ] used to create X */
+ const SKP_int L, /* I Length of vectors */
+ const SKP_int Order, /* I Max lag for correlation */
+ SKP_float *XX /* O X'*X correlation matrix [order x order] */
+);
+
+/* Calculates correlation vector X'*t */
+void SKP_Silk_corrVector_FLP(
+ const SKP_float *x, /* I x vector [L+order-1] used to create X */
+ const SKP_float *t, /* I Target vector [L] */
+ const SKP_int L, /* I Length of vecors */
+ const SKP_int Order, /* I Max lag for correlation */
+ SKP_float *Xt /* O X'*t correlation vector [order] */
+);
+
+void SKP_Silk_regularize_correlations_FLP(
+ SKP_float *XX, /* I/O Correlation matrices */
+ SKP_float *xx, /* I/O Correlation values */
+ const SKP_float noise, /* I Noise energy to add */
+ const SKP_int D /* I Dimension of XX */
+);
+
+/* Function to solve linear equation Ax = b, when A is an MxM symmetric square matrix */
+void SKP_Silk_solve_LDL_FLP(
+ SKP_float *A, /* I/O Symmetric square matrix, out: reg. */
+ const SKP_int M, /* I Size of matrix */
+ const SKP_float *b, /* I Pointer to b vector */
+ SKP_float *x /* O Pointer to x solution vector */
+);
+
+/* Apply sine window to signal vector. */
+/* Window types: */
+/* 0 -> sine window from 0 to pi */
+/* 1 -> sine window from 0 to pi/2 */
+/* 2 -> sine window from pi/2 to pi */
+void SKP_Silk_apply_sine_window_FLP(
+ SKP_float px_win[], /* O Pointer to windowed signal */
+ const SKP_float px[], /* I Pointer to input signal */
+ const SKP_int win_type, /* I Selects a window type */
+ const SKP_int length /* I Window length, multiple of 4 */
+);
+
+/* Wrappers. Calls flp / fix code */
+
+/* Convert AR filter coefficients to NLSF parameters */
+void SKP_Silk_A2NLSF_FLP(
+ SKP_float *pNLSF, /* O NLSF vector [ LPC_order ] */
+ const SKP_float *pAR, /* I LPC coefficients [ LPC_order ] */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+/* Convert NLSF parameters to AR prediction filter coefficients */
+void SKP_Silk_NLSF2A_stable_FLP(
+ SKP_float *pAR, /* O LPC coefficients [ LPC_order ] */
+ const SKP_float *pNLSF, /* I NLSF vector [ LPC_order ] */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+/* NLSF stabilizer, for a single input data vector */
+void SKP_Silk_NLSF_stabilize_FLP(
+ SKP_float *pNLSF, /* I/O (Un)stable NLSF vector [ LPC_order ] */
+ const SKP_float *pNDelta_min, /* I Normalized delta min vector[LPC_order+1]*/
+ const SKP_int LPC_order /* I LPC order */
+);
+
+/* Interpolation function with fixed point rounding */
+void SKP_Silk_interpolate_wrapper_FLP(
+ SKP_float xi[], /* O Interpolated vector */
+ const SKP_float x0[], /* I First vector */
+ const SKP_float x1[], /* I Second vector */
+ const SKP_float ifact, /* I Interp. factor, weight on second vector */
+ const SKP_int d /* I Number of parameters */
+);
+
+/****************************************/
+/* Floating-point Silk VAD wrapper */
+/****************************************/
+SKP_int SKP_Silk_VAD_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_int16 *pIn /* I Input signal */
+);
+
+/****************************************/
+/* Floating-point Silk NSQ wrapper */
+/****************************************/
+void SKP_Silk_NSQ_wrapper_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_float x[], /* I Prefiltered input signal */
+ SKP_int8 q[], /* O Quantized pulse signal */
+ const SKP_int useLBRR /* I LBRR flag */
+);
+
+/* using log2() helps the fixed-point conversion */
+SKP_INLINE SKP_float SKP_Silk_log2( double x ) { return ( SKP_float )( 3.32192809488736 * log10( x ) ); }
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_FLP/SKP_Silk_noise_shape_analysis_FLP.c
@@ -1,0 +1,367 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+#include "SKP_Silk_perceptual_parameters.h"
+
+/* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */
+/* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */
+SKP_INLINE SKP_float warped_gain(
+ const SKP_float *coefs,
+ SKP_float lambda,
+ SKP_int order
+) {
+ SKP_int i;
+ SKP_float gain;
+
+ lambda = -lambda;
+ gain = coefs[ order - 1 ];
+ for( i = order - 2; i >= 0; i-- ) {
+ gain = lambda * gain + coefs[ i ];
+ }
+ return (SKP_float)( 1.0f / ( 1.0f - lambda * gain ) );
+}
+
+/* Convert warped filter coefficients to monic pseudo-warped coefficients */
+SKP_INLINE void warped_true2monic_coefs(
+ SKP_float *coefs,
+ SKP_float lambda,
+ SKP_int order
+) {
+ SKP_int i;
+ SKP_float gain;
+
+ lambda = -lambda;
+ for( i = order - 1; i > 0; i-- ) {
+ coefs[ i - 1 ] += lambda * coefs[ i ];
+ }
+ gain = ( 1.0f - lambda * lambda ) / ( 1.0f - lambda * coefs[ 0 ] );
+ for( i = 0; i < order; i++ ) {
+ coefs[ i ] *= gain;
+ }
+}
+
+/* Limit max amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */
+SKP_INLINE void limit_warped_coefs(
+ SKP_float *coefs_syn,
+ SKP_float *coefs_ana,
+ SKP_float lambda,
+ SKP_float limit,
+ SKP_int order
+) {
+ SKP_int i, iter, ind;
+ SKP_float tmp, maxabs, chirp;
+
+ for( iter = 0; iter < 10; iter++ ) {
+ /* Find maximum absolute value */
+ ind = 1;
+ maxabs = SKP_abs( coefs_syn[ ind ] );
+ for( i = 2; i < order - 1; i++ ) {
+ tmp = SKP_abs( coefs_syn[ i ] );
+ if( tmp > maxabs ) {
+ maxabs = tmp;
+ ind = i;
+ }
+ }
+ if( maxabs <= limit ) {
+ return;
+ }
+
+ /* Convert to true warped coefficients */
+ for( i = 1; i < order; i++ ) {
+ coefs_syn[ i - 1 ] += lambda * coefs_syn[ i ];
+ coefs_ana[ i - 1 ] += lambda * coefs_ana[ i ];
+ }
+
+ /* Apply bandwidth expansion */
+ chirp = 0.99f - ( 0.8f + 0.1f * iter ) * ( maxabs - limit ) / ( maxabs * ( ind + 1 ) );
+ SKP_Silk_bwexpander_FLP( coefs_syn, order, chirp );
+ SKP_Silk_bwexpander_FLP( coefs_ana, order, chirp );
+
+ /* Convert back to monic warped coefficients */
+ for( i = order - 1; i > 0; i-- ) {
+ coefs_syn[ i - 1 ] -= lambda * coefs_syn[ i ];
+ coefs_ana[ i - 1 ] -= lambda * coefs_ana[ i ];
+ }
+ }
+}
+
+/* Compute noise shaping coefficients and initial gain values */
+void SKP_Silk_noise_shape_analysis_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_float *pitch_res, /* I LPC residual from pitch analysis */
+ const SKP_float *x /* I Input signal [frame_length + la_shape] */
+)
+{
+ SKP_Silk_shape_state_FLP *psShapeSt = &psEnc->sShape;
+ SKP_int k, nSamples;
+ SKP_float SNR_adj_dB, HarmBoost, HarmShapeGain, Tilt;
+ SKP_float nrg, pre_nrg, log_energy, log_energy_prev, energy_variation;
+ SKP_float delta, BWExp1, BWExp2, gain_mult, gain_add, strength, b, warping;
+ SKP_float x_windowed[ SHAPE_LPC_WIN_MAX ];
+ SKP_float auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ];
+ const SKP_float *x_ptr, *pitch_res_ptr;
+
+ /* Point to start of first LPC analysis block */
+ x_ptr = x + psEnc->sCmn.la_shape - SHAPE_LPC_WIN_MS * psEnc->sCmn.fs_kHz + psEnc->sCmn.subfr_length;
+
+ /****************/
+ /* CONTROL SNR */
+ /****************/
+ /* Reduce SNR_dB values if recent bitstream has exceeded TargetRate */
+ psEncCtrl->current_SNR_dB = psEnc->SNR_dB - 0.05f * psEnc->BufferedInChannel_ms;
+
+ /* Reduce SNR_dB if inband FEC used */
+ if( psEnc->speech_activity > LBRR_SPEECH_ACTIVITY_THRES ) {
+ psEncCtrl->current_SNR_dB -= psEnc->inBandFEC_SNR_comp;
+ }
+
+ /****************/
+ /* GAIN CONTROL */
+ /****************/
+ /* Input quality is the average of the quality in the lowest two VAD bands */
+ psEncCtrl->input_quality = 0.5f * ( psEncCtrl->input_quality_bands[ 0 ] + psEncCtrl->input_quality_bands[ 1 ] );
+
+ /* Coding quality level, between 0.0 and 1.0 */
+ psEncCtrl->coding_quality = SKP_sigmoid( 0.25f * ( psEncCtrl->current_SNR_dB - 17.0f ) );
+
+ /* Reduce coding SNR during low speech activity */
+ b = 1.0f - psEnc->speech_activity;
+ SNR_adj_dB = psEncCtrl->current_SNR_dB -
+ BG_SNR_DECR_dB * psEncCtrl->coding_quality * ( 0.5f + 0.5f * psEncCtrl->input_quality ) * b * b;
+
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Reduce gains for periodic signals */
+ SNR_adj_dB += HARM_SNR_INCR_dB * psEnc->LTPCorr;
+ } else {
+ /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */
+ SNR_adj_dB += ( -0.4f * psEncCtrl->current_SNR_dB + 6.0f ) * ( 1.0f - psEncCtrl->input_quality );
+ }
+
+ /*************************/
+ /* SPARSENESS PROCESSING */
+ /*************************/
+ /* Set quantizer offset */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Initally set to 0; may be overruled in process_gains(..) */
+ psEncCtrl->sCmn.QuantOffsetType = 0;
+ psEncCtrl->sparseness = 0.0f;
+ } else {
+ /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */
+ nSamples = 2 * psEnc->sCmn.fs_kHz;
+ energy_variation = 0.0f;
+ log_energy_prev = 0.0f;
+ pitch_res_ptr = pitch_res;
+ for( k = 0; k < SKP_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; k++ ) {
+ nrg = ( SKP_float )nSamples + ( SKP_float )SKP_Silk_energy_FLP( pitch_res_ptr, nSamples );
+ log_energy = SKP_Silk_log2( nrg );
+ if( k > 0 ) {
+ energy_variation += SKP_abs_float( log_energy - log_energy_prev );
+ }
+ log_energy_prev = log_energy;
+ pitch_res_ptr += nSamples;
+ }
+ psEncCtrl->sparseness = SKP_sigmoid( 0.4f * ( energy_variation - 5.0f ) );
+
+ /* Set quantization offset depending on sparseness measure */
+ if( psEncCtrl->sparseness > SPARSENESS_THRESHOLD_QNT_OFFSET ) {
+ psEncCtrl->sCmn.QuantOffsetType = 0;
+ } else {
+ psEncCtrl->sCmn.QuantOffsetType = 1;
+ }
+
+ /* Increase coding SNR for sparse signals */
+ SNR_adj_dB += SPARSE_SNR_INCR_dB * ( psEncCtrl->sparseness - 0.5f );
+ }
+
+ /*******************************/
+ /* Control bandwidth expansion */
+ /*******************************/
+ delta = LOW_RATE_BANDWIDTH_EXPANSION_DELTA * ( 1.0f - 0.75f * psEncCtrl->coding_quality );
+ BWExp1 = BANDWIDTH_EXPANSION - delta;
+ BWExp2 = BANDWIDTH_EXPANSION + delta;
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ /* Less bandwidth expansion for super wideband */
+ BWExp1 = 1.0f - ( 1.0f - BWExp1 ) * SWB_BANDWIDTH_EXPANSION_REDUCTION;
+ BWExp2 = 1.0f - ( 1.0f - BWExp2 ) * SWB_BANDWIDTH_EXPANSION_REDUCTION;
+ }
+ /* BWExp1 will be applied after BWExp2, so make it relative */
+ BWExp1 /= BWExp2;
+
+ /* Warping coefficient */
+ psEncCtrl->sCmn.warping_Q16 = psEnc->sCmn.fs_kHz * WARPING_MULTIPLIER_Q16;
+ psEncCtrl->sCmn.warping_Q16 = SKP_min( psEncCtrl->sCmn.warping_Q16, 32767 );
+ warping = (SKP_float)psEncCtrl->sCmn.warping_Q16 / 65536.0f;
+
+ /********************************************/
+ /* Compute noise shaping AR coefs and gains */
+ /********************************************/
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ /* Apply window */
+ SKP_Silk_apply_sine_window_FLP( x_windowed, x_ptr, 0, SHAPE_LPC_WIN_MS * psEnc->sCmn.fs_kHz );
+
+ /* Update pointer: next LPC analysis block */
+ x_ptr += psEnc->sCmn.subfr_length;
+
+ /* Calculate warped auto correlation */
+ SKP_Silk_warped_autocorrelation_FLP( auto_corr, x_windowed, warping,
+ SHAPE_LPC_WIN_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.shapingLPCOrder );
+
+ /* Add white noise, as a fraction of energy */
+ auto_corr[ 0 ] += auto_corr[ 0 ] * SHAPE_WHITE_NOISE_FRACTION;
+
+ /* Convert correlations to prediction coefficients, and compute residual energy */
+ nrg = SKP_Silk_levinsondurbin_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], auto_corr, psEnc->sCmn.shapingLPCOrder );
+
+ /* Convert residual energy to non-warped scale */
+ gain_mult = warped_gain( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder );
+ nrg *= gain_mult * gain_mult;
+
+ /* Bandwidth expansion for synthesis filter shaping */
+ SKP_Silk_bwexpander_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp2 );
+
+ /* Compute noise shaping filter coefficients */
+ SKP_memcpy(
+ &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ],
+ &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ],
+ psEnc->sCmn.shapingLPCOrder * sizeof( SKP_float ) );
+
+ /* Bandwidth expansion for analysis filter shaping */
+ SKP_Silk_bwexpander_FLP( &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp1 );
+
+ /* Increase residual energy */
+ nrg += SHAPE_MIN_ENERGY_RATIO * auto_corr[ 0 ];
+ psEncCtrl->Gains[ k ] = ( SKP_float )sqrt( nrg );
+
+ /* Ratio of prediction gains, in energy domain */
+ SKP_Silk_LPC_inverse_pred_gain_FLP( &pre_nrg, &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder );
+ SKP_Silk_LPC_inverse_pred_gain_FLP( &nrg, &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder );
+ psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg );
+
+ /* Convert to monic warped prediction coefficients */
+ warped_true2monic_coefs( &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder );
+ warped_true2monic_coefs( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder );
+
+ /* Limit absolute values */
+ limit_warped_coefs( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ],
+ warping, 3.999f, psEnc->sCmn.shapingLPCOrder );
+ }
+
+ /*****************/
+ /* Gain tweaking */
+ /*****************/
+ /* Increase gains during low speech activity and put lower limit on gains */
+ gain_mult = ( SKP_float )pow( 2.0f, -0.16f * SNR_adj_dB );
+ gain_add = ( SKP_float )pow( 2.0f, 0.16f * NOISE_FLOOR_dB ) +
+ ( SKP_float )pow( 2.0f, 0.16f * RELATIVE_MIN_GAIN_dB ) * psEnc->avgGain;
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->Gains[ k ] *= gain_mult;
+ psEncCtrl->Gains[ k ] += gain_add;
+ psEnc->avgGain += psEnc->speech_activity * GAIN_SMOOTHING_COEF * ( psEncCtrl->Gains[ k ] - psEnc->avgGain );
+ }
+
+ /************************************************/
+ /* Decrease level during fricatives (de-essing) */
+ /************************************************/
+ gain_mult = 1.0f + INPUT_TILT + psEncCtrl->coding_quality * HIGH_RATE_INPUT_TILT;
+ if( psEncCtrl->input_tilt <= 0.0f && psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED ) {
+ SKP_float essStrength = -psEncCtrl->input_tilt * psEnc->speech_activity * ( 1.0f - psEncCtrl->sparseness );
+ if( psEnc->sCmn.fs_kHz == 24 ) {
+ gain_mult *= ( SKP_float )pow( 2.0f, -0.16f * DE_ESSER_COEF_SWB_dB * essStrength );
+ } else if( psEnc->sCmn.fs_kHz == 16 ) {
+ gain_mult *= (SKP_float)pow( 2.0f, -0.16f * DE_ESSER_COEF_WB_dB * essStrength );
+ } else {
+ SKP_assert( psEnc->sCmn.fs_kHz == 12 || psEnc->sCmn.fs_kHz == 8 );
+ }
+ }
+
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->GainsPre[ k ] *= gain_mult;
+ }
+
+ /************************************************/
+ /* Control low-frequency shaping and noise tilt */
+ /************************************************/
+ /* Less low frequency shaping for noisy inputs */
+ strength = LOW_FREQ_SHAPING * ( 1.0f + LOW_QUALITY_LOW_FREQ_SHAPING_DECR * ( psEncCtrl->input_quality_bands[ 0 ] - 1.0f ) );
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */
+ /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ b = 0.2f / psEnc->sCmn.fs_kHz + 3.0f / psEncCtrl->sCmn.pitchL[ k ];
+ psEncCtrl->LF_MA_shp[ k ] = -1.0f + b;
+ psEncCtrl->LF_AR_shp[ k ] = 1.0f - b - b * strength;
+ }
+ Tilt = - HP_NOISE_COEF -
+ (1 - HP_NOISE_COEF) * HARM_HP_NOISE_COEF * psEnc->speech_activity;
+ } else {
+ b = 1.3f / psEnc->sCmn.fs_kHz;
+ psEncCtrl->LF_MA_shp[ 0 ] = -1.0f + b;
+ psEncCtrl->LF_AR_shp[ 0 ] = 1.0f - b - b * strength * 0.6f;
+ for( k = 1; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->LF_MA_shp[ k ] = psEncCtrl->LF_MA_shp[ k - 1 ];
+ psEncCtrl->LF_AR_shp[ k ] = psEncCtrl->LF_AR_shp[ k - 1 ];
+ }
+ Tilt = -HP_NOISE_COEF;
+ }
+
+ /****************************/
+ /* HARMONIC SHAPING CONTROL */
+ /****************************/
+ /* Control boosting of harmonic frequencies */
+ HarmBoost = LOW_RATE_HARMONIC_BOOST * ( 1.0f - psEncCtrl->coding_quality ) * psEnc->LTPCorr;
+
+ /* More harmonic boost for noisy input signals */
+ HarmBoost += LOW_INPUT_QUALITY_HARMONIC_BOOST * ( 1.0f - psEncCtrl->input_quality );
+
+ if( USE_HARM_SHAPING && psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ /* Harmonic noise shaping */
+ HarmShapeGain = HARMONIC_SHAPING;
+
+ /* More harmonic noise shaping for high bitrates or noisy input */
+ HarmShapeGain += HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING *
+ ( 1.0f - ( 1.0f - psEncCtrl->coding_quality ) * psEncCtrl->input_quality );
+
+ /* Less harmonic noise shaping for less periodic signals */
+ HarmShapeGain *= ( SKP_float )sqrt( psEnc->LTPCorr );
+ } else {
+ HarmShapeGain = 0.0f;
+ }
+
+ /*************************/
+ /* Smooth over subframes */
+ /*************************/
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psShapeSt->HarmBoost_smth += SUBFR_SMTH_COEF * ( HarmBoost - psShapeSt->HarmBoost_smth );
+ psEncCtrl->HarmBoost[ k ] = psShapeSt->HarmBoost_smth;
+ psShapeSt->HarmShapeGain_smth += SUBFR_SMTH_COEF * ( HarmShapeGain - psShapeSt->HarmShapeGain_smth );
+ psEncCtrl->HarmShapeGain[ k ] = psShapeSt->HarmShapeGain_smth;
+ psShapeSt->Tilt_smth += SUBFR_SMTH_COEF * ( Tilt - psShapeSt->Tilt_smth );
+ psEncCtrl->Tilt[ k ] = psShapeSt->Tilt_smth;
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_prefilter_FLP.c
@@ -1,0 +1,202 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+#include "SKP_Silk_perceptual_parameters.h"
+
+/*
+* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal
+*/
+SKP_INLINE void SKP_Silk_prefilt_FLP(
+ SKP_Silk_prefilter_state_FLP *P,/* I/O state */
+ SKP_float st_res[], /* I */
+ SKP_float xw[], /* O */
+ SKP_float *HarmShapeFIR, /* I */
+ SKP_float Tilt, /* I */
+ SKP_float LF_MA_shp, /* I */
+ SKP_float LF_AR_shp, /* I */
+ SKP_int lag, /* I */
+ SKP_int length /* I */
+);
+
+void SKP_Silk_warped_LPC_analysis_filter_FLP(
+ SKP_float state[], /* I/O State [order + 1] */
+ SKP_float res[], /* O Residual signal [length] */
+ const SKP_float coef[], /* I Coefficients [order] */
+ const SKP_float input[], /* I Input signal [length] */
+ const SKP_float lambda, /* I Warping factor */
+ const SKP_int length, /* I Length of input signal */
+ const SKP_int order /* I Filter order (even) */
+)
+{
+ SKP_int n, i;
+ SKP_float acc, tmp1, tmp2;
+
+ /* Order must be even */
+ SKP_assert( ( order & 1 ) == 0 );
+
+ for( n = 0; n < length; n++ ) {
+ /* Output of lowpass section */
+ tmp2 = state[ 0 ] + lambda * state[ 1 ];
+ state[ 0 ] = input[ n ];
+ /* Output of allpass section */
+ tmp1 = state[ 1 ] + lambda * ( state[ 2 ] - tmp2 );
+ state[ 1 ] = tmp2;
+ acc = coef[ 0 ] * tmp2;
+ /* Loop over allpass sections */
+ for( i = 2; i < order; i += 2 ) {
+ /* Output of allpass section */
+ tmp2 = state[ i ] + lambda * ( state[ i + 1 ] - tmp1 );
+ state[ i ] = tmp1;
+ acc += coef[ i - 1 ] * tmp1;
+ /* Output of allpass section */
+ tmp1 = state[ i + 1 ] + lambda * ( state[ i + 2 ] - tmp2 );
+ state[ i + 1 ] = tmp2;
+ acc += coef[ i ] * tmp2;
+ }
+ state[ order ] = tmp1;
+ acc += coef[ order - 1 ] * tmp1;
+ res[ n ] = input[ n ] - acc;
+ }
+}
+
+/*
+* SKP_Silk_prefilter. Main prefilter function
+*/
+void SKP_Silk_prefilter_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ const SKP_Silk_encoder_control_FLP *psEncCtrl, /* I Encoder control FLP */
+ SKP_float xw[], /* O Weighted signal */
+ const SKP_float x[] /* I Speech signal */
+)
+{
+ SKP_Silk_prefilter_state_FLP *P = &psEnc->sPrefilt;
+ SKP_int j, k, lag;
+ SKP_float HarmShapeGain, Tilt, LF_MA_shp, LF_AR_shp;
+ SKP_float B[ 2 ];
+ const SKP_float *AR1_shp;
+ const SKP_float *px;
+ SKP_float *pxw;
+ SKP_float HarmShapeFIR[ 3 ];
+ SKP_float st_res[ MAX_SUB_FRAME_LENGTH + MAX_LPC_ORDER ];
+
+ /* Setup pointers */
+ px = x;
+ pxw = xw;
+ lag = P->lagPrev;
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ /* Update Variables that change per sub frame */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ lag = psEncCtrl->sCmn.pitchL[ k ];
+ }
+
+ /* Noise shape parameters */
+ HarmShapeGain = psEncCtrl->HarmShapeGain[ k ] * ( 1.0f - psEncCtrl->HarmBoost[ k ] );
+ HarmShapeFIR[ 0 ] = SKP_Silk_HarmShapeFIR_FLP[ 0 ] * HarmShapeGain;
+ HarmShapeFIR[ 1 ] = SKP_Silk_HarmShapeFIR_FLP[ 1 ] * HarmShapeGain;
+ HarmShapeFIR[ 2 ] = SKP_Silk_HarmShapeFIR_FLP[ 2 ] * HarmShapeGain;
+ Tilt = psEncCtrl->Tilt[ k ];
+ LF_MA_shp = psEncCtrl->LF_MA_shp[ k ];
+ LF_AR_shp = psEncCtrl->LF_AR_shp[ k ];
+ AR1_shp = &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ];
+
+ /* Short term FIR filtering*/
+ SKP_Silk_warped_LPC_analysis_filter_FLP( P->sAR_shp1, st_res, AR1_shp, px,
+ (SKP_float)psEncCtrl->sCmn.warping_Q16 / 65536.0f, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder );
+
+ /* reduce (mainly) low frequencies during harmonic emphasis */
+ B[ 0 ] = psEncCtrl->GainsPre[ k ];
+ B[ 1 ] = -psEncCtrl->GainsPre[ k ] *
+ ( psEncCtrl->HarmBoost[ k ] * HarmShapeGain + INPUT_TILT + psEncCtrl->coding_quality * HIGH_RATE_INPUT_TILT );
+ pxw[ 0 ] = B[ 0 ] * st_res[ 0 ] + B[ 1 ] * P->sHarmHP;
+ for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) {
+ pxw[ j ] = B[ 0 ] * st_res[ j ] + B[ 1 ] * st_res[ j - 1 ];
+ }
+ P->sHarmHP = st_res[ psEnc->sCmn.subfr_length - 1 ];
+
+ SKP_Silk_prefilt_FLP( P, pxw, pxw, HarmShapeFIR, Tilt, LF_MA_shp, LF_AR_shp, lag, psEnc->sCmn.subfr_length );
+
+ px += psEnc->sCmn.subfr_length;
+ pxw += psEnc->sCmn.subfr_length;
+ }
+ P->lagPrev = psEncCtrl->sCmn.pitchL[ psEnc->sCmn.nb_subfr - 1 ];
+}
+
+/*
+* SKP_Silk_prefilter_part1. Prefilter for finding Quantizer input signal
+*/
+SKP_INLINE void SKP_Silk_prefilt_FLP(
+ SKP_Silk_prefilter_state_FLP *P,/* I/O state */
+ SKP_float st_res[], /* I */
+ SKP_float xw[], /* O */
+ SKP_float *HarmShapeFIR, /* I */
+ SKP_float Tilt, /* I */
+ SKP_float LF_MA_shp, /* I */
+ SKP_float LF_AR_shp, /* I */
+ SKP_int lag, /* I */
+ SKP_int length /* I */
+)
+{
+ SKP_int i;
+ SKP_int idx, LTP_shp_buf_idx;
+ SKP_float n_Tilt, n_LF, n_LTP;
+ SKP_float sLF_AR_shp, sLF_MA_shp;
+ SKP_float *LTP_shp_buf;
+
+ /* To speed up use temp variables instead of using the struct */
+ LTP_shp_buf = P->sLTP_shp1;
+ LTP_shp_buf_idx = P->sLTP_shp_buf_idx1;
+ sLF_AR_shp = P->sLF_AR_shp1;
+ sLF_MA_shp = P->sLF_MA_shp1;
+
+ for( i = 0; i < length; i++ ) {
+ if( lag > 0 ) {
+ SKP_assert( HARM_SHAPE_FIR_TAPS == 3 );
+ idx = lag + LTP_shp_buf_idx;
+ n_LTP = LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ] * HarmShapeFIR[ 0 ];
+ n_LTP += LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ] * HarmShapeFIR[ 1 ];
+ n_LTP += LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ] * HarmShapeFIR[ 2 ];
+ } else {
+ n_LTP = 0;
+ }
+
+ n_Tilt = sLF_AR_shp * Tilt;
+ n_LF = sLF_AR_shp * LF_AR_shp + sLF_MA_shp * LF_MA_shp;
+
+ sLF_AR_shp = st_res[ i ] - n_Tilt;
+ sLF_MA_shp = sLF_AR_shp - n_LF;
+
+ LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK;
+ LTP_shp_buf[ LTP_shp_buf_idx ] = sLF_MA_shp;
+
+ xw[ i ] = sLF_MA_shp - n_LTP;
+ }
+ /* Copy temp variable back to state */
+ P->sLF_AR_shp1 = sLF_AR_shp;
+ P->sLF_MA_shp1 = sLF_MA_shp;
+ P->sLTP_shp_buf_idx1 = LTP_shp_buf_idx;
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_process_NLSFs_FLP.c
@@ -1,0 +1,106 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include <stdlib.h>
+#include "SKP_Silk_main_FLP.h"
+
+/* Limit, stabilize, convert and quantize NLSFs */
+void SKP_Silk_process_NLSFs_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ SKP_float *pNLSF /* I/O NLSFs (quantized output) */
+)
+{
+ SKP_int doInterpolate;
+ SKP_float pNLSFW[ MAX_LPC_ORDER ];
+ SKP_float NLSF_mu, NLSF_mu_fluc_red, i_sqr, NLSF_interpolation_factor = 0.0f;
+ const SKP_Silk_NLSF_CB_FLP *psNLSF_CB_FLP;
+
+ /* Used only for NLSF interpolation */
+ SKP_float pNLSF0_temp[ MAX_LPC_ORDER ];
+ SKP_float pNLSFW0_temp[ MAX_LPC_ORDER ];
+ SKP_int i;
+
+ SKP_assert( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED || psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED );
+
+ /***********************/
+ /* Calculate mu values */
+ /***********************/
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ NLSF_mu = 0.002f - 0.001f * psEnc->speech_activity;
+ NLSF_mu_fluc_red = 0.1f - 0.05f * psEnc->speech_activity;
+ } else {
+ NLSF_mu = 0.005f - 0.004f * psEnc->speech_activity;
+ NLSF_mu_fluc_red = 0.2f - 0.1f * ( psEnc->speech_activity + psEncCtrl->sparseness );
+ }
+
+ /* Calculate NLSF weights */
+ SKP_Silk_NLSF_VQ_weights_laroia_FLP( pNLSFW, pNLSF, psEnc->sCmn.predictLPCOrder );
+
+ /* Update NLSF weights for interpolated NLSFs */
+ doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEncCtrl->sCmn.NLSFInterpCoef_Q2 < ( 1 << 2 ) );
+ if( doInterpolate ) {
+
+ /* Calculate the interpolated NLSF vector for the first half */
+ NLSF_interpolation_factor = 0.25f * psEncCtrl->sCmn.NLSFInterpCoef_Q2;
+ SKP_Silk_interpolate_wrapper_FLP( pNLSF0_temp, psEnc->sPred.prev_NLSFq, pNLSF,
+ NLSF_interpolation_factor, psEnc->sCmn.predictLPCOrder );
+
+ /* Calculate first half NLSF weights for the interpolated NLSFs */
+ SKP_Silk_NLSF_VQ_weights_laroia_FLP( pNLSFW0_temp, pNLSF0_temp, psEnc->sCmn.predictLPCOrder );
+
+ /* Update NLSF weights with contribution from first half */
+ i_sqr = NLSF_interpolation_factor * NLSF_interpolation_factor;
+ for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) {
+ pNLSFW[ i ] = 0.5f * ( pNLSFW[ i ] + i_sqr * pNLSFW0_temp[ i ] );
+ }
+ }
+
+ /* Set pointer to the NLSF codebook for the current signal type and LPC order */
+ psNLSF_CB_FLP = psEnc->psNLSF_CB_FLP[ psEncCtrl->sCmn.sigtype ];
+
+ /* Quantize NLSF parameters given the trained NLSF codebooks */
+ SKP_Silk_NLSF_MSVQ_encode_FLP( psEncCtrl->sCmn.NLSFIndices, pNLSF, psNLSF_CB_FLP, psEnc->sPred.prev_NLSFq, pNLSFW, NLSF_mu,
+ NLSF_mu_fluc_red, psEnc->sCmn.NLSF_MSVQ_Survivors, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.first_frame_after_reset );
+
+ /* Convert quantized NLSFs back to LPC coefficients */
+ SKP_Silk_NLSF2A_stable_FLP( psEncCtrl->PredCoef[ 1 ], pNLSF, psEnc->sCmn.predictLPCOrder );
+
+ if( doInterpolate ) {
+ /* Calculate the interpolated, quantized NLSF vector for the first half */
+ SKP_Silk_interpolate_wrapper_FLP( pNLSF0_temp, psEnc->sPred.prev_NLSFq, pNLSF,
+ NLSF_interpolation_factor, psEnc->sCmn.predictLPCOrder );
+
+ /* Convert back to LPC coefficients */
+ SKP_Silk_NLSF2A_stable_FLP( psEncCtrl->PredCoef[ 0 ], pNLSF0_temp, psEnc->sCmn.predictLPCOrder );
+
+ } else {
+ /* Copy LPC coefficients for first half from second half */
+ SKP_memcpy( psEncCtrl->PredCoef[ 0 ], psEncCtrl->PredCoef[ 1 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_float ) );
+ }
+}
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_process_gains_FLP.c
@@ -1,0 +1,96 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* Processing of gains */
+void SKP_Silk_process_gains_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */
+)
+{
+ SKP_Silk_shape_state_FLP *psShapeSt = &psEnc->sShape;
+ SKP_int k;
+ SKP_int32 pGains_Q16[ MAX_NB_SUBFR ];
+ SKP_float s, InvMaxSqrVal, gain;
+
+ /* Gain reduction when LTP coding gain is high */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ s = 1.0f - 0.5f * SKP_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) );
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->Gains[ k ] *= s;
+ }
+ }
+
+ /* Limit the quantized signal */
+ InvMaxSqrVal = ( SKP_float )( pow( 2.0f, 0.33f * ( 21.0f - psEncCtrl->current_SNR_dB ) ) / psEnc->sCmn.subfr_length );
+
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ /* Soft limit on ratio residual energy and squared gains */
+ gain = psEncCtrl->Gains[ k ];
+ gain = ( SKP_float )sqrt( gain * gain + psEncCtrl->ResNrg[ k ] * InvMaxSqrVal );
+ psEncCtrl->Gains[ k ] = SKP_min_float( gain, 32767.0f );
+ }
+
+ /* Prepare gains for noise shaping quantization */
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ pGains_Q16[ k ] = ( SKP_int32 ) ( psEncCtrl->Gains[ k ] * 65536.0f );
+ }
+
+ /* Noise shaping quantization */
+ SKP_Silk_gains_quant( psEncCtrl->sCmn.GainsIndices, pGains_Q16,
+ &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesInPayloadBuf, psEnc->sCmn.nb_subfr );
+ /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */
+ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
+ psEncCtrl->Gains[ k ] = pGains_Q16[ k ] / 65536.0f;
+ }
+
+ /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ if( psEncCtrl->LTPredCodGain + psEncCtrl->input_tilt > 1.0f ) {
+ psEncCtrl->sCmn.QuantOffsetType = 0;
+ } else {
+ psEncCtrl->sCmn.QuantOffsetType = 1;
+ }
+ }
+
+ /* Quantizer boundary adjustment */
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ psEncCtrl->Lambda = 1.2f - 0.4f * psEnc->speech_activity
+ - 0.3f * psEncCtrl->input_quality
+ + 0.2f * psEncCtrl->sCmn.QuantOffsetType
+ - 0.1f * psEncCtrl->coding_quality;
+ } else {
+ psEncCtrl->Lambda = 1.2f - 0.4f * psEnc->speech_activity
+ - 0.4f * psEncCtrl->input_quality
+ + 0.4f * psEncCtrl->sCmn.QuantOffsetType
+ - 0.1f * psEncCtrl->coding_quality;
+ }
+
+ SKP_assert( psEncCtrl->Lambda >= 0.0f );
+ SKP_assert( psEncCtrl->Lambda < 2.0f );
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_quant_LTP_gains_FLP.c
@@ -1,0 +1,108 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+void SKP_Silk_quant_LTP_gains_FLP(
+ SKP_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */
+ SKP_int cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */
+ SKP_int *periodicity_index, /* O Periodicity index */
+ const SKP_float W[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Error weights */
+ const SKP_float mu, /* I Mu value (R/D tradeoff) */
+ const SKP_int lowComplexity, /* I Flag for low complexity */
+ const SKP_int nb_subfr /* I number of subframes */
+)
+{
+ SKP_int j, k, temp_idx[ MAX_NB_SUBFR ], cbk_size;
+ const SKP_uint16 *cdf_ptr;
+ const SKP_int16 *cl_ptr;
+ const SKP_int16 *cbk_ptr_Q14;
+ const SKP_float *b_ptr, *W_ptr;
+ SKP_float rate_dist_subfr, rate_dist, min_rate_dist;
+
+
+
+ /***************************************************/
+ /* Iterate over different codebooks with different */
+ /* rates/distortions, and choose best */
+ /***************************************************/
+ min_rate_dist = SKP_float_MAX;
+ for( k = 0; k < 3; k++ ) {
+ cdf_ptr = SKP_Silk_LTP_gain_CDF_ptrs[ k ];
+ cl_ptr = SKP_Silk_LTP_gain_BITS_Q6_ptrs[ k ];
+ cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ k ];
+ cbk_size = SKP_Silk_LTP_vq_sizes[ k ];
+
+ /* Setup pointer to first subframe */
+ W_ptr = W;
+ b_ptr = B;
+
+ rate_dist = 0.0f;
+ for( j = 0; j < nb_subfr; j++ ) {
+
+ SKP_Silk_VQ_WMat_EC_FLP(
+ &temp_idx[ j ], /* O index of best codebook vector */
+ &rate_dist_subfr, /* O best weighted quantization error + mu * rate */
+ b_ptr, /* I input vector to be quantized */
+ W_ptr, /* I weighting matrix */
+ cbk_ptr_Q14, /* I codebook */
+ cl_ptr, /* I code length for each codebook vector */
+ mu, /* I tradeoff between weighted error and rate */
+ cbk_size /* I number of vectors in codebook */
+ );
+
+ rate_dist += rate_dist_subfr;
+
+ b_ptr += LTP_ORDER;
+ W_ptr += LTP_ORDER * LTP_ORDER;
+ }
+
+ if( rate_dist < min_rate_dist ) {
+ min_rate_dist = rate_dist;
+ SKP_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( SKP_int ) );
+ *periodicity_index = k;
+ }
+
+ /* Break early in low-complexity mode if rate distortion is below threshold */
+ if( lowComplexity && ( rate_dist * 16384.0f < ( SKP_float )SKP_Silk_LTP_gain_middle_avg_RD_Q14 ) ) {
+ break;
+ }
+ }
+
+ cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ *periodicity_index ];
+ for( j = 0; j < nb_subfr; j++ ) {
+ SKP_short2float_array( &B[ j * LTP_ORDER ],
+ &cbk_ptr_Q14[ cbk_index[ j ] * LTP_ORDER ],
+ LTP_ORDER );
+ }
+
+ for( j = 0; j < nb_subfr * LTP_ORDER; j++ ) {
+ B[ j ] *= Q14_CONVERSION_FAC;
+ }
+
+}
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_regularize_correlations_FLP.c
@@ -1,0 +1,43 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+void SKP_Silk_regularize_correlations_FLP(
+ SKP_float *XX, /* I/O Correlation matrices */
+ SKP_float *xx, /* I/O Correlation values */
+ const SKP_float noise, /* I Noise energy to add */
+ const SKP_int D /* I Dimension of XX */
+)
+{
+ SKP_int i;
+
+ for( i = 0; i < D; i++ ) {
+ matrix_ptr( &XX[ 0 ], i, i, D ) += noise;
+ }
+ xx[ 0 ] += noise;
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_residual_energy_FLP.c
@@ -1,0 +1,113 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+#define MAX_ITERATIONS_RESIDUAL_NRG 10
+#define REGULARIZATION_FACTOR 1e-8f
+
+/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */
+SKP_float SKP_Silk_residual_energy_covar_FLP( /* O Weighted residual energy */
+ const SKP_float *c, /* I Filter coefficients */
+ SKP_float *wXX, /* I/O Weighted correlation matrix, reg. out */
+ const SKP_float *wXx, /* I Weighted correlation vector */
+ const SKP_float wxx, /* I Weighted correlation value */
+ const SKP_int D /* I Dimension */
+)
+{
+ SKP_int i, j, k;
+ SKP_float tmp, nrg, regularization;
+
+ /* Safety checks */
+ SKP_assert( D >= 0 );
+
+ regularization = REGULARIZATION_FACTOR * ( wXX[ 0 ] + wXX[ D * D - 1 ] );
+ for( k = 0; k < MAX_ITERATIONS_RESIDUAL_NRG; k++ ) {
+ nrg = wxx;
+
+ tmp = 0.0f;
+ for( i = 0; i < D; i++ ) {
+ tmp += wXx[ i ] * c[ i ];
+ }
+ nrg -= 2.0f * tmp;
+
+ /* compute c' * wXX * c, assuming wXX is symmetric */
+ for( i = 0; i < D; i++ ) {
+ tmp = 0.0f;
+ for( j = i + 1; j < D; j++ ) {
+ tmp += matrix_c_ptr( wXX, i, j, D ) * c[ j ];
+ }
+ nrg += c[ i ] * ( 2.0f * tmp + matrix_c_ptr( wXX, i, i, D ) * c[ i ] );
+ }
+ if( nrg > 0 ) {
+ break;
+ } else {
+ /* Add white noise */
+ for( i = 0; i < D; i++ ) {
+ matrix_c_ptr( wXX, i, i, D ) += regularization;
+ }
+ /* Increase noise for next run */
+ regularization *= 2.0f;
+ }
+ }
+ if( k == MAX_ITERATIONS_RESIDUAL_NRG ) {
+ SKP_assert( nrg == 0 );
+ nrg = 1.0f;
+ }
+
+ return nrg;
+}
+
+/* Calculates residual energies of input subframes where all subframes have LPC_order */
+/* of preceeding samples */
+void SKP_Silk_residual_energy_FLP(
+ SKP_float nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */
+ const SKP_float x[], /* I Input signal */
+ const SKP_float a[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */
+ const SKP_float gains[], /* I Quantization gains */
+ const SKP_int subfr_length, /* I Subframe length */
+ const SKP_int nb_subfr, /* I number of subframes */
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_int shift;
+ SKP_float *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ];
+
+ LPC_res_ptr = LPC_res + LPC_order;
+ shift = LPC_order + subfr_length;
+
+ /* Filter input to create the LPC residual for each frame half, and measure subframe energies */
+ SKP_Silk_LPC_analysis_filter_FLP( LPC_res, a[ 0 ], x + 0 * shift, 2 * shift, LPC_order );
+ nrgs[ 0 ] = ( SKP_float )( gains[ 0 ] * gains[ 0 ] * SKP_Silk_energy_FLP( LPC_res_ptr + 0 * shift, subfr_length ) );
+ nrgs[ 1 ] = ( SKP_float )( gains[ 1 ] * gains[ 1 ] * SKP_Silk_energy_FLP( LPC_res_ptr + 1 * shift, subfr_length ) );
+
+ if( nb_subfr == MAX_NB_SUBFR ) {
+ SKP_Silk_LPC_analysis_filter_FLP( LPC_res, a[ 1 ], x + 2 * shift, 2 * shift, LPC_order );
+ nrgs[ 2 ] = ( SKP_float )( gains[ 2 ] * gains[ 2 ] * SKP_Silk_energy_FLP( LPC_res_ptr + 0 * shift, subfr_length ) );
+ nrgs[ 3 ] = ( SKP_float )( gains[ 3 ] * gains[ 3 ] * SKP_Silk_energy_FLP( LPC_res_ptr + 1 * shift, subfr_length ) );
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_solve_LS_FLP.c
@@ -1,0 +1,203 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+
+#include "SKP_Silk_main_FLP.h"
+
+/**********************************************************************
+ * LDL Factorisation. Finds the upper triangular matrix L and the diagonal
+ * Matrix D (only the diagonal elements returned in a vector)such that
+ * the symmetric matric A is given by A = L*D*L'.
+ **********************************************************************/
+void SKP_Silk_LDL_FLP(
+ SKP_float *A, /* (I/O) Pointer to Symetric Square Matrix */
+ SKP_int M, /* (I) Size of Matrix */
+ SKP_float *L, /* (I/O) Pointer to Square Upper triangular Matrix */
+ SKP_float *Dinv /* (I/O) Pointer to vector holding the inverse diagonal elements of D */
+);
+
+/**********************************************************************
+ * Function to solve linear equation Ax = b, when A is a MxM lower
+ * triangular matrix, with ones on the diagonal.
+ **********************************************************************/
+void SKP_Silk_SolveWithLowerTriangularWdiagOnes_FLP(
+ const SKP_float *L, /* (I) Pointer to Lower Triangular Matrix */
+ SKP_int M, /* (I) Dim of Matrix equation */
+ const SKP_float *b, /* (I) b Vector */
+ SKP_float *x /* (O) x Vector */
+);
+
+/**********************************************************************
+ * Function to solve linear equation (A^T)x = b, when A is a MxM lower
+ * triangular, with ones on the diagonal. (ie then A^T is upper triangular)
+ **********************************************************************/
+void SKP_Silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP(
+ const SKP_float *L, /* (I) Pointer to Lower Triangular Matrix */
+ SKP_int M, /* (I) Dim of Matrix equation */
+ const SKP_float *b, /* (I) b Vector */
+ SKP_float *x /* (O) x Vector */
+);
+
+/**********************************************************************
+ * Function to solve linear equation Ax = b, when A is a MxM
+ * symmetric square matrix - using LDL factorisation
+ **********************************************************************/
+void SKP_Silk_solve_LDL_FLP(
+ SKP_float *A, /* I/O Symmetric square matrix, out: reg. */
+ const SKP_int M, /* I Size of matrix */
+ const SKP_float *b, /* I Pointer to b vector */
+ SKP_float *x /* O Pointer to x solution vector */
+)
+{
+ SKP_int i;
+ SKP_float L[ MAX_MATRIX_SIZE ][ MAX_MATRIX_SIZE ];
+ SKP_float T[ MAX_MATRIX_SIZE ];
+ SKP_float Dinv[ MAX_MATRIX_SIZE ]; // inverse diagonal elements of D
+
+ SKP_assert( M <= MAX_MATRIX_SIZE );
+
+ /***************************************************
+ Factorize A by LDL such that A = L*D*(L^T),
+ where L is lower triangular with ones on diagonal
+ ****************************************************/
+ SKP_Silk_LDL_FLP( A, M, &L[ 0 ][ 0 ], Dinv );
+
+ /****************************************************
+ * substitute D*(L^T) = T. ie:
+ L*D*(L^T)*x = b => L*T = b <=> T = inv(L)*b
+ ******************************************************/
+ SKP_Silk_SolveWithLowerTriangularWdiagOnes_FLP( &L[ 0 ][ 0 ], M, b, T );
+
+ /****************************************************
+ D*(L^T)*x = T <=> (L^T)*x = inv(D)*T, because D is
+ diagonal just multiply with 1/d_i
+ ****************************************************/
+ for( i = 0; i < M; i++ ) {
+ T[ i ] = T[ i ] * Dinv[ i ];
+ }
+ /****************************************************
+ x = inv(L') * inv(D) * T
+ *****************************************************/
+ SKP_Silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP( &L[ 0 ][ 0 ], M, T, x );
+}
+
+void SKP_Silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP(
+ const SKP_float *L, /* (I) Pointer to Lower Triangular Matrix */
+ SKP_int M, /* (I) Dim of Matrix equation */
+ const SKP_float *b, /* (I) b Vector */
+ SKP_float *x /* (O) x Vector */
+)
+{
+ SKP_int i, j;
+ SKP_float temp;
+ const SKP_float *ptr1;
+
+ for( i = M - 1; i >= 0; i-- ) {
+ ptr1 = matrix_adr( L, 0, i, M );
+ temp = 0;
+ for( j = M - 1; j > i ; j-- ) {
+ temp += ptr1[ j * M ] * x[ j ];
+ }
+ temp = b[ i ] - temp;
+ x[ i ] = temp;
+ }
+}
+
+void SKP_Silk_SolveWithLowerTriangularWdiagOnes_FLP(
+ const SKP_float *L, /* (I) Pointer to Lower Triangular Matrix */
+ SKP_int M, /* (I) Dim of Matrix equation */
+ const SKP_float *b, /* (I) b Vector */
+ SKP_float *x /* (O) x Vector */
+)
+{
+ SKP_int i, j;
+ SKP_float temp;
+ const SKP_float *ptr1;
+
+ for( i = 0; i < M; i++ ) {
+ ptr1 = matrix_adr( L, i, 0, M );
+ temp = 0;
+ for( j = 0; j < i; j++ ) {
+ temp += ptr1[ j ] * x[ j ];
+ }
+ temp = b[ i ] - temp;
+ x[ i ] = temp;
+ }
+}
+
+void SKP_Silk_LDL_FLP(
+ SKP_float *A, /* (I/O) Pointer to Symetric Square Matrix */
+ SKP_int M, /* (I) Size of Matrix */
+ SKP_float *L, /* (I/O) Pointer to Square Upper triangular Matrix */
+ SKP_float *Dinv /* (I/O) Pointer to vector holding the inverse diagonal elements of D */
+)
+{
+ SKP_int i, j, k, loop_count, err = 1;
+ SKP_float *ptr1, *ptr2;
+ double temp, diag_min_value;
+ SKP_float v[ MAX_MATRIX_SIZE ], D[ MAX_MATRIX_SIZE ]; // temp arrays
+
+ SKP_assert( M <= MAX_MATRIX_SIZE );
+
+ diag_min_value = FIND_LTP_COND_FAC * 0.5f * ( A[ 0 ] + A[ M * M - 1 ] );
+ for( loop_count = 0; loop_count < M && err == 1; loop_count++ ) {
+ err = 0;
+ for( j = 0; j < M; j++ ) {
+ ptr1 = matrix_adr( L, j, 0, M );
+ temp = matrix_ptr( A, j, j, M ); // element in row j column j
+ for( i = 0; i < j; i++ ) {
+ v[ i ] = ptr1[ i ] * D[ i ];
+ temp -= ptr1[ i ] * v[ i ];
+ }
+ if( temp < diag_min_value ) {
+ /* Badly conditioned matrix: add white noise and run again */
+ temp = ( loop_count + 1 ) * diag_min_value - temp;
+ for( i = 0; i < M; i++ ) {
+ matrix_ptr( A, i, i, M ) += ( SKP_float )temp;
+ }
+ err = 1;
+ break;
+ }
+ D[ j ] = ( SKP_float )temp;
+ Dinv[ j ] = ( SKP_float )( 1.0f / temp );
+ matrix_ptr( L, j, j, M ) = 1.0f;
+
+ ptr1 = matrix_adr( A, j, 0, M );
+ ptr2 = matrix_adr( L, j + 1, 0, M);
+ for( i = j + 1; i < M; i++ ) {
+ temp = 0.0;
+ for( k = 0; k < j; k++ ) {
+ temp += ptr2[ k ] * v[ k ];
+ }
+ matrix_ptr( L, i, j, M ) = ( SKP_float )( ( ptr1[ i ] - temp ) * Dinv[ j ] );
+ ptr2 += M; // go to next column
+ }
+ }
+ }
+ SKP_assert( err == 0 );
+}
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_structs_FLP.h
@@ -1,0 +1,176 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_STRUCTS_FLP_H
+#define SKP_SILK_STRUCTS_FLP_H
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_main.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/********************************/
+/* Noise shaping analysis state */
+/********************************/
+typedef struct {
+ SKP_int LastGainIndex;
+ SKP_float HarmBoost_smth;
+ SKP_float HarmShapeGain_smth;
+ SKP_float Tilt_smth;
+} SKP_Silk_shape_state_FLP;
+
+/********************************/
+/* Prefilter state */
+/********************************/
+typedef struct {
+ SKP_float sLTP_shp1[ LTP_BUF_LENGTH ];
+ SKP_float sLTP_shp2[ LTP_BUF_LENGTH ];
+ SKP_float sAR_shp1[ MAX_SHAPE_LPC_ORDER + 1 ];
+ SKP_float sAR_shp2[ MAX_SHAPE_LPC_ORDER ];
+ SKP_int sLTP_shp_buf_idx1;
+ SKP_int sLTP_shp_buf_idx2;
+ SKP_int sAR_shp_buf_idx2;
+ SKP_float sLF_AR_shp1;
+ SKP_float sLF_MA_shp1;
+ SKP_float sLF_AR_shp2;
+ SKP_float sLF_MA_shp2;
+ SKP_float sHarmHP;
+ SKP_int32 rand_seed;
+ SKP_int lagPrev;
+} SKP_Silk_prefilter_state_FLP;
+
+/*****************************/
+/* Prediction analysis state */
+/*****************************/
+typedef struct {
+ SKP_int pitch_LPC_win_length;
+ SKP_int min_pitch_lag; /* Lowest possible pitch lag (samples) */
+ SKP_int max_pitch_lag; /* Highest possible pitch lag (samples) */
+ SKP_float prev_NLSFq[ MAX_LPC_ORDER ]; /* Previously quantized NLSF vector */
+} SKP_Silk_predict_state_FLP;
+
+/*******************************************/
+/* Structure containing NLSF MSVQ codebook */
+/*******************************************/
+/* structure for one stage of MSVQ */
+typedef struct {
+ const SKP_int32 nVectors;
+ const SKP_float *CB;
+ const SKP_float *Rates;
+} SKP_Silk_NLSF_CBS_FLP;
+
+typedef struct {
+ const SKP_int32 nStages;
+
+ /* fields for (de)quantizing */
+ const SKP_Silk_NLSF_CBS_FLP *CBStages;
+ const SKP_float *NDeltaMin;
+
+ /* fields for arithmetic (de)coding */
+ const SKP_uint16 *CDF;
+ const SKP_uint16 * const *StartPtr;
+ const SKP_int *MiddleIx;
+} SKP_Silk_NLSF_CB_FLP;
+
+/********************************/
+/* Encoder state FLP */
+/********************************/
+typedef struct {
+ SKP_Silk_encoder_state sCmn; /* Common struct, shared with fixed-point code */
+
+ SKP_float variable_HP_smth1; /* State of first smoother */
+ SKP_float variable_HP_smth2; /* State of second smoother */
+
+ SKP_Silk_shape_state_FLP sShape; /* Noise shaping state */
+ SKP_Silk_prefilter_state_FLP sPrefilt; /* Prefilter State */
+ SKP_Silk_predict_state_FLP sPred; /* Prediction State */
+ SKP_Silk_nsq_state sNSQ; /* Noise Shape Quantizer State */
+ SKP_Silk_nsq_state sNSQ_LBRR; /* Noise Shape Quantizer State ( for low bitrate redundancy )*/
+
+ /* Buffer for find pitch and noise shape analysis */
+ SKP_float x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */
+ SKP_float LTPCorr; /* Normalized correlation from pitch lag estimator */
+ SKP_float mu_LTP; /* Rate-distortion tradeoff in LTP quantization */
+ SKP_float SNR_dB; /* Quality setting */
+ SKP_float avgGain; /* average gain during active speech */
+ SKP_float BufferedInChannel_ms; /* Simulated number of ms buffer in channel because of exceeded TargetRate_bps */
+ SKP_float speech_activity; /* Speech activity */
+ SKP_float pitchEstimationThreshold; /* Threshold for pitch estimator */
+
+ /* Parameters for LTP scaling control */
+ SKP_float prevLTPredCodGain;
+ SKP_float HPLTPredCodGain;
+
+ SKP_float inBandFEC_SNR_comp; /* Compensation to SNR_DB when using inband FEC Voiced */
+
+ const SKP_Silk_NLSF_CB_FLP *psNLSF_CB_FLP[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
+} SKP_Silk_encoder_state_FLP;
+
+
+/************************/
+/* Encoder control FLP */
+/************************/
+typedef struct {
+ SKP_Silk_encoder_control sCmn; /* Common struct, shared with fixed-point code */
+
+ /* Prediction and coding parameters */
+ SKP_float Gains[MAX_NB_SUBFR];
+ SKP_float PredCoef[ 2 ][ MAX_LPC_ORDER ]; /* holds interpolated and final coefficients */
+ SKP_float LTPCoef[LTP_ORDER * MAX_NB_SUBFR];
+ SKP_float LTP_scale;
+
+ /* Noise shaping parameters */
+ SKP_float AR1[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ];
+ SKP_float AR2[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ];
+ SKP_float LF_MA_shp[ MAX_NB_SUBFR ];
+ SKP_float LF_AR_shp[ MAX_NB_SUBFR ];
+ SKP_float GainsPre[ MAX_NB_SUBFR ];
+ SKP_float HarmBoost[ MAX_NB_SUBFR ];
+ SKP_float Tilt[ MAX_NB_SUBFR ];
+ SKP_float HarmShapeGain[ MAX_NB_SUBFR ];
+ SKP_float Lambda;
+ SKP_float input_quality;
+ SKP_float coding_quality;
+ SKP_float pitch_freq_low_Hz;
+ SKP_float current_SNR_dB;
+
+ /* Measures */
+ SKP_float sparseness;
+ SKP_float LTPredCodGain;
+ SKP_float input_quality_bands[ VAD_N_BANDS ];
+ SKP_float input_tilt;
+ SKP_float ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */
+} SKP_Silk_encoder_control_FLP;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_FLP/SKP_Silk_tables_FLP.h
@@ -1,0 +1,43 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_TABLES_FLP_H
+#define SKP_SILK_TABLES_FLP_H
+
+#include "SKP_Silk_structs_FLP.h"
+
+/* filters */
+extern const SKP_float SKP_Silk_HarmShapeFIR_FLP[ HARM_SHAPE_FIR_TAPS ];
+
+/* Table of quantization offset values */
+extern const SKP_float SKP_Silk_Quantization_Offsets[ 2 ][ 2 ];
+
+/* NLSF codebooks */
+extern const SKP_Silk_NLSF_CB_FLP SKP_Silk_NLSF_CB0_16_FLP, SKP_Silk_NLSF_CB1_16_FLP;
+extern const SKP_Silk_NLSF_CB_FLP SKP_Silk_NLSF_CB0_10_FLP, SKP_Silk_NLSF_CB1_10_FLP;
+
+#endif
--- /dev/null
+++ b/src_FLP/SKP_Silk_tables_NLSF_CB0_10_FLP.c
@@ -1,0 +1,739 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 5.32 kB */
+/**********************************************/
+
+#include "SKP_Silk_tables_FLP.h"
+#include "SKP_Silk_tables_NLSF_CB0_10.h"
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB0_10_rates[ NLSF_MSVQ_CB0_10_VECTORS ] =
+{
+ 4.62500000000000000000f, 5.21875000000000000000f,
+ 5.28125000000000000000f, 5.31250000000000000000f,
+ 5.31250000000000000000f, 5.40625000000000000000f,
+ 5.40625000000000000000f, 5.46875000000000000000f,
+ 5.50000000000000000000f, 5.50000000000000000000f,
+ 5.50000000000000000000f, 5.53125000000000000000f,
+ 5.59375000000000000000f, 5.65625000000000000000f,
+ 5.65625000000000000000f, 5.65625000000000000000f,
+ 5.71875000000000000000f, 5.71875000000000000000f,
+ 5.71875000000000000000f, 5.75000000000000000000f,
+ 5.78125000000000000000f, 5.78125000000000000000f,
+ 5.78125000000000000000f, 5.78125000000000000000f,
+ 5.81250000000000000000f, 5.90625000000000000000f,
+ 5.90625000000000000000f, 5.90625000000000000000f,
+ 5.96875000000000000000f, 5.96875000000000000000f,
+ 5.96875000000000000000f, 6.06250000000000000000f,
+ 6.06250000000000000000f, 6.06250000000000000000f,
+ 6.09375000000000000000f, 6.09375000000000000000f,
+ 6.12500000000000000000f, 6.18750000000000000000f,
+ 6.21875000000000000000f, 6.25000000000000000000f,
+ 6.28125000000000000000f, 6.28125000000000000000f,
+ 6.31250000000000000000f, 6.34375000000000000000f,
+ 6.37500000000000000000f, 6.37500000000000000000f,
+ 6.40625000000000000000f, 6.40625000000000000000f,
+ 6.43750000000000000000f, 6.53125000000000000000f,
+ 6.56250000000000000000f, 6.56250000000000000000f,
+ 6.65625000000000000000f, 6.68750000000000000000f,
+ 6.81250000000000000000f, 6.87500000000000000000f,
+ 6.90625000000000000000f, 7.06250000000000000000f,
+ 7.21875000000000000000f, 7.31250000000000000000f,
+ 7.46875000000000000000f, 8.00000000000000000000f,
+ 8.00000000000000000000f, 8.00000000000000000000f,
+ 3.71875000000000000000f, 3.84375000000000000000f,
+ 3.84375000000000000000f, 3.84375000000000000000f,
+ 3.90625000000000000000f, 3.93750000000000000000f,
+ 3.93750000000000000000f, 3.93750000000000000000f,
+ 4.00000000000000000000f, 4.06250000000000000000f,
+ 4.06250000000000000000f, 4.09375000000000000000f,
+ 4.09375000000000000000f, 4.21875000000000000000f,
+ 4.31250000000000000000f, 4.34375000000000000000f,
+ 2.93750000000000000000f, 2.93750000000000000000f,
+ 2.96875000000000000000f, 2.96875000000000000000f,
+ 3.00000000000000000000f, 3.06250000000000000000f,
+ 3.06250000000000000000f, 3.09375000000000000000f,
+ 2.90625000000000000000f, 2.90625000000000000000f,
+ 2.96875000000000000000f, 3.00000000000000000000f,
+ 3.00000000000000000000f, 3.03125000000000000000f,
+ 3.06250000000000000000f, 3.12500000000000000000f,
+ 2.87500000000000000000f, 2.90625000000000000000f,
+ 3.03125000000000000000f, 3.03125000000000000000f,
+ 3.03125000000000000000f, 3.03125000000000000000f,
+ 3.06250000000000000000f, 3.06250000000000000000f,
+ 3.90625000000000000000f, 3.93750000000000000000f,
+ 3.93750000000000000000f, 3.96875000000000000000f,
+ 3.96875000000000000000f, 4.00000000000000000000f,
+ 4.00000000000000000000f, 4.00000000000000000000f,
+ 4.00000000000000000000f, 4.00000000000000000000f,
+ 4.03125000000000000000f, 4.03125000000000000000f,
+ 4.03125000000000000000f, 4.06250000000000000000f,
+ 4.06250000000000000000f, 4.09375000000000000000f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min[ 10 + 1 ] =
+{
+ 0.01718139648437500000f,
+ 0.00009155273437500000f,
+ 0.00067138671874999989f,
+ 0.00061035156250000000f,
+ 0.00009155273437500000f,
+ 0.00009155273437500000f,
+ 0.00402832031250000000f,
+ 0.00363159179687500000f,
+ 0.01092529296875000000f,
+ 0.00262451171875000000f,
+ 0.02941894531250000300f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB0_10[ 10 * NLSF_MSVQ_CB0_10_VECTORS ] =
+{
+ 0.06744384765625000000f, 0.12277221679687500000f,
+ 0.21304321289062497000f, 0.28259277343750000000f,
+ 0.38369750976562500000f, 0.47872924804687500000f,
+ 0.58615112304687500000f, 0.68307495117187489000f,
+ 0.79287719726562500000f, 0.88934326171875011000f,
+ 0.10025024414062500000f, 0.12731933593750000000f,
+ 0.18664550781250003000f, 0.33129882812500000000f,
+ 0.46658325195312494000f, 0.51348876953125000000f,
+ 0.60122680664062500000f, 0.67169189453125000000f,
+ 0.75442504882812500000f, 0.89456176757812500000f,
+ 0.04742431640624999300f, 0.07662963867187500000f,
+ 0.20071411132812500000f, 0.31546020507812500000f,
+ 0.42227172851562494000f, 0.50387573242187500000f,
+ 0.61297607421875000000f, 0.70843505859375000000f,
+ 0.80810546875000000000f, 0.89916992187500000000f,
+ 0.09344482421875000000f, 0.12258911132812500000f,
+ 0.17611694335937500000f, 0.30630493164062500000f,
+ 0.40786743164062500000f, 0.45629882812500000000f,
+ 0.61462402343750000000f, 0.69857788085937500000f,
+ 0.76992797851562500000f, 0.90341186523437500000f,
+ 0.06362915039062500000f, 0.10549926757812500000f,
+ 0.18109130859375000000f, 0.26605224609375000000f,
+ 0.35098266601562494000f, 0.41717529296875000000f,
+ 0.54922485351562500000f, 0.66580200195312500000f,
+ 0.76095581054687489000f, 0.87722778320312500000f,
+ 0.08471679687500000000f, 0.12490844726562501000f,
+ 0.19595336914062500000f, 0.31777954101562500000f,
+ 0.46115112304687500000f, 0.51287841796875000000f,
+ 0.63552856445312500000f, 0.72711181640625000000f,
+ 0.80285644531250000000f, 0.89755249023437500000f,
+ 0.08291625976562498600f, 0.12310791015625000000f,
+ 0.17385864257812500000f, 0.25827026367187500000f,
+ 0.43643188476562500000f, 0.49908447265625000000f,
+ 0.58004760742187500000f, 0.71450805664062500000f,
+ 0.78771972656249989000f, 0.86993408203125011000f,
+ 0.08764648437500000000f, 0.11297607421875001000f,
+ 0.17947387695312500000f, 0.33673095703124994000f,
+ 0.52310180664062500000f, 0.57614135742187500000f,
+ 0.64532470703125000000f, 0.71566772460937500000f,
+ 0.78787231445312500000f, 0.90332031250000000000f,
+ 0.09152221679687500000f, 0.12252807617187500000f,
+ 0.22451782226562500000f, 0.34237670898437500000f,
+ 0.39263916015625000000f, 0.52816772460937500000f,
+ 0.61282348632812500000f, 0.69104003906250000000f,
+ 0.81707763671875000000f, 0.88827514648437500000f,
+ 0.08978271484375000000f, 0.11798095703125000000f,
+ 0.18060302734375003000f, 0.36361694335937500000f,
+ 0.42446899414062500000f, 0.49047851562500000000f,
+ 0.62417602539062500000f, 0.67990112304687500000f,
+ 0.83343505859375000000f, 0.91021728515625011000f,
+ 0.06930541992187500000f, 0.10763549804687500000f,
+ 0.20159912109375000000f, 0.29690551757812500000f,
+ 0.39498901367187506000f, 0.53045654296875000000f,
+ 0.61718750000000000000f, 0.68191528320312500000f,
+ 0.75079345703125000000f, 0.86334228515624989000f,
+ 0.06735229492187500000f, 0.10101318359375000000f,
+ 0.17834472656250000000f, 0.28500366210937500000f,
+ 0.33999633789062500000f, 0.47763061523437506000f,
+ 0.56689453125000000000f, 0.64627075195312511000f,
+ 0.77975463867187489000f, 0.86145019531250011000f,
+ 0.12094116210937500000f, 0.15182495117187500000f,
+ 0.21060180664062500000f, 0.35363769531250000000f,
+ 0.41094970703125000000f, 0.47537231445312494000f,
+ 0.58688354492187500000f, 0.65209960937500000000f,
+ 0.77850341796875000000f, 0.84713745117187500000f,
+ 0.08389282226562500000f, 0.10830688476562500000f,
+ 0.21258544921875000000f, 0.42138671875000000000f,
+ 0.47769165039062500000f, 0.53848266601562500000f,
+ 0.61309814453125000000f, 0.68966674804687511000f,
+ 0.80770874023437500000f, 0.87088012695312489000f,
+ 0.06488037109375000000f, 0.10693359375000001000f,
+ 0.15591430664062500000f, 0.30377197265625000000f,
+ 0.38299560546875006000f, 0.44616699218750000000f,
+ 0.60128784179687500000f, 0.66183471679687500000f,
+ 0.80740356445312500000f, 0.88824462890625000000f,
+ 0.12103271484375000000f, 0.17532348632812500000f,
+ 0.22711181640625000000f, 0.29776000976562500000f,
+ 0.44152832031250000000f, 0.50061035156250000000f,
+ 0.58395385742187500000f, 0.70336914062500000000f,
+ 0.77438354492187489000f, 0.86642456054687500000f,
+ 0.09756469726562500000f, 0.14498901367187500000f,
+ 0.19686889648437500000f, 0.28375244140625000000f,
+ 0.39788818359374994000f, 0.45391845703125000000f,
+ 0.54815673828125000000f, 0.62948608398437500000f,
+ 0.72738647460937500000f, 0.86865234375000000000f,
+ 0.09750366210937500000f, 0.12454223632812500000f,
+ 0.19833374023437500000f, 0.37390136718750000000f,
+ 0.43606567382812500000f, 0.48950195312500000000f,
+ 0.56021118164062500000f, 0.63262939453125000000f,
+ 0.82336425781250000000f, 0.89443969726562489000f,
+ 0.04678344726562500000f, 0.07540893554687500000f,
+ 0.13690185546875000000f, 0.23791503906250000000f,
+ 0.37634277343750000000f, 0.48089599609375000000f,
+ 0.59713745117187500000f, 0.68048095703124989000f,
+ 0.78347778320312489000f, 0.88656616210937511000f,
+ 0.06109619140625000000f, 0.09066772460937500000f,
+ 0.15213012695312500000f, 0.24667358398437497000f,
+ 0.40225219726562500000f, 0.47103881835937500000f,
+ 0.55654907226562500000f, 0.65664672851562500000f,
+ 0.75057983398437500000f, 0.86520385742187500000f,
+ 0.11621093750000000000f, 0.15029907226562500000f,
+ 0.20477294921875003000f, 0.31130981445312500000f,
+ 0.36654663085937500000f, 0.43640136718750000000f,
+ 0.56326293945312500000f, 0.62228393554687500000f,
+ 0.80947875976562500000f, 0.88366699218750000000f,
+ 0.06961059570312500000f, 0.10430908203125000000f,
+ 0.15194702148437500000f, 0.26629638671875000000f,
+ 0.48718261718750000000f, 0.55249023437500000000f,
+ 0.61798095703125000000f, 0.69491577148437500000f,
+ 0.77166748046875000000f, 0.88360595703125000000f,
+ 0.09310913085937500000f, 0.16720581054687500000f,
+ 0.22247314453125000000f, 0.30053710937500000000f,
+ 0.38891601562500000000f, 0.44259643554687500000f,
+ 0.56961059570312500000f, 0.72277832031250000000f,
+ 0.79544067382812511000f, 0.88339233398437500000f,
+ 0.07214355468750000000f, 0.10879516601562499000f,
+ 0.16790771484375000000f, 0.29360961914062500000f,
+ 0.45538330078125000000f, 0.50723266601562500000f,
+ 0.57998657226562500000f, 0.64074707031250000000f,
+ 0.80291748046875000000f, 0.89422607421875000000f,
+ 0.12490844726562501000f, 0.15905761718750000000f,
+ 0.20852661132812500000f, 0.30151367187500000000f,
+ 0.49752807617187500000f, 0.55804443359375000000f,
+ 0.62777709960937500000f, 0.72064208984375000000f,
+ 0.79550170898437500000f, 0.88891601562500000000f,
+ 0.08975219726562500000f, 0.12194824218750000000f,
+ 0.18426513671875000000f, 0.32464599609374994000f,
+ 0.38659667968750000000f, 0.44100952148437500000f,
+ 0.51263427734375000000f, 0.59179687500000000000f,
+ 0.79501342773437500000f, 0.87026977539062489000f,
+ 0.11788940429687500000f, 0.15905761718750000000f,
+ 0.21420288085937500000f, 0.28894042968750000000f,
+ 0.33688354492187500000f, 0.40325927734374994000f,
+ 0.60858154296875000000f, 0.68188476562500000000f,
+ 0.76678466796875000000f, 0.90145874023437489000f,
+ 0.14083862304687500000f, 0.18835449218749997000f,
+ 0.23965454101562500000f, 0.31286621093750000000f,
+ 0.38485717773437506000f, 0.44082641601562500000f,
+ 0.60177612304687500000f, 0.68484497070312500000f,
+ 0.76055908203125000000f, 0.89541625976562500000f,
+ 0.10882568359375000000f, 0.13769531250000000000f,
+ 0.21316528320312500000f, 0.26501464843750000000f,
+ 0.32177734375000000000f, 0.49124145507812500000f,
+ 0.55108642578125000000f, 0.68588256835937500000f,
+ 0.79547119140625000000f, 0.85958862304687500000f,
+ 0.13674926757812500000f, 0.16751098632812500000f,
+ 0.22680664062500000000f, 0.34832763671875000000f,
+ 0.40255737304687500000f, 0.46463012695312500000f,
+ 0.61526489257812500000f, 0.67926025390625000000f,
+ 0.80822753906250000000f, 0.90686035156250000000f,
+ 0.10131835937500000000f, 0.13183593750000000000f,
+ 0.20205688476562500000f, 0.30111694335937500000f,
+ 0.35342407226562500000f, 0.42828369140625000000f,
+ 0.64599609375000000000f, 0.70831298828125000000f,
+ 0.81140136718750000000f, 0.91256713867187500000f,
+ 0.11578369140625000000f, 0.14309692382812500000f,
+ 0.21105957031250000000f, 0.26412963867187500000f,
+ 0.30953979492187500000f, 0.49267578125000000000f,
+ 0.59716796875000000000f, 0.65881347656250000000f,
+ 0.84097290039062500000f, 0.90310668945312489000f,
+ 0.07464599609375000000f, 0.09997558593750000000f,
+ 0.18060302734375003000f, 0.38583374023437500000f,
+ 0.50662231445312500000f, 0.54971313476562500000f,
+ 0.64471435546875011000f, 0.70724487304687489000f,
+ 0.83312988281250000000f, 0.90435791015625000000f,
+ 0.07476806640625000000f, 0.10748291015625000000f,
+ 0.16592407226562500000f, 0.26123046875000000000f,
+ 0.46646118164062500000f, 0.60763549804687500000f,
+ 0.66607666015625000000f, 0.73538208007812500000f,
+ 0.81076049804687489000f, 0.88739013671875000000f,
+ 0.07873535156250000000f, 0.11584472656249999000f,
+ 0.17028808593750000000f, 0.25445556640625000000f,
+ 0.30422973632812500000f, 0.38681030273437500000f,
+ 0.57699584960937500000f, 0.69436645507812500000f,
+ 0.77667236328125000000f, 0.89392089843749989000f,
+ 0.10147094726562500000f, 0.13159179687500000000f,
+ 0.19046020507812500000f, 0.23526000976562500000f,
+ 0.27966308593750000000f, 0.44104003906250000000f,
+ 0.66116333007812489000f, 0.72622680664062511000f,
+ 0.82690429687500000000f, 0.91116333007812489000f,
+ 0.10186767578125000000f, 0.12704467773437500000f,
+ 0.23614501953125000000f, 0.33917236328125000000f,
+ 0.38659667968750000000f, 0.45022583007812500000f,
+ 0.51669311523437500000f, 0.69384765625000000000f,
+ 0.78341674804687500000f, 0.85733032226562500000f,
+ 0.11718749999999999000f, 0.14511108398437500000f,
+ 0.23666381835937500000f, 0.41110229492187506000f,
+ 0.46807861328125000000f, 0.52429199218750000000f,
+ 0.61270141601562500000f, 0.68215942382812500000f,
+ 0.82949829101562500000f, 0.90768432617187500000f,
+ 0.07641601562500000000f, 0.12448120117187500000f,
+ 0.25485229492187500000f, 0.36981201171875000000f,
+ 0.45916748046875000000f, 0.56747436523437500000f,
+ 0.66174316406250000000f, 0.75390625000000000000f,
+ 0.83981323242187500000f, 0.91360473632812500000f,
+ 0.15972900390625000000f, 0.19354248046875000000f,
+ 0.25228881835937500000f, 0.36074829101562500000f,
+ 0.46249389648437500000f, 0.51147460937500000000f,
+ 0.63070678710937500000f, 0.71679687500000000000f,
+ 0.79190063476562500000f, 0.89437866210937500000f,
+ 0.08181762695312500000f, 0.10870361328125000000f,
+ 0.18395996093750003000f, 0.33041381835937506000f,
+ 0.56329345703125000000f, 0.62432861328125000000f,
+ 0.68063354492187500000f, 0.75381469726562500000f,
+ 0.82128906250000000000f, 0.91418457031250000000f,
+ 0.10296630859375000000f, 0.13818359375000000000f,
+ 0.19012451171875000000f, 0.25195312500000000000f,
+ 0.29031372070312500000f, 0.38848876953124994000f,
+ 0.56964111328125000000f, 0.63232421875000000000f,
+ 0.79367065429687500000f, 0.86746215820312500000f,
+ 0.08334350585937500000f, 0.11074829101562500000f,
+ 0.25390625000000000000f, 0.37994384765625000000f,
+ 0.43066406250000000000f, 0.50143432617187500000f,
+ 0.56604003906250000000f, 0.67437744140625000000f,
+ 0.77297973632812500000f, 0.84588623046875000000f,
+ 0.10623168945312500000f, 0.13430786132812500000f,
+ 0.22341918945312503000f, 0.28439331054687500000f,
+ 0.33758544921875000000f, 0.39956665039062500000f,
+ 0.46145629882812500000f, 0.68099975585937489000f,
+ 0.80355834960937500000f, 0.87707519531250000000f,
+ 0.10916137695312500000f, 0.15090942382812500000f,
+ 0.20352172851562500000f, 0.26831054687500000000f,
+ 0.31430053710937500000f, 0.38589477539062506000f,
+ 0.59524536132812500000f, 0.75579833984375000000f,
+ 0.82385253906250011000f, 0.90435791015625000000f,
+ 0.12384033203125000000f, 0.15441894531250000000f,
+ 0.22241210937500000000f, 0.31097412109375000000f,
+ 0.35778808593750000000f, 0.42529296875000000000f,
+ 0.48367309570312500000f, 0.56576538085937500000f,
+ 0.81484985351562500000f, 0.91079711914062500000f,
+ 0.13006591796875000000f, 0.16448974609374997000f,
+ 0.21536254882812503000f, 0.27410888671875000000f,
+ 0.31088256835937500000f, 0.46582031250000000000f,
+ 0.62500000000000000000f, 0.68176269531250000000f,
+ 0.79217529296875000000f, 0.85668945312500000000f,
+ 0.10388183593750000000f, 0.13211059570312500000f,
+ 0.20230102539062497000f, 0.24249267578125000000f,
+ 0.30886840820312500000f, 0.52383422851562500000f,
+ 0.59936523437500000000f, 0.67883300781249989000f,
+ 0.76483154296875000000f, 0.83837890625000000000f,
+ 0.09634399414062501400f, 0.12719726562500000000f,
+ 0.18905639648437500000f, 0.28439331054687500000f,
+ 0.32870483398437500000f, 0.40664672851562500000f,
+ 0.47045898437500000000f, 0.60473632812500000000f,
+ 0.75292968750000000000f, 0.84332275390625000000f,
+ 0.07638549804687500000f, 0.10598754882812500000f,
+ 0.15655517578125000000f, 0.20651245117187500000f,
+ 0.26156616210937500000f, 0.45477294921875000000f,
+ 0.58084106445312500000f, 0.66912841796874989000f,
+ 0.79544067382812511000f, 0.87670898437500000000f,
+ 0.12612915039062500000f, 0.15570068359375000000f,
+ 0.23049926757812503000f, 0.30682373046875000000f,
+ 0.35879516601562500000f, 0.45544433593750000000f,
+ 0.53207397460937500000f, 0.61602783203125000000f,
+ 0.73202514648437489000f, 0.80175781249999989000f,
+ 0.15173339843750000000f, 0.18734741210937500000f,
+ 0.24090576171875000000f, 0.29397583007812500000f,
+ 0.34545898437500000000f, 0.43624877929687500000f,
+ 0.66336059570312500000f, 0.74176025390625000000f,
+ 0.82150268554687489000f, 0.91268920898437500000f,
+ 0.09027099609375000000f, 0.11645507812500000000f,
+ 0.20907592773437500000f, 0.28088378906250000000f,
+ 0.33248901367187506000f, 0.55090332031250000000f,
+ 0.63449096679687500000f, 0.71221923828125000000f,
+ 0.84094238281250000000f, 0.90359497070312500000f,
+ 0.15972900390625000000f, 0.18395996093750003000f,
+ 0.24517822265625000000f, 0.30987548828125000000f,
+ 0.34307861328125000000f, 0.45132446289062500000f,
+ 0.57824707031250000000f, 0.63983154296875000000f,
+ 0.81130981445312500000f, 0.88888549804687500000f,
+ 0.15994262695312503000f, 0.20867919921875000000f,
+ 0.32122802734375006000f, 0.39120483398437500000f,
+ 0.44802856445312500000f, 0.52880859375000000000f,
+ 0.60815429687500000000f, 0.68164062500000000000f,
+ 0.79934692382812500000f, 0.87576293945312500000f,
+ 0.10412597656250000000f, 0.12973022460937500000f,
+ 0.18273925781250000000f, 0.21649169921875000000f,
+ 0.30233764648437500000f, 0.55673217773437500000f,
+ 0.66128540039062500000f, 0.72561645507812511000f,
+ 0.82302856445312500000f, 0.88766479492187500000f,
+ 0.07537841796875000000f, 0.09817504882812500000f,
+ 0.23794555664062500000f, 0.46679687499999994000f,
+ 0.52993774414062500000f, 0.58395385742187500000f,
+ 0.67074584960937500000f, 0.74023437500000000000f,
+ 0.83380126953124989000f, 0.89849853515625000000f,
+ 0.15072631835937500000f, 0.17712402343750000000f,
+ 0.24856567382812500000f, 0.36038208007812506000f,
+ 0.42337036132812500000f, 0.47601318359375000000f,
+ 0.52593994140625000000f, 0.59274291992187500000f,
+ 0.80798339843750000000f, 0.90469360351562500000f,
+ 0.15414428710937500000f, 0.18820190429687497000f,
+ 0.25094604492187500000f, 0.29464721679687500000f,
+ 0.37106323242187500000f, 0.54916381835937500000f,
+ 0.62451171875000000000f, 0.69677734375000011000f,
+ 0.81225585937500000000f, 0.86859130859375000000f,
+ 0.15219116210937500000f, 0.18026733398437500000f,
+ 0.28439331054687500000f, 0.34317016601562500000f,
+ 0.40075683593750000000f, 0.45849609375000000000f,
+ 0.53359985351562500000f, 0.69235229492187511000f,
+ 0.79379272460937511000f, 0.86282348632812489000f,
+ 0.15676879882812500000f, 0.21008300781250000000f,
+ 0.33645629882812500000f, 0.45623779296875000000f,
+ 0.52462768554687500000f, 0.59280395507812500000f,
+ 0.66549682617187489000f, 0.74441528320312511000f,
+ 0.82208251953125000000f, 0.89379882812500000000f,
+ 0.21536254882812503000f, 0.24060058593750000000f,
+ 0.29077148437500000000f, 0.31991577148437500000f,
+ 0.33447265625000000000f, 0.45199584960937500000f,
+ 0.58197021484375000000f, 0.66146850585937500000f,
+ 0.78262329101562511000f, 0.85507202148437500000f,
+ 0.20626831054687500000f, 0.21850585937500000000f,
+ 0.26080322265625000000f, 0.35946655273437500000f,
+ 0.37521362304687500000f, 0.39743041992187500000f,
+ 0.50741577148437500000f, 0.64389038085937500000f,
+ 0.75369262695312500000f, 0.86325073242187500000f,
+ 0.11788940429687500000f, 0.29791259765625000000f,
+ 0.33776855468749994000f, 0.34927368164062500000f,
+ 0.36770629882812506000f, 0.42602539062500000000f,
+ 0.55191040039062500000f, 0.65634155273437500000f,
+ 0.76977539062500000000f, 0.88491821289062489000f,
+ 0.01211547851562500000f, 0.01022338867187500000f,
+ 0.01986694335937500000f, 0.03564453125000000000f,
+ 0.01953125000000000000f, 0.02334594726562500000f,
+ 0.01419067382812500000f, 0.01010131835937500000f,
+ 0.00653076171875000000f, -0.00592041015625000000f,
+ -0.01763916015625000000f, -0.01974487304687500000f,
+ -0.02005004882812500000f, 0.02288818359375000000f,
+ 0.01721191406250000000f, 0.01870727539062500000f,
+ 0.01675415039062500000f, 0.01922607421875000000f,
+ 0.00927734375000000000f, -0.00158691406250000020f,
+ 0.02526855468749999700f, 0.02813720703125000000f,
+ 0.01351928710937500000f, 0.00338745117187500000f,
+ 0.00421142578125000000f, 0.00378417968750000000f,
+ 0.00515747070312500000f, 0.00042724609375000000f,
+ 0.00439453125000000000f, 0.00253295898437500040f,
+ 0.00402832031250000000f, 0.00177001953125000000f,
+ -0.01260375976562500000f, -0.02294921875000000000f,
+ 0.02651977539062500000f, 0.01025390625000000000f,
+ 0.01174926757812500200f, 0.00210571289062500000f,
+ 0.00170898437500000000f, 0.02532958984375000000f,
+ -0.00692749023437500000f, -0.00811767578125000000f,
+ -0.01123046875000000000f, -0.01342773437500000000f,
+ -0.03646850585937500000f, 0.00497436523437500000f,
+ 0.00384521484375000000f, -0.00695800781250000000f,
+ 0.02447509765625000000f, 0.00476074218750000000f,
+ 0.00573730468750000000f, 0.00366210937499999960f,
+ 0.01147460937500000000f, 0.00180053710937500000f,
+ -0.01092529296875000000f, -0.01702880859375000000f,
+ -0.04046630859375000000f, -0.00775146484375000000f,
+ -0.00616455078125000000f, -0.02407836914062500000f,
+ 0.00903320312500000000f, 0.00280761718750000000f,
+ -0.00213623046875000000f, -0.00393676757812500000f,
+ -0.02191162109375000000f, -0.03463745117187500000f,
+ 0.00891113281250000000f, -0.00088500976562500000f,
+ -0.01925659179687500000f, 0.01486206054687500000f,
+ -0.00479125976562500000f, -0.00466918945312500000f,
+ -0.00851440429687500000f, 0.00006103515625000000f,
+ -0.01278686523437500000f, -0.01043701171875000000f,
+ -0.00103759765625000000f, -0.01568603515625000000f,
+ -0.02438354492187499700f, -0.04794311523437500000f,
+ -0.02096557617187500000f, -0.01858520507812500000f,
+ -0.01666259765625000000f, -0.00396728515625000000f,
+ -0.00656127929687500000f, -0.00769042968750000000f,
+ -0.01361083984375000000f, -0.01751708984375000000f,
+ -0.04080200195312500000f, 0.00631713867187499910f,
+ -0.00219726562500000000f, 0.00097656250000000000f,
+ 0.00314331054687500000f, -0.01959228515625000000f,
+ 0.02874755859375000300f, 0.02236938476562499700f,
+ 0.00570678710937500090f, 0.00088500976562500000f,
+ -0.00643920898437500000f, -0.02484130859375000300f,
+ 0.00436401367187500000f, 0.00686645507812500000f,
+ 0.00061035156250000000f, 0.00073242187500000000f,
+ -0.00817871093750000000f, -0.01150512695312500000f,
+ 0.04953002929687499300f, 0.03457641601562500000f,
+ 0.02035522460937500000f, 0.00500488281250000000f,
+ 0.00936889648437500000f, 0.01116943359375000000f,
+ 0.00570678710937500090f, 0.00103759765625000000f,
+ 0.00189208984375000000f, -0.00955200195312500000f,
+ -0.02539062500000000300f, -0.04522705078125000000f,
+ -0.03604125976562500000f, 0.01473999023437500000f,
+ -0.00128173828125000000f, -0.00119018554687500000f,
+ -0.01373291015625000000f, -0.04290771484375000000f,
+ -0.01791381835937500000f, -0.00158691406250000020f,
+ -0.02319335937500000000f, 0.01019287109375000000f,
+ 0.00299072265625000000f, -0.00183105468749999980f,
+ -0.01525878906249999800f, -0.01489257812500000000f,
+ -0.03228759765625000000f, 0.00912475585937500000f,
+ 0.00399780273437500000f, -0.00762939453124999910f,
+ -0.00765991210937500090f, -0.02145385742187500000f,
+ 0.03164672851562500000f, 0.01733398437500000000f,
+ -0.01260375976562500000f, -0.00808715820312500000f,
+ 0.05148315429687500000f, 0.01748657226562500000f,
+ 0.01052856445312500000f, 0.00985717773437500000f,
+ 0.00299072265625000000f, 0.00186157226562500000f,
+ -0.00311279296875000000f, 0.00094604492187500000f,
+ 0.00411987304687500000f, 0.00454711914062500000f,
+ 0.01882934570312500000f, 0.01113891601562500000f,
+ -0.00119018554687500000f, 0.00103759765625000000f,
+ -0.01864624023437500000f, 0.03665161132812500000f,
+ 0.04336547851562500000f, 0.02246093750000000000f,
+ -0.01263427734374999800f, -0.01199340820312500000f,
+ -0.01501464843750000000f, -0.01046752929687500200f,
+ -0.00964355468750000000f, -0.01623535156250000000f,
+ 0.01611328125000000000f, 0.00524902343750000000f,
+ 0.00274658203125000000f, 0.00982666015625000000f,
+ -0.00897216796875000000f, -0.00973510742187500000f,
+ -0.01651000976562500000f, 0.01535034179687500000f,
+ 0.01950073242187500000f, 0.01223754882812500000f,
+ 0.00003051757812500000f, -0.00454711914062500000f,
+ -0.00222778320312500000f, -0.00509643554687500000f,
+ 0.00457763671875000000f, 0.00360107421875000000f,
+ 0.00939941406250000000f, 0.00665283203124999910f,
+ 0.00369262695312500000f, 0.00595092773437500000f,
+ -0.00436401367187500000f, -0.00796508789062500000f,
+ -0.03091430664062500000f, -0.02447509765625000000f,
+ 0.01181030273437500000f, 0.01330566406249999800f,
+ 0.00396728515625000000f, -0.01303100585937500200f,
+ -0.01367187500000000000f, -0.02078247070312500000f,
+ 0.00375366210937500000f, -0.00265502929687500000f,
+ -0.00765991210937500090f, -0.00344848632812500000f,
+ 0.00836181640625000000f, 0.00946044921875000000f,
+ 0.01358032226562500000f, 0.01528930664062500000f,
+ 0.01080322265625000200f, 0.00830078125000000000f,
+ 0.00430297851562500000f, -0.00869750976562500000f,
+ 0.01736450195312500000f, 0.02001953125000000000f,
+ 0.00112915039062500000f, -0.00149536132812500000f,
+ 0.00765991210937500090f, -0.01177978515625000000f,
+ -0.00802612304687500000f, 0.03424072265625000000f,
+ 0.01843261718750000000f, 0.01849365234375000000f,
+ 0.01025390625000000000f, 0.00289916992187500000f,
+ 0.00103759765625000000f, 0.00000000000000000000f,
+ 0.00259399414062500000f, 0.00549316406250000000f,
+ 0.00631713867187499910f, -0.01119995117187500000f,
+ -0.01898193359375000000f, 0.03265380859375000000f,
+ -0.00018310546875000000f, -0.00241088867187500000f,
+ -0.00488281250000000000f, -0.00280761718750000000f,
+ -0.00418090820312500000f, -0.00842285156250000000f,
+ -0.00985717773437500000f, -0.01132202148437500000f,
+ -0.02124023437500000000f, -0.03161621093750000000f,
+ 0.01242065429687500200f, 0.00311279296875000000f,
+ -0.00262451171875000000f, -0.00653076171875000000f,
+ -0.01470947265625000200f, -0.01974487304687500000f,
+ -0.00085449218750000000f, -0.00888061523437500000f,
+ -0.00296020507812500000f, -0.00549316406250000000f,
+ -0.00762939453124999910f, -0.01327514648437500000f,
+ -0.00054931640625000000f, -0.00231933593750000000f,
+ -0.01013183593750000200f, 0.01251220703125000000f,
+ 0.01242065429687500200f, 0.00512695312500000000f,
+ 0.01644897460937500000f, 0.01254272460937500000f,
+ 0.00775146484375000000f, 0.00338745117187500000f,
+ 0.00177001953125000000f, -0.00442504882812500000f,
+ 0.00610351562500000000f, 0.00091552734374999989f,
+ 0.00570678710937500090f, 0.00354003906250000000f,
+ 0.00399780273437500000f, -0.01119995117187500000f,
+ -0.01449584960937500000f, 0.02383422851562500300f,
+ -0.01705932617187500000f, 0.01712036132812500000f,
+ 0.00595092773437500000f, -0.00350952148437500040f,
+ 0.00024414062500000000f, -0.00512695312500000000f,
+ 0.00091552734374999989f, 0.00167846679687500000f,
+ -0.00372314453125000000f, 0.00399780273437500000f,
+ 0.00250244140625000000f, -0.00015258789062500000f,
+ -0.00833129882812500000f, -0.00152587890625000000f,
+ -0.01928710937500000000f, 0.02038574218750000000f,
+ 0.00012207031250000000f, 0.00097656250000000000f,
+ -0.00079345703125000011f, -0.00851440429687500000f,
+ 0.00961303710937500000f, 0.00503540039062499910f,
+ 0.00601196289062499910f, 0.01150512695312500000f,
+ 0.00473022460937500000f, -0.00125122070312500000f,
+ -0.00421142578125000000f, -0.00988769531250000000f,
+ -0.00332641601562499960f, -0.01882934570312500000f,
+ 0.01098632812500000000f, 0.00299072265625000000f,
+ -0.00161743164062500000f, -0.00973510742187500000f,
+ -0.00347900390625000000f, -0.00747680664062500000f,
+ -0.00250244140625000000f, 0.01547241210937500000f,
+ 0.01428222656250000000f, 0.00802612304687500000f,
+ -0.00418090820312500000f, -0.01187133789062500000f,
+ 0.01989746093750000000f, 0.01080322265625000200f,
+ -0.00054931640625000000f, -0.00692749023437500000f,
+ -0.01409912109375000000f, -0.00411987304687500000f,
+ 0.00967407226562500000f, 0.00161743164062500000f,
+ -0.00048828125000000000f, 0.00201416015625000000f,
+ -0.00219726562500000000f, -0.00384521484375000000f,
+ -0.01086425781250000000f, -0.01058959960937500000f,
+ -0.01000976562500000000f, -0.00219726562500000000f,
+ -0.01028442382812500000f, 0.00988769531250000000f,
+ 0.00463867187500000000f, 0.01065063476562500000f,
+ 0.00515747070312500000f, -0.00598144531250000000f,
+ 0.00546264648437500000f, 0.00775146484375000000f,
+ 0.00793457031250000000f, 0.00991821289062500000f,
+ -0.00225830078125000000f, -0.00244140625000000000f,
+ 0.00228881835937500000f, -0.00094604492187500000f,
+ 0.00823974609375000000f, 0.00839233398437500000f,
+ 0.00265502929687500000f, 0.00848388671875000000f,
+ -0.01361083984375000000f, -0.00918579101562500000f,
+ 0.00942993164062500000f, 0.00216674804687500000f,
+ -0.00076293945312500000f, -0.00738525390625000000f,
+ 0.01574707031250000000f, 0.00491333007812500000f,
+ -0.00494384765625000000f, -0.00253295898437500040f,
+ 0.01004028320312500000f, 0.00701904296875000090f,
+ -0.00949096679687500000f, -0.00790405273437500000f,
+ 0.00540161132812500090f, -0.00079345703125000011f,
+ -0.01409912109375000000f, 0.00271606445312500000f,
+ 0.00784301757812500000f, 0.00018310546875000000f,
+ -0.00396728515625000000f, -0.00283813476562499960f,
+ -0.01391601562500000000f, -0.00967407226562500000f,
+ -0.00674438476562500000f, -0.00628662109375000000f,
+ -0.01272583007812500000f, -0.00555419921875000000f,
+ -0.00225830078125000000f, 0.00714111328125000000f,
+ 0.00146484375000000000f, 0.00796508789062500000f,
+ 0.01095581054687500000f, 0.00704956054687500000f,
+ 0.00787353515625000000f, 0.00259399414062500000f,
+ -0.00860595703125000000f, 0.00769042968750000000f,
+ -0.00448608398437500000f, -0.00677490234375000000f,
+ 0.00765991210937500090f, -0.00631713867187499910f,
+ 0.01351928710937500000f, 0.00375366210937500000f,
+ -0.01272583007812500000f, -0.00109863281250000000f,
+ 0.00833129882812500000f, -0.00735473632812500090f,
+ 0.00732421874999999910f, -0.00341796875000000000f,
+ 0.00134277343749999980f, -0.00509643554687500000f,
+ 0.00384521484375000000f, -0.00378417968750000000f,
+ -0.00234985351562500000f, 0.00177001953125000000f,
+ -0.01223754882812500000f, 0.01016235351562500000f,
+ -0.00360107421875000000f, 0.00250244140625000000f,
+ 0.00384521484375000000f, 0.00460815429687500000f,
+ -0.01321411132812500000f, 0.01095581054687500000f,
+ -0.00396728515625000000f, -0.00311279296875000000f,
+ 0.00399780273437500000f, -0.00744628906250000000f,
+ 0.00262451171875000000f, 0.00259399414062500000f,
+ -0.01409912109375000000f, 0.01263427734374999800f,
+ -0.00732421874999999910f, 0.00048828125000000000f,
+ 0.00442504882812500000f, 0.00085449218750000000f,
+ -0.00625610351562500000f, -0.01467895507812500000f,
+ 0.01138305664062500000f, 0.00894165039062500000f,
+ -0.00219726562500000000f, -0.00531005859375000000f,
+ 0.00189208984375000000f, 0.00790405273437500000f,
+ -0.00024414062500000000f, -0.00054931640625000000f,
+ 0.01104736328125000000f, 0.00711059570312500000f,
+ 0.00564575195312500000f, 0.00131225585937500000f,
+ 0.00848388671875000000f, 0.00082397460937500000f,
+ 0.00588989257812500000f, 0.01739501953125000000f,
+ -0.00756835937500000000f, 0.00576782226562500000f,
+ 0.00280761718750000000f, 0.00094604492187500000f,
+ -0.00839233398437500000f, -0.00009155273437500000f,
+ 0.00741577148437500000f, 0.00537109374999999910f,
+ 0.01336669921875000200f, 0.00637817382812500090f,
+ 0.00628662109375000000f, -0.00155639648437500000f,
+ 0.00241088867187500000f, 0.00332641601562499960f,
+ 0.00512695312500000000f, -0.00564575195312500000f,
+ -0.00939941406250000000f, -0.00207519531250000000f,
+ -0.01885986328125000000f, 0.01174926757812500200f,
+ -0.00946044921875000000f, -0.00329589843750000000f,
+ -0.00500488281250000000f, 0.00503540039062499910f,
+ 0.00186157226562500000f, -0.00463867187500000000f,
+ -0.00308227539062500000f, -0.01257324218750000000f,
+ -0.00817871093750000000f, -0.00784301757812500000f,
+ -0.00122070312500000000f, -0.00061035156250000000f,
+ -0.00085449218750000000f, -0.00482177734375000000f,
+ -0.00918579101562500000f, 0.00827026367187500000f,
+ 0.01159667968750000000f, -0.01031494140625000000f,
+ -0.01119995117187500000f, -0.00402832031250000000f,
+ 0.00195312500000000000f, 0.00347900390625000000f,
+ -0.00399780273437500000f, -0.00686645507812500000f,
+ -0.00476074218750000000f, -0.00793457031250000000f,
+ -0.00192260742187500000f, -0.00354003906250000000f,
+ 0.00473022460937500000f, -0.01788330078125000000f,
+ -0.00616455078125000000f, 0.00775146484375000000f,
+ -0.00875854492187500000f, 0.00543212890625000000f,
+ 0.00692749023437500000f, -0.00323486328125000000f,
+ -0.00897216796875000000f, 0.00500488281250000000f,
+ 0.00909423828125000000f, -0.00305175781250000000f,
+ 0.00564575195312500000f, 0.00967407226562500000f,
+ 0.00588989257812500000f, -0.00137329101562500000f,
+ 0.00085449218750000000f, 0.00244140625000000000f,
+ -0.00265502929687500000f, -0.01321411132812500000f,
+ 0.00067138671874999989f, -0.00146484375000000000f,
+ 0.00146484375000000000f, -0.00723266601562500000f,
+ -0.00698852539062499910f, -0.00424194335937500000f,
+ 0.00366210937499999960f, -0.01110839843750000000f,
+ 0.00817871093750000000f, -0.00415039062500000000f,
+ 0.01208496093750000200f, 0.00381469726562499960f,
+ 0.00396728515625000000f, -0.00271606445312500000f,
+ -0.00830078125000000000f, 0.00360107421875000000f,
+ -0.00781250000000000000f, -0.00207519531250000000f,
+ -0.01376342773437500000f, 0.01489257812500000000f,
+ 0.00436401367187500000f, -0.00503540039062499910f,
+ -0.00146484375000000000f, -0.00579833984375000000f,
+ 0.00323486328125000000f, 0.00668334960937500090f,
+ 0.00143432617187500000f, 0.01327514648437500000f,
+ 0.00747680664062500000f, 0.00296020507812500000f,
+ 0.00228881835937500000f, -0.01275634765625000200f,
+ 0.00369262695312500000f, -0.00570678710937500090f,
+ 0.01739501953125000000f, -0.00610351562500000000f,
+ -0.01071166992187500000f, 0.00686645507812500000f,
+ -0.00064086914062500000f, -0.00662231445312500000f,
+ 0.00714111328125000000f, -0.00338745117187500000f,
+ 0.00592041015625000000f, 0.00042724609375000000f,
+ 0.00738525390625000000f, 0.00360107421875000000f,
+ 0.00427246093750000000f, -0.01211547851562500000f,
+ 0.01083374023437500000f, 0.01101684570312499800f,
+ -0.00137329101562500000f, -0.00595092773437500000f
+};
+
+const SKP_Silk_NLSF_CBS_FLP SKP_Silk_NLSF_CB0_10_Stage_info_FLP[ NLSF_MSVQ_CB0_10_STAGES ] =
+{
+ { 64, &SKP_Silk_NLSF_MSVQ_CB0_10[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates[ 0 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_10[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates[ 64 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_10[ 10 * 80 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates[ 80 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_10[ 10 * 88 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates[ 88 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_10[ 10 * 96 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates[ 96 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_10[ 10 * 104 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates[ 104 ] }
+};
+
+const SKP_Silk_NLSF_CB_FLP SKP_Silk_NLSF_CB0_10_FLP =
+{
+ NLSF_MSVQ_CB0_10_STAGES,
+ SKP_Silk_NLSF_CB0_10_Stage_info_FLP,
+ SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min,
+ SKP_Silk_NLSF_MSVQ_CB0_10_CDF,
+ SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_tables_NLSF_CB0_16_FLP.c
@@ -1,0 +1,1925 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 14.76 kB */
+/**********************************************/
+
+#include "SKP_Silk_tables_FLP.h"
+#include "SKP_Silk_tables_NLSF_CB0_16.h"
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB0_16_rates[ NLSF_MSVQ_CB0_16_VECTORS ] =
+{
+ 5.50000000000000000000f, 5.65625000000000000000f,
+ 5.68750000000000000000f, 5.71875000000000000000f,
+ 5.81250000000000000000f, 5.81250000000000000000f,
+ 5.96875000000000000000f, 5.96875000000000000000f,
+ 5.96875000000000000000f, 6.12500000000000000000f,
+ 6.15625000000000000000f, 6.28125000000000000000f,
+ 6.34375000000000000000f, 6.43750000000000000000f,
+ 6.43750000000000000000f, 6.43750000000000000000f,
+ 6.46875000000000000000f, 6.46875000000000000000f,
+ 6.53125000000000000000f, 6.53125000000000000000f,
+ 6.53125000000000000000f, 6.53125000000000000000f,
+ 6.56250000000000000000f, 6.56250000000000000000f,
+ 6.56250000000000000000f, 6.59375000000000000000f,
+ 6.59375000000000000000f, 6.59375000000000000000f,
+ 6.62500000000000000000f, 6.68750000000000000000f,
+ 6.75000000000000000000f, 6.75000000000000000000f,
+ 6.78125000000000000000f, 6.78125000000000000000f,
+ 6.78125000000000000000f, 6.78125000000000000000f,
+ 6.81250000000000000000f, 6.81250000000000000000f,
+ 6.84375000000000000000f, 6.84375000000000000000f,
+ 6.87500000000000000000f, 6.90625000000000000000f,
+ 6.93750000000000000000f, 6.96875000000000000000f,
+ 6.96875000000000000000f, 6.96875000000000000000f,
+ 6.96875000000000000000f, 7.00000000000000000000f,
+ 7.00000000000000000000f, 7.00000000000000000000f,
+ 7.03125000000000000000f, 7.03125000000000000000f,
+ 7.06250000000000000000f, 7.06250000000000000000f,
+ 7.06250000000000000000f, 7.06250000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.12500000000000000000f, 7.12500000000000000000f,
+ 7.12500000000000000000f, 7.12500000000000000000f,
+ 7.15625000000000000000f, 7.15625000000000000000f,
+ 7.15625000000000000000f, 7.18750000000000000000f,
+ 7.18750000000000000000f, 7.18750000000000000000f,
+ 7.21875000000000000000f, 7.21875000000000000000f,
+ 7.21875000000000000000f, 7.21875000000000000000f,
+ 7.25000000000000000000f, 7.25000000000000000000f,
+ 7.25000000000000000000f, 7.25000000000000000000f,
+ 7.28125000000000000000f, 7.31250000000000000000f,
+ 7.34375000000000000000f, 7.34375000000000000000f,
+ 7.34375000000000000000f, 7.37500000000000000000f,
+ 7.37500000000000000000f, 7.37500000000000000000f,
+ 7.37500000000000000000f, 7.40625000000000000000f,
+ 7.40625000000000000000f, 7.40625000000000000000f,
+ 7.40625000000000000000f, 7.50000000000000000000f,
+ 7.50000000000000000000f, 7.50000000000000000000f,
+ 7.50000000000000000000f, 7.53125000000000000000f,
+ 7.56250000000000000000f, 7.59375000000000000000f,
+ 7.62500000000000000000f, 7.62500000000000000000f,
+ 7.71875000000000000000f, 7.71875000000000000000f,
+ 7.75000000000000000000f, 7.75000000000000000000f,
+ 7.75000000000000000000f, 7.78125000000000000000f,
+ 7.84375000000000000000f, 7.96875000000000000000f,
+ 7.96875000000000000000f, 8.00000000000000000000f,
+ 8.12500000000000000000f, 8.12500000000000000000f,
+ 8.15625000000000000000f, 8.25000000000000000000f,
+ 8.25000000000000000000f, 8.31250000000000000000f,
+ 8.31250000000000000000f, 8.37500000000000000000f,
+ 8.46875000000000000000f, 8.56250000000000000000f,
+ 8.62500000000000000000f, 8.71875000000000000000f,
+ 9.00000000000000000000f, 9.00000000000000000000f,
+ 9.00000000000000000000f, 9.00000000000000000000f,
+ 3.68750000000000000000f, 3.75000000000000000000f,
+ 3.78125000000000000000f, 3.78125000000000000000f,
+ 3.81250000000000000000f, 3.90625000000000000000f,
+ 3.90625000000000000000f, 4.03125000000000000000f,
+ 4.03125000000000000000f, 4.06250000000000000000f,
+ 4.09375000000000000000f, 4.12500000000000000000f,
+ 4.25000000000000000000f, 4.28125000000000000000f,
+ 4.31250000000000000000f, 4.53125000000000000000f,
+ 2.71875000000000000000f, 2.75000000000000000000f,
+ 2.84375000000000000000f, 3.03125000000000000000f,
+ 3.06250000000000000000f, 3.12500000000000000000f,
+ 3.28125000000000000000f, 3.31250000000000000000f,
+ 2.87500000000000000000f, 2.96875000000000000000f,
+ 2.96875000000000000000f, 3.00000000000000000000f,
+ 3.03125000000000000000f, 3.03125000000000000000f,
+ 3.06250000000000000000f, 3.09375000000000000000f,
+ 2.75000000000000000000f, 2.87500000000000000000f,
+ 2.96875000000000000000f, 2.96875000000000000000f,
+ 3.00000000000000000000f, 3.03125000000000000000f,
+ 3.06250000000000000000f, 3.40625000000000000000f,
+ 2.90625000000000000000f, 2.90625000000000000000f,
+ 2.90625000000000000000f, 3.00000000000000000000f,
+ 3.03125000000000000000f, 3.03125000000000000000f,
+ 3.09375000000000000000f, 3.15625000000000000000f,
+ 2.90625000000000000000f, 2.93750000000000000000f,
+ 2.93750000000000000000f, 2.96875000000000000000f,
+ 2.96875000000000000000f, 3.09375000000000000000f,
+ 3.09375000000000000000f, 3.09375000000000000000f,
+ 2.90625000000000000000f, 2.90625000000000000000f,
+ 2.90625000000000000000f, 3.00000000000000000000f,
+ 3.00000000000000000000f, 3.03125000000000000000f,
+ 3.12500000000000000000f, 3.18750000000000000000f,
+ 2.90625000000000000000f, 2.96875000000000000000f,
+ 2.96875000000000000000f, 3.00000000000000000000f,
+ 3.00000000000000000000f, 3.00000000000000000000f,
+ 3.06250000000000000000f, 3.09375000000000000000f,
+ 3.90625000000000000000f, 3.90625000000000000000f,
+ 3.96875000000000000000f, 3.96875000000000000000f,
+ 3.96875000000000000000f, 3.96875000000000000000f,
+ 4.00000000000000000000f, 4.00000000000000000000f,
+ 4.00000000000000000000f, 4.00000000000000000000f,
+ 4.00000000000000000000f, 4.00000000000000000000f,
+ 4.03125000000000000000f, 4.06250000000000000000f,
+ 4.09375000000000000000f, 4.12500000000000000000f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min[ 16 + 1 ] =
+{
+ 0.00811767578125000000f,
+ 0.00009155273437500000f,
+ 0.00122070312500000000f,
+ 0.00009155273437500000f,
+ 0.00009155273437500000f,
+ 0.00048828125000000000f,
+ 0.00238037109375000000f,
+ 0.00271606445312500000f,
+ 0.00326538085937500000f,
+ 0.00430297851562500000f,
+ 0.00573730468750000000f,
+ 0.00445556640625000000f,
+ 0.00830078125000000000f,
+ 0.00732421874999999910f,
+ 0.00717163085937500000f,
+ 0.00656127929687500000f,
+ 0.01928710937500000000f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * NLSF_MSVQ_CB0_16_VECTORS ] =
+{
+ 0.03570556640625000000f, 0.06951904296875000000f,
+ 0.11163330078125001000f, 0.16400146484375000000f,
+ 0.23394775390625000000f, 0.27810668945312500000f,
+ 0.34478759765624994000f, 0.40600585937500000000f,
+ 0.46908569335937500000f, 0.53555297851562500000f,
+ 0.59774780273437500000f, 0.65573120117187500000f,
+ 0.72625732421875000000f, 0.79461669921875000000f,
+ 0.86419677734375000000f, 0.92166137695312500000f,
+ 0.04968261718750000700f, 0.07122802734375000000f,
+ 0.12557983398437500000f, 0.18420410156250000000f,
+ 0.23858642578125000000f, 0.29125976562500000000f,
+ 0.35940551757812500000f, 0.42788696289062500000f,
+ 0.48178100585937500000f, 0.53125000000000000000f,
+ 0.59405517578125000000f, 0.64883422851562500000f,
+ 0.69842529296875000000f, 0.74966430664062500000f,
+ 0.81524658203125000000f, 0.85629272460937500000f,
+ 0.05261230468750000000f, 0.08148193359375000000f,
+ 0.12377929687500000000f, 0.19934082031250000000f,
+ 0.25503540039062500000f, 0.30880737304687500000f,
+ 0.36904907226562506000f, 0.42910766601562500000f,
+ 0.50326538085937500000f, 0.57357788085937500000f,
+ 0.62307739257812500000f, 0.68365478515625000000f,
+ 0.74008178710937511000f, 0.80029296875000011000f,
+ 0.86700439453125000000f, 0.91418457031250000000f,
+ 0.04556274414062500000f, 0.10458374023437501000f,
+ 0.14614868164062500000f, 0.19528198242187500000f,
+ 0.25741577148437500000f, 0.31030273437500000000f,
+ 0.36621093750000000000f, 0.42926025390625000000f,
+ 0.49526977539062500000f, 0.55572509765625000000f,
+ 0.61157226562500000000f, 0.67437744140625000000f,
+ 0.73709106445312500000f, 0.79635620117187500000f,
+ 0.86007690429687500000f, 0.91921997070312489000f,
+ 0.03414916992187500000f, 0.06375122070312500000f,
+ 0.13107299804687500000f, 0.19058227539062500000f,
+ 0.26522827148437500000f, 0.32778930664062500000f,
+ 0.38720703125000000000f, 0.45950317382812500000f,
+ 0.51965332031250000000f, 0.57348632812500000000f,
+ 0.63223266601562500000f, 0.68707275390625011000f,
+ 0.74758911132812500000f, 0.81018066406250000000f,
+ 0.87338256835937500000f, 0.93475341796875000000f,
+ 0.04159545898437500000f, 0.07376098632812500000f,
+ 0.11984252929687500000f, 0.16955566406249997000f,
+ 0.22650146484375000000f, 0.28427124023437500000f,
+ 0.36251831054687500000f, 0.42013549804687500000f,
+ 0.49264526367187500000f, 0.56518554687500000000f,
+ 0.62432861328125000000f, 0.68902587890625000000f,
+ 0.74887084960937500000f, 0.80676269531250000000f,
+ 0.86419677734375000000f, 0.92523193359375000000f,
+ 0.03424072265625000000f, 0.07638549804687500000f,
+ 0.15917968750000000000f, 0.21813964843750000000f,
+ 0.28411865234375000000f, 0.33807373046874994000f,
+ 0.40206909179687500000f, 0.45166015625000000000f,
+ 0.51464843750000000000f, 0.57067871093750000000f,
+ 0.62365722656250000000f, 0.68627929687499989000f,
+ 0.74987792968750011000f, 0.81182861328125000000f,
+ 0.87142944335937500000f, 0.92852783203125000000f,
+ 0.01831054687500000000f, 0.04019165039062500700f,
+ 0.09063720703125001400f, 0.17117309570312500000f,
+ 0.23480224609375000000f, 0.29858398437500000000f,
+ 0.37136840820312500000f, 0.42990112304687506000f,
+ 0.49984741210937494000f, 0.56085205078125000000f,
+ 0.62716674804687500000f, 0.69232177734375000000f,
+ 0.75497436523437489000f, 0.81472778320312500000f,
+ 0.87420654296875000000f, 0.92636108398437500000f,
+ 0.02871704101562500000f, 0.05743408203125000000f,
+ 0.13043212890625000000f, 0.16906738281250000000f,
+ 0.25885009765625000000f, 0.30084228515625000000f,
+ 0.36437988281250000000f, 0.43600463867187494000f,
+ 0.49105834960937506000f, 0.56460571289062500000f,
+ 0.62030029296875000000f, 0.69006347656250000000f,
+ 0.75411987304687511000f, 0.81292724609374989000f,
+ 0.87933349609375000000f, 0.92864990234375000000f,
+ 0.01937866210937500000f, 0.05184936523437500000f,
+ 0.13354492187500000000f, 0.18151855468750000000f,
+ 0.24710083007812500000f, 0.30868530273437500000f,
+ 0.37457275390625000000f, 0.43267822265625000000f,
+ 0.49166870117187500000f, 0.54360961914062500000f,
+ 0.60104370117187500000f, 0.66445922851562511000f,
+ 0.73019409179687500000f, 0.78936767578124989000f,
+ 0.85516357421875000000f, 0.91961669921875000000f,
+ 0.04296874999999999300f, 0.06781005859375000000f,
+ 0.10754394531250000000f, 0.17135620117187503000f,
+ 0.22415161132812497000f, 0.27005004882812500000f,
+ 0.33535766601562500000f, 0.38977050781250000000f,
+ 0.46850585937500000000f, 0.51959228515625000000f,
+ 0.57736206054687500000f, 0.64276123046875000000f,
+ 0.71194458007812500000f, 0.76950073242187500000f,
+ 0.83035278320312511000f, 0.88571166992187500000f,
+ 0.02139282226562500000f, 0.03988647460937500000f,
+ 0.10827636718750001000f, 0.19229125976562500000f,
+ 0.23632812500000000000f, 0.29217529296875000000f,
+ 0.34262084960937494000f, 0.39605712890625000000f,
+ 0.46295166015625000000f, 0.53604125976562500000f,
+ 0.60348510742187500000f, 0.67434692382812500000f,
+ 0.73944091796875000000f, 0.80368041992187500000f,
+ 0.86599731445312500000f, 0.92257690429687500000f,
+ 0.05346679687500000700f, 0.07214355468750000000f,
+ 0.14889526367187500000f, 0.20046997070312500000f,
+ 0.23843383789062500000f, 0.29895019531250000000f,
+ 0.34176635742187500000f, 0.43609619140625006000f,
+ 0.48202514648437500000f, 0.54931640625000000000f,
+ 0.62243652343750000000f, 0.68411254882812489000f,
+ 0.74182128906250011000f, 0.79724121093750000000f,
+ 0.86547851562500000000f, 0.93484497070312500000f,
+ 0.02749633789062500000f, 0.04971313476562500000f,
+ 0.10241699218749999000f, 0.14144897460937500000f,
+ 0.22143554687500000000f, 0.26754760742187500000f,
+ 0.30429077148437500000f, 0.35272216796875000000f,
+ 0.46432495117187500000f, 0.53540039062500000000f,
+ 0.59579467773437500000f, 0.66687011718750000000f,
+ 0.72937011718750000000f, 0.79278564453125000000f,
+ 0.85855102539062500000f, 0.92114257812500000000f,
+ 0.02993774414062500000f, 0.05093383789062500000f,
+ 0.10140991210937499000f, 0.14321899414062500000f,
+ 0.18960571289062500000f, 0.26525878906250000000f,
+ 0.32391357421875006000f, 0.39538574218750000000f,
+ 0.46420288085937506000f, 0.54049682617187500000f,
+ 0.60595703125000000000f, 0.67510986328124989000f,
+ 0.74291992187500000000f, 0.81152343750000000000f,
+ 0.87655639648437500000f, 0.93020629882812500000f,
+ 0.04904174804687500000f, 0.07864379882812500000f,
+ 0.12878417968750000000f, 0.16821289062499997000f,
+ 0.26037597656250000000f, 0.31701660156250000000f,
+ 0.35482788085937500000f, 0.41720581054687494000f,
+ 0.48071289062500000000f, 0.52487182617187500000f,
+ 0.60546875000000000000f, 0.66708374023437500000f,
+ 0.71697998046875000000f, 0.78692626953125000000f,
+ 0.85726928710937500000f, 0.91952514648437500000f,
+ 0.02474975585937500000f, 0.04489135742187500000f,
+ 0.09594726562500000000f, 0.15383911132812500000f,
+ 0.22674560546875000000f, 0.28652954101562500000f,
+ 0.34100341796875000000f, 0.40451049804687500000f,
+ 0.46255493164062494000f, 0.51089477539062500000f,
+ 0.59762573242187500000f, 0.67648315429687500000f,
+ 0.73593139648437511000f, 0.79779052734375000000f,
+ 0.86618041992187500000f, 0.92758178710937500000f,
+ 0.04708862304687499300f, 0.06542968750000000000f,
+ 0.11074829101562500000f, 0.19369506835937500000f,
+ 0.22378540039062503000f, 0.28500366210937500000f,
+ 0.32684326171875000000f, 0.41491699218750006000f,
+ 0.46078491210937506000f, 0.52917480468750000000f,
+ 0.61346435546875000000f, 0.66790771484375000000f,
+ 0.72424316406250000000f, 0.78237915039062500000f,
+ 0.84893798828125000000f, 0.91299438476562511000f,
+ 0.01501464843750000000f, 0.03616333007812500000f,
+ 0.08972167968750000000f, 0.16748046875000003000f,
+ 0.21652221679687500000f, 0.26705932617187500000f,
+ 0.35388183593749994000f, 0.41439819335937500000f,
+ 0.48965454101562500000f, 0.54977416992187500000f,
+ 0.61578369140625000000f, 0.67526245117187500000f,
+ 0.74050903320312489000f, 0.80584716796875000000f,
+ 0.86926269531250000000f, 0.92642211914062500000f,
+ 0.04721069335937500000f, 0.06964111328125000000f,
+ 0.11270141601562500000f, 0.19351196289062500000f,
+ 0.23675537109374997000f, 0.29318237304687500000f,
+ 0.36157226562500000000f, 0.40393066406250000000f,
+ 0.50549316406250000000f, 0.55142211914062500000f,
+ 0.60299682617187500000f, 0.65319824218750011000f,
+ 0.73577880859375000000f, 0.81195068359375000000f,
+ 0.87847900390625000000f, 0.93551635742187511000f,
+ 0.02090454101562500000f, 0.04083251953125000000f,
+ 0.10403442382812500000f, 0.16058349609375000000f,
+ 0.21209716796875000000f, 0.28143310546875000000f,
+ 0.34832763671875000000f, 0.44320678710937500000f,
+ 0.49856567382812500000f, 0.54605102539062500000f,
+ 0.59313964843750000000f, 0.64996337890625000000f,
+ 0.71084594726562500000f, 0.76846313476562500000f,
+ 0.85366821289062500000f, 0.93139648437500000000f,
+ 0.02706909179687500300f, 0.04824829101562500000f,
+ 0.09329223632812500000f, 0.13177490234375000000f,
+ 0.21948242187500000000f, 0.26296997070312500000f,
+ 0.30661010742187500000f, 0.39996337890625000000f,
+ 0.49636840820312500000f, 0.54605102539062500000f,
+ 0.61746215820312500000f, 0.68206787109375000000f,
+ 0.74398803710937511000f, 0.80517578125000000000f,
+ 0.86407470703125000000f, 0.92129516601562489000f,
+ 0.06973266601562500000f, 0.11428833007812500000f,
+ 0.17279052734375000000f, 0.23120117187500000000f,
+ 0.28451538085937500000f, 0.34545898437500000000f,
+ 0.40402221679687500000f, 0.46359252929687494000f,
+ 0.52413940429687500000f, 0.58670043945312500000f,
+ 0.64416503906250000000f, 0.70104980468750000000f,
+ 0.75747680664062500000f, 0.81344604492187489000f,
+ 0.87161254882812500000f, 0.92956542968750000000f,
+ 0.04565429687500000700f, 0.06433105468750000000f,
+ 0.10522460937500000000f, 0.21051025390625003000f,
+ 0.25415039062500000000f, 0.29467773437500000000f,
+ 0.34338378906250000000f, 0.39132690429687500000f,
+ 0.45712280273437500000f, 0.50299072265625000000f,
+ 0.55480957031250000000f, 0.61294555664062500000f,
+ 0.70074462890624989000f, 0.76782226562500000000f,
+ 0.84548950195312500000f, 0.90420532226562500000f,
+ 0.01754760742187500000f, 0.03848266601562500000f,
+ 0.11782836914062500000f, 0.20223999023437500000f,
+ 0.25311279296875000000f, 0.32986450195312500000f,
+ 0.38772583007812500000f, 0.45068359375000000000f,
+ 0.52111816406250000000f, 0.58126831054687500000f,
+ 0.64019775390624989000f, 0.70358276367187500000f,
+ 0.76208496093750011000f, 0.81491088867187500000f,
+ 0.87646484375000000000f, 0.92605590820312500000f,
+ 0.05133056640625000000f, 0.06753540039062500000f,
+ 0.11846923828125000000f, 0.19036865234374997000f,
+ 0.21997070312500000000f, 0.29437255859375000000f,
+ 0.33193969726562500000f, 0.40988159179687500000f,
+ 0.45181274414062494000f, 0.49478149414062506000f,
+ 0.54751586914062500000f, 0.63699340820312489000f,
+ 0.71868896484375011000f, 0.78628540039062500000f,
+ 0.84704589843750000000f, 0.89907836914062500000f,
+ 0.02709960937500000000f, 0.04931640625000000000f,
+ 0.11975097656250000000f, 0.15853881835937500000f,
+ 0.21990966796875003000f, 0.26388549804687500000f,
+ 0.30035400390625000000f, 0.35012817382812500000f,
+ 0.49032592773437500000f, 0.55606079101562500000f,
+ 0.62081909179687500000f, 0.69500732421875000000f,
+ 0.74777221679687500000f, 0.80603027343750000000f,
+ 0.85614013671875000000f, 0.90731811523437500000f,
+ 0.02456665039062500000f, 0.04437255859375000000f,
+ 0.08187866210937500000f, 0.13647460937500000000f,
+ 0.24218750000000000000f, 0.28564453125000000000f,
+ 0.34783935546875000000f, 0.43777465820312500000f,
+ 0.49453735351562500000f, 0.54418945312500000000f,
+ 0.59365844726562500000f, 0.66058349609375000000f,
+ 0.72933959960937489000f, 0.79125976562500000000f,
+ 0.86630249023437511000f, 0.92965698242187500000f,
+ 0.05004882812500000000f, 0.07272338867187500000f,
+ 0.10632324218750000000f, 0.15509033203125000000f,
+ 0.18408203125000000000f, 0.26263427734375000000f,
+ 0.35522460937499994000f, 0.39569091796875000000f,
+ 0.48345947265625000000f, 0.53002929687500000000f,
+ 0.59039306640625000000f, 0.64642333984375000000f,
+ 0.72137451171875011000f, 0.79006958007812511000f,
+ 0.86572265625000000000f, 0.92465209960937500000f,
+ 0.04980468750000000000f, 0.06726074218750000000f,
+ 0.13763427734375000000f, 0.23132324218750003000f,
+ 0.26605224609375000000f, 0.32080078125000000000f,
+ 0.36505126953125000000f, 0.43017578125000000000f,
+ 0.47729492187500000000f, 0.52471923828125000000f,
+ 0.58419799804687500000f, 0.67892456054687511000f,
+ 0.74960327148437489000f, 0.81057739257812500000f,
+ 0.87292480468750000000f, 0.93106079101562500000f,
+ 0.06234741210937500000f, 0.07971191406250001400f,
+ 0.12161254882812500000f, 0.20907592773437500000f,
+ 0.24530029296875000000f, 0.29034423828125000000f,
+ 0.33505249023437500000f, 0.39028930664062500000f,
+ 0.47076416015625000000f, 0.51049804687500000000f,
+ 0.57675170898437500000f, 0.61880493164062500000f,
+ 0.69891357421875000000f, 0.79983520507812500000f,
+ 0.87619018554687500000f, 0.93438720703125011000f,
+ 0.06787109375000000000f, 0.08538818359375000000f,
+ 0.13626098632812500000f, 0.16235351562500000000f,
+ 0.21691894531249997000f, 0.28796386718750000000f,
+ 0.33526611328125000000f, 0.40350341796875000000f,
+ 0.44552612304687500000f, 0.55899047851562500000f,
+ 0.61465454101562500000f, 0.66659545898437500000f,
+ 0.72024536132812511000f, 0.78430175781250000000f,
+ 0.86010742187500000000f, 0.93328857421875000000f,
+ 0.02548217773437500000f, 0.04702758789062500000f,
+ 0.12460327148437500000f, 0.17605590820312503000f,
+ 0.22540283203125000000f, 0.28683471679687500000f,
+ 0.33480834960937500000f, 0.38012695312500000000f,
+ 0.45840454101562500000f, 0.56890869140625000000f,
+ 0.63607788085937500000f, 0.70495605468750000000f,
+ 0.77185058593750000000f, 0.82293701171875000000f,
+ 0.88354492187500000000f, 0.92840576171875011000f,
+ 0.05477905273437500000f, 0.07150268554687500000f,
+ 0.14675903320312500000f, 0.17993164062500003000f,
+ 0.21905517578125000000f, 0.26077270507812500000f,
+ 0.31198120117187500000f, 0.40802001953125000000f,
+ 0.44573974609375000000f, 0.50259399414062500000f,
+ 0.55764770507812500000f, 0.63281250000000000000f,
+ 0.72158813476562500000f, 0.80130004882812500000f,
+ 0.86132812500000000000f, 0.92742919921875000000f,
+ 0.05291748046875000000f, 0.06878662109375000000f,
+ 0.12301635742187500000f, 0.15832519531250000000f,
+ 0.19854736328125000000f, 0.24023437500000000000f,
+ 0.29452514648437500000f, 0.39749145507812500000f,
+ 0.44003295898437494000f, 0.52810668945312500000f,
+ 0.59494018554687500000f, 0.67718505859374989000f,
+ 0.74472045898437500000f, 0.80267333984375000000f,
+ 0.86044311523437500000f, 0.92092895507812500000f,
+ 0.05618286132812500000f, 0.07168579101562500000f,
+ 0.12109375000000000000f, 0.14538574218750000000f,
+ 0.19458007812500000000f, 0.29983520507812500000f,
+ 0.33715820312500000000f, 0.40725708007812500000f,
+ 0.44805908203125000000f, 0.49597167968750000000f,
+ 0.55490112304687500000f, 0.65194702148437500000f,
+ 0.72991943359375000000f, 0.79821777343750000000f,
+ 0.85543823242187500000f, 0.91354370117187500000f,
+ 0.04370117187500000000f, 0.06246948242187500000f,
+ 0.17184448242187500000f, 0.21139526367187500000f,
+ 0.25018310546875000000f, 0.29525756835937500000f,
+ 0.34661865234375000000f, 0.41217041015625000000f,
+ 0.45172119140625000000f, 0.50106811523437500000f,
+ 0.55966186523437500000f, 0.67196655273437500000f,
+ 0.73620605468750000000f, 0.79885864257812500000f,
+ 0.85845947265625000000f, 0.93341064453125000000f,
+ 0.05279541015625000700f, 0.07080078125000000000f,
+ 0.11425781250000000000f, 0.14672851562500000000f,
+ 0.18331909179687500000f, 0.29498291015625000000f,
+ 0.33560180664062500000f, 0.41571044921875000000f,
+ 0.46490478515625000000f, 0.53390502929687500000f,
+ 0.61303710937500000000f, 0.67144775390625000000f,
+ 0.72030639648437500000f, 0.77514648437500000000f,
+ 0.83554077148437489000f, 0.89276123046875000000f,
+ 0.03866577148437500000f, 0.05844116210937500000f,
+ 0.16732788085937503000f, 0.20788574218750000000f,
+ 0.25112915039062500000f, 0.30270385742187500000f,
+ 0.35366821289062494000f, 0.40701293945312500000f,
+ 0.45004272460937506000f, 0.54824829101562500000f,
+ 0.62719726562500000000f, 0.67648315429687500000f,
+ 0.74826049804687500000f, 0.81845092773437500000f,
+ 0.88143920898437500000f, 0.93511962890625000000f,
+ 0.04656982421875000000f, 0.06802368164062500000f,
+ 0.12939453125000000000f, 0.22546386718750000000f,
+ 0.27322387695312500000f, 0.31890869140625000000f,
+ 0.36312866210937500000f, 0.41864013671875006000f,
+ 0.51455688476562500000f, 0.55917358398437500000f,
+ 0.62191772460937500000f, 0.69189453125000000000f,
+ 0.75674438476562500000f, 0.82110595703125000000f,
+ 0.88214111328124989000f, 0.93450927734375000000f,
+ 0.06637573242187500000f, 0.08517456054687500000f,
+ 0.12524414062500000000f, 0.20980834960937500000f,
+ 0.26281738281250000000f, 0.29901123046875000000f,
+ 0.37084960937500000000f, 0.41308593750000000000f,
+ 0.47677612304687500000f, 0.53961181640625000000f,
+ 0.58633422851562500000f, 0.64270019531250000000f,
+ 0.74407958984375000000f, 0.81665039062499989000f,
+ 0.87380981445312500000f, 0.92309570312500000000f,
+ 0.01385498046875000000f, 0.03756713867187500000f,
+ 0.13241577148437500000f, 0.17510986328125000000f,
+ 0.23040771484375000000f, 0.27484130859375000000f,
+ 0.31494140625000000000f, 0.41275024414062506000f,
+ 0.48843383789062500000f, 0.54470825195312500000f,
+ 0.61251831054687500000f, 0.67114257812500000000f,
+ 0.73086547851562500000f, 0.79476928710937500000f,
+ 0.86196899414062511000f, 0.92086791992187489000f,
+ 0.06866455078125000000f, 0.08517456054687500000f,
+ 0.12908935546875000000f, 0.16122436523437500000f,
+ 0.20635986328125000000f, 0.32369995117187506000f,
+ 0.36251831054687500000f, 0.42178344726562500000f,
+ 0.48208618164062494000f, 0.52685546875000000000f,
+ 0.61123657226562500000f, 0.67950439453125000000f,
+ 0.75036621093750000000f, 0.80679321289062500000f,
+ 0.86193847656250000000f, 0.92831420898437489000f,
+ 0.05175781250000000000f, 0.06762695312500000000f,
+ 0.13146972656250000000f, 0.25588989257812500000f,
+ 0.29803466796875000000f, 0.33660888671875000000f,
+ 0.38317871093750000000f, 0.43026733398437500000f,
+ 0.49810791015625000000f, 0.53833007812500000000f,
+ 0.58489990234375000000f, 0.62835693359375000000f,
+ 0.73141479492187489000f, 0.81964111328125000000f,
+ 0.87884521484375000000f, 0.93267822265625000000f,
+ 0.07482910156250000000f, 0.09875488281250000000f,
+ 0.13333129882812500000f, 0.18670654296875000000f,
+ 0.21838378906250000000f, 0.27474975585937500000f,
+ 0.35122680664062500000f, 0.39050292968750000000f,
+ 0.48062133789062506000f, 0.52767944335937500000f,
+ 0.59481811523437500000f, 0.67874145507812500000f,
+ 0.74859619140625000000f, 0.80792236328125000000f,
+ 0.86282348632812489000f, 0.91775512695312511000f,
+ 0.05526733398437500000f, 0.07754516601562500000f,
+ 0.10848999023437500000f, 0.16723632812500000000f,
+ 0.27841186523437500000f, 0.32125854492187500000f,
+ 0.36297607421875000000f, 0.41683959960937500000f,
+ 0.46575927734374994000f, 0.51571655273437500000f,
+ 0.59100341796875000000f, 0.64297485351562511000f,
+ 0.69256591796875000000f, 0.74200439453125000000f,
+ 0.83178710937500000000f, 0.91500854492187500000f,
+ 0.04739379882812500000f, 0.06854248046875000000f,
+ 0.13912963867187500000f, 0.16784667968749997000f,
+ 0.20611572265625003000f, 0.24029541015625000000f,
+ 0.35824584960937500000f, 0.41415405273437500000f,
+ 0.46350097656250000000f, 0.54562377929687500000f,
+ 0.61892700195312500000f, 0.68695068359375000000f,
+ 0.75115966796875000000f, 0.81326293945312500000f,
+ 0.87847900390625000000f, 0.93856811523437500000f,
+ 0.06048583984375000000f, 0.08447265625000000000f,
+ 0.11700439453125001000f, 0.18200683593750000000f,
+ 0.26647949218750000000f, 0.30236816406250000000f,
+ 0.36001586914062500000f, 0.45205688476562500000f,
+ 0.49777221679687506000f, 0.54766845703125000000f,
+ 0.64382934570312500000f, 0.69735717773437500000f,
+ 0.74633789062500000000f, 0.80273437500000000000f,
+ 0.85955810546875000000f, 0.90805053710937511000f,
+ 0.05566406250000000000f, 0.07717895507812500000f,
+ 0.11648559570312500000f, 0.16629028320312500000f,
+ 0.20916748046875003000f, 0.26593017578125000000f,
+ 0.31680297851562500000f, 0.37493896484375006000f,
+ 0.43316650390625000000f, 0.48138427734375000000f,
+ 0.59582519531250000000f, 0.65228271484375000000f,
+ 0.72311401367187500000f, 0.79556274414062500000f,
+ 0.85742187500000000000f, 0.92199707031250011000f,
+ 0.06750488281250000000f, 0.08709716796875001400f,
+ 0.12045288085937500000f, 0.17999267578125000000f,
+ 0.30303955078125000000f, 0.35266113281250000000f,
+ 0.39227294921875000000f, 0.45129394531249994000f,
+ 0.49829101562500006000f, 0.54016113281250000000f,
+ 0.62014770507812500000f, 0.67437744140625000000f,
+ 0.72241210937500011000f, 0.77182006835937500000f,
+ 0.82324218750000011000f, 0.87237548828125000000f,
+ 0.06173706054687500000f, 0.07931518554687500000f,
+ 0.12280273437500000000f, 0.15002441406250000000f,
+ 0.20181274414062500000f, 0.34024047851562494000f,
+ 0.38015747070312500000f, 0.44635009765625000000f,
+ 0.49804687500000000000f, 0.54388427734375000000f,
+ 0.60037231445312500000f, 0.64611816406250000000f,
+ 0.70541381835937500000f, 0.79501342773437500000f,
+ 0.87966918945312500000f, 0.93865966796875000000f,
+ 0.04968261718750000700f, 0.06732177734375000000f,
+ 0.10580444335937500000f, 0.13317871093750000000f,
+ 0.26486206054687500000f, 0.31045532226562500000f,
+ 0.36206054687500000000f, 0.41744995117187500000f,
+ 0.45770263671874994000f, 0.51690673828125000000f,
+ 0.58615112304687500000f, 0.65197753906249989000f,
+ 0.72784423828125000000f, 0.79696655273437500000f,
+ 0.85827636718750000000f, 0.92385864257812500000f,
+ 0.06146240234375000000f, 0.07943725585937500000f,
+ 0.12554931640625000000f, 0.22137451171875000000f,
+ 0.25988769531250000000f, 0.30648803710937500000f,
+ 0.36077880859375000000f, 0.41207885742187500000f,
+ 0.49832153320312500000f, 0.54400634765625000000f,
+ 0.60110473632812500000f, 0.64941406250000000000f,
+ 0.70651245117187500000f, 0.75259399414062500000f,
+ 0.81808471679687500000f, 0.92044067382812511000f,
+ 0.07250976562500000000f, 0.09094238281250000000f,
+ 0.13494873046875000000f, 0.17608642578125000000f,
+ 0.21411132812500000000f, 0.29672241210937500000f,
+ 0.33950805664062506000f, 0.41247558593750000000f,
+ 0.47256469726562506000f, 0.51834106445312500000f,
+ 0.58471679687500000000f, 0.62826538085937500000f,
+ 0.74465942382812500000f, 0.82946777343750000000f,
+ 0.88641357421875000000f, 0.93527221679687500000f,
+ 0.07489013671875000000f, 0.10687255859375000000f,
+ 0.14111328125000000000f, 0.18368530273437500000f,
+ 0.23291015625000000000f, 0.27005004882812500000f,
+ 0.32934570312500000000f, 0.42614746093750000000f,
+ 0.47372436523437500000f, 0.52139282226562500000f,
+ 0.59848022460937500000f, 0.64813232421875000000f,
+ 0.69750976562500000000f, 0.76623535156249989000f,
+ 0.85772705078125011000f, 0.91217041015625000000f,
+ 0.04800415039062500700f, 0.06939697265625000000f,
+ 0.10095214843750000000f, 0.18307495117187500000f,
+ 0.27395629882812500000f, 0.30834960937500000000f,
+ 0.38015747070312500000f, 0.43511962890625000000f,
+ 0.48062133789062506000f, 0.55480957031250000000f,
+ 0.60955810546875000000f, 0.64859008789062500000f,
+ 0.70327758789062500000f, 0.76470947265625000000f,
+ 0.84658813476562500000f, 0.92514038085937500000f,
+ 0.05929565429687500000f, 0.08331298828125000000f,
+ 0.12634277343750000000f, 0.18798828125000003000f,
+ 0.22860717773437500000f, 0.27423095703125000000f,
+ 0.34512329101562500000f, 0.38986206054687500000f,
+ 0.45227050781250000000f, 0.50531005859375000000f,
+ 0.54653930664062500000f, 0.60293579101562500000f,
+ 0.65649414062500011000f, 0.72036743164062500000f,
+ 0.83233642578124989000f, 0.90109252929687500000f,
+ 0.06167602539062500000f, 0.07879638671875000000f,
+ 0.13714599609375000000f, 0.17807006835937503000f,
+ 0.21340942382812497000f, 0.25161743164062500000f,
+ 0.29989624023437500000f, 0.44961547851562500000f,
+ 0.50238037109375000000f, 0.54608154296875000000f,
+ 0.59957885742187500000f, 0.64340209960937489000f,
+ 0.72521972656250000000f, 0.81381225585937500000f,
+ 0.88720703125000000000f, 0.94573974609375000000f,
+ 0.03210449218750000000f, 0.05416870117187500000f,
+ 0.09820556640624998600f, 0.13360595703125000000f,
+ 0.23394775390625000000f, 0.28695678710937500000f,
+ 0.34326171875000000000f, 0.40670776367187500000f,
+ 0.45690917968750000000f, 0.54815673828125000000f,
+ 0.63348388671875000000f, 0.68218994140625000000f,
+ 0.76510620117187500000f, 0.83035278320312511000f,
+ 0.88504028320312500000f, 0.93411254882812489000f,
+ 0.06768798828125000000f, 0.08746337890624998600f,
+ 0.12887573242187500000f, 0.16333007812500000000f,
+ 0.20083618164062500000f, 0.30456542968750000000f,
+ 0.35360717773437500000f, 0.40042114257812500000f,
+ 0.46365356445312500000f, 0.50607299804687500000f,
+ 0.56109619140625000000f, 0.61279296875000000000f,
+ 0.67178344726562500000f, 0.77261352539062500000f,
+ 0.85836791992187500000f, 0.91186523437500011000f,
+ 0.06549072265625000000f, 0.08666992187500000000f,
+ 0.13418579101562500000f, 0.17822265625000000000f,
+ 0.22732543945312500000f, 0.26614379882812500000f,
+ 0.32080078125000000000f, 0.36425781250000000000f,
+ 0.41488647460937500000f, 0.52651977539062500000f,
+ 0.58929443359375000000f, 0.63754272460937500000f,
+ 0.71463012695312500000f, 0.78207397460937500000f,
+ 0.84683227539062500000f, 0.92257690429687500000f,
+ 0.06018066406250000000f, 0.07992553710937500000f,
+ 0.11462402343750000000f, 0.19430541992187500000f,
+ 0.23318481445312503000f, 0.26898193359375000000f,
+ 0.37493896484375006000f, 0.42016601562500000000f,
+ 0.46719360351562506000f, 0.55041503906250000000f,
+ 0.59683227539062500000f, 0.63793945312500000000f,
+ 0.68914794921875011000f, 0.75915527343750000000f,
+ 0.84838867187500000000f, 0.92895507812500000000f,
+ 0.06118774414062500000f, 0.07864379882812500000f,
+ 0.13037109375000000000f, 0.22500610351562500000f,
+ 0.26116943359375000000f, 0.31198120117187500000f,
+ 0.35919189453125000000f, 0.40899658203125000000f,
+ 0.50360107421875000000f, 0.54931640625000000000f,
+ 0.59951782226562500000f, 0.64404296875000000000f,
+ 0.70159912109375000000f, 0.81805419921875000000f,
+ 0.90042114257812489000f, 0.94427490234375000000f,
+ 0.03518676757812500000f, 0.05560302734375000000f,
+ 0.11364746093750001000f, 0.16610717773437500000f,
+ 0.21331787109375000000f, 0.26556396484375000000f,
+ 0.31399536132812500000f, 0.36312866210937500000f,
+ 0.42285156250000000000f, 0.46737670898437500000f,
+ 0.53713989257812500000f, 0.64282226562500000000f,
+ 0.72302246093750011000f, 0.79598999023437500000f,
+ 0.87237548828125000000f, 0.93502807617187500000f,
+ 0.03979492187500000000f, 0.05703735351562500000f,
+ 0.10125732421875000000f, 0.21957397460937500000f,
+ 0.29336547851562500000f, 0.32754516601562500000f,
+ 0.37820434570312500000f, 0.41894531250000000000f,
+ 0.48284912109375000000f, 0.53326416015625000000f,
+ 0.57623291015625000000f, 0.63146972656250000000f,
+ 0.70538330078125000000f, 0.77941894531250000000f,
+ 0.84484863281250000000f, 0.89245605468750011000f,
+ 0.06387329101562500000f, 0.08212280273437500000f,
+ 0.12261962890625000000f, 0.20318603515625000000f,
+ 0.24252319335937500000f, 0.27914428710937500000f,
+ 0.32034301757812500000f, 0.36257934570312500000f,
+ 0.48486328125000006000f, 0.54385375976562500000f,
+ 0.58999633789062500000f, 0.64797973632812500000f,
+ 0.71322631835937489000f, 0.77008056640625000000f,
+ 0.84085083007812500000f, 0.91546630859375000000f,
+ 0.01754760742187500000f, 0.04061889648437499300f,
+ 0.16186523437500000000f, 0.21087646484374997000f,
+ 0.25711059570312500000f, 0.30780029296875000000f,
+ 0.35330200195312500000f, 0.41192626953125006000f,
+ 0.50183105468750000000f, 0.56539916992187500000f,
+ 0.62759399414062500000f, 0.69723510742187500000f,
+ 0.76031494140625000000f, 0.81457519531249989000f,
+ 0.87765502929687500000f, 0.92031860351562500000f,
+ 0.04379272460937500000f, 0.06176757812500000000f,
+ 0.10018920898437500000f, 0.12683105468750000000f,
+ 0.23226928710937500000f, 0.32324218750000000000f,
+ 0.36770629882812506000f, 0.42501831054687500000f,
+ 0.47177124023437500000f, 0.56192016601562500000f,
+ 0.62545776367187500000f, 0.67962646484375000000f,
+ 0.73919677734375000000f, 0.79629516601562489000f,
+ 0.85647583007812500000f, 0.91854858398437500000f,
+ 0.04980468750000000000f, 0.06616210937500000000f,
+ 0.16906738281250000000f, 0.22821044921875000000f,
+ 0.26336669921875000000f, 0.31710815429687500000f,
+ 0.35534667968750000000f, 0.43704223632812494000f,
+ 0.48037719726562500000f, 0.52969360351562500000f,
+ 0.57238769531250000000f, 0.62359619140625000000f,
+ 0.69577026367187500000f, 0.79528808593750000000f,
+ 0.87103271484375000000f, 0.93676757812500000000f,
+ 0.04293823242187500000f, 0.06851196289062500000f,
+ 0.10391235351562501000f, 0.17208862304687500000f,
+ 0.28744506835937500000f, 0.32608032226562506000f,
+ 0.36938476562500000000f, 0.41183471679687494000f,
+ 0.47409057617187500000f, 0.56021118164062500000f,
+ 0.61022949218750000000f, 0.66189575195312500000f,
+ 0.74313354492187500000f, 0.81024169921874989000f,
+ 0.88052368164062500000f, 0.93273925781250011000f,
+ 0.05111694335937500700f, 0.06793212890625000000f,
+ 0.12222290039062501000f, 0.25094604492187500000f,
+ 0.30441284179687500000f, 0.34042358398437500000f,
+ 0.39129638671875000000f, 0.43688964843750000000f,
+ 0.50366210937500000000f, 0.55349731445312500000f,
+ 0.59735107421875000000f, 0.64239501953125000000f,
+ 0.69454956054687500000f, 0.76025390625000000000f,
+ 0.86352539062500011000f, 0.93487548828125000000f,
+ 0.03295898437500000000f, 0.04925537109375000000f,
+ 0.11053466796875000000f, 0.23086547851562497000f,
+ 0.26696777343750000000f, 0.31442260742187500000f,
+ 0.35745239257812500000f, 0.42260742187500000000f,
+ 0.47708129882812500000f, 0.53204345703125000000f,
+ 0.60305786132812500000f, 0.66604614257812500000f,
+ 0.71932983398437500000f, 0.77493286132812500000f,
+ 0.83636474609375000000f, 0.88693237304687500000f,
+ 0.05166625976562500000f, 0.06802368164062500000f,
+ 0.10546875000000000000f, 0.13287353515625000000f,
+ 0.17303466796875000000f, 0.33233642578125000000f,
+ 0.38339233398437500000f, 0.43234252929687500000f,
+ 0.48458862304687500000f, 0.53030395507812500000f,
+ 0.60476684570312500000f, 0.67050170898437500000f,
+ 0.73529052734375000000f, 0.79745483398437500000f,
+ 0.86358642578125000000f, 0.91854858398437500000f,
+ 0.06231689453125000000f, 0.09030151367187501400f,
+ 0.12802124023437500000f, 0.17517089843750000000f,
+ 0.21685791015625000000f, 0.25228881835937500000f,
+ 0.33953857421875000000f, 0.45693969726562500000f,
+ 0.51617431640625000000f, 0.55831909179687500000f,
+ 0.62658691406250000000f, 0.67083740234375000000f,
+ 0.72360229492187500000f, 0.78640747070312500000f,
+ 0.84255981445312511000f, 0.89572143554687500000f,
+ 0.03002929687500000000f, 0.04919433593750000000f,
+ 0.11621093750000000000f, 0.16067504882812500000f,
+ 0.21011352539062500000f, 0.25668334960937500000f,
+ 0.29135131835937500000f, 0.33230590820312500000f,
+ 0.38214111328125000000f, 0.50415039062500000000f,
+ 0.59658813476562500000f, 0.66036987304687500000f,
+ 0.72467041015625011000f, 0.79522705078125000000f,
+ 0.86395263671874989000f, 0.92694091796875011000f,
+ 0.06213378906250000000f, 0.07745361328125000000f,
+ 0.12713623046875000000f, 0.23684692382812500000f,
+ 0.27911376953125000000f, 0.31774902343750000000f,
+ 0.37060546875000006000f, 0.41531372070312500000f,
+ 0.47570800781250000000f, 0.52395629882812500000f,
+ 0.56637573242187500000f, 0.61380004882812500000f,
+ 0.66589355468750000000f, 0.74197387695312500000f,
+ 0.85537719726562489000f, 0.93420410156249989000f,
+ 0.05709838867187500000f, 0.07186889648437500000f,
+ 0.12393188476562500000f, 0.15695190429687500000f,
+ 0.22778320312500000000f, 0.30911254882812500000f,
+ 0.36441040039062506000f, 0.45779418945312506000f,
+ 0.50903320312500000000f, 0.56011962890625000000f,
+ 0.60903930664062500000f, 0.67990112304687500000f,
+ 0.75869750976562489000f, 0.82006835937500000000f,
+ 0.88464355468750000000f, 0.93429565429687511000f,
+ 0.07830810546875000000f, 0.09646606445312500000f,
+ 0.14169311523437500000f, 0.19003295898437500000f,
+ 0.22601318359375000000f, 0.30426025390625000000f,
+ 0.35455322265625000000f, 0.40942382812500000000f,
+ 0.48489379882812500000f, 0.52990722656250000000f,
+ 0.58352661132812500000f, 0.63528442382812500000f,
+ 0.68945312500000000000f, 0.75439453125000000000f,
+ 0.87686157226562489000f, 0.94854736328125000000f,
+ 0.05187988281249999300f, 0.07101440429687500000f,
+ 0.14733886718750000000f, 0.18124389648437500000f,
+ 0.23092651367187500000f, 0.27935791015625000000f,
+ 0.33834838867187500000f, 0.38973999023437500000f,
+ 0.43362426757812506000f, 0.49197387695312500000f,
+ 0.61712646484375000000f, 0.69186401367187500000f,
+ 0.75219726562500000000f, 0.81347656250000000000f,
+ 0.87573242187499989000f, 0.93826293945312500000f,
+ 0.09671020507812500000f, 0.11819458007812501000f,
+ 0.15399169921875000000f, 0.20959472656250000000f,
+ 0.24975585937500000000f, 0.28930664062500000000f,
+ 0.37643432617187500000f, 0.42932128906250000000f,
+ 0.48138427734375000000f, 0.54843139648437500000f,
+ 0.61740112304687500000f, 0.66256713867187500000f,
+ 0.71777343750000000000f, 0.77041625976562500000f,
+ 0.82476806640625000000f, 0.87677001953124989000f,
+ 0.04772949218750000000f, 0.07296752929687500000f,
+ 0.12905883789062500000f, 0.20538330078125000000f,
+ 0.27175903320312500000f, 0.31918334960937500000f,
+ 0.39752197265625000000f, 0.45877075195312500000f,
+ 0.52688598632812500000f, 0.60452270507812500000f,
+ 0.66677856445312500000f, 0.72451782226562500000f,
+ 0.77789306640625000000f, 0.83349609375000000000f,
+ 0.88687133789062500000f, 0.93161010742187511000f,
+ 0.08740234375000000000f, 0.10861206054687501000f,
+ 0.14401245117187500000f, 0.19656372070312503000f,
+ 0.29272460937500000000f, 0.33737182617187500000f,
+ 0.38949584960937500000f, 0.45117187500000000000f,
+ 0.50134277343750000000f, 0.55432128906250000000f,
+ 0.62518310546875000000f, 0.67938232421875000000f,
+ 0.73800659179687511000f, 0.80148315429687500000f,
+ 0.86618041992187500000f, 0.92236328125000000000f,
+ 0.08157348632812498600f, 0.10525512695312501000f,
+ 0.13980102539062500000f, 0.18258666992187500000f,
+ 0.20944213867187500000f, 0.25363159179687500000f,
+ 0.38037109375000000000f, 0.42453002929687506000f,
+ 0.48028564453125000000f, 0.54293823242187500000f,
+ 0.59252929687500000000f, 0.64642333984375000000f,
+ 0.73318481445312500000f, 0.81057739257812500000f,
+ 0.87655639648437500000f, 0.92895507812500000000f,
+ 0.07382202148437500000f, 0.09304809570312500000f,
+ 0.13043212890625000000f, 0.19482421875000000000f,
+ 0.26135253906250000000f, 0.29483032226562500000f,
+ 0.34448242187499994000f, 0.38684082031250000000f,
+ 0.44088745117187500000f, 0.53643798828125000000f,
+ 0.60473632812500000000f, 0.64791870117187511000f,
+ 0.70492553710937500000f, 0.77117919921874989000f,
+ 0.82089233398437500000f, 0.88275146484374989000f,
+ 0.03900146484375000000f, 0.06106567382812500000f,
+ 0.09155273437500000000f, 0.16336059570312500000f,
+ 0.30502319335937500000f, 0.35940551757812500000f,
+ 0.39727783203125000000f, 0.44464111328125000000f,
+ 0.48980712890625000000f, 0.54205322265625000000f,
+ 0.60980224609375000000f, 0.65969848632812511000f,
+ 0.71322631835937489000f, 0.76547241210937500000f,
+ 0.84399414062500000000f, 0.92077636718749989000f,
+ 0.02844238281250000000f, 0.04956054687500000000f,
+ 0.08538818359375000000f, 0.13946533203125000000f,
+ 0.26220703125000000000f, 0.30480957031250000000f,
+ 0.35253906249999994000f, 0.39825439453125000000f,
+ 0.51638793945312500000f, 0.56997680664062500000f,
+ 0.62301635742187500000f, 0.69610595703125000000f,
+ 0.75735473632812500000f, 0.81845092773437500000f,
+ 0.87902832031250011000f, 0.92727661132812489000f,
+ 0.07092285156250000000f, 0.09072875976562500000f,
+ 0.12683105468750000000f, 0.17401123046875000000f,
+ 0.21115112304687500000f, 0.26873779296875000000f,
+ 0.31307983398437500000f, 0.38156127929687494000f,
+ 0.45822143554687494000f, 0.50558471679687500000f,
+ 0.59259033203125000000f, 0.65231323242187500000f,
+ 0.70016479492187500000f, 0.74920654296875000000f,
+ 0.82470703124999989000f, 0.91091918945312500000f,
+ 0.04772949218750000000f, 0.07241821289062500000f,
+ 0.10543823242187499000f, 0.14974975585937500000f,
+ 0.18234252929687500000f, 0.22692871093750000000f,
+ 0.35968017578125000000f, 0.44265747070312500000f,
+ 0.49154663085937500000f, 0.55383300781250000000f,
+ 0.61093139648437500000f, 0.66079711914062500000f,
+ 0.72448730468749989000f, 0.78778076171875000000f,
+ 0.87213134765625000000f, 0.92687988281250000000f,
+ 0.09231567382812501400f, 0.11380004882812500000f,
+ 0.14849853515625000000f, 0.19897460937500000000f,
+ 0.28952026367187500000f, 0.33395385742187500000f,
+ 0.37713623046875000000f, 0.43511962890625000000f,
+ 0.49359130859375000000f, 0.53408813476562500000f,
+ 0.59436035156250000000f, 0.65332031250000000000f,
+ 0.70883178710937500000f, 0.76007080078125000000f,
+ 0.83456420898437500000f, 0.89743041992187500000f,
+ 0.03875732421875000000f, 0.05996704101562500000f,
+ 0.20758056640625000000f, 0.24398803710937500000f,
+ 0.28088378906250000000f, 0.33044433593750000000f,
+ 0.38168334960937500000f, 0.43426513671875000000f,
+ 0.48092651367187500000f, 0.54504394531250000000f,
+ 0.62161254882812500000f, 0.68670654296875000000f,
+ 0.75173950195312500000f, 0.80914306640625000000f,
+ 0.87081909179687500000f, 0.93154907226562500000f,
+ 0.06744384765625000000f, 0.08389282226562500000f,
+ 0.13018798828125000000f, 0.22848510742187503000f,
+ 0.30145263671875000000f, 0.33624267578125000000f,
+ 0.39132690429687500000f, 0.44039916992187500000f,
+ 0.49581909179687494000f, 0.56842041015625000000f,
+ 0.62408447265625000000f, 0.67303466796875011000f,
+ 0.72445678710937500000f, 0.77182006835937500000f,
+ 0.82623291015625000000f, 0.89016723632812500000f,
+ 0.03890991210937500000f, 0.05877685546875000000f,
+ 0.13214111328125000000f, 0.20059204101562503000f,
+ 0.25759887695312500000f, 0.33325195312500000000f,
+ 0.40466308593750000000f, 0.45800781249999994000f,
+ 0.51657104492187500000f, 0.56680297851562500000f,
+ 0.63000488281250000000f, 0.67800903320312500000f,
+ 0.73190307617187500000f, 0.77740478515625000000f,
+ 0.83532714843750000000f, 0.87417602539062489000f,
+ 0.09201049804687500000f, 0.11199951171875000000f,
+ 0.15521240234375000000f, 0.19445800781250000000f,
+ 0.24072265625000000000f, 0.28408813476562500000f,
+ 0.33465576171875006000f, 0.38580322265624994000f,
+ 0.44235229492187500000f, 0.49353027343750000000f,
+ 0.55175781250000000000f, 0.60949707031250000000f,
+ 0.68524169921874989000f, 0.75985717773437500000f,
+ 0.83502197265624989000f, 0.91476440429687500000f,
+ 0.08795166015625001400f, 0.11392211914062500000f,
+ 0.15603637695312500000f, 0.19781494140625000000f,
+ 0.24795532226562503000f, 0.29556274414062500000f,
+ 0.35394287109375000000f, 0.40551757812500006000f,
+ 0.47012329101562500000f, 0.52465820312500000000f,
+ 0.61578369140625000000f, 0.68438720703125011000f,
+ 0.75686645507812500000f, 0.82440185546875000000f,
+ 0.89147949218750000000f, 0.94027709960937511000f,
+ 0.07019042968750000000f, 0.09057617187500000000f,
+ 0.12515258789062500000f, 0.16607666015625000000f,
+ 0.19308471679687500000f, 0.24139404296875000000f,
+ 0.38009643554687500000f, 0.42303466796875000000f,
+ 0.48056030273437500000f, 0.53421020507812500000f,
+ 0.58145141601562500000f, 0.63107299804687500000f,
+ 0.69015502929687500000f, 0.75250244140625000000f,
+ 0.83920288085937500000f, 0.91751098632812500000f,
+ 0.06887817382812500000f, 0.08972167968750000000f,
+ 0.13519287109375000000f, 0.18283081054687497000f,
+ 0.21490478515624997000f, 0.25524902343750000000f,
+ 0.28729248046875000000f, 0.34252929687500000000f,
+ 0.47982788085937500000f, 0.53161621093750000000f,
+ 0.58755493164062500000f, 0.65518188476562489000f,
+ 0.72982788085937500000f, 0.79507446289062500000f,
+ 0.86761474609375000000f, 0.92724609375000000000f,
+ 0.03744506835937500000f, 0.06240844726562500000f,
+ 0.11651611328124999000f, 0.15292358398437500000f,
+ 0.21331787109375000000f, 0.28170776367187500000f,
+ 0.33642578124999994000f, 0.39706420898437494000f,
+ 0.52920532226562500000f, 0.58035278320312500000f,
+ 0.62814331054687500000f, 0.69577026367187500000f,
+ 0.76889038085937500000f, 0.82019042968750000000f,
+ 0.89572143554687500000f, 0.94009399414062489000f,
+ 0.04132080078125000000f, 0.05871582031250000000f,
+ 0.11563110351562500000f, 0.24649047851562500000f,
+ 0.31900024414062500000f, 0.35519409179687500000f,
+ 0.40747070312500000000f, 0.45217895507812500000f,
+ 0.51095581054687500000f, 0.55508422851562500000f,
+ 0.61325073242187500000f, 0.67181396484374989000f,
+ 0.75051879882812500000f, 0.81411743164062500000f,
+ 0.87423706054687500000f, 0.92333984375000000000f,
+ 0.09588623046875000000f, 0.12356567382812501000f,
+ 0.18911743164062500000f, 0.22634887695312500000f,
+ 0.26712036132812500000f, 0.30993652343750000000f,
+ 0.35195922851562500000f, 0.40225219726562500000f,
+ 0.48666381835937500000f, 0.53878784179687500000f,
+ 0.59832763671875000000f, 0.65313720703125000000f,
+ 0.71676635742187500000f, 0.78305053710937511000f,
+ 0.85824584960937511000f, 0.92480468750000000000f,
+ 0.04019165039062500700f, 0.06906127929687500000f,
+ 0.14419555664062500000f, 0.23226928710937500000f,
+ 0.29501342773437500000f, 0.35504150390625000000f,
+ 0.43161010742187500000f, 0.49615478515625000000f,
+ 0.57141113281250000000f, 0.63165283203125000000f,
+ 0.68295288085937500000f, 0.73263549804687511000f,
+ 0.78659057617187489000f, 0.83163452148437500000f,
+ 0.88287353515625000000f, 0.93362426757812500000f,
+ 0.04791259765625000000f, 0.07089233398437500000f,
+ 0.11651611328124999000f, 0.18966674804687500000f,
+ 0.30191040039062500000f, 0.35266113281250000000f,
+ 0.39886474609375000000f, 0.44650268554687500000f,
+ 0.49291992187500006000f, 0.55816650390625000000f,
+ 0.65264892578125000000f, 0.71246337890625000000f,
+ 0.76641845703125011000f, 0.82162475585937500000f,
+ 0.87622070312500000000f, 0.92065429687500000000f,
+ 0.07009887695312500000f, 0.11917114257812500000f,
+ 0.19186401367187503000f, 0.26116943359375000000f,
+ 0.32556152343750006000f, 0.38958740234375000000f,
+ 0.45834350585937500000f, 0.52191162109375000000f,
+ 0.58093261718750000000f, 0.63101196289062500000f,
+ 0.68179321289062500000f, 0.72848510742187500000f,
+ 0.77752685546875000000f, 0.82656860351562500000f,
+ 0.88046264648437500000f, 0.93139648437500000000f,
+ 0.05844116210937500000f, 0.07650756835937500000f,
+ 0.12307739257812499000f, 0.17544555664062500000f,
+ 0.21542358398437497000f, 0.27072143554687500000f,
+ 0.32528686523437500000f, 0.37225341796875006000f,
+ 0.42532348632812500000f, 0.46945190429687500000f,
+ 0.51480102539062500000f, 0.57089233398437500000f,
+ 0.70724487304687489000f, 0.78790283203125011000f,
+ 0.87017822265625000000f, 0.93081665039062500000f,
+ 0.07336425781250000000f, 0.08905029296875000000f,
+ 0.15838623046875000000f, 0.19079589843750000000f,
+ 0.22662353515625003000f, 0.30172729492187500000f,
+ 0.37802124023437500000f, 0.45150756835937494000f,
+ 0.51129150390625000000f, 0.56054687500000000000f,
+ 0.62066650390625000000f, 0.67147827148437511000f,
+ 0.73962402343750000000f, 0.80737304687500000000f,
+ 0.86944580078125000000f, 0.92764282226562500000f,
+ 0.04946899414062500000f, 0.06796264648437500000f,
+ 0.10617065429687500000f, 0.15518188476562500000f,
+ 0.28762817382812500000f, 0.39343261718750006000f,
+ 0.43475341796875006000f, 0.47766113281250000000f,
+ 0.52505493164062500000f, 0.56988525390625000000f,
+ 0.62396240234375000000f, 0.67776489257812500000f,
+ 0.72564697265625000000f, 0.78939819335937500000f,
+ 0.85238647460937500000f, 0.91836547851562500000f,
+ 0.05703735351562500000f, 0.07293701171875000000f,
+ 0.12527465820312500000f, 0.21426391601562500000f,
+ 0.34243774414062500000f, 0.38986206054687500000f,
+ 0.42904663085937500000f, 0.47576904296875006000f,
+ 0.51953125000000000000f, 0.56787109375000000000f,
+ 0.62850952148437500000f, 0.67367553710937500000f,
+ 0.72171020507812489000f, 0.76763916015625000000f,
+ 0.82135009765625000000f, 0.87496948242187500000f,
+ 0.07785034179687500000f, 0.09924316406250000000f,
+ 0.14306640625000000000f, 0.20025634765625000000f,
+ 0.24014282226562500000f, 0.27847290039062500000f,
+ 0.31967163085937506000f, 0.36010742187500000000f,
+ 0.47003173828125000000f, 0.57312011718750000000f,
+ 0.64062500000000000000f, 0.68832397460937500000f,
+ 0.74124145507812500000f, 0.79248046874999989000f,
+ 0.83816528320312500000f, 0.89208984375000000000f,
+ 0.08255004882812500000f, 0.10659790039062501000f,
+ 0.14450073242187500000f, 0.19409179687500000000f,
+ 0.24124145507812503000f, 0.28540039062500000000f,
+ 0.35211181640625006000f, 0.40985107421875000000f,
+ 0.46505737304687500000f, 0.51632690429687500000f,
+ 0.56820678710937500000f, 0.61322021484375000000f,
+ 0.66528320312500000000f, 0.71234130859375000000f,
+ 0.76904296875000000000f, 0.89285278320312500000f,
+ 0.06610107421875000000f, 0.08517456054687500000f,
+ 0.12240600585937499000f, 0.15505981445312500000f,
+ 0.17993164062500003000f, 0.27581787109375000000f,
+ 0.40914916992187494000f, 0.44869995117187506000f,
+ 0.50485229492187500000f, 0.55508422851562500000f,
+ 0.60717773437500000000f, 0.66702270507812500000f,
+ 0.75903320312500000000f, 0.82308959960937500000f,
+ 0.88363647460937500000f, 0.93121337890625000000f,
+ 0.05691528320312499300f, 0.09219360351562500000f,
+ 0.14331054687500000000f, 0.19940185546875003000f,
+ 0.25460815429687500000f, 0.30255126953125000000f,
+ 0.39028930664062500000f, 0.43038940429687500000f,
+ 0.50454711914062500000f, 0.54104614257812500000f,
+ 0.65124511718750000000f, 0.68478393554687500000f,
+ 0.75906372070312500000f, 0.80352783203125000000f,
+ 0.86755371093750000000f, 0.92022705078125000000f,
+ 0.10281372070312500000f, 0.13259887695312500000f,
+ 0.20059204101562503000f, 0.26742553710937500000f,
+ 0.31460571289062500000f, 0.35745239257812500000f,
+ 0.40792846679687500000f, 0.45117187500000000000f,
+ 0.50302124023437500000f, 0.55374145507812500000f,
+ 0.60543823242187500000f, 0.64840698242187500000f,
+ 0.71081542968750000000f, 0.77749633789062489000f,
+ 0.84091186523437489000f, 0.89865112304687500000f,
+ 0.03860473632812500000f, 0.06665039062500000000f,
+ 0.16610717773437500000f, 0.24087524414062500000f,
+ 0.32321166992187500000f, 0.40097045898437506000f,
+ 0.46096801757812500000f, 0.50778198242187500000f,
+ 0.56158447265625000000f, 0.60504150390625000000f,
+ 0.65365600585937500000f, 0.70175170898437500000f,
+ 0.75436401367187500000f, 0.80679321289062500000f,
+ 0.86557006835937500000f, 0.91934204101562500000f,
+ 0.04833984375000000700f, 0.06115722656250000000f,
+ 0.10787963867187500000f, 0.13580322265625000000f,
+ 0.26434326171875000000f, 0.32849121093750000000f,
+ 0.39160156250000000000f, 0.45709228515625000000f,
+ 0.51794433593750000000f, 0.57354736328125000000f,
+ 0.63879394531250000000f, 0.68807983398437500000f,
+ 0.75183105468750000000f, 0.80935668945312500000f,
+ 0.87588500976562500000f, 0.93283081054687511000f,
+ 0.10433959960937500000f, 0.13818359375000000000f,
+ 0.20147705078124997000f, 0.24078369140624997000f,
+ 0.29016113281250000000f, 0.33187866210937494000f,
+ 0.38973999023437500000f, 0.43814086914062500000f,
+ 0.48983764648437500000f, 0.55938720703125000000f,
+ 0.62957763671875000000f, 0.68634033203125000000f,
+ 0.76507568359375000000f, 0.82202148437499989000f,
+ 0.88336181640625011000f, 0.93206787109375000000f,
+ 0.05267333984375000000f, 0.06872558593750000000f,
+ 0.14028930664062500000f, 0.21209716796875000000f,
+ 0.25570678710937500000f, 0.29977416992187500000f,
+ 0.34677124023437500000f, 0.39044189453125006000f,
+ 0.43658447265625000000f, 0.47229003906250000000f,
+ 0.51263427734375000000f, 0.54986572265625000000f,
+ 0.66134643554687511000f, 0.77972412109375000000f,
+ 0.85900878906249989000f, 0.92672729492187500000f,
+ 0.10330200195312500000f, 0.11810302734375000000f,
+ 0.16195678710937503000f, 0.19494628906250000000f,
+ 0.21792602539062500000f, 0.26501464843750000000f,
+ 0.38742065429687500000f, 0.45590209960937500000f,
+ 0.50292968750000000000f, 0.55776977539062500000f,
+ 0.62673950195312500000f, 0.67285156249999989000f,
+ 0.73080444335937489000f, 0.79238891601562500000f,
+ 0.86102294921875000000f, 0.91418457031250000000f,
+ 0.08456420898437500000f, 0.10089111328124999000f,
+ 0.13580322265625000000f, 0.16967773437500000000f,
+ 0.19692993164062497000f, 0.28970336914062500000f,
+ 0.41345214843750000000f, 0.45025634765625006000f,
+ 0.51095581054687500000f, 0.56295776367187500000f,
+ 0.61120605468750000000f, 0.66333007812499989000f,
+ 0.72467041015625011000f, 0.77371215820312500000f,
+ 0.82827758789062500000f, 0.88702392578125000000f,
+ 0.09240722656250000000f, 0.11901855468750001000f,
+ 0.20193481445312503000f, 0.24087524414062500000f,
+ 0.28109741210937500000f, 0.31982421875000000000f,
+ 0.36764526367187500000f, 0.41452026367187494000f,
+ 0.46331787109375000000f, 0.50848388671875000000f,
+ 0.56463623046875000000f, 0.61315917968750000000f,
+ 0.67718505859374989000f, 0.74334716796875000000f,
+ 0.80267333984375000000f, 0.88369750976562489000f,
+ 0.06103515624999999300f, 0.07781982421875000000f,
+ 0.12411499023437500000f, 0.20864868164062503000f,
+ 0.29382324218750000000f, 0.33575439453125000000f,
+ 0.38433837890625006000f, 0.43023681640625000000f,
+ 0.47573852539062500000f, 0.52474975585937500000f,
+ 0.57003784179687500000f, 0.61337280273437500000f,
+ 0.65704345703125000000f, 0.70449829101562500000f,
+ 0.75198364257812500000f, 0.88568115234375000000f,
+ 0.08679199218749998600f, 0.10076904296875000000f,
+ 0.15573120117187500000f, 0.18637084960937500000f,
+ 0.21090698242187500000f, 0.26239013671875000000f,
+ 0.37890625000000000000f, 0.42889404296875000000f,
+ 0.48907470703125000000f, 0.56661987304687500000f,
+ 0.63085937500000000000f, 0.67962646484375000000f,
+ 0.73095703125000000000f, 0.78646850585937500000f,
+ 0.84405517578125000000f, 0.91632080078125000000f,
+ 0.12338256835937500000f, 0.15716552734375000000f,
+ 0.22180175781250000000f, 0.27636718750000000000f,
+ 0.33312988281250000000f, 0.38568115234375006000f,
+ 0.44381713867187500000f, 0.49389648437500000000f,
+ 0.54772949218750000000f, 0.60092163085937500000f,
+ 0.65176391601562500000f, 0.70132446289062500000f,
+ 0.75759887695312500000f, 0.81149291992187500000f,
+ 0.86911010742187500000f, 0.92263793945312500000f,
+ 0.06436157226562500000f, 0.08010864257812500000f,
+ 0.13183593750000000000f, 0.16860961914062500000f,
+ 0.22747802734375000000f, 0.31188964843750000000f,
+ 0.39611816406250006000f, 0.44854736328125000000f,
+ 0.53793334960937500000f, 0.58786010742187500000f,
+ 0.62515258789062500000f, 0.68301391601562500000f,
+ 0.74093627929687500000f, 0.78665161132812500000f,
+ 0.84982299804687500000f, 0.92950439453125000000f,
+ 0.04730224609375000000f, 0.08139038085937501400f,
+ 0.19754028320312500000f, 0.28979492187500000000f,
+ 0.33523559570312500000f, 0.37695312500000000000f,
+ 0.42098999023437500000f, 0.46487426757812500000f,
+ 0.52182006835937500000f, 0.56890869140625000000f,
+ 0.62442016601562500000f, 0.67492675781250000000f,
+ 0.73843383789062489000f, 0.80233764648437500000f,
+ 0.86679077148437500000f, 0.91955566406250000000f,
+ 0.07357788085937500000f, 0.09411621093750000000f,
+ 0.12649536132812500000f, 0.16461181640625000000f,
+ 0.19430541992187500000f, 0.24884033203124997000f,
+ 0.40054321289062500000f, 0.48977661132812500000f,
+ 0.53591918945312500000f, 0.58364868164062500000f,
+ 0.64874267578125000000f, 0.69464111328125000000f,
+ 0.74642944335937500000f, 0.80313110351562500000f,
+ 0.86227416992187500000f, 0.90643310546875000000f,
+ 0.12692260742187500000f, 0.13781738281250000000f,
+ 0.18176269531250000000f, 0.23300170898437500000f,
+ 0.25189208984375000000f, 0.27404785156250000000f,
+ 0.34204101562500000000f, 0.43130493164062500000f,
+ 0.49468994140624994000f, 0.54550170898437500000f,
+ 0.61633300781250000000f, 0.66723632812500011000f,
+ 0.72753906250000000000f, 0.78573608398437511000f,
+ 0.85626220703125000000f, 0.91589355468750000000f,
+ 0.06182861328125000000f, 0.07418823242187500000f,
+ 0.08682250976562500000f, 0.11041259765625000000f,
+ 0.24261474609375000000f, 0.29913330078125000000f,
+ 0.38821411132812500000f, 0.44128417968750000000f,
+ 0.50585937500000000000f, 0.57934570312500000000f,
+ 0.65234375000000000000f, 0.71163940429687500000f,
+ 0.76174926757812500000f, 0.81536865234375000000f,
+ 0.88412475585937500000f, 0.93505859375000000000f,
+ 0.10464477539062500000f, 0.11697387695312500000f,
+ 0.13647460937500000000f, 0.14990234375000000000f,
+ 0.23568725585937500000f, 0.31695556640625000000f,
+ 0.39614868164062500000f, 0.46759033203125000000f,
+ 0.50961303710937500000f, 0.57394409179687500000f,
+ 0.63409423828125000000f, 0.68820190429687511000f,
+ 0.75155639648437500000f, 0.80853271484375000000f,
+ 0.86468505859375000000f, 0.93023681640625000000f,
+ 0.14465332031250000000f, 0.15774536132812500000f,
+ 0.17687988281250003000f, 0.19790649414062503000f,
+ 0.21356201171874997000f, 0.26947021484375000000f,
+ 0.35940551757812500000f, 0.43988037109375000000f,
+ 0.51364135742187500000f, 0.56192016601562500000f,
+ 0.63442993164062500000f, 0.68264770507812489000f,
+ 0.73962402343750000000f, 0.78842163085937511000f,
+ 0.84860229492187500000f, 0.91616821289062500000f,
+ 0.00457763671875000000f, 0.00512695312500000000f,
+ -0.00051879882812500000f, -0.00326538085937500000f,
+ -0.00433349609375000000f, -0.00698852539062499910f,
+ -0.00976562500000000000f, -0.01239013671875000000f,
+ -0.01535034179687500000f, -0.01892089843750000000f,
+ -0.02645874023437500000f, -0.02853393554687500000f,
+ -0.02752685546875000000f, -0.02075195312500000000f,
+ -0.01214599609375000000f, -0.00347900390625000000f,
+ -0.01214599609375000000f, -0.01083374023437500000f,
+ 0.00149536132812500000f, 0.00778198242187500000f,
+ 0.00347900390625000000f, 0.00793457031250000000f,
+ 0.01217651367187500000f, 0.00805664062500000000f,
+ 0.00967407226562500000f, 0.01315307617187500000f,
+ 0.01568603515625000000f, 0.01620483398437500000f,
+ 0.01327514648437500000f, 0.01086425781250000000f,
+ 0.00726318359375000000f, 0.00323486328125000000f,
+ -0.00131225585937500000f, -0.00109863281250000000f,
+ -0.00515747070312500000f, -0.00683593750000000000f,
+ -0.01193237304687500000f, -0.01931762695312500000f,
+ -0.02368164062500000000f, -0.02960205078125000000f,
+ -0.02575683593750000000f, -0.01388549804687500000f,
+ -0.00552368164062500000f, -0.00036621093750000000f,
+ 0.00259399414062500000f, 0.00259399414062500000f,
+ 0.00500488281250000000f, 0.00595092773437500000f,
+ 0.00372314453125000000f, 0.00259399414062500000f,
+ -0.00482177734375000000f, -0.01953125000000000000f,
+ -0.02755737304687500000f, 0.00027465820312500000f,
+ 0.00021362304687500000f, -0.00378417968750000000f,
+ 0.00454711914062500000f, 0.00097656250000000000f,
+ 0.00671386718750000000f, 0.01126098632812500000f,
+ 0.00738525390625000000f, 0.00350952148437500040f,
+ 0.00241088867187500000f, 0.00256347656250000000f,
+ -0.00445556640625000000f, -0.00659179687500000000f,
+ -0.00213623046875000000f, 0.03125000000000000000f,
+ 0.02291870117187500000f, 0.01751708984375000000f,
+ 0.01342773437500000000f, 0.01150512695312500000f,
+ 0.01074218749999999800f, 0.00619506835937500000f,
+ 0.00091552734374999989f, 0.00048828125000000000f,
+ -0.00009155273437500000f, 0.00247192382812500000f,
+ 0.00491333007812500000f, 0.00305175781250000000f,
+ -0.00451660156250000000f, -0.00537109374999999910f,
+ 0.02847290039062500000f, 0.02288818359375000000f,
+ 0.01232910156250000000f, 0.00521850585937500000f,
+ -0.00006103515625000000f, -0.00445556640625000000f,
+ -0.01254272460937500000f, -0.01348876953125000000f,
+ -0.01651000976562500000f, -0.01684570312500000000f,
+ -0.01348876953125000000f, -0.00820922851562500000f,
+ -0.00732421874999999910f, -0.00158691406250000020f,
+ 0.01840209960937500000f, 0.01937866210937500000f,
+ 0.01235961914062499800f, 0.00543212890625000000f,
+ 0.00656127929687500000f, 0.00057983398437500000f,
+ -0.00466918945312500000f, -0.00509643554687500000f,
+ -0.00885009765625000000f, -0.00668334960937500090f,
+ 0.00460815429687500000f, 0.00827026367187500000f,
+ 0.00460815429687500000f, 0.00363159179687500000f,
+ 0.00924682617187500000f, 0.00811767578125000000f,
+ 0.00305175781250000000f, 0.00210571289062500000f,
+ -0.00894165039062500000f, -0.02005004882812500000f,
+ 0.02865600585937500000f, 0.02011108398437500000f,
+ 0.01348876953125000000f, 0.01071166992187500000f,
+ 0.00402832031250000000f, 0.00299072265625000000f,
+ -0.00048828125000000000f, -0.00003051757812500000f,
+ -0.00411987304687500000f, -0.00610351562500000000f,
+ -0.00680541992187500000f, -0.00271606445312500000f,
+ 0.00509643554687500000f, 0.00469970703125000000f,
+ 0.00524902343750000000f, 0.00723266601562500000f,
+ -0.00137329101562500000f, -0.00558471679687500000f,
+ -0.00695800781250000000f, -0.01483154296875000000f,
+ 0.00802612304687500000f, 0.01855468750000000000f,
+ 0.00482177734375000000f, -0.00381469726562499960f,
+ -0.01190185546875000000f, -0.00692749023437500000f,
+ -0.00360107421875000000f, 0.00131225585937500000f,
+ -0.01394653320312500000f, -0.01196289062500000000f,
+ -0.02346801757812500000f, -0.02563476562500000000f,
+ 0.00061035156250000000f, -0.00357055664062500000f,
+ -0.00592041015625000000f, -0.00576782226562500000f,
+ -0.00527954101562500000f, -0.00527954101562500000f,
+ -0.00100708007812500000f, 0.00097656250000000000f,
+ 0.00531005859375000000f, 0.00439453125000000000f,
+ 0.00350952148437500040f, 0.00509643554687500000f,
+ 0.00173950195312500000f, 0.00134277343749999980f,
+ 0.00042724609375000000f, 0.00448608398437500000f,
+ 0.00292968750000000000f, -0.00164794921875000000f,
+ -0.00433349609375000000f, -0.00393676757812500000f,
+ -0.00775146484375000000f, -0.01010131835937500000f,
+ 0.00927734375000000000f, 0.00946044921875000000f,
+ -0.00158691406250000020f, -0.01278686523437500000f,
+ -0.02581787109375000000f, -0.03234863281250000000f,
+ -0.00268554687499999960f, -0.00375366210937500000f,
+ -0.00616455078125000000f, -0.01046752929687500200f,
+ -0.01690673828125000000f, -0.02932739257812500000f,
+ -0.02902221679687500000f, 0.00997924804687500000f,
+ 0.00485229492187500000f, 0.00247192382812500000f,
+ 0.00778198242187500000f, 0.00692749023437500000f,
+ 0.00366210937499999960f, 0.00619506835937500000f,
+ 0.00781250000000000000f, 0.00585937500000000000f,
+ 0.00500488281250000000f, 0.00683593750000000000f,
+ 0.00885009765625000000f, 0.00595092773437500000f,
+ 0.00659179687500000000f, 0.00637817382812500090f,
+ 0.00390625000000000000f, 0.02539062500000000300f,
+ 0.03137207031250000000f, 0.02713012695312500000f,
+ 0.02130126953125000000f, 0.01538085937500000000f,
+ 0.01245117187500000000f, 0.01083374023437500000f,
+ 0.00665283203124999910f, 0.00097656250000000000f,
+ -0.00350952148437500040f, -0.00256347656250000000f,
+ -0.00842285156250000000f, -0.00305175781250000000f,
+ -0.00952148437500000000f, -0.01477050781250000000f,
+ 0.02743530273437500000f, 0.02081298828124999700f,
+ 0.01419067382812500000f, 0.01391601562500000000f,
+ 0.00735473632812500090f, -0.00036621093750000000f,
+ -0.00839233398437500000f, -0.01296997070312499800f,
+ -0.01406860351562500000f, -0.01119995117187500000f,
+ -0.00100708007812500000f, -0.00085449218750000000f,
+ -0.00311279296875000000f, -0.00592041015625000000f,
+ -0.01608276367187500000f, 0.02633666992187500000f,
+ 0.02764892578125000000f, 0.01412963867187500000f,
+ 0.00747680664062500000f, 0.00039672851562500005f,
+ -0.00646972656250000000f, -0.00930786132812500000f,
+ -0.00320434570312500000f, 0.00497436523437500000f,
+ 0.00851440429687500000f, 0.00537109374999999910f,
+ 0.00283813476562499960f, 0.00204467773437500000f,
+ 0.00350952148437500040f, 0.00585937500000000000f,
+ 0.00186157226562500000f, -0.00152587890625000000f,
+ -0.00402832031250000000f, -0.00534057617187499910f,
+ -0.00683593750000000000f, -0.00827026367187500000f,
+ -0.01919555664062500000f, -0.00769042968750000000f,
+ 0.03533935546875000000f, 0.02966308593750000000f,
+ 0.01947021484375000000f, 0.00854492187500000000f,
+ 0.00915527343750000000f, 0.00994873046875000000f,
+ 0.00436401367187500000f, -0.00463867187500000000f,
+ -0.00653076171875000000f, -0.00875854492187500000f,
+ 0.00161743164062500000f, -0.00128173828125000000f,
+ -0.00720214843750000000f, -0.01074218749999999800f,
+ -0.01290893554687500000f, -0.00756835937500000000f,
+ -0.00393676757812500000f, -0.00497436523437500000f,
+ -0.00543212890625000000f, -0.00363159179687500000f,
+ 0.00259399414062500000f, 0.00173950195312500000f,
+ 0.01568603515625000000f, 0.01165771484375000000f,
+ 0.01141357421875000200f, 0.01226806640625000000f,
+ 0.01293945312500000000f, 0.01290893554687500000f,
+ 0.00827026367187500000f, 0.00601196289062499910f,
+ 0.00296020507812500000f, 0.00122070312500000000f,
+ 0.00119018554687500000f, -0.00296020507812500000f,
+ -0.00582885742187500000f, -0.00500488281250000000f,
+ -0.00701904296875000090f, -0.00781250000000000000f,
+ -0.01251220703125000000f, 0.01208496093750000200f,
+ 0.00997924804687500000f, 0.00387573242187500000f,
+ 0.00030517578125000000f, -0.00363159179687500000f,
+ -0.00509643554687500000f, -0.00888061523437500000f,
+ -0.00836181640625000000f, -0.00430297851562500000f,
+ -0.00302124023437500040f, -0.00689697265625000000f,
+ -0.00665283203124999910f, -0.00424194335937500000f,
+ -0.00683593750000000000f, -0.00637817382812500090f,
+ -0.00817871093750000000f, -0.01348876953125000000f,
+ -0.01260375976562500000f, 0.00677490234375000000f,
+ 0.00177001953125000000f, 0.01589965820312500000f,
+ 0.01049804687500000000f, 0.00787353515625000000f,
+ 0.00231933593750000000f, -0.00128173828125000000f,
+ -0.00433349609375000000f, -0.00503540039062499910f,
+ -0.00375366210937500000f, -0.00280761718750000000f,
+ 0.00143432617187500000f, 0.00024414062500000000f,
+ -0.00009155273437500000f, -0.00582885742187500000f,
+ -0.00033569335937499995f, -0.00500488281250000000f,
+ -0.00509643554687500000f, -0.01071166992187500000f,
+ -0.02258300781250000000f, 0.00949096679687500000f,
+ 0.01641845703125000000f, 0.00888061523437500000f,
+ 0.00561523437500000000f, 0.00088500976562500000f,
+ -0.00320434570312500000f, 0.00027465820312500000f,
+ -0.00091552734374999989f, -0.00164794921875000000f,
+ -0.00051879882812500000f, -0.00234985351562500000f,
+ -0.00827026367187500000f, -0.01257324218750000000f,
+ -0.01898193359375000000f, -0.01977539062500000000f,
+ 0.01452636718750000000f, 0.00567626953124999910f,
+ -0.00201416015625000000f, -0.00601196289062499910f,
+ -0.00222778320312500000f, -0.00286865234375000000f,
+ -0.00045776367187499995f, 0.00143432617187500000f,
+ 0.00085449218750000000f, 0.00341796875000000000f,
+ -0.00177001953125000000f, -0.00100708007812500000f,
+ 0.00198364257812500000f, 0.00057983398437500000f,
+ 0.00256347656250000000f, 0.00262451171875000000f,
+ 0.00842285156250000000f, 0.00347900390625000000f,
+ 0.01440429687500000000f, 0.02398681640625000000f,
+ 0.02438354492187499700f, 0.01907348632812500000f,
+ 0.01266479492187500000f, 0.00543212890625000000f,
+ -0.00106811523437500000f, -0.00079345703125000011f,
+ 0.00015258789062500000f, 0.00027465820312500000f,
+ 0.00253295898437500040f, 0.00119018554687500000f,
+ 0.00112915039062500000f, 0.00119018554687500000f,
+ -0.00561523437500000000f, -0.01141357421875000200f,
+ -0.00808715820312500000f, -0.01104736328125000000f,
+ -0.01528930664062500000f, 0.01028442382812500000f,
+ 0.02185058593750000000f, 0.01458740234374999800f,
+ -0.00183105468749999980f, -0.00381469726562499960f,
+ -0.00497436523437500000f, 0.01104736328125000000f,
+ 0.00051879882812500000f, -0.00372314453125000000f,
+ -0.00711059570312500000f, 0.00851440429687500000f,
+ 0.00421142578125000000f, 0.00479125976562500000f,
+ 0.00970458984375000000f, 0.00588989257812500000f,
+ 0.00576782226562500000f, 0.00637817382812500090f,
+ 0.00811767578125000000f, 0.00769042968750000000f,
+ -0.00140380859375000000f, -0.00170898437500000000f,
+ -0.00845336914062500000f, -0.01309204101562500000f,
+ 0.01416015625000000000f, 0.01177978515625000000f,
+ 0.00433349609375000000f, 0.00134277343749999980f,
+ -0.00131225585937500000f, 0.00201416015625000000f,
+ 0.00805664062500000000f, 0.00555419921875000000f,
+ 0.00143432617187500000f, 0.00042724609375000000f,
+ -0.00079345703125000011f, -0.00241088867187500000f,
+ 0.00149536132812500000f, 0.00045776367187499995f,
+ -0.00390625000000000000f, -0.00619506835937500000f,
+ -0.01220703125000000000f, -0.01458740234374999800f,
+ 0.00991821289062500000f, 0.00082397460937500000f,
+ 0.00714111328125000000f, 0.01254272460937500000f,
+ 0.00625610351562500000f, 0.00393676757812500000f,
+ 0.00036621093750000000f, 0.00177001953125000000f,
+ 0.00375366210937500000f, 0.00173950195312500000f,
+ 0.00521850585937500000f, 0.00418090820312500000f,
+ 0.00292968750000000000f, 0.00390625000000000000f,
+ -0.00097656250000000000f, 0.00408935546875000000f,
+ -0.00036621093750000000f, 0.00173950195312500000f,
+ 0.00363159179687500000f, 0.00079345703125000011f,
+ -0.00067138671874999989f, -0.00503540039062499910f,
+ -0.01525878906249999800f, -0.02139282226562500000f,
+ -0.01611328125000000000f, -0.00354003906250000000f,
+ 0.00195312500000000000f, -0.00024414062500000000f,
+ 0.00296020507812500000f, -0.00027465820312500000f,
+ -0.00494384765625000000f, -0.00201416015625000000f,
+ -0.00476074218750000000f, -0.00592041015625000000f,
+ -0.00924682617187500000f, -0.01666259765625000000f,
+ -0.01040649414062499800f, 0.01666259765625000000f,
+ 0.01092529296875000000f, 0.00289916992187500000f,
+ 0.00137329101562500000f, 0.00231933593750000000f,
+ 0.00823974609375000000f, 0.01229858398437500000f,
+ 0.00625610351562500000f, 0.00305175781250000000f,
+ 0.00375366210937500000f, 0.00152587890625000000f,
+ -0.00161743164062500000f, -0.00439453125000000000f,
+ -0.00335693359375000000f, -0.00039672851562500005f,
+ 0.00097656250000000000f, -0.00695800781250000000f,
+ -0.00396728515625000000f, 0.01077270507812500000f,
+ 0.00903320312500000000f, 0.00170898437500000000f,
+ -0.01135253906249999800f, -0.00772094726562500000f,
+ 0.01113891601562500000f, 0.00222778320312500000f,
+ 0.00030517578125000000f, -0.00103759765625000000f,
+ -0.00424194335937500000f, -0.00582885742187500000f,
+ -0.00292968750000000000f, 0.00015258789062500000f,
+ 0.00134277343749999980f, -0.00259399414062500000f,
+ -0.00546264648437500000f, -0.00393676757812500000f,
+ -0.00585937500000000000f, -0.00750732421875000000f,
+ -0.00259399414062500000f, -0.00335693359375000000f,
+ -0.00473022460937500000f, -0.00134277343749999980f,
+ -0.00082397460937500000f, 0.00442504882812500000f,
+ 0.00421142578125000000f, 0.00241088867187500000f,
+ 0.00097656250000000000f, -0.00451660156250000000f,
+ -0.01760864257812500000f, -0.01934814453125000000f,
+ 0.00582885742187500000f, 0.00286865234375000000f,
+ -0.00027465820312500000f, -0.00106811523437500000f,
+ -0.00234985351562500000f, -0.00256347656250000000f,
+ -0.00170898437500000000f, -0.00521850585937500000f,
+ -0.00909423828125000000f, -0.00827026367187500000f,
+ -0.00741577148437500000f, -0.00476074218750000000f,
+ -0.01000976562500000000f, -0.00717163085937500000f,
+ -0.00231933593750000000f, -0.00390625000000000000f,
+ -0.00369262695312500000f, 0.00393676757812500000f,
+ 0.00039672851562500005f, -0.00067138671874999989f,
+ 0.00097656250000000000f, 0.00137329101562500000f,
+ -0.00756835937500000000f, -0.00198364257812500000f,
+ 0.00588989257812500000f, -0.00247192382812500000f,
+ 0.00912475585937500000f, 0.00173950195312500000f,
+ -0.00448608398437500000f, 0.00585937500000000000f,
+ -0.00503540039062499910f, -0.01080322265625000200f,
+ -0.01019287109375000000f, -0.00323486328125000000f,
+ -0.00476074218750000000f, -0.00122070312500000000f,
+ -0.00009155273437500000f, -0.00207519531250000000f,
+ 0.00378417968750000000f, -0.00784301757812500000f,
+ 0.00238037109375000000f, 0.00378417968750000000f,
+ 0.00518798828125000000f, 0.01257324218750000000f,
+ 0.00692749023437500000f, 0.00320434570312500000f,
+ -0.00317382812500000040f, 0.00036621093750000000f,
+ 0.00469970703125000000f, 0.00762939453124999910f,
+ 0.00836181640625000000f, 0.00787353515625000000f,
+ 0.00012207031250000000f, -0.00082397460937500000f,
+ 0.00717163085937500000f, 0.00463867187500000000f,
+ 0.00155639648437500000f, 0.01031494140625000000f,
+ 0.00915527343750000000f, 0.00021362304687500000f,
+ -0.00958251953125000000f, -0.01254272460937500000f,
+ 0.00656127929687500000f, 0.00518798828125000000f,
+ -0.00027465820312500000f, -0.00283813476562499960f,
+ -0.00234985351562500000f, 0.00231933593750000000f,
+ 0.00204467773437500000f, 0.00164794921875000000f,
+ 0.00610351562500000000f, 0.00961303710937500000f,
+ 0.00497436523437500000f, 0.00219726562500000000f,
+ -0.00277709960937500000f, -0.01226806640625000000f,
+ 0.00482177734375000000f, 0.00570678710937500090f,
+ -0.00476074218750000000f, -0.00277709960937500000f,
+ 0.00885009765625000000f, 0.00814819335937500000f,
+ 0.00509643554687500000f, 0.00277709960937500000f,
+ 0.00427246093750000000f, 0.00521850585937500000f,
+ 0.00341796875000000000f, 0.00027465820312500000f,
+ -0.00128173828125000000f, -0.00540161132812500090f,
+ -0.01342773437500000000f, 0.01174926757812500200f,
+ 0.00244140625000000000f, 0.00045776367187499995f,
+ 0.00524902343750000000f, 0.00393676757812500000f,
+ 0.00125122070312500000f, -0.00393676757812500000f,
+ -0.01135253906249999800f, -0.00073242187500000000f,
+ -0.00228881835937500000f, -0.00091552734374999989f,
+ -0.00518798828125000000f, 0.00030517578125000000f,
+ -0.00360107421875000000f, 0.00173950195312500000f,
+ 0.00238037109375000000f, -0.00308227539062500000f,
+ 0.00708007812500000000f, 0.00491333007812500000f,
+ 0.00375366210937500000f, 0.00781250000000000000f,
+ 0.00845336914062500000f, 0.00308227539062500000f,
+ -0.00585937500000000000f, -0.01919555664062500000f,
+ -0.00305175781250000000f, -0.00183105468749999980f,
+ -0.00708007812500000000f, 0.00201416015625000000f,
+ 0.00039672851562500005f, -0.00039672851562500005f,
+ -0.00244140625000000000f, -0.00729370117187499910f,
+ 0.00729370117187499910f, 0.00112915039062500000f,
+ 0.00097656250000000000f, 0.00271606445312500000f,
+ -0.00973510742187500000f, -0.01766967773437500000f,
+ 0.01373291015625000000f, 0.01098632812500000000f,
+ 0.00009155273437500000f, -0.00088500976562500000f,
+ -0.00912475585937500000f, -0.00271606445312500000f,
+ -0.00164794921875000000f, -0.00335693359375000000f,
+ -0.00750732421875000000f, -0.00500488281250000000f,
+ 0.00018310546875000000f, -0.00573730468750000000f,
+ 0.01031494140625000000f, 0.00537109374999999910f,
+ -0.00280761718750000000f, 0.00601196289062499910f,
+ 0.00418090820312500000f, 0.00408935546875000000f,
+ 0.00036621093750000000f, -0.00006103515625000000f,
+ 0.00170898437500000000f, -0.00558471679687500000f,
+ 0.00347900390625000000f, -0.00109863281250000000f,
+ -0.00399780273437500000f, -0.00622558593750000000f,
+ 0.00228881835937500000f, -0.00076293945312500000f,
+ -0.00531005859375000000f, 0.00582885742187500000f,
+ -0.00045776367187499995f, -0.00885009765625000000f,
+ -0.01309204101562500000f, -0.00814819335937500000f,
+ 0.00241088867187500000f, 0.00112915039062500000f,
+ 0.00323486328125000000f, 0.00070190429687500000f,
+ -0.01171875000000000000f, 0.01296997070312499800f,
+ 0.00213623046875000000f, -0.00042724609375000000f,
+ 0.00646972656250000000f, 0.00320434570312500000f,
+ 0.00045776367187499995f, -0.00006103515625000000f,
+ -0.00128173828125000000f, -0.00112915039062500000f,
+ -0.00375366210937500000f, 0.00329589843750000000f,
+ 0.00085449218750000000f, -0.00146484375000000000f,
+ 0.00588989257812500000f, 0.00601196289062499910f,
+ 0.00527954101562500000f, -0.00100708007812500000f,
+ 0.00112915039062500000f, 0.00222778320312500000f,
+ -0.00173950195312500000f, 0.00781250000000000000f,
+ 0.00418090820312500000f, -0.00177001953125000000f,
+ -0.01312255859375000000f, -0.00695800781250000000f,
+ 0.00662231445312500000f, -0.00155639648437500000f,
+ -0.00030517578125000000f, -0.00177001953125000000f,
+ -0.00018310546875000000f, 0.00067138671874999989f,
+ 0.00317382812500000040f, 0.00186157226562500000f,
+ -0.00363159179687500000f, 0.00515747070312500000f,
+ 0.00439453125000000000f, 0.00048828125000000000f,
+ -0.00140380859375000000f, -0.01202392578124999800f,
+ 0.00183105468749999980f, 0.01385498046875000000f,
+ -0.00244140625000000000f, -0.00909423828125000000f,
+ -0.00198364257812500000f, 0.00076293945312500000f,
+ 0.00000000000000000000f, -0.00073242187500000000f,
+ -0.00198364257812500000f, -0.01272583007812500000f,
+ 0.01419067382812500000f, 0.00842285156250000000f,
+ -0.00009155273437500000f, -0.00592041015625000000f,
+ -0.00039672851562500005f, 0.00396728515625000000f,
+ 0.00057983398437500000f, -0.00018310546875000000f,
+ -0.00064086914062500000f, -0.00073242187500000000f,
+ -0.00549316406250000000f, -0.00161743164062500000f,
+ -0.00259399414062500000f, 0.00061035156250000000f,
+ 0.00360107421875000000f, 0.00448608398437500000f,
+ 0.00344848632812500000f, -0.00228881835937500000f,
+ -0.00881958007812500000f, 0.00689697265625000000f,
+ -0.00372314453125000000f, 0.00692749023437500000f,
+ 0.00823974609375000000f, 0.00381469726562499960f,
+ 0.00332641601562499960f, 0.00601196289062499910f,
+ 0.00381469726562499960f, 0.00421142578125000000f,
+ 0.00134277343749999980f, 0.00183105468749999980f,
+ 0.00076293945312500000f, -0.00167846679687500000f,
+ -0.00509643554687500000f, -0.00097656250000000000f,
+ -0.00424194335937500000f, -0.00588989257812500000f,
+ -0.00527954101562500000f, -0.00964355468750000000f,
+ 0.00875854492187500000f, -0.00634765625000000090f,
+ 0.00772094726562500000f, 0.00729370117187499910f,
+ 0.00082397460937500000f, -0.00244140625000000000f,
+ -0.00573730468750000000f, -0.00085449218750000000f,
+ -0.00555419921875000000f, -0.00717163085937500000f,
+ 0.00476074218750000000f, -0.00357055664062500000f,
+ 0.00390625000000000000f, -0.00146484375000000000f,
+ -0.00177001953125000000f, -0.00689697265625000000f,
+ 0.00524902343750000000f, 0.00552368164062500000f,
+ 0.00509643554687500000f, 0.00057983398437500000f,
+ 0.00189208984375000000f, 0.00030517578125000000f,
+ 0.00006103515625000000f, 0.00552368164062500000f,
+ 0.00460815429687500000f, 0.00329589843750000000f,
+ -0.00048828125000000000f, -0.00033569335937499995f,
+ -0.00238037109375000000f, -0.01010131835937500000f,
+ 0.01254272460937500000f, 0.00405883789062500000f,
+ 0.00051879882812500000f, 0.00317382812500000040f,
+ 0.00195312500000000000f, -0.00561523437500000000f,
+ 0.00073242187500000000f, -0.00091552734374999989f,
+ -0.00009155273437500000f, -0.00863647460937500000f,
+ 0.00369262695312500000f, 0.00622558593750000000f,
+ -0.00024414062500000000f, -0.00607299804687500000f,
+ -0.00064086914062500000f, -0.00244140625000000000f,
+ -0.00515747070312500000f, -0.00479125976562500000f,
+ -0.00582885742187500000f, -0.00415039062500000000f,
+ 0.00247192382812500000f, 0.00473022460937500000f,
+ 0.00042724609375000000f, -0.00399780273437500000f,
+ 0.00744628906250000000f, 0.00225830078125000000f,
+ -0.00173950195312500000f, -0.00143432617187500000f,
+ -0.00854492187500000000f, 0.01058959960937500000f,
+ 0.00338745117187500000f, -0.00234985351562500000f,
+ -0.00390625000000000000f, -0.00433349609375000000f,
+ -0.00592041015625000000f, -0.00381469726562499960f,
+ -0.00018310546875000000f, -0.00207519531250000000f,
+ 0.00277709960937500000f, 0.00003051757812500000f,
+ 0.00070190429687500000f, 0.00042724609375000000f,
+ -0.00469970703125000000f, -0.00103759765625000000f,
+ 0.00070190429687500000f, -0.00115966796875000000f,
+ -0.01046752929687500200f, 0.01535034179687500000f,
+ 0.00445556640625000000f, -0.00115966796875000000f,
+ -0.00140380859375000000f, -0.00125122070312500000f,
+ 0.00177001953125000000f, 0.00094604492187500000f,
+ 0.00192260742187500000f, -0.00146484375000000000f,
+ -0.00357055664062500000f, 0.00137329101562500000f,
+ 0.00085449218750000000f, 0.00003051757812500000f,
+ -0.00271606445312500000f, -0.00015258789062500000f,
+ -0.00134277343749999980f, -0.00088500976562500000f,
+ -0.01367187500000000000f, 0.01486206054687500000f,
+ 0.00622558593750000000f, 0.00247192382812500000f,
+ 0.00140380859375000000f, -0.00323486328125000000f,
+ -0.00921630859375000000f, 0.01159667968750000000f,
+ 0.00366210937499999960f, -0.00115966796875000000f,
+ -0.00036621093750000000f, -0.00119018554687500000f,
+ 0.00213623046875000000f, -0.00009155273437500000f,
+ 0.00076293945312500000f, -0.00198364257812500000f,
+ 0.00091552734374999989f, -0.00033569335937499995f,
+ 0.00103759765625000000f, -0.00045776367187499995f,
+ 0.00067138671874999989f, -0.00350952148437500040f,
+ 0.00000000000000000000f, -0.00241088867187500000f,
+ -0.00253295898437500040f, 0.00137329101562500000f,
+ 0.00347900390625000000f, 0.00131225585937500000f,
+ 0.00457763671875000000f, 0.00109863281250000000f,
+ 0.00711059570312500000f, 0.00454711914062500000f,
+ 0.00595092773437500000f, 0.00015258789062500000f,
+ 0.00076293945312500000f, -0.00158691406250000020f,
+ -0.01449584960937500000f, 0.00836181640625000000f,
+ 0.00085449218750000000f, -0.00119018554687500000f,
+ -0.00024414062500000000f, -0.00201416015625000000f,
+ -0.00778198242187500000f, 0.00787353515625000000f,
+ 0.00170898437500000000f, 0.00436401367187500000f,
+ -0.00137329101562500000f, -0.00579833984375000000f,
+ 0.00503540039062499910f, -0.00183105468749999980f,
+ 0.00061035156250000000f, 0.00006103515625000000f,
+ 0.00381469726562499960f, -0.00393676757812500000f,
+ 0.00155639648437500000f, -0.00024414062500000000f,
+ -0.01022338867187500000f, 0.00878906250000000000f,
+ 0.00115966796875000000f, 0.00180053710937500000f,
+ 0.00076293945312500000f, -0.00128173828125000000f,
+ 0.00070190429687500000f, -0.00360107421875000000f,
+ -0.00341796875000000000f, 0.00033569335937499995f,
+ -0.00167846679687500000f, -0.00405883789062500000f,
+ -0.00332641601562499960f, 0.00073242187500000000f,
+ -0.00320434570312500000f, 0.00238037109375000000f,
+ -0.00195312500000000000f, -0.00747680664062500000f,
+ 0.00616455078125000000f, -0.00198364257812500000f,
+ -0.00387573242187500000f, 0.00494384765625000000f,
+ 0.00122070312500000000f, -0.00286865234375000000f,
+ 0.00271606445312500000f, -0.00259399414062500000f,
+ -0.00363159179687500000f, -0.00314331054687500000f,
+ 0.00296020507812500000f, 0.00027465820312500000f,
+ -0.00213623046875000000f, -0.00085449218750000000f,
+ 0.00592041015625000000f, 0.00262451171875000000f,
+ -0.00341796875000000000f, -0.00280761718750000000f,
+ -0.00347900390625000000f, 0.00225830078125000000f,
+ -0.00149536132812500000f, 0.00140380859375000000f,
+ -0.00256347656250000000f, -0.00543212890625000000f,
+ 0.00344848632812500000f, 0.00158691406250000020f,
+ -0.00625610351562500000f, 0.01016235351562500000f,
+ 0.00268554687499999960f, 0.00677490234375000000f,
+ 0.00170898437500000000f, -0.00167846679687500000f,
+ 0.00039672851562500005f, 0.00262451171875000000f,
+ 0.00012207031250000000f, -0.00234985351562500000f,
+ 0.00683593750000000000f, 0.00347900390625000000f,
+ -0.00320434570312500000f, 0.00341796875000000000f,
+ 0.00381469726562499960f, -0.00088500976562500000f,
+ -0.00054931640625000000f, -0.00439453125000000000f,
+ 0.00067138671874999989f, -0.00177001953125000000f,
+ -0.00302124023437500040f, 0.00085449218750000000f,
+ 0.00347900390625000000f, -0.00201416015625000000f,
+ -0.00097656250000000000f, -0.00515747070312500000f,
+ -0.00958251953125000000f, 0.00869750976562500000f,
+ 0.00219726562500000000f, -0.00225830078125000000f,
+ 0.00546264648437500000f, 0.00085449218750000000f,
+ -0.00241088867187500000f, -0.00555419921875000000f,
+ 0.00039672851562500005f, -0.00167846679687500000f,
+ 0.00448608398437500000f, 0.00039672851562500005f,
+ 0.00036621093750000000f, -0.00164794921875000000f,
+ 0.00094604492187500000f, -0.00256347656250000000f,
+ -0.00051879882812500000f, -0.00228881835937500000f,
+ -0.00695800781250000000f, 0.00253295898437500040f,
+ -0.01144409179687500000f, 0.01330566406249999800f,
+ 0.00335693359375000000f, -0.00192260742187500000f,
+ -0.00082397460937500000f, -0.00415039062500000000f,
+ 0.00515747070312500000f, -0.00170898437500000000f,
+ -0.00024414062500000000f, -0.00521850585937500000f,
+ 0.00561523437500000000f, -0.00128173828125000000f,
+ 0.00451660156250000000f, 0.00207519531250000000f,
+ 0.00622558593750000000f, 0.00717163085937500000f,
+ 0.00335693359375000000f, -0.00698852539062499910f,
+ 0.00277709960937500000f, 0.00521850585937500000f,
+ -0.00131225585937500000f, -0.00009155273437500000f,
+ -0.00079345703125000011f, -0.00302124023437500040f,
+ -0.00338745117187500000f, 0.00216674804687500000f,
+ -0.00518798828125000000f, 0.00616455078125000000f,
+ -0.00204467773437500000f, 0.00552368164062500000f,
+ -0.00112915039062500000f, 0.00332641601562499960f,
+ -0.00366210937499999960f, 0.00009155273437500000f,
+ -0.00167846679687500000f, -0.00793457031250000000f,
+ -0.00048828125000000000f, 0.00463867187500000000f,
+ 0.00277709960937500000f, 0.00433349609375000000f,
+ 0.00128173828125000000f, 0.00134277343749999980f,
+ 0.00408935546875000000f, 0.00143432617187500000f,
+ 0.00051879882812500000f, -0.00106811523437500000f,
+ 0.00067138671874999989f, 0.00241088867187500000f,
+ -0.00515747070312500000f, 0.00125122070312500000f,
+ 0.00140380859375000000f, 0.00845336914062500000f,
+ -0.00283813476562499960f, -0.00149536132812500000f,
+ -0.00384521484375000000f, 0.00112915039062500000f,
+ -0.00314331054687500000f, -0.00103759765625000000f,
+ -0.00067138671874999989f, -0.00274658203125000000f,
+ -0.00408935546875000000f, -0.00625610351562500000f,
+ 0.00280761718750000000f, -0.00027465820312500000f,
+ 0.00003051757812500000f, -0.00595092773437500000f,
+ -0.00729370117187499910f, 0.00137329101562500000f,
+ 0.00164794921875000000f, 0.00054931640625000000f,
+ -0.00070190429687500000f, -0.00003051757812500000f,
+ -0.00244140625000000000f, -0.00299072265625000000f,
+ -0.00061035156250000000f, -0.00796508789062500000f,
+ 0.00933837890625000000f, 0.00219726562500000000f,
+ 0.00061035156250000000f, -0.00271606445312500000f,
+ -0.00662231445312500000f, 0.00033569335937499995f,
+ 0.00018310546875000000f, -0.00250244140625000000f,
+ 0.00271606445312500000f, 0.00039672851562500005f,
+ -0.00393676757812500000f, -0.00271606445312500000f,
+ 0.00253295898437500040f, -0.00216674804687500000f,
+ -0.00167846679687500000f, 0.00396728515625000000f,
+ -0.00299072265625000000f, -0.00445556640625000000f,
+ -0.00082397460937500000f, -0.00173950195312500000f,
+ 0.00161743164062500000f, 0.00839233398437500000f,
+ 0.00051879882812500000f, 0.00518798828125000000f,
+ -0.00015258789062500000f, -0.00164794921875000000f,
+ 0.00402832031250000000f, -0.00195312500000000000f,
+ 0.00219726562500000000f, 0.00488281250000000000f,
+ -0.00381469726562499960f, -0.00512695312500000000f,
+ 0.00219726562500000000f, 0.00122070312500000000f,
+ 0.00518798828125000000f, 0.00238037109375000000f,
+ 0.00756835937500000000f, 0.00354003906250000000f,
+ 0.00061035156250000000f, 0.00256347656250000000f,
+ 0.00094604492187500000f, -0.00103759765625000000f,
+ 0.00579833984375000000f, 0.00115966796875000000f,
+ 0.00039672851562500005f, -0.00323486328125000000f,
+ 0.00686645507812500000f, 0.00082397460937500000f,
+ -0.00512695312500000000f, 0.00073242187500000000f,
+ -0.00479125976562500000f, -0.00372314453125000000f,
+ 0.00503540039062499910f, 0.00033569335937499995f,
+ -0.00491333007812500000f, -0.00650024414062500000f,
+ -0.00036621093750000000f, -0.00155639648437500000f,
+ -0.00308227539062500000f, 0.00128173828125000000f,
+ 0.00308227539062500000f, 0.00082397460937500000f,
+ 0.00167846679687500000f, 0.00338745117187500000f,
+ 0.00228881835937500000f, 0.00216674804687500000f,
+ -0.00292968750000000000f, -0.00003051757812500000f,
+ 0.00198364257812500000f, -0.00845336914062500000f,
+ 0.01199340820312500000f, -0.00079345703125000011f,
+ -0.00134277343749999980f, -0.00207519531250000000f,
+ -0.00256347656250000000f, -0.00201416015625000000f,
+ -0.00289916992187500000f, 0.00717163085937500000f,
+ 0.00546264648437500000f, -0.00076293945312500000f,
+ -0.00125122070312500000f, 0.00082397460937500000f,
+ -0.00277709960937500000f, -0.00390625000000000000f,
+ -0.00677490234375000000f, 0.00445556640625000000f,
+ -0.00219726562500000000f, -0.00091552734374999989f,
+ -0.00073242187500000000f, 0.00167846679687500000f,
+ -0.00384521484375000000f, -0.00207519531250000000f,
+ -0.00177001953125000000f, -0.00387573242187500000f,
+ 0.00039672851562500005f, -0.00296020507812500000f,
+ -0.00323486328125000000f, 0.00531005859375000000f,
+ -0.00305175781250000000f, 0.00473022460937500000f,
+ 0.00308227539062500000f, -0.00445556640625000000f,
+ -0.00064086914062500000f, 0.00796508789062500000f,
+ 0.00067138671874999989f, 0.00115966796875000000f,
+ -0.00201416015625000000f, 0.00198364257812500000f,
+ 0.00012207031250000000f, 0.00213623046875000000f,
+ 0.00195312500000000000f, 0.00439453125000000000f,
+ 0.00180053710937500000f, 0.00650024414062500000f,
+ 0.00216674804687500000f, -0.01028442382812500000f,
+ 0.00924682617187500000f, -0.00158691406250000020f,
+ 0.00155639648437500000f, -0.00170898437500000000f,
+ 0.00003051757812500000f, 0.00030517578125000000f,
+ -0.00045776367187499995f, -0.00015258789062500000f,
+ 0.00103759765625000000f, 0.00158691406250000020f,
+ 0.00695800781250000000f, 0.00399780273437500000f,
+ 0.00491333007812500000f, -0.00387573242187500000f,
+ -0.00653076171875000000f, 0.00726318359375000000f,
+ 0.00375366210937500000f, 0.00195312500000000000f,
+ -0.00448608398437500000f, -0.00152587890625000000f,
+ -0.00103759765625000000f, -0.00387573242187500000f,
+ 0.00622558593750000000f, 0.00494384765625000000f,
+ 0.00259399414062500000f, 0.00125122070312500000f,
+ 0.00015258789062500000f, -0.00427246093750000000f,
+ 0.00222778320312500000f, -0.00457763671875000000f,
+ 0.00170898437500000000f, -0.00292968750000000000f,
+ -0.00201416015625000000f, -0.00061035156250000000f,
+ 0.00006103515625000000f, -0.00717163085937500000f,
+ 0.00180053710937500000f, -0.00067138671874999989f,
+ -0.00326538085937500000f, 0.00457763671875000000f,
+ -0.00048828125000000000f, -0.00143432617187500000f,
+ -0.00012207031250000000f, 0.00247192382812500000f,
+ -0.00204467773437500000f, 0.00509643554687500000f,
+ 0.00454711914062500000f, 0.00454711914062500000f,
+ -0.00479125976562500000f, 0.00878906250000000000f,
+ -0.00476074218750000000f, -0.00082397460937500000f,
+ -0.00024414062500000000f, 0.00054931640625000000f,
+ 0.00253295898437500040f, -0.00073242187500000000f,
+ -0.00125122070312500000f, -0.00509643554687500000f,
+ 0.00482177734375000000f, -0.00305175781250000000f,
+ 0.00283813476562499960f, 0.00161743164062500000f,
+ 0.00613403320312500000f, 0.00045776367187499995f,
+ 0.00128173828125000000f, 0.00811767578125000000f,
+ 0.00848388671875000000f, -0.00036621093750000000f,
+ -0.00018310546875000000f, -0.00112915039062500000f,
+ 0.00259399414062500000f, 0.00018310546875000000f,
+ 0.00061035156250000000f, -0.00573730468750000000f,
+ -0.00827026367187500000f, 0.00326538085937500000f,
+ -0.00039672851562500005f, -0.00244140625000000000f,
+ 0.00155639648437500000f, 0.00616455078125000000f,
+ 0.00527954101562500000f, -0.00210571289062500000f,
+ 0.00238037109375000000f, -0.00573730468750000000f,
+ 0.00140380859375000000f, 0.00012207031250000000f,
+ 0.00466918945312500000f, 0.00036621093750000000f,
+ -0.00421142578125000000f, 0.00515747070312500000f,
+ 0.00015258789062500000f, -0.00177001953125000000f,
+ -0.00375366210937500000f, -0.00329589843750000000f,
+ -0.00741577148437500000f, 0.00457763671875000000f,
+ 0.00030517578125000000f, -0.00582885742187500000f,
+ 0.00750732421875000000f, -0.00045776367187499995f,
+ 0.00115966796875000000f, 0.00076293945312500000f,
+ -0.00030517578125000000f, 0.00042724609375000000f,
+ 0.00186157226562500000f, 0.00152587890625000000f,
+ -0.00628662109375000000f, -0.00656127929687500000f,
+ -0.00671386718750000000f, 0.00274658203125000000f,
+ 0.00015258789062500000f, -0.00454711914062500000f,
+ -0.00668334960937500090f, 0.00170898437500000000f,
+ 0.00433349609375000000f, 0.00073242187500000000f,
+ -0.01147460937500000000f, 0.00234985351562500000f,
+ -0.00244140625000000000f, 0.00228881835937500000f,
+ 0.00018310546875000000f, 0.00128173828125000000f,
+ -0.00308227539062500000f, 0.00048828125000000000f,
+ 0.00170898437500000000f, 0.00042724609375000000f,
+ -0.00173950195312500000f, 0.00009155273437500000f,
+ -0.00051879882812500000f, 0.00244140625000000000f,
+ 0.00173950195312500000f, -0.00109863281250000000f,
+ 0.00268554687499999960f, -0.00180053710937500000f,
+ -0.00296020507812500000f, -0.00057983398437500000f,
+ -0.00451660156250000000f, 0.00140380859375000000f,
+ -0.00668334960937500090f, 0.00689697265625000000f,
+ 0.00347900390625000000f, -0.00012207031250000000f,
+ -0.00219726562500000000f, -0.00045776367187499995f,
+ 0.00112915039062500000f, -0.00149536132812500000f,
+ -0.00085449218750000000f, 0.00753784179687500000f,
+ 0.00134277343749999980f, 0.00375366210937500000f,
+ 0.00143432617187500000f, -0.00372314453125000000f,
+ -0.00115966796875000000f, 0.00051879882812500000f,
+ 0.00012207031250000000f, -0.00344848632812500000f,
+ -0.00097656250000000000f, -0.00683593750000000000f,
+ 0.00469970703125000000f, -0.00408935546875000000f,
+ 0.00598144531250000000f, 0.00216674804687500000f,
+ -0.00814819335937500000f, -0.00259399414062500000f,
+ 0.00085449218750000000f, -0.00213623046875000000f,
+ 0.00271606445312500000f, -0.00366210937499999960f,
+ 0.00302124023437500040f, -0.00006103515625000000f,
+ 0.00195312500000000000f, 0.00231933593750000000f,
+ -0.00506591796875000090f, -0.00146484375000000000f,
+ 0.00576782226562500000f, -0.00106811523437500000f,
+ -0.00280761718750000000f, -0.00515747070312500000f,
+ -0.00375366210937500000f, 0.01034545898437500000f,
+ 0.00115966796875000000f, -0.00076293945312500000f,
+ 0.00115966796875000000f, -0.00106811523437500000f,
+ 0.00686645507812500000f, -0.00424194335937500000f,
+ -0.00152587890625000000f, -0.00192260742187500000f,
+ 0.00750732421875000000f, 0.00183105468749999980f,
+ -0.00564575195312500000f, -0.00332641601562499960f,
+ -0.00149536132812500000f, -0.00161743164062500000f,
+ -0.00509643554687500000f, 0.00155639648437500000f,
+ 0.00454711914062500000f, 0.00183105468749999980f,
+ -0.00308227539062500000f, -0.00100708007812500000f,
+ 0.00076293945312500000f, -0.00231933593750000000f,
+ 0.00366210937499999960f, 0.00097656250000000000f,
+ -0.00091552734374999989f, -0.00253295898437500040f,
+ 0.00311279296875000000f, 0.00277709960937500000f,
+ -0.00567626953124999910f, -0.00796508789062500000f,
+ 0.00399780273437500000f, -0.00601196289062499910f
+};
+
+const SKP_Silk_NLSF_CBS_FLP SKP_Silk_NLSF_CB0_16_Stage_info_FLP[ NLSF_MSVQ_CB0_16_STAGES ] =
+{
+ { 128, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 0 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 128 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 128 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 144 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 144 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 152 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 152 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 160 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 160 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 168 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 168 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 176 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 176 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 184 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 184 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 192 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 192 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_16[ 16 * 200 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates[ 200 ] }
+};
+
+const SKP_Silk_NLSF_CB_FLP SKP_Silk_NLSF_CB0_16_FLP =
+{
+ NLSF_MSVQ_CB0_16_STAGES,
+ SKP_Silk_NLSF_CB0_16_Stage_info_FLP,
+ SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min,
+ SKP_Silk_NLSF_MSVQ_CB0_16_CDF,
+ SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_tables_NLSF_CB1_10_FLP.c
@@ -1,0 +1,475 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 3.21 kB */
+/**********************************************/
+
+#include "SKP_Silk_tables_FLP.h"
+#include "SKP_Silk_tables_NLSF_CB1_10.h"
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB1_10_rates[ NLSF_MSVQ_CB1_10_VECTORS ] =
+{
+ 1.93750000000000000000f, 3.21875000000000000000f,
+ 3.75000000000000000000f, 3.96875000000000000000f,
+ 4.21875000000000000000f, 4.21875000000000000000f,
+ 4.84375000000000000000f, 5.21875000000000000000f,
+ 5.25000000000000000000f, 5.37500000000000000000f,
+ 5.40625000000000000000f, 5.50000000000000000000f,
+ 5.59375000000000000000f, 5.65625000000000000000f,
+ 5.65625000000000000000f, 5.78125000000000000000f,
+ 5.81250000000000000000f, 6.18750000000000000000f,
+ 6.21875000000000000000f, 6.34375000000000000000f,
+ 6.40625000000000000000f, 6.93750000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 1.68750000000000000000f, 2.37500000000000000000f,
+ 3.15625000000000000000f, 3.37500000000000000000f,
+ 3.71875000000000000000f, 3.75000000000000000000f,
+ 3.84375000000000000000f, 3.90625000000000000000f,
+ 2.12500000000000000000f, 2.65625000000000000000f,
+ 2.71875000000000000000f, 3.21875000000000000000f,
+ 3.34375000000000000000f, 3.50000000000000000000f,
+ 3.59375000000000000000f, 3.62500000000000000000f,
+ 2.43750000000000000000f, 2.65625000000000000000f,
+ 2.65625000000000000000f, 3.15625000000000000000f,
+ 3.28125000000000000000f, 3.28125000000000000000f,
+ 3.43750000000000000000f, 3.46875000000000000000f,
+ 2.59375000000000000000f, 2.84375000000000000000f,
+ 3.03125000000000000000f, 3.03125000000000000000f,
+ 3.03125000000000000000f, 3.12500000000000000000f,
+ 3.15625000000000000000f, 3.28125000000000000000f,
+ 2.87500000000000000000f, 2.90625000000000000000f,
+ 2.90625000000000000000f, 2.96875000000000000000f,
+ 3.00000000000000000000f, 3.06250000000000000000f,
+ 3.09375000000000000000f, 3.21875000000000000000f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min[ 10 + 1 ] =
+{
+ 0.01409912109375000000f,
+ 0.00009155273437500000f,
+ 0.00195312500000000000f,
+ 0.00225830078125000000f,
+ 0.00299072265625000000f,
+ 0.00152587890625000000f,
+ 0.00296020507812500000f,
+ 0.00207519531250000000f,
+ 0.00366210937499999960f,
+ 0.00161743164062500000f,
+ 0.01950073242187500000f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB1_10[ 10 * NLSF_MSVQ_CB1_10_VECTORS ] =
+{
+ 0.05728149414062500000f, 0.14178466796875000000f,
+ 0.23535156250000003000f, 0.32791137695312500000f,
+ 0.42614746093750000000f, 0.51965332031250000000f,
+ 0.61764526367187500000f, 0.70745849609375000000f,
+ 0.80783081054687511000f, 0.89376831054687500000f,
+ 0.04919433593750000000f, 0.10003662109375001000f,
+ 0.21624755859374997000f, 0.30441284179687500000f,
+ 0.40368652343750000000f, 0.49633789062499994000f,
+ 0.59802246093750000000f, 0.69244384765625011000f,
+ 0.79458618164062500000f, 0.88394165039062500000f,
+ 0.06619262695312500000f, 0.11688232421875000000f,
+ 0.19714355468750000000f, 0.27337646484375000000f,
+ 0.36499023437500000000f, 0.45013427734375000000f,
+ 0.56176757812500000000f, 0.66098022460937500000f,
+ 0.76348876953125000000f, 0.85580444335937489000f,
+ 0.11230468750000001000f, 0.18383789062500000000f,
+ 0.27423095703125000000f, 0.37402343749999994000f,
+ 0.46389770507812494000f, 0.55505371093750000000f,
+ 0.66348266601562500000f, 0.74645996093750000000f,
+ 0.83874511718749989000f, 0.91732788085937500000f,
+ 0.07885742187500000000f, 0.15829467773437500000f,
+ 0.23800659179687500000f, 0.33270263671874994000f,
+ 0.40219116210937500000f, 0.48110961914062500000f,
+ 0.58035278320312500000f, 0.68453979492187500000f,
+ 0.79013061523437500000f, 0.87579345703125000000f,
+ 0.11386108398437500000f, 0.17550659179687500000f,
+ 0.26397705078125000000f, 0.35833740234375000000f,
+ 0.46051025390625000000f, 0.53121948242187500000f,
+ 0.62228393554687500000f, 0.71475219726562500000f,
+ 0.80041503906250000000f, 0.89254760742187511000f,
+ 0.06430053710937500000f, 0.19296264648437500000f,
+ 0.27206420898437500000f, 0.37310791015625000000f,
+ 0.45089721679687500000f, 0.54293823242187500000f,
+ 0.63061523437500000000f, 0.72262573242187500000f,
+ 0.81875610351562500000f, 0.89578247070312500000f,
+ 0.05117797851562500000f, 0.08758544921875000000f,
+ 0.16436767578125000000f, 0.24649047851562500000f,
+ 0.36062622070312500000f, 0.46313476562500000000f,
+ 0.56936645507812500000f, 0.67156982421875011000f,
+ 0.77859497070312500000f, 0.87551879882812500000f,
+ 0.06442260742187500000f, 0.11062622070312501000f,
+ 0.21444702148437500000f, 0.32312011718750000000f,
+ 0.42904663085937500000f, 0.52468872070312500000f,
+ 0.64505004882812489000f, 0.74035644531250000000f,
+ 0.84158325195312500000f, 0.91662597656250011000f,
+ 0.07409667968750000000f, 0.12237548828125000000f,
+ 0.17593383789062500000f, 0.28613281250000000000f,
+ 0.42129516601562500000f, 0.48281860351562500000f,
+ 0.59338378906250000000f, 0.68325805664062511000f,
+ 0.77194213867187500000f, 0.89447021484375000000f,
+ 0.06884765625000000000f, 0.14123535156250000000f,
+ 0.25564575195312500000f, 0.37966918945312500000f,
+ 0.46640014648437500000f, 0.59393310546875000000f,
+ 0.67922973632812500000f, 0.77975463867187489000f,
+ 0.86767578124999989000f, 0.92480468750000000000f,
+ 0.07177734375000000000f, 0.11215209960937499000f,
+ 0.18704223632812500000f, 0.36218261718750000000f,
+ 0.44406127929687494000f, 0.50827026367187500000f,
+ 0.59887695312500000000f, 0.66781616210937500000f,
+ 0.80950927734375000000f, 0.88040161132812500000f,
+ 0.16000366210937500000f, 0.22119140625000000000f,
+ 0.32220458984375000000f, 0.40493774414062500000f,
+ 0.47763061523437506000f, 0.54684448242187500000f,
+ 0.64517211914062500000f, 0.72714233398437500000f,
+ 0.82708740234375000000f, 0.90084838867187489000f,
+ 0.13494873046875000000f, 0.20523071289062500000f,
+ 0.31887817382812500000f, 0.40505981445312500000f,
+ 0.49206542968750000000f, 0.60794067382812500000f,
+ 0.69659423828124989000f, 0.79531860351562500000f,
+ 0.87777709960937500000f, 0.93331909179687500000f,
+ 0.13757324218750000000f, 0.19198608398437500000f,
+ 0.29003906250000000000f, 0.36038208007812506000f,
+ 0.42196655273437500000f, 0.48675537109375000000f,
+ 0.58218383789062500000f, 0.67395019531250000000f,
+ 0.78552246093750000000f, 0.87457275390625000000f,
+ 0.07751464843750000000f, 0.13113403320312500000f,
+ 0.26181030273437500000f, 0.41436767578125000000f,
+ 0.50762939453125000000f, 0.58291625976562500000f,
+ 0.65756225585937500000f, 0.72897338867187500000f,
+ 0.81716918945312489000f, 0.88946533203125000000f,
+ 0.10305786132812501000f, 0.19403076171875003000f,
+ 0.31201171875000000000f, 0.44305419921875000000f,
+ 0.54641723632812500000f, 0.64257812500000000000f,
+ 0.72134399414062500000f, 0.78686523437500011000f,
+ 0.85940551757812500000f, 0.91885375976562500000f,
+ 0.12747192382812500000f, 0.18133544921875000000f,
+ 0.24899291992187497000f, 0.30847167968750000000f,
+ 0.37017822265625000000f, 0.47210693359375000000f,
+ 0.61618041992187500000f, 0.71185302734375000000f,
+ 0.81732177734375000000f, 0.89596557617187500000f,
+ 0.07604980468750000000f, 0.11599731445312501000f,
+ 0.18750000000000000000f, 0.29983520507812500000f,
+ 0.48828124999999994000f, 0.56979370117187500000f,
+ 0.63760375976562489000f, 0.72213745117187500000f,
+ 0.79037475585937500000f, 0.88421630859374989000f,
+ 0.09188842773437500000f, 0.14425659179687500000f,
+ 0.20855712890625000000f, 0.32058715820312500000f,
+ 0.38040161132812500000f, 0.44238281250000000000f,
+ 0.52078247070312500000f, 0.61193847656250000000f,
+ 0.77102661132812500000f, 0.85623168945312500000f,
+ 0.12661743164062500000f, 0.21963500976562500000f,
+ 0.37652587890625000000f, 0.46008300781249994000f,
+ 0.54937744140625000000f, 0.61614990234375000000f,
+ 0.67709350585937500000f, 0.75448608398437500000f,
+ 0.82650756835937500000f, 0.88882446289062511000f,
+ 0.09078979492187500000f, 0.13970947265625000000f,
+ 0.19677734375000000000f, 0.25567626953125000000f,
+ 0.29513549804687500000f, 0.40359497070312500000f,
+ 0.59515380859375000000f, 0.67984008789062500000f,
+ 0.79522705078125000000f, 0.88043212890625000000f,
+ 0.12518310546875000000f, 0.17578125000000000000f,
+ 0.23632812500000000000f, 0.28942871093750000000f,
+ 0.32788085937500000000f, 0.37561035156250000000f,
+ 0.44790649414062500000f, 0.59835815429687500000f,
+ 0.75808715820312500000f, 0.86611938476562489000f,
+ 0.15048217773437500000f, 0.28341674804687500000f,
+ 0.38076782226562500000f, 0.40878295898437500000f,
+ 0.41845703125000000000f, 0.43795776367187506000f,
+ 0.48974609375000000000f, 0.60629272460937500000f,
+ 0.73815917968750000000f, 0.88482666015624989000f,
+ 0.12637329101562500000f, 0.24008178710937500000f,
+ 0.40100097656250000000f, 0.54077148437500000000f,
+ 0.61230468750000000000f, 0.64416503906250000000f,
+ 0.66198730468750000000f, 0.69342041015625000000f,
+ 0.72436523437500000000f, 0.83767700195312500000f,
+ 0.12240600585937499000f, 0.26611328125000000000f,
+ 0.40386962890625006000f, 0.49456787109375006000f,
+ 0.53713989257812500000f, 0.55813598632812500000f,
+ 0.56530761718750000000f, 0.60086059570312500000f,
+ 0.70904541015625000000f, 0.85089111328125000000f,
+ 0.10437011718750000000f, 0.18295288085937500000f,
+ 0.34271240234375006000f, 0.46133422851562500000f,
+ 0.48544311523437500000f, 0.51217651367187500000f,
+ 0.54205322265625000000f, 0.71249389648437500000f,
+ 0.82086181640625000000f, 0.91387939453125000000f,
+ 0.09399414062500001400f, 0.20709228515625000000f,
+ 0.31936645507812506000f, 0.41735839843750000000f,
+ 0.55111694335937500000f, 0.72067260742187489000f,
+ 0.82574462890624989000f, 0.88751220703124989000f,
+ 0.90219116210937500000f, 0.91262817382812500000f,
+ 0.09271240234375000000f, 0.17150878906250003000f,
+ 0.28277587890625000000f, 0.39276123046875000000f,
+ 0.57382202148437500000f, 0.59844970703125000000f,
+ 0.61065673828125000000f, 0.63482666015625000000f,
+ 0.72882080078125011000f, 0.89434814453125000000f,
+ 0.10113525390625000000f, 0.19592285156250000000f,
+ 0.27606201171875000000f, 0.40472412109375000000f,
+ 0.48428344726562500000f, 0.70547485351562500000f,
+ 0.72225952148437500000f, 0.73898315429687500000f,
+ 0.74728393554687500000f, 0.79086303710937500000f,
+ 0.10586547851562500000f, 0.21249389648437500000f,
+ 0.30831909179687500000f, 0.46636962890625006000f,
+ 0.62655639648437500000f, 0.70922851562500000000f,
+ 0.76367187500000000000f, 0.79409790039062500000f,
+ 0.81591796875000000000f, 0.83175659179687500000f,
+ 0.09280395507812500000f, 0.19711303710937500000f,
+ 0.29837036132812500000f, 0.39355468750000000000f,
+ 0.49789428710937500000f, 0.59234619140625000000f,
+ 0.73455810546875000000f, 0.89578247070312500000f,
+ 0.97030639648437500000f, 0.97885131835937500000f,
+ -0.00610351562500000000f, -0.00408935546875000000f,
+ -0.00344848632812500000f, -0.00622558593750000000f,
+ -0.01058959960937500000f, -0.01342773437500000000f,
+ -0.01074218749999999800f, -0.00643920898437500000f,
+ -0.01275634765625000200f, -0.00524902343750000000f,
+ -0.00955200195312500000f, 0.00180053710937500000f,
+ 0.01510620117187500000f, 0.02355957031250000000f,
+ 0.02200317382812500000f, 0.01873779296875000000f,
+ 0.01019287109375000000f, 0.01354980468750000000f,
+ 0.00686645507812500000f, 0.00738525390625000000f,
+ 0.00491333007812500000f, 0.00048828125000000000f,
+ 0.00836181640625000000f, 0.01721191406250000000f,
+ -0.00222778320312500000f, -0.00573730468750000000f,
+ -0.01205444335937500000f, -0.00521850585937500000f,
+ 0.02371215820312499700f, 0.01550292968750000000f,
+ 0.04089355468750000000f, 0.03494262695312500000f,
+ 0.02133178710937500000f, 0.00598144531250000000f,
+ 0.00680541992187500000f, 0.00527954101562500000f,
+ 0.00274658203125000000f, 0.00076293945312500000f,
+ -0.00079345703125000011f, 0.00054931640625000000f,
+ 0.00405883789062500000f, -0.00320434570312500000f,
+ -0.01098632812500000000f, -0.00845336914062500000f,
+ 0.02621459960937500000f, 0.01934814453125000000f,
+ 0.00125122070312500000f, -0.01699829101562500000f,
+ -0.02343750000000000000f, -0.02825927734375000000f,
+ -0.01834106445312500000f, -0.03115844726562500000f,
+ -0.03628540039062500000f, -0.01113891601562500000f,
+ 0.00686645507812500000f, 0.00326538085937500000f,
+ 0.01141357421875000200f, -0.00152587890625000000f,
+ 0.01321411132812500000f, 0.01272583007812500000f,
+ 0.00476074218750000000f, 0.00119018554687500000f,
+ -0.01821899414062500000f, -0.04263305664062499300f,
+ -0.04864501953125000000f, -0.01806640625000000000f,
+ -0.01480102539062500000f, -0.00891113281250000000f,
+ 0.00772094726562500000f, 0.00265502929687500000f,
+ -0.00000000000000000000f, -0.00018310546875000000f,
+ -0.00076293945312500000f, -0.01052856445312500000f,
+ -0.00732421874999999910f, 0.00366210937499999960f,
+ 0.03848266601562500000f, 0.02886962890625000000f,
+ 0.00506591796875000090f, -0.00845336914062500000f,
+ 0.00735473632812500090f, 0.00509643554687500000f,
+ 0.00518798828125000000f, 0.01309204101562500000f,
+ 0.01580810546875000000f, 0.02178955078125000000f,
+ 0.01837158203125000000f, 0.00775146484375000000f,
+ 0.00408935546875000000f, 0.00280761718750000000f,
+ -0.00463867187500000000f, -0.00988769531250000000f,
+ -0.01202392578124999800f, 0.00149536132812500000f,
+ -0.00460815429687500000f, -0.00927734375000000000f,
+ -0.02209472656250000000f, -0.02005004882812500000f,
+ -0.00494384765625000000f, -0.01126098632812500000f,
+ -0.00106811523437500000f, 0.00009155273437500000f,
+ -0.00006103515625000000f, -0.00952148437500000000f,
+ -0.00610351562500000000f, -0.00280761718750000000f,
+ -0.00692749023437500000f, 0.00738525390625000000f,
+ 0.01916503906250000000f, 0.01724243164062500000f,
+ -0.00378417968750000000f, 0.03222656250000000000f,
+ 0.02349853515625000300f, 0.00308227539062500000f,
+ -0.00256347656250000000f, -0.00100708007812500000f,
+ 0.00012207031250000000f, -0.00585937500000000000f,
+ -0.00830078125000000000f, 0.00015258789062500000f,
+ -0.01913452148437500000f, -0.02981567382812500000f,
+ 0.01278686523437500000f, 0.01440429687500000000f,
+ 0.00161743164062500000f, -0.00314331054687500000f,
+ 0.00442504882812500000f, 0.00982666015625000000f,
+ -0.00289916992187500000f, -0.00094604492187500000f,
+ -0.00305175781250000000f, -0.00924682617187500000f,
+ -0.01708984375000000000f, -0.03256225585937500000f,
+ -0.01260375976562500000f, 0.02178955078125000000f,
+ 0.00863647460937500000f, 0.00006103515625000000f,
+ -0.00680541992187500000f, -0.01119995117187500000f,
+ 0.01596069335937500000f, 0.01098632812500000000f,
+ -0.00115966796875000000f, -0.00350952148437500040f,
+ 0.01153564453125000000f, -0.01803588867187500000f,
+ -0.02191162109375000000f, 0.01367187500000000000f,
+ -0.01467895507812500000f, -0.00836181640625000000f,
+ 0.00549316406250000000f, -0.00268554687499999960f,
+ -0.01773071289062500000f, -0.00479125976562500000f,
+ -0.02124023437500000000f, -0.03860473632812500000f,
+ 0.01202392578124999800f, -0.01461791992187500000f,
+ -0.00070190429687500000f, 0.00378417968750000000f,
+ -0.00131225585937500000f, 0.00057983398437500000f,
+ -0.00344848632812500000f, -0.00720214843750000000f,
+ -0.01257324218750000000f, -0.02011108398437500000f,
+ -0.00610351562500000000f, 0.00006103515625000000f,
+ -0.00210571289062500000f, -0.01043701171875000000f,
+ 0.00607299804687500000f, 0.00167846679687500000f,
+ 0.00177001953125000000f, -0.00109863281250000000f,
+ -0.00155639648437500000f, -0.00189208984375000000f,
+ 0.01547241210937500000f, 0.01547241210937500000f,
+ 0.01303100585937500200f, 0.01348876953125000000f,
+ 0.00109863281250000000f, 0.01834106445312500000f,
+ -0.00430297851562500000f, 0.00207519531250000000f,
+ 0.00836181640625000000f, 0.00836181640625000000f,
+ 0.00207519531250000000f, -0.00036621093750000000f,
+ -0.00012207031250000000f, 0.00216674804687500000f,
+ -0.00588989257812500000f, -0.01416015625000000000f,
+ -0.01296997070312499800f, -0.01168823242187499800f,
+ 0.01245117187500000000f, 0.00619506835937500000f,
+ -0.01028442382812500000f, 0.00720214843750000000f,
+ 0.01251220703125000000f, -0.00180053710937500000f,
+ -0.00076293945312500000f, -0.01040649414062499800f,
+ -0.01370239257812500200f, 0.00085449218750000000f,
+ -0.00027465820312500000f, 0.00274658203125000000f,
+ 0.01013183593750000200f, -0.00042724609375000000f,
+ -0.02761840820312499700f, 0.00292968750000000000f,
+ -0.01647949218750000000f, -0.00738525390625000000f,
+ 0.02072143554687500000f, -0.00180053710937500000f,
+ 0.00585937500000000000f, -0.00073242187500000000f,
+ 0.00183105468749999980f, -0.00662231445312500000f,
+ 0.00015258789062500000f, -0.00112915039062500000f,
+ 0.00546264648437500000f, -0.00061035156250000000f,
+ 0.00949096679687500000f, 0.01583862304687500000f,
+ 0.00836181640625000000f, 0.00219726562500000000f,
+ -0.00994873046875000000f, -0.03143310546875000000f,
+ -0.00799560546875000000f, 0.00650024414062500000f,
+ 0.01159667968750000000f, 0.00250244140625000000f,
+ 0.01000976562500000000f, 0.01254272460937500000f,
+ -0.01647949218750000000f, 0.01751708984375000000f,
+ -0.00863647460937500000f, 0.00460815429687500000f,
+ 0.00552368164062500000f, -0.01226806640625000000f,
+ -0.00848388671875000000f, -0.00732421874999999910f,
+ -0.00335693359375000000f, -0.00692749023437500000f,
+ -0.00805664062500000000f, -0.00271606445312500000f,
+ -0.00762939453124999910f, -0.00790405273437500000f,
+ -0.00082397460937500000f, 0.00323486328125000000f,
+ -0.00729370117187499910f, -0.00299072265625000000f,
+ -0.01190185546875000000f, 0.00360107421875000000f,
+ 0.00186157226562500000f, 0.00317382812500000040f,
+ 0.00897216796875000000f, 0.01623535156250000000f,
+ 0.00280761718750000000f, -0.00039672851562500005f,
+ 0.00183105468749999980f, -0.00711059570312500000f,
+ 0.01022338867187500000f, 0.01651000976562500000f,
+ 0.00936889648437500000f, -0.00079345703125000011f,
+ -0.00335693359375000000f, -0.00277709960937500000f,
+ -0.00704956054687500000f, -0.01403808593750000200f,
+ 0.00518798828125000000f, 0.00613403320312500000f,
+ 0.00292968750000000000f, -0.01135253906249999800f,
+ 0.00402832031250000000f, 0.01327514648437500000f,
+ -0.00921630859375000000f, 0.00659179687500000000f,
+ -0.00851440429687500000f, -0.00125122070312500000f,
+ 0.00225830078125000000f, 0.00579833984375000000f,
+ 0.01123046875000000000f, 0.00833129882812500000f,
+ -0.00567626953124999910f, -0.01855468750000000000f,
+ -0.00479125976562500000f, 0.00485229492187500000f,
+ 0.00036621093750000000f, 0.00848388671875000000f,
+ 0.00747680664062500000f, 0.00936889648437500000f,
+ 0.00076293945312500000f, -0.00570678710937500090f,
+ -0.00048828125000000000f, 0.00167846679687500000f,
+ 0.00091552734374999989f, -0.00497436523437500000f,
+ 0.01672363281250000000f, -0.00936889648437500000f,
+ 0.00323486328125000000f, -0.00015258789062500000f,
+ 0.00082397460937500000f, 0.01007080078124999800f,
+ -0.01269531250000000200f, 0.01449584960937500000f,
+ 0.01336669921875000200f, -0.00717163085937500000f,
+ 0.00317382812500000040f, 0.00418090820312500000f,
+ 0.00064086914062500000f, -0.00015258789062500000f,
+ -0.00915527343750000000f, -0.01428222656250000000f,
+ 0.01589965820312500000f, -0.01058959960937500000f,
+ 0.00518798828125000000f, -0.00610351562500000000f,
+ -0.00668334960937500090f, 0.00939941406250000000f,
+ -0.00372314453125000000f, -0.00405883789062500000f,
+ 0.00668334960937500090f, -0.00048828125000000000f,
+ 0.01095581054687500000f, 0.01257324218750000000f,
+ -0.00271606445312500000f, -0.00338745117187500000f,
+ 0.00146484375000000000f, 0.00982666015625000000f,
+ 0.00433349609375000000f, 0.00540161132812500090f,
+ -0.00872802734375000000f, -0.00387573242187500000f,
+ -0.00119018554687500000f, -0.00192260742187500000f,
+ -0.00128173828125000000f, -0.01376342773437500000f,
+ 0.00488281250000000000f, 0.00939941406250000000f,
+ -0.00173950195312500000f, 0.00588989257812500000f,
+ -0.00146484375000000000f, 0.00225830078125000000f,
+ -0.01055908203125000000f, 0.00180053710937500000f,
+ -0.00082397460937500000f, 0.00082397460937500000f,
+ -0.01431274414062499800f, -0.00845336914062500000f,
+ -0.01049804687500000000f, 0.00860595703125000000f,
+ 0.00799560546875000000f, 0.00372314453125000000f,
+ 0.00521850585937500000f, -0.00759887695312500000f,
+ 0.00082397460937500000f, 0.00787353515625000000f,
+ 0.00573730468750000000f, -0.00009155273437500000f,
+ 0.00204467773437500000f, -0.00628662109375000000f,
+ -0.00866699218750000000f, 0.00888061523437500000f,
+ -0.00357055664062500000f, -0.00268554687499999960f,
+ -0.01455688476562500000f, 0.01144409179687500000f,
+ 0.00152587890625000000f, 0.00323486328125000000f,
+ 0.00302124023437500040f, -0.00555419921875000000f,
+ 0.01336669921875000200f, -0.01147460937500000000f,
+ -0.01223754882812500000f, -0.00149536132812500000f,
+ 0.00363159179687500000f, -0.00070190429687500000f,
+ -0.00030517578125000000f, -0.00146484375000000000f,
+ -0.00354003906250000000f, -0.00610351562500000000f,
+ -0.00946044921875000000f, 0.00369262695312500000f,
+ 0.00222778320312500000f, 0.00021362304687500000f,
+ 0.00723266601562500000f, -0.00689697265625000000f,
+ 0.00424194335937500000f, -0.01391601562500000000f,
+ 0.01211547851562500000f, 0.00106811523437500000f,
+ 0.00009155273437500000f, -0.00329589843750000000f,
+ 0.00985717773437500000f, -0.00228881835937500000f,
+ 0.01013183593750000200f, 0.00604248046875000090f,
+ -0.00302124023437500040f, -0.00064086914062500000f
+};
+
+const SKP_Silk_NLSF_CBS_FLP SKP_Silk_NLSF_CB1_10_Stage_info_FLP[ NLSF_MSVQ_CB1_10_STAGES ] =
+{
+ { 32, &SKP_Silk_NLSF_MSVQ_CB1_10[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates[ 0 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10[ 10 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates[ 32 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10[ 10 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates[ 40 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10[ 10 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates[ 48 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10[ 10 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates[ 56 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates[ 64 ] }
+};
+
+const SKP_Silk_NLSF_CB_FLP SKP_Silk_NLSF_CB1_10_FLP =
+{
+ NLSF_MSVQ_CB1_10_STAGES,
+ SKP_Silk_NLSF_CB1_10_Stage_info_FLP,
+ SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min,
+ SKP_Silk_NLSF_MSVQ_CB1_10_CDF,
+ SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_tables_NLSF_CB1_16_FLP.c
@@ -1,0 +1,973 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 7.14 kB */
+/**********************************************/
+
+#include "SKP_Silk_tables_FLP.h"
+#include "SKP_Silk_tables_NLSF_CB1_16.h"
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB1_16_rates[ NLSF_MSVQ_CB1_16_VECTORS ] =
+{
+ 1.78125000000000000000f, 3.06250000000000000000f,
+ 4.15625000000000000000f, 4.18750000000000000000f,
+ 4.31250000000000000000f, 4.50000000000000000000f,
+ 4.53125000000000000000f, 4.59375000000000000000f,
+ 4.75000000000000000000f, 5.53125000000000000000f,
+ 5.53125000000000000000f, 5.56250000000000000000f,
+ 5.65625000000000000000f, 5.71875000000000000000f,
+ 5.75000000000000000000f, 6.31250000000000000000f,
+ 6.43750000000000000000f, 6.71875000000000000000f,
+ 6.81250000000000000000f, 6.93750000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 7.09375000000000000000f, 7.09375000000000000000f,
+ 1.18750000000000000000f, 2.71875000000000000000f,
+ 3.03125000000000000000f, 3.71875000000000000000f,
+ 4.00000000000000000000f, 4.21875000000000000000f,
+ 4.37500000000000000000f, 4.46875000000000000000f,
+ 1.25000000000000000000f, 2.53125000000000000000f,
+ 3.34375000000000000000f, 3.34375000000000000000f,
+ 4.03125000000000000000f, 4.18750000000000000000f,
+ 4.18750000000000000000f, 4.46875000000000000000f,
+ 0.96875000000000000000f, 3.40625000000000000000f,
+ 3.56250000000000000000f, 3.75000000000000000000f,
+ 4.00000000000000000000f, 4.06250000000000000000f,
+ 4.09375000000000000000f, 4.12500000000000000000f,
+ 1.34375000000000000000f, 1.90625000000000000000f,
+ 3.87500000000000000000f, 3.90625000000000000000f,
+ 4.12500000000000000000f, 4.25000000000000000000f,
+ 4.40625000000000000000f, 4.43750000000000000000f,
+ 0.93750000000000000000f, 3.43750000000000000000f,
+ 3.68750000000000000000f, 3.75000000000000000000f,
+ 4.03125000000000000000f, 4.09375000000000000000f,
+ 4.15625000000000000000f, 4.15625000000000000000f,
+ 0.96875000000000000000f, 3.37500000000000000000f,
+ 3.59375000000000000000f, 3.78125000000000000000f,
+ 3.87500000000000000000f, 4.06250000000000000000f,
+ 4.15625000000000000000f, 4.28125000000000000000f,
+ 1.25000000000000000000f, 3.06250000000000000000f,
+ 3.59375000000000000000f, 3.59375000000000000000f,
+ 3.62500000000000000000f, 3.65625000000000000000f,
+ 3.84375000000000000000f, 3.87500000000000000000f,
+ 1.56250000000000000000f, 2.90625000000000000000f,
+ 3.37500000000000000000f, 3.43750000000000000000f,
+ 3.50000000000000000000f, 3.50000000000000000000f,
+ 3.56250000000000000000f, 3.59375000000000000000f,
+ 2.28125000000000000000f, 2.96875000000000000000f,
+ 2.96875000000000000000f, 3.00000000000000000000f,
+ 3.00000000000000000000f, 3.28125000000000000000f,
+ 3.34375000000000000000f, 3.43750000000000000000f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min[ 16 + 1 ] =
+{
+ 0.00451660156250000000f,
+ 0.00009155273437500000f,
+ 0.00183105468749999980f,
+ 0.00207519531250000000f,
+ 0.00357055664062500000f,
+ 0.00262451171875000000f,
+ 0.00369262695312500000f,
+ 0.00378417968750000000f,
+ 0.00463867187500000000f,
+ 0.00466918945312500000f,
+ 0.00631713867187499910f,
+ 0.00460815429687500000f,
+ 0.00686645507812500000f,
+ 0.00729370117187499910f,
+ 0.00384521484375000000f,
+ 0.00558471679687500000f,
+ 0.02416992187500000300f
+};
+
+const SKP_float SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * NLSF_MSVQ_CB1_16_VECTORS ] =
+{
+ 0.03994750976562499300f, 0.09338378906250000000f,
+ 0.15475463867187500000f, 0.21350097656250000000f,
+ 0.27551269531250000000f, 0.33380126953125000000f,
+ 0.39471435546875000000f, 0.45443725585937500000f,
+ 0.51675415039062500000f, 0.57537841796875000000f,
+ 0.63452148437500000000f, 0.69470214843750000000f,
+ 0.75540161132812500000f, 0.81356811523437500000f,
+ 0.87359619140625000000f, 0.93081665039062500000f,
+ 0.03857421875000000000f, 0.08377075195312498600f,
+ 0.14068603515625000000f, 0.19555664062500000000f,
+ 0.25286865234375000000f, 0.30648803710937500000f,
+ 0.36877441406250000000f, 0.43054199218750000000f,
+ 0.49188232421875006000f, 0.55429077148437500000f,
+ 0.61325073242187500000f, 0.67639160156250000000f,
+ 0.74047851562500000000f, 0.80310058593750000000f,
+ 0.86453247070312500000f, 0.92318725585937500000f,
+ 0.03186035156250000000f, 0.06347656250000000000f,
+ 0.11206054687500000000f, 0.15805053710937500000f,
+ 0.21789550781250003000f, 0.27770996093750000000f,
+ 0.33782958984375000000f, 0.39871215820312494000f,
+ 0.47067260742187500000f, 0.54290771484375000000f,
+ 0.60824584960937500000f, 0.67446899414062500000f,
+ 0.74127197265625000000f, 0.80447387695312500000f,
+ 0.86972045898437500000f, 0.92828369140625000000f,
+ 0.03451538085937500000f, 0.07556152343750000000f,
+ 0.13665771484375000000f, 0.18765258789062500000f,
+ 0.24114990234375000000f, 0.30136108398437500000f,
+ 0.36431884765624994000f, 0.42141723632812500000f,
+ 0.48428344726562500000f, 0.54107666015625000000f,
+ 0.60876464843750000000f, 0.66244506835937500000f,
+ 0.72512817382812500000f, 0.77926635742187500000f,
+ 0.83697509765625000000f, 0.88247680664062500000f,
+ 0.03173828125000000000f, 0.06115722656250000000f,
+ 0.12286376953125000000f, 0.18615722656250000000f,
+ 0.25732421875000000000f, 0.32025146484375000000f,
+ 0.38482666015625000000f, 0.44842529296875000000f,
+ 0.51260375976562500000f, 0.57296752929687500000f,
+ 0.63473510742187500000f, 0.69525146484375000000f,
+ 0.75598144531250000000f, 0.81427001953125000000f,
+ 0.87374877929687511000f, 0.93127441406250000000f,
+ 0.07049560546875000000f, 0.11633300781250001000f,
+ 0.18045043945312497000f, 0.24209594726562500000f,
+ 0.30618286132812500000f, 0.36257934570312500000f,
+ 0.42373657226562500000f, 0.48211669921875000000f,
+ 0.54171752929687500000f, 0.59741210937500000000f,
+ 0.65557861328125000000f, 0.71032714843750000000f,
+ 0.76773071289062500000f, 0.82427978515624989000f,
+ 0.87991333007812500000f, 0.93453979492187500000f,
+ 0.03826904296875000000f, 0.08688354492187500000f,
+ 0.15298461914062500000f, 0.20693969726562500000f,
+ 0.26324462890625000000f, 0.31646728515625000000f,
+ 0.38836669921875000000f, 0.44656372070312500000f,
+ 0.49685668945312494000f, 0.54479980468750000000f,
+ 0.60638427734375000000f, 0.65527343749999989000f,
+ 0.70196533203124989000f, 0.75161743164062500000f,
+ 0.81512451171875000000f, 0.85327148437500000000f,
+ 0.04479980468750000000f, 0.09335327148437500000f,
+ 0.15219116210937500000f, 0.21441650390625000000f,
+ 0.26675415039062500000f, 0.31774902343750000000f,
+ 0.37478637695312500000f, 0.42785644531250000000f,
+ 0.48736572265625000000f, 0.54086303710937500000f,
+ 0.59936523437500000000f, 0.65679931640625000000f,
+ 0.71630859375000000000f, 0.78311157226562500000f,
+ 0.85406494140625000000f, 0.92239379882812500000f,
+ 0.06625366210937500000f, 0.10882568359375000000f,
+ 0.17105102539062497000f, 0.22534179687500000000f,
+ 0.28698730468750000000f, 0.34240722656249994000f,
+ 0.39764404296875000000f, 0.45037841796875000000f,
+ 0.50924682617187500000f, 0.56204223632812500000f,
+ 0.62091064453125000000f, 0.67416381835937511000f,
+ 0.73410034179687489000f, 0.79992675781250000000f,
+ 0.86535644531250000000f, 0.92764282226562500000f,
+ 0.07351684570312500000f, 0.14270019531250000000f,
+ 0.23019409179687497000f, 0.29864501953125000000f,
+ 0.34848022460937500000f, 0.39474487304687500000f,
+ 0.43847656250000006000f, 0.47769165039062500000f,
+ 0.52996826171875000000f, 0.57809448242187500000f,
+ 0.63360595703125000000f, 0.68594360351562511000f,
+ 0.74584960937500000000f, 0.80343627929687500000f,
+ 0.86315917968750000000f, 0.92291259765625000000f,
+ 0.07183837890625000000f, 0.12884521484375000000f,
+ 0.20812988281250003000f, 0.27792358398437500000f,
+ 0.35388183593749994000f, 0.42523193359375000000f,
+ 0.48745727539062494000f, 0.53961181640625000000f,
+ 0.58465576171875000000f, 0.62612915039062500000f,
+ 0.67111206054687500000f, 0.71472167968750000000f,
+ 0.76837158203125000000f, 0.82202148437499989000f,
+ 0.87872314453125000000f, 0.93161010742187511000f,
+ 0.04037475585937500000f, 0.07366943359375000000f,
+ 0.12768554687500000000f, 0.18429565429687500000f,
+ 0.22991943359375000000f, 0.28680419921875000000f,
+ 0.33871459960937500000f, 0.39968872070312500000f,
+ 0.45162963867187500000f, 0.50204467773437500000f,
+ 0.56256103515625000000f, 0.63742065429687500000f,
+ 0.71685791015624989000f, 0.78851318359375011000f,
+ 0.85589599609374989000f, 0.92239379882812500000f,
+ 0.04153442382812500700f, 0.09896850585937500000f,
+ 0.18457031250000000000f, 0.25973510742187500000f,
+ 0.33572387695312500000f, 0.40115356445312500000f,
+ 0.45999145507812500000f, 0.50683593750000000000f,
+ 0.55316162109375000000f, 0.59146118164062500000f,
+ 0.63818359375000000000f, 0.68991088867187500000f,
+ 0.75256347656250011000f, 0.81384277343750000000f,
+ 0.87472534179687500000f, 0.93280029296875000000f,
+ 0.03710937500000000000f, 0.08081054687500000000f,
+ 0.18008422851562503000f, 0.25701904296875000000f,
+ 0.30630493164062500000f, 0.34866333007812500000f,
+ 0.39590454101562500000f, 0.44564819335937500000f,
+ 0.50921630859375000000f, 0.56762695312500000000f,
+ 0.62728881835937500000f, 0.68405151367187500000f,
+ 0.74615478515625000000f, 0.80200195312500000000f,
+ 0.86077880859375000000f, 0.91787719726562500000f,
+ 0.07376098632812500000f, 0.12353515625000000000f,
+ 0.19274902343750000000f, 0.25735473632812500000f,
+ 0.32073974609375000000f, 0.38931274414062494000f,
+ 0.45996093750000006000f, 0.52780151367187500000f,
+ 0.59732055664062500000f, 0.65621948242187489000f,
+ 0.71194458007812500000f, 0.75628662109375011000f,
+ 0.80062866210937489000f, 0.84500122070312500000f,
+ 0.89154052734375000000f, 0.94052124023437500000f,
+ 0.03088378906250000000f, 0.07156372070312500000f,
+ 0.15231323242187500000f, 0.22512817382812503000f,
+ 0.28884887695312500000f, 0.36364746093750000000f,
+ 0.43627929687500000000f, 0.50555419921875000000f,
+ 0.56982421875000000000f, 0.62695312500000000000f,
+ 0.68029785156250000000f, 0.72747802734375000000f,
+ 0.77560424804687511000f, 0.82550048828125011000f,
+ 0.88037109375000000000f, 0.93234252929687500000f,
+ 0.05911254882812500000f, 0.11270141601562500000f,
+ 0.19125366210937500000f, 0.24472045898437500000f,
+ 0.31652832031250000000f, 0.37213134765625000000f,
+ 0.43600463867187494000f, 0.47781372070312500000f,
+ 0.53195190429687500000f, 0.57568359375000000000f,
+ 0.63381958007812500000f, 0.67767333984375000000f,
+ 0.73355102539062500000f, 0.77706909179687489000f,
+ 0.83566284179687500000f, 0.87286376953125000000f,
+ 0.06008911132812500000f, 0.10086059570312500000f,
+ 0.15310668945312500000f, 0.20526123046875000000f,
+ 0.25558471679687500000f, 0.30496215820312500000f,
+ 0.35504150390625000000f, 0.40527343750000000000f,
+ 0.46014404296875000000f, 0.51119995117187500000f,
+ 0.56347656250000000000f, 0.61398315429687500000f,
+ 0.67013549804687500000f, 0.72808837890625000000f,
+ 0.80029296875000011000f, 0.89410400390625011000f,
+ 0.03656005859375000000f, 0.08078002929687500000f,
+ 0.16564941406250000000f, 0.22653198242187500000f,
+ 0.29830932617187500000f, 0.37094116210937500000f,
+ 0.44754028320312500000f, 0.49877929687500000000f,
+ 0.55300903320312500000f, 0.60394287109375000000f,
+ 0.65786743164062489000f, 0.69723510742187500000f,
+ 0.74719238281250011000f, 0.78558349609375000000f,
+ 0.84347534179687500000f, 0.87619018554687500000f,
+ 0.04992675781250000000f, 0.10232543945312500000f,
+ 0.16622924804687500000f, 0.23184204101562503000f,
+ 0.30020141601562500000f, 0.35543823242187500000f,
+ 0.42614746093750000000f, 0.48886108398437500000f,
+ 0.54510498046875000000f, 0.61389160156250000000f,
+ 0.68112182617187500000f, 0.73355102539062500000f,
+ 0.79241943359375000000f, 0.85711669921875011000f,
+ 0.91290283203125011000f, 0.95501708984375000000f,
+ 0.08166503906250000000f, 0.12527465820312500000f,
+ 0.19464111328125000000f, 0.25094604492187500000f,
+ 0.30694580078125000000f, 0.35244750976562500000f,
+ 0.39892578124999994000f, 0.44107055664062494000f,
+ 0.48693847656249994000f, 0.52963256835937500000f,
+ 0.57772827148437500000f, 0.62261962890625000000f,
+ 0.67697143554687500000f, 0.72888183593750000000f,
+ 0.78482055664062500000f, 0.84603881835937500000f,
+ 0.04190063476562500000f, 0.07913208007812500000f,
+ 0.13577270507812500000f, 0.17190551757812500000f,
+ 0.22277832031250000000f, 0.25711059570312500000f,
+ 0.28912353515625000000f, 0.33013916015625000000f,
+ 0.38967895507812500000f, 0.47979736328125006000f,
+ 0.57989501953125000000f, 0.65396118164062500000f,
+ 0.72271728515625000000f, 0.79113769531250000000f,
+ 0.85861206054687500000f, 0.92568969726562500000f,
+ 0.04870605468750000000f, 0.09713745117187500000f,
+ 0.16412353515625003000f, 0.21862792968750000000f,
+ 0.26458740234375000000f, 0.30838012695312500000f,
+ 0.35003662109375000000f, 0.39166259765625000000f,
+ 0.42697143554687500000f, 0.45904541015624994000f,
+ 0.50787353515625000000f, 0.54635620117187500000f,
+ 0.63351440429687500000f, 0.77157592773437500000f,
+ 0.84747314453125000000f, 0.92285156249999989000f,
+ 0.06216430664062500000f, 0.12167358398437500000f,
+ 0.19033813476562500000f, 0.24771118164062500000f,
+ 0.30377197265625000000f, 0.37368774414062500000f,
+ 0.43386840820312500000f, 0.48498535156250000000f,
+ 0.54244995117187500000f, 0.61383056640625000000f,
+ 0.68096923828125000000f, 0.79168701171875000000f,
+ 0.80276489257812500000f, 0.80819702148437500000f,
+ 0.81774902343750000000f, 0.87161254882812500000f,
+ 0.06655883789062500000f, 0.11773681640625000000f,
+ 0.17578125000000000000f, 0.24182128906250000000f,
+ 0.30642700195312500000f, 0.35330200195312500000f,
+ 0.42019653320312494000f, 0.47912597656250000000f,
+ 0.53189086914062500000f, 0.60665893554687500000f,
+ 0.71969604492187500000f, 0.74884033203125000000f,
+ 0.76940917968750000000f, 0.78408813476562511000f,
+ 0.87548828125000000000f, 0.93099975585937489000f,
+ 0.06079101562500000000f, 0.11846923828125000000f,
+ 0.19757080078125000000f, 0.24057006835937503000f,
+ 0.28628540039062500000f, 0.38671875000000006000f,
+ 0.43762207031250000000f, 0.47915649414062500000f,
+ 0.50836181640625000000f, 0.54418945312500000000f,
+ 0.63629150390625000000f, 0.69839477539062500000f,
+ 0.75308227539062511000f, 0.80740356445312500000f,
+ 0.86947631835937500000f, 0.92956542968750000000f,
+ 0.07296752929687500000f, 0.12170410156250000000f,
+ 0.16625976562500000000f, 0.22680664062500000000f,
+ 0.33612060546875000000f, 0.38388061523437500000f,
+ 0.40100097656250000000f, 0.43170166015625000000f,
+ 0.48516845703125006000f, 0.56738281250000000000f,
+ 0.64404296875000000000f, 0.70169067382812500000f,
+ 0.75296020507812500000f, 0.82965087890624989000f,
+ 0.85882568359375000000f, 0.90368652343750000000f,
+ 0.05227661132812500000f, 0.15570068359375000000f,
+ 0.21328735351562500000f, 0.23797607421875000000f,
+ 0.26458740234375000000f, 0.30853271484375000000f,
+ 0.38897705078125000000f, 0.45413208007812500000f,
+ 0.50991821289062500000f, 0.56173706054687500000f,
+ 0.61419677734375000000f, 0.67465209960937500000f,
+ 0.73794555664062500000f, 0.79949951171874989000f,
+ 0.86172485351562500000f, 0.91970825195312500000f,
+ 0.04919433593750000000f, 0.11038208007812500000f,
+ 0.18762207031250000000f, 0.25509643554687500000f,
+ 0.29223632812500000000f, 0.35180664062500006000f,
+ 0.45581054687500000000f, 0.54348754882812500000f,
+ 0.55807495117187500000f, 0.57156372070312500000f,
+ 0.57986450195312500000f, 0.64425659179687500000f,
+ 0.75167846679687500000f, 0.81164550781250000000f,
+ 0.87707519531250000000f, 0.93515014648437500000f,
+ 0.06915283203125000000f, 0.12719726562500000000f,
+ 0.23992919921875000000f, 0.29132080078125000000f,
+ 0.29351806640625000000f, 0.29611206054687500000f,
+ 0.30926513671875000000f, 0.42410278320312500000f,
+ 0.49636840820312500000f, 0.56250000000000000000f,
+ 0.62826538085937500000f, 0.68984985351562500000f,
+ 0.75543212890625000000f, 0.82379150390625000000f,
+ 0.88882446289062511000f, 0.94116210937500000000f,
+ 0.05615234375000000700f, 0.11953735351562501000f,
+ 0.19140625000000000000f, 0.23831176757812500000f,
+ 0.29644775390625000000f, 0.34906005859375000000f,
+ 0.42013549804687500000f, 0.48214721679687500000f,
+ 0.58728027343750000000f, 0.67053222656250000000f,
+ 0.70129394531250000000f, 0.70739746093750000000f,
+ 0.72396850585937489000f, 0.78277587890625000000f,
+ 0.88858032226562500000f, 0.94863891601562500000f,
+ 0.04449462890625000000f, 0.11022949218750000000f,
+ 0.18334960937500000000f, 0.22851562500000000000f,
+ 0.29989624023437500000f, 0.36294555664062500000f,
+ 0.42987060546875000000f, 0.48016357421875000000f,
+ 0.53222656250000000000f, 0.59616088867187500000f,
+ 0.68432617187500000000f, 0.75582885742187500000f,
+ 0.89251708984375000000f, 0.91333007812499989000f,
+ 0.93127441406250000000f, 0.94442749023437489000f,
+ -0.00311279296875000000f, -0.00369262695312500000f,
+ -0.00094604492187500000f, -0.00018310546875000000f,
+ 0.00015258789062500000f, -0.00006103515625000000f,
+ 0.00024414062500000000f, -0.00054931640625000000f,
+ -0.00012207031250000000f, 0.00018310546875000000f,
+ 0.00042724609375000000f, -0.00006103515625000000f,
+ -0.00036621093750000000f, -0.00048828125000000000f,
+ -0.00036621093750000000f, -0.00183105468749999980f,
+ -0.00384521484375000000f, -0.01077270507812500000f,
+ -0.01751708984375000000f, -0.02066040039062500000f,
+ -0.02005004882812500000f, -0.01882934570312500000f,
+ -0.01519775390625000000f, -0.01199340820312500000f,
+ -0.01062011718750000000f, -0.00845336914062500000f,
+ -0.00686645507812500000f, -0.00500488281250000000f,
+ -0.00311279296875000000f, -0.00213623046875000000f,
+ -0.00094604492187500000f, 0.00100708007812500000f,
+ 0.00012207031250000000f, 0.01156616210937500000f,
+ 0.01181030273437500000f, 0.01681518554687500000f,
+ 0.01846313476562500000f, 0.01892089843750000000f,
+ 0.01623535156250000000f, 0.01470947265625000200f,
+ 0.01348876953125000000f, 0.01385498046875000000f,
+ 0.01174926757812500200f, 0.01058959960937500000f,
+ 0.00982666015625000000f, 0.00912475585937500000f,
+ 0.00811767578125000000f, 0.00610351562500000000f,
+ 0.03564453125000000000f, 0.02902221679687500000f,
+ 0.02050781250000000000f, 0.00750732421875000000f,
+ 0.00183105468749999980f, -0.00491333007812500000f,
+ -0.00790405273437500000f, -0.00714111328125000000f,
+ -0.00772094726562500000f, -0.00860595703125000000f,
+ -0.00619506835937500000f, -0.00570678710937500090f,
+ -0.00473022460937500000f, -0.00537109374999999910f,
+ -0.00604248046875000090f, -0.00543212890625000000f,
+ 0.00030517578125000000f, 0.00518798828125000000f,
+ 0.01199340820312500000f, 0.01858520507812500000f,
+ 0.01693725585937500000f, 0.00634765625000000090f,
+ -0.01007080078124999800f, -0.01742553710937500000f,
+ -0.02346801757812500000f, -0.01931762695312500000f,
+ -0.00973510742187500000f, -0.00131225585937500000f,
+ 0.00289916992187500000f, 0.00320434570312500000f,
+ 0.00323486328125000000f, 0.00354003906250000000f,
+ -0.00463867187500000000f, -0.00427246093750000000f,
+ -0.00381469726562499960f, 0.00015258789062500000f,
+ 0.00527954101562500000f, 0.00836181640625000000f,
+ 0.00805664062500000000f, 0.01010131835937500000f,
+ -0.00112915039062500000f, -0.00894165039062500000f,
+ -0.01858520507812500000f, -0.02398681640625000000f,
+ -0.02926635742187500000f, -0.02484130859375000300f,
+ -0.01968383789062500000f, -0.00726318359375000000f,
+ -0.00277709960937500000f, 0.00109863281250000000f,
+ -0.00033569335937499995f, -0.00308227539062500000f,
+ -0.00851440429687500000f, -0.00692749023437500000f,
+ -0.00122070312500000000f, 0.00274658203125000000f,
+ 0.01617431640625000000f, 0.02066040039062500000f,
+ 0.02716064453125000000f, 0.03369140625000000000f,
+ 0.03048706054687500000f, 0.02548217773437500000f,
+ 0.01721191406250000000f, 0.00900268554687500000f,
+ -0.00854492187500000000f, -0.01110839843750000000f,
+ -0.01037597656250000000f, -0.01010131835937500000f,
+ -0.00866699218750000000f, 0.00878906250000000000f,
+ 0.02322387695312500000f, 0.02685546875000000000f,
+ 0.03015136718750000000f, 0.01913452148437500000f,
+ 0.00445556640625000000f, -0.00689697265625000000f,
+ -0.00619506835937500000f, -0.00552368164062500000f,
+ -0.00433349609375000000f, 0.00119018554687500000f,
+ 0.00073242187500000000f, -0.00079345703125000011f,
+ -0.00326538085937500000f, -0.00280761718750000000f,
+ -0.00491333007812500000f, -0.00411987304687500000f,
+ -0.00399780273437500000f, -0.00268554687499999960f,
+ -0.00488281250000000000f, -0.00476074218750000000f,
+ -0.00228881835937500000f, -0.00131225585937500000f,
+ -0.00109863281250000000f, -0.00018310546875000000f,
+ -0.00100708007812500000f, 0.00100708007812500000f,
+ -0.00988769531250000000f, -0.01266479492187500000f,
+ -0.00329589843750000000f, 0.00378417968750000000f,
+ 0.00479125976562500000f, 0.00582885742187500000f,
+ 0.00619506835937500000f, 0.00601196289062499910f,
+ 0.00439453125000000000f, 0.00332641601562499960f,
+ 0.00463867187500000000f, 0.00537109374999999910f,
+ 0.00579833984375000000f, 0.00372314453125000000f,
+ 0.00308227539062500000f, 0.00485229492187500000f,
+ 0.02023315429687500000f, 0.02038574218750000000f,
+ 0.01464843749999999800f, 0.01220703125000000000f,
+ 0.01156616210937500000f, 0.01354980468750000000f,
+ 0.01361083984375000000f, 0.01397705078124999800f,
+ 0.01046752929687500200f, 0.01071166992187500000f,
+ 0.00946044921875000000f, 0.00695800781250000000f,
+ 0.00405883789062500000f, 0.00134277343749999980f,
+ 0.00228881835937500000f, 0.00192260742187500000f,
+ -0.00256347656250000000f, 0.00119018554687500000f,
+ -0.00088500976562500000f, 0.00106811523437500000f,
+ -0.00286865234375000000f, -0.00711059570312500000f,
+ -0.00796508789062500000f, -0.01080322265625000200f,
+ 0.00234985351562500000f, 0.00799560546875000000f,
+ -0.00073242187500000000f, -0.00442504882812500000f,
+ -0.01016235351562500000f, -0.01248168945312500000f,
+ -0.01232910156250000000f, -0.01821899414062500000f,
+ -0.01489257812500000000f, -0.00915527343750000000f,
+ 0.02777099609375000000f, 0.01806640625000000000f,
+ 0.01257324218750000000f, 0.00366210937499999960f,
+ 0.00396728515625000000f, -0.00155639648437500000f,
+ -0.00112915039062500000f, -0.00234985351562500000f,
+ -0.00524902343750000000f, -0.00552368164062500000f,
+ -0.00485229492187500000f, -0.00451660156250000000f,
+ -0.00219726562500000000f, -0.00189208984375000000f,
+ 0.01556396484375000000f, 0.01574707031250000000f,
+ 0.00344848632812500000f, -0.01785278320312500000f,
+ -0.03280639648437500000f, -0.02920532226562500000f,
+ -0.01272583007812500000f, -0.00595092773437500000f,
+ 0.00027465820312500000f, 0.00021362304687500000f,
+ -0.00268554687499999960f, -0.00527954101562500000f,
+ -0.00277709960937500000f, 0.00164794921875000000f,
+ 0.00299072265625000000f, 0.00289916992187500000f,
+ -0.00085449218750000000f, 0.00601196289062499910f,
+ -0.01608276367187500000f, -0.01895141601562500000f,
+ 0.00479125976562500000f, 0.00372314453125000000f,
+ -0.00512695312500000000f, 0.00448608398437500000f,
+ 0.00942993164062500000f, 0.00915527343750000000f,
+ 0.01025390625000000000f, 0.00961303710937500000f,
+ 0.01208496093750000200f, 0.01245117187500000000f,
+ 0.01147460937500000000f, 0.00323486328125000000f,
+ -0.00494384765625000000f, -0.00518798828125000000f,
+ -0.00961303710937500000f, 0.00299072265625000000f,
+ 0.02505493164062499700f, 0.02770996093750000000f,
+ 0.01739501953125000000f, -0.00100708007812500000f,
+ -0.00952148437500000000f, -0.01733398437500000000f,
+ -0.01745605468750000000f, -0.01153564453125000000f,
+ -0.00326538085937500000f, 0.00070190429687500000f,
+ 0.00476074218750000000f, 0.00283813476562499960f,
+ -0.00393676757812500000f, -0.00265502929687500000f,
+ 0.00061035156250000000f, -0.00219726562500000000f,
+ -0.00112915039062500000f, 0.00122070312500000000f,
+ 0.00064086914062500000f, 0.00082397460937500000f,
+ 0.00146484375000000000f, 0.00228881835937500000f,
+ 0.00234985351562500000f, 0.00198364257812500000f,
+ 0.00140380859375000000f, 0.00216674804687500000f,
+ 0.00201416015625000000f, 0.00143432617187500000f,
+ 0.00415039062500000000f, 0.01049804687500000000f,
+ 0.00720214843750000000f, 0.00982666015625000000f,
+ 0.00518798828125000000f, 0.00863647460937500000f,
+ 0.00820922851562500000f, 0.00888061523437500000f,
+ 0.00494384765625000000f, -0.00131225585937500000f,
+ -0.00622558593750000000f, -0.00790405273437500000f,
+ -0.00732421874999999910f, -0.00930786132812500000f,
+ -0.01068115234374999800f, -0.00952148437500000000f,
+ 0.01364135742187499800f, 0.01062011718750000000f,
+ 0.01052856445312500000f, 0.00784301757812500000f,
+ 0.00216674804687500000f, -0.00399780273437500000f,
+ -0.00234985351562500000f, -0.00579833984375000000f,
+ -0.00616455078125000000f, -0.00122070312500000000f,
+ 0.00106811523437500000f, 0.00405883789062500000f,
+ 0.00796508789062500000f, 0.01113891601562500000f,
+ 0.01336669921875000200f, 0.00924682617187500000f,
+ -0.00024414062500000000f, 0.00067138671874999989f,
+ 0.00427246093750000000f, 0.00418090820312500000f,
+ -0.00915527343750000000f, -0.01956176757812500000f,
+ -0.02331542968750000000f, -0.00817871093750000000f,
+ -0.00070190429687500000f, -0.00076293945312500000f,
+ 0.00222778320312500000f, -0.00494384765625000000f,
+ -0.00457763671875000000f, -0.00646972656250000000f,
+ -0.00219726562500000000f, 0.00018310546875000000f,
+ 0.00119018554687500000f, 0.00238037109375000000f,
+ 0.00317382812500000040f, -0.00283813476562499960f,
+ -0.00939941406250000000f, -0.00415039062500000000f,
+ 0.00357055664062500000f, -0.00216674804687500000f,
+ -0.01565551757812500000f, -0.02502441406250000000f,
+ -0.02136230468749999700f, -0.01373291015625000000f,
+ -0.00491333007812500000f, -0.00070190429687500000f,
+ 0.00088500976562500000f, 0.00238037109375000000f,
+ 0.01028442382812500000f, 0.00323486328125000000f,
+ -0.01239013671875000000f, -0.02386474609375000000f,
+ -0.00341796875000000000f, 0.00711059570312500000f,
+ 0.01168823242187499800f, 0.00189208984375000000f,
+ -0.00384521484375000000f, 0.00018310546875000000f,
+ -0.00234985351562500000f, -0.00088500976562500000f,
+ -0.00445556640625000000f, -0.00375366210937500000f,
+ -0.00155639648437500000f, -0.00082397460937500000f,
+ -0.00082397460937500000f, -0.01162719726562500000f,
+ -0.01956176757812500000f, 0.01226806640625000000f,
+ 0.01644897460937500000f, 0.00024414062500000000f,
+ -0.00631713867187499910f, -0.01116943359375000000f,
+ -0.00109863281250000000f, -0.00082397460937500000f,
+ -0.00622558593750000000f, -0.00692749023437500000f,
+ -0.00723266601562500000f, -0.00576782226562500000f,
+ -0.00195312500000000000f, 0.00155639648437500000f,
+ -0.00280761718750000000f, -0.00418090820312500000f,
+ -0.00857543945312500000f, 0.00189208984375000000f,
+ 0.00711059570312500000f, 0.00280761718750000000f,
+ 0.00451660156250000000f, 0.00897216796875000000f,
+ 0.01107788085937500200f, 0.01269531250000000200f,
+ 0.01721191406250000000f, 0.01907348632812500000f,
+ 0.01129150390625000000f, -0.00109863281250000000f,
+ -0.01431274414062499800f, -0.01409912109375000000f,
+ 0.00311279296875000000f, 0.00512695312500000000f,
+ 0.00097656250000000000f, 0.00357055664062500000f,
+ -0.00064086914062500000f, 0.00296020507812500000f,
+ 0.00424194335937500000f, 0.00271606445312500000f,
+ 0.00317382812500000040f, 0.00106811523437500000f,
+ 0.00012207031250000000f, 0.00250244140625000000f,
+ 0.00201416015625000000f, 0.00177001953125000000f,
+ 0.00222778320312500000f, 0.00283813476562499960f,
+ -0.00231933593750000000f, -0.00976562500000000000f,
+ -0.00720214843750000000f, -0.00576782226562500000f,
+ -0.00619506835937500000f, -0.00433349609375000000f,
+ -0.00082397460937500000f, -0.00222778320312500000f,
+ 0.00027465820312500000f, -0.00027465820312500000f,
+ -0.00076293945312500000f, 0.00036621093750000000f,
+ -0.00045776367187499995f, 0.00012207031250000000f,
+ 0.00012207031250000000f, -0.00152587890625000000f,
+ 0.00958251953125000000f, 0.00549316406250000000f,
+ 0.00494384765625000000f, -0.00149536132812500000f,
+ 0.00607299804687500000f, -0.00329589843750000000f,
+ -0.00692749023437500000f, -0.00201416015625000000f,
+ -0.01364135742187499800f, -0.00204467773437500000f,
+ -0.00805664062500000000f, -0.01202392578124999800f,
+ 0.00015258789062500000f, 0.00167846679687500000f,
+ -0.00405883789062500000f, -0.00537109374999999910f,
+ -0.00354003906250000000f, -0.00735473632812500090f,
+ 0.00830078125000000000f, 0.00332641601562499960f,
+ 0.00860595703125000000f, 0.00799560546875000000f,
+ 0.00585937500000000000f, -0.00195312500000000000f,
+ -0.01196289062500000000f, -0.01568603515625000000f,
+ 0.00476074218750000000f, 0.00619506835937500000f,
+ 0.00469970703125000000f, 0.00219726562500000000f,
+ -0.00103759765625000000f, -0.00488281250000000000f,
+ -0.00222778320312500000f, 0.00009155273437500000f,
+ -0.00100708007812500000f, -0.01315307617187500000f,
+ 0.00979614257812500000f, 0.00054931640625000000f,
+ -0.01730346679687500000f, -0.01800537109375000000f,
+ -0.00329589843750000000f, 0.00268554687499999960f,
+ 0.00201416015625000000f, 0.00155639648437500000f,
+ -0.00094604492187500000f, -0.00588989257812500000f,
+ -0.00140380859375000000f, 0.00198364257812500000f,
+ -0.00088500976562500000f, -0.00070190429687500000f,
+ 0.00656127929687500000f, -0.00094604492187500000f,
+ 0.00308227539062500000f, -0.00344848632812500000f,
+ 0.00097656250000000000f, 0.00927734375000000000f,
+ 0.00268554687499999960f, 0.00976562500000000000f,
+ 0.01367187500000000000f, 0.00015258789062500000f,
+ -0.01339721679687500000f, -0.01715087890625000000f,
+ -0.01550292968750000000f, -0.00411987304687500000f,
+ -0.00039672851562500005f, -0.00521850585937500000f,
+ -0.00024414062500000000f, 0.00555419921875000000f,
+ -0.00302124023437500040f, -0.00552368164062500000f,
+ -0.00454711914062500000f, 0.01147460937500000000f,
+ 0.01452636718750000000f, 0.00195312500000000000f,
+ -0.01208496093750000200f, -0.01989746093750000000f,
+ -0.00457763671875000000f, 0.00537109374999999910f,
+ 0.00677490234375000000f, 0.00198364257812500000f,
+ -0.01800537109375000000f, 0.02194213867187500300f,
+ 0.00827026367187500000f, 0.01217651367187500000f,
+ 0.00747680664062500000f, 0.00219726562500000000f,
+ -0.00476074218750000000f, -0.00463867187500000000f,
+ -0.00537109374999999910f, 0.00180053710937500000f,
+ 0.00286865234375000000f, 0.00381469726562499960f,
+ -0.00027465820312500000f, -0.00021362304687500000f,
+ 0.00027465820312500000f, 0.00003051757812500000f,
+ -0.00186157226562500000f, -0.00354003906250000000f,
+ -0.00250244140625000000f, 0.00003051757812500000f,
+ 0.00241088867187500000f, 0.00067138671874999989f,
+ -0.00134277343749999980f, -0.00045776367187499995f,
+ -0.00146484375000000000f, -0.00198364257812500000f,
+ -0.00189208984375000000f, -0.00308227539062500000f,
+ -0.00311279296875000000f, -0.00164794921875000000f,
+ -0.00213623046875000000f, -0.00238037109375000000f,
+ -0.00244140625000000000f, -0.00076293945312500000f,
+ 0.01214599609375000000f, 0.00216674804687500000f,
+ 0.00424194335937500000f, 0.00115966796875000000f,
+ 0.00274658203125000000f, 0.00592041015625000000f,
+ 0.00677490234375000000f, 0.00759887695312500000f,
+ 0.00503540039062499910f, 0.00286865234375000000f,
+ 0.00674438476562500000f, 0.00799560546875000000f,
+ 0.00497436523437500000f, 0.00277709960937500000f,
+ -0.00628662109375000000f, 0.01748657226562500000f,
+ 0.00610351562500000000f, -0.00875854492187500000f,
+ -0.00448608398437500000f, 0.00015258789062500000f,
+ -0.00054931640625000000f, -0.00259399414062500000f,
+ -0.00225830078125000000f, -0.00381469726562499960f,
+ -0.00265502929687500000f, 0.00259399414062500000f,
+ 0.00430297851562500000f, 0.00012207031250000000f,
+ -0.00012207031250000000f, 0.00085449218750000000f,
+ 0.00714111328125000000f, 0.00146484375000000000f,
+ -0.00457763671875000000f, -0.00338745117187500000f,
+ -0.01544189453125000000f, 0.00723266601562500000f,
+ -0.00637817382812500090f, 0.01052856445312500000f,
+ 0.00286865234375000000f, -0.00378417968750000000f,
+ 0.00234985351562500000f, 0.00369262695312500000f,
+ 0.00436401367187500000f, 0.00036621093750000000f,
+ -0.00244140625000000000f, -0.00146484375000000000f,
+ 0.00582885742187500000f, 0.00439453125000000000f,
+ -0.00283813476562499960f, -0.00198364257812500000f,
+ -0.00460815429687500000f, -0.01962280273437500000f,
+ 0.01327514648437500000f, 0.00323486328125000000f,
+ 0.00265502929687500000f, 0.00021362304687500000f,
+ 0.00198364257812500000f, 0.00311279296875000000f,
+ 0.00286865234375000000f, 0.00207519531250000000f,
+ 0.00015258789062500000f, 0.00302124023437500040f,
+ 0.00677490234375000000f, 0.00283813476562499960f,
+ 0.00286865234375000000f, 0.01083374023437500000f,
+ -0.00039672851562500005f, -0.00271606445312500000f,
+ -0.00695800781250000000f, -0.01535034179687500000f,
+ 0.00875854492187500000f, 0.00332641601562499960f,
+ 0.00329589843750000000f, 0.01370239257812500200f,
+ 0.00772094726562500000f, -0.00088500976562500000f,
+ -0.00332641601562499960f, -0.00354003906250000000f,
+ 0.00045776367187499995f, -0.00222778320312500000f,
+ -0.00061035156250000000f, 0.00399780273437500000f,
+ -0.00448608398437500000f, 0.00219726562500000000f,
+ 0.00180053710937500000f, -0.00457763671875000000f,
+ -0.01812744140625000000f, 0.00833129882812500000f,
+ 0.00964355468750000000f, 0.00402832031250000000f,
+ 0.00607299804687500000f, 0.00323486328125000000f,
+ 0.00604248046875000090f, 0.00646972656250000000f,
+ 0.00671386718750000000f, 0.00250244140625000000f,
+ 0.00137329101562500000f, -0.00039672851562500005f,
+ 0.00680541992187500000f, 0.00418090820312500000f,
+ 0.00823974609375000000f, 0.00115966796875000000f,
+ 0.00769042968750000000f, 0.00411987304687500000f,
+ -0.00540161132812500090f, -0.00631713867187499910f,
+ -0.01098632812500000000f, -0.00311279296875000000f,
+ 0.01229858398437500000f, 0.01239013671875000000f,
+ -0.00042724609375000000f, 0.00253295898437500040f,
+ 0.00195312500000000000f, 0.00155639648437500000f,
+ -0.00021362304687500000f, -0.00302124023437500040f,
+ -0.00296020507812500000f, -0.00268554687499999960f,
+ -0.00378417968750000000f, -0.00198364257812500000f,
+ 0.00128173828125000000f, 0.00097656250000000000f,
+ 0.00085449218750000000f, 0.00088500976562500000f,
+ 0.00036621093750000000f, 0.00061035156250000000f,
+ 0.00363159179687500000f, -0.00079345703125000011f,
+ -0.00646972656250000000f, -0.00613403320312500000f,
+ 0.01138305664062500000f, 0.00765991210937500090f,
+ 0.00430297851562500000f, 0.00314331054687500000f,
+ 0.00109863281250000000f, -0.00158691406250000020f,
+ 0.00201416015625000000f, 0.00054931640625000000f,
+ -0.00018310546875000000f, -0.00289916992187500000f,
+ -0.00598144531250000000f, 0.00015258789062500000f,
+ 0.00299072265625000000f, -0.00259399414062500000f,
+ -0.00329589843750000000f, 0.00665283203124999910f,
+ -0.00500488281250000000f, 0.00061035156250000000f,
+ 0.01086425781250000000f, 0.00524902343750000000f,
+ 0.00112915039062500000f, 0.00811767578125000000f,
+ 0.00070190429687500000f, 0.00341796875000000000f,
+ -0.00073242187500000000f, -0.00302124023437500040f,
+ -0.00280761718750000000f, -0.00543212890625000000f,
+ 0.00088500976562500000f, -0.00848388671875000000f,
+ 0.01184082031250000000f, -0.00183105468749999980f,
+ -0.00671386718750000000f, 0.00915527343750000000f,
+ -0.00039672851562500005f, 0.00469970703125000000f,
+ 0.00582885742187500000f, 0.00045776367187499995f,
+ -0.00112915039062500000f, -0.00335693359375000000f,
+ -0.00466918945312500000f, -0.00457763671875000000f,
+ -0.00347900390625000000f, -0.00021362304687500000f,
+ -0.00286865234375000000f, -0.00094604492187500000f,
+ -0.00189208984375000000f, -0.00540161132812500090f,
+ 0.00012207031250000000f, -0.00213623046875000000f,
+ 0.00106811523437500000f, 0.01382446289062500000f,
+ 0.00448608398437500000f, -0.00753784179687500000f,
+ -0.01000976562500000000f, 0.00308227539062500000f,
+ 0.00061035156250000000f, -0.00347900390625000000f,
+ 0.00448608398437500000f, 0.00329589843750000000f,
+ -0.00363159179687500000f, -0.00332641601562499960f,
+ -0.00311279296875000000f, -0.00726318359375000000f,
+ 0.00167846679687500000f, -0.00311279296875000000f,
+ 0.00527954101562500000f, -0.00271606445312500000f,
+ 0.00393676757812500000f, 0.00421142578125000000f,
+ -0.01007080078124999800f, -0.00488281250000000000f,
+ 0.01480102539062500000f, 0.00469970703125000000f,
+ -0.00180053710937500000f, -0.00518798828125000000f,
+ -0.00061035156250000000f, -0.00103759765625000000f,
+ -0.00796508789062500000f, -0.00122070312500000000f,
+ -0.00393676757812500000f, 0.00234985351562500000f,
+ -0.00256347656250000000f, 0.00210571289062500000f,
+ 0.00253295898437500040f, 0.00488281250000000000f,
+ 0.00515747070312500000f, 0.00192260742187500000f,
+ -0.01574707031250000000f, 0.00091552734374999989f,
+ 0.01025390625000000000f, 0.00158691406250000020f,
+ -0.00000000000000000000f, -0.00158691406250000020f,
+ -0.00378417968750000000f, 0.00482177734375000000f,
+ 0.00057983398437500000f, 0.00601196289062499910f,
+ -0.00030517578125000000f, -0.01144409179687500000f,
+ 0.01235961914062499800f, 0.00869750976562500000f,
+ 0.00347900390625000000f, -0.01205444335937500000f,
+ -0.00143432617187500000f, 0.00598144531250000000f,
+ 0.00189208984375000000f, 0.00265502929687500000f,
+ -0.00323486328125000000f, -0.00198364257812500000f,
+ -0.00228881835937500000f, -0.00210571289062500000f,
+ -0.00039672851562500005f, 0.00103759765625000000f,
+ 0.00302124023437500040f, 0.00180053710937500000f,
+ 0.00253295898437500040f, 0.00299072265625000000f,
+ 0.00134277343749999980f, 0.00000000000000000000f,
+ 0.00073242187500000000f, 0.00054931640625000000f,
+ 0.00051879882812500000f, 0.00213623046875000000f,
+ -0.00067138671874999989f, 0.00592041015625000000f,
+ 0.00634765625000000090f, 0.00439453125000000000f,
+ -0.00241088867187500000f, -0.00045776367187499995f,
+ 0.00097656250000000000f, -0.00317382812500000040f,
+ -0.00085449218750000000f, -0.00320434570312500000f,
+ -0.00567626953124999910f, -0.00646972656250000000f,
+ -0.00695800781250000000f, -0.00241088867187500000f,
+ -0.00231933593750000000f, 0.00155639648437500000f,
+ -0.00216674804687500000f, 0.00219726562500000000f,
+ 0.00360107421875000000f, -0.00103759765625000000f,
+ -0.00009155273437500000f, -0.00521850585937500000f,
+ 0.00015258789062500000f, 0.00006103515625000000f,
+ -0.00329589843750000000f, -0.00381469726562499960f,
+ 0.00189208984375000000f, -0.00177001953125000000f,
+ 0.00177001953125000000f, -0.00369262695312500000f,
+ 0.00222778320312500000f, -0.01422119140625000000f,
+ 0.00280761718750000000f, 0.00192260742187500000f,
+ -0.00286865234375000000f, -0.00238037109375000000f,
+ -0.00231933593750000000f, 0.00646972656250000000f,
+ 0.00109863281250000000f, -0.00686645507812500000f,
+ -0.00216674804687500000f, -0.01080322265625000200f,
+ 0.00463867187500000000f, 0.00436401367187500000f,
+ -0.00241088867187500000f, -0.00750732421875000000f,
+ -0.00155639648437500000f, -0.00094604492187500000f,
+ -0.00018310546875000000f, -0.00823974609375000000f,
+ 0.00732421874999999910f, 0.00640869140625000000f,
+ 0.00091552734374999989f, -0.00479125976562500000f,
+ -0.00704956054687500000f, 0.00225830078125000000f,
+ -0.00445556640625000000f, 0.00268554687499999960f,
+ -0.00833129882812500000f, 0.00476074218750000000f,
+ 0.00280761718750000000f, 0.00170898437500000000f,
+ 0.00216674804687500000f, 0.00006103515625000000f,
+ 0.00970458984375000000f, 0.00500488281250000000f,
+ 0.00097656250000000000f, -0.00335693359375000000f,
+ -0.00106811523437500000f, -0.00125122070312500000f,
+ -0.00289916992187500000f, -0.00323486328125000000f,
+ 0.00033569335937499995f, 0.00402832031250000000f,
+ -0.00207519531250000000f, 0.00167846679687500000f,
+ 0.00375366210937500000f, -0.00253295898437500040f,
+ -0.00454711914062500000f, 0.00646972656250000000f,
+ 0.00402832031250000000f, 0.00000000000000000000f,
+ -0.00592041015625000000f, 0.00167846679687500000f,
+ 0.00628662109375000000f, -0.00329589843750000000f,
+ -0.01077270507812500000f, 0.00881958007812500000f,
+ -0.00595092773437500000f, 0.00003051757812500000f,
+ 0.00711059570312500000f, -0.00067138671874999989f,
+ -0.00183105468749999980f, 0.00061035156250000000f,
+ 0.00079345703125000011f, 0.00207519531250000000f,
+ 0.00506591796875000090f, 0.00082397460937500000f,
+ -0.00177001953125000000f, 0.00396728515625000000f,
+ 0.00341796875000000000f, 0.00326538085937500000f,
+ 0.00082397460937500000f, -0.00503540039062499910f,
+ 0.00350952148437500040f, -0.00283813476562499960f,
+ -0.00112915039062500000f, 0.00115966796875000000f,
+ 0.00253295898437500040f, 0.01473999023437500000f,
+ 0.00198364257812500000f, -0.00698852539062499910f,
+ -0.00039672851562500005f, 0.00479125976562500000f,
+ 0.00259399414062500000f, 0.00152587890625000000f,
+ 0.00415039062500000000f, 0.00030517578125000000f,
+ 0.00097656250000000000f, 0.00253295898437500040f,
+ 0.00250244140625000000f, 0.00167846679687500000f,
+ 0.00015258789062500000f, -0.00027465820312500000f,
+ -0.00158691406250000020f, -0.00238037109375000000f,
+ -0.00247192382812500000f, -0.00155639648437500000f,
+ 0.00122070312500000000f, 0.00054931640625000000f,
+ -0.00387573242187500000f, -0.00683593750000000000f,
+ -0.00125122070312500000f, 0.00161743164062500000f,
+ -0.00640869140625000000f, -0.00344848632812500000f,
+ 0.00073242187500000000f, -0.00051879882812500000f,
+ -0.00570678710937500090f, -0.00271606445312500000f,
+ 0.00024414062500000000f, 0.00369262695312500000f,
+ 0.00253295898437500040f, 0.00234985351562500000f,
+ 0.00277709960937500000f, -0.00225830078125000000f,
+ -0.00106811523437500000f, -0.00341796875000000000f,
+ -0.00491333007812500000f, -0.00527954101562500000f,
+ 0.00311279296875000000f, 0.00402832031250000000f,
+ -0.00381469726562499960f, -0.00186157226562500000f,
+ 0.00314331054687500000f, -0.00793457031250000000f,
+ 0.00158691406250000020f, 0.00506591796875000090f,
+ -0.00097656250000000000f, -0.00476074218750000000f,
+ -0.00265502929687500000f, -0.00170898437500000000f,
+ 0.00183105468749999980f, -0.00213623046875000000f,
+ -0.00378417968750000000f, 0.00738525390625000000f,
+ 0.00347900390625000000f, -0.00765991210937500090f,
+ -0.00506591796875000090f, 0.00613403320312500000f,
+ 0.00387573242187500000f, 0.00085449218750000000f,
+ -0.00033569335937499995f, 0.00070190429687500000f,
+ -0.00244140625000000000f, -0.00350952148437500040f,
+ -0.00061035156250000000f, -0.00155639648437500000f,
+ -0.01062011718750000000f, 0.01037597656250000000f,
+ -0.00103759765625000000f, 0.00405883789062500000f,
+ 0.00039672851562500005f, 0.00280761718750000000f,
+ -0.00378417968750000000f, -0.00415039062500000000f,
+ -0.00366210937499999960f, -0.00079345703125000011f,
+ -0.00018310546875000000f, 0.00051879882812500000f,
+ 0.00085449218750000000f, 0.00064086914062500000f,
+ 0.00366210937499999960f, -0.00512695312500000000f,
+ 0.00488281250000000000f, -0.00106811523437500000f,
+ 0.00350952148437500040f, 0.00085449218750000000f,
+ 0.00027465820312500000f, 0.00021362304687500000f,
+ -0.00170898437500000000f, 0.00119018554687500000f,
+ 0.00476074218750000000f, 0.00781250000000000000f,
+ -0.00054931640625000000f, 0.00003051757812500000f,
+ 0.00845336914062500000f, 0.00250244140625000000f,
+ -0.00213623046875000000f, -0.00439453125000000000f,
+ -0.00268554687499999960f, -0.00039672851562500005f,
+ -0.00180053710937500000f, -0.00479125976562500000f,
+ 0.00024414062500000000f, -0.00408935546875000000f,
+ 0.00064086914062500000f, -0.00122070312500000000f,
+ 0.00177001953125000000f, -0.00064086914062500000f,
+ 0.00592041015625000000f, -0.00842285156250000000f,
+ 0.00296020507812500000f, 0.00851440429687500000f,
+ -0.00170898437500000000f, -0.00427246093750000000f,
+ 0.00381469726562499960f, 0.00173950195312500000f,
+ -0.00561523437500000000f, -0.00622558593750000000f,
+ -0.00213623046875000000f, -0.00006103515625000000f,
+ 0.00390625000000000000f, -0.00616455078125000000f,
+ -0.00238037109375000000f, 0.00701904296875000090f,
+ -0.00070190429687500000f, 0.00491333007812500000f,
+ -0.00311279296875000000f, 0.00003051757812500000f,
+ 0.00003051757812500000f, 0.00549316406250000000f,
+ -0.00094604492187500000f, -0.00262451171875000000f,
+ -0.00509643554687500000f, -0.00173950195312500000f,
+ -0.00183105468749999980f, 0.00082397460937500000f,
+ -0.00039672851562500005f, 0.00302124023437500040f,
+ 0.00329589843750000000f, 0.00338745117187500000f,
+ 0.00231933593750000000f, 0.00210571289062500000f,
+ 0.00103759765625000000f, -0.00064086914062500000f,
+ 0.00161743164062500000f, 0.00115966796875000000f,
+ 0.00103759765625000000f, 0.00238037109375000000f,
+ 0.00222778320312500000f, 0.00668334960937500090f,
+ 0.00155639648437500000f, 0.00045776367187499995f,
+ -0.00219726562500000000f, -0.00314331054687500000f,
+ -0.00631713867187499910f, 0.00091552734374999989f,
+ 0.00650024414062500000f, -0.00042724609375000000f,
+ 0.00094604492187500000f, -0.00286865234375000000f,
+ -0.00122070312500000000f, -0.00439453125000000000f,
+ 0.00204467773437500000f, 0.00012207031250000000f,
+ 0.00320434570312500000f, 0.00180053710937500000f,
+ -0.00732421874999999910f, 0.00076293945312500000f,
+ 0.00744628906250000000f, 0.00210571289062500000f,
+ 0.00177001953125000000f, 0.00070190429687500000f,
+ -0.00073242187500000000f, -0.00015258789062500000f,
+ -0.00045776367187499995f, -0.00405883789062500000f,
+ -0.00216674804687500000f, -0.00204467773437500000f,
+ 0.00552368164062500000f, 0.00088500976562500000f,
+ -0.00137329101562500000f, 0.00369262695312500000f,
+ 0.00292968750000000000f, 0.00155639648437500000f,
+ -0.00219726562500000000f, -0.00161743164062500000f,
+ 0.00170898437500000000f, -0.00466918945312500000f,
+ -0.00082397460937500000f, 0.00259399414062500000f,
+ 0.00558471679687500000f, 0.00643920898437500000f,
+ 0.00320434570312500000f, -0.00103759765625000000f,
+ -0.00140380859375000000f, 0.00131225585937500000f,
+ -0.00219726562500000000f, -0.00283813476562499960f,
+ 0.00109863281250000000f, -0.00390625000000000000f,
+ 0.00088500976562500000f, 0.00338745117187500000f,
+ -0.00289916992187500000f, -0.00476074218750000000f,
+ -0.00546264648437500000f, -0.00717163085937500000f,
+ 0.00064086914062500000f, -0.00119018554687500000f,
+ -0.00216674804687500000f, -0.00100708007812500000f,
+ -0.00186157226562500000f, -0.00769042968750000000f,
+ 0.00701904296875000090f, -0.00399780273437500000f,
+ 0.00479125976562500000f, -0.00064086914062500000f,
+ -0.00259399414062500000f, -0.00085449218750000000f,
+ -0.00375366210937500000f, 0.00244140625000000000f,
+ -0.00488281250000000000f, 0.00192260742187500000f,
+ 0.00143432617187500000f, -0.00018310546875000000f,
+ -0.00149536132812500000f, -0.00292968750000000000f,
+ -0.00057983398437500000f, 0.00051879882812500000f,
+ -0.00177001953125000000f, 0.00051879882812500000f,
+ -0.00000000000000000000f, -0.00039672851562500005f,
+ -0.00518798828125000000f, 0.00076293945312500000f,
+ -0.00106811523437500000f, 0.00180053710937500000f,
+ 0.00030517578125000000f, -0.00094604492187500000f,
+ -0.01260375976562500000f, 0.00247192382812500000f,
+ 0.00189208984375000000f, 0.00054931640625000000f,
+ -0.00500488281250000000f, 0.00747680664062500000f,
+ 0.00280761718750000000f, -0.00503540039062499910f,
+ 0.00128173828125000000f, 0.00079345703125000011f,
+ 0.00384521484375000000f, -0.00756835937500000000f,
+ 0.00588989257812500000f, -0.00167846679687500000f,
+ 0.00048828125000000000f, 0.00119018554687500000f,
+ 0.00042724609375000000f, 0.00152587890625000000f
+};
+
+const SKP_Silk_NLSF_CBS_FLP SKP_Silk_NLSF_CB1_16_Stage_info_FLP[ NLSF_MSVQ_CB1_16_STAGES ] =
+{
+ { 32, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 0 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 32 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 40 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 48 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 56 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 64 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 72 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 72 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 80 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 80 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 88 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 88 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16[ 16 * 96 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates[ 96 ] }
+};
+
+const SKP_Silk_NLSF_CB_FLP SKP_Silk_NLSF_CB1_16_FLP =
+{
+ NLSF_MSVQ_CB1_16_STAGES,
+ SKP_Silk_NLSF_CB1_16_Stage_info_FLP,
+ SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min,
+ SKP_Silk_NLSF_MSVQ_CB1_16_CDF,
+ SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_FLP/SKP_Silk_tables_other_FLP.c
@@ -1,0 +1,36 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_structs_FLP.h"
+#include "SKP_Silk_define_FLP.h"
+#include "SKP_Silk_perceptual_parameters.h"
+
+const SKP_float SKP_Silk_HarmShapeFIR_FLP[ HARM_SHAPE_FIR_TAPS ] = { 16384.0f / 65536.0f, 32767.0f / 65536.0f, 16384.0f / 65536.0f };
+
+const SKP_float SKP_Silk_Quantization_Offsets[ 2 ][ 2 ] = {
+ { OFFSET_VL_Q10 / 1024.0f, OFFSET_VH_Q10 / 1024.0f }, { OFFSET_UVL_Q10 / 1024.0f, OFFSET_UVH_Q10 / 1024.0f }
+};
--- /dev/null
+++ b/src_FLP/SKP_Silk_warped_autocorrelation_FLP.c
@@ -1,0 +1,69 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* Autocorrelations for a warped frequency axis */
+void SKP_Silk_warped_autocorrelation_FLP(
+ SKP_float *corr, /* O Result [order + 1] */
+ const SKP_float *input, /* I Input data to correlate */
+ const SKP_float warping, /* I Warping coefficient */
+ const SKP_int length, /* I Length of input */
+ const SKP_int order /* I Correlation order (even) */
+)
+{
+ SKP_int n, i;
+ double tmp1, tmp2;
+ double state[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
+ double C[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
+
+ /* Order must be even */
+ SKP_assert( ( order & 1 ) == 0 );
+
+ /* Loop over samples */
+ for( n = 0; n < length; n++ ) {
+ tmp1 = input[ n ];
+ /* Loop over allpass sections */
+ for( i = 0; i < order; i += 2 ) {
+ /* Output of allpass section */
+ tmp2 = state[ i ] + warping * ( state[ i + 1 ] - tmp1 );
+ state[ i ] = tmp1;
+ C[ i ] += state[ 0 ] * tmp1;
+ /* Output of allpass section */
+ tmp1 = state[ i + 1 ] + warping * ( state[ i + 2 ] - tmp2 );
+ state[ i + 1 ] = tmp2;
+ C[ i + 1 ] += state[ 0 ] * tmp2;
+ }
+ state[ order ] = tmp1;
+ C[ order ] += state[ 0 ] * tmp1;
+ }
+
+ /* Copy correlations in SKP_float output format */
+ for( i = 0; i < order + 1; i++ ) {
+ corr[ i ] = ( SKP_float )C[ i ];
+ }
+}
--- /dev/null
+++ b/src_FLP/SKP_Silk_wrappers_FLP.c
@@ -1,0 +1,245 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main_FLP.h"
+
+/* Wrappers. Calls flp / fix code */
+
+/* Convert AR filter coefficients to NLSF parameters */
+void SKP_Silk_A2NLSF_FLP(
+ SKP_float *pNLSF, /* O NLSF vector [ LPC_order ] */
+ const SKP_float *pAR, /* I LPC coefficients [ LPC_order ] */
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_int i;
+ SKP_int NLSF_fix[ MAX_LPC_ORDER ];
+ SKP_int32 a_fix_Q16[ MAX_LPC_ORDER ];
+
+ for( i = 0; i < LPC_order; i++ ) {
+ a_fix_Q16[ i ] = SKP_float2int( pAR[ i ] * 65536.0f );
+ }
+ SKP_Silk_A2NLSF( NLSF_fix, a_fix_Q16, LPC_order );
+
+ for( i = 0; i < LPC_order; i++ ) {
+ pNLSF[ i ] = ( SKP_float )NLSF_fix[ i ] * ( 1.0f / 32768.0f );
+ }
+}
+
+/* Convert LSF parameters to AR prediction filter coefficients */
+void SKP_Silk_NLSF2A_stable_FLP(
+ SKP_float *pAR, /* O LPC coefficients [ LPC_order ] */
+ const SKP_float *pNLSF, /* I NLSF vector [ LPC_order ] */
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_int i;
+ SKP_int NLSF_fix[ MAX_LPC_ORDER ];
+ SKP_int16 a_fix_Q12[ MAX_LPC_ORDER ];
+
+ for( i = 0; i < LPC_order; i++ ) {
+ NLSF_fix[ i ] = ( SKP_int )SKP_CHECK_FIT16( SKP_float2int( pNLSF[ i ] * 32768.0f ) );
+ }
+
+ SKP_Silk_NLSF2A_stable( a_fix_Q12, NLSF_fix, LPC_order );
+
+ for( i = 0; i < LPC_order; i++ ) {
+ pAR[ i ] = ( SKP_float )a_fix_Q12[ i ] / 4096.0f;
+ }
+}
+
+
+/* LSF stabilizer, for a single input data vector */
+void SKP_Silk_NLSF_stabilize_FLP(
+ SKP_float *pNLSF, /* I/O (Un)stable NLSF vector [ LPC_order ] */
+ const SKP_float *pNDelta_min, /* I Normalized delta min vector[LPC_order+1]*/
+ const SKP_int LPC_order /* I LPC order */
+)
+{
+ SKP_int i;
+ SKP_int NLSF_Q15[ MAX_LPC_ORDER ], ndelta_min_Q15[ MAX_LPC_ORDER + 1 ];
+
+ for( i = 0; i < LPC_order; i++ ) {
+ NLSF_Q15[ i ] = ( SKP_int )SKP_float2int( pNLSF[ i ] * 32768.0f );
+ ndelta_min_Q15[ i ] = ( SKP_int )SKP_float2int( pNDelta_min[ i ] * 32768.0f );
+ }
+ ndelta_min_Q15[ LPC_order ] = ( SKP_int )SKP_float2int( pNDelta_min[ LPC_order ] * 32768.0f );
+
+ /* NLSF stabilizer, for a single input data vector */
+ SKP_Silk_NLSF_stabilize( NLSF_Q15, ndelta_min_Q15, LPC_order );
+
+ for( i = 0; i < LPC_order; i++ ) {
+ pNLSF[ i ] = ( SKP_float )NLSF_Q15[ i ] * ( 1.0f / 32768.0f );
+ }
+}
+
+/* Interpolation function with fixed point rounding */
+void SKP_Silk_interpolate_wrapper_FLP(
+ SKP_float xi[], /* O Interpolated vector */
+ const SKP_float x0[], /* I First vector */
+ const SKP_float x1[], /* I Second vector */
+ const SKP_float ifact, /* I Interp. factor, weight on second vector */
+ const SKP_int d /* I Number of parameters */
+)
+{
+ SKP_int x0_int[ MAX_LPC_ORDER ], x1_int[ MAX_LPC_ORDER ], xi_int[ MAX_LPC_ORDER ];
+ SKP_int ifact_Q2 = ( SKP_int )( ifact * 4.0f );
+ SKP_int i;
+
+ /* Convert input from flp to fix */
+ for( i = 0; i < d; i++ ) {
+ x0_int[ i ] = SKP_float2int( x0[ i ] * 32768.0f );
+ x1_int[ i ] = SKP_float2int( x1[ i ] * 32768.0f );
+ }
+
+ /* Interpolate two vectors */
+ SKP_Silk_interpolate( xi_int, x0_int, x1_int, ifact_Q2, d );
+
+ /* Convert output from fix to flp */
+ for( i = 0; i < d; i++ ) {
+ xi[ i ] = ( SKP_float )xi_int[ i ] * ( 1.0f / 32768.0f );
+ }
+}
+
+/****************************************/
+/* Floating-point Silk VAD wrapper */
+/****************************************/
+SKP_int SKP_Silk_VAD_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_int16 *pIn /* I Input signal */
+)
+{
+ SKP_int i, ret, SA_Q8, Tilt_Q15;
+ SKP_int Quality_Bands_Q15[ VAD_N_BANDS ];
+
+ ret = SKP_Silk_VAD_GetSA_Q8( &psEnc->sCmn.sVAD, &SA_Q8, Quality_Bands_Q15, &Tilt_Q15,
+ pIn, psEnc->sCmn.frame_length, psEnc->sCmn.fs_kHz );
+
+ psEnc->speech_activity = ( SKP_float )SA_Q8 / 256.0f;
+ for( i = 0; i < VAD_N_BANDS; i++ ) {
+ psEncCtrl->input_quality_bands[ i ] = ( SKP_float )Quality_Bands_Q15[ i ] / 32768.0f;
+ }
+ psEncCtrl->input_tilt = ( SKP_float )Tilt_Q15 / 32768.0f;
+
+ return ret;
+}
+
+/****************************************/
+/* Floating-point Silk NSQ wrapper */
+/****************************************/
+void SKP_Silk_NSQ_wrapper_FLP(
+ SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */
+ SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */
+ const SKP_float x[], /* I Prefiltered input signal */
+ SKP_int8 q[], /* O Quantized pulse signal */
+ const SKP_int useLBRR /* I LBRR flag */
+)
+{
+ SKP_int i, j;
+ SKP_float tmp_float;
+ SKP_int16 x_16[ MAX_FRAME_LENGTH ];
+ /* Prediction and coding parameters */
+ SKP_int32 Gains_Q16[ MAX_NB_SUBFR ];
+ SKP_array_of_int16_4_byte_aligned( PredCoef_Q12[ 2 ], MAX_LPC_ORDER );
+ SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ];
+ SKP_int LTP_scale_Q14;
+
+ /* Noise shaping parameters */
+ /* Testing */
+ SKP_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ];
+ SKP_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */
+ SKP_int Lambda_Q10;
+ SKP_int Tilt_Q14[ MAX_NB_SUBFR ];
+ SKP_int HarmShapeGain_Q14[ MAX_NB_SUBFR ];
+
+ /* Convert control struct to fix control struct */
+ /* Noise shape parameters */
+ for( i = 0; i < MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER; i++ ) {
+ AR2_Q13[ i ] = (SKP_int16)SKP_SAT16( SKP_float2int( psEncCtrl->AR2[ i ] * 8192.0f ) );
+ }
+
+ for( i = 0; i < MAX_NB_SUBFR; i++ ) {
+ LF_shp_Q14[ i ] = SKP_LSHIFT32( SKP_float2int( psEncCtrl->LF_AR_shp[ i ] * 16384.0f ), 16 ) |
+ (SKP_uint16)SKP_float2int( psEncCtrl->LF_MA_shp[ i ] * 16384.0f );
+ Tilt_Q14[ i ] = (SKP_int)SKP_float2int( psEncCtrl->Tilt[ i ] * 16384.0f );
+ HarmShapeGain_Q14[ i ] = (SKP_int)SKP_float2int( psEncCtrl->HarmShapeGain[ i ] * 16384.0f );
+ }
+ Lambda_Q10 = ( SKP_int )SKP_float2int( psEncCtrl->Lambda * 1024.0f );
+
+ /* prediction and coding parameters */
+ for( i = 0; i < MAX_NB_SUBFR * LTP_ORDER; i++ ) {
+ LTPCoef_Q14[ i ] = ( SKP_int16 )SKP_float2int( psEncCtrl->LTPCoef[ i ] * 16384.0f );
+ }
+
+ for( j = 0; j < MAX_NB_SUBFR >> 1; j++ ) {
+ for( i = 0; i < MAX_LPC_ORDER; i++ ) {
+ PredCoef_Q12[ j ][ i ] = ( SKP_int16 )SKP_float2int( psEncCtrl->PredCoef[ j ][ i ] * 4096.0f );
+ }
+ }
+
+ for( i = 0; i < MAX_NB_SUBFR; i++ ) {
+ tmp_float = SKP_LIMIT( ( psEncCtrl->Gains[ i ] * 65536.0f ), 2147483000.0f, -2147483000.0f );
+ Gains_Q16[ i ] = SKP_float2int( tmp_float );
+ if( psEncCtrl->Gains[ i ] > 0.0f ) {
+ SKP_assert( tmp_float >= 0.0f );
+ SKP_assert( Gains_Q16[ i ] >= 0 );
+ }
+ }
+
+ if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {
+ LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ];
+ } else {
+ LTP_scale_Q14 = 0;
+ }
+
+ /* Convert input to fix */
+ SKP_float2short_array( x_16, x, psEnc->sCmn.frame_length );
+
+ /* Call NSQ */
+ if( useLBRR ) {
+ if( psEnc->sCmn.nStatesDelayedDecision > 1 ) {
+ SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR,
+ x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13,
+ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );
+ } else {
+ SKP_Silk_NSQ( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR,
+ x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13,
+ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );
+ }
+ } else {
+ if( psEnc->sCmn.nStatesDelayedDecision > 1 ) {
+ SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ,
+ x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13,
+ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );
+ } else {
+ SKP_Silk_NSQ( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ,
+ x_16, q, psEncCtrl->sCmn.NLSFInterpCoef_Q2, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR2_Q13,
+ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, Lambda_Q10, LTP_scale_Q14 );
+ }
+ }
+}
--- /dev/null
+++ b/src_FLP/Silk_FLP.vcproj
@@ -1,0 +1,328 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="Silk_FLP"
+ ProjectGUID="{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
+ RootNamespace="Silk"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../../../celt-0.8.0/libcelt;../interface;../src_common;../src_SigProc_FLP;../src_SigProc_FIX"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_FLP_Win32_debug.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../../../celt-0.8.0/libcelt;../interface;../src_common;../src_SigProc_FLP;../src_SigProc_FIX"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;HAVE_CONFIG_H"
+ GeneratePreprocessedFile="0"
+ RuntimeLibrary="0"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_FLP_Win32_mt.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_apply_sine_window_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_control_codec_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_corrMatrix_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_encode_frame_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_LPC_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_LTP_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_pitch_lags_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_find_pred_coefs_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_HP_variable_cutoff_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_init_encoder_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LPC_analysis_filter_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LTP_analysis_filter_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LTP_scale_ctrl_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_MSVQ_decode_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_MSVQ_encode_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_VQ_rate_distortion_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_VQ_sum_error_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_noise_shape_analysis_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_prefilter_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_process_gains_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_process_NLSFs_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_quant_LTP_gains_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_regularize_correlations_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_residual_energy_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_solve_LS_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_10_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_16_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_10_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_16_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_other_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_VQ_nearest_neighbor_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_warped_autocorrelation_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_wrappers_FLP.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_assembler_FLP.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_define_FLP.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_main_FLP.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_perceptual_parameters_FLP.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_structs_FLP.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_FLP.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_A2NLSF.c
@@ -1,0 +1,279 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* Conversion between prediction filter coefficients and NLSFs */
+/* Requires the order to be an even number */
+/* A piecewise linear approximation maps LSF <-> cos(LSF) */
+/* Therefore the result is not accurate NLSFs, but the two */
+/* function are accurate inverses of each other */
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Number of binary divisions, when not in low complexity mode */
+#define BIN_DIV_STEPS_A2NLSF_FIX 2 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */
+#define QPoly 16
+#define MAX_ITERATIONS_A2NLSF_FIX 50
+
+/* Flag for using 2x as many cosine sampling points, reduces the risk of missing a root */
+#define OVERSAMPLE_COSINE_TABLE 0
+
+/* Helper function for A2NLSF(..) */
+/* Transforms polynomials from cos(n*f) to cos(f)^n */
+SKP_INLINE void SKP_Silk_A2NLSF_trans_poly(
+ SKP_int32 *p, /* I/O Polynomial */
+ const SKP_int dd /* I Polynomial order (= filter order / 2 ) */
+)
+{
+ SKP_int k, n;
+
+ for( k = 2; k <= dd; k++ ) {
+ for( n = dd; n > k; n-- ) {
+ p[ n - 2 ] -= p[ n ];
+ }
+ p[ k - 2 ] -= SKP_LSHIFT( p[ k ], 1 );
+ }
+}
+/* Helper function for A2NLSF(..) */
+/* Polynomial evaluation */
+SKP_INLINE SKP_int32 SKP_Silk_A2NLSF_eval_poly( /* return the polynomial evaluation, in QPoly */
+ SKP_int32 *p, /* I Polynomial, QPoly */
+ const SKP_int32 x, /* I Evaluation point, Q12 */
+ const SKP_int dd /* I Order */
+)
+{
+ SKP_int n;
+ SKP_int32 x_Q16, y32;
+
+ y32 = p[ dd ]; /* QPoly */
+ x_Q16 = SKP_LSHIFT( x, 4 );
+ for( n = dd - 1; n >= 0; n-- ) {
+ y32 = SKP_SMLAWW( p[ n ], y32, x_Q16 ); /* QPoly */
+ }
+ return y32;
+}
+
+SKP_INLINE void SKP_Silk_A2NLSF_init(
+ const SKP_int32 *a_Q16,
+ SKP_int32 *P,
+ SKP_int32 *Q,
+ const SKP_int dd
+)
+{
+ SKP_int k;
+
+ /* Convert filter coefs to even and odd polynomials */
+ P[dd] = SKP_LSHIFT( 1, QPoly );
+ Q[dd] = SKP_LSHIFT( 1, QPoly );
+ for( k = 0; k < dd; k++ ) {
+#if( QPoly < 16 )
+ P[ k ] = SKP_RSHIFT_ROUND( -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ], 16 - QPoly ); /* QPoly */
+ Q[ k ] = SKP_RSHIFT_ROUND( -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ], 16 - QPoly ); /* QPoly */
+#elif( Qpoly == 16 )
+ P[ k ] = -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ]; // QPoly
+ Q[ k ] = -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ]; // QPoly
+#else
+ P[ k ] = SKP_LSHIFT( -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ], QPoly - 16 ); /* QPoly */
+ Q[ k ] = SKP_LSHIFT( -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ], QPoly - 16 ); /* QPoly */
+#endif
+ }
+
+ /* Divide out zeros as we have that for even filter orders, */
+ /* z = 1 is always a root in Q, and */
+ /* z = -1 is always a root in P */
+ for( k = dd; k > 0; k-- ) {
+ P[ k - 1 ] -= P[ k ];
+ Q[ k - 1 ] += Q[ k ];
+ }
+
+ /* Transform polynomials from cos(n*f) to cos(f)^n */
+ SKP_Silk_A2NLSF_trans_poly( P, dd );
+ SKP_Silk_A2NLSF_trans_poly( Q, dd );
+}
+
+/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */
+/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */
+void SKP_Silk_A2NLSF(
+ SKP_int *NLSF, /* O Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d] */
+ SKP_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */
+ const SKP_int d /* I Filter order (must be even) */
+)
+{
+ SKP_int i, k, m, dd, root_ix, ffrac;
+ SKP_int32 xlo, xhi, xmid;
+ SKP_int32 ylo, yhi, ymid;
+ SKP_int32 nom, den;
+ SKP_int32 P[ SKP_Silk_MAX_ORDER_LPC / 2 + 1 ];
+ SKP_int32 Q[ SKP_Silk_MAX_ORDER_LPC / 2 + 1 ];
+ SKP_int32 *PQ[ 2 ];
+ SKP_int32 *p;
+
+ /* Store pointers to array */
+ PQ[ 0 ] = P;
+ PQ[ 1 ] = Q;
+
+ dd = SKP_RSHIFT( d, 1 );
+
+ SKP_Silk_A2NLSF_init( a_Q16, P, Q, dd );
+
+ /* Find roots, alternating between P and Q */
+ p = P; /* Pointer to polynomial */
+
+ xlo = SKP_Silk_LSFCosTab_FIX_Q12[ 0 ]; // Q12
+ ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
+
+ if( ylo < 0 ) {
+ /* Set the first NLSF to zero and move on to the next */
+ NLSF[ 0 ] = 0;
+ p = Q; /* Pointer to polynomial */
+ ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
+ root_ix = 1; /* Index of current root */
+ } else {
+ root_ix = 0; /* Index of current root */
+ }
+ k = 1; /* Loop counter */
+ i = 0; /* Counter for bandwidth expansions applied */
+ while( 1 ) {
+ /* Evaluate polynomial */
+#if OVERSAMPLE_COSINE_TABLE
+ xhi = SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] +
+ ( ( SKP_Silk_LSFCosTab_FIX_Q12[ ( k + 1 ) >> 1 ] -
+ SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] ) >> 1 ); /* Q12 */
+#else
+ xhi = SKP_Silk_LSFCosTab_FIX_Q12[ k ]; /* Q12 */
+#endif
+ yhi = SKP_Silk_A2NLSF_eval_poly( p, xhi, dd );
+
+ /* Detect zero crossing */
+ if( ( ylo <= 0 && yhi >= 0 ) || ( ylo >= 0 && yhi <= 0 ) ) {
+ /* Binary division */
+#if OVERSAMPLE_COSINE_TABLE
+ ffrac = -128;
+#else
+ ffrac = -256;
+#endif
+ for( m = 0; m < BIN_DIV_STEPS_A2NLSF_FIX; m++ ) {
+ /* Evaluate polynomial */
+ xmid = SKP_RSHIFT_ROUND( xlo + xhi, 1 );
+ ymid = SKP_Silk_A2NLSF_eval_poly( p, xmid, dd );
+
+ /* Detect zero crossing */
+ if( ( ylo <= 0 && ymid >= 0 ) || ( ylo >= 0 && ymid <= 0 ) ) {
+ /* Reduce frequency */
+ xhi = xmid;
+ yhi = ymid;
+ } else {
+ /* Increase frequency */
+ xlo = xmid;
+ ylo = ymid;
+#if OVERSAMPLE_COSINE_TABLE
+ ffrac = SKP_ADD_RSHIFT( ffrac, 64, m );
+#else
+ ffrac = SKP_ADD_RSHIFT( ffrac, 128, m );
+#endif
+ }
+ }
+
+ /* Interpolate */
+ if( SKP_abs( ylo ) < 65536 ) {
+ /* Avoid dividing by zero */
+ den = ylo - yhi;
+ nom = SKP_LSHIFT( ylo, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) + SKP_RSHIFT( den, 1 );
+ if( den != 0 ) {
+ ffrac += SKP_DIV32( nom, den );
+ }
+ } else {
+ /* No risk of dividing by zero because abs(ylo - yhi) >= abs(ylo) >= 65536 */
+ ffrac += SKP_DIV32( ylo, SKP_RSHIFT( ylo - yhi, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) );
+ }
+#if OVERSAMPLE_COSINE_TABLE
+ NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 7 ) + ffrac, SKP_int16_MAX );
+#else
+ NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 8 ) + ffrac, SKP_int16_MAX );
+#endif
+
+ SKP_assert( NLSF[ root_ix ] >= 0 );
+ SKP_assert( NLSF[ root_ix ] <= 32767 );
+
+ root_ix++; /* Next root */
+ if( root_ix >= d ) {
+ /* Found all roots */
+ break;
+ }
+ /* Alternate pointer to polynomial */
+ p = PQ[ root_ix & 1 ];
+
+ /* Evaluate polynomial */
+#if OVERSAMPLE_COSINE_TABLE
+ xlo = SKP_Silk_LSFCosTab_FIX_Q12[ ( k - 1 ) >> 1 ] +
+ ( ( SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] -
+ SKP_Silk_LSFCosTab_FIX_Q12[ ( k - 1 ) >> 1 ] ) >> 1 ); // Q12
+#else
+ xlo = SKP_Silk_LSFCosTab_FIX_Q12[ k - 1 ]; // Q12
+#endif
+ ylo = SKP_LSHIFT( 1 - ( root_ix & 2 ), 12 );
+ } else {
+ /* Increment loop counter */
+ k++;
+ xlo = xhi;
+ ylo = yhi;
+
+#if OVERSAMPLE_COSINE_TABLE
+ if( k > 2 * LSF_COS_TAB_SZ_FIX ) {
+#else
+ if( k > LSF_COS_TAB_SZ_FIX ) {
+#endif
+ i++;
+ if( i > MAX_ITERATIONS_A2NLSF_FIX ) {
+ /* Set NLSFs to white spectrum and exit */
+ NLSF[ 0 ] = SKP_DIV32_16( 1 << 15, d + 1 );
+ for( k = 1; k < d; k++ ) {
+ NLSF[ k ] = SKP_SMULBB( k + 1, NLSF[ 0 ] );
+ }
+ return;
+ }
+
+ /* Error: Apply progressively more bandwidth expansion and run again */
+ SKP_Silk_bwexpander_32( a_Q16, d, 65536 - SKP_SMULBB( 66, i ) ); // 66_Q16 = 0.001
+
+ SKP_Silk_A2NLSF_init( a_Q16, P, Q, dd );
+ p = P; /* Pointer to polynomial */
+ xlo = SKP_Silk_LSFCosTab_FIX_Q12[ 0 ]; // Q12
+ ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
+ if( ylo < 0 ) {
+ /* Set the first NLSF to zero and move on to the next */
+ NLSF[ 0 ] = 0;
+ p = Q; /* Pointer to polynomial */
+ ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );
+ root_ix = 1; /* Index of current root */
+ } else {
+ root_ix = 0; /* Index of current root */
+ }
+ k = 1; /* Reset loop counter */
+ }
+ }
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_Inlines.h
@@ -1,0 +1,275 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/*! \file SKP_Silk_Inlines.h
+ * \brief SKP_Silk_Inlines.h defines inline signal processing functions.
+ */
+
+#ifndef _SKP_SILK_FIX_INLINES_H_
+#define _SKP_SILK_FIX_INLINES_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* count leading zeros of SKP_int64 */
+SKP_INLINE SKP_int32 SKP_Silk_CLZ64(SKP_int64 in)
+{
+ SKP_int32 in_upper;
+
+ in_upper = (SKP_int32)SKP_RSHIFT64(in, 32);
+ if (in_upper == 0) {
+ /* Search in the lower 32 bits */
+ return 32 + SKP_Silk_CLZ32( (SKP_int32) in );
+ } else {
+ /* Search in the upper 32 bits */
+ return SKP_Silk_CLZ32( in_upper );
+ }
+}
+
+/* get number of leading zeros and fractional part (the bits right after the leading one */
+SKP_INLINE void SKP_Silk_CLZ_FRAC(SKP_int32 in, /* I: input */
+ SKP_int32 *lz, /* O: number of leading zeros */
+ SKP_int32 *frac_Q7) /* O: the 7 bits right after the leading one */
+{
+ SKP_int32 lzeros = SKP_Silk_CLZ32(in);
+
+ * lz = lzeros;
+ * frac_Q7 = SKP_ROR32(in, 24 - lzeros) & 0x7f;
+}
+
+/* Approximation of square root */
+/* Accuracy: < +/- 10% for output values > 15 */
+/* < +/- 2.5% for output values > 120 */
+SKP_INLINE SKP_int32 SKP_Silk_SQRT_APPROX(SKP_int32 x)
+{
+ SKP_int32 y, lz, frac_Q7;
+
+ if( x <= 0 ) {
+ return 0;
+ }
+
+ SKP_Silk_CLZ_FRAC(x, &lz, &frac_Q7);
+
+ if( lz & 1 ) {
+ y = 32768;
+ } else {
+ y = 46214; /* 46214 = sqrt(2) * 32768 */
+ }
+
+ /* get scaling right */
+ y >>= SKP_RSHIFT(lz, 1);
+
+ /* increment using fractional part of input */
+ y = SKP_SMLAWB(y, y, SKP_SMULBB(213, frac_Q7));
+
+ return y;
+}
+
+/* returns the number of left shifts before overflow for a 16 bit number (ITU definition with norm(0)=0) */
+SKP_INLINE SKP_int32 SKP_Silk_norm16(SKP_int16 a) {
+
+ SKP_int32 a32;
+
+ /* if ((a == 0) || (a == SKP_int16_MIN)) return(0); */
+ if ((a << 1) == 0) return(0);
+
+ a32 = a;
+ /* if (a32 < 0) a32 = -a32 - 1; */
+ a32 ^= SKP_RSHIFT(a32, 31);
+
+ return SKP_Silk_CLZ32(a32) - 17;
+}
+
+/* returns the number of left shifts before overflow for a 32 bit number (ITU definition with norm(0)=0) */
+SKP_INLINE SKP_int32 SKP_Silk_norm32(SKP_int32 a) {
+
+ /* if ((a == 0) || (a == SKP_int32_MIN)) return(0); */
+ if ((a << 1) == 0) return(0);
+
+ /* if (a < 0) a = -a - 1; */
+ a ^= SKP_RSHIFT(a, 31);
+
+ return SKP_Silk_CLZ32(a) - 1;
+}
+
+/* Divide two int32 values and return result as int32 in a given Q-domain */
+SKP_INLINE SKP_int32 SKP_DIV32_varQ( /* O returns a good approximation of "(a32 << Qres) / b32" */
+ const SKP_int32 a32, /* I numerator (Q0) */
+ const SKP_int32 b32, /* I denominator (Q0) */
+ const SKP_int Qres /* I Q-domain of result (>= 0) */
+)
+{
+ SKP_int a_headrm, b_headrm, lshift;
+ SKP_int32 b32_inv, a32_nrm, b32_nrm, result;
+
+ SKP_assert( b32 != 0 );
+ SKP_assert( Qres >= 0 );
+
+ /* Compute number of bits head room and normalize inputs */
+ a_headrm = SKP_Silk_CLZ32( SKP_abs(a32) ) - 1;
+ a32_nrm = SKP_LSHIFT(a32, a_headrm); /* Q: a_headrm */
+ b_headrm = SKP_Silk_CLZ32( SKP_abs(b32) ) - 1;
+ b32_nrm = SKP_LSHIFT(b32, b_headrm); /* Q: b_headrm */
+
+ /* Inverse of b32, with 14 bits of precision */
+ b32_inv = SKP_DIV32_16( SKP_int32_MAX >> 2, SKP_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */
+
+ /* First approximation */
+ result = SKP_SMULWB(a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */
+
+ /* Compute residual by subtracting product of denominator and first approximation */
+ a32_nrm -= SKP_LSHIFT_ovflw( SKP_SMMUL(b32_nrm, result), 3 ); /* Q: a_headrm */
+
+ /* Refinement */
+ result = SKP_SMLAWB(result, a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */
+
+ /* Convert to Qres domain */
+ lshift = 29 + a_headrm - b_headrm - Qres;
+ if( lshift <= 0 ) {
+ return SKP_LSHIFT_SAT32(result, -lshift);
+ } else {
+ if( lshift < 32){
+ return SKP_RSHIFT(result, lshift);
+ } else {
+ /* Avoid undefined result */
+ return 0;
+ }
+ }
+}
+
+/* Invert int32 value and return result as int32 in a given Q-domain */
+SKP_INLINE SKP_int32 SKP_INVERSE32_varQ( /* O returns a good approximation of "(1 << Qres) / b32" */
+ const SKP_int32 b32, /* I denominator (Q0) */
+ const SKP_int Qres /* I Q-domain of result (> 0) */
+)
+{
+ SKP_int b_headrm, lshift;
+ SKP_int32 b32_inv, b32_nrm, err_Q32, result;
+
+ SKP_assert( b32 != 0 );
+ SKP_assert( Qres > 0 );
+
+ /* Compute number of bits head room and normalize input */
+ b_headrm = SKP_Silk_CLZ32( SKP_abs(b32) ) - 1;
+ b32_nrm = SKP_LSHIFT(b32, b_headrm); /* Q: b_headrm */
+
+ /* Inverse of b32, with 14 bits of precision */
+ b32_inv = SKP_DIV32_16( SKP_int32_MAX >> 2, SKP_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */
+
+ /* First approximation */
+ result = SKP_LSHIFT(b32_inv, 16); /* Q: 61 - b_headrm */
+
+ /* Compute residual by subtracting product of denominator and first approximation from one */
+ err_Q32 = SKP_LSHIFT_ovflw( -SKP_SMULWB(b32_nrm, b32_inv), 3 ); /* Q32 */
+
+ /* Refinement */
+ result = SKP_SMLAWW(result, err_Q32, b32_inv); /* Q: 61 - b_headrm */
+
+ /* Convert to Qres domain */
+ lshift = 61 - b_headrm - Qres;
+ if( lshift <= 0 ) {
+ return SKP_LSHIFT_SAT32(result, -lshift);
+ } else {
+ if( lshift < 32){
+ return SKP_RSHIFT(result, lshift);
+ }else{
+ /* Avoid undefined result */
+ return 0;
+ }
+ }
+}
+
+#define SKP_SIN_APPROX_CONST0 (1073735400)
+#define SKP_SIN_APPROX_CONST1 (-82778932)
+#define SKP_SIN_APPROX_CONST2 (1059577)
+#define SKP_SIN_APPROX_CONST3 (-5013)
+
+/* Sine approximation; an input of 65536 corresponds to 2 * pi */
+/* Uses polynomial expansion of the input to the power 0, 2, 4 and 6 */
+/* The relative error is below 1e-5 */
+SKP_INLINE SKP_int32 SKP_Silk_SIN_APPROX_Q24( /* O returns approximately 2^24 * sin(x * 2 * pi / 65536) */
+ SKP_int32 x
+)
+{
+ SKP_int y_Q30;
+
+ /* Keep only bottom 16 bits (the function repeats itself with period 65536) */
+ x &= 65535;
+
+ /* Split range in four quadrants */
+ if( x <= 32768 ) {
+ if( x < 16384 ) {
+ /* Return cos(pi/2 - x) */
+ x = 16384 - x;
+ } else {
+ /* Return cos(x - pi/2) */
+ x -= 16384;
+ }
+ if( x < 1100 ) {
+ /* Special case: high accuracy */
+ return SKP_SMLAWB( 1 << 24, SKP_MUL( x, x ), -5053 );
+ }
+ x = SKP_SMULWB( SKP_LSHIFT( x, 8 ), x ); /* contains x^2 in Q20 */
+ y_Q30 = SKP_SMLAWB( SKP_SIN_APPROX_CONST2, x, SKP_SIN_APPROX_CONST3 );
+ y_Q30 = SKP_SMLAWW( SKP_SIN_APPROX_CONST1, x, y_Q30 );
+ y_Q30 = SKP_SMLAWW( SKP_SIN_APPROX_CONST0 + 66, x, y_Q30 );
+ } else {
+ if( x < 49152 ) {
+ /* Return -cos(3*pi/2 - x) */
+ x = 49152 - x;
+ } else {
+ /* Return -cos(x - 3*pi/2) */
+ x -= 49152;
+ }
+ if( x < 1100 ) {
+ /* Special case: high accuracy */
+ return SKP_SMLAWB( -1 << 24, SKP_MUL( x, x ), 5053 );
+ }
+ x = SKP_SMULWB( SKP_LSHIFT( x, 8 ), x ); /* contains x^2 in Q20 */
+ y_Q30 = SKP_SMLAWB( -SKP_SIN_APPROX_CONST2, x, -SKP_SIN_APPROX_CONST3 );
+ y_Q30 = SKP_SMLAWW( -SKP_SIN_APPROX_CONST1, x, y_Q30 );
+ y_Q30 = SKP_SMLAWW( -SKP_SIN_APPROX_CONST0, x, y_Q30 );
+ }
+ return SKP_RSHIFT_ROUND( y_Q30, 6 );
+}
+
+/* Cosine approximation; an input of 65536 corresponds to 2 * pi */
+/* The relative error is below 1e-5 */
+SKP_INLINE SKP_int32 SKP_Silk_COS_APPROX_Q24( /* O returns approximately 2^24 * cos(x * 2 * pi / 65536) */
+ SKP_int32 x
+)
+{
+ return SKP_Silk_SIN_APPROX_Q24( x + 16384 );
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_SKP_SILK_FIX_INLINES_H_
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_LPC_inv_pred_gain.c
@@ -1,0 +1,173 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_LPC_inverse_pred_gain.c *
+ * *
+ * Compute inverse of LPC prediction gain, and *
+ * test if LPC coefficients are stable (all poles within unit circle) *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+#define QA 16
+#define A_LIMIT SKP_FIX_CONST( 0.99975, QA )
+
+/* Compute inverse of LPC prediction gain, and */
+/* test if LPC coefficients are stable (all poles within unit circle) */
+static SKP_int LPC_inverse_pred_gain_QA( /* O: Returns 1 if unstable, otherwise 0 */
+ SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
+ SKP_int32 A_QA[ 2 ][ SKP_Silk_MAX_ORDER_LPC ],
+ /* I: Prediction coefficients */
+ const SKP_int order /* I: Prediction order */
+)
+{
+ SKP_int k, n, headrm;
+ SKP_int32 rc_Q31, rc_mult1_Q30, rc_mult2_Q16, tmp_QA;
+ SKP_int32 *Aold_QA, *Anew_QA;
+
+ Anew_QA = A_QA[ order & 1 ];
+
+ *invGain_Q30 = ( 1 << 30 );
+ for( k = order - 1; k > 0; k-- ) {
+ /* Check for stability */
+ if( ( Anew_QA[ k ] > A_LIMIT ) || ( Anew_QA[ k ] < -A_LIMIT ) ) {
+ return 1;
+ }
+
+ /* Set RC equal to negated AR coef */
+ rc_Q31 = -SKP_LSHIFT( Anew_QA[ k ], 31 - QA );
+
+ /* rc_mult1_Q30 range: [ 1 : 2^30-1 ] */
+ rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 );
+ SKP_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */
+ SKP_assert( rc_mult1_Q30 < ( 1 << 30 ) );
+
+ /* rc_mult2_Q16 range: [ 2^16 : SKP_int32_MAX ] */
+ rc_mult2_Q16 = SKP_INVERSE32_varQ( rc_mult1_Q30, 46 ); /* 16 = 46 - 30 */
+
+ /* Update inverse gain */
+ /* invGain_Q30 range: [ 0 : 2^30 ] */
+ *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 );
+ SKP_assert( *invGain_Q30 >= 0 );
+ SKP_assert( *invGain_Q30 <= ( 1 << 30 ) );
+
+ /* Swap pointers */
+ Aold_QA = Anew_QA;
+ Anew_QA = A_QA[ k & 1 ];
+
+ /* Update AR coefficient */
+ headrm = SKP_Silk_CLZ32( rc_mult2_Q16 ) - 1;
+ rc_mult2_Q16 = SKP_LSHIFT( rc_mult2_Q16, headrm ); /* Q: 16 + headrm */
+ for( n = 0; n < k; n++ ) {
+ tmp_QA = Aold_QA[ n ] - SKP_LSHIFT( SKP_SMMUL( Aold_QA[ k - n - 1 ], rc_Q31 ), 1 );
+ Anew_QA[ n ] = SKP_LSHIFT( SKP_SMMUL( tmp_QA, rc_mult2_Q16 ), 16 - headrm );
+ }
+ }
+
+ /* Check for stability */
+ if( ( Anew_QA[ 0 ] > A_LIMIT ) || ( Anew_QA[ 0 ] < -A_LIMIT ) ) {
+ return 1;
+ }
+
+ /* Set RC equal to negated AR coef */
+ rc_Q31 = -SKP_LSHIFT( Anew_QA[ 0 ], 31 - QA );
+
+ /* Range: [ 1 : 2^30 ] */
+ rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 );
+
+ /* Update inverse gain */
+ /* Range: [ 0 : 2^30 ] */
+ *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 );
+ SKP_assert( *invGain_Q30 >= 0 );
+ SKP_assert( *invGain_Q30 <= 1<<30 );
+
+ return 0;
+}
+
+/* For input in Q12 domain */
+SKP_int SKP_Silk_LPC_inverse_pred_gain( /* O: Returns 1 if unstable, otherwise 0 */
+ SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
+ const SKP_int16 *A_Q12, /* I: Prediction coefficients, Q12 [order] */
+ const SKP_int order /* I: Prediction order */
+)
+{
+ SKP_int k;
+ SKP_int32 Atmp_QA[ 2 ][ SKP_Silk_MAX_ORDER_LPC ];
+ SKP_int32 *Anew_QA;
+
+ Anew_QA = Atmp_QA[ order & 1 ];
+
+ /* Increase Q domain of the AR coefficients */
+ for( k = 0; k < order; k++ ) {
+ Anew_QA[ k ] = SKP_LSHIFT( (SKP_int32)A_Q12[ k ], QA - 12 );
+ }
+
+ return LPC_inverse_pred_gain_QA( invGain_Q30, Atmp_QA, order );
+}
+
+/* For input in Q13 domain */
+SKP_int SKP_Silk_LPC_inverse_pred_gain_Q13( /* O: Returns 1 if unstable, otherwise 0 */
+ SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
+ const SKP_int16 *A_Q13, /* I: Prediction coefficients, Q13 [order] */
+ const SKP_int order /* I: Prediction order */
+)
+{
+ SKP_int k;
+ SKP_int32 Atmp_QA[ 2 ][ SKP_Silk_MAX_ORDER_LPC ];
+ SKP_int32 *Anew_QA;
+
+ Anew_QA = Atmp_QA[ order & 1 ];
+
+ /* Increase Q domain of the AR coefficients */
+ for( k = 0; k < order; k++ ) {
+ Anew_QA[ k ] = SKP_LSHIFT( (SKP_int32)A_Q13[ k ], QA - 13 );
+ }
+
+ return LPC_inverse_pred_gain_QA( invGain_Q30, Atmp_QA, order );
+}
+
+/* For input in Q24 domain */
+SKP_int SKP_Silk_LPC_inverse_pred_gain_Q24( /* O: Returns 1 if unstable, otherwise 0 */
+ SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
+ const SKP_int32 *A_Q24, /* I: Prediction coefficients, Q24 [order] */
+ const SKP_int order /* I: Prediction order */
+)
+{
+ SKP_int k;
+ SKP_int32 Atmp_QA[ 2 ][ SKP_Silk_MAX_ORDER_LPC ];
+ SKP_int32 *Anew_QA;
+
+ Anew_QA = Atmp_QA[ order & 1 ];
+
+ /* Increase Q domain of the AR coefficients */
+ for( k = 0; k < order; k++ ) {
+ Anew_QA[ k ] = SKP_RSHIFT_ROUND( A_Q24[ k ], 24 - QA );
+ }
+
+ return LPC_inverse_pred_gain_QA( invGain_Q30, Atmp_QA, order );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_LPC_stabilize.c
@@ -1,0 +1,133 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_SigProc_FIX.h"
+
+#define LPC_STABILIZE_LPC_MAX_ABS_VALUE_Q16 ( ( (SKP_int32)SKP_int16_MAX ) << 4 )
+
+/* LPC stabilizer, for a single input data vector */
+void SKP_Silk_LPC_stabilize(
+ SKP_int16 *a_Q12, /* O stabilized LPC vector [L] */
+ SKP_int32 *a_Q16, /* I LPC vector [L] */
+ const SKP_int32 bwe_Q16, /* I Bandwidth expansion factor */
+ const SKP_int L /* I Number of LPC parameters in the input vector */
+)
+{
+ SKP_int32 maxabs, absval, sc_Q16;
+ SKP_int i, idx = 0;
+ SKP_int32 invGain_Q30;
+
+ SKP_Silk_bwexpander_32( a_Q16, L, bwe_Q16 );
+
+ /***************************/
+ /* Limit range of the LPCs */
+ /***************************/
+ /* Limit the maximum absolute value of the prediction coefficients */
+ while( SKP_TRUE ) {
+ /* Find maximum absolute value and its index */
+ maxabs = SKP_int32_MIN;
+ for( i = 0; i < L; i++ ) {
+ absval = SKP_abs( a_Q16[ i ] );
+ if( absval > maxabs ) {
+ maxabs = absval;
+ idx = i;
+ }
+ }
+
+ if( maxabs >= LPC_STABILIZE_LPC_MAX_ABS_VALUE_Q16 ) {
+ /* Reduce magnitude of prediction coefficients */
+ sc_Q16 = SKP_DIV32( SKP_int32_MAX, SKP_RSHIFT( maxabs, 4 ) );
+ sc_Q16 = 65536 - sc_Q16;
+ sc_Q16 = SKP_DIV32( sc_Q16, idx + 1 );
+ sc_Q16 = 65536 - sc_Q16;
+ sc_Q16 = SKP_LSHIFT( SKP_SMULWB( sc_Q16, 32604 ), 1 ); // 0.995 in Q16
+ SKP_Silk_bwexpander_32( a_Q16, L, sc_Q16 );
+ } else {
+ break;
+ }
+ }
+
+ /* Convert to 16 bit Q12 */
+ for( i = 0; i < L; i++ ) {
+ a_Q12[ i ] = (SKP_int16)SKP_RSHIFT_ROUND( a_Q16[ i ], 4 );
+ }
+
+ /**********************/
+ /* Ensure stable LPCs */
+ /**********************/
+ while( SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, a_Q12, L ) == 1 ) {
+ SKP_Silk_bwexpander( a_Q12, L, 65339 ); // 0.997 in Q16
+ }
+}
+
+void SKP_Silk_LPC_fit(
+ SKP_int16 *a_QQ, /* O Stabilized LPC vector, Q(24-rshift) [L] */
+ SKP_int32 *a_Q24, /* I LPC vector [L] */
+ const SKP_int QQ, /* I Q domain of output LPC vector */
+ const SKP_int L /* I Number of LPC parameters in the input vector */
+)
+{
+ SKP_int i, rshift, idx = 0;
+ SKP_int32 maxabs, absval, sc_Q16;
+
+ rshift = 24 - QQ;
+
+ /***************************/
+ /* Limit range of the LPCs */
+ /***************************/
+ /* Limit the maximum absolute value of the prediction coefficients */
+ while( SKP_TRUE ) {
+ /* Find maximum absolute value and its index; assumes stable coefficients */
+ /* so that only the first half need to be tested */
+ maxabs = SKP_int32_MIN;
+ for( i = 1; i < L / 2; i++ ) {
+ absval = SKP_abs( a_Q24[ i ] );
+ if( absval > maxabs ) {
+ maxabs = absval;
+ idx = i;
+ }
+ }
+
+ maxabs = SKP_RSHIFT( maxabs, rshift );
+ if( maxabs >= SKP_int16_MAX ) {
+ /* Reduce magnitude of prediction coefficients */
+ sc_Q16 = 65470 - SKP_DIV32( SKP_MUL( 65470 >> 2, maxabs - SKP_int16_MAX ),
+ SKP_RSHIFT32( SKP_MUL( maxabs, idx + 1), 2 ) );
+ SKP_Silk_bwexpander_32( a_Q24, L, sc_Q16 );
+ } else {
+ break;
+ }
+ }
+
+ /* Convert to 16 bit Q(24-rshift) */
+ SKP_assert( rshift > 0 );
+ SKP_assert( rshift < 31 );
+ for( i = 0; i < L; i++ ) {
+ a_QQ[ i ] = (SKP_int16)SKP_RSHIFT_ROUND( a_Q24[ i ], rshift );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_LPC_synthesis_filter.c
@@ -1,0 +1,84 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_LPC_synthesis_filter.c *
+ * Coefficients are in Q12 *
+ * *
+ * even order AR filter *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* even order AR filter */
+void SKP_Silk_LPC_synthesis_filter(
+ const SKP_int16 *in, /* I: excitation signal */
+ const SKP_int16 *A_Q12, /* I: AR coefficients [Order], between -8_Q0 and 8_Q0 */
+ const SKP_int32 Gain_Q26, /* I: gain */
+ SKP_int32 *S, /* I/O: state vector [Order] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len, /* I: signal length */
+ const SKP_int Order /* I: filter order, must be even */
+)
+{
+ SKP_int k, j, idx, Order_half = SKP_RSHIFT( Order, 1 );
+ SKP_int32 SA, SB, out32_Q10, out32;
+
+ /* Order must be even */
+ SKP_assert( 2 * Order_half == Order );
+
+ /* S[] values are in Q14 */
+ for( k = 0; k < len; k++ ) {
+ SA = S[ Order - 1 ];
+ out32_Q10 = 0;
+ for( j = 0; j < ( Order_half - 1 ); j++ ) {
+ idx = SKP_SMULBB( 2, j ) + 1;
+ SB = S[ Order - 1 - idx ];
+ S[ Order - 1 - idx ] = SA;
+ out32_Q10 = SKP_SMLAWB( out32_Q10, SA, A_Q12[ ( j << 1 ) ] );
+ out32_Q10 = SKP_SMLAWB( out32_Q10, SB, A_Q12[ ( j << 1 ) + 1 ] );
+ SA = S[ Order - 2 - idx ];
+ S[ Order - 2 - idx ] = SB;
+ }
+
+ /* unrolled loop: epilog */
+ SB = S[ 0 ];
+ S[ 0 ] = SA;
+ out32_Q10 = SKP_SMLAWB( out32_Q10, SA, A_Q12[ Order - 2 ] );
+ out32_Q10 = SKP_SMLAWB( out32_Q10, SB, A_Q12[ Order - 1 ] );
+ /* apply gain to excitation signal and add to prediction */
+ out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[ k ] ) );
+
+ /* scale to Q0 */
+ out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 );
+
+ /* saturate output */
+ out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );
+
+ /* move result into delay line */
+ S[ Order - 1 ] = SKP_LSHIFT_SAT32( out32_Q10, 4 );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_LPC_synthesis_order16.c
@@ -1,0 +1,122 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_LPC_synthesis_order16.c *
+ * Coefficients are in Q12 *
+ * *
+ * 16th order AR filter *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* 16th order AR filter */
+void SKP_Silk_LPC_synthesis_order16(const SKP_int16 *in, /* I: excitation signal */
+ const SKP_int16 *A_Q12, /* I: AR coefficients [16], between -8_Q0 and 8_Q0 */
+ const SKP_int32 Gain_Q26, /* I: gain */
+ SKP_int32 *S, /* I/O: state vector [16] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len /* I: signal length, must be multiple of 16 */
+)
+{
+ SKP_int k;
+ SKP_int32 SA, SB, out32_Q10, out32;
+ for( k = 0; k < len; k++ ) {
+ /* unrolled loop: prolog */
+ /* multiply-add two prediction coefficients per iteration */
+ SA = S[ 15 ];
+ SB = S[ 14 ];
+ S[ 14 ] = SA;
+ out32_Q10 = SKP_SMULWB( SA, A_Q12[ 0 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 1 ] );
+ SA = S[ 13 ];
+ S[ 13 ] = SB;
+
+ /* unrolled loop: main loop */
+ SB = S[ 12 ];
+ S[ 12 ] = SA;
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 2 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 3 ] );
+ SA = S[ 11 ];
+ S[ 11 ] = SB;
+
+ SB = S[ 10 ];
+ S[ 10 ] = SA;
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 4 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 5 ] );
+ SA = S[ 9 ];
+ S[ 9 ] = SB;
+
+ SB = S[ 8 ];
+ S[ 8 ] = SA;
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 6 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 7 ] );
+ SA = S[ 7 ];
+ S[ 7 ] = SB;
+
+ SB = S[ 6 ];
+ S[ 6 ] = SA;
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 8 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 9 ] );
+ SA = S[ 5 ];
+ S[ 5 ] = SB;
+
+ SB = S[ 4 ];
+ S[ 4 ] = SA;
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 10 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 11 ] );
+ SA = S[ 3 ];
+ S[ 3 ] = SB;
+
+ SB = S[ 2 ];
+ S[ 2 ] = SA;
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 12 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 13 ] );
+ SA = S[ 1 ];
+ S[ 1 ] = SB;
+
+ /* unrolled loop: epilog */
+ SB = S[ 0 ];
+ S[ 0 ] = SA;
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 14 ] );
+ out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 15 ] );
+
+ /* unrolled loop: end */
+ /* apply gain to excitation signal and add to prediction */
+ out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[ k ] ) );
+
+ /* scale to Q0 */
+ out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 );
+
+ /* saturate output */
+ out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );
+
+ /* move result into delay line */
+ S[ 15 ] = SKP_LSHIFT_SAT32( out32_Q10, 4 );
+ }
+}
+
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_LSF_cos_table.c
@@ -1,0 +1,65 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+// Q12 values (even)
+const SKP_int SKP_Silk_LSFCosTab_FIX_Q12[LSF_COS_TAB_SZ_FIX + 1] = {
+ 8192, 8190, 8182, 8170,
+ 8152, 8130, 8104, 8072,
+ 8034, 7994, 7946, 7896,
+ 7840, 7778, 7714, 7644,
+ 7568, 7490, 7406, 7318,
+ 7226, 7128, 7026, 6922,
+ 6812, 6698, 6580, 6458,
+ 6332, 6204, 6070, 5934,
+ 5792, 5648, 5502, 5352,
+ 5198, 5040, 4880, 4718,
+ 4552, 4382, 4212, 4038,
+ 3862, 3684, 3502, 3320,
+ 3136, 2948, 2760, 2570,
+ 2378, 2186, 1990, 1794,
+ 1598, 1400, 1202, 1002,
+ 802, 602, 402, 202,
+ 0, -202, -402, -602,
+ -802, -1002, -1202, -1400,
+ -1598, -1794, -1990, -2186,
+ -2378, -2570, -2760, -2948,
+ -3136, -3320, -3502, -3684,
+ -3862, -4038, -4212, -4382,
+ -4552, -4718, -4880, -5040,
+ -5198, -5352, -5502, -5648,
+ -5792, -5934, -6070, -6204,
+ -6332, -6458, -6580, -6698,
+ -6812, -6922, -7026, -7128,
+ -7226, -7318, -7406, -7490,
+ -7568, -7644, -7714, -7778,
+ -7840, -7896, -7946, -7994,
+ -8034, -8072, -8104, -8130,
+ -8152, -8170, -8182, -8190,
+ -8192
+};
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_MA.c
@@ -1,0 +1,167 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_MA.c *
+ * *
+ * Variable order MA filter *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Variable order MA filter */
+void SKP_Silk_MA(
+ const SKP_int16 *in, /* I: input signal */
+ const SKP_int16 *B, /* I: MA coefficients, Q13 [order+1] */
+ SKP_int32 *S, /* I/O: state vector [order] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len, /* I: signal length */
+ const SKP_int32 order /* I: filter order */
+)
+{
+ SKP_int k, d, in16;
+ SKP_int32 out32;
+
+ for( k = 0; k < len; k++ ) {
+ in16 = in[ k ];
+ out32 = SKP_SMLABB( S[ 0 ], in16, B[ 0 ] );
+ out32 = SKP_RSHIFT_ROUND( out32, 13 );
+
+ for( d = 1; d < order; d++ ) {
+ S[ d - 1 ] = SKP_SMLABB( S[ d ], in16, B[ d ] );
+ }
+ S[ order - 1 ] = SKP_SMULBB( in16, B[ order ] );
+
+ /* Limit */
+ out[ k ] = (SKP_int16)SKP_SAT16( out32 );
+ }
+}
+/* Variable order MA prediction error filter */
+void SKP_Silk_MA_Prediction(
+ const SKP_int16 *in, /* I: Input signal */
+ const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
+ SKP_int32 *S, /* I/O: State vector [order] */
+ SKP_int16 *out, /* O: Output signal */
+ const SKP_int32 len, /* I: Signal length */
+ const SKP_int32 order /* I: Filter order */
+)
+{
+ SKP_int k, d, in16;
+ SKP_int32 out32;
+
+ for( k = 0; k < len; k++ ) {
+ in16 = in[ k ];
+ out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ];
+ out32 = SKP_RSHIFT_ROUND( out32, 12 );
+
+ for( d = 0; d < order - 1; d++ ) {
+ S[ d ] = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B[ d ] );
+ }
+ S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );
+
+ /* Limit */
+ out[ k ] = (SKP_int16)SKP_SAT16( out32 );
+ }
+}
+
+void SKP_Silk_MA_Prediction_Q13(
+ const SKP_int16 *in, /* I: input signal */
+ const SKP_int16 *B, /* I: MA prediction coefficients, Q13 [order] */
+ SKP_int32 *S, /* I/O: state vector [order] */
+ SKP_int16 *out, /* O: output signal */
+ SKP_int32 len, /* I: signal length */
+ SKP_int32 order /* I: filter order */
+)
+{
+ SKP_int k, d, in16;
+ SKP_int32 out32;
+ for( k = 0; k < len; k++ ) {
+ in16 = in[ k ];
+ out32 = SKP_LSHIFT( in16, 13 ) - S[ 0 ];
+ out32 = SKP_RSHIFT_ROUND( out32, 13 );
+
+ for( d = 0; d < order - 1; d++ ) {
+ S[ d ] = SKP_SMLABB( S[ d + 1 ], in16, B[ d ] );
+ }
+ S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );
+
+ /* Limit */
+ out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );
+ }
+}
+
+void SKP_Silk_LPC_analysis_filter(
+ const SKP_int16 *in, /* I: Input signal */
+ const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
+ SKP_int16 *S, /* I/O: State vector [order] */
+ SKP_int16 *out, /* O: Output signal */
+ const SKP_int32 len, /* I: Signal length */
+ const SKP_int32 Order /* I: Filter order */
+)
+{
+ SKP_int k, j, idx, Order_half = SKP_RSHIFT( Order, 1 );
+ SKP_int32 out32_Q12, out32;
+ SKP_int16 SA, SB;
+ /* Order must be even */
+ SKP_assert( 2 * Order_half == Order );
+
+ /* S[] values are in Q0 */
+ for( k = 0; k < len; k++ ) {
+ SA = S[ 0 ];
+ out32_Q12 = 0;
+ for( j = 0; j < ( Order_half - 1 ); j++ ) {
+ idx = SKP_SMULBB( 2, j ) + 1;
+ /* Multiply-add two prediction coefficients for each loop */
+ SB = S[ idx ];
+ S[ idx ] = SA;
+ out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ idx - 1 ] );
+ out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ idx ] );
+ SA = S[ idx + 1 ];
+ S[ idx + 1 ] = SB;
+ }
+
+ /* Unrolled loop: epilog */
+ SB = S[ Order - 1 ];
+ S[ Order - 1 ] = SA;
+ out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ Order - 2 ] );
+ out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ Order - 1 ] );
+
+ /* Subtract prediction */
+ out32_Q12 = SKP_SUB_SAT32( SKP_LSHIFT( (SKP_int32)in[ k ], 12 ), out32_Q12 );
+
+ /* Scale to Q0 */
+ out32 = SKP_RSHIFT_ROUND( out32_Q12, 12 );
+
+ /* Saturate output */
+ out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );
+
+ /* Move input line */
+ S[ 0 ] = in[ k ];
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_MacroCount.h
@@ -1,0 +1,692 @@
+#ifndef _SIGPROCFIX_API_MACROCOUNT_H_
+#define _SIGPROCFIX_API_MACROCOUNT_H_
+#include <stdio.h>
+
+#ifdef SKP_MACRO_COUNT
+#define varDefine SKP_int64 ops_count = 0;
+
+extern SKP_int64 ops_count;
+
+SKP_INLINE SKP_int64 SKP_SaveCount(){
+ return(ops_count);
+}
+
+SKP_INLINE SKP_int64 SKP_SaveResetCount(){
+ SKP_int64 ret;
+
+ ret = ops_count;
+ ops_count = 0;
+ return(ret);
+}
+
+SKP_INLINE SKP_PrintCount(){
+ printf("ops_count = %d \n ", (SKP_int32)ops_count);
+}
+
+#undef SKP_MUL
+SKP_INLINE SKP_int32 SKP_MUL(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ ops_count += 4;
+ ret = a32 * b32;
+ return ret;
+}
+
+#undef SKP_MUL_uint
+SKP_INLINE SKP_uint32 SKP_MUL_uint(SKP_uint32 a32, SKP_uint32 b32){
+ SKP_uint32 ret;
+ ops_count += 4;
+ ret = a32 * b32;
+ return ret;
+}
+#undef SKP_MLA
+SKP_INLINE SKP_int32 SKP_MLA(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ops_count += 4;
+ ret = a32 + b32 * c32;
+ return ret;
+}
+
+#undef SKP_MLA_uint
+SKP_INLINE SKP_int32 SKP_MLA_uint(SKP_uint32 a32, SKP_uint32 b32, SKP_uint32 c32){
+ SKP_uint32 ret;
+ ops_count += 4;
+ ret = a32 + b32 * c32;
+ return ret;
+}
+
+#undef SKP_SMULWB
+SKP_INLINE SKP_int32 SKP_SMULWB(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ ops_count += 5;
+ ret = (a32 >> 16) * (SKP_int32)((SKP_int16)b32) + (((a32 & 0x0000FFFF) * (SKP_int32)((SKP_int16)b32)) >> 16);
+ return ret;
+}
+#undef SKP_SMLAWB
+SKP_INLINE SKP_int32 SKP_SMLAWB(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ops_count += 5;
+ ret = ((a32) + ((((b32) >> 16) * (SKP_int32)((SKP_int16)(c32))) + ((((b32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(c32))) >> 16)));
+ return ret;
+}
+
+#undef SKP_SMULWT
+SKP_INLINE SKP_int32 SKP_SMULWT(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ ops_count += 4;
+ ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16);
+ return ret;
+}
+#undef SKP_SMLAWT
+SKP_INLINE SKP_int32 SKP_SMLAWT(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ops_count += 4;
+ ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16));
+ return ret;
+}
+
+#undef SKP_SMULBB
+SKP_INLINE SKP_int32 SKP_SMULBB(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = (SKP_int32)((SKP_int16)a32) * (SKP_int32)((SKP_int16)b32);
+ return ret;
+}
+#undef SKP_SMLABB
+SKP_INLINE SKP_int32 SKP_SMLABB(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a32 + (SKP_int32)((SKP_int16)b32) * (SKP_int32)((SKP_int16)c32);
+ return ret;
+}
+
+#undef SKP_SMULBT
+SKP_INLINE SKP_int32 SKP_SMULBT(SKP_int32 a32, SKP_int32 b32 ){
+ SKP_int32 ret;
+ ops_count += 4;
+ ret = ((SKP_int32)((SKP_int16)a32)) * (b32 >> 16);
+ return ret;
+}
+
+#undef SKP_SMLABT
+SKP_INLINE SKP_int32 SKP_SMLABT(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a32 + ((SKP_int32)((SKP_int16)b32)) * (c32 >> 16);
+ return ret;
+}
+
+#undef SKP_SMULTT
+SKP_INLINE SKP_int32 SKP_SMULTT(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = (a32 >> 16) * (b32 >> 16);
+ return ret;
+}
+
+#undef SKP_SMLATT
+SKP_INLINE SKP_int32 SKP_SMLATT(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a32 + (b32 >> 16) * (c32 >> 16);
+ return ret;
+}
+
+
+// multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)
+#undef SKP_MLA_ovflw
+#define SKP_MLA_ovflw SKP_MLA
+
+#undef SKP_SMLABB_ovflw
+#define SKP_SMLABB_ovflw SKP_SMLABB
+
+#undef SKP_SMLABT_ovflw
+#define SKP_SMLABT_ovflw SKP_SMLABT
+
+#undef SKP_SMLATT_ovflw
+#define SKP_SMLATT_ovflw SKP_SMLATT
+
+#undef SKP_SMLAWB_ovflw
+#define SKP_SMLAWB_ovflw SKP_SMLAWB
+
+#undef SKP_SMLAWT_ovflw
+#define SKP_SMLAWT_ovflw SKP_SMLAWT
+
+#undef SKP_SMULL
+SKP_INLINE SKP_int64 SKP_SMULL(SKP_int32 a32, SKP_int32 b32){
+ SKP_int64 ret;
+ ops_count += 8;
+ ret = ((SKP_int64)(a32) * /*(SKP_int64)*/(b32));
+ return ret;
+}
+
+#undef SKP_SMLAL
+SKP_INLINE SKP_int64 SKP_SMLAL(SKP_int64 a64, SKP_int32 b32, SKP_int32 c32){
+ SKP_int64 ret;
+ ops_count += 8;
+ ret = a64 + ((SKP_int64)(b32) * /*(SKP_int64)*/(c32));
+ return ret;
+}
+#undef SKP_SMLALBB
+SKP_INLINE SKP_int64 SKP_SMLALBB(SKP_int64 a64, SKP_int16 b16, SKP_int16 c16){
+ SKP_int64 ret;
+ ops_count += 4;
+ ret = a64 + ((SKP_int64)(b16) * /*(SKP_int64)*/(c16));
+ return ret;
+}
+
+#undef SigProcFIX_CLZ16
+SKP_INLINE SKP_int32 SigProcFIX_CLZ16(SKP_int16 in16)
+{
+ SKP_int32 out32 = 0;
+ ops_count += 10;
+ if( in16 == 0 ) {
+ return 16;
+ }
+ /* test nibbles */
+ if( in16 & 0xFF00 ) {
+ if( in16 & 0xF000 ) {
+ in16 >>= 12;
+ } else {
+ out32 += 4;
+ in16 >>= 8;
+ }
+ } else {
+ if( in16 & 0xFFF0 ) {
+ out32 += 8;
+ in16 >>= 4;
+ } else {
+ out32 += 12;
+ }
+ }
+ /* test bits and return */
+ if( in16 & 0xC ) {
+ if( in16 & 0x8 )
+ return out32 + 0;
+ else
+ return out32 + 1;
+ } else {
+ if( in16 & 0xE )
+ return out32 + 2;
+ else
+ return out32 + 3;
+ }
+}
+
+#undef SigProcFIX_CLZ32
+SKP_INLINE SKP_int32 SigProcFIX_CLZ32(SKP_int32 in32)
+{
+ /* test highest 16 bits and convert to SKP_int16 */
+ ops_count += 2;
+ if( in32 & 0xFFFF0000 ) {
+ return SigProcFIX_CLZ16((SKP_int16)(in32 >> 16));
+ } else {
+ return SigProcFIX_CLZ16((SKP_int16)in32) + 16;
+ }
+}
+
+#undef SKP_DIV32
+SKP_INLINE SKP_int32 SKP_DIV32(SKP_int32 a32, SKP_int32 b32){
+ ops_count += 64;
+ return a32 / b32;
+}
+
+#undef SKP_DIV32_16
+SKP_INLINE SKP_int32 SKP_DIV32_16(SKP_int32 a32, SKP_int32 b32){
+ ops_count += 32;
+ return a32 / b32;
+}
+
+#undef SKP_SAT8
+SKP_INLINE SKP_int8 SKP_SAT8(SKP_int64 a){
+ SKP_int8 tmp;
+ ops_count += 1;
+ tmp = (SKP_int8)((a) > SKP_int8_MAX ? SKP_int8_MAX : \
+ ((a) < SKP_int8_MIN ? SKP_int8_MIN : (a)));
+ return(tmp);
+}
+
+#undef SKP_SAT16
+SKP_INLINE SKP_int16 SKP_SAT16(SKP_int64 a){
+ SKP_int16 tmp;
+ ops_count += 1;
+ tmp = (SKP_int16)((a) > SKP_int16_MAX ? SKP_int16_MAX : \
+ ((a) < SKP_int16_MIN ? SKP_int16_MIN : (a)));
+ return(tmp);
+}
+#undef SKP_SAT32
+SKP_INLINE SKP_int32 SKP_SAT32(SKP_int64 a){
+ SKP_int32 tmp;
+ ops_count += 1;
+ tmp = (SKP_int32)((a) > SKP_int32_MAX ? SKP_int32_MAX : \
+ ((a) < SKP_int32_MIN ? SKP_int32_MIN : (a)));
+ return(tmp);
+}
+#undef SKP_POS_SAT32
+SKP_INLINE SKP_int32 SKP_POS_SAT32(SKP_int64 a){
+ SKP_int32 tmp;
+ ops_count += 1;
+ tmp = (SKP_int32)((a) > SKP_int32_MAX ? SKP_int32_MAX : (a));
+ return(tmp);
+}
+
+#undef SKP_ADD_POS_SAT8
+SKP_INLINE SKP_int8 SKP_ADD_POS_SAT8(SKP_int64 a, SKP_int64 b){
+ SKP_int8 tmp;
+ ops_count += 1;
+ tmp = (SKP_int8)((((a)+(b)) & 0x80) ? SKP_int8_MAX : ((a)+(b)));
+ return(tmp);
+}
+#undef SKP_ADD_POS_SAT16
+SKP_INLINE SKP_int16 SKP_ADD_POS_SAT16(SKP_int64 a, SKP_int64 b){
+ SKP_int16 tmp;
+ ops_count += 1;
+ tmp = (SKP_int16)((((a)+(b)) & 0x8000) ? SKP_int16_MAX : ((a)+(b)));
+ return(tmp);
+}
+
+#undef SKP_ADD_POS_SAT32
+SKP_INLINE SKP_int32 SKP_ADD_POS_SAT32(SKP_int64 a, SKP_int64 b){
+ SKP_int32 tmp;
+ ops_count += 1;
+ tmp = (SKP_int32)((((a)+(b)) & 0x80000000) ? SKP_int32_MAX : ((a)+(b)));
+ return(tmp);
+}
+
+#undef SKP_ADD_POS_SAT64
+SKP_INLINE SKP_int64 SKP_ADD_POS_SAT64(SKP_int64 a, SKP_int64 b){
+ SKP_int64 tmp;
+ ops_count += 1;
+ tmp = ((((a)+(b)) & 0x8000000000000000LL) ? SKP_int64_MAX : ((a)+(b)));
+ return(tmp);
+}
+
+#undef SKP_LSHIFT8
+SKP_INLINE SKP_int8 SKP_LSHIFT8(SKP_int8 a, SKP_int32 shift){
+ SKP_int8 ret;
+ ops_count += 1;
+ ret = a << shift;
+ return ret;
+}
+#undef SKP_LSHIFT16
+SKP_INLINE SKP_int16 SKP_LSHIFT16(SKP_int16 a, SKP_int32 shift){
+ SKP_int16 ret;
+ ops_count += 1;
+ ret = a << shift;
+ return ret;
+}
+#undef SKP_LSHIFT32
+SKP_INLINE SKP_int32 SKP_LSHIFT32(SKP_int32 a, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a << shift;
+ return ret;
+}
+#undef SKP_LSHIFT64
+SKP_INLINE SKP_int64 SKP_LSHIFT64(SKP_int64 a, SKP_int shift){
+ ops_count += 1;
+ return a << shift;
+}
+
+#undef SKP_LSHIFT_ovflw
+SKP_INLINE SKP_int32 SKP_LSHIFT_ovflw(SKP_int32 a, SKP_int32 shift){
+ ops_count += 1;
+ return a << shift;
+}
+
+#undef SKP_LSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_LSHIFT_uint(SKP_uint32 a, SKP_int32 shift){
+ SKP_uint32 ret;
+ ops_count += 1;
+ ret = a << shift;
+ return ret;
+}
+
+#undef SKP_RSHIFT8
+SKP_INLINE SKP_int8 SKP_RSHIFT8(SKP_int8 a, SKP_int32 shift){
+ ops_count += 1;
+ return a >> shift;
+}
+#undef SKP_RSHIFT16
+SKP_INLINE SKP_int16 SKP_RSHIFT16(SKP_int16 a, SKP_int32 shift){
+ ops_count += 1;
+ return a >> shift;
+}
+#undef SKP_RSHIFT32
+SKP_INLINE SKP_int32 SKP_RSHIFT32(SKP_int32 a, SKP_int32 shift){
+ ops_count += 1;
+ return a >> shift;
+}
+#undef SKP_RSHIFT64
+SKP_INLINE SKP_int64 SKP_RSHIFT64(SKP_int64 a, SKP_int64 shift){
+ ops_count += 1;
+ return a >> shift;
+}
+
+#undef SKP_RSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_RSHIFT_uint(SKP_uint32 a, SKP_int32 shift){
+ ops_count += 1;
+ return a >> shift;
+}
+
+#undef SKP_ADD_LSHIFT
+SKP_INLINE SKP_int32 SKP_ADD_LSHIFT(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a + (b << shift);
+ return ret; // shift >= 0
+}
+#undef SKP_ADD_LSHIFT32
+SKP_INLINE SKP_int32 SKP_ADD_LSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a + (b << shift);
+ return ret; // shift >= 0
+}
+#undef SKP_ADD_LSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_ADD_LSHIFT_uint(SKP_uint32 a, SKP_uint32 b, SKP_int32 shift){
+ SKP_uint32 ret;
+ ops_count += 1;
+ ret = a + (b << shift);
+ return ret; // shift >= 0
+}
+#undef SKP_ADD_RSHIFT
+SKP_INLINE SKP_int32 SKP_ADD_RSHIFT(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a + (b >> shift);
+ return ret; // shift > 0
+}
+#undef SKP_ADD_RSHIFT32
+SKP_INLINE SKP_int32 SKP_ADD_RSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a + (b >> shift);
+ return ret; // shift > 0
+}
+#undef SKP_ADD_RSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_ADD_RSHIFT_uint(SKP_uint32 a, SKP_uint32 b, SKP_int32 shift){
+ SKP_uint32 ret;
+ ops_count += 1;
+ ret = a + (b >> shift);
+ return ret; // shift > 0
+}
+#undef SKP_SUB_LSHIFT32
+SKP_INLINE SKP_int32 SKP_SUB_LSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a - (b << shift);
+ return ret; // shift >= 0
+}
+#undef SKP_SUB_RSHIFT32
+SKP_INLINE SKP_int32 SKP_SUB_RSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a - (b >> shift);
+ return ret; // shift > 0
+}
+
+#undef SKP_RSHIFT_ROUND
+SKP_INLINE SKP_int32 SKP_RSHIFT_ROUND(SKP_int32 a, SKP_int32 shift){
+ SKP_int32 ret;
+ ops_count += 3;
+ ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
+ return ret;
+}
+
+#undef SKP_RSHIFT_ROUND64
+SKP_INLINE SKP_int64 SKP_RSHIFT_ROUND64(SKP_int64 a, SKP_int32 shift){
+ SKP_int64 ret;
+ ops_count += 6;
+ ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
+ return ret;
+}
+
+#undef SKP_abs_int64
+SKP_INLINE SKP_int64 SKP_abs_int64(SKP_int64 a){
+ ops_count += 1;
+ return (((a) > 0) ? (a) : -(a)); // Be careful, SKP_abs returns wrong when input equals to SKP_intXX_MIN
+}
+
+#undef SKP_abs_int32
+SKP_INLINE SKP_int32 SKP_abs_int32(SKP_int32 a){
+ ops_count += 1;
+ return abs(a);
+}
+
+
+#undef SKP_min
+static SKP_min(a, b){
+ ops_count += 1;
+ return (((a) < (b)) ? (a) : (b));
+}
+#undef SKP_max
+static SKP_max(a, b){
+ ops_count += 1;
+ return (((a) > (b)) ? (a) : (b));
+}
+#undef SKP_sign
+static SKP_sign(a){
+ ops_count += 1;
+ return ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 ));
+}
+
+#undef SKP_ADD16
+SKP_INLINE SKP_int16 SKP_ADD16(SKP_int16 a, SKP_int16 b){
+ SKP_int16 ret;
+ ops_count += 1;
+ ret = a + b;
+ return ret;
+}
+
+#undef SKP_ADD32
+SKP_INLINE SKP_int32 SKP_ADD32(SKP_int32 a, SKP_int32 b){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a + b;
+ return ret;
+}
+
+#undef SKP_ADD64
+SKP_INLINE SKP_int64 SKP_ADD64(SKP_int64 a, SKP_int64 b){
+ SKP_int64 ret;
+ ops_count += 2;
+ ret = a + b;
+ return ret;
+}
+
+#undef SKP_SUB16
+SKP_INLINE SKP_int16 SKP_SUB16(SKP_int16 a, SKP_int16 b){
+ SKP_int16 ret;
+ ops_count += 1;
+ ret = a - b;
+ return ret;
+}
+
+#undef SKP_SUB32
+SKP_INLINE SKP_int32 SKP_SUB32(SKP_int32 a, SKP_int32 b){
+ SKP_int32 ret;
+ ops_count += 1;
+ ret = a - b;
+ return ret;
+}
+
+#undef SKP_SUB64
+SKP_INLINE SKP_int64 SKP_SUB64(SKP_int64 a, SKP_int64 b){
+ SKP_int64 ret;
+ ops_count += 2;
+ ret = a - b;
+ return ret;
+}
+
+#undef SKP_ADD_SAT16
+SKP_INLINE SKP_int16 SKP_ADD_SAT16( SKP_int16 a16, SKP_int16 b16 ) {
+ SKP_int16 res;
+ // Nb will be counted in AKP_add32 and SKP_SAT16
+ res = (SKP_int16)SKP_SAT16( SKP_ADD32( (SKP_int32)(a16), (b16) ) );
+ return res;
+}
+
+#undef SKP_ADD_SAT32
+SKP_INLINE SKP_int32 SKP_ADD_SAT32(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 res;
+ ops_count += 1;
+ res = ((((a32) + (b32)) & 0x80000000) == 0 ? \
+ ((((a32) & (b32)) & 0x80000000) != 0 ? SKP_int32_MIN : (a32)+(b32)) : \
+ ((((a32) | (b32)) & 0x80000000) == 0 ? SKP_int32_MAX : (a32)+(b32)) );
+ return res;
+}
+
+#undef SKP_ADD_SAT64
+SKP_INLINE SKP_int64 SKP_ADD_SAT64( SKP_int64 a64, SKP_int64 b64 ) {
+ SKP_int64 res;
+ ops_count += 1;
+ res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \
+ ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? SKP_int64_MIN : (a64)+(b64)) : \
+ ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? SKP_int64_MAX : (a64)+(b64)) );
+ return res;
+}
+
+#undef SKP_SUB_SAT16
+SKP_INLINE SKP_int16 SKP_SUB_SAT16( SKP_int16 a16, SKP_int16 b16 ) {
+ SKP_int16 res;
+ SKP_assert(0);
+ // Nb will be counted in sub-macros
+ res = (SKP_int16)SKP_SAT16( SKP_SUB32( (SKP_int32)(a16), (b16) ) );
+ return res;
+}
+
+#undef SKP_SUB_SAT32
+SKP_INLINE SKP_int32 SKP_SUB_SAT32( SKP_int32 a32, SKP_int32 b32 ) {
+ SKP_int32 res;
+ ops_count += 1;
+ res = ((((a32)-(b32)) & 0x80000000) == 0 ? \
+ (( (a32) & ((b32)^0x80000000) & 0x80000000) ? SKP_int32_MIN : (a32)-(b32)) : \
+ ((((a32)^0x80000000) & (b32) & 0x80000000) ? SKP_int32_MAX : (a32)-(b32)) );
+ return res;
+}
+
+#undef SKP_SUB_SAT64
+SKP_INLINE SKP_int64 SKP_SUB_SAT64( SKP_int64 a64, SKP_int64 b64 ) {
+ SKP_int64 res;
+ ops_count += 1;
+ res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \
+ (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? SKP_int64_MIN : (a64)-(b64)) : \
+ ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? SKP_int64_MAX : (a64)-(b64)) );
+
+ return res;
+}
+
+#undef SKP_SMULWW
+SKP_INLINE SKP_int32 SKP_SMULWW(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ // Nb will be counted in sub-macros
+ ret = SKP_MLA(SKP_SMULWB((a32), (b32)), (a32), SKP_RSHIFT_ROUND((b32), 16));
+ return ret;
+}
+
+#undef SKP_SMLAWW
+SKP_INLINE SKP_int32 SKP_SMLAWW(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ // Nb will be counted in sub-macros
+ ret = SKP_MLA(SKP_SMLAWB((a32), (b32), (c32)), (b32), SKP_RSHIFT_ROUND((c32), 16));
+ return ret;
+}
+
+#undef SKP_min_int
+SKP_INLINE SKP_int SKP_min_int(SKP_int a, SKP_int b)
+{
+ ops_count += 1;
+ return (((a) < (b)) ? (a) : (b));
+}
+
+#undef SKP_min_16
+SKP_INLINE SKP_int16 SKP_min_16(SKP_int16 a, SKP_int16 b)
+{
+ ops_count += 1;
+ return (((a) < (b)) ? (a) : (b));
+}
+#undef SKP_min_32
+SKP_INLINE SKP_int32 SKP_min_32(SKP_int32 a, SKP_int32 b)
+{
+ ops_count += 1;
+ return (((a) < (b)) ? (a) : (b));
+}
+#undef SKP_min_64
+SKP_INLINE SKP_int64 SKP_min_64(SKP_int64 a, SKP_int64 b)
+{
+ ops_count += 1;
+ return (((a) < (b)) ? (a) : (b));
+}
+
+/* SKP_min() versions with typecast in the function call */
+#undef SKP_max_int
+SKP_INLINE SKP_int SKP_max_int(SKP_int a, SKP_int b)
+{
+ ops_count += 1;
+ return (((a) > (b)) ? (a) : (b));
+}
+#undef SKP_max_16
+SKP_INLINE SKP_int16 SKP_max_16(SKP_int16 a, SKP_int16 b)
+{
+ ops_count += 1;
+ return (((a) > (b)) ? (a) : (b));
+}
+#undef SKP_max_32
+SKP_INLINE SKP_int32 SKP_max_32(SKP_int32 a, SKP_int32 b)
+{
+ ops_count += 1;
+ return (((a) > (b)) ? (a) : (b));
+}
+
+#undef SKP_max_64
+SKP_INLINE SKP_int64 SKP_max_64(SKP_int64 a, SKP_int64 b)
+{
+ ops_count += 1;
+ return (((a) > (b)) ? (a) : (b));
+}
+
+
+#undef SKP_LIMIT_int
+SKP_INLINE SKP_int SKP_LIMIT_int(SKP_int a, SKP_int limit1, SKP_int limit2)
+{
+ SKP_int ret;
+ ops_count += 6;
+
+ ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
+ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))));
+
+ return(ret);
+}
+
+#undef SKP_LIMIT_16
+SKP_INLINE SKP_int16 SKP_LIMIT_16(SKP_int16 a, SKP_int16 limit1, SKP_int16 limit2)
+{
+ SKP_int16 ret;
+ ops_count += 6;
+
+ ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
+ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))));
+
+return(ret);
+}
+
+
+#undef SKP_LIMIT_32
+SKP_INLINE SKP_int SKP_LIMIT_32(SKP_int32 a, SKP_int32 limit1, SKP_int32 limit2)
+{
+ SKP_int32 ret;
+ ops_count += 6;
+
+ ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
+ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))));
+ return(ret);
+}
+
+#else
+#define exVarDefine
+#define varDefine
+#define SKP_SaveCount()
+
+#endif
+#endif
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_MacroDebug.h
@@ -1,0 +1,532 @@
+#ifndef _SIGPROCFIX_API_DEBUG_H_
+#define _SIGPROCFIX_API_DEBUG_H_
+
+// Redefine macro functions with extensive assertion in Win32_DEBUG mode.
+// As function can't be undefined, this file can't work with SigProcFIX_MacroCount.h
+
+#if 0 && defined (_WIN32) && defined (_DEBUG) && !defined (SKP_MACRO_COUNT)
+
+#undef SKP_ADD16
+SKP_INLINE SKP_int16 SKP_ADD16(SKP_int16 a, SKP_int16 b){
+ SKP_int16 ret;
+
+ ret = a + b;
+ SKP_assert( ret == SKP_ADD_SAT16( a, b ));
+ return ret;
+}
+
+#undef SKP_ADD32
+SKP_INLINE SKP_int32 SKP_ADD32(SKP_int32 a, SKP_int32 b){
+ SKP_int32 ret;
+
+ ret = a + b;
+ SKP_assert( ret == SKP_ADD_SAT32( a, b ));
+ return ret;
+}
+
+#undef SKP_ADD64
+SKP_INLINE SKP_int64 SKP_ADD64(SKP_int64 a, SKP_int64 b){
+ SKP_int64 ret;
+
+ ret = a + b;
+ SKP_assert( ret == SKP_ADD_SAT64( a, b ));
+ return ret;
+}
+
+#undef SKP_SUB16
+SKP_INLINE SKP_int16 SKP_SUB16(SKP_int16 a, SKP_int16 b){
+ SKP_int16 ret;
+
+ ret = a - b;
+ SKP_assert( ret == SKP_SUB_SAT16( a, b ));
+ return ret;
+}
+
+#undef SKP_SUB32
+SKP_INLINE SKP_int32 SKP_SUB32(SKP_int32 a, SKP_int32 b){
+ SKP_int32 ret;
+
+ ret = a - b;
+ SKP_assert( ret == SKP_SUB_SAT32( a, b ));
+ return ret;
+}
+
+#undef SKP_SUB64
+SKP_INLINE SKP_int64 SKP_SUB64(SKP_int64 a, SKP_int64 b){
+ SKP_int64 ret;
+
+ ret = a - b;
+ SKP_assert( ret == SKP_SUB_SAT64( a, b ));
+ return ret;
+}
+
+#undef SKP_ADD_SAT16
+SKP_INLINE SKP_int16 SKP_ADD_SAT16( SKP_int16 a16, SKP_int16 b16 ) {
+ SKP_int16 res;
+ res = (SKP_int16)SKP_SAT16( SKP_ADD32( (SKP_int32)(a16), (b16) ) );
+ SKP_assert( res == SKP_SAT16( ( SKP_int32 )a16 + ( SKP_int32 )b16 ) );
+ return res;
+}
+
+#undef SKP_ADD_SAT32
+SKP_INLINE SKP_int32 SKP_ADD_SAT32(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 res;
+ res = ((((a32) + (b32)) & 0x80000000) == 0 ? \
+ ((((a32) & (b32)) & 0x80000000) != 0 ? SKP_int32_MIN : (a32)+(b32)) : \
+ ((((a32) | (b32)) & 0x80000000) == 0 ? SKP_int32_MAX : (a32)+(b32)) );
+ SKP_assert( res == SKP_SAT32( ( SKP_int64 )a32 + ( SKP_int64 )b32 ) );
+ return res;
+}
+
+#undef SKP_ADD_SAT64
+SKP_INLINE SKP_int64 SKP_ADD_SAT64( SKP_int64 a64, SKP_int64 b64 ) {
+ SKP_int64 res;
+ res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \
+ ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? SKP_int64_MIN : (a64)+(b64)) : \
+ ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? SKP_int64_MAX : (a64)+(b64)) );
+ if( res != a64 + b64 ) {
+ // Check that we saturated to the correct extreme value
+ SKP_assert( ( res == SKP_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( SKP_int64_MAX >> 3 ) ) ) ||
+ ( res == SKP_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( SKP_int64_MIN >> 3 ) ) ) );
+ } else {
+ // Saturation not necessary
+ SKP_assert( res == a64 + b64 );
+ }
+ return res;
+}
+
+#undef SKP_SUB_SAT16
+SKP_INLINE SKP_int16 SKP_SUB_SAT16( SKP_int16 a16, SKP_int16 b16 ) {
+ SKP_int16 res;
+ res = (SKP_int16)SKP_SAT16( SKP_SUB32( (SKP_int32)(a16), (b16) ) );
+ SKP_assert( res == SKP_SAT16( ( SKP_int32 )a16 - ( SKP_int32 )b16 ) );
+ return res;
+}
+
+#undef SKP_SUB_SAT32
+SKP_INLINE SKP_int32 SKP_SUB_SAT32( SKP_int32 a32, SKP_int32 b32 ) {
+ SKP_int32 res;
+ res = ((((a32)-(b32)) & 0x80000000) == 0 ? \
+ (( (a32) & ((b32)^0x80000000) & 0x80000000) ? SKP_int32_MIN : (a32)-(b32)) : \
+ ((((a32)^0x80000000) & (b32) & 0x80000000) ? SKP_int32_MAX : (a32)-(b32)) );
+ SKP_assert( res == SKP_SAT32( ( SKP_int64 )a32 - ( SKP_int64 )b32 ) );
+ return res;
+}
+
+#undef SKP_SUB_SAT64
+SKP_INLINE SKP_int64 SKP_SUB_SAT64( SKP_int64 a64, SKP_int64 b64 ) {
+ SKP_int64 res;
+ res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \
+ (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? SKP_int64_MIN : (a64)-(b64)) : \
+ ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? SKP_int64_MAX : (a64)-(b64)) );
+
+ if( res != a64 - b64 ) {
+ // Check that we saturated to the correct extreme value
+ SKP_assert( ( res == SKP_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( SKP_int64_MAX >> 3 ) ) ) ||
+ ( res == SKP_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( SKP_int64_MIN >> 3 ) ) ) );
+ } else {
+ // Saturation not necessary
+ SKP_assert( res == a64 - b64 );
+ }
+ return res;
+}
+
+#undef SKP_MUL
+SKP_INLINE SKP_int32 SKP_MUL(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ SKP_int64 ret64; // Will easily show how many bits that are needed
+ ret = a32 * b32;
+ ret64 = (SKP_int64)a32 * (SKP_int64)b32;
+ SKP_assert((SKP_int64)ret == ret64 ); //Check output overflow
+ return ret;
+}
+
+#undef SKP_MUL_uint
+SKP_INLINE SKP_uint32 SKP_MUL_uint(SKP_uint32 a32, SKP_uint32 b32){
+ SKP_uint32 ret;
+ ret = a32 * b32;
+ SKP_assert((SKP_uint64)ret == (SKP_uint64)a32 * (SKP_uint64)b32); //Check output overflow
+ return ret;
+}
+#undef SKP_MLA
+SKP_INLINE SKP_int32 SKP_MLA(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ret = a32 + b32 * c32;
+ SKP_assert((SKP_int64)ret == (SKP_int64)a32 + (SKP_int64)b32 * (SKP_int64)c32); //Check output overflow
+ return ret;
+}
+
+#undef SKP_MLA_uint
+SKP_INLINE SKP_int32 SKP_MLA_uint(SKP_uint32 a32, SKP_uint32 b32, SKP_uint32 c32){
+ SKP_uint32 ret;
+ ret = a32 + b32 * c32;
+ SKP_assert((SKP_int64)ret == (SKP_int64)a32 + (SKP_int64)b32 * (SKP_int64)c32); //Check output overflow
+ return ret;
+}
+
+#undef SKP_SMULWB
+SKP_INLINE SKP_int32 SKP_SMULWB(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ ret = (a32 >> 16) * (SKP_int32)((SKP_int16)b32) + (((a32 & 0x0000FFFF) * (SKP_int32)((SKP_int16)b32)) >> 16);
+ SKP_assert((SKP_int64)ret == ((SKP_int64)a32 * (SKP_int16)b32) >> 16);
+ return ret;
+}
+#undef SKP_SMLAWB
+SKP_INLINE SKP_int32 SKP_SMLAWB(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ret = SKP_ADD32( a32, SKP_SMULWB( b32, c32 ) );
+ SKP_assert(SKP_ADD32( a32, SKP_SMULWB( b32, c32 ) ) == SKP_ADD_SAT32( a32, SKP_SMULWB( b32, c32 ) ));
+ return ret;
+}
+
+#undef SKP_SMULWT
+SKP_INLINE SKP_int32 SKP_SMULWT(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret;
+ ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16);
+ SKP_assert((SKP_int64)ret == ((SKP_int64)a32 * (b32 >> 16)) >> 16);
+ return ret;
+}
+#undef SKP_SMLAWT
+SKP_INLINE SKP_int32 SKP_SMLAWT(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16));
+ SKP_assert((SKP_int64)ret == (SKP_int64)a32 + (((SKP_int64)b32 * (c32 >> 16)) >> 16));
+ return ret;
+}
+
+#undef SKP_SMULL
+SKP_INLINE SKP_int64 SKP_SMULL(SKP_int64 a64, SKP_int64 b64){
+ SKP_int64 ret64;
+ ret64 = a64 * b64;
+ if( b64 != 0 ) {
+ SKP_assert( a64 == (ret64 / b64) );
+ } else if( a64 != 0 ) {
+ SKP_assert( b64 == (ret64 / a64) );
+ }
+ return ret64;
+}
+
+// no checking needed for SKP_SMULBB
+#undef SKP_SMLABB
+SKP_INLINE SKP_int32 SKP_SMLABB(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ret = a32 + (SKP_int32)((SKP_int16)b32) * (SKP_int32)((SKP_int16)c32);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a32 + (SKP_int64)b32 * (SKP_int16)c32);
+ return ret;
+}
+
+// no checking needed for SKP_SMULBT
+#undef SKP_SMLABT
+SKP_INLINE SKP_int32 SKP_SMLABT(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ret = a32 + ((SKP_int32)((SKP_int16)b32)) * (c32 >> 16);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a32 + (SKP_int64)b32 * (c32 >> 16));
+ return ret;
+}
+
+// no checking needed for SKP_SMULTT
+#undef SKP_SMLATT
+SKP_INLINE SKP_int32 SKP_SMLATT(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret;
+ ret = a32 + (b32 >> 16) * (c32 >> 16);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a32 + (b32 >> 16) * (c32 >> 16));
+ return ret;
+}
+
+#undef SKP_SMULWW
+SKP_INLINE SKP_int32 SKP_SMULWW(SKP_int32 a32, SKP_int32 b32){
+ SKP_int32 ret, tmp1, tmp2;
+ SKP_int64 ret64;
+
+ ret = SKP_SMULWB( a32, b32 );
+ tmp1 = SKP_RSHIFT_ROUND( b32, 16 );
+ tmp2 = SKP_MUL( a32, tmp1 );
+
+ SKP_assert( (SKP_int64)tmp2 == (SKP_int64) a32 * (SKP_int64) tmp1 );
+
+ tmp1 = ret;
+ ret = SKP_ADD32( tmp1, tmp2 );
+ SKP_assert( SKP_ADD32( tmp1, tmp2 ) == SKP_ADD_SAT32( tmp1, tmp2 ) );
+
+ ret64 = SKP_RSHIFT64( SKP_SMULL( a32, b32 ), 16 );
+ SKP_assert( (SKP_int64)ret == ret64 );
+
+ return ret;
+}
+
+#undef SKP_SMLAWW
+SKP_INLINE SKP_int32 SKP_SMLAWW(SKP_int32 a32, SKP_int32 b32, SKP_int32 c32){
+ SKP_int32 ret, tmp;
+
+ tmp = SKP_SMULWW( b32, c32 );
+ ret = SKP_ADD32( a32, tmp );
+ SKP_assert( ret == SKP_ADD_SAT32( a32, tmp ) );
+ return ret;
+}
+
+// multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)
+#undef SKP_MLA_ovflw
+#define SKP_MLA_ovflw(a32, b32, c32) ((a32) + ((b32) * (c32)))
+#undef SKP_SMLABB_ovflw
+#define SKP_SMLABB_ovflw(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * (SKP_int32)((SKP_int16)(c32)))
+#undef SKP_SMLABT_ovflw
+#define SKP_SMLABT_ovflw(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * ((c32) >> 16))
+#undef SKP_SMLATT_ovflw
+#define SKP_SMLATT_ovflw(a32, b32, c32) ((a32) + ((b32) >> 16) * ((c32) >> 16))
+#undef SKP_SMLAWB_ovflw
+#define SKP_SMLAWB_ovflw(a32, b32, c32) ((a32) + ((((b32) >> 16) * (SKP_int32)((SKP_int16)(c32))) + ((((b32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(c32))) >> 16)))
+#undef SKP_SMLAWT_ovflw
+#define SKP_SMLAWT_ovflw(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16))
+
+// no checking needed for SKP_SMULL
+// no checking needed for SKP_SMLAL
+// no checking needed for SKP_SMLALBB
+// no checking needed for SigProcFIX_CLZ16
+// no checking needed for SigProcFIX_CLZ32
+
+#undef SKP_DIV32
+SKP_INLINE SKP_int32 SKP_DIV32(SKP_int32 a32, SKP_int32 b32){
+ SKP_assert( b32 != 0 );
+ return a32 / b32;
+}
+
+#undef SKP_DIV32_16
+SKP_INLINE SKP_int32 SKP_DIV32_16(SKP_int32 a32, SKP_int32 b32){
+ SKP_assert( b32 != 0 );
+ SKP_assert( b32 <= SKP_int16_MAX );
+ SKP_assert( b32 >= SKP_int16_MIN );
+ return a32 / b32;
+}
+
+// no checking needed for SKP_SAT8
+// no checking needed for SKP_SAT16
+// no checking needed for SKP_SAT32
+// no checking needed for SKP_POS_SAT32
+// no checking needed for SKP_ADD_POS_SAT8
+// no checking needed for SKP_ADD_POS_SAT16
+// no checking needed for SKP_ADD_POS_SAT32
+// no checking needed for SKP_ADD_POS_SAT64
+#undef SKP_LSHIFT8
+SKP_INLINE SKP_int8 SKP_LSHIFT8(SKP_int8 a, SKP_int32 shift){
+ SKP_int8 ret;
+ ret = a << shift;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift < 8);
+ SKP_assert((SKP_int64)ret == ((SKP_int64)a) << shift);
+ return ret;
+}
+#undef SKP_LSHIFT16
+SKP_INLINE SKP_int16 SKP_LSHIFT16(SKP_int16 a, SKP_int32 shift){
+ SKP_int16 ret;
+ ret = a << shift;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift < 16);
+ SKP_assert((SKP_int64)ret == ((SKP_int64)a) << shift);
+ return ret;
+}
+#undef SKP_LSHIFT32
+SKP_INLINE SKP_int32 SKP_LSHIFT32(SKP_int32 a, SKP_int32 shift){
+ SKP_int32 ret;
+ ret = a << shift;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift < 32);
+ SKP_assert((SKP_int64)ret == ((SKP_int64)a) << shift);
+ return ret;
+}
+#undef SKP_LSHIFT64
+SKP_INLINE SKP_int64 SKP_LSHIFT64(SKP_int64 a, SKP_int shift){
+ SKP_assert(shift >= 0);
+ SKP_assert(shift < 64);
+ return a << shift;
+}
+
+#undef SKP_LSHIFT_ovflw
+SKP_INLINE SKP_int32 SKP_LSHIFT_ovflw(SKP_int32 a, SKP_int32 shift){
+ SKP_assert(shift >= 0); /* no check for overflow */
+ return a << shift;
+}
+
+#undef SKP_LSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_LSHIFT_uint(SKP_uint32 a, SKP_int32 shift){
+ SKP_uint32 ret;
+ ret = a << shift;
+ SKP_assert(shift >= 0);
+ SKP_assert((SKP_int64)ret == ((SKP_int64)a) << shift);
+ return ret;
+}
+
+#undef SKP_RSHIFT8
+SKP_INLINE SKP_int8 SKP_RSHIFT8(SKP_int8 a, SKP_int32 shift){
+ SKP_assert(shift >= 0);
+ SKP_assert(shift < 8);
+ return a >> shift;
+}
+#undef SKP_RSHIFT16
+SKP_INLINE SKP_int16 SKP_RSHIFT16(SKP_int16 a, SKP_int32 shift){
+ SKP_assert(shift >= 0);
+ SKP_assert(shift < 16);
+ return a >> shift;
+}
+#undef SKP_RSHIFT32
+SKP_INLINE SKP_int32 SKP_RSHIFT32(SKP_int32 a, SKP_int32 shift){
+ SKP_assert(shift >= 0);
+ SKP_assert(shift < 32);
+ return a >> shift;
+}
+#undef SKP_RSHIFT64
+SKP_INLINE SKP_int64 SKP_RSHIFT64(SKP_int64 a, SKP_int64 shift){
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 63);
+ return a >> shift;
+}
+
+#undef SKP_RSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_RSHIFT_uint(SKP_uint32 a, SKP_int32 shift){
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 32);
+ return a >> shift;
+}
+
+#undef SKP_ADD_LSHIFT
+SKP_INLINE SKP_int32 SKP_ADD_LSHIFT(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 31);
+ ret = a + (b << shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a + (((SKP_int64)b) << shift));
+ return ret; // shift >= 0
+}
+#undef SKP_ADD_LSHIFT32
+SKP_INLINE SKP_int32 SKP_ADD_LSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 31);
+ ret = a + (b << shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a + (((SKP_int64)b) << shift));
+ return ret; // shift >= 0
+}
+#undef SKP_ADD_LSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_ADD_LSHIFT_uint(SKP_uint32 a, SKP_uint32 b, SKP_int32 shift){
+ SKP_uint32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 32);
+ ret = a + (b << shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a + (((SKP_int64)b) << shift));
+ return ret; // shift >= 0
+}
+#undef SKP_ADD_RSHIFT
+SKP_INLINE SKP_int32 SKP_ADD_RSHIFT(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 31);
+ ret = a + (b >> shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a + (((SKP_int64)b) >> shift));
+ return ret; // shift > 0
+}
+#undef SKP_ADD_RSHIFT32
+SKP_INLINE SKP_int32 SKP_ADD_RSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 31);
+ ret = a + (b >> shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a + (((SKP_int64)b) >> shift));
+ return ret; // shift > 0
+}
+#undef SKP_ADD_RSHIFT_uint
+SKP_INLINE SKP_uint32 SKP_ADD_RSHIFT_uint(SKP_uint32 a, SKP_uint32 b, SKP_int32 shift){
+ SKP_uint32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 32);
+ ret = a + (b >> shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a + (((SKP_int64)b) >> shift));
+ return ret; // shift > 0
+}
+#undef SKP_SUB_LSHIFT32
+SKP_INLINE SKP_int32 SKP_SUB_LSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 31);
+ ret = a - (b << shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a - (((SKP_int64)b) << shift));
+ return ret; // shift >= 0
+}
+#undef SKP_SUB_RSHIFT32
+SKP_INLINE SKP_int32 SKP_SUB_RSHIFT32(SKP_int32 a, SKP_int32 b, SKP_int32 shift){
+ SKP_int32 ret;
+ SKP_assert(shift >= 0);
+ SKP_assert(shift <= 31);
+ ret = a - (b >> shift);
+ SKP_assert((SKP_int64)ret == (SKP_int64)a - (((SKP_int64)b) >> shift));
+ return ret; // shift > 0
+}
+
+#undef SKP_RSHIFT_ROUND
+SKP_INLINE SKP_int32 SKP_RSHIFT_ROUND(SKP_int32 a, SKP_int32 shift){
+ SKP_int32 ret;
+ SKP_assert(shift > 0); /* the marco definition can't handle a shift of zero */
+ SKP_assert(shift < 32);
+ ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
+ SKP_assert((SKP_int64)ret == ((SKP_int64)a + ((SKP_int64)1 << (shift - 1))) >> shift);
+ return ret;
+}
+
+#undef SKP_RSHIFT_ROUND64
+SKP_INLINE SKP_int64 SKP_RSHIFT_ROUND64(SKP_int64 a, SKP_int32 shift){
+ SKP_int64 ret;
+ SKP_assert(shift > 0); /* the marco definition can't handle a shift of zero */
+ SKP_assert(shift < 64);
+ ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1;
+ return ret;
+}
+
+// SKP_abs is used on floats also, so doesn't work...
+//#undef SKP_abs
+//SKP_INLINE SKP_int32 SKP_abs(SKP_int32 a){
+// SKP_assert(a != 0x80000000);
+// return (((a) > 0) ? (a) : -(a)); // Be careful, SKP_abs returns wrong when input equals to SKP_intXX_MIN
+//}
+
+#undef SKP_abs_int64
+SKP_INLINE SKP_int64 SKP_abs_int64(SKP_int64 a){
+ SKP_assert(a != 0x8000000000000000);
+ return (((a) > 0) ? (a) : -(a)); // Be careful, SKP_abs returns wrong when input equals to SKP_intXX_MIN
+}
+
+#undef SKP_abs_int32
+SKP_INLINE SKP_int32 SKP_abs_int32(SKP_int32 a){
+ SKP_assert(a != 0x80000000);
+ return abs(a);
+}
+
+#undef SKP_CHECK_FIT8
+SKP_INLINE SKP_int8 SKP_CHECK_FIT8( SKP_int64 a ){
+ SKP_int8 ret;
+ ret = (SKP_int8)a;
+ SKP_assert( (SKP_int64)ret == a );
+ return( ret );
+}
+
+#undef SKP_CHECK_FIT16
+SKP_INLINE SKP_int16 SKP_CHECK_FIT16( SKP_int64 a ){
+ SKP_int16 ret;
+ ret = (SKP_int16)a;
+ SKP_assert( (SKP_int64)ret == a );
+ return( ret );
+}
+
+#undef SKP_CHECK_FIT32
+SKP_INLINE SKP_int32 SKP_CHECK_FIT32( SKP_int64 a ){
+ SKP_int32 ret;
+ ret = (SKP_int32)a;
+ SKP_assert( (SKP_int64)ret == a );
+ return( ret );
+}
+
+// no checking for SKP_NSHIFT_MUL_32_32
+// no checking for SKP_NSHIFT_MUL_16_16
+// no checking needed for SKP_min
+// no checking needed for SKP_max
+// no checking needed for SKP_sign
+
+#endif
+#endif
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_NLSF2A.c
@@ -1,0 +1,151 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* conversion between prediction filter coefficients and LSFs */
+/* order should be even */
+/* a piecewise linear approximation maps LSF <-> cos(LSF) */
+/* therefore the result is not accurate LSFs, but the two */
+/* function are accurate inverses of each other */
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* helper function for NLSF2A(..) */
+SKP_INLINE void SKP_Silk_NLSF2A_find_poly(
+ SKP_int32 *out, /* o intermediate polynomial, Q20 */
+ const SKP_int32 *cLSF, /* i vector of interleaved 2*cos(LSFs), Q20 */
+ SKP_int dd /* i polynomial order (= 1/2 * filter order) */
+)
+{
+ SKP_int k, n;
+ SKP_int32 ftmp;
+
+ out[0] = SKP_LSHIFT( 1, 20 );
+ out[1] = -cLSF[0];
+ for( k = 1; k < dd; k++ ) {
+ ftmp = cLSF[2*k]; // Q20
+ out[k+1] = SKP_LSHIFT( out[k-1], 1 ) - (SKP_int32)SKP_RSHIFT_ROUND64( SKP_SMULL( ftmp, out[k] ), 20 );
+ for( n = k; n > 1; n-- ) {
+ out[n] += out[n-2] - (SKP_int32)SKP_RSHIFT_ROUND64( SKP_SMULL( ftmp, out[n-1] ), 20 );
+ }
+ out[1] -= ftmp;
+ }
+}
+
+/* compute whitening filter coefficients from normalized line spectral frequencies */
+void SKP_Silk_NLSF2A(
+ SKP_int16 *a, /* o monic whitening filter coefficients in Q12, [d] */
+ const SKP_int *NLSF, /* i normalized line spectral frequencies in Q15, [d] */
+ const SKP_int d /* i filter order (should be even) */
+)
+{
+ SKP_int k, i, dd;
+ SKP_int32 cos_LSF_Q20[SKP_Silk_MAX_ORDER_LPC];
+ SKP_int32 P[SKP_Silk_MAX_ORDER_LPC/2+1], Q[SKP_Silk_MAX_ORDER_LPC/2+1];
+ SKP_int32 Ptmp, Qtmp;
+ SKP_int32 f_int;
+ SKP_int32 f_frac;
+ SKP_int32 cos_val, delta;
+ SKP_int32 a_int32[SKP_Silk_MAX_ORDER_LPC];
+ SKP_int32 maxabs, absval, idx=0, sc_Q16;
+
+ SKP_assert(LSF_COS_TAB_SZ_FIX == 128);
+
+ /* convert LSFs to 2*cos(LSF(i)), using piecewise linear curve from table */
+ for( k = 0; k < d; k++ ) {
+ SKP_assert(NLSF[k] >= 0 );
+ SKP_assert(NLSF[k] <= 32767 );
+
+ /* f_int on a scale 0-127 (rounded down) */
+ f_int = SKP_RSHIFT( NLSF[k], 15 - 7 );
+
+ /* f_frac, range: 0..255 */
+ f_frac = NLSF[k] - SKP_LSHIFT( f_int, 15 - 7 );
+
+ SKP_assert(f_int >= 0);
+ SKP_assert(f_int < LSF_COS_TAB_SZ_FIX );
+
+ /* Read start and end value from table */
+ cos_val = SKP_Silk_LSFCosTab_FIX_Q12[ f_int ]; /* Q12 */
+ delta = SKP_Silk_LSFCosTab_FIX_Q12[ f_int + 1 ] - cos_val; /* Q12, with a range of 0..200 */
+
+ /* Linear interpolation */
+ cos_LSF_Q20[k] = SKP_LSHIFT( cos_val, 8 ) + SKP_MUL( delta, f_frac ); /* Q20 */
+ }
+
+ dd = SKP_RSHIFT( d, 1 );
+
+ /* generate even and odd polynomials using convolution */
+ SKP_Silk_NLSF2A_find_poly( P, &cos_LSF_Q20[0], dd );
+ SKP_Silk_NLSF2A_find_poly( Q, &cos_LSF_Q20[1], dd );
+
+ /* convert even and odd polynomials to SKP_int32 Q12 filter coefs */
+ for( k = 0; k < dd; k++ ) {
+ Ptmp = P[k+1] + P[k];
+ Qtmp = Q[k+1] - Q[k];
+
+ /* the Ptmp and Qtmp values at this stage need to fit in int32 */
+
+ a_int32[k] = -SKP_RSHIFT_ROUND( Ptmp + Qtmp, 9 ); /* Q20 -> Q12 */
+ a_int32[d-k-1] = SKP_RSHIFT_ROUND( Qtmp - Ptmp, 9 ); /* Q20 -> Q12 */
+ }
+
+ /* Limit the maximum absolute value of the prediction coefficients */
+ for( i = 0; i < 10; i++ ) {
+ /* Find maximum absolute value and its index */
+ maxabs = 0;
+ for( k = 0; k < d; k++ ) {
+ absval = SKP_abs( a_int32[k] );
+ if( absval > maxabs ) {
+ maxabs = absval;
+ idx = k;
+ }
+ }
+
+ if( maxabs > SKP_int16_MAX ) {
+ /* Reduce magnitude of prediction coefficients */
+ maxabs = SKP_min( maxabs, 98369 ); // ( SKP_int32_MAX / ( 65470 >> 2 ) ) + SKP_int16_MAX = 98369
+ sc_Q16 = 65470 - SKP_DIV32( SKP_MUL( 65470 >> 2, maxabs - SKP_int16_MAX ),
+ SKP_RSHIFT32( SKP_MUL( maxabs, idx + 1), 2 ) );
+ SKP_Silk_bwexpander_32( a_int32, d, sc_Q16 );
+ } else {
+ break;
+ }
+ }
+
+ /* Reached the last iteration */
+ if( i == 10 ) {
+ SKP_assert(0);
+ for( k = 0; k < d; k++ ) {
+ a_int32[k] = SKP_SAT16( a_int32[k] );
+ }
+ }
+
+ /* Return as SKP_int16 Q12 coefficients */
+ for( k = 0; k < d; k++ ) {
+ a[k] = (SKP_int16)a_int32[k];
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_NLSF_VQ_weights_laroia.c
@@ -1,0 +1,78 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/*
+R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP
+Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech,
+Signal Processing, pp. 641-644, 1991.
+*/
+
+#define Q_OUT 6
+
+/* Laroia low complexity NLSF weights */
+void SKP_Silk_NLSF_VQ_weights_laroia(
+ SKP_int *pNLSFW_Q6, /* O: Pointer to input vector weights [D x 1] */
+ const SKP_int *pNLSF_Q15, /* I: Pointer to input vector [D x 1] */
+ const SKP_int D /* I: Input vector dimension (even) */
+)
+{
+ SKP_int k;
+ SKP_int32 tmp1_int, tmp2_int;
+
+ /* Check that we are guaranteed to end up within the required range */
+ SKP_assert( D > 0 );
+ SKP_assert( ( D & 1 ) == 0 );
+
+ /* First value */
+ tmp1_int = SKP_max_int( pNLSF_Q15[ 0 ], 1 );
+ tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int );
+ tmp2_int = SKP_max_int( pNLSF_Q15[ 1 ] - pNLSF_Q15[ 0 ], 1 );
+ tmp2_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp2_int );
+ pNLSFW_Q6[ 0 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
+ SKP_assert( pNLSFW_Q6[ 0 ] > 0 );
+
+ /* Main loop */
+ for( k = 1; k < D - 1; k += 2 ) {
+ tmp1_int = SKP_max_int( pNLSF_Q15[ k + 1 ] - pNLSF_Q15[ k ], 1 );
+ tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int );
+ pNLSFW_Q6[ k ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
+ SKP_assert( pNLSFW_Q6[ k ] > 0 );
+
+ tmp2_int = SKP_max_int( pNLSF_Q15[ k + 2 ] - pNLSF_Q15[ k + 1 ], 1 );
+ tmp2_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp2_int );
+ pNLSFW_Q6[ k + 1 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
+ SKP_assert( pNLSFW_Q6[ k + 1 ] > 0 );
+ }
+
+ /* Last value */
+ tmp1_int = SKP_max_int( ( 1 << 15 ) - pNLSF_Q15[ D - 1 ], 1 );
+ tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int );
+ pNLSFW_Q6[ D - 1 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX );
+ SKP_assert( pNLSFW_Q6[ D - 1 ] > 0 );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_NLSF_stabilize.c
@@ -1,0 +1,154 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* NLSF stabilizer: */
+/* */
+/* - Moves NLSFs futher apart if they are too close */
+/* - Moves NLSFs away from borders if they are too close */
+/* - High effort to achieve a modification with minimum */
+/* Euclidean distance to input vector */
+/* - Output are sorted NLSF coefficients */
+/* */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Constant Definitions */
+#define MAX_LOOPS 20
+
+/* NLSF stabilizer, for a single input data vector */
+void SKP_Silk_NLSF_stabilize(
+ SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vector in Q15 [L] */
+ const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
+ const SKP_int L /* I: Number of NLSF parameters in the input vector */
+)
+{
+ SKP_int center_freq_Q15, diff_Q15, min_center_Q15, max_center_Q15;
+ SKP_int32 min_diff_Q15;
+ SKP_int loops;
+ SKP_int i, I=0, k;
+
+ /* This is necessary to ensure an output within range of a SKP_int16 */
+ SKP_assert( NDeltaMin_Q15[L] >= 1 );
+
+ for( loops = 0; loops < MAX_LOOPS; loops++ ) {
+ /**************************/
+ /* Find smallest distance */
+ /**************************/
+ /* First element */
+ min_diff_Q15 = NLSF_Q15[0] - NDeltaMin_Q15[0];
+ I = 0;
+ /* Middle elements */
+ for( i = 1; i <= L-1; i++ ) {
+ diff_Q15 = NLSF_Q15[i] - ( NLSF_Q15[i-1] + NDeltaMin_Q15[i] );
+ if( diff_Q15 < min_diff_Q15 ) {
+ min_diff_Q15 = diff_Q15;
+ I = i;
+ }
+ }
+ /* Last element */
+ diff_Q15 = (1<<15) - ( NLSF_Q15[L-1] + NDeltaMin_Q15[L] );
+ if( diff_Q15 < min_diff_Q15 ) {
+ min_diff_Q15 = diff_Q15;
+ I = L;
+ }
+
+ /***************************************************/
+ /* Now check if the smallest distance non-negative */
+ /***************************************************/
+ if (min_diff_Q15 >= 0) {
+ return;
+ }
+
+ if( I == 0 ) {
+ /* Move away from lower limit */
+ NLSF_Q15[0] = NDeltaMin_Q15[0];
+
+ } else if( I == L) {
+ /* Move away from higher limit */
+ NLSF_Q15[L-1] = (1<<15) - NDeltaMin_Q15[L];
+
+ } else {
+ /* Find the lower extreme for the location of the current center frequency */
+ min_center_Q15 = 0;
+ for( k = 0; k < I; k++ ) {
+ min_center_Q15 += NDeltaMin_Q15[k];
+ }
+ min_center_Q15 += SKP_RSHIFT( NDeltaMin_Q15[I], 1 );
+
+ /* Find the upper extreme for the location of the current center frequency */
+ max_center_Q15 = (1<<15);
+ for( k = L; k > I; k-- ) {
+ max_center_Q15 -= NDeltaMin_Q15[k];
+ }
+ max_center_Q15 -= ( NDeltaMin_Q15[I] - SKP_RSHIFT( NDeltaMin_Q15[I], 1 ) );
+
+ /* Move apart, sorted by value, keeping the same center frequency */
+ center_freq_Q15 = SKP_LIMIT_32( SKP_RSHIFT_ROUND( (SKP_int32)NLSF_Q15[I-1] + (SKP_int32)NLSF_Q15[I], 1 ),
+ min_center_Q15, max_center_Q15 );
+ NLSF_Q15[I-1] = center_freq_Q15 - SKP_RSHIFT( NDeltaMin_Q15[I], 1 );
+ NLSF_Q15[I] = NLSF_Q15[I-1] + NDeltaMin_Q15[I];
+ }
+ }
+
+ /* Safe and simple fall back method, which is less ideal than the above */
+ if( loops == MAX_LOOPS )
+ {
+ /* Insertion sort (fast for already almost sorted arrays): */
+ /* Best case: O(n) for an already sorted array */
+ /* Worst case: O(n^2) for an inversely sorted array */
+ SKP_Silk_insertion_sort_increasing_all_values(&NLSF_Q15[0], L);
+
+ /* First NLSF should be no less than NDeltaMin[0] */
+ NLSF_Q15[0] = SKP_max_int( NLSF_Q15[0], NDeltaMin_Q15[0] );
+
+ /* Keep delta_min distance between the NLSFs */
+ for( i = 1; i < L; i++ )
+ NLSF_Q15[i] = SKP_max_int( NLSF_Q15[i], NLSF_Q15[i-1] + NDeltaMin_Q15[i] );
+
+ /* Last NLSF should be no higher than 1 - NDeltaMin[L] */
+ NLSF_Q15[L-1] = SKP_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] );
+
+ /* Keep NDeltaMin distance between the NLSFs */
+ for( i = L-2; i >= 0; i-- )
+ NLSF_Q15[i] = SKP_min_int( NLSF_Q15[i], NLSF_Q15[i+1] - NDeltaMin_Q15[i+1] );
+ }
+}
+
+/* NLSF stabilizer, over multiple input column data vectors */
+void SKP_Silk_NLSF_stabilize_multi(
+ SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vectors in Q15 [LxN] */
+ const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
+ const SKP_int N, /* I: Number of input vectors to be stabilized */
+ const SKP_int L /* I: NLSF vector dimension */
+)
+{
+ SKP_int n;
+
+ /* loop over input data */
+ for( n = 0; n < N; n++ ) {
+ SKP_Silk_NLSF_stabilize( &NLSF_Q15[n * L], NDeltaMin_Q15, L );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_SigProc_FIX.h
@@ -1,0 +1,767 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+
+#ifndef _SKP_SILK_SIGPROC_FIX_H_
+#define _SKP_SILK_SIGPROC_FIX_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//#define SKP_MACRO_COUNT /* Used to enable WMOPS counting */
+
+#define SKP_Silk_MAX_ORDER_LPC 16 /* max order of the LPC analysis in schur() and k2a() */
+#define SKP_Silk_MAX_CORRELATION_LENGTH 640 /* max input length to the correlation */
+#include "SKP_Silk_typedef.h"
+#include <string.h>
+#include <stdlib.h> /* for abs() */
+#include "SKP_Silk_resampler_structs.h"
+
+# include "SKP_Silk_macros.h"
+
+
+
+/********************************************************************/
+/* SIGNAL PROCESSING FUNCTIONS */
+/********************************************************************/
+
+/*!
+ * Initialize/reset the resampler state for a given pair of input/output sampling rates
+*/
+SKP_int SKP_Silk_resampler_init(
+ SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */
+ SKP_int32 Fs_Hz_in, /* I: Input sampling rate (Hz) */
+ SKP_int32 Fs_Hz_out /* I: Output sampling rate (Hz) */
+);
+
+
+/*!
+ * Clear the states of all resampling filters, without resetting sampling rate ratio
+ */
+SKP_int SKP_Silk_resampler_clear(
+ SKP_Silk_resampler_state_struct *S /* I/O: Resampler state */
+);
+
+/*!
+ * Resampler: convert from one sampling rate to another
+ */
+SKP_int SKP_Silk_resampler(
+ SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+);
+
+/*!
+ Upsample 2x, low quality
+ */
+void SKP_Silk_resampler_up2(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ 2 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of INPUT samples */
+);
+
+/*!
+* Downsample 2x, mediocre quality
+*/
+void SKP_Silk_resampler_down2(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ len ] */
+ const SKP_int16 *in, /* I: Input signal [ 2 * len ] */
+ SKP_int32 len /* I: Number of OUTPUT samples */
+);
+
+
+/*!
+ * Downsample by a factor 2/3, low quality
+*/
+void SKP_Silk_resampler_down2_3(
+ SKP_int32 *S, /* I/O: State vector [ 6 ] */
+ SKP_int16 *out, /* O: Output signal [ floor(2*inLen/3) ] */
+ const SKP_int16 *in, /* I: Input signal [ inLen ] */
+ SKP_int32 inLen /* I: Number of input samples */
+);
+
+/*!
+ * Downsamples by a factor 3, low quality
+*/
+void SKP_Silk_resampler_down3(
+ SKP_int32 *S, /* I/O: State vector [ 8 ] */
+ SKP_int16 *out, /* O: Output signal [ floor(inLen/3) ] */
+ const SKP_int16 *in, /* I: Input signal [ inLen ] */
+ SKP_int32 inLen /* I: Number of input samples */
+);
+
+/*!
+ * First order low-pass filter, with input as SKP_int16, running at 48 kHz
+ */
+void SKP_Silk_lowpass_short(
+ const SKP_int16 *in, /* I: Q15 48 kHz signal; [len] */
+ SKP_int32 *S, /* I/O: Q25 state; length = 1 */
+ SKP_int32 *out, /* O: Q25 48 kHz signal; [len] */
+ const SKP_int32 len /* O: Signal length */
+);
+
+/*!
+ * First order low-pass filter, with input as SKP_int32, running at 48 kHz
+ */
+void SKP_Silk_lowpass_int(
+ const SKP_int32 *in, /* I: Q25 48 kHz signal; length = len */
+ SKP_int32 *S, /* I/O: Q25 state; length = 1 */
+ SKP_int32 *out, /* O: Q25 48 kHz signal; length = len */
+ const SKP_int32 len /* I: Number of samples */
+);
+
+/*!
+ * First-order allpass filter
+ */
+void SKP_Silk_allpass_int(
+ const SKP_int32 *in, /* I: Q25 input signal [len] */
+ SKP_int32 *S, /* I/O: Q25 state [1] */
+ SKP_int A, /* I: Q15 coefficient (0 <= A < 32768) */
+ SKP_int32 *out, /* O: Q25 output signal [len] */
+ const SKP_int32 len /* I: Number of samples */
+);
+
+/*!
+ * second order ARMA filter
+ * can handle (slowly) varying coefficients
+ */
+void SKP_Silk_biquad(
+ const SKP_int16 *in, /* I: input signal */
+ const SKP_int16 *B, /* I: MA coefficients, Q13 [3] */
+ const SKP_int16 *A, /* I: AR coefficients, Q13 [2] */
+ SKP_int32 *S, /* I/O: state vector [2] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len /* I: signal length */
+);
+/*!
+ * second order ARMA filter;
+ * slower than biquad() but uses more precise coefficients
+ * can handle (slowly) varying coefficients
+ */
+void SKP_Silk_biquad_alt(
+ const SKP_int16 *in, /* I: input signal */
+ const SKP_int32 *B_Q28, /* I: MA coefficients [3] */
+ const SKP_int32 *A_Q28, /* I: AR coefficients [2] */
+ SKP_int32 *S, /* I/O: state vector [2] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len /* I: signal length (must be even) */
+);
+
+/*!
+ * variable order MA filter. Prediction error filter implementation. Coeficients negated and starting with coef to x[n - 1]
+ */
+void SKP_Silk_MA_Prediction(
+ const SKP_int16 *in, /* I: Input signal */
+ const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
+ SKP_int32 *S, /* I/O: State vector [order] */
+ SKP_int16 *out, /* O: Output signal */
+ const SKP_int32 len, /* I: Signal length */
+ const SKP_int32 order /* I: Filter order */
+);
+
+void SKP_Silk_MA_Prediction_Q13(
+ const SKP_int16 *in, /* I: input signal */
+ const SKP_int16 *B, /* I: MA prediction coefficients, Q13 [order] */
+ SKP_int32 *S, /* I/O: state vector [order] */
+ SKP_int16 *out, /* O: output signal */
+ SKP_int32 len, /* I: signal length */
+ SKP_int32 order /* I: filter order */
+);
+
+/*!
+ * 16th order AR filter for LPC synthesis, coefficients are in Q12
+ */
+void SKP_Silk_LPC_synthesis_order16(
+ const SKP_int16 *in, /* I: excitation signal */
+ const SKP_int16 *A_Q12, /* I: AR coefficients [16], between -8_Q0 and 8_Q0 */
+ const SKP_int32 Gain_Q26, /* I: gain */
+ SKP_int32 *S, /* I/O: state vector [16] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len /* I: signal length, must be multiple of 16 */
+);
+
+/* variable order MA prediction error filter. */
+/* Inverse filter of SKP_Silk_LPC_synthesis_filter */
+void SKP_Silk_LPC_analysis_filter(
+ const SKP_int16 *in, /* I: Input signal */
+ const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */
+ SKP_int16 *S, /* I/O: State vector [order] */
+ SKP_int16 *out, /* O: Output signal */
+ const SKP_int32 len, /* I: Signal length */
+ const SKP_int32 Order /* I: Filter order */
+);
+
+/* even order AR filter */
+void SKP_Silk_LPC_synthesis_filter(
+ const SKP_int16 *in, /* I: excitation signal */
+ const SKP_int16 *A_Q12, /* I: AR coefficients [Order], between -8_Q0 and 8_Q0 */
+ const SKP_int32 Gain_Q26, /* I: gain */
+ SKP_int32 *S, /* I/O: state vector [Order] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len, /* I: signal length */
+ const SKP_int Order /* I: filter order, must be even */
+);
+
+/* Chirp (bandwidth expand) LP AR filter */
+void SKP_Silk_bwexpander(
+ SKP_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* I Length of ar */
+ SKP_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */
+);
+
+/* Chirp (bandwidth expand) LP AR filter */
+void SKP_Silk_bwexpander_32(
+ SKP_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* I Length of ar */
+ SKP_int32 chirp_Q16 /* I Chirp factor in Q16 */
+);
+
+/* Compute inverse of LPC prediction gain, and */
+/* test if LPC coefficients are stable (all poles within unit circle) */
+SKP_int SKP_Silk_LPC_inverse_pred_gain( /* O: Returns 1 if unstable, otherwise 0 */
+ SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
+ const SKP_int16 *A_Q12, /* I: Prediction coefficients, Q12 [order] */
+ const SKP_int order /* I: Prediction order */
+);
+
+SKP_int SKP_Silk_LPC_inverse_pred_gain_Q24( /* O: Returns 1 if unstable, otherwise 0 */
+ SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */
+ const SKP_int32 *A_Q24, /* I: Prediction coefficients, Q24 [order] */
+ const SKP_int order /* I: Prediction order */
+);
+
+/* split signal in two decimated bands using first-order allpass filters */
+void SKP_Silk_ana_filt_bank_1(
+ const SKP_int16 *in, /* I: Input signal [N] */
+ SKP_int32 *S, /* I/O: State vector [2] */
+ SKP_int16 *outL, /* O: Low band [N/2] */
+ SKP_int16 *outH, /* O: High band [N/2] */
+ SKP_int32 *scratch, /* I: Scratch memory [3*N/2] */
+ const SKP_int32 N /* I: Number of input samples */
+);
+
+/********************************************************************/
+/* SCALAR FUNCTIONS */
+/********************************************************************/
+
+/* approximation of 128 * log2() (exact inverse of approx 2^() below) */
+/* convert input to a log scale */
+SKP_int32 SKP_Silk_lin2log(const SKP_int32 inLin); /* I: input in linear scale */
+
+/* Approximation of a sigmoid function */
+SKP_int SKP_Silk_sigm_Q15(SKP_int in_Q5);
+
+/* approximation of 2^() (exact inverse of approx log2() above) */
+/* convert input to a linear scale */
+SKP_int32 SKP_Silk_log2lin(const SKP_int32 inLog_Q7); /* I: input on log scale */
+
+/* Function that returns the maximum absolut value of the input vector */
+SKP_int16 SKP_Silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */
+ const SKP_int16 *vec, /* I Input vector [len] */
+ const SKP_int32 len /* I Length of input vector */
+);
+
+/* Compute number of bits to right shift the sum of squares of a vector */
+/* of int16s to make it fit in an int32 */
+void SKP_Silk_sum_sqr_shift(
+ SKP_int32 *energy, /* O Energy of x, after shifting to the right */
+ SKP_int *shift, /* O Number of bits right shift applied to energy */
+ const SKP_int16 *x, /* I Input vector */
+ SKP_int len /* I Length of input vector */
+);
+
+/* Calculates the reflection coefficients from the correlation sequence */
+/* Faster than schur64(), but much less accurate. */
+/* Uses SMLAWB(), requiring armv5E and higher. */
+void SKP_Silk_schur(
+ SKP_int16 *rc_Q15, /* O: reflection coefficients [order] Q15 */
+ const SKP_int32 *c, /* I: correlations [order+1] */
+ const SKP_int32 order /* I: prediction order */
+);
+
+/* Calculates the reflection coefficients from the correlation sequence */
+/* Slower than schur(), but more accurate. */
+/* Uses SMULL(), available on armv4 */
+SKP_int32 SKP_Silk_schur64( /* O: returns residual energy */
+ SKP_int32 rc_Q16[], /* O: Reflection coefficients [order] Q16 */
+ const SKP_int32 c[], /* I: Correlations [order+1] */
+ SKP_int32 order /* I: Prediction order */
+);
+
+/* Step up function, converts reflection coefficients to prediction coefficients */
+void SKP_Silk_k2a(
+ SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
+ const SKP_int16 *rc_Q15, /* I: Reflection coefficients [order] Q15 */
+ const SKP_int32 order /* I: Prediction order */
+);
+
+/* Step up function, converts reflection coefficients to prediction coefficients */
+void SKP_Silk_k2a_Q16(
+ SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
+ const SKP_int32 *rc_Q16, /* I: Reflection coefficients [order] Q16 */
+ const SKP_int32 order /* I: Prediction order */
+);
+
+/* Apply sine window to signal vector. */
+/* Window types: */
+/* 0 -> sine window from 0 to pi */
+/* 1 -> sine window from 0 to pi/2 */
+/* 2 -> sine window from pi/2 to pi */
+/* every other sample of window is linearly interpolated, for speed */
+void SKP_Silk_apply_sine_window(
+ SKP_int16 px_win[], /* O Pointer to windowed signal */
+ const SKP_int16 px[], /* I Pointer to input signal */
+ const SKP_int win_type, /* I Selects a window type */
+ const SKP_int length /* I Window length, multiple of 4 */
+);
+
+/* Compute autocorrelation */
+void SKP_Silk_autocorr(
+ SKP_int32 *results, /* O Result (length correlationCount) */
+ SKP_int *scale, /* O Scaling of the correlation vector */
+ const SKP_int16 *inputData, /* I Input data to correlate */
+ const SKP_int inputDataSize, /* I Length of input */
+ const SKP_int correlationCount /* I Number of correlation taps to compute */
+);
+
+/* Pitch estimator */
+#define SKP_Silk_PE_MIN_COMPLEX 0
+#define SKP_Silk_PE_MID_COMPLEX 1
+#define SKP_Silk_PE_MAX_COMPLEX 2
+
+void SKP_Silk_decode_pitch(
+ SKP_int lagIndex, /* I */
+ SKP_int contourIndex, /* O */
+ SKP_int pitch_lags[], /* O 4 pitch values */
+ const SKP_int Fs_kHz, /* I sampling frequency (kHz) */
+ const SKP_int nb_subfr /* I number of sub frames */
+);
+
+SKP_int SKP_Silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */
+ const SKP_int16 *signal, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */
+ SKP_int *pitch_out, /* O 4 pitch lag values */
+ SKP_int *lagIndex, /* O Lag Index */
+ SKP_int *contourIndex, /* O Pitch contour Index */
+ SKP_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */
+ SKP_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */
+ const SKP_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */
+ const SKP_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */
+ const SKP_int Fs_kHz, /* I Sample frequency (kHz) */
+ const SKP_int complexity, /* I Complexity setting, 0-2, where 2 is highest */
+ const SKP_int nb_subfr /* I number of 5 ms subframes */
+);
+
+/* parameter defining the size and accuracy of the piecewise linear */
+/* cosine approximatin table. */
+
+#define LSF_COS_TAB_SZ_FIX 128
+/* rom table with cosine values */
+extern const SKP_int SKP_Silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ];
+
+void SKP_Silk_LPC_fit(
+ SKP_int16 *a_QQ, /* O stabilized LPC vector, Q(24-rshift) [L] */
+ SKP_int32 *a_Q24, /* I LPC vector [L] */
+ const SKP_int QQ, /* I Q domain of output LPC vector */
+ const SKP_int L /* I Number of LPC parameters in the input vector */
+);
+
+/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */
+/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */
+void SKP_Silk_A2NLSF(
+ SKP_int *NLSF, /* O Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d] */
+ SKP_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */
+ const SKP_int d /* I Filter order (must be even) */
+);
+
+/* compute whitening filter coefficients from normalized line spectral frequencies */
+void SKP_Silk_NLSF2A(
+ SKP_int16 *a, /* o monic whitening filter coefficients in Q12, [d] */
+ const SKP_int *NLSF, /* i normalized line spectral frequencies in Q15, [d] */
+ const SKP_int d /* i filter order (should be even) */
+);
+
+void SKP_Silk_insertion_sort_increasing(
+ SKP_int32 *a, /* I/O Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+);
+
+void SKP_Silk_insertion_sort_decreasing(
+ SKP_int *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+);
+
+void SKP_Silk_insertion_sort_decreasing_int16(
+ SKP_int16 *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+);
+
+void SKP_Silk_insertion_sort_increasing_all_values(
+ SKP_int *a, /* I/O: Unsorted / Sorted vector */
+ const SKP_int L /* I: Vector length */
+);
+
+/* NLSF stabilizer, for a single input data vector */
+void SKP_Silk_NLSF_stabilize(
+ SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vector in Q15 [L] */
+ const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
+ const SKP_int L /* I: Number of NLSF parameters in the input vector */
+);
+
+/* NLSF stabilizer, over multiple input column data vectors */
+void SKP_Silk_NLSF_stabilize_multi(
+ SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vectors in Q15 [LxN] */
+ const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */
+ const SKP_int N, /* I: Number of input vectors to be stabilized */
+ const SKP_int L /* I: NLSF vector dimension */
+);
+
+/* Laroia low complexity NLSF weights */
+void SKP_Silk_NLSF_VQ_weights_laroia(
+ SKP_int *pNLSFW_Q6, /* O: Pointer to input vector weights [D x 1] */
+ const SKP_int *pNLSF_Q15, /* I: Pointer to input vector [D x 1] */
+ const SKP_int D /* I: Input vector dimension (even) */
+);
+
+/* Compute reflection coefficients from input signal */
+void SKP_Silk_burg_modified(
+ SKP_int32 *res_nrg, /* O residual energy */
+ SKP_int *res_nrgQ, /* O residual energy Q value */
+ SKP_int32 A_Q16[], /* O prediction coefficients (length order) */
+ const SKP_int16 x[], /* I input signal, length: nb_subfr * ( D + subfr_length ) */
+ const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */
+ const SKP_int nb_subfr, /* I number of subframes stacked in x */
+ const SKP_int32 WhiteNoiseFrac_Q32, /* I fraction added to zero-lag autocorrelation */
+ const SKP_int D /* I order */
+);
+
+/* Multiply a vector by a constant */
+void SKP_Silk_scale_vector16_Q14(
+ SKP_int16 *data1,
+ SKP_int gain_Q14, /* Gain in Q14 */
+ SKP_int dataSize
+);
+
+/* Copy and multiply a vector by a constant */
+void SKP_Silk_scale_copy_vector16(
+ SKP_int16 *data_out,
+ const SKP_int16 *data_in,
+ SKP_int32 gain_Q16, /* I: gain in Q16 */
+ const SKP_int dataSize /* I: length */
+);
+
+void SKP_Silk_scale_vector32_16_Q14(
+ SKP_int32 *data1, /* I/O: Q0/Q0 */
+ SKP_int gain_Q14, /* I: Q14 */
+ SKP_int dataSize /* I: length */
+);
+
+/* Multiply a vector by a constant, does not saturate output data */
+void SKP_Silk_scale_vector32_Q16(
+ SKP_int32 *data1, /* I/O: Q0/Q0 */
+ SKP_int32 gain_Q16, /* I: gain in Q16 ( SKP_int16_MIN <= gain_Q16 <= SKP_int16_MAX + 65536 ) */
+ const SKP_int dataSize /* I: length */
+);
+
+/* Some for the LTP related function requires Q26 to work.*/
+void SKP_Silk_scale_vector32_Q26_lshift_18(
+ SKP_int32 *data1, /* I/O: Q0/Q18 */
+ SKP_int32 gain_Q26, /* I: Q26 */
+ SKP_int dataSize /* I: length */
+);
+
+/********************************************************************/
+/* INLINE ARM MATH */
+/********************************************************************/
+
+/* return sum(inVec1[i]*inVec2[i]) */
+/* inVec1 and inVec2 should be increasing ordered, and starting address should be 4 byte aligned. (a factor of 4)*/
+SKP_int32 SKP_Silk_inner_prod_aligned(
+ const SKP_int16* const inVec1, /* I input vector 1 */
+ const SKP_int16* const inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+);
+
+SKP_int32 SKP_Silk_inner_prod16_aligned_sat(
+ const SKP_int16* const inVec1, /* I input vector 1 */
+ const SKP_int16* const inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+);
+
+SKP_int64 SKP_Silk_inner_prod_aligned_64(
+ const SKP_int32 *inVec1, /* I input vector 1 */
+ const SKP_int32 *inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+);
+
+SKP_int64 SKP_Silk_inner_prod16_aligned_64(
+ const SKP_int16 *inVec1, /* I input vector 1 */
+ const SKP_int16 *inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+);
+/********************************************************************/
+/* MACROS */
+/********************************************************************/
+
+/* Rotate a32 right by 'rot' bits. Negative rot values result in rotating
+ left. Output is 32bit int.
+ Note: contemporary compilers recognize the C expression below and
+ compile it into a 'ror' instruction if available. No need for inline ASM! */
+SKP_INLINE SKP_int32 SKP_ROR32( SKP_int32 a32, SKP_int rot )
+{
+ SKP_uint32 x = (SKP_uint32) a32;
+ SKP_uint32 r = (SKP_uint32) rot;
+ SKP_uint32 m = (SKP_uint32) -rot;
+ if(rot <= 0)
+ return (SKP_int32) ((x << m) | (x >> (32 - m)));
+ else
+ return (SKP_int32) ((x << (32 - r)) | (x >> r));
+}
+
+/* Define 4-byte aligned array of SKP_int16 */
+#define SKP_array_of_int16_4_byte_aligned( arrayName, nElements ) \
+ SKP_int32 dummy_int32 ## arrayName; \
+ SKP_int16 arrayName[ (nElements) ]
+
+/* Useful Macros that can be adjusted to other platforms */
+#define SKP_memcpy(a, b, c) memcpy((a), (b), (c)) /* Dest, Src, ByteCount */
+#define SKP_memset(a, b, c) memset((a), (b), (c)) /* Dest, value, ByteCount */
+#define SKP_memmove(a, b, c) memmove((a), (b), (c)) /* Dest, Src, ByteCount */
+/* fixed point macros */
+
+// (a32 * b32) output have to be 32bit int
+#define SKP_MUL(a32, b32) ((a32) * (b32))
+
+// (a32 * b32) output have to be 32bit uint
+#define SKP_MUL_uint(a32, b32) SKP_MUL(a32, b32)
+
+// a32 + (b32 * c32) output have to be 32bit int
+#define SKP_MLA(a32, b32, c32) SKP_ADD32((a32),((b32) * (c32)))
+
+// a32 + (b32 * c32) output have to be 32bit uint
+#define SKP_MLA_uint(a32, b32, c32) SKP_MLA(a32, b32, c32)
+
+// ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int
+#define SKP_SMULTT(a32, b32) (((a32) >> 16) * ((b32) >> 16))
+
+// a32 + ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int
+#define SKP_SMLATT(a32, b32, c32) SKP_ADD32((a32),((b32) >> 16) * ((c32) >> 16))
+
+#define SKP_SMLALBB(a64, b16, c16) SKP_ADD64((a64),(SKP_int64)((SKP_int32)(b16) * (SKP_int32)(c16)))
+
+// (a32 * b32)
+#define SKP_SMULL(a32, b32) ((SKP_int64)(a32) * /*(SKP_int64)*/(b32))
+
+// multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)
+#define SKP_MLA_ovflw(a32, b32, c32) SKP_MLA(a32, b32, c32)
+#ifndef SKP_SMLABB_ovflw
+# define SKP_SMLABB_ovflw(a32, b32, c32) SKP_SMLABB(a32, b32, c32)
+#endif
+#define SKP_SMLABT_ovflw(a32, b32, c32) SKP_SMLABT(a32, b32, c32)
+#define SKP_SMLATT_ovflw(a32, b32, c32) SKP_SMLATT(a32, b32, c32)
+#define SKP_SMLAWB_ovflw(a32, b32, c32) SKP_SMLAWB(a32, b32, c32)
+#define SKP_SMLAWT_ovflw(a32, b32, c32) SKP_SMLAWT(a32, b32, c32)
+
+#define SKP_DIV64_32(a64, b32) ((a64)/(b32)) /* TODO: rewrite it as a set of SKP_DIV32.*/
+
+#define SKP_DIV32_16(a32, b16) ((SKP_int32)((a32) / (b16)))
+#define SKP_DIV32(a32, b32) ((SKP_int32)((a32) / (b32)))
+
+// These macros enables checking for overflow in SKP_Silk_API_Debug.h
+#define SKP_ADD16(a, b) ((a) + (b))
+#define SKP_ADD32(a, b) ((a) + (b))
+#define SKP_ADD64(a, b) ((a) + (b))
+
+#define SKP_SUB16(a, b) ((a) - (b))
+#define SKP_SUB32(a, b) ((a) - (b))
+#define SKP_SUB64(a, b) ((a) - (b))
+
+#define SKP_SAT8(a) ((a) > SKP_int8_MAX ? SKP_int8_MAX : \
+ ((a) < SKP_int8_MIN ? SKP_int8_MIN : (a)))
+#define SKP_SAT16(a) ((a) > SKP_int16_MAX ? SKP_int16_MAX : \
+ ((a) < SKP_int16_MIN ? SKP_int16_MIN : (a)))
+#define SKP_SAT32(a) ((a) > SKP_int32_MAX ? SKP_int32_MAX : \
+ ((a) < SKP_int32_MIN ? SKP_int32_MIN : (a)))
+
+#define SKP_CHECK_FIT8(a) (a)
+#define SKP_CHECK_FIT16(a) (a)
+#define SKP_CHECK_FIT32(a) (a)
+
+#define SKP_ADD_SAT16(a, b) (SKP_int16)SKP_SAT16( SKP_ADD32( (SKP_int32)(a), (b) ) )
+#define SKP_ADD_SAT64(a, b) ((((a) + (b)) & 0x8000000000000000LL) == 0 ? \
+ ((((a) & (b)) & 0x8000000000000000LL) != 0 ? SKP_int64_MIN : (a)+(b)) : \
+ ((((a) | (b)) & 0x8000000000000000LL) == 0 ? SKP_int64_MAX : (a)+(b)) )
+
+#define SKP_SUB_SAT16(a, b) (SKP_int16)SKP_SAT16( SKP_SUB32( (SKP_int32)(a), (b) ) )
+#define SKP_SUB_SAT64(a, b) ((((a)-(b)) & 0x8000000000000000LL) == 0 ? \
+ (( (a) & ((b)^0x8000000000000000LL) & 0x8000000000000000LL) ? SKP_int64_MIN : (a)-(b)) : \
+ ((((a)^0x8000000000000000LL) & (b) & 0x8000000000000000LL) ? SKP_int64_MAX : (a)-(b)) )
+
+/* Saturation for positive input values */
+#define SKP_POS_SAT32(a) ((a) > SKP_int32_MAX ? SKP_int32_MAX : (a))
+
+/* Add with saturation for positive input values */
+#define SKP_ADD_POS_SAT8(a, b) ((((a)+(b)) & 0x80) ? SKP_int8_MAX : ((a)+(b)))
+#define SKP_ADD_POS_SAT16(a, b) ((((a)+(b)) & 0x8000) ? SKP_int16_MAX : ((a)+(b)))
+#define SKP_ADD_POS_SAT32(a, b) ((((a)+(b)) & 0x80000000) ? SKP_int32_MAX : ((a)+(b)))
+#define SKP_ADD_POS_SAT64(a, b) ((((a)+(b)) & 0x8000000000000000LL) ? SKP_int64_MAX : ((a)+(b)))
+
+#define SKP_LSHIFT8(a, shift) ((a)<<(shift)) // shift >= 0, shift < 8
+#define SKP_LSHIFT16(a, shift) ((a)<<(shift)) // shift >= 0, shift < 16
+#define SKP_LSHIFT32(a, shift) ((a)<<(shift)) // shift >= 0, shift < 32
+#define SKP_LSHIFT64(a, shift) ((a)<<(shift)) // shift >= 0, shift < 64
+#define SKP_LSHIFT(a, shift) SKP_LSHIFT32(a, shift) // shift >= 0, shift < 32
+
+#define SKP_RSHIFT8(a, shift) ((a)>>(shift)) // shift >= 0, shift < 8
+#define SKP_RSHIFT16(a, shift) ((a)>>(shift)) // shift >= 0, shift < 16
+#define SKP_RSHIFT32(a, shift) ((a)>>(shift)) // shift >= 0, shift < 32
+#define SKP_RSHIFT64(a, shift) ((a)>>(shift)) // shift >= 0, shift < 64
+#define SKP_RSHIFT(a, shift) SKP_RSHIFT32(a, shift) // shift >= 0, shift < 32
+
+/* saturates before shifting */
+#define SKP_LSHIFT_SAT16(a, shift) (SKP_LSHIFT16( SKP_LIMIT( (a), SKP_RSHIFT16( SKP_int16_MIN, (shift) ), \
+ SKP_RSHIFT16( SKP_int16_MAX, (shift) ) ), (shift) ))
+#define SKP_LSHIFT_SAT32(a, shift) (SKP_LSHIFT32( SKP_LIMIT( (a), SKP_RSHIFT32( SKP_int32_MIN, (shift) ), \
+ SKP_RSHIFT32( SKP_int32_MAX, (shift) ) ), (shift) ))
+
+#define SKP_LSHIFT_ovflw(a, shift) ((a)<<(shift)) // shift >= 0, allowed to overflow
+#define SKP_LSHIFT_uint(a, shift) ((a)<<(shift)) // shift >= 0
+#define SKP_RSHIFT_uint(a, shift) ((a)>>(shift)) // shift >= 0
+
+#define SKP_ADD_LSHIFT(a, b, shift) ((a) + SKP_LSHIFT((b), (shift))) // shift >= 0
+#define SKP_ADD_LSHIFT32(a, b, shift) SKP_ADD32((a), SKP_LSHIFT32((b), (shift))) // shift >= 0
+#define SKP_ADD_LSHIFT_uint(a, b, shift) ((a) + SKP_LSHIFT_uint((b), (shift))) // shift >= 0
+#define SKP_ADD_RSHIFT(a, b, shift) ((a) + SKP_RSHIFT((b), (shift))) // shift >= 0
+#define SKP_ADD_RSHIFT32(a, b, shift) SKP_ADD32((a), SKP_RSHIFT32((b), (shift))) // shift >= 0
+#define SKP_ADD_RSHIFT_uint(a, b, shift) ((a) + SKP_RSHIFT_uint((b), (shift))) // shift >= 0
+#define SKP_SUB_LSHIFT32(a, b, shift) SKP_SUB32((a), SKP_LSHIFT32((b), (shift))) // shift >= 0
+#define SKP_SUB_RSHIFT32(a, b, shift) SKP_SUB32((a), SKP_RSHIFT32((b), (shift))) // shift >= 0
+
+/* Requires that shift > 0 */
+#define SKP_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
+#define SKP_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
+
+/* Number of rightshift required to fit the multiplication */
+#define SKP_NSHIFT_MUL_32_32(a, b) ( -(31- (32-SKP_Silk_CLZ32(SKP_abs(a)) + (32-SKP_Silk_CLZ32(SKP_abs(b))))) )
+#define SKP_NSHIFT_MUL_16_16(a, b) ( -(15- (16-SKP_Silk_CLZ16(SKP_abs(a)) + (16-SKP_Silk_CLZ16(SKP_abs(b))))) )
+
+
+#define SKP_min(a, b) (((a) < (b)) ? (a) : (b))
+#define SKP_max(a, b) (((a) > (b)) ? (a) : (b))
+
+/* Macro to convert floating-point constants to fixed-point */
+#define SKP_FIX_CONST( C, Q ) ((SKP_int32)((C) * (1 << (Q)) + 0.5))
+
+/* SKP_min() versions with typecast in the function call */
+SKP_INLINE SKP_int SKP_min_int(SKP_int a, SKP_int b)
+{
+ return (((a) < (b)) ? (a) : (b));
+}
+SKP_INLINE SKP_int16 SKP_min_16(SKP_int16 a, SKP_int16 b)
+{
+ return (((a) < (b)) ? (a) : (b));
+}
+SKP_INLINE SKP_int32 SKP_min_32(SKP_int32 a, SKP_int32 b)
+{
+ return (((a) < (b)) ? (a) : (b));
+}
+SKP_INLINE SKP_int64 SKP_min_64(SKP_int64 a, SKP_int64 b)
+{
+ return (((a) < (b)) ? (a) : (b));
+}
+
+/* SKP_min() versions with typecast in the function call */
+SKP_INLINE SKP_int SKP_max_int(SKP_int a, SKP_int b)
+{
+ return (((a) > (b)) ? (a) : (b));
+}
+SKP_INLINE SKP_int16 SKP_max_16(SKP_int16 a, SKP_int16 b)
+{
+ return (((a) > (b)) ? (a) : (b));
+}
+SKP_INLINE SKP_int32 SKP_max_32(SKP_int32 a, SKP_int32 b)
+{
+ return (((a) > (b)) ? (a) : (b));
+}
+SKP_INLINE SKP_int64 SKP_max_64(SKP_int64 a, SKP_int64 b)
+{
+ return (((a) > (b)) ? (a) : (b));
+}
+
+#define SKP_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
+ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))))
+
+#define SKP_LIMIT_int SKP_LIMIT
+#define SKP_LIMIT_16 SKP_LIMIT
+#define SKP_LIMIT_32 SKP_LIMIT
+
+//#define SKP_non_neg(a) ((a) & ((-(a)) >> (8 * sizeof(a) - 1))) /* doesn't seem faster than SKP_max(0, a);
+
+#define SKP_abs(a) (((a) > 0) ? (a) : -(a)) // Be careful, SKP_abs returns wrong when input equals to SKP_intXX_MIN
+#define SKP_abs_int(a) (((a) ^ ((a) >> (8 * sizeof(a) - 1))) - ((a) >> (8 * sizeof(a) - 1)))
+#define SKP_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31))
+#define SKP_abs_int64(a) (((a) > 0) ? (a) : -(a))
+
+#define SKP_sign(a) ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 ))
+
+#define SKP_sqrt(a) (sqrt(a))
+
+/* PSEUDO-RANDOM GENERATOR */
+/* Make sure to store the result as the seed for the next call (also in between */
+/* frames), otherwise result won't be random at all. When only using some of the */
+/* bits, take the most significant bits by right-shifting. Do not just mask off */
+/* the lowest bits. */
+#define SKP_RAND(seed) (SKP_MLA_ovflw(907633515, (seed), 196314165))
+
+// Add some multiplication functions that can be easily mapped to ARM.
+
+// SKP_SMMUL: Signed top word multiply.
+// ARMv6 2 instruction cycles.
+// ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.(except xM)
+//#define SKP_SMMUL(a32, b32) (SKP_int32)SKP_RSHIFT(SKP_SMLAL(SKP_SMULWB((a32), (b32)), (a32), SKP_RSHIFT_ROUND((b32), 16)), 16)
+// the following seems faster on x86
+#define SKP_SMMUL(a32, b32) (SKP_int32)SKP_RSHIFT64(SKP_SMULL((a32), (b32)), 32)
+
+#include "SKP_Silk_Inlines.h"
+#include "SKP_Silk_MacroCount.h"
+#include "SKP_Silk_MacroDebug.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_allpass_int.c
@@ -1,0 +1,69 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_allpass_int.c *
+ * *
+ * First-order allpass filter with *
+ * transfer function: *
+ * *
+ * A + Z^(-1) *
+ * H(z) = ------------ *
+ * 1 + A*Z^(-1) *
+ * *
+ * Implemented using minimum multiplier filter design. *
+ * *
+ * Reference: http://www.univ.trieste.it/~ramponi/teaching/ *
+ * DSP/materiale/Ch6(2).pdf *
+ * *
+ * Copyright 2007 (c), Skype Limited *
+ * Date: 070525 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+
+/* First-order allpass filter */
+void SKP_Silk_allpass_int(
+ const SKP_int32 *in, /* I: Q25 input signal [len] */
+ SKP_int32 *S, /* I/O: Q25 state [1] */
+ SKP_int A, /* I: Q15 coefficient (0 <= A < 32768) */
+ SKP_int32 *out, /* O: Q25 output signal [len] */
+ const SKP_int32 len /* I: Number of samples */
+)
+{
+ SKP_int32 Y2, X2, S0;
+ SKP_int k;
+
+ S0 = S[ 0 ];
+ for( k = len - 1; k >= 0; k-- ) {
+ Y2 = *in - S0;
+ X2 = ( Y2 >> 15 ) * A + ( ( ( Y2 & 0x00007FFF ) * A ) >> 15 );
+ ( *out++ ) = S0 + X2;
+ S0 = ( *in++ ) + X2;
+ }
+ S[ 0 ] = S0;
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_ana_filt_bank_1.c
@@ -1,0 +1,80 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_ana_filt_bank_1.c *
+ * *
+ * Split signal into two decimated bands using first-order allpass filters *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Coefficients for 2-band filter bank based on first-order allpass filters */
+// old
+static SKP_int16 A_fb1_20[ 1 ] = { 5394 << 1 };
+static SKP_int16 A_fb1_21[ 1 ] = { 20623 << 1 }; /* wrap-around to negative number is intentional */
+
+/* Split signal into two decimated bands using first-order allpass filters */
+void SKP_Silk_ana_filt_bank_1(
+ const SKP_int16 *in, /* I: Input signal [N] */
+ SKP_int32 *S, /* I/O: State vector [2] */
+ SKP_int16 *outL, /* O: Low band [N/2] */
+ SKP_int16 *outH, /* O: High band [N/2] */
+ SKP_int32 *scratch, /* I: Scratch memory [3*N/2] */ // todo: remove - no longer used
+ const SKP_int32 N /* I: Number of input samples */
+)
+{
+ SKP_int k, N2 = SKP_RSHIFT( N, 1 );
+ SKP_int32 in32, X, Y, out_1, out_2;
+
+ /* Internal variables and state are in Q10 format */
+ for( k = 0; k < N2; k++ ) {
+ /* Convert to Q10 */
+ in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k ], 10 );
+
+ /* All-pass section for even input sample */
+ Y = SKP_SUB32( in32, S[ 0 ] );
+ X = SKP_SMLAWB( Y, Y, A_fb1_21[ 0 ] );
+ out_1 = SKP_ADD32( S[ 0 ], X );
+ S[ 0 ] = SKP_ADD32( in32, X );
+
+ /* Convert to Q10 */
+ in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k + 1 ], 10 );
+
+ /* All-pass section for odd input sample, and add to output of previous section */
+ Y = SKP_SUB32( in32, S[ 1 ] );
+ X = SKP_SMULWB( Y, A_fb1_20[ 0 ] );
+ out_2 = SKP_ADD32( S[ 1 ], X );
+ S[ 1 ] = SKP_ADD32( in32, X );
+
+ /* Add/subtract, convert back to int16 and store to output */
+ outL[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( SKP_ADD32( out_2, out_1 ), 11 ) );
+ outH[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SUB32( out_2, out_1 ), 11 ) );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_apply_sine_window.c
@@ -1,0 +1,90 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Apply sine window to signal vector. */
+/* Window types: */
+/* 0 -> sine window from 0 to pi */
+/* 1 -> sine window from 0 to pi/2 */
+/* 2 -> sine window from pi/2 to pi */
+/* every other sample of window is linearly interpolated, for speed */
+void SKP_Silk_apply_sine_window(
+ SKP_int16 px_win[], /* O Pointer to windowed signal */
+ const SKP_int16 px[], /* I Pointer to input signal */
+ const SKP_int win_type, /* I Selects a window type */
+ const SKP_int length /* I Window length, multiple of 4 */
+)
+{
+ SKP_int k;
+ SKP_int32 f_Q16, c_Q20, S0_Q16, S1_Q16;
+ /* Length must be multiple of 4 */
+ SKP_assert( ( length & 3 ) == 0 );
+
+ /* Input pointer must be 4-byte aligned */
+ SKP_assert( ( (SKP_int64)px & 3 ) == 0 );
+
+ if( win_type == 0 ) {
+ f_Q16 = SKP_DIV32_16( 411775, length + 1 ); // 411775 = 2 * 65536 * pi
+ } else {
+ f_Q16 = SKP_DIV32_16( 205887, length + 1 ); // 205887 = 65536 * pi
+ }
+
+ /* factor used for cosine approximation */
+ c_Q20 = -SKP_RSHIFT( SKP_MUL( f_Q16, f_Q16 ), 12 );
+
+ /* c_Q20 becomes too large if length is too small */
+ SKP_assert( c_Q20 >= -32768 );
+
+ /* initialize state */
+ if( win_type < 2 ) {
+ /* start from 0 */
+ S0_Q16 = 0;
+ /* approximation of sin(f) */
+ S1_Q16 = f_Q16;
+ } else {
+ /* start from 1 */
+ S0_Q16 = ( 1 << 16 );
+ /* approximation of cos(f) */
+ S1_Q16 = ( 1 << 16 ) + SKP_RSHIFT( c_Q20, 5 );
+ }
+
+
+ /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */
+ /* 4 samples at a time */
+ for( k = 0; k < length; k += 4 ) {
+ px_win[ k ] = (SKP_int16)SKP_SMULWB( SKP_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k ] );
+ px_win[ k + 1 ] = (SKP_int16)SKP_SMULWB( S1_Q16, px[ k + 1] );
+ S0_Q16 = SKP_RSHIFT( SKP_MUL( c_Q20, S1_Q16 ), 20 ) + SKP_LSHIFT( S1_Q16, 1 ) - S0_Q16 + 1;
+ S0_Q16 = SKP_min( S0_Q16, ( 1 << 16 ) );
+
+ px_win[ k + 2 ] = (SKP_int16)SKP_SMULWB( SKP_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k + 2] );
+ px_win[ k + 3 ] = (SKP_int16)SKP_SMULWB( S0_Q16, px[ k + 3 ] );
+ S1_Q16 = SKP_RSHIFT( SKP_MUL( c_Q20, S0_Q16 ), 20 ) + SKP_LSHIFT( S0_Q16, 1 ) - S1_Q16;
+ S1_Q16 = SKP_min( S1_Q16, ( 1 << 16 ) );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_array_maxabs.c
@@ -1,0 +1,69 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_int16_array_maxabs.c *
+ * *
+ * Function that returns the maximum absolut value of *
+ * the input vector *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Function that returns the maximum absolut value of the input vector */
+#if (! defined(__mips__)) && EMBEDDED_ARM<4
+SKP_int16 SKP_Silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */
+ const SKP_int16 *vec, /* I Input vector [len] */
+ const SKP_int32 len /* I Length of input vector */
+)
+{
+ SKP_int32 max = 0, i, lvl = 0, ind;
+
+ ind = len - 1;
+ max = SKP_SMULBB( vec[ ind ], vec[ ind ] );
+ for( i = len - 2; i >= 0; i-- ) {
+ lvl = SKP_SMULBB( vec[ i ], vec[ i ] );
+ if( lvl > max ) {
+ max = lvl;
+ ind = i;
+ }
+ }
+
+ /* Do not return 32768, as it will not fit in an int16 so may lead to problems later on */
+ if( max >= 1073676289 ) { // (2^15-1)^2 = 1073676289
+ return( SKP_int16_MAX );
+ } else {
+ if( vec[ ind ] < 0 ) {
+ return( -vec[ ind ] );
+ } else {
+ return( vec[ ind ] );
+ }
+ }
+}
+#endif
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_autocorr.c
@@ -1,0 +1,81 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_autocorr.c *
+ * *
+ * Calculates the autocorrelation *
+ * The result has 29 non-zero bits for the first correlation, to leave *
+ * some room for adding white noise fractions etc. *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Compute autocorrelation */
+void SKP_Silk_autocorr(
+ SKP_int32 *results, /* O Result (length correlationCount) */
+ SKP_int *scale, /* O Scaling of the correlation vector */
+ const SKP_int16 *inputData, /* I Input data to correlate */
+ const SKP_int inputDataSize, /* I Length of input */
+ const SKP_int correlationCount /* I Number of correlation taps to compute */
+)
+{
+ SKP_int i, lz, nRightShifts, corrCount;
+ SKP_int64 corr64;
+
+ corrCount = SKP_min_int( inputDataSize, correlationCount );
+
+ /* compute energy (zero-lag correlation) */
+ corr64 = SKP_Silk_inner_prod16_aligned_64( inputData, inputData, inputDataSize );
+
+ /* deal with all-zero input data */
+ corr64 += 1;
+
+ /* number of leading zeros */
+ lz = SKP_Silk_CLZ64( corr64 );
+
+ /* scaling: number of right shifts applied to correlations */
+ nRightShifts = 35 - lz;
+ *scale = nRightShifts;
+
+ if( nRightShifts <= 0 ) {
+ results[ 0 ] = SKP_LSHIFT( (SKP_int32)SKP_CHECK_FIT32( corr64 ), -nRightShifts );
+
+ /* compute remaining correlations based on int32 inner product */
+ for( i = 1; i < corrCount; i++ ) {
+ results[ i ] = SKP_LSHIFT( SKP_Silk_inner_prod_aligned( inputData, inputData + i, inputDataSize - i ), -nRightShifts );
+ }
+ } else {
+ results[ 0 ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( corr64, nRightShifts ) );
+
+ /* compute remaining correlations based on int64 inner product */
+ for( i = 1; i < corrCount; i++ ) {
+ results[ i ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( SKP_Silk_inner_prod16_aligned_64( inputData, inputData + i, inputDataSize - i ), nRightShifts ) );
+ }
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_biquad.c
@@ -1,0 +1,72 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_biquad.c *
+ * *
+ * Second order ARMA filter *
+ * Can handle slowly varying filter coefficients *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Second order ARMA filter */
+/* Can handle slowly varying filter coefficients */
+void SKP_Silk_biquad(
+ const SKP_int16 *in, /* I: input signal */
+ const SKP_int16 *B, /* I: MA coefficients, Q13 [3] */
+ const SKP_int16 *A, /* I: AR coefficients, Q13 [2] */
+ SKP_int32 *S, /* I/O: state vector [2] */
+ SKP_int16 *out, /* O: output signal */
+ const SKP_int32 len /* I: signal length */
+)
+{
+ SKP_int k, in16;
+ SKP_int32 A0_neg, A1_neg, S0, S1, out32, tmp32;
+
+ S0 = S[ 0 ];
+ S1 = S[ 1 ];
+ A0_neg = -A[ 0 ];
+ A1_neg = -A[ 1 ];
+ for( k = 0; k < len; k++ ) {
+ /* S[ 0 ], S[ 1 ]: Q13 */
+ in16 = in[ k ];
+ out32 = SKP_SMLABB( S0, in16, B[ 0 ] );
+
+ S0 = SKP_SMLABB( S1, in16, B[ 1 ] );
+ S0 += SKP_LSHIFT( SKP_SMULWB( out32, A0_neg ), 3 );
+
+ S1 = SKP_LSHIFT( SKP_SMULWB( out32, A1_neg ), 3 );
+ S1 = SKP_SMLABB( S1, in16, B[ 2 ] );
+ tmp32 = SKP_RSHIFT_ROUND( out32, 13 ) + 1;
+ out[ k ] = (SKP_int16)SKP_SAT16( tmp32 );
+ }
+ S[ 0 ] = S0;
+ S[ 1 ] = S1;
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_biquad_alt.c
@@ -1,0 +1,73 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_biquad_alt.c *
+ * *
+ * Second order ARMA filter *
+ * Can handle slowly varying filter coefficients *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+
+/* Second order ARMA filter, alternative implementation */
+void SKP_Silk_biquad_alt(
+ const SKP_int16 *in, /* I: Input signal */
+ const SKP_int32 *B_Q28, /* I: MA coefficients [3] */
+ const SKP_int32 *A_Q28, /* I: AR coefficients [2] */
+ SKP_int32 *S, /* I/O: State vector [2] */
+ SKP_int16 *out, /* O: Output signal */
+ const SKP_int32 len /* I: Signal length (must be even) */
+)
+{
+ /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */
+ SKP_int k;
+ SKP_int32 inval, A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14;
+
+ /* Negate A_Q28 values and split in two parts */
+ A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */
+ A0_U_Q28 = SKP_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */
+ A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */
+ A1_U_Q28 = SKP_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */
+
+ for( k = 0; k < len; k++ ) {
+ /* S[ 0 ], S[ 1 ]: Q12 */
+ inval = in[ k ];
+ out32_Q14 = SKP_LSHIFT( SKP_SMLAWB( S[ 0 ], B_Q28[ 0 ], inval ), 2 );
+
+ S[ 0 ] = S[1] + SKP_RSHIFT( SKP_SMULWB( out32_Q14, A0_L_Q28 ), 14 );
+ S[ 0 ] = SKP_SMLAWB( S[ 0 ], out32_Q14, A0_U_Q28 );
+ S[ 0 ] = SKP_SMLAWB( S[ 0 ], B_Q28[ 1 ], inval);
+
+ S[ 1 ] = SKP_RSHIFT( SKP_SMULWB( out32_Q14, A1_L_Q28 ), 14 );
+ S[ 1 ] = SKP_SMLAWB( S[ 1 ], out32_Q14, A1_U_Q28 );
+ S[ 1 ] = SKP_SMLAWB( S[ 1 ], B_Q28[ 2 ], inval );
+
+ /* Scale back to Q0 and saturate */
+ out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT( out32_Q14, 14 ) + 2 );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_burg_modified.c
@@ -1,0 +1,228 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_burg_modified.c *
+ * *
+ * Calculates the reflection coefficients from the input vector *
+ * Input vector contains nb_subfr sub vectors of length L_sub + D *
+ * *
+ * Copyright 2009 (c), Skype Limited *
+ * Date: 100105 *
+ */
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+#define MAX_FRAME_SIZE 544 // subfr_length * nb_subfr = ( 0.005 * 24000 + 16 ) * 4 = 544
+#define MAX_NB_SUBFR 4
+
+#define QA 24
+#define N_BITS_HEAD_ROOM 2
+#define MIN_RSHIFTS -16
+#define MAX_RSHIFTS (32 - QA)
+
+/* Compute reflection coefficients from input signal */
+void SKP_Silk_burg_modified(
+ SKP_int32 *res_nrg, /* O residual energy */
+ SKP_int *res_nrg_Q, /* O residual energy Q value */
+ SKP_int32 A_Q16[], /* O prediction coefficients (length order) */
+ const SKP_int16 x[], /* I input signal, length: nb_subfr * ( D + subfr_length ) */
+ const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */
+ const SKP_int nb_subfr, /* I number of subframes stacked in x */
+ const SKP_int32 WhiteNoiseFrac_Q32, /* I fraction added to zero-lag autocorrelation */
+ const SKP_int D /* I order */
+)
+{
+ SKP_int k, n, s, lz, rshifts, rshifts_extra;
+ SKP_int32 C0, num, nrg, rc_Q31, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2;
+ const SKP_int16 *x_ptr;
+
+ SKP_int32 C_first_row[ SKP_Silk_MAX_ORDER_LPC ];
+ SKP_int32 C_last_row[ SKP_Silk_MAX_ORDER_LPC ];
+ SKP_int32 Af_QA[ SKP_Silk_MAX_ORDER_LPC ];
+
+ SKP_int32 CAf[ SKP_Silk_MAX_ORDER_LPC + 1 ];
+ SKP_int32 CAb[ SKP_Silk_MAX_ORDER_LPC + 1 ];
+
+ SKP_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE );
+ SKP_assert( nb_subfr <= MAX_NB_SUBFR );
+
+
+ /* Compute autocorrelations, added over subframes */
+ SKP_Silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length );
+ if( rshifts > MAX_RSHIFTS ) {
+ C0 = SKP_LSHIFT32( C0, rshifts - MAX_RSHIFTS );
+ SKP_assert( C0 > 0 );
+ rshifts = MAX_RSHIFTS;
+ } else {
+ lz = SKP_Silk_CLZ32( C0 ) - 1;
+ rshifts_extra = N_BITS_HEAD_ROOM - lz;
+ if( rshifts_extra > 0 ) {
+ rshifts_extra = SKP_min( rshifts_extra, MAX_RSHIFTS - rshifts );
+ C0 = SKP_RSHIFT32( C0, rshifts_extra );
+ } else {
+ rshifts_extra = SKP_max( rshifts_extra, MIN_RSHIFTS - rshifts );
+ C0 = SKP_LSHIFT32( C0, -rshifts_extra );
+ }
+ rshifts += rshifts_extra;
+ }
+ SKP_memset( C_first_row, 0, SKP_Silk_MAX_ORDER_LPC * sizeof( SKP_int32 ) );
+ if( rshifts > 0 ) {
+ for( s = 0; s < nb_subfr; s++ ) {
+ x_ptr = x + s * subfr_length;
+ for( n = 1; n < D + 1; n++ ) {
+ C_first_row[ n - 1 ] += (SKP_int32)SKP_RSHIFT64(
+ SKP_Silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n ), rshifts );
+ }
+ }
+ } else {
+ for( s = 0; s < nb_subfr; s++ ) {
+ x_ptr = x + s * subfr_length;
+ for( n = 1; n < D + 1; n++ ) {
+ C_first_row[ n - 1 ] += SKP_LSHIFT32(
+ SKP_Silk_inner_prod_aligned( x_ptr, x_ptr + n, subfr_length - n ), -rshifts );
+ }
+ }
+ }
+ SKP_memcpy( C_last_row, C_first_row, SKP_Silk_MAX_ORDER_LPC * sizeof( SKP_int32 ) );
+
+ /* Initialize */
+ CAb[ 0 ] = CAf[ 0 ] = C0 + SKP_SMMUL( WhiteNoiseFrac_Q32, C0 ) + 1; // Q(-rshifts)
+
+ for( n = 0; n < D; n++ ) {
+ /* Update first row of correlation matrix (without first element) */
+ /* Update last row of correlation matrix (without last element, stored in reversed order) */
+ /* Update C * Af */
+ /* Update C * flipud(Af) (stored in reversed order) */
+ if( rshifts > -2 ) {
+ for( s = 0; s < nb_subfr; s++ ) {
+ x_ptr = x + s * subfr_length;
+ x1 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], 16 - rshifts ); // Q(16-rshifts)
+ x2 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); // Q(16-rshifts)
+ tmp1 = SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], QA - 16 ); // Q(QA-16)
+ tmp2 = SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); // Q(QA-16)
+ for( k = 0; k < n; k++ ) {
+ C_first_row[ k ] = SKP_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); // Q( -rshifts )
+ C_last_row[ k ] = SKP_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); // Q( -rshifts )
+ Atmp_QA = Af_QA[ k ];
+ tmp1 = SKP_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); // Q(QA-16)
+ tmp2 = SKP_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); // Q(QA-16)
+ }
+ tmp1 = SKP_LSHIFT32( -tmp1, 32 - QA - rshifts ); // Q(16-rshifts)
+ tmp2 = SKP_LSHIFT32( -tmp2, 32 - QA - rshifts ); // Q(16-rshifts)
+ for( k = 0; k <= n; k++ ) {
+ CAf[ k ] = SKP_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); // Q( -rshift )
+ CAb[ k ] = SKP_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); // Q( -rshift )
+ }
+ }
+ } else {
+ for( s = 0; s < nb_subfr; s++ ) {
+ x_ptr = x + s * subfr_length;
+ x1 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], -rshifts ); // Q( -rshifts )
+ x2 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); // Q( -rshifts )
+ tmp1 = SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], 17 ); // Q17
+ tmp2 = SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], 17 ); // Q17
+ for( k = 0; k < n; k++ ) {
+ C_first_row[ k ] = SKP_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); // Q( -rshifts )
+ C_last_row[ k ] = SKP_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); // Q( -rshifts )
+ Atmp1 = SKP_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); // Q17
+ tmp1 = SKP_MLA( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); // Q17
+ tmp2 = SKP_MLA( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); // Q17
+ }
+ tmp1 = -tmp1; // Q17
+ tmp2 = -tmp2; // Q17
+ for( k = 0; k <= n; k++ ) {
+ CAf[ k ] = SKP_SMLAWW( CAf[ k ], tmp1,
+ SKP_LSHIFT32( (SKP_int32)x_ptr[ n - k ], -rshifts - 1 ) ); // Q( -rshift )
+ CAb[ k ] = SKP_SMLAWW( CAb[ k ], tmp2,
+ SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) );// Q( -rshift )
+ }
+ }
+ }
+
+ /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */
+ tmp1 = C_first_row[ n ]; // Q( -rshifts )
+ tmp2 = C_last_row[ n ]; // Q( -rshifts )
+ num = 0; // Q( -rshifts )
+ nrg = SKP_ADD32( CAb[ 0 ], CAf[ 0 ] ); // Q( 1-rshifts )
+ for( k = 0; k < n; k++ ) {
+ Atmp_QA = Af_QA[ k ];
+ lz = SKP_Silk_CLZ32( SKP_abs( Atmp_QA ) ) - 1;
+ lz = SKP_min( 32 - QA, lz );
+ Atmp1 = SKP_LSHIFT32( Atmp_QA, lz ); // Q( QA + lz )
+
+ tmp1 = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts )
+ tmp2 = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts )
+ num = SKP_ADD_LSHIFT32( num, SKP_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts )
+ nrg = SKP_ADD_LSHIFT32( nrg, SKP_SMMUL( SKP_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ),
+ Atmp1 ), 32 - QA - lz ); // Q( 1-rshifts )
+ }
+ CAf[ n + 1 ] = tmp1; // Q( -rshifts )
+ CAb[ n + 1 ] = tmp2; // Q( -rshifts )
+ num = SKP_ADD32( num, tmp2 ); // Q( -rshifts )
+ num = SKP_LSHIFT32( -num, 1 ); // Q( 1-rshifts )
+
+ /* Calculate the next order reflection (parcor) coefficient */
+ if( SKP_abs( num ) < nrg ) {
+ rc_Q31 = SKP_DIV32_varQ( num, nrg, 31 );
+ } else {
+ /* Negative energy or ratio too high; set remaining coefficients to zero and exit loop */
+ SKP_memset( &Af_QA[ n ], 0, ( D - n ) * sizeof( SKP_int32 ) );
+ SKP_assert( 0 );
+ break;
+ }
+
+ /* Update the AR coefficients */
+ for( k = 0; k < (n + 1) >> 1; k++ ) {
+ tmp1 = Af_QA[ k ]; // QA
+ tmp2 = Af_QA[ n - k - 1 ]; // QA
+ Af_QA[ k ] = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( tmp2, rc_Q31 ), 1 ); // QA
+ Af_QA[ n - k - 1 ] = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( tmp1, rc_Q31 ), 1 ); // QA
+ }
+ Af_QA[ n ] = SKP_RSHIFT32( rc_Q31, 31 - QA ); // QA
+
+ /* Update C * Af and C * Ab */
+ for( k = 0; k <= n + 1; k++ ) {
+ tmp1 = CAf[ k ]; // Q( -rshifts )
+ tmp2 = CAb[ n - k + 1 ]; // Q( -rshifts )
+ CAf[ k ] = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( tmp2, rc_Q31 ), 1 ); // Q( -rshifts )
+ CAb[ n - k + 1 ] = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( tmp1, rc_Q31 ), 1 ); // Q( -rshifts )
+ }
+ }
+
+ /* Return residual energy */
+ nrg = CAf[ 0 ]; // Q( -rshifts )
+ tmp1 = 1 << 16; // Q16
+ for( k = 0; k < D; k++ ) {
+ Atmp1 = SKP_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); // Q16
+ nrg = SKP_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); // Q( -rshifts )
+ tmp1 = SKP_SMLAWW( tmp1, Atmp1, Atmp1 ); // Q16
+ A_Q16[ k ] = -Atmp1;
+ }
+ *res_nrg = SKP_SMLAWW( nrg, SKP_SMMUL( WhiteNoiseFrac_Q32, C0 ), -tmp1 ); // Q( -rshifts )
+ *res_nrg_Q = -rshifts;
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_bwexpander.c
@@ -1,0 +1,49 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Chirp (bandwidth expand) LP AR filter */
+void SKP_Silk_bwexpander(
+ SKP_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* I Length of ar */
+ SKP_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */
+)
+{
+ SKP_int i;
+ SKP_int32 chirp_minus_one_Q16;
+
+ chirp_minus_one_Q16 = chirp_Q16 - 65536;
+
+ /* NB: Dont use SKP_SMULWB, instead of SKP_RSHIFT_ROUND( SKP_MUL() , 16 ), below. */
+ /* Bias in SKP_SMULWB can lead to unstable filters */
+ for( i = 0; i < d - 1; i++ ) {
+ ar[ i ] = (SKP_int16)SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, ar[ i ] ), 16 );
+ chirp_Q16 += SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 );
+ }
+ ar[ d - 1 ] = (SKP_int16)SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, ar[ d - 1 ] ), 16 );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_bwexpander_32.c
@@ -1,0 +1,46 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Chirp (bandwidth expand) LP AR filter */
+void SKP_Silk_bwexpander_32(
+ SKP_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* I Length of ar */
+ SKP_int32 chirp_Q16 /* I Chirp factor in Q16 */
+)
+{
+ SKP_int i;
+ SKP_int32 tmp_chirp_Q16;
+
+ tmp_chirp_Q16 = chirp_Q16;
+ for( i = 0; i < d - 1; i++ ) {
+ ar[ i ] = SKP_SMULWW( ar[ i ], tmp_chirp_Q16 );
+ tmp_chirp_Q16 = SKP_SMULWW( chirp_Q16, tmp_chirp_Q16 );
+ }
+ ar[ d - 1 ] = SKP_SMULWW( ar[ d - 1 ], tmp_chirp_Q16 );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_common_pitch_est_defines.h
@@ -1,0 +1,86 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_COMMON_PE_DEFINES_H
+#define SKP_SILK_COMMON_PE_DEFINES_H
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/************************************************************/
+/* Definitions For Fix pitch estimator */
+/************************************************************/
+
+#define PE_MAX_FS_KHZ 24 /* Maximum sampling frequency used */
+
+#define PE_MAX_NB_SUBFR 4
+#define PE_SUBFR_LENGTH_MS 5 /* 5 ms */
+
+#define PE_LTP_MEM_LENGTH_MS (4 * PE_SUBFR_LENGTH_MS)
+
+#define PE_MAX_FRAME_LENGTH_MS (PE_LTP_MEM_LENGTH_MS + PE_MAX_NB_SUBFR * PE_SUBFR_LENGTH_MS)
+#define PE_MAX_FRAME_LENGTH (PE_MAX_FRAME_LENGTH_MS * PE_MAX_FS_KHZ)
+#define PE_MAX_FRAME_LENGTH_ST_1 (PE_MAX_FRAME_LENGTH >> 2)
+#define PE_MAX_FRAME_LENGTH_ST_2 (PE_MAX_FRAME_LENGTH >> 1)
+#define PE_MAX_SF_FRAME_LENGTH (PE_SUB_FRAME * PE_MAX_FS_KHZ)
+
+#define PE_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */
+#define PE_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */
+#define PE_MAX_LAG (PE_MAX_LAG_MS * PE_MAX_FS_KHZ)
+#define PE_MIN_LAG (PE_MIN_LAG_MS * PE_MAX_FS_KHZ)
+
+#define PE_D_SRCH_LENGTH 24
+
+#define PE_MAX_DECIMATE_STATE_LENGTH 7
+
+#define PE_NB_STAGE3_LAGS 5
+
+#define PE_NB_CBKS_STAGE2 3
+#define PE_NB_CBKS_STAGE2_EXT 11
+
+#define PE_CB_mn2 1
+#define PE_CB_mx2 2
+
+#define PE_NB_CBKS_STAGE3_MAX 34
+#define PE_NB_CBKS_STAGE3_MID 24
+#define PE_NB_CBKS_STAGE3_MIN 16
+
+#define PE_NB_CBKS_STAGE3_10MS 12
+#define PE_NB_CBKS_STAGE2_10MS 3
+
+extern const SKP_int8 SKP_Silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ];
+extern const SKP_int8 SKP_Silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ];
+extern const SKP_int8 SKP_Silk_Lag_range_stage3[ SKP_Silk_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ];
+extern const SKP_int8 SKP_Silk_nb_cbk_searchs_stage3[ SKP_Silk_PE_MAX_COMPLEX + 1 ];
+extern const SKP_int8 SKP_Silk_cbk_offsets_stage3[ SKP_Silk_PE_MAX_COMPLEX + 1 ];
+
+/* Tables added for 10 ms frames */
+extern const SKP_int8 SKP_Silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ 3 ];
+extern const SKP_int8 SKP_Silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 12 ];
+extern const SKP_int8 SKP_Silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ];
+
+#endif
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_decode_pitch.c
@@ -1,0 +1,71 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/***********************************************************
+* Pitch analyser function
+********************************************************** */
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_pitch_est_defines.h"
+
+void SKP_Silk_decode_pitch(
+ SKP_int lagIndex, /* I */
+ SKP_int contourIndex, /* O */
+ SKP_int pitch_lags[], /* O 4 pitch values */
+ const SKP_int Fs_kHz, /* I sampling frequency (kHz) */
+ const SKP_int nb_subfr /* I number of sub frames */
+)
+{
+ SKP_int lag, k, min_lag, cbk_size;
+ const SKP_int8 *Lag_CB_ptr;
+
+ if( Fs_kHz == 8 ) {
+ if( nb_subfr == PE_MAX_NB_SUBFR ) {
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage2[ 0 ][ 0 ];
+ cbk_size = PE_NB_CBKS_STAGE2_EXT;
+ } else {
+ SKP_assert( PE_MAX_NB_SUBFR >> 1 == nb_subfr );
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage2_10_ms[ 0 ][ 0 ];
+ cbk_size = PE_NB_CBKS_STAGE2_10MS;
+ }
+ } else {
+ if( nb_subfr == PE_MAX_NB_SUBFR ) {
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3[ 0 ][ 0 ];
+ cbk_size = PE_NB_CBKS_STAGE3_MAX;
+ } else {
+ SKP_assert( PE_MAX_NB_SUBFR >> 1 == nb_subfr );
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
+ cbk_size = PE_NB_CBKS_STAGE3_10MS;
+ }
+ }
+
+ min_lag = SKP_SMULBB( PE_MIN_LAG_MS, Fs_kHz );
+ lag = min_lag + lagIndex;
+
+ for( k = 0; k < nb_subfr; k++ ) {
+ pitch_lags[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, contourIndex, cbk_size );
+ }
+}
\ No newline at end of file
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c
@@ -1,0 +1,96 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_inner_prod_aligned.c *
+ * *
+ * *
+ * Copyright 2008-2010 (c), Skype Limited *
+ * Date: 080601 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* sum= for(i=0;i<len;i++)inVec1[i]*inVec2[i]; --- inner product */
+/* Note for ARM asm: */
+/* * inVec1 and inVec2 should be at least 2 byte aligned. (Or defined as short/int16) */
+/* * len should be positive 16bit integer. */
+/* * only when len>6, memory access can be reduced by half. */
+
+SKP_int32 SKP_Silk_inner_prod_aligned(
+ const SKP_int16* const inVec1, /* I input vector 1 */
+ const SKP_int16* const inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+)
+{
+ SKP_int i;
+ SKP_int32 sum = 0;
+ for( i = 0; i < len; i++ ) {
+ sum = SKP_SMLABB( sum, inVec1[ i ], inVec2[ i ] );
+ }
+ return sum;
+}
+
+SKP_int64 SKP_Silk_inner_prod_aligned_64(
+ const SKP_int32 *inVec1, /* I input vector 1 */
+ const SKP_int32 *inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+)
+{
+ SKP_int i;
+ SKP_int64 sum = 0;
+ for( i = 0; i < len; i++ ) {
+ sum = SKP_SMLAL( sum, inVec1[ i ], inVec2[ i ] );
+ }
+ return sum;
+}
+SKP_int64 SKP_Silk_inner_prod16_aligned_64(
+ const SKP_int16 *inVec1, /* I input vector 1 */
+ const SKP_int16 *inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+)
+{
+ SKP_int i;
+ SKP_int64 sum = 0;
+ for( i = 0; i < len; i++ ) {
+ sum = SKP_SMLALBB( sum, inVec1[ i ], inVec2[ i ] );
+ }
+ return sum;
+}
+
+SKP_int32 SKP_Silk_inner_prod16_aligned_sat(
+ const SKP_int16* const inVec1, /* I input vector 1 */
+ const SKP_int16* const inVec2, /* I input vector 2 */
+ const SKP_int len /* I vector lengths */
+)
+{
+ SKP_int i;
+ SKP_int32 sum = 0;
+ for( i = 0; i < len; i++ ) {
+ sum = SKP_ADD_SAT32( sum, SKP_SMULBB( inVec1[ i ], inVec2[ i ] ) );
+ }
+ return sum;
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_k2a.c
@@ -1,0 +1,58 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_k2a.c *
+ * *
+ * Step up function, converts reflection coefficients to prediction *
+ * coefficients *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * Date: 080103 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Step up function, converts reflection coefficients to prediction coefficients */
+void SKP_Silk_k2a(
+ SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
+ const SKP_int16 *rc_Q15, /* I: Reflection coefficients [order] Q15 */
+ const SKP_int32 order /* I: Prediction order */
+)
+{
+ SKP_int k, n;
+ SKP_int32 Atmp[ SKP_Silk_MAX_ORDER_LPC ];
+
+ for( k = 0; k < order; k++ ) {
+ for( n = 0; n < k; n++ ) {
+ Atmp[ n ] = A_Q24[ n ];
+ }
+ for( n = 0; n < k; n++ ) {
+ A_Q24[ n ] = SKP_SMLAWB( A_Q24[ n ], SKP_LSHIFT( Atmp[ k - n - 1 ], 1 ), rc_Q15[ k ] );
+ }
+ A_Q24[ k ] = -SKP_LSHIFT( (SKP_int32)rc_Q15[ k ], 9 );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_k2a_Q16.c
@@ -1,0 +1,58 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_k2a.c *
+ * *
+ * Step up function, converts reflection coefficients to prediction *
+ * coefficients *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * Date: 080103 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Step up function, converts reflection coefficients to prediction coefficients */
+void SKP_Silk_k2a_Q16(
+ SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */
+ const SKP_int32 *rc_Q16, /* I: Reflection coefficients [order] Q16 */
+ const SKP_int32 order /* I: Prediction order */
+)
+{
+ SKP_int k, n;
+ SKP_int32 Atmp[ SKP_Silk_MAX_ORDER_LPC ];
+
+ for( k = 0; k < order; k++ ) {
+ for( n = 0; n < k; n++ ) {
+ Atmp[ n ] = A_Q24[ n ];
+ }
+ for( n = 0; n < k; n++ ) {
+ A_Q24[ n ] = SKP_SMLAWW( A_Q24[ n ], Atmp[ k - n - 1 ], rc_Q16[ k ] );
+ }
+ A_Q24[ k ] = -SKP_LSHIFT( rc_Q16[ k ], 8 );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_lin2log.c
@@ -1,0 +1,49 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_lin2log.c *
+ * *
+ * Convert input to a log scale *
+ * Approximation of 128 * log2() *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+/* Approximation of 128 * log2() (very close inverse of approx 2^() below) */
+/* Convert input to a log scale */
+SKP_int32 SKP_Silk_lin2log( const SKP_int32 inLin ) /* I: Input in linear scale */
+{
+ SKP_int32 lz, frac_Q7;
+
+ SKP_Silk_CLZ_FRAC( inLin, &lz, &frac_Q7 );
+
+ /* Piece-wise parabolic approximation */
+ return( SKP_LSHIFT( 31 - lz, 7 ) + SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), 179 ) );
+}
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_log2lin.c
@@ -1,0 +1,58 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_log2lin.c *
+ * *
+ * Convert input to a linear scale *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Approximation of 2^() (very close inverse of SKP_Silk_lin2log()) */
+/* Convert input to a linear scale */
+SKP_int32 SKP_Silk_log2lin( const SKP_int32 inLog_Q7 ) /* I: Input on log scale */
+{
+ SKP_int32 out, frac_Q7;
+
+ if( inLog_Q7 < 0 ) {
+ return 0;
+ }
+
+ out = SKP_LSHIFT( 1, SKP_RSHIFT( inLog_Q7, 7 ) );
+ frac_Q7 = inLog_Q7 & 0x7F;
+ if( inLog_Q7 < 2048 ) {
+ /* Piece-wise parabolic approximation */
+ out = SKP_ADD_RSHIFT( out, SKP_MUL( out, SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), -174 ) ), 7 );
+ } else {
+ /* Piece-wise parabolic approximation */
+ out = SKP_MLA( out, SKP_RSHIFT( out, 7 ), SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), -174 ) );
+ }
+ return out;
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_lowpass_int.c
@@ -1,0 +1,61 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_lowpass_int.c *
+ * *
+ * First order low-pass filter, with input as SKP_int32, running at *
+ * 48 kHz *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* First order low-pass filter, with input as SKP_int32, running at 48 kHz */
+void SKP_Silk_lowpass_int(
+ const SKP_int32 *in, /* I: Q25 48 kHz signal; length = len */
+ SKP_int32 *S, /* I/O: Q25 state; length = 1 */
+ SKP_int32 *out, /* O: Q25 48 kHz signal; length = len */
+ const SKP_int32 len /* I: Number of samples */
+)
+{
+ SKP_int k;
+ SKP_int32 in_tmp, out_tmp, state;
+
+ state = S[ 0 ];
+ for( k = len; k > 0; k-- ) {
+ in_tmp = *in++;
+ in_tmp -= SKP_RSHIFT( in_tmp, 2 ); /* multiply by 0.75 */
+ out_tmp = state + in_tmp; /* zero at nyquist */
+ state = in_tmp - SKP_RSHIFT( out_tmp, 1 ); /* pole */
+ *out++ = out_tmp;
+ }
+ S[ 0 ] = state;
+}
+
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_lowpass_short.c
@@ -1,0 +1,61 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_lowpass_short.c *
+ * *
+ * First order low-pass filter, with input as SKP_int16, running at *
+ * 48 kHz *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+
+/* First order low-pass filter, with input as SKP_int16, running at 48 kHz */
+void SKP_Silk_lowpass_short(
+ const SKP_int16 *in, /* I: Q15 48 kHz signal; [len] */
+ SKP_int32 *S, /* I/O: Q25 state; length = 1 */
+ SKP_int32 *out, /* O: Q25 48 kHz signal; [len] */
+ const SKP_int32 len /* O: Signal length */
+)
+{
+ SKP_int k;
+ SKP_int32 in_tmp, out_tmp, state;
+
+ state = S[ 0 ];
+ for( k = 0; k < len; k++ ) {
+ in_tmp = SKP_MUL( 768, (SKP_int32)in[k] ); /* multiply by 0.75, going from Q15 to Q25 */
+ out_tmp = state + in_tmp; /* zero at nyquist */
+ state = in_tmp - SKP_RSHIFT( out_tmp, 1 ); /* pole */
+ out[ k ] = out_tmp;
+ }
+ S[ 0 ] = state;
+}
+
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_macros.h
@@ -1,0 +1,132 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef _SKP_SILK_API_C_H_
+#define _SKP_SILK_API_C_H_
+
+// This is an inline header file for general platform.
+
+// (a32 * (SKP_int32)((SKP_int16)(b32))) >> 16 output have to be 32bit int
+#define SKP_SMULWB(a32, b32) ((((a32) >> 16) * (SKP_int32)((SKP_int16)(b32))) + ((((a32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(b32))) >> 16))
+
+// a32 + (b32 * (SKP_int32)((SKP_int16)(c32))) >> 16 output have to be 32bit int
+#define SKP_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (SKP_int32)((SKP_int16)(c32))) + ((((b32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(c32))) >> 16)))
+
+// (a32 * (b32 >> 16)) >> 16
+#define SKP_SMULWT(a32, b32) (((a32) >> 16) * ((b32) >> 16) + ((((a32) & 0x0000FFFF) * ((b32) >> 16)) >> 16))
+
+// a32 + (b32 * (c32 >> 16)) >> 16
+#define SKP_SMLAWT(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16))
+
+// (SKP_int32)((SKP_int16)(a3))) * (SKP_int32)((SKP_int16)(b32)) output have to be 32bit int
+#define SKP_SMULBB(a32, b32) ((SKP_int32)((SKP_int16)(a32)) * (SKP_int32)((SKP_int16)(b32)))
+
+// a32 + (SKP_int32)((SKP_int16)(b32)) * (SKP_int32)((SKP_int16)(c32)) output have to be 32bit int
+#define SKP_SMLABB(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * (SKP_int32)((SKP_int16)(c32)))
+
+// (SKP_int32)((SKP_int16)(a32)) * (b32 >> 16)
+#define SKP_SMULBT(a32, b32) ((SKP_int32)((SKP_int16)(a32)) * ((b32) >> 16))
+
+// a32 + (SKP_int32)((SKP_int16)(b32)) * (c32 >> 16)
+#define SKP_SMLABT(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * ((c32) >> 16))
+
+// a64 + (b32 * c32)
+#define SKP_SMLAL(a64, b32, c32) (SKP_ADD64((a64), ((SKP_int64)(b32) * (SKP_int64)(c32))))
+
+// (a32 * b32) >> 16
+#define SKP_SMULWW(a32, b32) SKP_MLA(SKP_SMULWB((a32), (b32)), (a32), SKP_RSHIFT_ROUND((b32), 16))
+
+// a32 + ((b32 * c32) >> 16)
+#define SKP_SMLAWW(a32, b32, c32) SKP_MLA(SKP_SMLAWB((a32), (b32), (c32)), (b32), SKP_RSHIFT_ROUND((c32), 16))
+
+/* add/subtract with output saturated */
+#define SKP_ADD_SAT32(a, b) ((((a) + (b)) & 0x80000000) == 0 ? \
+ ((((a) & (b)) & 0x80000000) != 0 ? SKP_int32_MIN : (a)+(b)) : \
+ ((((a) | (b)) & 0x80000000) == 0 ? SKP_int32_MAX : (a)+(b)) )
+
+#define SKP_SUB_SAT32(a, b) ((((a)-(b)) & 0x80000000) == 0 ? \
+ (( (a) & ((b)^0x80000000) & 0x80000000) ? SKP_int32_MIN : (a)-(b)) : \
+ ((((a)^0x80000000) & (b) & 0x80000000) ? SKP_int32_MAX : (a)-(b)) )
+
+SKP_INLINE SKP_int32 SKP_Silk_CLZ16(SKP_int16 in16)
+{
+ SKP_int32 out32 = 0;
+ if( in16 == 0 ) {
+ return 16;
+ }
+ /* test nibbles */
+ if( in16 & 0xFF00 ) {
+ if( in16 & 0xF000 ) {
+ in16 >>= 12;
+ } else {
+ out32 += 4;
+ in16 >>= 8;
+ }
+ } else {
+ if( in16 & 0xFFF0 ) {
+ out32 += 8;
+ in16 >>= 4;
+ } else {
+ out32 += 12;
+ }
+ }
+ /* test bits and return */
+ if( in16 & 0xC ) {
+ if( in16 & 0x8 )
+ return out32 + 0;
+ else
+ return out32 + 1;
+ } else {
+ if( in16 & 0xE )
+ return out32 + 2;
+ else
+ return out32 + 3;
+ }
+}
+
+SKP_INLINE SKP_int32 SKP_Silk_CLZ32(SKP_int32 in32)
+{
+ /* test highest 16 bits and convert to SKP_int16 */
+ if( in32 & 0xFFFF0000 ) {
+ return SKP_Silk_CLZ16((SKP_int16)(in32 >> 16));
+ } else {
+ return SKP_Silk_CLZ16((SKP_int16)in32) + 16;
+ }
+}
+
+/* Row based */
+#define matrix_ptr(Matrix_base_adr, row, column, N) *(Matrix_base_adr + ((row)*(N)+(column)))
+#define matrix_adr(Matrix_base_adr, row, column, N) (Matrix_base_adr + ((row)*(N)+(column)))
+
+/* Column based */
+#ifndef matrix_c_ptr
+# define matrix_c_ptr(Matrix_base_adr, row, column, M) *(Matrix_base_adr + ((row)+(M)*(column)))
+#endif
+#define matrix_c_adr(Matrix_base_adr, row, column, M) (Matrix_base_adr + ((row)+(M)*(column)))
+
+#endif //_SKP_SILK_API_C_H_
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_pitch_analysis_core.c
@@ -1,0 +1,752 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/***********************************************************
+* Pitch analyser function
+********************************************************** */
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_pitch_est_defines.h"
+#include "SKP_debug.h"
+
+#define SCRATCH_SIZE 22
+
+/************************************************************/
+/* Internally used functions */
+/************************************************************/
+void SKP_FIX_P_Ana_calc_corr_st3(
+ SKP_int32 cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM correlation array */
+ const SKP_int16 signal[], /* I vector to correlate */
+ SKP_int start_lag, /* I lag offset to search around */
+ SKP_int sf_length, /* I length of a 5 ms subframe */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+);
+
+void SKP_FIX_P_Ana_calc_energy_st3(
+ SKP_int32 energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM energy array */
+ const SKP_int16 signal[], /* I vector to calc energy in */
+ SKP_int start_lag, /* I lag offset to search around */
+ SKP_int sf_length, /* I length of one 5 ms subframe */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+);
+
+SKP_int32 SKP_FIX_P_Ana_find_scaling(
+ const SKP_int16 *signal,
+ const SKP_int signal_length,
+ const SKP_int sum_sqr_len
+);
+
+/*************************************************************/
+/* FIXED POINT CORE PITCH ANALYSIS FUNCTION */
+/*************************************************************/
+SKP_int SKP_Silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */
+ const SKP_int16 *signal, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */
+ SKP_int *pitch_out, /* O 4 pitch lag values */
+ SKP_int *lagIndex, /* O Lag Index */
+ SKP_int *contourIndex, /* O Pitch contour Index */
+ SKP_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */
+ SKP_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */
+ const SKP_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */
+ const SKP_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */
+ const SKP_int Fs_kHz, /* I Sample frequency (kHz) */
+ const SKP_int complexity, /* I Complexity setting, 0-2, where 2 is highest */
+ const SKP_int nb_subfr /* I number of 5 ms subframes */
+)
+{
+ SKP_int16 signal_8kHz[ PE_MAX_FRAME_LENGTH_ST_2 ];
+ SKP_int16 signal_4kHz[ PE_MAX_FRAME_LENGTH_ST_1 ];
+ SKP_int32 scratch_mem[ 3 * PE_MAX_FRAME_LENGTH ];
+ SKP_int16 *input_signal_ptr;
+ SKP_int32 filt_state[ PE_MAX_DECIMATE_STATE_LENGTH ];
+ SKP_int i, k, d, j;
+ SKP_int16 C[ PE_MAX_NB_SUBFR ][ ( PE_MAX_LAG >> 1 ) + 5 ];
+ const SKP_int16 *target_ptr, *basis_ptr;
+ SKP_int32 cross_corr, normalizer, energy, shift, energy_basis, energy_target;
+ SKP_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp;
+ SKP_int16 d_comp[ ( PE_MAX_LAG >> 1 ) + 5 ];
+ SKP_int32 sum, threshold, temp32, lag_counter;
+ SKP_int CBimax, CBimax_new, CBimax_old, lag, start_lag, end_lag, lag_new;
+ SKP_int32 CC[ PE_NB_CBKS_STAGE2_EXT ], CCmax, CCmax_b, CCmax_new_b, CCmax_new;
+ SKP_int32 energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ];
+ SKP_int32 crosscorr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ];
+ SKP_int frame_length, frame_length_8kHz, frame_length_4kHz, max_sum_sq_length;
+ SKP_int sf_length, sf_length_8kHz, sf_length_4kHz;
+ SKP_int min_lag, min_lag_8kHz, min_lag_4kHz;
+ SKP_int max_lag, max_lag_8kHz, max_lag_4kHz;
+ SKP_int32 contour_bias, diff, lz, lshift;
+ SKP_int cbk_offset, nb_cbk_search, cbk_size;
+ SKP_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q15, corr_thres_Q15;
+ const SKP_int8 *Lag_CB_ptr;
+ /* Check for valid sampling frequency */
+ SKP_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 || Fs_kHz == 24 );
+
+ /* Check for valid complexity setting */
+ SKP_assert( complexity >= SKP_Silk_PE_MIN_COMPLEX );
+ SKP_assert( complexity <= SKP_Silk_PE_MAX_COMPLEX );
+
+ SKP_assert( search_thres1_Q16 >= 0 && search_thres1_Q16 <= (1<<16) );
+ SKP_assert( search_thres2_Q15 >= 0 && search_thres2_Q15 <= (1<<15) );
+
+ /* Setup frame lengths max / min lag for the sampling frequency */
+ frame_length = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * Fs_kHz;
+ frame_length_4kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 4;
+ frame_length_8kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 8;
+ sf_length = PE_SUBFR_LENGTH_MS * Fs_kHz;
+ sf_length_4kHz = PE_SUBFR_LENGTH_MS * 4;
+ sf_length_8kHz = PE_SUBFR_LENGTH_MS * 8;
+ min_lag = PE_MIN_LAG_MS * Fs_kHz;
+ min_lag_4kHz = PE_MIN_LAG_MS * 4;
+ min_lag_8kHz = PE_MIN_LAG_MS * 8;
+ max_lag = PE_MAX_LAG_MS * Fs_kHz;
+ max_lag_4kHz = PE_MAX_LAG_MS * 4;
+ max_lag_8kHz = PE_MAX_LAG_MS * 8;
+
+ SKP_memset( C, 0, sizeof( SKP_int16 ) * nb_subfr * ( ( PE_MAX_LAG >> 1 ) + 5) );
+
+ /* Resample from input sampled at Fs_kHz to 8 kHz */
+ if( Fs_kHz == 16 ) {
+ SKP_memset( filt_state, 0, 2 * sizeof( SKP_int32 ) );
+ SKP_Silk_resampler_down2( filt_state, signal_8kHz, signal, frame_length );
+ } else if ( Fs_kHz == 12 ) {
+ SKP_int32 R23[ 6 ];
+ SKP_memset( R23, 0, 6 * sizeof( SKP_int32 ) );
+ SKP_Silk_resampler_down2_3( R23, signal_8kHz, signal, frame_length );
+ } else if( Fs_kHz == 24 ) {
+ SKP_int32 filt_state_fix[ 8 ];
+ SKP_memset( filt_state_fix, 0, 8 * sizeof(SKP_int32) );
+ SKP_Silk_resampler_down3( filt_state_fix, signal_8kHz, signal, frame_length );
+ } else {
+ SKP_assert( Fs_kHz == 8 );
+ SKP_memcpy( signal_8kHz, signal, frame_length_8kHz * sizeof(SKP_int16) );
+ }
+ /* Decimate again to 4 kHz */
+ SKP_memset( filt_state, 0, 2 * sizeof( SKP_int32 ) );/* Set state to zero */
+ SKP_Silk_resampler_down2( filt_state, signal_4kHz, signal_8kHz, frame_length_8kHz );
+
+ /* Low-pass filter */
+ for( i = frame_length_4kHz - 1; i > 0; i-- ) {
+ signal_4kHz[ i ] = SKP_ADD_SAT16( signal_4kHz[ i ], signal_4kHz[ i - 1 ] );
+ }
+
+ /*******************************************************************************
+ ** Scale 4 kHz signal down to prevent correlations measures from overflowing
+ ** find scaling as max scaling for each 8kHz(?) subframe
+ *******************************************************************************/
+
+ /* Inner product is calculated with different lengths, so scale for the worst case */
+ max_sum_sq_length = SKP_max_32( sf_length_8kHz, SKP_LSHIFT( sf_length_4kHz, 2 ) );
+ shift = SKP_FIX_P_Ana_find_scaling( signal_4kHz, frame_length_4kHz, max_sum_sq_length );
+ if( shift > 0 ) {
+ for( i = 0; i < frame_length_4kHz; i++ ) {
+ signal_4kHz[ i ] = SKP_RSHIFT( signal_4kHz[ i ], shift );
+ }
+ }
+
+ /******************************************************************************
+ * FIRST STAGE, operating in 4 khz
+ ******************************************************************************/
+ target_ptr = &signal_4kHz[ SKP_LSHIFT( sf_length_4kHz, 2 ) ];
+ for( k = 0; k < nb_subfr >> 1; k++ ) {
+ /* Check that we are within range of the array */
+ SKP_assert( target_ptr >= signal_4kHz );
+ SKP_assert( target_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
+
+ basis_ptr = target_ptr - min_lag_4kHz;
+
+ /* Check that we are within range of the array */
+ SKP_assert( basis_ptr >= signal_4kHz );
+ SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
+
+ normalizer = 0;
+ cross_corr = 0;
+ /* Calculate first vector products before loop */
+ cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz );
+ normalizer = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz );
+ normalizer = SKP_ADD_SAT32( normalizer, 1000 );
+
+ temp32 = SKP_DIV32( cross_corr, SKP_Silk_SQRT_APPROX( normalizer ) + 1 );
+ C[ k ][ min_lag_4kHz ] = (SKP_int16)SKP_SAT16( temp32 ); /* Q0 */
+
+ /* From now on normalizer is computed recursively */
+ for( d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++ ) {
+ basis_ptr--;
+
+ /* Check that we are within range of the array */
+ SKP_assert( basis_ptr >= signal_4kHz );
+ SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
+
+ cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz );
+
+ /* Add contribution of new sample and remove contribution from oldest sample */
+ normalizer +=
+ SKP_SMULBB( basis_ptr[ 0 ], basis_ptr[ 0 ] ) -
+ SKP_SMULBB( basis_ptr[ sf_length_8kHz ], basis_ptr[ sf_length_8kHz ] );
+
+ temp32 = SKP_DIV32( cross_corr, SKP_Silk_SQRT_APPROX( normalizer ) + 1 );
+ C[ k ][ d ] = (SKP_int16)SKP_SAT16( temp32 ); /* Q0 */
+ }
+ /* Update target pointer */
+ target_ptr += sf_length_8kHz;
+ }
+
+ /* Combine two subframes into single correlation measure and apply short-lag bias */
+ if( nb_subfr == PE_MAX_NB_SUBFR ) {
+ for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) {
+ sum = (SKP_int32)C[ 0 ][ i ] + (SKP_int32)C[ 1 ][ i ]; /* Q0 */
+ SKP_assert( SKP_RSHIFT( sum, 1 ) == SKP_SAT16( SKP_RSHIFT( sum, 1 ) ) );
+ sum = SKP_RSHIFT( sum, 1 ); /* Q-1 */
+ SKP_assert( SKP_LSHIFT( (SKP_int32)-i, 4 ) == SKP_SAT16( SKP_LSHIFT( (SKP_int32)-i, 4 ) ) );
+ sum = SKP_SMLAWB( sum, sum, SKP_LSHIFT( -i, 4 ) ); /* Q-1 */
+ SKP_assert( sum == SKP_SAT16( sum ) );
+ C[ 0 ][ i ] = (SKP_int16)sum; /* Q-1 */
+ }
+ } else {
+ /* Only short lag bias */
+ for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) {
+ sum = (SKP_int32)C[ 0 ][ i ];
+ sum = SKP_SMLAWB( sum, sum, SKP_LSHIFT( -i, 4 ) ); /* Q-1 */
+ C[ 0 ][ i ] = (SKP_int16)sum; /* Q-1 */
+ }
+ }
+ /* Sort */
+ length_d_srch = 5 + complexity;
+ SKP_assert( length_d_srch <= PE_D_SRCH_LENGTH );
+ SKP_Silk_insertion_sort_decreasing_int16( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch );
+
+ /* Escape if correlation is very low already here */
+ target_ptr = &signal_4kHz[ SKP_SMULBB( sf_length_4kHz, nb_subfr ) ];
+ energy = SKP_Silk_inner_prod_aligned( target_ptr, target_ptr, SKP_LSHIFT( sf_length_4kHz, 2 ) );
+ energy = SKP_ADD_SAT32( energy, 1000 ); /* Q0 */
+ Cmax = (SKP_int)C[ 0 ][ min_lag_4kHz ]; /* Q-1 */
+ threshold = SKP_SMULBB( Cmax, Cmax ); /* Q-2 */
+ /* Compare in Q-2 domain */
+
+ if( SKP_RSHIFT( energy, 4 + 2 ) > threshold ) {
+ SKP_memset( pitch_out, 0, nb_subfr * sizeof( SKP_int ) );
+ *LTPCorr_Q15 = 0;
+ *lagIndex = 0;
+ *contourIndex = 0;
+ return 1;
+ }
+
+ threshold = SKP_SMULWB( search_thres1_Q16, Cmax );
+ for( i = 0; i < length_d_srch; i++ ) {
+ /* Convert to 8 kHz indices for the sorted correlation that exceeds the threshold */
+ if( C[ 0 ][ min_lag_4kHz + i ] > threshold ) {
+ d_srch[ i ] = SKP_LSHIFT( d_srch[ i ] + min_lag_4kHz, 1 );
+ } else {
+ length_d_srch = i;
+ break;
+ }
+ }
+ SKP_assert( length_d_srch > 0 );
+
+ for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) {
+ d_comp[ i ] = 0;
+ }
+ for( i = 0; i < length_d_srch; i++ ) {
+ d_comp[ d_srch[ i ] ] = 1;
+ }
+
+ /* Convolution */
+ for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) {
+ d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ];
+ }
+
+ length_d_srch = 0;
+ for( i = min_lag_8kHz; i < max_lag_8kHz + 1; i++ ) {
+ if( d_comp[ i + 1 ] > 0 ) {
+ d_srch[ length_d_srch ] = i;
+ length_d_srch++;
+ }
+ }
+
+ /* Convolution */
+ for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) {
+ d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ] + d_comp[ i - 3 ];
+ }
+
+ length_d_comp = 0;
+ for( i = min_lag_8kHz; i < max_lag_8kHz + 4; i++ ) {
+ if( d_comp[ i ] > 0 ) {
+ d_comp[ length_d_comp ] = i - 2;
+ length_d_comp++;
+ }
+ }
+
+ /**********************************************************************************
+ ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation
+ *************************************************************************************/
+
+ /******************************************************************************
+ ** Scale signal down to avoid correlations measures from overflowing
+ *******************************************************************************/
+ /* find scaling as max scaling for each subframe */
+ shift = SKP_FIX_P_Ana_find_scaling( signal_8kHz, frame_length_8kHz, sf_length_8kHz );
+ if( shift > 0 ) {
+ for( i = 0; i < frame_length_8kHz; i++ ) {
+ signal_8kHz[ i ] = SKP_RSHIFT( signal_8kHz[ i ], shift );
+ }
+ }
+
+ /*********************************************************************************
+ * Find energy of each subframe projected onto its history, for a range of delays
+ *********************************************************************************/
+ SKP_memset( C, 0, PE_MAX_NB_SUBFR * ( ( PE_MAX_LAG >> 1 ) + 5 ) * sizeof( SKP_int16 ) );
+
+ target_ptr = &signal_8kHz[ PE_LTP_MEM_LENGTH_MS * 8 ];
+ for( k = 0; k < nb_subfr; k++ ) {
+
+ /* Check that we are within range of the array */
+ SKP_assert( target_ptr >= signal_8kHz );
+ SKP_assert( target_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz );
+
+ energy_target = SKP_Silk_inner_prod_aligned( target_ptr, target_ptr, sf_length_8kHz );
+ // ToDo: Calculate 1 / energy_target here and save one division inside next for loop
+ for( j = 0; j < length_d_comp; j++ ) {
+ d = d_comp[ j ];
+ basis_ptr = target_ptr - d;
+
+ /* Check that we are within range of the array */
+ SKP_assert( basis_ptr >= signal_8kHz );
+ SKP_assert( basis_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz );
+
+ cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz );
+ energy_basis = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz );
+ if( cross_corr > 0 ) {
+ energy = SKP_max( energy_target, energy_basis ); /* Find max to make sure first division < 1.0 */
+ lz = SKP_Silk_CLZ32( cross_corr );
+ lshift = SKP_LIMIT_32( lz - 1, 0, 15 );
+ temp32 = SKP_DIV32( SKP_LSHIFT( cross_corr, lshift ), SKP_RSHIFT( energy, 15 - lshift ) + 1 ); /* Q15 */
+ SKP_assert( temp32 == SKP_SAT16( temp32 ) );
+ temp32 = SKP_SMULWB( cross_corr, temp32 ); /* Q(-1), cc * ( cc / max(b, t) ) */
+ temp32 = SKP_ADD_SAT32( temp32, temp32 ); /* Q(0) */
+ lz = SKP_Silk_CLZ32( temp32 );
+ lshift = SKP_LIMIT_32( lz - 1, 0, 15 );
+ energy = SKP_min( energy_target, energy_basis );
+ C[ k ][ d ] = SKP_DIV32( SKP_LSHIFT( temp32, lshift ), SKP_RSHIFT( energy, 15 - lshift ) + 1 ); // Q15
+ } else {
+ C[ k ][ d ] = 0;
+ }
+ }
+ target_ptr += sf_length_8kHz;
+ }
+
+ /* search over lag range and lags codebook */
+ /* scale factor for lag codebook, as a function of center lag */
+
+ CCmax = SKP_int32_MIN;
+ CCmax_b = SKP_int32_MIN;
+
+ CBimax = 0; /* To avoid returning undefined lag values */
+ lag = -1; /* To check if lag with strong enough correlation has been found */
+
+ if( prevLag > 0 ) {
+ if( Fs_kHz == 12 ) {
+ prevLag = SKP_DIV32_16( SKP_LSHIFT( prevLag, 1 ), 3 );
+ } else if( Fs_kHz == 16 ) {
+ prevLag = SKP_RSHIFT( prevLag, 1 );
+ } else if( Fs_kHz == 24 ) {
+ prevLag = SKP_DIV32_16( prevLag, 3 );
+ }
+ prevLag_log2_Q7 = SKP_Silk_lin2log( (SKP_int32)prevLag );
+ } else {
+ prevLag_log2_Q7 = 0;
+ }
+ SKP_assert( search_thres2_Q15 == SKP_SAT16( search_thres2_Q15 ) );
+ /* Setup stage 2 codebook based on number of subframes */
+ if( nb_subfr == PE_MAX_NB_SUBFR ) {
+ cbk_size = PE_NB_CBKS_STAGE2_EXT;
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage2[ 0 ][ 0 ];
+ if( Fs_kHz == 8 && complexity > SKP_Silk_PE_MIN_COMPLEX ) {
+ /* If input is 8 khz use a larger codebook here because it is last stage */
+ nb_cbk_search = PE_NB_CBKS_STAGE2_EXT;
+ } else {
+ nb_cbk_search = PE_NB_CBKS_STAGE2;
+ }
+ corr_thres_Q15 = SKP_RSHIFT( SKP_SMULBB( search_thres2_Q15, search_thres2_Q15 ), 13 );
+ }else{
+ cbk_size = PE_NB_CBKS_STAGE2_10MS;
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage2_10_ms[ 0 ][ 0 ];
+ nb_cbk_search = PE_NB_CBKS_STAGE2_10MS;
+ corr_thres_Q15 = SKP_RSHIFT( SKP_SMULBB( search_thres2_Q15, search_thres2_Q15 ), 14 );
+ }
+
+ for( k = 0; k < length_d_srch; k++ ) {
+ d = d_srch[ k ];
+ for( j = 0; j < nb_cbk_search; j++ ) {
+ CC[ j ] = 0;
+ for( i = 0; i < nb_subfr; i++ ) {
+ /* Try all codebooks */
+ CC[ j ] = CC[ j ] + (SKP_int32)C[ i ][ d + matrix_ptr( Lag_CB_ptr, i, j, cbk_size )];
+ }
+ }
+ /* Find best codebook */
+ CCmax_new = SKP_int32_MIN;
+ CBimax_new = 0;
+ for( i = 0; i < nb_cbk_search; i++ ) {
+ if( CC[ i ] > CCmax_new ) {
+ CCmax_new = CC[ i ];
+ CBimax_new = i;
+ }
+ }
+
+ /* Bias towards shorter lags */
+ lag_log2_Q7 = SKP_Silk_lin2log( (SKP_int32)d ); /* Q7 */
+ SKP_assert( lag_log2_Q7 == SKP_SAT16( lag_log2_Q7 ) );
+ SKP_assert( nb_subfr * PE_SHORTLAG_BIAS_Q15 == SKP_SAT16( nb_subfr * PE_SHORTLAG_BIAS_Q15 ) );
+ CCmax_new_b = CCmax_new - SKP_RSHIFT( SKP_SMULBB( nb_subfr * PE_SHORTLAG_BIAS_Q15, lag_log2_Q7 ), 7 ); /* Q15 */
+
+ /* Bias towards previous lag */
+ SKP_assert( nb_subfr * PE_PREVLAG_BIAS_Q15 == SKP_SAT16( nb_subfr * PE_PREVLAG_BIAS_Q15 ) );
+ if( prevLag > 0 ) {
+ delta_lag_log2_sqr_Q7 = lag_log2_Q7 - prevLag_log2_Q7;
+ SKP_assert( delta_lag_log2_sqr_Q7 == SKP_SAT16( delta_lag_log2_sqr_Q7 ) );
+ delta_lag_log2_sqr_Q7 = SKP_RSHIFT( SKP_SMULBB( delta_lag_log2_sqr_Q7, delta_lag_log2_sqr_Q7 ), 7 );
+ prev_lag_bias_Q15 = SKP_RSHIFT( SKP_SMULBB( nb_subfr * PE_PREVLAG_BIAS_Q15, ( *LTPCorr_Q15 ) ), 15 ); /* Q15 */
+ prev_lag_bias_Q15 = SKP_DIV32( SKP_MUL( prev_lag_bias_Q15, delta_lag_log2_sqr_Q7 ), delta_lag_log2_sqr_Q7 + ( 1 << 6 ) );
+ CCmax_new_b -= prev_lag_bias_Q15; /* Q15 */
+ }
+
+ if( CCmax_new_b > CCmax_b && CCmax_new > corr_thres_Q15 ) {
+ CCmax_b = CCmax_new_b;
+ CCmax = CCmax_new;
+ lag = d;
+ CBimax = CBimax_new;
+ }
+ }
+
+ if( lag == -1 ) {
+ /* No suitable candidate found */
+ SKP_memset( pitch_out, 0, nb_subfr * sizeof( SKP_int ) );
+ *LTPCorr_Q15 = 0;
+ *lagIndex = 0;
+ *contourIndex = 0;
+ return 1;
+ }
+
+ if( Fs_kHz > 8 ) {
+
+ /******************************************************************************
+ ** Scale input signal down to avoid correlations measures from overflowing
+ *******************************************************************************/
+ /* find scaling as max scaling for each subframe */
+ shift = SKP_FIX_P_Ana_find_scaling( signal, frame_length, sf_length );
+ if( shift > 0 ) {
+ /* Move signal to scratch mem because the input signal should be unchanged */
+ /* Reuse the 32 bit scratch mem vector, use a 16 bit pointer from now */
+ input_signal_ptr = (SKP_int16*)scratch_mem;
+ for( i = 0; i < frame_length; i++ ) {
+ input_signal_ptr[ i ] = SKP_RSHIFT( signal[ i ], shift );
+ }
+ } else {
+ input_signal_ptr = (SKP_int16*)signal;
+ }
+ /*********************************************************************************/
+
+ /* Search in original signal */
+
+ CBimax_old = CBimax;
+ /* Compensate for decimation */
+ SKP_assert( lag == SKP_SAT16( lag ) );
+ if( Fs_kHz == 12 ) {
+ lag = SKP_RSHIFT( SKP_SMULBB( lag, 3 ), 1 );
+ } else if( Fs_kHz == 16 ) {
+ lag = SKP_LSHIFT( lag, 1 );
+ } else {
+ lag = SKP_SMULBB( lag, 3 );
+ }
+
+ lag = SKP_LIMIT_int( lag, min_lag, max_lag );
+ start_lag = SKP_max_int( lag - 2, min_lag );
+ end_lag = SKP_min_int( lag + 2, max_lag );
+ lag_new = lag; /* to avoid undefined lag */
+ CBimax = 0; /* to avoid undefined lag */
+ SKP_assert( SKP_LSHIFT( CCmax, 13 ) >= 0 );
+ *LTPCorr_Q15 = (SKP_int)SKP_Silk_SQRT_APPROX( SKP_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */
+
+ CCmax = SKP_int32_MIN;
+ /* pitch lags according to second stage */
+ for( k = 0; k < nb_subfr; k++ ) {
+ pitch_out[ k ] = lag + 2 * SKP_Silk_CB_lags_stage2[ k ][ CBimax_old ];
+ }
+ /* Calculate the correlations and energies needed in stage 3 */
+ SKP_FIX_P_Ana_calc_corr_st3( crosscorr_st3, input_signal_ptr, start_lag, sf_length, nb_subfr, complexity );
+ SKP_FIX_P_Ana_calc_energy_st3( energies_st3, input_signal_ptr, start_lag, sf_length, nb_subfr, complexity );
+
+ lag_counter = 0;
+ SKP_assert( lag == SKP_SAT16( lag ) );
+ contour_bias = SKP_DIV32_16( PE_FLATCONTOUR_BIAS_Q20, lag );
+
+ /* Setup cbk parameters acording to complexity setting and frame length */
+ if( nb_subfr == PE_MAX_NB_SUBFR ) {
+ nb_cbk_search = (SKP_int)SKP_Silk_nb_cbk_searchs_stage3[ complexity ];
+ cbk_size = PE_NB_CBKS_STAGE3_MAX;
+ cbk_offset = (SKP_int)SKP_Silk_cbk_offsets_stage3[ complexity ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3[ 0 ][ 0 ];
+ } else {
+ nb_cbk_search = PE_NB_CBKS_STAGE3_10MS;
+ cbk_size = PE_NB_CBKS_STAGE3_10MS;
+ cbk_offset = 0;
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
+ }
+ for( d = start_lag; d <= end_lag; d++ ) {
+ for( j = cbk_offset; j < ( cbk_offset + nb_cbk_search ); j++ ) {
+ cross_corr = 0;
+ energy = 0;
+ for( k = 0; k < nb_subfr; k++ ) {
+ SKP_assert( PE_MAX_NB_SUBFR == 4 );
+ energy += SKP_RSHIFT( energies_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */
+ SKP_assert( energy >= 0 );
+ cross_corr += SKP_RSHIFT( crosscorr_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */
+ }
+ if( cross_corr > 0 ) {
+ /* Divide cross_corr / energy and get result in Q15 */
+ lz = SKP_Silk_CLZ32( cross_corr );
+ /* Divide with result in Q13, cross_corr could be larger than energy */
+ lshift = SKP_LIMIT_32( lz - 1, 0, 13 );
+ CCmax_new = SKP_DIV32( SKP_LSHIFT( cross_corr, lshift ), SKP_RSHIFT( energy, 13 - lshift ) + 1 );
+ CCmax_new = SKP_SAT16( CCmax_new );
+ CCmax_new = SKP_SMULWB( cross_corr, CCmax_new );
+ /* Saturate */
+ if( CCmax_new > SKP_RSHIFT( SKP_int32_MAX, 3 ) ) {
+ CCmax_new = SKP_int32_MAX;
+ } else {
+ CCmax_new = SKP_LSHIFT( CCmax_new, 3 );
+ }
+ /* Reduce depending on flatness of contour */
+ diff = j - SKP_RSHIFT( cbk_size, 1 );
+ diff = SKP_MUL( diff, diff );
+ diff = SKP_int16_MAX - SKP_RSHIFT( SKP_MUL( contour_bias, diff ), 5 ); /* Q20 -> Q15 */
+ SKP_assert( diff == SKP_SAT16( diff ) );
+ CCmax_new = SKP_LSHIFT( SKP_SMULWB( CCmax_new, diff ), 1 );
+ } else {
+ CCmax_new = 0;
+ }
+
+ if( CCmax_new > CCmax ) {
+ CCmax = CCmax_new;
+ lag_new = d;
+ CBimax = j;
+ }
+ }
+ lag_counter++;
+ }
+
+ for( k = 0; k < nb_subfr; k++ ) {
+ pitch_out[ k ] = lag_new + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size );
+ }
+ *lagIndex = lag_new - min_lag;
+ *contourIndex = CBimax;
+ } else {
+ /* Save Lags and correlation */
+ CCmax = SKP_max( CCmax, 0 );
+ *LTPCorr_Q15 = (SKP_int)SKP_Silk_SQRT_APPROX( SKP_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */
+ for( k = 0; k < nb_subfr; k++ ) {
+ pitch_out[ k ] = lag + SKP_Silk_CB_lags_stage2[ k ][ CBimax ];
+ }
+ *lagIndex = lag - min_lag_8kHz;
+ *contourIndex = CBimax;
+ }
+ SKP_assert( *lagIndex >= 0 );
+ /* return as voiced */
+ return 0;
+}
+
+/*************************************************************************/
+/* Calculates the correlations used in stage 3 search. In order to cover */
+/* the whole lag codebook for all the searched offset lags (lag +- 2), */
+/*************************************************************************/
+void SKP_FIX_P_Ana_calc_corr_st3(
+ SKP_int32 cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM correlation array */
+ const SKP_int16 signal[], /* I vector to correlate */
+ SKP_int start_lag, /* I lag offset to search around */
+ SKP_int sf_length, /* I length of a 5 ms subframe */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+)
+{
+ const SKP_int16 *target_ptr, *basis_ptr;
+ SKP_int32 cross_corr;
+ SKP_int i, j, k, lag_counter, lag_low, lag_high;
+ SKP_int cbk_offset, nb_cbk_search, delta, idx, cbk_size;
+ SKP_int32 scratch_mem[ SCRATCH_SIZE ];
+ const SKP_int8 *Lag_range_ptr, *Lag_CB_ptr;
+
+ SKP_assert( complexity >= SKP_Silk_PE_MIN_COMPLEX );
+ SKP_assert( complexity <= SKP_Silk_PE_MAX_COMPLEX );
+
+ if( nb_subfr == PE_MAX_NB_SUBFR ){
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3[ 0 ][ 0 ];
+ cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ];
+ nb_cbk_search = SKP_Silk_nb_cbk_searchs_stage3[ complexity ];
+ cbk_size = PE_NB_CBKS_STAGE3_MAX;
+ } else {
+ SKP_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1);
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3_10_ms[ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
+ cbk_offset = 0;
+ nb_cbk_search = PE_NB_CBKS_STAGE3_10MS;
+ cbk_size = PE_NB_CBKS_STAGE3_10MS;
+ }
+
+ target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */
+ for( k = 0; k < nb_subfr; k++ ) {
+ lag_counter = 0;
+
+ /* Calculate the correlations for each subframe */
+ lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 );
+ lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 );
+ for( j = lag_low; j <= lag_high; j++ ) {
+ basis_ptr = target_ptr - ( start_lag + j );
+ cross_corr = SKP_Silk_inner_prod_aligned( (SKP_int16*)target_ptr, (SKP_int16*)basis_ptr, sf_length );
+ SKP_assert( lag_counter < SCRATCH_SIZE );
+ scratch_mem[ lag_counter ] = cross_corr;
+ lag_counter++;
+ }
+
+ delta = matrix_ptr( Lag_range_ptr, k, 0, 2 );
+ for( i = cbk_offset; i < ( cbk_offset + nb_cbk_search ); i++ ) {
+ /* Fill out the 3 dim array that stores the correlations for */
+ /* each code_book vector for each start lag */
+ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta;
+ for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) {
+ SKP_assert( idx + j < SCRATCH_SIZE );
+ SKP_assert( idx + j < lag_counter );
+ cross_corr_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ];
+ }
+ }
+ target_ptr += sf_length;
+ }
+}
+
+/********************************************************************/
+/* Calculate the energies for first two subframes. The energies are */
+/* calculated recursively. */
+/********************************************************************/
+void SKP_FIX_P_Ana_calc_energy_st3(
+ SKP_int32 energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM energy array */
+ const SKP_int16 signal[], /* I vector to calc energy in */
+ SKP_int start_lag, /* I lag offset to search around */
+ SKP_int sf_length, /* I length of one 5 ms subframe */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+)
+{
+ const SKP_int16 *target_ptr, *basis_ptr;
+ SKP_int32 energy;
+ SKP_int k, i, j, lag_counter;
+ SKP_int cbk_offset, nb_cbk_search, delta, idx, cbk_size, lag_diff;
+ SKP_int32 scratch_mem[ SCRATCH_SIZE ];
+ const SKP_int8 *Lag_range_ptr, *Lag_CB_ptr;
+
+ SKP_assert( complexity >= SKP_Silk_PE_MIN_COMPLEX );
+ SKP_assert( complexity <= SKP_Silk_PE_MAX_COMPLEX );
+
+ if( nb_subfr == PE_MAX_NB_SUBFR ){
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3[ 0 ][ 0 ];
+ cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ];
+ nb_cbk_search = SKP_Silk_nb_cbk_searchs_stage3[ complexity ];
+ cbk_size = PE_NB_CBKS_STAGE3_MAX;
+ } else {
+ SKP_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1);
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3_10_ms[ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
+ cbk_offset = 0;
+ nb_cbk_search = PE_NB_CBKS_STAGE3_10MS;
+ cbk_size = PE_NB_CBKS_STAGE3_10MS;
+ }
+ target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ];
+ for( k = 0; k < nb_subfr; k++ ) {
+ lag_counter = 0;
+
+ /* Calculate the energy for first lag */
+ basis_ptr = target_ptr - ( start_lag + matrix_ptr( Lag_range_ptr, k, 0, 2 ) );
+ energy = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length );
+ SKP_assert( energy >= 0 );
+ scratch_mem[ lag_counter ] = energy;
+ lag_counter++;
+
+ lag_diff = ( matrix_ptr( Lag_range_ptr, k, 1, 2 ) - matrix_ptr( Lag_range_ptr, k, 0, 2 ) + 1 );
+ for( i = 1; i < lag_diff; i++ ) {
+ /* remove part outside new window */
+ energy -= SKP_SMULBB( basis_ptr[ sf_length - i ], basis_ptr[ sf_length - i ] );
+ SKP_assert( energy >= 0 );
+
+ /* add part that comes into window */
+ energy = SKP_ADD_SAT32( energy, SKP_SMULBB( basis_ptr[ -i ], basis_ptr[ -i ] ) );
+ SKP_assert( energy >= 0 );
+ SKP_assert( lag_counter < SCRATCH_SIZE );
+ scratch_mem[ lag_counter ] = energy;
+ lag_counter++;
+ }
+
+ delta = matrix_ptr( Lag_range_ptr, k, 0, 2 );
+ for( i = cbk_offset; i < ( cbk_offset + nb_cbk_search ); i++ ) {
+ /* Fill out the 3 dim array that stores the correlations for */
+ /* each code_book vector for each start lag */
+ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta;
+ for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) {
+ SKP_assert( idx + j < SCRATCH_SIZE );
+ SKP_assert( idx + j < lag_counter );
+ energies_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ];
+ SKP_assert( energies_st3[ k ][ i ][ j ] >= 0 );
+ }
+ }
+ target_ptr += sf_length;
+ }
+}
+
+SKP_int32 SKP_FIX_P_Ana_find_scaling(
+ const SKP_int16 *signal,
+ const SKP_int signal_length,
+ const SKP_int sum_sqr_len
+)
+{
+ SKP_int32 nbits, x_max;
+
+ x_max = SKP_Silk_int16_array_maxabs( signal, signal_length );
+
+ if( x_max < SKP_int16_MAX ) {
+ /* Number of bits needed for the sum of the squares */
+ nbits = 32 - SKP_Silk_CLZ32( SKP_SMULBB( x_max, x_max ) );
+ } else {
+ /* Here we don't know if x_max should have been SKP_int16_MAX + 1, so we expect the worst case */
+ nbits = 30;
+ }
+ nbits += 17 - SKP_Silk_CLZ16( sum_sqr_len );
+
+ /* Without a guarantee of saturation, we need to keep the 31st bit free */
+ if( nbits < 31 ) {
+ return 0;
+ } else {
+ return( nbits - 30 );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_pitch_est_defines.h
@@ -1,0 +1,43 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_PE_DEFINES_H
+#define SKP_SILK_PE_DEFINES_H
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_common_pitch_est_defines.h"
+
+/************************************************************/
+/* Definitions For Fix pitch estimator */
+/************************************************************/
+
+#define PE_SHORTLAG_BIAS_Q15 6554 /* 0.2f. for logarithmic weighting */
+#define PE_PREVLAG_BIAS_Q15 6554 /* Prev lag bias */
+#define PE_FLATCONTOUR_BIAS_Q20 52429 /* 0.05f */
+
+#endif
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_pitch_est_tables.c
@@ -1,0 +1,107 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_pitch_est_defines.h"
+
+const SKP_int8 SKP_Silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ PE_NB_CBKS_STAGE2_10MS ] =
+{
+ {0, 1, 0},
+ {0, 0, 1}
+};
+
+const SKP_int8 SKP_Silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ PE_NB_CBKS_STAGE3_10MS ] =
+{
+ {-3,-2,-2,-1,-1, 0, 0, 1, 1, 2, 2,3},
+ { 3, 3, 2, 2, 1, 1, 0, 0,-1,-1,-2,-2}
+};
+
+const SKP_int8 SKP_Silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ] =
+{
+ {-3, 7},
+ {-2, 7}
+};
+
+/********************************************************/
+/* Auto Generated File from generate_pitch_est_tables.m */
+/********************************************************/
+
+const SKP_int8 SKP_Silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ] =
+{
+ {0, 2,-1,-1,-1, 0, 0, 1, 1, 0, 1},
+ {0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0},
+ {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0},
+ {0,-1, 2, 1, 0, 1, 1, 0, 0,-1,-1}
+};
+
+const SKP_int8 SKP_Silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ] =
+{
+ {-9,-7,-6,-5,-5,-4,-4,-3,-3,-2,-2,-2,-1,-1,-1, 0, 0, 0, 1, 1, 0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 5, 6, 8},
+ {-3,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 2, 1, 2, 2, 2, 2, 3},
+ { 3, 3, 2, 2, 2, 2, 1, 2, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,-1, 0, 0,-1,-1,-1,-1,-1,-2,-2,-2},
+ { 9, 8, 6, 5, 6, 5, 4, 4, 3, 3, 2, 2, 2, 1, 0, 1, 1, 0, 0, 0,-1,-1,-1,-2,-2,-2,-3,-3,-4,-4,-5,-5,-6,-7}
+ };
+
+const SKP_int8 SKP_Silk_Lag_range_stage3[ SKP_Silk_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ] =
+{
+ /* Lags to search for low number of stage3 cbks */
+ {
+ {-2,6},
+ {-1,5},
+ {-1,5},
+ {-2,7}
+ },
+ /* Lags to search for middle number of stage3 cbks */
+ {
+ {-4,8},
+ {-1,6},
+ {-1,6},
+ {-4,9}
+ },
+ /* Lags to search for max number of stage3 cbks */
+ {
+ {-9,12},
+ {-3,7},
+ {-2,7},
+ {-7,13}
+ }
+};
+
+const SKP_int8 SKP_Silk_nb_cbk_searchs_stage3[ SKP_Silk_PE_MAX_COMPLEX + 1 ] =
+{
+ PE_NB_CBKS_STAGE3_MIN,
+ PE_NB_CBKS_STAGE3_MID,
+ PE_NB_CBKS_STAGE3_MAX
+};
+
+const SKP_int8 SKP_Silk_cbk_offsets_stage3[ SKP_Silk_PE_MAX_COMPLEX + 1 ] =
+{
+ ((PE_NB_CBKS_STAGE3_MAX - PE_NB_CBKS_STAGE3_MIN) >> 1),
+ ((PE_NB_CBKS_STAGE3_MAX - PE_NB_CBKS_STAGE3_MID) >> 1),
+ 0
+};
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler.c
@@ -1,0 +1,323 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resampler.c *
+ * *
+ * Description: Interface to collection of resamplers *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * All rights reserved. *
+ * */
+
+/* Matrix of resampling methods used:
+ * Fs_out (kHz)
+ * 8 12 16 24 32 44.1 48
+ *
+ * 8 C UF U UF UF UF UF
+ * 12 AF C UF U UF UF UF
+ * 16 D AF C UF U UF UF
+ * Fs_in (kHz) 24 AIF D AF C UF UF U
+ * 32 UF AF D AF C UF UF
+ * 44.1 AMI AMI AMI AMI AMI C UF
+ * 48 DAF DAF AF D AF UF C
+ *
+ * default method: UF
+ *
+ * C -> Copy (no resampling)
+ * D -> Allpass-based 2x downsampling
+ * U -> Allpass-based 2x upsampling
+ * DAF -> Allpass-based 2x downsampling followed by AR2 filter followed by FIR interpolation
+ * UF -> Allpass-based 2x upsampling followed by FIR interpolation
+ * AMI -> ARMA4 filter followed by FIR interpolation
+ * AF -> AR2 filter followed by FIR interpolation
+ *
+ * Input signals sampled above 48 kHz are first downsampled to at most 48 kHz.
+ * Output signals sampled above 48 kHz are upsampled from at most 48 kHz.
+ */
+
+#include "SKP_Silk_resampler_private.h"
+
+/* Greatest common divisor */
+static SKP_int32 gcd(
+ SKP_int32 a,
+ SKP_int32 b
+)
+{
+ SKP_int32 tmp;
+ while( b > 0 ) {
+ tmp = a - b * SKP_DIV32( a, b );
+ a = b;
+ b = tmp;
+ }
+ return a;
+}
+
+/* Initialize/reset the resampler state for a given pair of input/output sampling rates */
+SKP_int SKP_Silk_resampler_init(
+ SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */
+ SKP_int32 Fs_Hz_in, /* I: Input sampling rate (Hz) */
+ SKP_int32 Fs_Hz_out /* I: Output sampling rate (Hz) */
+)
+{
+ SKP_int32 cycleLen, cyclesPerBatch, up2 = 0, down2 = 0;
+
+ /* Clear state */
+ SKP_memset( S, 0, sizeof( SKP_Silk_resampler_state_struct ) );
+
+ /* Input checking */
+#if RESAMPLER_SUPPORT_ABOVE_48KHZ
+ if( Fs_Hz_in < 8000 || Fs_Hz_in > 192000 || Fs_Hz_out < 8000 || Fs_Hz_out > 192000 ) {
+#else
+ if( Fs_Hz_in < 8000 || Fs_Hz_in > 48000 || Fs_Hz_out < 8000 || Fs_Hz_out > 48000 ) {
+#endif
+ SKP_assert( 0 );
+ return -1;
+ }
+
+#if RESAMPLER_SUPPORT_ABOVE_48KHZ
+ /* Determine pre downsampling and post upsampling */
+ if( Fs_Hz_in > 96000 ) {
+ S->nPreDownsamplers = 2;
+ S->down_pre_function = SKP_Silk_resampler_private_down4;
+ } else if( Fs_Hz_in > 48000 ) {
+ S->nPreDownsamplers = 1;
+ S->down_pre_function = SKP_Silk_resampler_down2;
+ } else {
+ S->nPreDownsamplers = 0;
+ S->down_pre_function = NULL;
+ }
+
+ if( Fs_Hz_out > 96000 ) {
+ S->nPostUpsamplers = 2;
+ S->up_post_function = SKP_Silk_resampler_private_up4;
+ } else if( Fs_Hz_out > 48000 ) {
+ S->nPostUpsamplers = 1;
+ S->up_post_function = SKP_Silk_resampler_up2;
+ } else {
+ S->nPostUpsamplers = 0;
+ S->up_post_function = NULL;
+ }
+
+ if( S->nPreDownsamplers + S->nPostUpsamplers > 0 ) {
+ /* Ratio of output/input samples */
+ S->ratio_Q16 = SKP_LSHIFT32( SKP_DIV32( SKP_LSHIFT32( Fs_Hz_out, 13 ), Fs_Hz_in ), 3 );
+ /* Make sure the ratio is rounded up */
+ while( SKP_SMULWW( S->ratio_Q16, Fs_Hz_in ) < Fs_Hz_out ) S->ratio_Q16++;
+
+ /* Batch size is 10 ms */
+ S->batchSizePrePost = SKP_DIV32_16( Fs_Hz_in, 100 );
+
+ /* Convert sampling rate to those after pre-downsampling and before post-upsampling */
+ Fs_Hz_in = SKP_RSHIFT( Fs_Hz_in, S->nPreDownsamplers );
+ Fs_Hz_out = SKP_RSHIFT( Fs_Hz_out, S->nPostUpsamplers );
+ }
+#endif
+
+ /* Number of samples processed per batch */
+ /* First, try 10 ms frames */
+ S->batchSize = SKP_DIV32_16( Fs_Hz_in, 100 );
+ if( ( SKP_MUL( S->batchSize, 100 ) != Fs_Hz_in ) || ( Fs_Hz_in % 100 != 0 ) ) {
+ /* No integer number of input or output samples with 10 ms frames, use greatest common divisor */
+ cycleLen = SKP_DIV32( Fs_Hz_in, gcd( Fs_Hz_in, Fs_Hz_out ) );
+ cyclesPerBatch = SKP_DIV32( RESAMPLER_MAX_BATCH_SIZE_IN, cycleLen );
+ if( cyclesPerBatch == 0 ) {
+ /* cycleLen too big, let's just use the maximum batch size. Some distortion will result. */
+ S->batchSize = RESAMPLER_MAX_BATCH_SIZE_IN;
+ SKP_assert( 0 );
+ } else {
+ S->batchSize = SKP_MUL( cyclesPerBatch, cycleLen );
+ }
+ }
+
+
+ /* Find resampler with the right sampling ratio */
+ if( Fs_Hz_out > Fs_Hz_in ) {
+ /* Upsample */
+ if( Fs_Hz_out == SKP_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 1 */
+ /* Special case: directly use 2x upsampler */
+ S->resampler_function = SKP_Silk_resampler_private_up2_HQ_wrapper;
+ } else {
+ /* Default resampler */
+ S->resampler_function = SKP_Silk_resampler_private_IIR_FIR;
+ up2 = 1;
+ if( Fs_Hz_in > 24000 ) {
+ /* Low-quality all-pass upsampler */
+ S->up2_function = SKP_Silk_resampler_up2;
+ } else {
+ /* High-quality all-pass upsampler */
+ S->up2_function = SKP_Silk_resampler_private_up2_HQ;
+ }
+ }
+ } else if ( Fs_Hz_out < Fs_Hz_in ) {
+ /* Downsample */
+ if( SKP_MUL( Fs_Hz_out, 4 ) == SKP_MUL( Fs_Hz_in, 3 ) ) { /* Fs_out : Fs_in = 3 : 4 */
+ S->FIR_Fracs = 3;
+ S->Coefs = SKP_Silk_Resampler_3_4_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_down_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 3 ) == SKP_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 3 */
+ S->FIR_Fracs = 2;
+ S->Coefs = SKP_Silk_Resampler_2_3_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_down_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 2 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 2 */
+ S->FIR_Fracs = 1;
+ S->Coefs = SKP_Silk_Resampler_1_2_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_down_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 8 ) == SKP_MUL( Fs_Hz_in, 3 ) ) { /* Fs_out : Fs_in = 3 : 8 */
+ S->FIR_Fracs = 3;
+ S->Coefs = SKP_Silk_Resampler_3_8_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_down_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 3 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 3 */
+ S->FIR_Fracs = 1;
+ S->Coefs = SKP_Silk_Resampler_1_3_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_down_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 4 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 4 */
+ S->FIR_Fracs = 1;
+ down2 = 1;
+ S->Coefs = SKP_Silk_Resampler_1_2_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_down_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 6 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 6 */
+ S->FIR_Fracs = 1;
+ down2 = 1;
+ S->Coefs = SKP_Silk_Resampler_1_3_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_down_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 80 ) ) { /* Fs_out : Fs_in = 80 : 441 */
+ S->Coefs = SKP_Silk_Resampler_80_441_ARMA4_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_IIR_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 120 ) ) { /* Fs_out : Fs_in = 120 : 441 */
+ S->Coefs = SKP_Silk_Resampler_120_441_ARMA4_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_IIR_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 160 ) ) { /* Fs_out : Fs_in = 160 : 441 */
+ S->Coefs = SKP_Silk_Resampler_160_441_ARMA4_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_IIR_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 240 ) ) { /* Fs_out : Fs_in = 240 : 441 */
+ S->Coefs = SKP_Silk_Resampler_240_441_ARMA4_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_IIR_FIR;
+ } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 320 ) ) { /* Fs_out : Fs_in = 320 : 441 */
+ S->Coefs = SKP_Silk_Resampler_320_441_ARMA4_COEFS;
+ S->resampler_function = SKP_Silk_resampler_private_IIR_FIR;
+ } else {
+ /* Default resampler */
+ S->resampler_function = SKP_Silk_resampler_private_IIR_FIR;
+ up2 = 1;
+ if( Fs_Hz_in > 24000 ) {
+ /* Low-quality all-pass upsampler */
+ S->up2_function = SKP_Silk_resampler_up2;
+ } else {
+ /* High-quality all-pass upsampler */
+ S->up2_function = SKP_Silk_resampler_private_up2_HQ;
+ }
+ }
+ } else {
+ /* Input and output sampling rates are equal: copy */
+ S->resampler_function = SKP_Silk_resampler_private_copy;
+ }
+
+ S->input2x = up2 | down2;
+
+ /* Ratio of input/output samples */
+ S->invRatio_Q16 = SKP_LSHIFT32( SKP_DIV32( SKP_LSHIFT32( Fs_Hz_in, 14 + up2 - down2 ), Fs_Hz_out ), 2 );
+ /* Make sure the ratio is rounded up */
+ while( SKP_SMULWW( S->invRatio_Q16, SKP_LSHIFT32( Fs_Hz_out, down2 ) ) < SKP_LSHIFT32( Fs_Hz_in, up2 ) ) {
+ S->invRatio_Q16++;
+ }
+
+ S->magic_number = 123456789;
+
+ return 0;
+}
+
+/* Clear the states of all resampling filters, without resetting sampling rate ratio */
+SKP_int SKP_Silk_resampler_clear(
+ SKP_Silk_resampler_state_struct *S /* I/O: Resampler state */
+)
+{
+ /* Clear state */
+ SKP_memset( S->sDown2, 0, sizeof( S->sDown2 ) );
+ SKP_memset( S->sIIR, 0, sizeof( S->sIIR ) );
+ SKP_memset( S->sFIR, 0, sizeof( S->sFIR ) );
+#if RESAMPLER_SUPPORT_ABOVE_48KHZ
+ SKP_memset( S->sDownPre, 0, sizeof( S->sDownPre ) );
+ SKP_memset( S->sUpPost, 0, sizeof( S->sUpPost ) );
+#endif
+ return 0;
+}
+
+/* Resampler: convert from one sampling rate to another */
+SKP_int SKP_Silk_resampler(
+ SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ /* Verify that state was initialized and has not been corrupted */
+ if( S->magic_number != 123456789 ) {
+ SKP_assert( 0 );
+ return -1;
+ }
+
+#if RESAMPLER_SUPPORT_ABOVE_48KHZ
+ if( S->nPreDownsamplers + S->nPostUpsamplers > 0 ) {
+ /* The input and/or output sampling rate is above 48000 Hz */
+ SKP_int32 nSamplesIn, nSamplesOut;
+ SKP_int16 in_buf[ 480 ], out_buf[ 480 ];
+
+ while( inLen > 0 ) {
+ /* Number of input and output samples to process */
+ nSamplesIn = SKP_min( inLen, S->batchSizePrePost );
+ nSamplesOut = SKP_SMULWB( S->ratio_Q16, nSamplesIn );
+
+ SKP_assert( SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) <= 480 );
+ SKP_assert( SKP_RSHIFT32( nSamplesOut, S->nPostUpsamplers ) <= 480 );
+
+ if( S->nPreDownsamplers > 0 ) {
+ S->down_pre_function( S->sDownPre, in_buf, in, nSamplesIn );
+ if( S->nPostUpsamplers > 0 ) {
+ S->resampler_function( S, out_buf, in_buf, SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) );
+ S->up_post_function( S->sUpPost, out, out_buf, SKP_RSHIFT32( nSamplesOut, S->nPostUpsamplers ) );
+ } else {
+ S->resampler_function( S, out, in_buf, SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) );
+ }
+ } else {
+ S->resampler_function( S, out_buf, in, SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) );
+ S->up_post_function( S->sUpPost, out, out_buf, SKP_RSHIFT32( nSamplesOut, S->nPostUpsamplers ) );
+ }
+
+ in += nSamplesIn;
+ out += nSamplesOut;
+ inLen -= nSamplesIn;
+ }
+ } else
+#endif
+ {
+ /* Input and output sampling rate are at most 48000 Hz */
+ S->resampler_function( S, out, in, inLen );
+ }
+
+ return 0;
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_down2.c
@@ -1,0 +1,79 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_down2.c *
+ * *
+ * Downsample by a factor 2, mediocre quality *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_rom.h"
+
+#if (EMBEDDED_ARM<5) && (!defined(__mips__))
+/* Downsample by a factor 2, mediocre quality */
+void SKP_Silk_resampler_down2(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ len ] */
+ const SKP_int16 *in, /* I: Input signal [ floor(len/2) ] */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ SKP_int32 k, len2 = SKP_RSHIFT32( inLen, 1 );
+ SKP_int32 in32, out32, Y, X;
+
+ SKP_assert( SKP_Silk_resampler_down2_0 > 0 );
+ SKP_assert( SKP_Silk_resampler_down2_1 < 0 );
+
+ /* Internal variables and state are in Q10 format */
+ for( k = 0; k < len2; k++ ) {
+ /* Convert to Q10 */
+ in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k ], 10 );
+
+ /* All-pass section for even input sample */
+ Y = SKP_SUB32( in32, S[ 0 ] );
+ X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_down2_1 );
+ out32 = SKP_ADD32( S[ 0 ], X );
+ S[ 0 ] = SKP_ADD32( in32, X );
+
+ /* Convert to Q10 */
+ in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k + 1 ], 10 );
+
+ /* All-pass section for odd input sample, and add to output of previous section */
+ Y = SKP_SUB32( in32, S[ 1 ] );
+ X = SKP_SMULWB( Y, SKP_Silk_resampler_down2_0 );
+ out32 = SKP_ADD32( out32, S[ 1 ] );
+ out32 = SKP_ADD32( out32, X );
+ S[ 1 ] = SKP_ADD32( in32, X );
+
+ /* Add, convert back to int16 and store to output */
+ out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 11 ) );
+ }
+}
+#endif
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_down2_3.c
@@ -1,0 +1,102 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_down2_3.c *
+ * *
+ * Downsample by a factor 2/3, low quality *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+
+#define ORDER_FIR 4
+
+/* Downsample by a factor 2/3, low quality */
+void SKP_Silk_resampler_down2_3(
+ SKP_int32 *S, /* I/O: State vector [ 6 ] */
+ SKP_int16 *out, /* O: Output signal [ floor(2*inLen/3) ] */
+ const SKP_int16 *in, /* I: Input signal [ inLen ] */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ SKP_int32 nSamplesIn, counter, res_Q6;
+ SKP_int32 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR ];
+ SKP_int32 *buf_ptr;
+
+ /* Copy buffered samples to start of buffer */
+ SKP_memcpy( buf, S, ORDER_FIR * sizeof( SKP_int32 ) );
+
+ /* Iterate over blocks of frameSizeIn input samples */
+ while( 1 ) {
+ nSamplesIn = SKP_min( inLen, RESAMPLER_MAX_BATCH_SIZE_IN );
+
+ /* Second-order AR filter (output in Q8) */
+ SKP_Silk_resampler_private_AR2( &S[ ORDER_FIR ], &buf[ ORDER_FIR ], in,
+ SKP_Silk_Resampler_2_3_COEFS_LQ, nSamplesIn );
+
+ /* Interpolate filtered signal */
+ buf_ptr = buf;
+ counter = nSamplesIn;
+ while( counter > 2 ) {
+ /* Inner product */
+ res_Q6 = SKP_SMULWB( buf_ptr[ 0 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 1 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 3 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 2 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 5 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 3 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 4 ] );
+
+ /* Scale down, saturate and store in output array */
+ *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) );
+
+ res_Q6 = SKP_SMULWB( buf_ptr[ 1 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 4 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 2 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 5 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 3 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 3 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 4 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 ] );
+
+ /* Scale down, saturate and store in output array */
+ *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) );
+
+ buf_ptr += 3;
+ counter -= 3;
+ }
+
+ in += nSamplesIn;
+ inLen -= nSamplesIn;
+
+ if( inLen > 0 ) {
+ /* More iterations to do; copy last part of filtered signal to beginning of buffer */
+ SKP_memcpy( buf, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) );
+ } else {
+ break;
+ }
+ }
+
+ /* Copy last part of filtered signal to the state for the next call */
+ SKP_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_down3.c
@@ -1,0 +1,93 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_down3.c *
+ * *
+ * Downsample by a factor 3, low quality *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+
+#define ORDER_FIR 6
+
+/* Downsample by a factor 3, low quality */
+void SKP_Silk_resampler_down3(
+ SKP_int32 *S, /* I/O: State vector [ 8 ] */
+ SKP_int16 *out, /* O: Output signal [ floor(inLen/3) ] */
+ const SKP_int16 *in, /* I: Input signal [ inLen ] */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ SKP_int32 nSamplesIn, counter, res_Q6;
+ SKP_int32 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR ];
+ SKP_int32 *buf_ptr;
+
+ /* Copy buffered samples to start of buffer */
+ SKP_memcpy( buf, S, ORDER_FIR * sizeof( SKP_int32 ) );
+
+ /* Iterate over blocks of frameSizeIn input samples */
+ while( 1 ) {
+ nSamplesIn = SKP_min( inLen, RESAMPLER_MAX_BATCH_SIZE_IN );
+
+ /* Second-order AR filter (output in Q8) */
+ SKP_Silk_resampler_private_AR2( &S[ ORDER_FIR ], &buf[ ORDER_FIR ], in,
+ SKP_Silk_Resampler_1_3_COEFS_LQ, nSamplesIn );
+
+ /* Interpolate filtered signal */
+ buf_ptr = buf;
+ counter = nSamplesIn;
+ while( counter > 2 ) {
+ /* Inner product */
+ res_Q6 = SKP_SMULWB( SKP_ADD32( buf_ptr[ 0 ], buf_ptr[ 5 ] ), SKP_Silk_Resampler_1_3_COEFS_LQ[ 2 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 1 ], buf_ptr[ 4 ] ), SKP_Silk_Resampler_1_3_COEFS_LQ[ 3 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 2 ], buf_ptr[ 3 ] ), SKP_Silk_Resampler_1_3_COEFS_LQ[ 4 ] );
+
+ /* Scale down, saturate and store in output array */
+ *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) );
+
+ buf_ptr += 3;
+ counter -= 3;
+ }
+
+ in += nSamplesIn;
+ inLen -= nSamplesIn;
+
+ if( inLen > 0 ) {
+ /* More iterations to do; copy last part of filtered signal to beginning of buffer */
+ SKP_memcpy( buf, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) );
+ } else {
+ break;
+ }
+ }
+
+ /* Copy last part of filtered signal to the state for the next call */
+ SKP_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private.h
@@ -1,0 +1,130 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resampler_structs.h *
+ * *
+ * Description: Structs for IIR/FIR resamplers *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * All rights reserved. *
+ * *
+ * */
+
+#ifndef SKP_Silk_RESAMPLER_H
+#define SKP_Silk_RESAMPLER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_structs.h"
+#include "SKP_Silk_resampler_rom.h"
+
+/* Number of input samples to process in the inner loop */
+#define RESAMPLER_MAX_BATCH_SIZE_IN 480
+
+/* Description: Hybrid IIR/FIR polyphase implementation of resampling */
+void SKP_Silk_resampler_private_IIR_FIR(
+ void *SS, /* I/O: Resampler state */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+);
+
+/* Description: Hybrid IIR/FIR polyphase implementation of resampling */
+void SKP_Silk_resampler_private_down_FIR(
+ void *SS, /* I/O: Resampler state */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+);
+
+/* Copy */
+void SKP_Silk_resampler_private_copy(
+ void *SS, /* I/O: Resampler state (unused) */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+);
+
+/* Upsample by a factor 2, high quality */
+void SKP_Silk_resampler_private_up2_HQ_wrapper(
+ void *SS, /* I/O: Resampler state (unused) */
+ SKP_int16 *out, /* O: Output signal [ 2 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of input samples */
+);
+
+/* Upsample by a factor 2, high quality */
+void SKP_Silk_resampler_private_up2_HQ(
+ SKP_int32 *S, /* I/O: Resampler state [ 6 ] */
+ SKP_int16 *out, /* O: Output signal [ 2 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of input samples */
+);
+
+/* Upsample 4x, low quality */
+void SKP_Silk_resampler_private_up4(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ 4 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of input samples */
+);
+
+/* Downsample 4x, low quality */
+void SKP_Silk_resampler_private_down4(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ floor(len/2) ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 inLen /* I: Number of input samples */
+);
+
+/* Second order AR filter */
+void SKP_Silk_resampler_private_AR2(
+ SKP_int32 S[], /* I/O: State vector [ 2 ] */
+ SKP_int32 out_Q8[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ const SKP_int16 A_Q14[], /* I: AR coefficients, Q14 */
+ SKP_int32 len /* I: Signal length */
+);
+
+/* Fourth order ARMA filter */
+void SKP_Silk_resampler_private_ARMA4(
+ SKP_int32 S[], /* I/O: State vector [ 4 ] */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ const SKP_int16 Coef[], /* I: ARMA coefficients [ 7 ] */
+ SKP_int32 len /* I: Signal length */
+);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif // SKP_Silk_RESAMPLER_H
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_AR2.c
@@ -1,0 +1,60 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_private_AR2. c *
+ * *
+ * Second order AR filter with single delay elements *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+
+#if (EMBEDDED_ARM<5) && (!defined(__mips__))
+/* Second order AR filter with single delay elements */
+void SKP_Silk_resampler_private_AR2(
+ SKP_int32 S[], /* I/O: State vector [ 2 ] */
+ SKP_int32 out_Q8[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ const SKP_int16 A_Q14[], /* I: AR coefficients, Q14 */
+ SKP_int32 len /* I: Signal length */
+)
+{
+ SKP_int32 k;
+ SKP_int32 out32;
+
+ for( k = 0; k < len; k++ ) {
+ out32 = SKP_ADD_LSHIFT32( S[ 0 ], (SKP_int32)in[ k ], 8 );
+ out_Q8[ k ] = out32;
+ out32 = SKP_LSHIFT( out32, 2 );
+ S[ 0 ] = SKP_SMLAWB( S[ 1 ], out32, A_Q14[ 0 ] );
+ S[ 1 ] = SKP_SMULWB( out32, A_Q14[ 1 ] );
+ }
+}
+#endif
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_ARMA4.c
@@ -1,0 +1,79 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_private_ARMA4.c *
+ * *
+ * Fourth order ARMA filter, applies 64x gain *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+
+/* Fourth order ARMA filter */
+/* Internally operates as two biquad filters in sequence. */
+
+/* Coeffients are stored in a packed format: */
+/* { B1_Q14[1], B2_Q14[1], -A1_Q14[1], -A1_Q14[2], -A2_Q14[1], -A2_Q14[2], gain_Q16 } */
+/* where it is assumed that B*_Q14[0], B*_Q14[2], A*_Q14[0] are all 16384 */
+#if (EMBEDDED_ARM<5) && (!defined(__mips__))
+void SKP_Silk_resampler_private_ARMA4(
+ SKP_int32 S[], /* I/O: State vector [ 4 ] */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ const SKP_int16 Coef[], /* I: ARMA coefficients [ 7 ] */
+ SKP_int32 len /* I: Signal length */
+)
+{
+ SKP_int32 k;
+ SKP_int32 in_Q8, out1_Q8, out2_Q8, X;
+
+ for( k = 0; k < len; k++ ) {
+ in_Q8 = SKP_LSHIFT32( (SKP_int32)in[ k ], 8 );
+
+ /* Outputs of first and second biquad */
+ out1_Q8 = SKP_ADD_LSHIFT32( in_Q8, S[ 0 ], 2 );
+ out2_Q8 = SKP_ADD_LSHIFT32( out1_Q8, S[ 2 ], 2 );
+
+ /* Update states, which are stored in Q6. Coefficients are in Q14 here */
+ X = SKP_SMLAWB( S[ 1 ], in_Q8, Coef[ 0 ] );
+ S[ 0 ] = SKP_SMLAWB( X, out1_Q8, Coef[ 2 ] );
+
+ X = SKP_SMLAWB( S[ 3 ], out1_Q8, Coef[ 1 ] );
+ S[ 2 ] = SKP_SMLAWB( X, out2_Q8, Coef[ 4 ] );
+
+ S[ 1 ] = SKP_SMLAWB( SKP_RSHIFT32( in_Q8, 2 ), out1_Q8, Coef[ 3 ] );
+ S[ 3 ] = SKP_SMLAWB( SKP_RSHIFT32( out1_Q8, 2 ), out2_Q8, Coef[ 5 ] );
+
+ /* Apply gain and store to output. The coefficient is in Q16 */
+ out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT32( SKP_SMLAWB( 128, out2_Q8, Coef[ 6 ] ), 8 ) );
+ }
+}
+#endif
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_IIR_FIR.c
@@ -1,0 +1,105 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resampler_private_IIR_FIR.c *
+ * *
+ * Description: Hybrid IIR/FIR polyphase implementation of resampling *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * All rights reserved. *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+SKP_INLINE SKP_int16 *SKP_Silk_resampler_private_IIR_FIR_INTERPOL(
+ SKP_int16 * out, SKP_int16 * buf, SKP_int32 max_index_Q16 , SKP_int32 index_increment_Q16 ){
+ SKP_int32 index_Q16, res_Q15;
+ SKP_int16 *buf_ptr;
+ SKP_int32 table_index;
+ /* Interpolate upsampled signal and store in output array */
+ for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) {
+ table_index = SKP_SMULWB( index_Q16 & 0xFFFF, 144 );
+ buf_ptr = &buf[ index_Q16 >> 16 ];
+
+ res_Q15 = SKP_SMULBB( buf_ptr[ 0 ], SKP_Silk_resampler_frac_FIR_144[ table_index ][ 0 ] );
+ res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 1 ], SKP_Silk_resampler_frac_FIR_144[ table_index ][ 1 ] );
+ res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 2 ], SKP_Silk_resampler_frac_FIR_144[ table_index ][ 2 ] );
+ res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 3 ], SKP_Silk_resampler_frac_FIR_144[ 143 - table_index ][ 2 ] );
+ res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 4 ], SKP_Silk_resampler_frac_FIR_144[ 143 - table_index ][ 1 ] );
+ res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 5 ], SKP_Silk_resampler_frac_FIR_144[ 143 - table_index ][ 0 ] );
+ *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q15, 15 ) );
+ }
+ return out;
+}
+/* Upsample using a combination of allpass-based 2x upsampling and FIR interpolation */
+void SKP_Silk_resampler_private_IIR_FIR(
+ void *SS, /* I/O: Resampler state */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ SKP_Silk_resampler_state_struct *S = (SKP_Silk_resampler_state_struct *)SS;
+ SKP_int32 nSamplesIn;
+ SKP_int32 max_index_Q16, index_increment_Q16;
+ SKP_int16 buf[ 2 * RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_ORDER_FIR_144 ];
+
+
+ /* Copy buffered samples to start of buffer */
+ SKP_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_144 * sizeof( SKP_int32 ) );
+
+ /* Iterate over blocks of frameSizeIn input samples */
+ index_increment_Q16 = S->invRatio_Q16;
+ while( 1 ) {
+ nSamplesIn = SKP_min( inLen, S->batchSize );
+
+ if( S->input2x == 1 ) {
+ /* Upsample 2x */
+ S->up2_function( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_144 ], in, nSamplesIn );
+ } else {
+ /* Fourth-order ARMA filter */
+ SKP_Silk_resampler_private_ARMA4( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_144 ], in, S->Coefs, nSamplesIn );
+ }
+
+ max_index_Q16 = SKP_LSHIFT32( nSamplesIn, 16 + S->input2x ); /* +1 if 2x upsampling */
+ out = SKP_Silk_resampler_private_IIR_FIR_INTERPOL(out, buf, max_index_Q16, index_increment_Q16);
+ in += nSamplesIn;
+ inLen -= nSamplesIn;
+
+ if( inLen > 0 ) {
+ /* More iterations to do; copy last part of filtered signal to beginning of buffer */
+ SKP_memcpy( buf, &buf[ nSamplesIn << S->input2x ], RESAMPLER_ORDER_FIR_144 * sizeof( SKP_int32 ) );
+ } else {
+ break;
+ }
+ }
+
+ /* Copy last part of filtered signal to the state for the next call */
+ SKP_memcpy( S->sFIR, &buf[nSamplesIn << S->input2x ], RESAMPLER_ORDER_FIR_144 * sizeof( SKP_int32 ) );
+}
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_copy.c
@@ -1,0 +1,49 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resampler_private_copy.c *
+ * *
+ * Description: Copy. *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * All rights reserved. *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+
+/* Copy */
+void SKP_Silk_resampler_private_copy(
+ void *SS, /* I/O: Resampler state (unused) */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ SKP_memcpy( out, in, inLen * sizeof( SKP_int16 ) );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_down4.c
@@ -1,0 +1,77 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_private_down4.c *
+ * *
+ * Downsample by a factor 4 *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+
+/* Downsample by a factor 4. Note: very low quality, only use with input sampling rates above 96 kHz. */
+void SKP_Silk_resampler_private_down4(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ floor(len/2) ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ SKP_int32 k, len4 = SKP_RSHIFT32( inLen, 2 );
+ SKP_int32 in32, out32, Y, X;
+
+ SKP_assert( SKP_Silk_resampler_down2_0 > 0 );
+ SKP_assert( SKP_Silk_resampler_down2_1 < 0 );
+
+ /* Internal variables and state are in Q10 format */
+ for( k = 0; k < len4; k++ ) {
+ /* Add two input samples and convert to Q10 */
+ in32 = SKP_LSHIFT( SKP_ADD32( (SKP_int32)in[ 4 * k ], (SKP_int32)in[ 4 * k + 1 ] ), 9 );
+
+ /* All-pass section for even input sample */
+ Y = SKP_SUB32( in32, S[ 0 ] );
+ X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_down2_1 );
+ out32 = SKP_ADD32( S[ 0 ], X );
+ S[ 0 ] = SKP_ADD32( in32, X );
+
+ /* Add two input samples and convert to Q10 */
+ in32 = SKP_LSHIFT( SKP_ADD32( (SKP_int32)in[ 4 * k + 2 ], (SKP_int32)in[ 4 * k + 3 ] ), 9 );
+
+ /* All-pass section for odd input sample */
+ Y = SKP_SUB32( in32, S[ 1 ] );
+ X = SKP_SMULWB( Y, SKP_Silk_resampler_down2_0 );
+ out32 = SKP_ADD32( out32, S[ 1 ] );
+ out32 = SKP_ADD32( out32, X );
+ S[ 1 ] = SKP_ADD32( in32, X );
+
+ /* Add, convert back to int16 and store to output */
+ out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 11 ) );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_down_FIR.c
@@ -1,0 +1,160 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resampler_private_down_FIR.c *
+ * *
+ * Description: Hybrid IIR/FIR polyphase implementation of resampling *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * All rights reserved. *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+SKP_INLINE SKP_int16 *SKP_Silk_resampler_private_down_FIR_INTERPOL0(
+ SKP_int16 *out, SKP_int32 *buf2, const SKP_int16 *FIR_Coefs, SKP_int32 max_index_Q16, SKP_int32 index_increment_Q16){
+
+ SKP_int32 index_Q16, res_Q6;
+ SKP_int32 *buf_ptr;
+ for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) {
+ /* Integer part gives pointer to buffered input */
+ buf_ptr = buf2 + SKP_RSHIFT( index_Q16, 16 );
+
+ /* Inner product */
+ res_Q6 = SKP_SMULWB( SKP_ADD32( buf_ptr[ 0 ], buf_ptr[ 11 ] ), FIR_Coefs[ 0 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 1 ], buf_ptr[ 10 ] ), FIR_Coefs[ 1 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 2 ], buf_ptr[ 9 ] ), FIR_Coefs[ 2 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 3 ], buf_ptr[ 8 ] ), FIR_Coefs[ 3 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 4 ], buf_ptr[ 7 ] ), FIR_Coefs[ 4 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 5 ], buf_ptr[ 6 ] ), FIR_Coefs[ 5 ] );
+
+ /* Scale down, saturate and store in output array */
+ *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) );
+ }
+ return out;
+}
+
+SKP_INLINE SKP_int16 *SKP_Silk_resampler_private_down_FIR_INTERPOL1(
+ SKP_int16 *out, SKP_int32 *buf2, const SKP_int16 *FIR_Coefs, SKP_int32 max_index_Q16, SKP_int32 index_increment_Q16, SKP_int32 FIR_Fracs){
+
+ SKP_int32 index_Q16, res_Q6;
+ SKP_int32 *buf_ptr;
+ SKP_int32 interpol_ind;
+ const SKP_int16 *interpol_ptr;
+ for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) {
+ /* Integer part gives pointer to buffered input */
+ buf_ptr = buf2 + SKP_RSHIFT( index_Q16, 16 );
+
+ /* Fractional part gives interpolation coefficients */
+ interpol_ind = SKP_SMULWB( index_Q16 & 0xFFFF, FIR_Fracs );
+
+ /* Inner product */
+ interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR / 2 * interpol_ind ];
+ res_Q6 = SKP_SMULWB( buf_ptr[ 0 ], interpol_ptr[ 0 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 1 ], interpol_ptr[ 1 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 2 ], interpol_ptr[ 2 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 3 ], interpol_ptr[ 3 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 4 ], interpol_ptr[ 4 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 5 ], interpol_ptr[ 5 ] );
+ interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR / 2 * ( FIR_Fracs - 1 - interpol_ind ) ];
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 11 ], interpol_ptr[ 0 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 10 ], interpol_ptr[ 1 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 9 ], interpol_ptr[ 2 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 8 ], interpol_ptr[ 3 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 7 ], interpol_ptr[ 4 ] );
+ res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 6 ], interpol_ptr[ 5 ] );
+
+ /* Scale down, saturate and store in output array */
+ *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) );
+ }
+ return out;
+}
+
+
+/* Resample with a 2x downsampler (optional), a 2nd order AR filter followed by FIR interpolation */
+void SKP_Silk_resampler_private_down_FIR(
+ void *SS, /* I/O: Resampler state */
+ SKP_int16 out[], /* O: Output signal */
+ const SKP_int16 in[], /* I: Input signal */
+ SKP_int32 inLen /* I: Number of input samples */
+)
+{
+ SKP_Silk_resampler_state_struct *S = (SKP_Silk_resampler_state_struct *)SS;
+ SKP_int32 nSamplesIn;
+ SKP_int32 max_index_Q16, index_increment_Q16;
+ SKP_int16 buf1[ RESAMPLER_MAX_BATCH_SIZE_IN / 2 ];
+ SKP_int32 buf2[ RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_DOWN_ORDER_FIR ];
+ const SKP_int16 *FIR_Coefs;
+
+ /* Copy buffered samples to start of buffer */
+ SKP_memcpy( buf2, S->sFIR, RESAMPLER_DOWN_ORDER_FIR * sizeof( SKP_int32 ) );
+
+ FIR_Coefs = &S->Coefs[ 2 ];
+
+ /* Iterate over blocks of frameSizeIn input samples */
+ index_increment_Q16 = S->invRatio_Q16;
+ while( 1 ) {
+ nSamplesIn = SKP_min( inLen, S->batchSize );
+
+ if( S->input2x == 1 ) {
+ /* Downsample 2x */
+ SKP_Silk_resampler_down2( S->sDown2, buf1, in, nSamplesIn );
+
+ nSamplesIn = SKP_RSHIFT32( nSamplesIn, 1 );
+
+ /* Second-order AR filter (output in Q8) */
+ SKP_Silk_resampler_private_AR2( S->sIIR, &buf2[ RESAMPLER_DOWN_ORDER_FIR ], buf1, S->Coefs, nSamplesIn );
+ } else {
+ /* Second-order AR filter (output in Q8) */
+ SKP_Silk_resampler_private_AR2( S->sIIR, &buf2[ RESAMPLER_DOWN_ORDER_FIR ], in, S->Coefs, nSamplesIn );
+ }
+
+ max_index_Q16 = SKP_LSHIFT32( nSamplesIn, 16 );
+
+ /* Interpolate filtered signal */
+ if( S->FIR_Fracs == 1 ) {
+ out = SKP_Silk_resampler_private_down_FIR_INTERPOL0(out, buf2, FIR_Coefs, max_index_Q16, index_increment_Q16);
+ } else {
+ out = SKP_Silk_resampler_private_down_FIR_INTERPOL1(out, buf2, FIR_Coefs, max_index_Q16, index_increment_Q16, S->FIR_Fracs);
+ }
+
+ in += nSamplesIn << S->input2x;
+ inLen -= nSamplesIn << S->input2x;
+
+ if( inLen > S->input2x ) {
+ /* More iterations to do; copy last part of filtered signal to beginning of buffer */
+ SKP_memcpy( buf2, &buf2[ nSamplesIn ], RESAMPLER_DOWN_ORDER_FIR * sizeof( SKP_int32 ) );
+ } else {
+ break;
+ }
+ }
+
+ /* Copy last part of filtered signal to the state for the next call */
+ SKP_memcpy( S->sFIR, &buf2[ nSamplesIn ], RESAMPLER_DOWN_ORDER_FIR * sizeof( SKP_int32 ) );
+}
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_up2_HQ.c
@@ -1,0 +1,120 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_private_up2_HQ.c *
+ * *
+ * Upsample by a factor 2, high quality *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_private.h"
+
+/* Upsample by a factor 2, high quality */
+/* Uses 2nd order allpass filters for the 2x upsampling, followed by a */
+/* notch filter just above Nyquist. */
+#if (EMBEDDED_ARM<5) && (!defined(__mips__))
+void SKP_Silk_resampler_private_up2_HQ(
+ SKP_int32 *S, /* I/O: Resampler state [ 6 ] */
+ SKP_int16 *out, /* O: Output signal [ 2 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of INPUT samples */
+)
+{
+ SKP_int32 k;
+ SKP_int32 in32, out32_1, out32_2, Y, X;
+
+ SKP_assert( SKP_Silk_resampler_up2_hq_0[ 0 ] > 0 );
+ SKP_assert( SKP_Silk_resampler_up2_hq_0[ 1 ] < 0 );
+ SKP_assert( SKP_Silk_resampler_up2_hq_1[ 0 ] > 0 );
+ SKP_assert( SKP_Silk_resampler_up2_hq_1[ 1 ] < 0 );
+
+ /* Internal variables and state are in Q10 format */
+ for( k = 0; k < len; k++ ) {
+ /* Convert to Q10 */
+ in32 = SKP_LSHIFT( (SKP_int32)in[ k ], 10 );
+
+ /* First all-pass section for even output sample */
+ Y = SKP_SUB32( in32, S[ 0 ] );
+ X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_hq_0[ 0 ] );
+ out32_1 = SKP_ADD32( S[ 0 ], X );
+ S[ 0 ] = SKP_ADD32( in32, X );
+
+ /* Second all-pass section for even output sample */
+ Y = SKP_SUB32( out32_1, S[ 1 ] );
+ X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_hq_0[ 1 ] );
+ out32_2 = SKP_ADD32( S[ 1 ], X );
+ S[ 1 ] = SKP_ADD32( out32_1, X );
+
+ /* Biquad notch filter */
+ out32_2 = SKP_SMLAWB( out32_2, S[ 5 ], SKP_Silk_resampler_up2_hq_notch[ 2 ] );
+ out32_2 = SKP_SMLAWB( out32_2, S[ 4 ], SKP_Silk_resampler_up2_hq_notch[ 1 ] );
+ out32_1 = SKP_SMLAWB( out32_2, S[ 4 ], SKP_Silk_resampler_up2_hq_notch[ 0 ] );
+ S[ 5 ] = SKP_SUB32( out32_2, S[ 5 ] );
+
+ /* Apply gain in Q15, convert back to int16 and store to output */
+ out[ 2 * k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT32(
+ SKP_SMLAWB( 256, out32_1, SKP_Silk_resampler_up2_hq_notch[ 3 ] ), 9 ) );
+
+ /* First all-pass section for odd output sample */
+ Y = SKP_SUB32( in32, S[ 2 ] );
+ X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_hq_1[ 0 ] );
+ out32_1 = SKP_ADD32( S[ 2 ], X );
+ S[ 2 ] = SKP_ADD32( in32, X );
+
+ /* Second all-pass section for odd output sample */
+ Y = SKP_SUB32( out32_1, S[ 3 ] );
+ X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_hq_1[ 1 ] );
+ out32_2 = SKP_ADD32( S[ 3 ], X );
+ S[ 3 ] = SKP_ADD32( out32_1, X );
+
+ /* Biquad notch filter */
+ out32_2 = SKP_SMLAWB( out32_2, S[ 4 ], SKP_Silk_resampler_up2_hq_notch[ 2 ] );
+ out32_2 = SKP_SMLAWB( out32_2, S[ 5 ], SKP_Silk_resampler_up2_hq_notch[ 1 ] );
+ out32_1 = SKP_SMLAWB( out32_2, S[ 5 ], SKP_Silk_resampler_up2_hq_notch[ 0 ] );
+ S[ 4 ] = SKP_SUB32( out32_2, S[ 4 ] );
+
+ /* Apply gain in Q15, convert back to int16 and store to output */
+ out[ 2 * k + 1 ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT32(
+ SKP_SMLAWB( 256, out32_1, SKP_Silk_resampler_up2_hq_notch[ 3 ] ), 9 ) );
+ }
+}
+#endif
+
+
+void SKP_Silk_resampler_private_up2_HQ_wrapper(
+ void *SS, /* I/O: Resampler state (unused) */
+ SKP_int16 *out, /* O: Output signal [ 2 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of input samples */
+)
+{
+ SKP_Silk_resampler_state_struct *S = (SKP_Silk_resampler_state_struct *)SS;
+ SKP_Silk_resampler_private_up2_HQ( S->sIIR, out, in, len );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_private_up4.c
@@ -1,0 +1,81 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_private_up4.c *
+ * *
+ * Upsample by a factor 4, low quality *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_rom.h"
+
+/* Upsample by a factor 4, Note: very low quality, only use with output sampling rates above 96 kHz. */
+void SKP_Silk_resampler_private_up4(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ 4 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of INPUT samples */
+)
+{
+ SKP_int32 k;
+ SKP_int32 in32, out32, Y, X;
+ SKP_int16 out16;
+
+ SKP_assert( SKP_Silk_resampler_up2_lq_0 > 0 );
+ SKP_assert( SKP_Silk_resampler_up2_lq_1 < 0 );
+
+ /* Internal variables and state are in Q10 format */
+ for( k = 0; k < len; k++ ) {
+ /* Convert to Q10 */
+ in32 = SKP_LSHIFT( (SKP_int32)in[ k ], 10 );
+
+ /* All-pass section for even output sample */
+ Y = SKP_SUB32( in32, S[ 0 ] );
+ X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_lq_0 );
+ out32 = SKP_ADD32( S[ 0 ], X );
+ S[ 0 ] = SKP_ADD32( in32, X );
+
+ /* Convert back to int16 and store to output */
+ out16 = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) );
+ out[ 4 * k ] = out16;
+ out[ 4 * k + 1 ] = out16;
+
+ /* All-pass section for odd output sample */
+ Y = SKP_SUB32( in32, S[ 1 ] );
+ X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_lq_1 );
+ out32 = SKP_ADD32( S[ 1 ], X );
+ S[ 1 ] = SKP_ADD32( in32, X );
+
+ /* Convert back to int16 and store to output */
+ out16 = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) );
+ out[ 4 * k + 2 ] = out16;
+ out[ 4 * k + 3 ] = out16;
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_rom.c
@@ -1,0 +1,276 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resampler_rom.c *
+ * *
+ * Description: Filter coefficients for IIR/FIR polyphase resampling *
+ * Total size: 550 Words (1.1 kB) *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * All rights reserved. *
+ * */
+
+#include "SKP_Silk_resampler_private.h"
+
+
+#if EMBEDDED_ARM
+#define SKP_DWORD_ALIGN __attribute__((aligned(4)))
+#else
+#define SKP_DWORD_ALIGN
+#endif
+
+/* Tables for 2x downsampler. Values above 32767 intentionally wrap to a negative value. */
+const SKP_int16 SKP_Silk_resampler_down2_0 = 9872;
+const SKP_int16 SKP_Silk_resampler_down2_1 = 39809;
+
+/* Tables for 2x upsampler, low quality. Values above 32767 intentionally wrap to a negative value. */
+const SKP_int16 SKP_Silk_resampler_up2_lq_0 = 8102;
+const SKP_int16 SKP_Silk_resampler_up2_lq_1 = 36783;
+
+/* Tables for 2x upsampler, high quality. Values above 32767 intentionally wrap to a negative value. */
+const SKP_int16 SKP_Silk_resampler_up2_hq_0[ 2 ] = { 4280, 33727 };
+const SKP_int16 SKP_Silk_resampler_up2_hq_1[ 2 ] = { 16295, 54015 };
+/* Matlab code for the notch filter coefficients: */
+/* B = [1, 0.12, 1]; A = [1, 0.055, 0.8]; G = 0.87; freqz(G * B, A, 2^14, 16e3); axis([0, 8000, -10, 1]); */
+/* fprintf('\t%6d, %6d, %6d, %6d\n', round(B(2)*2^16), round(-A(2)*2^16), round((1-A(3))*2^16), round(G*2^15)) */
+const SKP_int16 SKP_Silk_resampler_up2_hq_notch[ 4 ] = { 7864, -3604, 13107, 28508 };
+
+
+/* Tables with IIR and FIR coefficients for fractional downsamplers (70 Words) */
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ] = {
+ -18249, -12532,
+ -97, 284, -495, 309, 10268, 20317,
+ -94, 156, -48, -720, 5984, 18278,
+ -45, -4, 237, -847, 2540, 14662,
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR / 2 ] = {
+ -11891, -12486,
+ 20, 211, -657, 688, 8423, 15911,
+ -44, 197, -152, -653, 3855, 13015,
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ] = {
+ 2415, -13101,
+ 158, -295, -400, 1265, 4832, 7968,
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_3_8_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ] = {
+ 13270, -13738,
+ -294, -123, 747, 2043, 3339, 3995,
+ -151, -311, 414, 1583, 2947, 3877,
+ -33, -389, 143, 1141, 2503, 3653,
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ] = {
+ 16643, -14000,
+ -331, 19, 581, 1421, 2290, 2845,
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = {
+ -2797, -6507,
+ 4697, 10739,
+ 1567, 8276,
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_1_3_COEFS_LQ[ 2 + 3 ] = {
+ 16777, -9792,
+ 890, 1614, 2148,
+};
+
+
+/* Tables with coefficients for 4th order ARMA filter (35 Words), in a packed format: */
+/* { B1_Q14[1], B2_Q14[1], -A1_Q14[1], -A1_Q14[2], -A2_Q14[1], -A2_Q14[2], gain_Q16 } */
+/* where it is assumed that B*_Q14[0], B*_Q14[2], A*_Q14[0] are all 16384 */
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_320_441_ARMA4_COEFS[ 7 ] = {
+ 31454, 24746, -9706, -3386, -17911, -13243, 24797
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_240_441_ARMA4_COEFS[ 7 ] = {
+ 28721, 11254, 3189, -2546, -1495, -12618, 11562
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_160_441_ARMA4_COEFS[ 7 ] = {
+ 23492, -6457, 14358, -4856, 14654, -13008, 4456
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_120_441_ARMA4_COEFS[ 7 ] = {
+ 19311, -15569, 19489, -6950, 21441, -13559, 2370
+};
+
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_80_441_ARMA4_COEFS[ 7 ] = {
+ 13248, -23849, 24126, -9486, 26806, -14286, 1065
+};
+
+/* Table with interplation fractions of 1/288 : 2/288 : 287/288 (432 Words) */
+SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_resampler_frac_FIR_144[ 144 ][ RESAMPLER_ORDER_FIR_144 / 2 ] = {
+ { -647, 1884, 30078},
+ { -625, 1736, 30044},
+ { -603, 1591, 30005},
+ { -581, 1448, 29963},
+ { -559, 1308, 29917},
+ { -537, 1169, 29867},
+ { -515, 1032, 29813},
+ { -494, 898, 29755},
+ { -473, 766, 29693},
+ { -452, 636, 29627},
+ { -431, 508, 29558},
+ { -410, 383, 29484},
+ { -390, 260, 29407},
+ { -369, 139, 29327},
+ { -349, 20, 29242},
+ { -330, -97, 29154},
+ { -310, -211, 29062},
+ { -291, -324, 28967},
+ { -271, -434, 28868},
+ { -253, -542, 28765},
+ { -234, -647, 28659},
+ { -215, -751, 28550},
+ { -197, -852, 28436},
+ { -179, -951, 28320},
+ { -162, -1048, 28200},
+ { -144, -1143, 28077},
+ { -127, -1235, 27950},
+ { -110, -1326, 27820},
+ { -94, -1414, 27687},
+ { -77, -1500, 27550},
+ { -61, -1584, 27410},
+ { -45, -1665, 27268},
+ { -30, -1745, 27122},
+ { -15, -1822, 26972},
+ { 0, -1897, 26820},
+ { 15, -1970, 26665},
+ { 29, -2041, 26507},
+ { 44, -2110, 26346},
+ { 57, -2177, 26182},
+ { 71, -2242, 26015},
+ { 84, -2305, 25845},
+ { 97, -2365, 25673},
+ { 110, -2424, 25498},
+ { 122, -2480, 25320},
+ { 134, -2534, 25140},
+ { 146, -2587, 24956},
+ { 157, -2637, 24771},
+ { 168, -2685, 24583},
+ { 179, -2732, 24392},
+ { 190, -2776, 24199},
+ { 200, -2819, 24003},
+ { 210, -2859, 23805},
+ { 220, -2898, 23605},
+ { 229, -2934, 23403},
+ { 238, -2969, 23198},
+ { 247, -3002, 22992},
+ { 255, -3033, 22783},
+ { 263, -3062, 22572},
+ { 271, -3089, 22359},
+ { 279, -3114, 22144},
+ { 286, -3138, 21927},
+ { 293, -3160, 21709},
+ { 300, -3180, 21488},
+ { 306, -3198, 21266},
+ { 312, -3215, 21042},
+ { 318, -3229, 20816},
+ { 323, -3242, 20589},
+ { 328, -3254, 20360},
+ { 333, -3263, 20130},
+ { 338, -3272, 19898},
+ { 342, -3278, 19665},
+ { 346, -3283, 19430},
+ { 350, -3286, 19194},
+ { 353, -3288, 18957},
+ { 356, -3288, 18718},
+ { 359, -3286, 18478},
+ { 362, -3283, 18238},
+ { 364, -3279, 17996},
+ { 366, -3273, 17753},
+ { 368, -3266, 17509},
+ { 369, -3257, 17264},
+ { 371, -3247, 17018},
+ { 372, -3235, 16772},
+ { 372, -3222, 16525},
+ { 373, -3208, 16277},
+ { 373, -3192, 16028},
+ { 373, -3175, 15779},
+ { 373, -3157, 15529},
+ { 372, -3138, 15279},
+ { 371, -3117, 15028},
+ { 370, -3095, 14777},
+ { 369, -3072, 14526},
+ { 368, -3048, 14274},
+ { 366, -3022, 14022},
+ { 364, -2996, 13770},
+ { 362, -2968, 13517},
+ { 359, -2940, 13265},
+ { 357, -2910, 13012},
+ { 354, -2880, 12760},
+ { 351, -2848, 12508},
+ { 348, -2815, 12255},
+ { 344, -2782, 12003},
+ { 341, -2747, 11751},
+ { 337, -2712, 11500},
+ { 333, -2676, 11248},
+ { 328, -2639, 10997},
+ { 324, -2601, 10747},
+ { 320, -2562, 10497},
+ { 315, -2523, 10247},
+ { 310, -2482, 9998},
+ { 305, -2442, 9750},
+ { 300, -2400, 9502},
+ { 294, -2358, 9255},
+ { 289, -2315, 9009},
+ { 283, -2271, 8763},
+ { 277, -2227, 8519},
+ { 271, -2182, 8275},
+ { 265, -2137, 8032},
+ { 259, -2091, 7791},
+ { 252, -2045, 7550},
+ { 246, -1998, 7311},
+ { 239, -1951, 7072},
+ { 232, -1904, 6835},
+ { 226, -1856, 6599},
+ { 219, -1807, 6364},
+ { 212, -1758, 6131},
+ { 204, -1709, 5899},
+ { 197, -1660, 5668},
+ { 190, -1611, 5439},
+ { 183, -1561, 5212},
+ { 175, -1511, 4986},
+ { 168, -1460, 4761},
+ { 160, -1410, 4538},
+ { 152, -1359, 4317},
+ { 145, -1309, 4098},
+ { 137, -1258, 3880},
+ { 129, -1207, 3664},
+ { 121, -1156, 3450},
+ { 113, -1105, 3238},
+ { 105, -1054, 3028},
+ { 97, -1003, 2820},
+ { 89, -952, 2614},
+ { 81, -901, 2409},
+ { 73, -851, 2207},
+};
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_rom.h
@@ -1,0 +1,91 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resample_rom.h *
+ * *
+ * Description: Header file for FIR resampling of *
+ * 32 and 44 kHz input *
+ * *
+ * Copyright 2007 (c), Skype Limited *
+ * All rights reserved. *
+ * *
+ * Date: 070807 *
+ * */
+
+#ifndef _SKP_SILK_FIX_RESAMPLER_ROM_H_
+#define _SKP_SILK_FIX_RESAMPLER_ROM_H_
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_resampler_structs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define RESAMPLER_DOWN_ORDER_FIR 12
+#define RESAMPLER_ORDER_FIR_144 6
+
+
+/* Tables for 2x downsampler. Values above 32767 intentionally wrap to a negative value. */
+extern const SKP_int16 SKP_Silk_resampler_down2_0;
+extern const SKP_int16 SKP_Silk_resampler_down2_1;
+
+/* Tables for 2x upsampler, low quality. Values above 32767 intentionally wrap to a negative value. */
+extern const SKP_int16 SKP_Silk_resampler_up2_lq_0;
+extern const SKP_int16 SKP_Silk_resampler_up2_lq_1;
+
+/* Tables for 2x upsampler, high quality. Values above 32767 intentionally wrap to a negative value. */
+extern const SKP_int16 SKP_Silk_resampler_up2_hq_0[ 2 ];
+extern const SKP_int16 SKP_Silk_resampler_up2_hq_1[ 2 ];
+extern const SKP_int16 SKP_Silk_resampler_up2_hq_notch[ 4 ];
+
+/* Tables with IIR and FIR coefficients for fractional downsamplers */
+extern const SKP_int16 SKP_Silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ];
+extern const SKP_int16 SKP_Silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR / 2 ];
+extern const SKP_int16 SKP_Silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ];
+extern const SKP_int16 SKP_Silk_Resampler_3_8_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ];
+extern const SKP_int16 SKP_Silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ];
+extern const SKP_int16 SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ];
+extern const SKP_int16 SKP_Silk_Resampler_1_3_COEFS_LQ[ 2 + 3 ];
+
+/* Tables with coefficients for 4th order ARMA filter */
+extern const SKP_int16 SKP_Silk_Resampler_320_441_ARMA4_COEFS[ 7 ];
+extern const SKP_int16 SKP_Silk_Resampler_240_441_ARMA4_COEFS[ 7 ];
+extern const SKP_int16 SKP_Silk_Resampler_160_441_ARMA4_COEFS[ 7 ];
+extern const SKP_int16 SKP_Silk_Resampler_120_441_ARMA4_COEFS[ 7 ];
+extern const SKP_int16 SKP_Silk_Resampler_80_441_ARMA4_COEFS[ 7 ];
+
+/* Table with interplation fractions of 1/288 : 2/288 : 287/288 (432 Words) */
+extern const SKP_int16 SKP_Silk_resampler_frac_FIR_144[ 144 ][ RESAMPLER_ORDER_FIR_144 / 2 ];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _SKP_SILK_FIX_RESAMPLER_ROM_H_
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_structs.h
@@ -1,0 +1,79 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * File Name: SKP_Silk_resampler_structs.h *
+ * *
+ * Description: Structs for IIR/FIR resamplers *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * All rights reserved. *
+ * *
+ * */
+
+#ifndef SKP_Silk_RESAMPLER_STRUCTS_H
+#define SKP_Silk_RESAMPLER_STRUCTS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Flag to enable support for input/output sampling rates above 48 kHz. Turn off for embedded devices */
+#define RESAMPLER_SUPPORT_ABOVE_48KHZ 1
+
+#define SKP_Silk_RESAMPLER_MAX_FIR_ORDER 16
+#define SKP_Silk_RESAMPLER_MAX_IIR_ORDER 6
+
+
+typedef struct _SKP_Silk_resampler_state_struct{
+ SKP_int32 sIIR[ SKP_Silk_RESAMPLER_MAX_IIR_ORDER ]; /* this must be the first element of this struct */
+ SKP_int32 sFIR[ SKP_Silk_RESAMPLER_MAX_FIR_ORDER ];
+ SKP_int32 sDown2[ 2 ];
+ void (*resampler_function)( void *, SKP_int16 *, const SKP_int16 *, SKP_int32 );
+ void (*up2_function)( SKP_int32 *, SKP_int16 *, const SKP_int16 *, SKP_int32 );
+ SKP_int32 batchSize;
+ SKP_int32 invRatio_Q16;
+ SKP_int32 FIR_Fracs;
+ SKP_int32 input2x;
+ const SKP_int16 *Coefs;
+#if RESAMPLER_SUPPORT_ABOVE_48KHZ
+ SKP_int32 sDownPre[ 2 ];
+ SKP_int32 sUpPost[ 2 ];
+ void (*down_pre_function)( SKP_int32 *, SKP_int16 *, const SKP_int16 *, SKP_int32 );
+ void (*up_post_function)( SKP_int32 *, SKP_int16 *, const SKP_int16 *, SKP_int32 );
+ SKP_int32 batchSizePrePost;
+ SKP_int32 ratio_Q16;
+ SKP_int32 nPreDownsamplers;
+ SKP_int32 nPostUpsamplers;
+#endif
+ SKP_int32 magic_number;
+} SKP_Silk_resampler_state_struct;
+
+#ifdef __cplusplus
+}
+#endif
+#endif // SKP_Silk_RESAMPLER_STRUCTS_H
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_resampler_up2.c
@@ -1,0 +1,75 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_resampler_up2.c *
+ * *
+ * Upsample by a factor 2, low quality *
+ * *
+ * Copyright 2010 (c), Skype Limited *
+ * */
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_resampler_rom.h"
+
+/* Upsample by a factor 2, low quality */
+void SKP_Silk_resampler_up2(
+ SKP_int32 *S, /* I/O: State vector [ 2 ] */
+ SKP_int16 *out, /* O: Output signal [ 2 * len ] */
+ const SKP_int16 *in, /* I: Input signal [ len ] */
+ SKP_int32 len /* I: Number of input samples */
+)
+{
+ SKP_int32 k;
+ SKP_int32 in32, out32, Y, X;
+
+ SKP_assert( SKP_Silk_resampler_up2_lq_0 > 0 );
+ SKP_assert( SKP_Silk_resampler_up2_lq_1 < 0 );
+ /* Internal variables and state are in Q10 format */
+ for( k = 0; k < len; k++ ) {
+ /* Convert to Q10 */
+ in32 = SKP_LSHIFT( (SKP_int32)in[ k ], 10 );
+
+ /* All-pass section for even output sample */
+ Y = SKP_SUB32( in32, S[ 0 ] );
+ X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_lq_0 );
+ out32 = SKP_ADD32( S[ 0 ], X );
+ S[ 0 ] = SKP_ADD32( in32, X );
+
+ /* Convert back to int16 and store to output */
+ out[ 2 * k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) );
+
+ /* All-pass section for odd output sample */
+ Y = SKP_SUB32( in32, S[ 1 ] );
+ X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_lq_1 );
+ out32 = SKP_ADD32( S[ 1 ], X );
+ S[ 1 ] = SKP_ADD32( in32, X );
+
+ /* Convert back to int16 and store to output */
+ out[ 2 * k + 1 ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_scale_copy_vector16.c
@@ -1,0 +1,45 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Copy and multiply a vector by a constant */
+void SKP_Silk_scale_copy_vector16(
+ SKP_int16 *data_out,
+ const SKP_int16 *data_in,
+ SKP_int32 gain_Q16, /* (I): gain in Q16 */
+ const SKP_int dataSize /* (I): length */
+)
+{
+ SKP_int i;
+ SKP_int32 tmp32;
+
+ for( i = 0; i < dataSize; i++ ) {
+ tmp32 = SKP_SMULWB( gain_Q16, data_in[ i ] );
+ data_out[ i ] = (SKP_int16)SKP_CHECK_FIT16( tmp32 );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_scale_vector.c
@@ -1,0 +1,107 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Multiply a vector by a constant */
+void SKP_Silk_scale_vector16_Q14(
+ SKP_int16 *data1,
+ SKP_int gain_Q14, /* Gain in Q14 */
+ SKP_int dataSize
+)
+{
+ SKP_int i;
+ SKP_int32 gain_Q16;
+
+ SKP_assert( gain_Q14 < 32768 );
+ SKP_assert( gain_Q14 >= -32768 );
+
+ gain_Q16 = SKP_LSHIFT( gain_Q14, 2 );
+ for( i = 0; i < dataSize; i ++ ) {
+ data1[ i ] = SKP_SMULWB( gain_Q16, data1[ i ] );
+ }
+}
+
+/* Multiply a vector by a constant */
+void SKP_Silk_scale_vector32_Q26_lshift_18(
+ SKP_int32 *data1, /* (I/O): Q0/Q18 */
+ SKP_int32 gain_Q26, /* (I): Q26 */
+ SKP_int dataSize /* (I): length */
+)
+{
+ SKP_int i;
+
+ for( i = 0; i < dataSize; i++ ) {
+ data1[ i ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( SKP_SMULL( data1[ i ], gain_Q26 ), 8 ) );// OUTPUT: Q18
+ }
+}
+
+/* Multiply a vector by a constant */
+void SKP_Silk_scale_vector32_16_Q14(
+ SKP_int32 *data1, /* (I/O): Q0/Q0 */
+ SKP_int gain_Q14, /* (I): Q14 */
+ SKP_int dataSize /* (I): length */
+)
+{
+ SKP_int i, gain_Q16;
+
+ if( gain_Q14 < ( SKP_int16_MAX >> 2 ) ) {
+ gain_Q16 = SKP_LSHIFT( gain_Q14, 2 );
+ for( i = 0; i < dataSize; i++ ) {
+ data1[ i ] = SKP_SMULWB( data1[ i ], gain_Q16 );
+ }
+ } else {
+ SKP_assert( gain_Q14 >= SKP_int16_MIN );
+ for( i = 0; i < dataSize; i++ ) {
+ data1[ i ] = SKP_LSHIFT( SKP_SMULWB( data1[ i ], gain_Q14 ), 2 );
+ }
+ }
+}
+
+/* Multiply a vector by a constant, does not saturate output data */
+void SKP_Silk_scale_vector32_Q16(
+ SKP_int32 *data1, /* (I/O): Q0/Q0 */
+ SKP_int32 gain_Q16, /* (I): gain in Q16 ( SKP_int16_MIN <= gain_Q16 <= SKP_int16_MAX + 65536 ) */
+ const SKP_int dataSize /* (I): length */
+)
+{
+ SKP_int i;
+
+ SKP_assert( gain_Q16 <= SKP_int16_MAX + 65536 );
+ SKP_assert( gain_Q16 >= SKP_int16_MIN );
+
+ if( gain_Q16 > SKP_int16_MAX ) {
+ gain_Q16 -= 65536;
+ for( i = 0; i < dataSize; i++ ) {
+ data1[ i ] = SKP_SMLAWB( data1[ i ], data1[ i ], gain_Q16 );
+ }
+ } else {
+ for( i = 0; i < dataSize; i++ ) {
+ data1[ i ] = SKP_SMULWB( data1[ i ], gain_Q16 );
+ }
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_schur.c
@@ -1,0 +1,91 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_schur.c *
+ * *
+ * Calculates the reflection coefficients from the correlation sequence *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * Date: 080103 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Faster than schur64(), but much less accurate. */
+/* uses SMLAWB(), requiring armv5E and higher. */
+void SKP_Silk_schur(
+ SKP_int16 *rc_Q15, /* O: reflection coefficients [order] Q15 */
+ const SKP_int32 *c, /* I: correlations [order+1] */
+ const SKP_int32 order /* I: prediction order */
+)
+{
+ SKP_int k, n, lz;
+ SKP_int32 C[ SKP_Silk_MAX_ORDER_LPC + 1 ][ 2 ];
+ SKP_int32 Ctmp1, Ctmp2, rc_tmp_Q15;
+
+ /* Get number of leading zeros */
+ lz = SKP_Silk_CLZ32( c[ 0 ] );
+
+ /* Copy correlations and adjust level to Q30 */
+ if( lz < 2 ) {
+ /* lz must be 1, so shift one to the right */
+ for( k = 0; k < order + 1; k++ ) {
+ C[ k ][ 0 ] = C[ k ][ 1 ] = SKP_RSHIFT( c[ k ], 1 );
+ }
+ } else if( lz > 2 ) {
+ /* Shift to the left */
+ lz -= 2;
+ for( k = 0; k < order + 1; k++ ) {
+ C[ k ][ 0 ] = C[ k ][ 1 ] = SKP_LSHIFT( c[k], lz );
+ }
+ } else {
+ /* No need to shift */
+ for( k = 0; k < order + 1; k++ ) {
+ C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ];
+ }
+ }
+
+ for( k = 0; k < order; k++ ) {
+
+ /* Get reflection coefficient */
+ rc_tmp_Q15 = -SKP_DIV32_16( C[ k + 1 ][ 0 ], SKP_max_32( SKP_RSHIFT( C[ 0 ][ 1 ], 15 ), 1 ) );
+
+ /* Clip (shouldn't happen for properly conditioned inputs) */
+ rc_tmp_Q15 = SKP_SAT16( rc_tmp_Q15 );
+
+ /* Store */
+ rc_Q15[ k ] = (SKP_int16)rc_tmp_Q15;
+
+ /* Update correlations */
+ for( n = 0; n < order - k; n++ ) {
+ Ctmp1 = C[ n + k + 1 ][ 0 ];
+ Ctmp2 = C[ n ][ 1 ];
+ C[ n + k + 1 ][ 0 ] = SKP_SMLAWB( Ctmp1, SKP_LSHIFT( Ctmp2, 1 ), rc_tmp_Q15 );
+ C[ n ][ 1 ] = SKP_SMLAWB( Ctmp2, SKP_LSHIFT( Ctmp1, 1 ), rc_tmp_Q15 );
+ }
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_schur64.c
@@ -1,0 +1,80 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_schur64.c *
+ * *
+ * Calculates the reflection coefficients from the correlation sequence *
+ * using extra precision *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * Date: 080103 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+
+/* Slower than schur(), but more accurate. */
+/* Uses SMULL(), available on armv4 */
+SKP_int32 SKP_Silk_schur64( /* O: Returns residual energy */
+ SKP_int32 rc_Q16[], /* O: Reflection coefficients [order] Q16 */
+ const SKP_int32 c[], /* I: Correlations [order+1] */
+ SKP_int32 order /* I: Prediction order */
+)
+{
+ SKP_int k, n;
+ SKP_int32 C[ SKP_Silk_MAX_ORDER_LPC + 1 ][ 2 ];
+ SKP_int32 Ctmp1_Q30, Ctmp2_Q30, rc_tmp_Q31;
+
+ /* Check for invalid input */
+ if( c[ 0 ] <= 0 ) {
+ SKP_memset( rc_Q16, 0, order * sizeof( SKP_int32 ) );
+ return 0;
+ }
+
+ for( k = 0; k < order + 1; k++ ) {
+ C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ];
+ }
+
+ for( k = 0; k < order; k++ ) {
+ /* Get reflection coefficient: divide two Q30 values and get result in Q31 */
+ rc_tmp_Q31 = SKP_DIV32_varQ( -C[ k + 1 ][ 0 ], C[ 0 ][ 1 ], 31 );
+
+ /* Save the output */
+ rc_Q16[ k ] = SKP_RSHIFT_ROUND( rc_tmp_Q31, 15 );
+
+ /* Update correlations */
+ for( n = 0; n < order - k; n++ ) {
+ Ctmp1_Q30 = C[ n + k + 1 ][ 0 ];
+ Ctmp2_Q30 = C[ n ][ 1 ];
+
+ /* Multiply and add the highest int32 */
+ C[ n + k + 1 ][ 0 ] = Ctmp1_Q30 + SKP_SMMUL( SKP_LSHIFT( Ctmp2_Q30, 1 ), rc_tmp_Q31 );
+ C[ n ][ 1 ] = Ctmp2_Q30 + SKP_SMMUL( SKP_LSHIFT( Ctmp1_Q30, 1 ), rc_tmp_Q31 );
+ }
+ }
+
+ return( C[ 0 ][ 1 ] );
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_sigm_Q15.c
@@ -1,0 +1,78 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_sigm_Q15.c *
+ * *
+ * Approximate sigmoid function *
+ * *
+ * Copyright 2006 (c), Skype Limited *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+/********************************/
+/* approximate sigmoid function */
+/********************************/
+/* fprintf(1, '%d, ', round(1024 * ([1 ./ (1 + exp(-(1:5))), 1] - 1 ./ (1 + exp(-(0:5)))))); */
+static const SKP_int32 sigm_LUT_slope_Q10[ 6 ] = {
+ 237, 153, 73, 30, 12, 7
+};
+/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp(-(0:5))))); */
+static const SKP_int32 sigm_LUT_pos_Q15[ 6 ] = {
+ 16384, 23955, 28861, 31213, 32178, 32548
+};
+/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp((0:5))))); */
+static const SKP_int32 sigm_LUT_neg_Q15[ 6 ] = {
+ 16384, 8812, 3906, 1554, 589, 219
+};
+
+SKP_int SKP_Silk_sigm_Q15( SKP_int in_Q5 )
+{
+ SKP_int ind;
+
+ if( in_Q5 < 0 ) {
+ /* Negative input */
+ in_Q5 = -in_Q5;
+ if( in_Q5 >= 6 * 32 ) {
+ return 0; /* Clip */
+ } else {
+ /* Linear interpolation of look up table */
+ ind = SKP_RSHIFT( in_Q5, 5 );
+ return( sigm_LUT_neg_Q15[ ind ] - SKP_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) );
+ }
+ } else {
+ /* Positive input */
+ if( in_Q5 >= 6 * 32 ) {
+ return 32767; /* clip */
+ } else {
+ /* Linear interpolation of look up table */
+ ind = SKP_RSHIFT( in_Q5, 5 );
+ return( sigm_LUT_pos_Q15[ ind ] + SKP_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) );
+ }
+ }
+}
+
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_sort.c
@@ -1,0 +1,287 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* Insertion sort (fast for already almost sorted arrays): */
+/* Best case: O(n) for an already sorted array */
+/* Worst case: O(n^2) for an inversely sorted array */
+/* */
+/* Shell short: http://en.wikipedia.org/wiki/Shell_sort */
+
+#include "SKP_Silk_SigProc_FIX.h"
+
+void SKP_Silk_insertion_sort_increasing(
+ SKP_int32 *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+)
+{
+ SKP_int32 value;
+ SKP_int i, j;
+
+ /* Safety checks */
+ SKP_assert( K > 0 );
+ SKP_assert( L > 0 );
+ SKP_assert( L >= K );
+
+ /* Write start indices in index vector */
+ for( i = 0; i < K; i++ ) {
+ index[ i ] = i;
+ }
+
+ /* Sort vector elements by value, increasing order */
+ for( i = 1; i < K; i++ ) {
+ value = a[ i ];
+ for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+
+ /* If less than L values are asked for, check the remaining values, */
+ /* but only spend CPU to ensure that the K first values are correct */
+ for( i = K; i < L; i++ ) {
+ value = a[ i ];
+ if( value < a[ K - 1 ] ) {
+ for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+ }
+}
+
+void SKP_Silk_insertion_sort_decreasing(
+ SKP_int *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+)
+{
+ SKP_int value;
+ SKP_int i, j;
+
+ /* Safety checks */
+ SKP_assert( K > 0 );
+ SKP_assert( L > 0 );
+ SKP_assert( L >= K );
+
+ /* Write start indices in index vector */
+ for( i = 0; i < K; i++ ) {
+ index[ i ] = i;
+ }
+
+ /* Sort vector elements by value, decreasing order */
+ for( i = 1; i < K; i++ ) {
+ value = a[ i ];
+ for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+
+ /* If less than L values are asked for, check the remaining values, */
+ /* but only spend CPU to ensure that the K first values are correct */
+ for( i = K; i < L; i++ ) {
+ value = a[ i ];
+ if( value > a[ K - 1 ] ) {
+ for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+ }
+}
+
+void SKP_Silk_insertion_sort_decreasing_int16(
+ SKP_int16 *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+)
+{
+ SKP_int i, j;
+ SKP_int value;
+
+ /* Safety checks */
+ SKP_assert( K > 0 );
+ SKP_assert( L > 0 );
+ SKP_assert( L >= K );
+
+ /* Write start indices in index vector */
+ for( i = 0; i < K; i++ ) {
+ index[ i ] = i;
+ }
+
+ /* Sort vector elements by value, decreasing order */
+ for( i = 1; i < K; i++ ) {
+ value = a[ i ];
+ for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+
+ /* If less than L values are asked for, check the remaining values, */
+ /* but only spend CPU to ensure that the K first values are correct */
+ for( i = K; i < L; i++ ) {
+ value = a[ i ];
+ if( value > a[ K - 1 ] ) {
+ for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+ }
+}
+
+void SKP_Silk_insertion_sort_increasing_all_values(
+ SKP_int *a, /* I/O: Unsorted / Sorted vector */
+ const SKP_int L /* I: Vector length */
+)
+{
+ SKP_int value;
+ SKP_int i, j;
+
+ /* Safety checks */
+ SKP_assert( L > 0 );
+
+ /* Sort vector elements by value, increasing order */
+ for( i = 1; i < L; i++ ) {
+ value = a[ i ];
+ for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ }
+}
+
+void SKP_Silk_shell_insertion_sort_increasing(
+ SKP_int32 *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+)
+{
+ SKP_int32 value, inc_Q16_tmp;
+ SKP_int i, j, inc, idx;
+
+ /* Safety checks */
+ SKP_assert( K > 0 );
+ SKP_assert( L > 0 );
+ SKP_assert( L >= K );
+
+ /* Calculate initial step size */
+ inc_Q16_tmp = SKP_LSHIFT( (SKP_int32)L, 15 );
+ inc = SKP_RSHIFT( inc_Q16_tmp, 16 );
+
+ /* Write start indices in index vector */
+ for( i = 0; i < K; i++ ) {
+ index[ i ] = i;
+ }
+
+ /* Shell sort first values */
+ while( inc > 0 ) {
+ for( i = inc; i < K; i++ ) {
+ value = a[ i ];
+ idx = index[ i ];
+ for( j = i - inc; ( j >= 0 ) && ( value < a[ j ] ); j -= inc ) {
+ a[ j + inc ] = a[ j ]; /* Shift value */
+ index[ j + inc ] = index[ j ]; /* Shift index */
+ }
+ a[ j + inc ] = value; /* Write value */
+ index[ j + inc ] = idx; /* Write index */
+ }
+ inc_Q16_tmp = SKP_SMULWB( inc_Q16_tmp, 29789 ); // 29789_Q16 = 2.2^(-1)_Q0
+ inc = SKP_RSHIFT_ROUND( inc_Q16_tmp, 16 );
+ }
+
+ /* If less than L values are asked for, check the remaining values, */
+ /* but only spend CPU to ensure that the K first values are correct */
+ /* Insertion sort remaining values */
+ for( i = K; i < L; i++ ) {
+ value = a[ i ];
+ if( value < a[ K - 1 ] ) {
+ for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+ }
+}
+
+void SKP_Silk_shell_sort_increasing_all_values(
+ SKP_int32 *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L /* I: Vector length */
+)
+{
+ SKP_int32 value, inc_Q16_tmp;
+ SKP_int i, j, inc, idx;
+
+ /* Safety checks */
+ SKP_assert( L > 0 );
+
+ /* Calculate initial step size */
+ inc_Q16_tmp = SKP_LSHIFT( (SKP_int32)L, 15 );
+ inc = SKP_RSHIFT( inc_Q16_tmp, 16 );
+
+ /* Write start indices in index vector */
+ for( i = 0; i < L; i++ ) {
+ index[ i ] = i;
+ }
+
+ /* Sort vector elements by value, increasing order */
+ while( inc > 0 ) {
+ for( i = inc; i < L; i++ ) {
+ value = a[ i ];
+ idx = index[ i ];
+ for( j = i - inc; ( j >= 0 ) && ( value < a[ j ] ); j -= inc ) {
+ a[ j + inc ] = a[ j ]; /* Shift value */
+ index[ j + inc ] = index[ j ]; /* Shift index */
+ }
+ a[ j + inc ] = value; /* Write value */
+ index[ j + inc ] = idx; /* Write index */
+ }
+ inc_Q16_tmp = SKP_SMULWB( inc_Q16_tmp, 29789 ); // 29789_Q16 = 2.2^(-1)_Q0
+ inc = SKP_RSHIFT_ROUND( inc_Q16_tmp, 16 );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c
@@ -1,0 +1,100 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_sum_sqr_shift.c *
+ * *
+ * compute number of bits to right shift the sum of squares of a vector *
+ * of int16s to make it fit in an int32 *
+ * *
+ * Copyright 2006-2008 (c), Skype Limited *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+/* Compute number of bits to right shift the sum of squares of a vector */
+/* of int16s to make it fit in an int32 */
+void SKP_Silk_sum_sqr_shift(
+ SKP_int32 *energy, /* O Energy of x, after shifting to the right */
+ SKP_int *shift, /* O Number of bits right shift applied to energy */
+ const SKP_int16 *x, /* I Input vector */
+ SKP_int len /* I Length of input vector */
+)
+{
+ SKP_int i, shft;
+ SKP_int32 in32, nrg_tmp, nrg;
+
+ if( (SKP_int32)( (SKP_int_ptr_size)x & 2 ) != 0 ) {
+ /* Input is not 4-byte aligned */
+ nrg = SKP_SMULBB( x[ 0 ], x[ 0 ] );
+ i = 1;
+ } else {
+ nrg = 0;
+ i = 0;
+ }
+ shft = 0;
+ len--;
+ while( i < len ) {
+ /* Load two values at once */
+ in32 = *( (SKP_int32 *)&x[ i ] );
+ nrg = SKP_SMLABB_ovflw( nrg, in32, in32 );
+ nrg = SKP_SMLATT_ovflw( nrg, in32, in32 );
+ i += 2;
+ if( nrg < 0 ) {
+ /* Scale down */
+ nrg = (SKP_int32)SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 );
+ shft = 2;
+ break;
+ }
+ }
+ for( ; i < len; i += 2 ) {
+ /* Load two values at once */
+ in32 = *( (SKP_int32 *)&x[ i ] );
+ nrg_tmp = SKP_SMULBB( in32, in32 );
+ nrg_tmp = SKP_SMLATT_ovflw( nrg_tmp, in32, in32 );
+ nrg = (SKP_int32)SKP_ADD_RSHIFT_uint( nrg, (SKP_uint32)nrg_tmp, shft );
+ if( nrg < 0 ) {
+ /* Scale down */
+ nrg = (SKP_int32)SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 );
+ shft += 2;
+ }
+ }
+ if( i == len ) {
+ /* One sample left to process */
+ nrg_tmp = SKP_SMULBB( x[ i ], x[ i ] );
+ nrg = (SKP_int32)SKP_ADD_RSHIFT_uint( nrg, nrg_tmp, shft );
+ }
+
+ /* Make sure to have at least one extra leading zero (two leading zeros in total) */
+ if( nrg & 0xC0000000 ) {
+ nrg = SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 );
+ shft += 2;
+ }
+
+ /* Output arguments */
+ *shift = shft;
+ *energy = nrg;
+}
+
--- /dev/null
+++ b/src_SigProc_FIX/SigProc_FIX.vcproj
@@ -1,0 +1,408 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="SigProc_FIX"
+ ProjectGUID="{2769AFC5-8FC2-42E8-803C-528ACBA89C74}"
+ RootNamespace="Silk"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../interface"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_SigProcFLP_Win32_debug.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../interface"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+ GeneratePreprocessedFile="0"
+ RuntimeLibrary="0"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_SigProcFLP_Win32_mt.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_A2NLSF.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_allpass_int.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_ana_filt_bank_1.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_apply_sine_window.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_array_maxabs.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_autocorr.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_biquad.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_biquad_alt.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_burg_modified.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_bwexpander.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_bwexpander_32.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_pitch.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_inner_prod_aligned.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_k2a.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_k2a_Q16.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_lin2log.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_log2lin.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_lowpass_int.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_lowpass_short.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LPC_inv_pred_gain.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LPC_stabilize.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LPC_synthesis_filter.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LPC_synthesis_order16.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LSF_cos_table.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_MA.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF2A.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_stabilize.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_VQ_weights_laroia.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_pitch_analysis_core.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_pitch_est_tables.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_down2.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_down2_3.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_down3.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_AR2.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_ARMA4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_copy.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_down4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_down_FIR.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_IIR_FIR.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_up2_HQ.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_private_up4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_rom.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_up2.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_scale_copy_vector16.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_scale_vector.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_schur.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_schur64.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_sigm_Q15.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_sort.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_sum_sqr_shift.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_common_pitch_est_defines.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_Inlines.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_macros.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_pitch_est_defines.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resample_rom.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_rom.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_resampler_structs.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_SigProc_FIX.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_LPC_inv_pred_gain_FLP.c
@@ -1,0 +1,81 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_LPC_inverse_pred_gain.c *
+ * *
+ * compute inverse of LPC prediction gain, and *
+ * test if LPC coefficients are stable (all poles within unit circle) *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * */
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_SigProc_FLP.h"
+
+#define RC_THRESHOLD 0.9999f
+
+/* compute inverse of LPC prediction gain, and */
+/* test if LPC coefficients are stable (all poles within unit circle) */
+/* this code is based on SKP_Silk_a2k_FLP() */
+SKP_int SKP_Silk_LPC_inverse_pred_gain_FLP( /* O: returns 1 if unstable, otherwise 0 */
+ SKP_float *invGain, /* O: inverse prediction gain, energy domain */
+ const SKP_float *A, /* I: prediction coefficients [order] */
+ SKP_int32 order /* I: prediction order */
+)
+{
+ SKP_int k, n;
+ double rc, rc_mult1, rc_mult2;
+ SKP_float Atmp[ 2 ][ SKP_Silk_MAX_ORDER_LPC ];
+ SKP_float *Aold, *Anew;
+
+ Anew = Atmp[ order & 1 ];
+ SKP_memcpy( Anew, A, order * sizeof(SKP_float) );
+
+ *invGain = 1.0f;
+ for( k = order - 1; k > 0; k-- ) {
+ rc = -Anew[ k ];
+ if (rc > RC_THRESHOLD || rc < -RC_THRESHOLD) {
+ return 1;
+ }
+ rc_mult1 = 1.0f - rc * rc;
+ rc_mult2 = 1.0f / rc_mult1;
+ *invGain *= (SKP_float)rc_mult1;
+ /* swap pointers */
+ Aold = Anew;
+ Anew = Atmp[ k & 1 ];
+ for( n = 0; n < k; n++ ) {
+ Anew[ n ] = (SKP_float)( ( Aold[ n ] - Aold[ k - n - 1 ] * rc ) * rc_mult2 );
+ }
+ }
+ rc = -Anew[ 0 ];
+ if ( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) {
+ return 1;
+ }
+ rc_mult1 = 1.0f - rc * rc;
+ *invGain *= (SKP_float)rc_mult1;
+ return 0;
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_NLSF_VQ_weights_laroia_FLP.c
@@ -1,0 +1,69 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+/*
+R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP
+Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech,
+Signal Processing, pp. 641-644, 1991.
+*/
+
+#define MIN_NDELTA ( 1e-6f / PI )
+
+/* Laroia low complexity NLSF weights */
+void SKP_Silk_NLSF_VQ_weights_laroia_FLP(
+ SKP_float *pXW, /* 0: Pointer to input vector weights [D x 1] */
+ const SKP_float *pX, /* I: Pointer to input vector [D x 1] */
+ const SKP_int D /* I: Input vector dimension */
+)
+{
+ SKP_int k;
+ SKP_float tmp1, tmp2;
+
+ /* Safety checks */
+ SKP_assert( D > 0 );
+ SKP_assert( ( D & 1 ) == 0 );
+
+ /* First value */
+ tmp1 = 1.0f / SKP_max_float( pX[ 0 ], MIN_NDELTA );
+ tmp2 = 1.0f / SKP_max_float( pX[ 1 ] - pX[ 0 ], MIN_NDELTA );
+ pXW[ 0 ] = tmp1 + tmp2;
+
+ /* Main loop */
+ for( k = 1; k < D - 1; k += 2 ) {
+ tmp1 = 1.0f / SKP_max_float( pX[ k + 1 ] - pX[ k ], MIN_NDELTA );
+ pXW[ k ] = tmp1 + tmp2;
+
+ tmp2 = 1.0f / SKP_max_float( pX[ k + 2 ] - pX[ k + 1 ], MIN_NDELTA );
+ pXW[ k + 1 ] = tmp1 + tmp2;
+ }
+
+ /* Last value */
+ tmp1 = 1.0f / SKP_max_float( 1.0f - pX[ D - 1 ], MIN_NDELTA );
+ pXW[ D - 1 ] = tmp1 + tmp2;
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_SigProc_FLP.h
@@ -1,0 +1,249 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef _SKP_SILK_SIGPROC_FLP_H_
+#define _SKP_SILK_SIGPROC_FLP_H_
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include <math.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/********************************************************************/
+/* SIGNAL PROCESSING FUNCTIONS */
+/********************************************************************/
+
+/* first-order allpass filter */
+void SKP_Silk_allpass_int_FLP(
+ const SKP_float *in, /* I: input signal [len] */
+ SKP_float *S, /* I/O: state [1] */
+ SKP_float A, /* I: coefficient (0 <= A < 1) */
+ SKP_float *out, /* O: output signal [len] */
+ const SKP_int32 len /* I: number of samples */
+);
+
+/* downsample by a factor 2, coarser */
+void SKP_Silk_decimate2_coarse_FLP(
+ const SKP_float *in, /* I: signal [2*len] */
+ SKP_float *S, /* I/O: state vector [2] */
+ SKP_float *out, /* O: decimated signal [len] */
+ SKP_float *scratch, /* I: scratch memory [3*len] */
+ const SKP_int32 len /* I: number of OUTPUT samples */
+);
+
+/* downsample by a factor 2, coarsest */
+void SKP_Silk_decimate2_coarsest_FLP(
+ const SKP_float *in, /* I: signal [2*len] */
+ SKP_float *S, /* I/O: state vector [2] */
+ SKP_float *out, /* O: decimated signal [len] */
+ SKP_float *scratch, /* I: scratch memory [3*len] */
+ const SKP_int32 len /* I: number of OUTPUT samples */
+);
+
+/* Chirp (bw expand) LP AR filter */
+void SKP_Silk_bwexpander_FLP(
+ SKP_float *ar, /* io AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* i length of ar */
+ const SKP_float chirp /* i chirp factor (typically in range (0..1) ) */
+);
+
+/* compute inverse of LPC prediction gain, and */
+/* test if LPC coefficients are stable (all poles within unit circle) */
+/* this code is based on SKP_Silk_FLP_a2k() */
+SKP_int SKP_Silk_LPC_inverse_pred_gain_FLP( /* O: returns 1 if unstable, otherwise 0 */
+ SKP_float *invGain, /* O: inverse prediction gain, energy domain */
+ const SKP_float *A, /* I: prediction coefficients [order] */
+ SKP_int32 order /* I: prediction order */
+);
+
+void SKP_Silk_schur_FLP(
+ SKP_float refl_coef[], /* O reflection coefficients (length order) */
+ const SKP_float auto_corr[], /* I autotcorreation sequence (length order+1) */
+ SKP_int order /* I order */
+);
+
+void SKP_Silk_k2a_FLP(
+ SKP_float *A, /* O: prediction coefficients [order] */
+ const SKP_float *rc, /* I: reflection coefficients [order] */
+ SKP_int32 order /* I: prediction order */
+);
+
+/* Solve the normal equations using the Levinson-Durbin recursion */
+SKP_float SKP_Silk_levinsondurbin_FLP( /* O prediction error energy */
+ SKP_float A[], /* O prediction coefficients [order] */
+ const SKP_float corr[], /* I input auto-correlations [order + 1] */
+ const SKP_int order /* I prediction order */
+);
+
+/* compute autocorrelation */
+void SKP_Silk_autocorrelation_FLP(
+ SKP_float *results, /* o result (length correlationCount) */
+ const SKP_float *inputData, /* i input data to correlate */
+ SKP_int inputDataSize, /* i length of input */
+ SKP_int correlationCount /* i number of correlation taps to compute */
+);
+
+/* Pitch estimator */
+#define SigProc_PE_MIN_COMPLEX 0
+#define SigProc_PE_MID_COMPLEX 1
+#define SigProc_PE_MAX_COMPLEX 2
+
+SKP_int SKP_Silk_pitch_analysis_core_FLP( /* O voicing estimate: 0 voiced, 1 unvoiced */
+ const SKP_float *signal, /* I signal of length PE_FRAME_LENGTH_MS*Fs_kHz */
+ SKP_int *pitch_out, /* O 4 pitch lag values */
+ SKP_int *lagIndex, /* O lag Index */
+ SKP_int *contourIndex, /* O pitch contour Index */
+ SKP_float *LTPCorr, /* I/O normalized correlation; input: value from previous frame */
+ SKP_int prevLag, /* I last lag of previous frame; set to zero is unvoiced */
+ const SKP_float search_thres1, /* I first stage threshold for lag candidates 0 - 1 */
+ const SKP_float search_thres2, /* I final threshold for lag candidates 0 - 1 */
+ const SKP_int Fs_kHz, /* I sample frequency (kHz) */
+ const SKP_int complexity, /* I Complexity setting, 0-2, where 2 is highest */
+ const SKP_int nb_subfr /* I number of 5 ms subframes */
+);
+
+#define PI (3.1415926536f)
+
+void SKP_Silk_insertion_sort_decreasing_FLP(
+ SKP_float *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+);
+
+void SKP_Silk_insertion_sort_increasing_FLP(
+ SKP_float *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+);
+
+/* Laroia low complexity NLSF weights */
+void SKP_Silk_NLSF_VQ_weights_laroia_FLP(
+ SKP_float *pXW, /* 0: Pointer to input vector weights [D x 1] */
+ const SKP_float *pX, /* I: Pointer to input vector [D x 1] */
+ const SKP_int D /* I: Input vector dimension */
+);
+
+/* Compute reflection coefficients from input signal */
+SKP_float SKP_Silk_burg_modified_FLP( /* O returns residual energy */
+ SKP_float A[], /* O prediction coefficients (length order) */
+ const SKP_float x[], /* I input signal, length: nb_subfr*(D+L_sub) */
+ const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */
+ const SKP_int nb_subfr, /* I number of subframes stacked in x */
+ const SKP_float WhiteNoiseFrac, /* I fraction added to zero-lag autocorrelation */
+ const SKP_int D /* I order */
+);
+
+/* multiply a vector by a constant */
+void SKP_Silk_scale_vector_FLP(
+ SKP_float *data1,
+ SKP_float gain,
+ SKP_int dataSize
+);
+
+/* copy and multiply a vector by a constant */
+void SKP_Silk_scale_copy_vector_FLP(
+ SKP_float *data_out,
+ const SKP_float *data_in,
+ SKP_float gain,
+ SKP_int dataSize
+);
+
+/* inner product of two SKP_float arrays, with result as double */
+double SKP_Silk_inner_product_FLP(
+ const SKP_float *data1,
+ const SKP_float *data2,
+ SKP_int dataSize
+);
+
+/* sum of squares of a SKP_float array, with result as double */
+double SKP_Silk_energy_FLP(
+ const SKP_float *data,
+ SKP_int dataSize
+);
+
+/********************************************************************/
+/* MACROS */
+/********************************************************************/
+
+#define SKP_min_float(a, b) (((a) < (b)) ? (a) : (b))
+#define SKP_max_float(a, b) (((a) > (b)) ? (a) : (b))
+#define SKP_abs_float(a) ((SKP_float)fabs(a))
+
+#define SKP_LIMIT_float( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
+ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))))
+
+/* sigmoid function */
+SKP_INLINE SKP_float SKP_sigmoid(SKP_float x)
+{
+ return (SKP_float)(1.0 / (1.0 + exp(-x)));
+}
+
+/* floating-point to integer conversion (rounding) */
+SKP_INLINE void SKP_float2short_array(
+ SKP_int16 *out,
+ const SKP_float *in,
+ SKP_int32 length
+)
+{
+ SKP_int32 k;
+ for (k = length-1; k >= 0; k--) {
+ double x = in[k];
+ out[k] = (SKP_int16)SKP_SAT16( ( x > 0 ) ? x + 0.5 : x - 0.5 );
+ }
+}
+
+/* floating-point to integer conversion (rounding) */
+SKP_INLINE SKP_int32 SKP_float2int(double x)
+{
+ return (SKP_int32)( ( x > 0 ) ? x + 0.5 : x - 0.5 );
+}
+
+/* integer to floating-point conversion */
+SKP_INLINE void SKP_short2float_array(
+ SKP_float *out,
+ const SKP_int16 *in,
+ SKP_int32 length
+)
+{
+ SKP_int32 k;
+ for (k = length-1; k >= 0; k--) {
+ out[k] = (SKP_float)in[k];
+ }
+}
+
+#define SKP_round(x) (SKP_float)((x)>=0 ? (SKP_int64)((x)+0.5) : (SKP_int64)((x)-0.5))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_allpass_int_FLP.c
@@ -1,0 +1,68 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_allpass_int.c *
+ * *
+ * First-order allpass filter with * *
+ * transfer function: *
+ * *
+ * A + Z^(-1) *
+ * H(z) = ------------ *
+ * 1 + A*Z^(-1) *
+ * *
+ * Implemented using minimum multiplier filter design. *
+ * *
+ * Reference: http://www.univ.trieste.it/~ramponi/teaching/ *
+ * DSP/materiale/Ch6(2).pdf *
+ * *
+ * Copyright 2007 (c), Skype Limited *
+ * Date: 070525 *
+ * */
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* first-order allpass filter */
+void SKP_Silk_allpass_int_FLP(
+ const SKP_float *in, /* I: input signal [len] */
+ SKP_float *S, /* I/O: state [1] */
+ SKP_float A, /* I: coefficient (0 <= A < 1) */
+ SKP_float *out, /* O: output signal [len] */
+ const SKP_int32 len /* I: number of samples */
+)
+{
+ SKP_float Y2, X2, S0;
+ SKP_int32 k;
+
+ S0 = S[ 0 ];
+ for ( k = len-1; k >= 0; k-- ) {
+ Y2 = *in - S0;
+ X2 = Y2 * A;
+ (*out++) = S0 + X2;
+ S0 = (*in++) + X2;
+ }
+ S[ 0 ] = S0;
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_autocorrelation_FLP.c
@@ -1,0 +1,48 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* compute autocorrelation */
+void SKP_Silk_autocorrelation_FLP(
+ SKP_float *results, /* O result (length correlationCount) */
+ const SKP_float *inputData, /* I input data to correlate */
+ SKP_int inputDataSize, /* I length of input */
+ SKP_int correlationCount /* I number of correlation taps to compute */
+)
+{
+ SKP_int i;
+
+ if ( correlationCount > inputDataSize ) {
+ correlationCount = inputDataSize;
+ }
+
+ for( i = 0; i < correlationCount; i++ ) {
+ results[ i ] = (SKP_float)SKP_Silk_inner_product_FLP( inputData, inputData + i, inputDataSize - i );
+ }
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_burg_modified_FLP.c
@@ -1,0 +1,154 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_burg_modified.c *
+ * *
+ * Calculates the reflection coefficients from the input vector *
+ * Input vector contains nb_subfr sub vectors of length L_sub + D *
+ * *
+ * Copyright 2009 (c), Skype Limited *
+ * Date: 091130 *
+ */
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+#define MAX_FRAME_SIZE 544 // subfr_length * nb_subfr = ( 0.005 * 24000 + 16 ) * 4 = 544
+#define MAX_NB_SUBFR 4
+
+/* Compute reflection coefficients from input signal */
+SKP_float SKP_Silk_burg_modified_FLP( /* O returns residual energy */
+ SKP_float A[], /* O prediction coefficients (length order) */
+ const SKP_float x[], /* I input signal, length: nb_subfr*(D+L_sub) */
+ const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */
+ const SKP_int nb_subfr, /* I number of subframes stacked in x */
+ const SKP_float WhiteNoiseFrac, /* I fraction added to zero-lag autocorrelation */
+ const SKP_int D /* I order */
+)
+{
+ SKP_int k, n, s;
+ double C0, num, nrg_f, nrg_b, rc, Atmp, tmp1, tmp2;
+ const SKP_float *x_ptr;
+ double C_first_row[ SKP_Silk_MAX_ORDER_LPC ], C_last_row[ SKP_Silk_MAX_ORDER_LPC ];
+ double CAf[ SKP_Silk_MAX_ORDER_LPC + 1 ], CAb[ SKP_Silk_MAX_ORDER_LPC + 1 ];
+ double Af[ SKP_Silk_MAX_ORDER_LPC ];
+
+ SKP_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE );
+ SKP_assert( nb_subfr <= MAX_NB_SUBFR );
+
+ /* Compute autocorrelations, added over subframes */
+ C0 = SKP_Silk_energy_FLP( x, nb_subfr * subfr_length );
+ SKP_memset( C_first_row, 0, SKP_Silk_MAX_ORDER_LPC * sizeof( double ) );
+ for( s = 0; s < nb_subfr; s++ ) {
+ x_ptr = x + s * subfr_length;
+ for( n = 1; n < D + 1; n++ ) {
+ C_first_row[ n - 1 ] += SKP_Silk_inner_product_FLP( x_ptr, x_ptr + n, subfr_length - n );
+ }
+ }
+ SKP_memcpy( C_last_row, C_first_row, SKP_Silk_MAX_ORDER_LPC * sizeof( double ) );
+
+ /* Initialize */
+ CAb[ 0 ] = CAf[ 0 ] = C0 + WhiteNoiseFrac * C0 + 1e-9f;
+
+ for( n = 0; n < D; n++ ) {
+ /* Update first row of correlation matrix (without first element) */
+ /* Update last row of correlation matrix (without last element, stored in reversed order) */
+ /* Update C * Af */
+ /* Update C * flipud(Af) (stored in reversed order) */
+ for( s = 0; s < nb_subfr; s++ ) {
+ x_ptr = x + s * subfr_length;
+ tmp1 = x_ptr[ n ];
+ tmp2 = x_ptr[ subfr_length - n - 1 ];
+ for( k = 0; k < n; k++ ) {
+ C_first_row[ k ] -= x_ptr[ n ] * x_ptr[ n - k - 1 ];
+ C_last_row[ k ] -= x_ptr[ subfr_length - n - 1 ] * x_ptr[ subfr_length - n + k ];
+ Atmp = Af[ k ];
+ tmp1 += x_ptr[ n - k - 1 ] * Atmp;
+ tmp2 += x_ptr[ subfr_length - n + k ] * Atmp;
+ }
+ for( k = 0; k <= n; k++ ) {
+ CAf[ k ] -= tmp1 * x_ptr[ n - k ];
+ CAb[ k ] -= tmp2 * x_ptr[ subfr_length - n + k - 1 ];
+ }
+ }
+ tmp1 = C_first_row[ n ];
+ tmp2 = C_last_row[ n ];
+ for( k = 0; k < n; k++ ) {
+ Atmp = Af[ k ];
+ tmp1 += C_last_row[ n - k - 1 ] * Atmp;
+ tmp2 += C_first_row[ n - k - 1 ] * Atmp;
+ }
+ CAf[ n + 1 ] = tmp1;
+ CAb[ n + 1 ] = tmp2;
+
+ /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */
+ num = CAb[ n + 1 ];
+ nrg_b = CAb[ 0 ];
+ nrg_f = CAf[ 0 ];
+ for( k = 0; k < n; k++ ) {
+ Atmp = Af[ k ];
+ num += CAb[ n - k ] * Atmp;
+ nrg_b += CAb[ k + 1 ] * Atmp;
+ nrg_f += CAf[ k + 1 ] * Atmp;
+ }
+ SKP_assert( nrg_f > 0.0 );
+ SKP_assert( nrg_b > 0.0 );
+
+ /* Calculate the next order reflection (parcor) coefficient */
+ rc = -2.0 * num / ( nrg_f + nrg_b );
+ SKP_assert( rc > -1.0 && rc < 1.0 );
+
+ /* Update the AR coefficients */
+ for( k = 0; k < (n + 1) >> 1; k++ ) {
+ tmp1 = Af[ k ];
+ tmp2 = Af[ n - k - 1 ];
+ Af[ k ] = tmp1 + rc * tmp2;
+ Af[ n - k - 1 ] = tmp2 + rc * tmp1;
+ }
+ Af[ n ] = rc;
+
+ /* Update C * Af and C * Ab */
+ for( k = 0; k <= n + 1; k++ ) {
+ tmp1 = CAf[ k ];
+ CAf[ k ] += rc * CAb[ n - k + 1 ];
+ CAb[ n - k + 1 ] += rc * tmp1;
+ }
+ }
+
+ /* Return residual energy */
+ nrg_f = CAf[ 0 ];
+ tmp1 = 1.0;
+ for( k = 0; k < D; k++ ) {
+ Atmp = Af[ k ];
+ nrg_f += CAf[ k + 1 ] * Atmp;
+ tmp1 += Atmp * Atmp;
+ A[ k ] = (SKP_float)(-Atmp);
+ }
+ nrg_f -= WhiteNoiseFrac * C0 * tmp1;
+
+ return (SKP_float)nrg_f;
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_bwexpander_FLP.c
@@ -1,0 +1,47 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+
+/* Chirp (bw expand) LP AR filter */
+void SKP_Silk_bwexpander_FLP(
+ SKP_float *ar, /* I/O AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* I length of ar */
+ const SKP_float chirp /* I chirp factor (typically in range (0..1) ) */
+)
+{
+ SKP_int i;
+ SKP_float cfac = chirp;
+
+ for( i = 0; i < d - 1; i++ ) {
+ ar[ i ] *= cfac;
+ cfac *= chirp;
+ }
+ ar[ d - 1 ] *= cfac;
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_decimate2_coarse_FLP.c
@@ -1,0 +1,72 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_decimate2_coarse.c *
+ * *
+ * downsample by a factor 2, coarser *
+ * *
+ * Copyright 2006 (c), Camino Networks *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* coefficients for coarser 2-fold resampling */
+static SKP_float A20c_FLP[ 2 ] = {0.064666748046875f, 0.508514404296875f};
+static SKP_float A21c_FLP[ 2 ] = {0.245666503906250f, 0.819732666015625f};
+
+/* downsample by a factor 2, coarser */
+void SKP_Silk_decimate2_coarse_FLP(
+ const SKP_float *in, /* I: 16 kHz signal [2*len] */
+ SKP_float *S, /* I/O: state vector [4] */
+ SKP_float *out, /* O: 8 kHz signal [len] */
+ SKP_float *scratch, /* I: scratch memory [3*len] */
+ const SKP_int32 len /* I: number of OUTPUT samples */
+)
+{
+ SKP_int32 k;
+
+ /* de-interleave allpass inputs */
+ for ( k = 0; k < len; k++) {
+ scratch[ k ] = in[ 2 * k ];
+ scratch[ k + len ] = in[ 2 * k + 1 ];
+ }
+
+ /* allpass filters */
+ SKP_Silk_allpass_int_FLP( scratch, S + 0, A21c_FLP[ 0 ], scratch + 2 * len, len );
+ SKP_Silk_allpass_int_FLP( scratch + 2 * len, S + 1, A21c_FLP[ 1 ], scratch, len );
+
+ SKP_Silk_allpass_int_FLP( scratch + len, S + 2, A20c_FLP[ 0 ], scratch + 2 * len, len );
+ SKP_Silk_allpass_int_FLP( scratch + 2 * len, S + 3, A20c_FLP[ 1 ], scratch + len, len );
+
+ /* add two allpass outputs */
+ for ( k = 0; k < len; k++ ) {
+ out[ k ] = 0.5f * ( scratch[ k ] + scratch[ k + len ] );
+ }
+}
+
+
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_decimate2_coarsest_FLP.c
@@ -1,0 +1,70 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_decimate2_coarsest.c *
+ * *
+ * downsample by a factor 2, coarsest *
+ * *
+ * Copyright 2006 (c), Camino Networks *
+ * Date: 060221 *
+ * */
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* coefficients for coarsest 2-fold resampling */
+/* note that these differ from the interpolator with the same filter orders! */
+static float A20cst_FLP[ 1 ] = {0.289001464843750f};
+static float A21cst_FLP[ 1 ] = {0.780487060546875f};
+
+/* downsample by a factor 2, coarsest */
+void SKP_Silk_decimate2_coarsest_FLP(
+ const SKP_float *in, /* I: 16 kHz signal [2*len] */
+ SKP_float *S, /* I/O: state vector [2] */
+ SKP_float *out, /* O: 8 kHz signal [len] */
+ SKP_float *scratch, /* I: scratch memory [3*len] */
+ const SKP_int32 len /* I: number of OUTPUT samples */
+)
+{
+ SKP_int32 k;
+
+ /* de-interleave allpass inputs */
+ for ( k = 0; k < len; k++ ) {
+ scratch[ k ] = in[ 2 * k + 0 ];
+ scratch[ k + len ] = in[ 2 * k + 1 ];
+ }
+
+ /* allpass filters */
+ SKP_Silk_allpass_int_FLP( scratch, S + 0, A21cst_FLP[ 0 ], scratch + 2 * len, len );
+ SKP_Silk_allpass_int_FLP( scratch + len, S + 1, A20cst_FLP[ 0 ], scratch, len );
+
+ /* add two allpass outputs */
+ for ( k = 0; k < len; k++ ) {
+ out[ k ] = 0.5f * ( scratch[ k ] + scratch[ k + 2 * len ] );
+ }
+}
+
+
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_energy_FLP.c
@@ -1,0 +1,56 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* sum of squares of a SKP_float array, with result as double */
+double SKP_Silk_energy_FLP(
+ const SKP_float *data,
+ SKP_int dataSize
+)
+{
+ SKP_int i, dataSize4;
+ double result;
+
+ /* 4x unrolled loop */
+ result = 0.0f;
+ dataSize4 = dataSize & 0xFFFC;
+ for( i = 0; i < dataSize4; i += 4 ) {
+ result += data[ i + 0 ] * data[ i + 0 ] +
+ data[ i + 1 ] * data[ i + 1 ] +
+ data[ i + 2 ] * data[ i + 2 ] +
+ data[ i + 3 ] * data[ i + 3 ];
+ }
+
+ /* add any remaining products */
+ for( ; i < dataSize; i++ ) {
+ result += data[ i ] * data[ i ];
+ }
+
+ SKP_assert( result >= 0.0 );
+ return result;
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_inner_product_FLP.c
@@ -1,0 +1,56 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* inner product of two SKP_float arrays, with result as double */
+double SKP_Silk_inner_product_FLP( /* O result */
+ const SKP_float *data1, /* I vector 1 */
+ const SKP_float *data2, /* I vector 2 */
+ SKP_int dataSize /* I length of vectors */
+)
+{
+ SKP_int i, dataSize4;
+ double result;
+
+ /* 4x unrolled loop */
+ result = 0.0f;
+ dataSize4 = dataSize & 0xFFFC;
+ for( i = 0; i < dataSize4; i += 4 ) {
+ result += data1[ i + 0 ] * data2[ i + 0 ] +
+ data1[ i + 1 ] * data2[ i + 1 ] +
+ data1[ i + 2 ] * data2[ i + 2 ] +
+ data1[ i + 3 ] * data2[ i + 3 ];
+ }
+
+ /* add any remaining products */
+ for( ; i < dataSize; i++ ) {
+ result += data1[ i ] * data2[ i ];
+ }
+
+ return result;
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_k2a_FLP.c
@@ -1,0 +1,58 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_k2a.c *
+ * *
+ * step up function, converts reflection coefficients to prediction *
+ * coefficients *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * Date: 080103 *
+ * */
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* step up function, converts reflection coefficients to prediction coefficients */
+void SKP_Silk_k2a_FLP(
+ SKP_float *A, /* O: prediction coefficients [order] */
+ const SKP_float *rc, /* I: reflection coefficients [order] */
+ SKP_int32 order /* I: prediction order */
+)
+{
+ SKP_int k, n;
+ SKP_float Atmp[SKP_Silk_MAX_ORDER_LPC];
+
+ for( k = 0; k < order; k++ ){
+ for( n = 0; n < k; n++ ){
+ Atmp[ n ] = A[ n ];
+ }
+ for( n = 0; n < k; n++ ) {
+ A[ n ] += Atmp[ k - n - 1 ] * rc[ k ];
+ }
+ A[ k ] = -rc[ k ];
+ }
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_levinsondurbin_FLP.c
@@ -1,0 +1,77 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* Solve the normal equations using the Levinson-Durbin recursion */
+SKP_float SKP_Silk_levinsondurbin_FLP( /* O prediction error energy */
+ SKP_float A[], /* O prediction coefficients [order] */
+ const SKP_float corr[], /* I input auto-correlations [order + 1] */
+ const SKP_int order /* I prediction order */
+)
+{
+ SKP_int i, mHalf, m;
+ SKP_float min_nrg, nrg, t, km, Atmp1, Atmp2;
+
+ min_nrg = 1e-12f * corr[ 0 ] + 1e-9f;
+ nrg = corr[ 0 ];
+ nrg = SKP_max_float(min_nrg, nrg);
+ A[ 0 ] = corr[ 1 ] / nrg;
+ nrg -= A[ 0 ] * corr[ 1 ];
+ nrg = SKP_max_float(min_nrg, nrg);
+
+ for( m = 1; m < order; m++ )
+ {
+ t = corr[ m + 1 ];
+ for( i = 0; i < m; i++ ) {
+ t -= A[ i ] * corr[ m - i ];
+ }
+
+ /* reflection coefficient */
+ km = t / nrg;
+
+ /* residual energy */
+ nrg -= km * t;
+ nrg = SKP_max_float(min_nrg, nrg);
+
+ mHalf = m >> 1;
+ for( i = 0; i < mHalf; i++ ) {
+ Atmp1 = A[ i ];
+ Atmp2 = A[ m - i - 1 ];
+ A[ m - i - 1 ] -= km * Atmp1;
+ A[ i ] -= km * Atmp2;
+ }
+ if( m & 1 ) {
+ A[ mHalf ] -= km * A[ mHalf ];
+ }
+ A[ m ] = km;
+ }
+
+ /* return the residual energy */
+ return nrg;
+}
+
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_pitch_analysis_core_FLP.c
@@ -1,0 +1,672 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/*****************************************************************************
+*
+* Pitch analyser function
+*
+******************************************************************************/
+#include "SKP_Silk_SigProc_FLP.h"
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_pitch_est_defines_FLP.h"
+#include "SKP_Silk_common_pitch_est_defines.h"
+
+#define SCRATCH_SIZE 22
+
+/************************************************************/
+/* Definitions */
+/************************************************************/
+#define eps 1.192092896e-07f
+
+/* using log2() helps the fixed-point conversion */
+SKP_INLINE SKP_float SKP_P_log2(double x) { return (SKP_float)(3.32192809488736 * log10(x)); }
+
+/************************************************************/
+/* Internally used functions */
+/************************************************************/
+static void SKP_P_Ana_calc_corr_st3(
+ SKP_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */
+ const SKP_float signal[], /* I vector to correlate */
+ SKP_int start_lag, /* I start lag */
+ SKP_int sf_length, /* I sub frame length */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+);
+
+static void SKP_P_Ana_calc_energy_st3(
+ SKP_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */
+ const SKP_float signal[], /* I vector to correlate */
+ SKP_int start_lag, /* I start lag */
+ SKP_int sf_length, /* I sub frame length */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+);
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//% CORE PITCH ANALYSIS FUNCTION %
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+SKP_int SKP_Silk_pitch_analysis_core_FLP( /* O voicing estimate: 0 voiced, 1 unvoiced */
+ const SKP_float *signal, /* I signal of length PE_FRAME_LENGTH_MS*Fs_kHz */
+ SKP_int *pitch_out, /* O 4 pitch lag values */
+ SKP_int *lagIndex, /* O lag Index */
+ SKP_int *contourIndex, /* O pitch contour Index */
+ SKP_float *LTPCorr, /* I/O normalized correlation; input: value from previous frame */
+ SKP_int prevLag, /* I last lag of previous frame; set to zero is unvoiced */
+ const SKP_float search_thres1, /* I first stage threshold for lag candidates 0 - 1 */
+ const SKP_float search_thres2, /* I final threshold for lag candidates 0 - 1 */
+ const SKP_int Fs_kHz, /* I sample frequency (kHz) */
+ const SKP_int complexity, /* I Complexity setting, 0-2, where 2 is highest */
+ const SKP_int nb_subfr /* I number of 5 ms subframes */
+)
+{
+ SKP_float signal_8kHz[ PE_MAX_FRAME_LENGTH_MS * 8 ];
+ SKP_float signal_4kHz[ PE_MAX_FRAME_LENGTH_MS * 4 ];
+ SKP_float scratch_mem[ PE_MAX_FRAME_LENGTH * 3 ];
+ SKP_float filt_state[ PE_MAX_DECIMATE_STATE_LENGTH ];
+ SKP_int i, k, d, j;
+ SKP_float threshold, contour_bias;
+ SKP_float C[ PE_MAX_NB_SUBFR][ (PE_MAX_LAG >> 1) + 5 ]; /* use to be +2 but then valgrind reported errors for SWB */
+ SKP_float CC[ PE_NB_CBKS_STAGE2_EXT ];
+ const SKP_float *target_ptr, *basis_ptr;
+ double cross_corr, normalizer, energy, energy_tmp;
+ SKP_int d_srch[ PE_D_SRCH_LENGTH ];
+ SKP_int16 d_comp[ (PE_MAX_LAG >> 1) + 5 ];
+ SKP_int length_d_srch, length_d_comp;
+ SKP_float Cmax, CCmax, CCmax_b, CCmax_new_b, CCmax_new;
+ SKP_int CBimax, CBimax_new, lag, start_lag, end_lag, lag_new;
+ SKP_int cbk_offset, cbk_size;
+ SKP_float lag_log2, prevLag_log2, delta_lag_log2_sqr;
+ SKP_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ];
+ SKP_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ];
+ SKP_int diff, lag_counter, frame_length, frame_length_8kHz, frame_length_4kHz;
+ SKP_int sf_length, sf_length_8kHz, sf_length_4kHz;
+ SKP_int min_lag, min_lag_8kHz, min_lag_4kHz;
+ SKP_int max_lag, max_lag_8kHz, max_lag_4kHz;
+ const SKP_int8 *Lag_CB_ptr;
+ SKP_int nb_cbk_search;
+
+ /* Check for valid sampling frequency */
+ SKP_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 || Fs_kHz == 24 );
+
+ /* Check for valid complexity setting */
+ SKP_assert( complexity >= SigProc_PE_MIN_COMPLEX );
+ SKP_assert( complexity <= SigProc_PE_MAX_COMPLEX );
+
+ SKP_assert( search_thres1 >= 0.0f && search_thres1 <= 1.0f );
+ SKP_assert( search_thres2 >= 0.0f && search_thres2 <= 1.0f );
+
+ /* Setup frame lengths max / min lag for the sampling frequency */
+ frame_length = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * Fs_kHz;
+ frame_length_4kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 4;
+ frame_length_8kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 8;
+ sf_length = PE_SUBFR_LENGTH_MS * Fs_kHz;
+ sf_length_4kHz = PE_SUBFR_LENGTH_MS * 4;
+ sf_length_8kHz = PE_SUBFR_LENGTH_MS * 8;
+ min_lag = PE_MIN_LAG_MS * Fs_kHz;
+ min_lag_4kHz = PE_MIN_LAG_MS * 4;
+ min_lag_8kHz = PE_MIN_LAG_MS * 8;
+ max_lag = PE_MAX_LAG_MS * Fs_kHz;
+ max_lag_4kHz = PE_MAX_LAG_MS * 4;
+ max_lag_8kHz = PE_MAX_LAG_MS * 8;
+
+ SKP_memset(C, 0, sizeof(SKP_float) * nb_subfr * ((PE_MAX_LAG >> 1) + 5));
+
+ /* Resample from input sampled at Fs_kHz to 8 kHz */
+ if( Fs_kHz == 12 ) {
+ SKP_int16 signal_12[ 12 * PE_MAX_FRAME_LENGTH_MS ];
+ SKP_int16 signal_8[ 8 * PE_MAX_FRAME_LENGTH_MS ];
+ SKP_int32 R23[ 6 ];
+
+ /* Resample to 12 -> 8 khz */
+ SKP_memset( R23, 0, 6 * sizeof( SKP_int32 ) );
+ SKP_float2short_array( signal_12, signal, frame_length );
+ SKP_Silk_resampler_down2_3( R23, signal_8, signal_12, frame_length );
+ SKP_short2float_array( signal_8kHz, signal_8, frame_length_8kHz );
+ } else if( Fs_kHz == 16 ) {
+ if( complexity == SigProc_PE_MAX_COMPLEX ) {
+ SKP_assert( 4 <= PE_MAX_DECIMATE_STATE_LENGTH );
+ SKP_memset( filt_state, 0, 4 * sizeof(SKP_float) );
+
+ SKP_Silk_decimate2_coarse_FLP( signal, filt_state, signal_8kHz,
+ scratch_mem, frame_length_8kHz );
+ } else {
+ SKP_assert( 2 <= PE_MAX_DECIMATE_STATE_LENGTH );
+ SKP_memset( filt_state, 0, 2 * sizeof(SKP_float) );
+
+ SKP_Silk_decimate2_coarsest_FLP( signal, filt_state, signal_8kHz,
+ scratch_mem, frame_length_8kHz );
+ }
+ } else if( Fs_kHz == 24 ) {
+ SKP_int16 signal_24[ PE_MAX_FRAME_LENGTH ];
+ SKP_int16 signal_8[ 8 * PE_MAX_FRAME_LENGTH_MS ];
+ SKP_int32 filt_state_fix[ 8 ];
+
+ /* Resample to 24 -> 8 khz */
+ SKP_float2short_array( signal_24, signal, frame_length );
+ SKP_memset( filt_state_fix, 0, 8 * sizeof(SKP_int32) );
+ SKP_Silk_resampler_down3( filt_state_fix, signal_8, signal_24, frame_length );
+ SKP_short2float_array( signal_8kHz, signal_8, frame_length_8kHz );
+ } else {
+ SKP_assert( Fs_kHz == 8 );
+ SKP_memcpy( signal_8kHz, signal, frame_length_8kHz * sizeof(SKP_float) );
+ }
+
+ /* Decimate again to 4 kHz. Set mem to zero */
+ if( complexity == SigProc_PE_MAX_COMPLEX ) {
+ SKP_assert( 4 <= PE_MAX_DECIMATE_STATE_LENGTH );
+ SKP_memset( filt_state, 0, 4 * sizeof(SKP_float) );
+ SKP_Silk_decimate2_coarse_FLP( signal_8kHz, filt_state,
+ signal_4kHz, scratch_mem, frame_length_4kHz );
+ } else {
+ SKP_assert( 2 <= PE_MAX_DECIMATE_STATE_LENGTH );
+ SKP_memset( filt_state, 0, 2 * sizeof(SKP_float) );
+ SKP_Silk_decimate2_coarsest_FLP( signal_8kHz, filt_state,
+ signal_4kHz, scratch_mem, frame_length_4kHz );
+ }
+
+ /* Low-pass filter */
+ for( i = frame_length_4kHz - 1; i > 0; i-- ) {
+ signal_4kHz[ i ] += signal_4kHz[ i - 1 ];
+ }
+
+ /******************************************************************************
+ * FIRST STAGE, operating in 4 khz
+ ******************************************************************************/
+ target_ptr = &signal_4kHz[ SKP_LSHIFT( sf_length_4kHz, 2 ) ];
+ for( k = 0; k < nb_subfr >> 1; k++ ) {
+ /* Check that we are within range of the array */
+ SKP_assert( target_ptr >= signal_4kHz );
+ SKP_assert( target_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
+
+ basis_ptr = target_ptr - min_lag_4kHz;
+
+ /* Check that we are within range of the array */
+ SKP_assert( basis_ptr >= signal_4kHz );
+ SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
+
+ /* Calculate first vector products before loop */
+ cross_corr = SKP_Silk_inner_product_FLP( target_ptr, basis_ptr, sf_length_8kHz );
+ normalizer = SKP_Silk_energy_FLP( basis_ptr, sf_length_8kHz ) + 1000.0f;
+
+ C[ 0 ][ min_lag_4kHz ] += (SKP_float)(cross_corr / sqrt(normalizer));
+
+ /* From now on normalizer is computed recursively */
+ for(d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++) {
+ basis_ptr--;
+
+ /* Check that we are within range of the array */
+ SKP_assert( basis_ptr >= signal_4kHz );
+ SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz );
+
+ cross_corr = SKP_Silk_inner_product_FLP(target_ptr, basis_ptr, sf_length_8kHz);
+
+ /* Add contribution of new sample and remove contribution from oldest sample */
+ normalizer +=
+ basis_ptr[ 0 ] * basis_ptr[ 0 ] -
+ basis_ptr[ sf_length_8kHz ] * basis_ptr[ sf_length_8kHz ];
+ C[ 0 ][ d ] += (SKP_float)(cross_corr / sqrt( normalizer ));
+ }
+ /* Update target pointer */
+ target_ptr += sf_length_8kHz;
+ }
+
+ /* apply short-lag bias */
+ for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) {
+ C[ 0 ][ i ] -= C[ 0 ][ i ] * i / 4096.0f;
+ }
+
+ /* Sort */
+ length_d_srch = 5 + complexity;
+ SKP_assert( length_d_srch <= PE_D_SRCH_LENGTH );
+ SKP_Silk_insertion_sort_decreasing_FLP( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch );
+
+ /* Escape if correlation is very low already here */
+ Cmax = C[ 0 ][ min_lag_4kHz ];
+ target_ptr = &signal_4kHz[ SKP_SMULBB( sf_length_4kHz, nb_subfr ) ];
+ energy = 1000.0f;
+ for( i = 0; i < SKP_LSHIFT( sf_length_4kHz, 2 ); i++ ) {
+ energy += target_ptr[i] * target_ptr[i];
+ }
+ threshold = Cmax * Cmax;
+ if( energy / 16.0f > threshold ) {
+ SKP_memset( pitch_out, 0, nb_subfr * sizeof(SKP_int) );
+ *LTPCorr = 0.0f;
+ *lagIndex = 0;
+ *contourIndex = 0;
+ return 1;
+ }
+
+ threshold = search_thres1 * Cmax;
+ for( i = 0; i < length_d_srch; i++ ) {
+ /* Convert to 8 kHz indices for the sorted correlation that exceeds the threshold */
+ if( C[ 0 ][ min_lag_4kHz + i ] > threshold ) {
+ d_srch[ i ] = SKP_LSHIFT( d_srch[ i ] + min_lag_4kHz, 1 );
+ } else {
+ length_d_srch = i;
+ break;
+ }
+ }
+ SKP_assert( length_d_srch > 0 );
+
+ for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) {
+ d_comp[ i ] = 0;
+ }
+ for( i = 0; i < length_d_srch; i++ ) {
+ d_comp[ d_srch[ i ] ] = 1;
+ }
+
+ /* Convolution */
+ for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) {
+ d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ];
+ }
+
+ length_d_srch = 0;
+ for( i = min_lag_8kHz; i < max_lag_8kHz + 1; i++ ) {
+ if( d_comp[ i + 1 ] > 0 ) {
+ d_srch[ length_d_srch ] = i;
+ length_d_srch++;
+ }
+ }
+
+ /* Convolution */
+ for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) {
+ d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ] + d_comp[ i - 3 ];
+ }
+
+ length_d_comp = 0;
+ for( i = min_lag_8kHz; i < max_lag_8kHz + 4; i++ ) {
+ if( d_comp[ i ] > 0 ) {
+ d_comp[ length_d_comp ] = i - 2;
+ length_d_comp++;
+ }
+ }
+
+ /**********************************************************************************
+ ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation
+ *************************************************************************************/
+ /*********************************************************************************
+ * Find energy of each subframe projected onto its history, for a range of delays
+ *********************************************************************************/
+ SKP_memset( C, 0, PE_MAX_NB_SUBFR*((PE_MAX_LAG >> 1) + 5) * sizeof(SKP_float)); // Is this needed?
+
+ target_ptr = &signal_8kHz[ PE_LTP_MEM_LENGTH_MS * 8 ];
+ for( k = 0; k < nb_subfr; k++ ) {
+
+ /* Check that we are within range of the array */
+ SKP_assert( target_ptr >= signal_8kHz );
+ SKP_assert( target_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz );
+
+ energy_tmp = SKP_Silk_energy_FLP( target_ptr, sf_length_8kHz );
+ for( j = 0; j < length_d_comp; j++ ) {
+ d = d_comp[ j ];
+ basis_ptr = target_ptr - d;
+
+ /* Check that we are within range of the array */
+ SKP_assert( basis_ptr >= signal_8kHz );
+ SKP_assert( basis_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz );
+
+ cross_corr = SKP_Silk_inner_product_FLP( basis_ptr, target_ptr, sf_length_8kHz );
+ energy = SKP_Silk_energy_FLP( basis_ptr, sf_length_8kHz );
+ if (cross_corr > 0.0f) {
+ C[ k ][ d ] = (SKP_float)(cross_corr * cross_corr / (energy * energy_tmp + eps));
+ } else {
+ C[ k ][ d ] = 0.0f;
+ }
+ }
+ target_ptr += sf_length_8kHz;
+ }
+
+ /* search over lag range and lags codebook */
+ /* scale factor for lag codebook, as a function of center lag */
+
+ CCmax = 0.0f; /* This value doesn't matter */
+ CCmax_b = -1000.0f;
+
+ CBimax = 0; /* To avoid returning undefined lag values */
+ lag = -1; /* To check if lag with strong enough correlation has been found */
+
+ if( prevLag > 0 ) {
+ if( Fs_kHz == 12 ) {
+ prevLag = SKP_LSHIFT( prevLag, 1 ) / 3;
+ } else if( Fs_kHz == 16 ) {
+ prevLag = SKP_RSHIFT( prevLag, 1 );
+ } else if( Fs_kHz == 24 ) {
+ prevLag = prevLag / 3;
+ }
+ prevLag_log2 = SKP_P_log2((SKP_float)prevLag);
+ } else {
+ prevLag_log2 = 0;
+ }
+
+ /* Setup stage 2 codebook based on number of subframes */
+ if( nb_subfr == PE_MAX_NB_SUBFR ) {
+ cbk_size = PE_NB_CBKS_STAGE2_EXT;
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage2[ 0 ][ 0 ];
+ if( Fs_kHz == 8 && complexity > SigProc_PE_MIN_COMPLEX ) {
+ /* If input is 8 khz use a larger codebook here because it is last stage */
+ nb_cbk_search = PE_NB_CBKS_STAGE2_EXT;
+ } else {
+ nb_cbk_search = PE_NB_CBKS_STAGE2;
+ }
+ }else{
+ cbk_size = PE_NB_CBKS_STAGE2_10MS;
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage2_10_ms[ 0 ][ 0 ];
+ nb_cbk_search = PE_NB_CBKS_STAGE2_10MS;
+ }
+
+ for( k = 0; k < length_d_srch; k++ ) {
+ d = d_srch[ k ];
+ for( j = 0; j < nb_cbk_search; j++ ) {
+ CC[j] = 0.0f;
+ for( i = 0; i < nb_subfr; i++ ) {
+ /* Try all codebooks */
+ CC[ j ] += C[ i ][ d + matrix_ptr( Lag_CB_ptr, i, j, cbk_size )];
+ }
+ }
+ /* Find best codebook */
+ CCmax_new = -1000.0f;
+ CBimax_new = 0;
+ for( i = 0; i < nb_cbk_search; i++ ) {
+ if( CC[ i ] > CCmax_new ) {
+ CCmax_new = CC[ i ];
+ CBimax_new = i;
+ }
+ }
+ CCmax_new = SKP_max_float(CCmax_new, 0.0f); /* To avoid taking square root of negative number later */
+ CCmax_new_b = CCmax_new;
+
+ /* Bias towards shorter lags */
+ lag_log2 = SKP_P_log2((SKP_float)d);
+ CCmax_new_b -= PE_FLP_SHORTLAG_BIAS * nb_subfr * lag_log2;
+
+ /* Bias towards previous lag */
+ if ( prevLag > 0 ) {
+ delta_lag_log2_sqr = lag_log2 - prevLag_log2;
+ delta_lag_log2_sqr *= delta_lag_log2_sqr;
+ CCmax_new_b -= PE_FLP_PREVLAG_BIAS * nb_subfr * (*LTPCorr) * delta_lag_log2_sqr / (delta_lag_log2_sqr + 0.5f);
+ }
+
+ if ( CCmax_new_b > CCmax_b && CCmax_new > nb_subfr * search_thres2 * search_thres2 ) {
+ CCmax_b = CCmax_new_b;
+ CCmax = CCmax_new;
+ lag = d;
+ CBimax = CBimax_new;
+ }
+ }
+
+ if( lag == -1 ) {
+ /* No suitable candidate found */
+ SKP_memset( pitch_out, 0, PE_MAX_NB_SUBFR * sizeof(SKP_int) );
+ *LTPCorr = 0.0f;
+ *lagIndex = 0;
+ *contourIndex = 0;
+ return 1;
+ }
+
+ if( Fs_kHz > 8 ) {
+ /* Search in original signal */
+
+ /* Compensate for decimation */
+ SKP_assert( lag == SKP_SAT16( lag ) );
+ if( Fs_kHz == 12 ) {
+ lag = SKP_RSHIFT_ROUND( SKP_SMULBB( lag, 3 ), 1 );
+ } else if( Fs_kHz == 16 ) {
+ lag = SKP_LSHIFT( lag, 1 );
+ } else {
+ lag = SKP_SMULBB( lag, 3 );
+ }
+
+ lag = SKP_LIMIT_int( lag, min_lag, max_lag );
+ start_lag = SKP_max_int( lag - 2, min_lag );
+ end_lag = SKP_min_int( lag + 2, max_lag );
+ lag_new = lag; /* to avoid undefined lag */
+ CBimax = 0; /* to avoid undefined lag */
+ SKP_assert( CCmax >= 0.0f );
+ *LTPCorr = (SKP_float)sqrt( CCmax / nb_subfr ); /* Output normalized correlation */
+
+ CCmax = -1000.0f;
+
+ /* Calculate the correlations and energies needed in stage 3 */
+ SKP_P_Ana_calc_corr_st3( cross_corr_st3, signal, start_lag, sf_length, nb_subfr, complexity );
+ SKP_P_Ana_calc_energy_st3( energies_st3, signal, start_lag, sf_length, nb_subfr, complexity );
+
+ lag_counter = 0;
+ SKP_assert( lag == SKP_SAT16( lag ) );
+ contour_bias = PE_FLP_FLATCONTOUR_BIAS / lag;
+
+ /* Setup cbk parameters acording to complexity setting and frame length */
+ if( nb_subfr == PE_MAX_NB_SUBFR ) {
+ nb_cbk_search = (SKP_int)SKP_Silk_nb_cbk_searchs_stage3[ complexity ];
+ cbk_size = PE_NB_CBKS_STAGE3_MAX;
+ cbk_offset = (SKP_int)SKP_Silk_cbk_offsets_stage3[ complexity ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3[ 0 ][ 0 ];
+ } else {
+ nb_cbk_search = PE_NB_CBKS_STAGE3_10MS;
+ cbk_size = PE_NB_CBKS_STAGE3_10MS;
+ cbk_offset = 0;
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
+ }
+
+ for( d = start_lag; d <= end_lag; d++ ) {
+ for( j = cbk_offset; j < ( cbk_offset + nb_cbk_search ); j++ ) {
+ cross_corr = 0.0;
+ energy = eps;
+ for( k = 0; k < nb_subfr; k++ ) {
+ energy += energies_st3[ k ][ j ][ lag_counter ];
+ cross_corr += cross_corr_st3[ k ][ j ][ lag_counter ];
+ }
+ if( cross_corr > 0.0 ) {
+ CCmax_new = (SKP_float)(cross_corr * cross_corr / energy);
+ /* Reduce depending on flatness of contour */
+ diff = j - SKP_RSHIFT( cbk_size, 1 );
+ CCmax_new *= ( 1.0f - contour_bias * diff * diff );
+ } else {
+ CCmax_new = 0.0f;
+ }
+
+ if( CCmax_new > CCmax ) {
+ CCmax = CCmax_new;
+ lag_new = d;
+ CBimax = j;
+ }
+ }
+ lag_counter++;
+ }
+
+ for( k = 0; k < nb_subfr; k++ ) {
+ pitch_out[ k ] = lag_new + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size );
+ }
+ *lagIndex = lag_new - min_lag;
+ *contourIndex = CBimax;
+ } else {
+ /* Save Lags and correlation */
+ SKP_assert( CCmax >= 0.0f );
+ *LTPCorr = (SKP_float)sqrt( CCmax / nb_subfr ); /* Output normalized correlation */
+ for( k = 0; k < nb_subfr; k++ ) {
+ pitch_out[ k ] = lag + SKP_Silk_CB_lags_stage2[ k ][ CBimax ];
+ }
+ *lagIndex = lag - min_lag;
+ *contourIndex = CBimax;
+ }
+ SKP_assert( *lagIndex >= 0 );
+ /* return as voiced */
+ return 0;
+}
+
+static void SKP_P_Ana_calc_corr_st3(
+ SKP_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */
+ const SKP_float signal[], /* I vector to correlate */
+ SKP_int start_lag, /* I start lag */
+ SKP_int sf_length, /* I sub frame length */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+)
+ /***********************************************************************
+ Calculates the correlations used in stage 3 search. In order to cover
+ the whole lag codebook for all the searched offset lags (lag +- 2),
+ the following correlations are needed in each sub frame:
+
+ sf1: lag range [-8,...,7] total 16 correlations
+ sf2: lag range [-4,...,4] total 9 correlations
+ sf3: lag range [-3,....4] total 8 correltions
+ sf4: lag range [-6,....8] total 15 correlations
+
+ In total 48 correlations. The direct implementation computed in worst case
+ 4*12*5 = 240 correlations, but more likely around 120.
+ **********************************************************************/
+{
+ const SKP_float *target_ptr, *basis_ptr;
+ SKP_int i, j, k, lag_counter, lag_low, lag_high;
+ SKP_int cbk_offset, nb_cbk_search, delta, idx, cbk_size;
+ SKP_float scratch_mem[ SCRATCH_SIZE ];
+ const SKP_int8 *Lag_range_ptr, *Lag_CB_ptr;
+
+ SKP_assert( complexity >= SigProc_PE_MIN_COMPLEX );
+ SKP_assert( complexity <= SigProc_PE_MAX_COMPLEX );
+
+ if( nb_subfr == PE_MAX_NB_SUBFR ){
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3[ 0 ][ 0 ];
+ cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ];
+ nb_cbk_search = SKP_Silk_nb_cbk_searchs_stage3[ complexity ];
+ cbk_size = PE_NB_CBKS_STAGE3_MAX;
+ } else {
+ SKP_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1);
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3_10_ms[ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
+ cbk_offset = 0;
+ nb_cbk_search = PE_NB_CBKS_STAGE3_10MS;
+ cbk_size = PE_NB_CBKS_STAGE3_10MS;
+ }
+
+ target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */
+ for( k = 0; k < nb_subfr; k++ ) {
+ lag_counter = 0;
+
+ /* Calculate the correlations for each subframe */
+ lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 );
+ lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 );
+ for( j = lag_low; j <= lag_high; j++ ) {
+ basis_ptr = target_ptr - ( start_lag + j );
+ SKP_assert( lag_counter < SCRATCH_SIZE );
+ scratch_mem[ lag_counter ] = (SKP_float)SKP_Silk_inner_product_FLP( target_ptr, basis_ptr, sf_length );
+ lag_counter++;
+ }
+
+ delta = matrix_ptr( Lag_range_ptr, k, 0, 2 );
+ for( i = cbk_offset; i < ( cbk_offset + nb_cbk_search ); i++ ) {
+ /* Fill out the 3 dim array that stores the correlations for */
+ /* each code_book vector for each start lag */
+ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta;
+ for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) {
+ SKP_assert( idx + j < SCRATCH_SIZE );
+ SKP_assert( idx + j < lag_counter );
+ cross_corr_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ];
+ }
+ }
+ target_ptr += sf_length;
+ }
+}
+
+static void SKP_P_Ana_calc_energy_st3(
+ SKP_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */
+ const SKP_float signal[], /* I vector to correlate */
+ SKP_int start_lag, /* I start lag */
+ SKP_int sf_length, /* I sub frame length */
+ SKP_int nb_subfr, /* I number of subframes */
+ SKP_int complexity /* I Complexity setting */
+)
+/****************************************************************
+Calculate the energies for first two subframes. The energies are
+calculated recursively.
+****************************************************************/
+{
+ const SKP_float *target_ptr, *basis_ptr;
+ double energy;
+ SKP_int k, i, j, lag_counter;
+ SKP_int cbk_offset, nb_cbk_search, delta, idx, cbk_size, lag_diff;
+ SKP_float scratch_mem[ SCRATCH_SIZE ];
+ const SKP_int8 *Lag_range_ptr, *Lag_CB_ptr;
+
+ SKP_assert( complexity >= SigProc_PE_MIN_COMPLEX );
+ SKP_assert( complexity <= SigProc_PE_MAX_COMPLEX );
+
+ if( nb_subfr == PE_MAX_NB_SUBFR ){
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3[ 0 ][ 0 ];
+ cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ];
+ nb_cbk_search = SKP_Silk_nb_cbk_searchs_stage3[ complexity ];
+ cbk_size = PE_NB_CBKS_STAGE3_MAX;
+ } else {
+ SKP_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1);
+ Lag_range_ptr = &SKP_Silk_Lag_range_stage3_10_ms[ 0 ][ 0 ];
+ Lag_CB_ptr = &SKP_Silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
+ cbk_offset = 0;
+ nb_cbk_search = PE_NB_CBKS_STAGE3_10MS;
+ cbk_size = PE_NB_CBKS_STAGE3_10MS;
+ }
+
+ target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ];
+ for( k = 0; k < nb_subfr; k++ ) {
+ lag_counter = 0;
+
+ /* Calculate the energy for first lag */
+ basis_ptr = target_ptr - ( start_lag + matrix_ptr( Lag_range_ptr, k, 0, 2 ) );
+ energy = SKP_Silk_energy_FLP( basis_ptr, sf_length ) + 1e-3;
+ SKP_assert( energy >= 0.0 );
+ scratch_mem[lag_counter] = (SKP_float)energy;
+ lag_counter++;
+
+ lag_diff = ( matrix_ptr( Lag_range_ptr, k, 1, 2 ) - matrix_ptr( Lag_range_ptr, k, 0, 2 ) + 1 );
+ for( i = 1; i < lag_diff; i++ ) {
+ /* remove part outside new window */
+ energy -= basis_ptr[sf_length - i] * basis_ptr[sf_length - i];
+ SKP_assert( energy >= 0.0 );
+
+ /* add part that comes into window */
+ energy += basis_ptr[ -i ] * basis_ptr[ -i ];
+ SKP_assert( energy >= 0.0 );
+ SKP_assert( lag_counter < SCRATCH_SIZE );
+ scratch_mem[lag_counter] = (SKP_float)energy;
+ lag_counter++;
+ }
+
+ delta = matrix_ptr( Lag_range_ptr, k, 0, 2 );
+ for( i = cbk_offset; i < ( cbk_offset + nb_cbk_search ); i++ ) {
+ /* Fill out the 3 dim array that stores the correlations for */
+ /* each code_book vector for each start lag */
+ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta;
+ for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) {
+ SKP_assert( idx + j < SCRATCH_SIZE );
+ SKP_assert( idx + j < lag_counter );
+ energies_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ];
+ SKP_assert( energies_st3[ k ][ i ][ j ] >= 0.0f );
+ }
+ }
+ target_ptr += sf_length;
+ }
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_pitch_est_defines_FLP.h
@@ -1,0 +1,42 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SIGPROCFLP_PE_DEFINES_H
+#define SIGPROCFLP_PE_DEFINES_H
+
+#include "SKP_Silk_common_pitch_est_defines.h"
+
+/************************************************************/
+/* Definitions For FLP pitch estimator */
+/************************************************************/
+
+#define PE_FLP_SHORTLAG_BIAS 0.2f /* for logarithmic weighting */
+#define PE_FLP_PREVLAG_BIAS 0.2f /* for logarithmic weighting */
+#define PE_FLP_FLATCONTOUR_BIAS 0.05f
+
+#endif
+
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_scale_copy_vector_FLP.c
@@ -1,0 +1,53 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* copy and multiply a vector by a constant */
+void SKP_Silk_scale_copy_vector_FLP(
+ SKP_float *data_out,
+ const SKP_float *data_in,
+ SKP_float gain,
+ SKP_int dataSize
+)
+{
+ SKP_int i, dataSize4;
+
+ /* 4x unrolled loop */
+ dataSize4 = dataSize & 0xFFFC;
+ for( i = 0; i < dataSize4; i += 4 ) {
+ data_out[ i + 0 ] = gain * data_in[ i + 0 ];
+ data_out[ i + 1 ] = gain * data_in[ i + 1 ];
+ data_out[ i + 2 ] = gain * data_in[ i + 2 ];
+ data_out[ i + 3 ] = gain * data_in[ i + 3 ];
+ }
+
+ /* any remaining elements */
+ for( ; i < dataSize; i++ ) {
+ data_out[ i ] = gain * data_in[ i ];
+ }
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_scale_vector_FLP.c
@@ -1,0 +1,52 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+/* multiply a vector by a constant */
+void SKP_Silk_scale_vector_FLP(
+ SKP_float *data1,
+ SKP_float gain,
+ SKP_int dataSize
+)
+{
+ SKP_int i, dataSize4;
+
+ /* 4x unrolled loop */
+ dataSize4 = dataSize & 0xFFFC;
+ for( i = 0; i < dataSize4; i += 4 ) {
+ data1[ i + 0 ] *= gain;
+ data1[ i + 1 ] *= gain;
+ data1[ i + 2 ] *= gain;
+ data1[ i + 3 ] *= gain;
+ }
+
+ /* any remaining elements */
+ for( ; i < dataSize; i++ ) {
+ data1[ i ] *= gain;
+ }
+}
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_schur_FLP.c
@@ -1,0 +1,71 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_Silk_schur.c *
+ * *
+ * Calculates the reflection coefficients from the correlation sequence *
+ * *
+ * Copyright 2008 (c), Skype Limited *
+ * Date: 080103 *
+ */
+
+#include "SKP_Silk_SigProc_FLP.h"
+
+void SKP_Silk_schur_FLP(
+ SKP_float refl_coef[], /* O reflection coefficients (length order) */
+ const SKP_float auto_corr[], /* I autotcorreation sequence (length order+1) */
+ SKP_int order /* I order */
+)
+{
+ SKP_int k, n;
+ SKP_float C[SKP_Silk_MAX_ORDER_LPC + 1][2];
+ SKP_float Ctmp1, Ctmp2, rc_tmp;
+
+ /* copy correlations */
+ for( k = 0; k < order+1; k++ ){
+ C[k][0] = C[k][1] = auto_corr[k];
+ }
+
+ for( k = 0; k < order; k++ )
+ {
+ /* get reflection coefficient */
+ rc_tmp = -C[k + 1][0] / SKP_max_float(C[0][1], 1e-9f);
+
+ /* save the output */
+ refl_coef[k] = rc_tmp;
+
+ /* update correlations */
+ for( n = 0; n < order - k; n++ ){
+ Ctmp1 = C[n + k + 1][0];
+ Ctmp2 = C[n][1];
+ C[n + k + 1][0] = Ctmp1 + Ctmp2 * rc_tmp;
+ C[n][1] = Ctmp2 + Ctmp1 * rc_tmp;
+ }
+ }
+}
+
--- /dev/null
+++ b/src_SigProc_FLP/SKP_Silk_sort_FLP.c
@@ -1,0 +1,150 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* Insertion sort (fast for already almost sorted arrays): */
+/* Best case: O(n) for an already sorted array */
+/* Worst case: O(n^2) for an inversely sorted array */
+/* */
+/* To be implemented: */
+/* Shell short: http://en.wikipedia.org/wiki/Shell_sort */
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_SigProc_FLP.h"
+
+void SKP_Silk_insertion_sort_increasing_FLP(
+ SKP_float *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+)
+{
+ SKP_float value;
+ SKP_int i, j;
+
+ /* Safety checks */
+ SKP_assert( K > 0 );
+ SKP_assert( L > 0 );
+ SKP_assert( L >= K );
+
+ /* Write start indices in index vector */
+ for( i = 0; i < K; i++ ) {
+ index[ i ] = i;
+ }
+
+ /* Sort vector elements by value, increasing order */
+ for( i = 1; i < K; i++ ) {
+ value = a[ i ];
+ for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+
+ /* If less than L values are asked check the remaining values, */
+ /* but only spend CPU to ensure that the K first values are correct */
+ for( i = K; i < L; i++ ) {
+ value = a[ i ];
+ if( value < a[ K - 1 ] ) {
+ for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+ }
+}
+
+void SKP_Silk_insertion_sort_decreasing_FLP(
+ SKP_float *a, /* I/O: Unsorted / Sorted vector */
+ SKP_int *index, /* O: Index vector for the sorted elements */
+ const SKP_int L, /* I: Vector length */
+ const SKP_int K /* I: Number of correctly sorted positions */
+)
+{
+ SKP_float value;
+ SKP_int i, j;
+
+ /* Safety checks */
+ SKP_assert( K > 0 );
+ SKP_assert( L > 0 );
+ SKP_assert( L >= K );
+
+ /* Write start indices in index vector */
+ for( i = 0; i < K; i++ ) {
+ index[ i ] = i;
+ }
+
+ /* Sort vector elements by value, decreasing order */
+ for( i = 1; i < K; i++ ) {
+ value = a[ i ];
+ for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+
+ /* If less than L values are asked check the remaining values, */
+ /* but only spend CPU to ensure that the K first values are correct */
+ for( i = K; i < L; i++ ) {
+ value = a[ i ];
+ if( value > a[ K - 1 ] ) {
+ for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ index[ j + 1 ] = index[ j ]; /* Shift index */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ index[ j + 1 ] = i; /* Write index */
+ }
+ }
+}
+
+void SKP_Silk_insertion_sort_increasing_all_values_FLP(
+ SKP_float *a, /* I/O: Unsorted / Sorted vector */
+ const SKP_int L /* I: Vector length */
+)
+{
+ SKP_float value;
+ SKP_int i, j;
+
+ /* Safety checks */
+ SKP_assert( L > 0 );
+
+ /* Sort vector elements by value, increasing order */
+ for( i = 1; i < L; i++ ) {
+ value = a[ i ];
+ for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) {
+ a[ j + 1 ] = a[ j ]; /* Shift value */
+ }
+ a[ j + 1 ] = value; /* Write value */
+ }
+}
+
--- /dev/null
+++ b/src_SigProc_FLP/SigProc_FLP.vcproj
@@ -1,0 +1,248 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="SigProc_FLP"
+ ProjectGUID="{793D0EC2-8554-4674-9A97-F25DE5DBE926}"
+ RootNamespace="Silk"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../interface;../src_SigProc_FIX"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_SigProcFIX_Win32_debug.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../interface;../src_SigProc_FIX"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+ GeneratePreprocessedFile="0"
+ RuntimeLibrary="0"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_SigProcFIX_Win32_mt.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_allpass_int_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_autocorrelation_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_burg_modified_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_bwexpander_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decimate2_coarse_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decimate2_coarsest_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_energy_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_inner_product_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_k2a_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_levinsondurbin_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LPC_inv_pred_gain_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_VQ_weights_laroia_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_pitch_analysis_core_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_scale_copy_vector_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_scale_vector_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_schur_FLP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_sort_FLP.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_pitch_est_defines_FLP.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_SigProc_FLP.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+++ b/src_common/SKP_Silk_CNG.c
@@ -1,0 +1,149 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Generates excitation for CNG LPC synthesis */
+SKP_INLINE void SKP_Silk_CNG_exc(
+ SKP_int16 residual[], /* O CNG residual signal Q0 */
+ SKP_int32 exc_buf_Q10[], /* I Random samples buffer Q10 */
+ SKP_int32 Gain_Q16, /* I Gain to apply */
+ SKP_int length, /* I Length */
+ SKP_int32 *rand_seed /* I/O Seed to random index generator */
+)
+{
+ SKP_int32 seed;
+ SKP_int i, idx, exc_mask;
+
+ exc_mask = CNG_BUF_MASK_MAX;
+ while( exc_mask > length ) {
+ exc_mask = SKP_RSHIFT( exc_mask, 1 );
+ }
+
+ seed = *rand_seed;
+ for( i = 0; i < length; i++ ) {
+ seed = SKP_RAND( seed );
+ idx = ( SKP_int )( SKP_RSHIFT( seed, 24 ) & exc_mask );
+ SKP_assert( idx >= 0 );
+ SKP_assert( idx <= CNG_BUF_MASK_MAX );
+ residual[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( exc_buf_Q10[ idx ], Gain_Q16 ), 10 ) );
+ }
+ *rand_seed = seed;
+}
+
+void SKP_Silk_CNG_Reset(
+ SKP_Silk_decoder_state *psDec /* I/O Decoder state */
+)
+{
+ SKP_int i, NLSF_step_Q15, NLSF_acc_Q15;
+
+ NLSF_step_Q15 = SKP_DIV32_16( SKP_int16_MAX, psDec->LPC_order + 1 );
+ NLSF_acc_Q15 = 0;
+ for( i = 0; i < psDec->LPC_order; i++ ) {
+ NLSF_acc_Q15 += NLSF_step_Q15;
+ psDec->sCNG.CNG_smth_NLSF_Q15[ i ] = NLSF_acc_Q15;
+ }
+ psDec->sCNG.CNG_smth_Gain_Q16 = 0;
+ psDec->sCNG.rand_seed = 3176576;
+}
+
+/* Updates CNG estimate, and applies the CNG when packet was lost */
+void SKP_Silk_CNG(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[], /* I/O Signal */
+ SKP_int length /* I Length of residual */
+)
+{
+ SKP_int i, subfr;
+ SKP_int32 tmp_32, Gain_Q26, max_Gain_Q16;
+ SKP_int16 LPC_buf[ MAX_LPC_ORDER ];
+ SKP_int16 CNG_sig[ MAX_FRAME_LENGTH ];
+ SKP_Silk_CNG_struct *psCNG;
+ psCNG = &psDec->sCNG;
+
+ if( psDec->fs_kHz != psCNG->fs_kHz ) {
+ /* Reset state */
+ SKP_Silk_CNG_Reset( psDec );
+
+ psCNG->fs_kHz = psDec->fs_kHz;
+ }
+ if( psDec->lossCnt == 0 && psDec->vadFlag == NO_VOICE_ACTIVITY ) {
+ /* Update CNG parameters */
+
+ /* Smoothing of LSF's */
+ for( i = 0; i < psDec->LPC_order; i++ ) {
+ psCNG->CNG_smth_NLSF_Q15[ i ] += SKP_SMULWB( psDec->prevNLSF_Q15[ i ] - psCNG->CNG_smth_NLSF_Q15[ i ], CNG_NLSF_SMTH_Q16 );
+ }
+ /* Find the subframe with the highest gain */
+ max_Gain_Q16 = 0;
+ subfr = 0;
+ for( i = 0; i < psDec->nb_subfr; i++ ) {
+ if( psDecCtrl->Gains_Q16[ i ] > max_Gain_Q16 ) {
+ max_Gain_Q16 = psDecCtrl->Gains_Q16[ i ];
+ subfr = i;
+ }
+ }
+ /* Update CNG excitation buffer with excitation from this subframe */
+ SKP_memmove( &psCNG->CNG_exc_buf_Q10[ psDec->subfr_length ], psCNG->CNG_exc_buf_Q10, ( psDec->nb_subfr - 1 ) * psDec->subfr_length * sizeof( SKP_int32 ) );
+ SKP_memcpy( psCNG->CNG_exc_buf_Q10, &psDec->exc_Q10[ subfr * psDec->subfr_length ], psDec->subfr_length * sizeof( SKP_int32 ) );
+
+ /* Smooth gains */
+ for( i = 0; i < psDec->nb_subfr; i++ ) {
+ psCNG->CNG_smth_Gain_Q16 += SKP_SMULWB( psDecCtrl->Gains_Q16[ i ] - psCNG->CNG_smth_Gain_Q16, CNG_GAIN_SMTH_Q16 );
+ }
+ }
+
+ /* Add CNG when packet is lost and / or when low speech activity */
+ if( psDec->lossCnt ) {//|| psDec->vadFlag == NO_VOICE_ACTIVITY ) {
+
+ /* Generate CNG excitation */
+ SKP_Silk_CNG_exc( CNG_sig, psCNG->CNG_exc_buf_Q10,
+ psCNG->CNG_smth_Gain_Q16, length, &psCNG->rand_seed );
+
+ /* Convert CNG NLSF to filter representation */
+ SKP_Silk_NLSF2A_stable( LPC_buf, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order );
+
+ Gain_Q26 = ( SKP_int32 )1 << 26; /* 1.0 */
+
+ /* Generate CNG signal, by synthesis filtering */
+ if( psDec->LPC_order == 16 ) {
+ SKP_Silk_LPC_synthesis_order16( CNG_sig, LPC_buf,
+ Gain_Q26, psCNG->CNG_synth_state, CNG_sig, length );
+ } else {
+ SKP_Silk_LPC_synthesis_filter( CNG_sig, LPC_buf,
+ Gain_Q26, psCNG->CNG_synth_state, CNG_sig, length, psDec->LPC_order );
+ }
+ /* Mix with signal */
+ for( i = 0; i < length; i++ ) {
+ tmp_32 = signal[ i ] + CNG_sig[ i ];
+ signal[ i ] = SKP_SAT16( tmp_32 );
+ }
+ } else {
+ SKP_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( SKP_int32 ) );
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_LBRR_reset.c
@@ -1,0 +1,40 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Resets LBRR buffer, used if packet size changes */
+void SKP_Silk_LBRR_reset(
+ SKP_Silk_encoder_state *psEncC /* I/O state */
+)
+{
+ SKP_int i;
+
+ for( i = 0; i < MAX_LBRR_DELAY; i++ ) {
+ psEncC->LBRR_buffer[ i ].usage = SKP_SILK_NO_LBRR;
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_LP_variable_cutoff.c
@@ -1,0 +1,194 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/*
+
+ Elliptic/Cauer filters designed with 0.1 dB passband ripple,
+ 80 dB minimum stopband attenuation, and
+ [0.95 : 0.15 : 0.35] normalized cut off frequencies.
+
+*/
+#include "SKP_Silk_main.h"
+
+#if SWITCH_TRANSITION_FILTERING
+
+/* Helper function, that interpolates the filter taps */
+SKP_INLINE void SKP_Silk_LP_interpolate_filter_taps(
+ SKP_int32 B_Q28[ TRANSITION_NB ],
+ SKP_int32 A_Q28[ TRANSITION_NA ],
+ const SKP_int ind,
+ const SKP_int32 fac_Q16
+)
+{
+ SKP_int nb, na;
+
+ if( ind < TRANSITION_INT_NUM - 1 ) {
+ if( fac_Q16 > 0 ) {
+ if( fac_Q16 == SKP_SAT16( fac_Q16 ) ) { /* fac_Q16 is in range of a 16-bit int */
+ /* Piece-wise linear interpolation of B and A */
+ for( nb = 0; nb < TRANSITION_NB; nb++ ) {
+ B_Q28[ nb ] = SKP_SMLAWB(
+ SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ],
+ SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] -
+ SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ],
+ fac_Q16 );
+ }
+ for( na = 0; na < TRANSITION_NA; na++ ) {
+ A_Q28[ na ] = SKP_SMLAWB(
+ SKP_Silk_Transition_LP_A_Q28[ ind ][ na ],
+ SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ] -
+ SKP_Silk_Transition_LP_A_Q28[ ind ][ na ],
+ fac_Q16 );
+ }
+ } else if( fac_Q16 == ( 1 << 15 ) ) { /* Neither fac_Q16 nor ( ( 1 << 16 ) - fac_Q16 ) is in range of a 16-bit int */
+
+ /* Piece-wise linear interpolation of B and A */
+ for( nb = 0; nb < TRANSITION_NB; nb++ ) {
+ B_Q28[ nb ] = SKP_RSHIFT(
+ SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ] +
+ SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ],
+ 1 );
+ }
+ for( na = 0; na < TRANSITION_NA; na++ ) {
+ A_Q28[ na ] = SKP_RSHIFT(
+ SKP_Silk_Transition_LP_A_Q28[ ind ][ na ] +
+ SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ],
+ 1 );
+ }
+ } else { /* ( ( 1 << 16 ) - fac_Q16 ) is in range of a 16-bit int */
+
+ SKP_assert( ( ( 1 << 16 ) - fac_Q16 ) == SKP_SAT16( ( ( 1 << 16 ) - fac_Q16) ) );
+ /* Piece-wise linear interpolation of B and A */
+ for( nb = 0; nb < TRANSITION_NB; nb++ ) {
+ B_Q28[ nb ] = SKP_SMLAWB(
+ SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ],
+ SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ] -
+ SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ],
+ ( 1 << 16 ) - fac_Q16 );
+ }
+ for( na = 0; na < TRANSITION_NA; na++ ) {
+ A_Q28[ na ] = SKP_SMLAWB(
+ SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ],
+ SKP_Silk_Transition_LP_A_Q28[ ind ][ na ] -
+ SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ],
+ ( 1 << 16 ) - fac_Q16 );
+ }
+ }
+ } else {
+ SKP_memcpy( B_Q28, SKP_Silk_Transition_LP_B_Q28[ ind ], TRANSITION_NB * sizeof( SKP_int32 ) );
+ SKP_memcpy( A_Q28, SKP_Silk_Transition_LP_A_Q28[ ind ], TRANSITION_NA * sizeof( SKP_int32 ) );
+ }
+ } else {
+ SKP_memcpy( B_Q28, SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NB * sizeof( SKP_int32 ) );
+ SKP_memcpy( A_Q28, SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NA * sizeof( SKP_int32 ) );
+ }
+}
+
+/* Low-pass filter with variable cutoff frequency based on */
+/* piece-wise linear interpolation between elliptic filters */
+/* Start by setting psEncC->transition_frame_no = 1; */
+/* Deactivate by setting psEncC->transition_frame_no = 0; */
+void SKP_Silk_LP_variable_cutoff(
+ SKP_Silk_LP_state *psLP, /* I/O LP filter state */
+ SKP_int16 *out, /* O Low-pass filtered output signal */
+ const SKP_int16 *in, /* I Input signal */
+ const SKP_int frame_length /* I Frame length */
+)
+{
+ SKP_int32 B_Q28[ TRANSITION_NB ], A_Q28[ TRANSITION_NA ], fac_Q16 = 0;
+ SKP_int ind = 0;
+
+ SKP_assert( psLP->transition_frame_no >= 0 );
+ SKP_assert( ( ( ( psLP->transition_frame_no <= TRANSITION_FRAMES_DOWN ) && ( psLP->mode == 0 ) ) ||
+ ( ( psLP->transition_frame_no <= TRANSITION_FRAMES_UP ) && ( psLP->mode == 1 ) ) ) );
+
+ /* Interpolate filter coefficients if needed */
+ if( psLP->transition_frame_no > 0 ) {
+ if( psLP->mode == 0 ) {
+ if( psLP->transition_frame_no < TRANSITION_FRAMES_DOWN ) {
+ /* Calculate index and interpolation factor for interpolation */
+#if( TRANSITION_INT_STEPS_DOWN == 32 )
+ fac_Q16 = SKP_LSHIFT( psLP->transition_frame_no, 16 - 5 );
+#else
+ fac_Q16 = SKP_DIV32_16( SKP_LSHIFT( psLP->transition_frame_no, 16 ), TRANSITION_INT_STEPS_DOWN );
+#endif
+ ind = SKP_RSHIFT( fac_Q16, 16 );
+ fac_Q16 -= SKP_LSHIFT( ind, 16 );
+
+ SKP_assert( ind >= 0 );
+ SKP_assert( ind < TRANSITION_INT_NUM );
+
+ /* Interpolate filter coefficients */
+ SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 );
+
+ /* Increment transition frame number for next frame */
+ psLP->transition_frame_no++;
+
+ } else {
+ SKP_assert( psLP->transition_frame_no == TRANSITION_FRAMES_DOWN );
+ /* End of transition phase */
+ SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, TRANSITION_INT_NUM - 1, 0 );
+ }
+ } else {
+ SKP_assert( psLP->mode == 1 );
+ if( psLP->transition_frame_no < TRANSITION_FRAMES_UP ) {
+ /* Calculate index and interpolation factor for interpolation */
+#if( TRANSITION_INT_STEPS_UP == 64 )
+ fac_Q16 = SKP_LSHIFT( TRANSITION_FRAMES_UP - psLP->transition_frame_no, 16 - 6 );
+#else
+ fac_Q16 = SKP_DIV32_16( SKP_LSHIFT( TRANSITION_FRAMES_UP - psLP->transition_frame_no, 16 ), TRANSITION_INT_STEPS_UP );
+#endif
+ ind = SKP_RSHIFT( fac_Q16, 16 );
+ fac_Q16 -= SKP_LSHIFT( ind, 16 );
+
+ SKP_assert( ind >= 0 );
+ SKP_assert( ind < TRANSITION_INT_NUM );
+
+ /* Interpolate filter coefficients */
+ SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 );
+
+ /* Increment transition frame number for next frame */
+ psLP->transition_frame_no++;
+
+ } else {
+ SKP_assert( psLP->transition_frame_no == TRANSITION_FRAMES_UP );
+ /* End of transition phase */
+ SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, 0, 0 );
+ }
+ }
+ }
+
+ if( psLP->transition_frame_no > 0 ) {
+ /* ARMA low-pass filtering */
+ SKP_assert( TRANSITION_NB == 3 && TRANSITION_NA == 2 );
+ SKP_Silk_biquad_alt( in, B_Q28, A_Q28, psLP->In_LP_State, out, frame_length );
+ } else {
+ /* Instead of using the filter, copy input directly to output */
+ SKP_memcpy( out, in, frame_length * sizeof( SKP_int16 ) );
+ }
+}
+#endif
--- /dev/null
+++ b/src_common/SKP_Silk_NLSF2A_stable.c
@@ -1,0 +1,57 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Convert NLSF parameters to stable AR prediction filter coefficients */
+void SKP_Silk_NLSF2A_stable(
+ SKP_int16 pAR_Q12[ MAX_LPC_ORDER ], /* O Stabilized AR coefs [LPC_order] */
+ const SKP_int pNLSF[ MAX_LPC_ORDER ], /* I NLSF vector [LPC_order] */
+ const SKP_int LPC_order /* I LPC/LSF order */
+)
+{
+ SKP_int i;
+ SKP_int32 invGain_Q30;
+
+ SKP_Silk_NLSF2A( pAR_Q12, pNLSF, LPC_order );
+
+ /* Ensure stable LPCs */
+ for( i = 0; i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) {
+ if( SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, pAR_Q12, LPC_order ) == 1 ) {
+ SKP_Silk_bwexpander( pAR_Q12, LPC_order, 65536 - SKP_SMULBB( 66, i ) ); /* 66_Q16 = 0.001 */
+ } else {
+ break;
+ }
+ }
+
+ /* Reached the last iteration */
+ if( i == MAX_LPC_STABILIZE_ITERATIONS ) {
+ for( i = 0; i < LPC_order; i++ ) {
+ pAR_Q12[ i ] = 0;
+ }
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_NLSF_MSVQ_decode.c
@@ -1,0 +1,91 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* NLSF vector decoder */
+void SKP_Silk_NLSF_MSVQ_decode(
+ SKP_int *pNLSF_Q15, /* O Pointer to decoded output vector [LPC_ORDER x 1] */
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Pointer to NLSF codebook struct */
+ const SKP_int *NLSFIndices, /* I Pointer to NLSF indices [nStages x 1] */
+ const SKP_int LPC_order /* I LPC order used */
+)
+{
+ const SKP_int16 *pCB_element;
+ SKP_int s;
+ SKP_int i;
+
+ /* Check that each index is within valid range */
+ SKP_assert( 0 <= NLSFIndices[ 0 ] && NLSFIndices[ 0 ] < psNLSF_CB->CBStages[ 0 ].nVectors );
+
+ /* Point to the first vector element */
+ pCB_element = &psNLSF_CB->CBStages[ 0 ].CB_NLSF_Q15[ SKP_MUL( NLSFIndices[ 0 ], LPC_order ) ];
+
+ /* Initialize with the codebook vector from stage 0 */
+ for( i = 0; i < LPC_order; i++ ) {
+ pNLSF_Q15[ i ] = ( SKP_int )pCB_element[ i ];
+ }
+
+ for( s = 1; s < psNLSF_CB->nStages; s++ ) {
+ /* Check that each index is within valid range */
+ SKP_assert( 0 <= NLSFIndices[ s ] && NLSFIndices[ s ] < psNLSF_CB->CBStages[ s ].nVectors );
+
+ if( LPC_order == 16 ) {
+ /* Point to the first vector element */
+ pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q15[ SKP_LSHIFT( NLSFIndices[ s ], 4 ) ];
+
+ /* Add the codebook vector from the current stage */
+ pNLSF_Q15[ 0 ] += pCB_element[ 0 ];
+ pNLSF_Q15[ 1 ] += pCB_element[ 1 ];
+ pNLSF_Q15[ 2 ] += pCB_element[ 2 ];
+ pNLSF_Q15[ 3 ] += pCB_element[ 3 ];
+ pNLSF_Q15[ 4 ] += pCB_element[ 4 ];
+ pNLSF_Q15[ 5 ] += pCB_element[ 5 ];
+ pNLSF_Q15[ 6 ] += pCB_element[ 6 ];
+ pNLSF_Q15[ 7 ] += pCB_element[ 7 ];
+ pNLSF_Q15[ 8 ] += pCB_element[ 8 ];
+ pNLSF_Q15[ 9 ] += pCB_element[ 9 ];
+ pNLSF_Q15[ 10 ] += pCB_element[ 10 ];
+ pNLSF_Q15[ 11 ] += pCB_element[ 11 ];
+ pNLSF_Q15[ 12 ] += pCB_element[ 12 ];
+ pNLSF_Q15[ 13 ] += pCB_element[ 13 ];
+ pNLSF_Q15[ 14 ] += pCB_element[ 14 ];
+ pNLSF_Q15[ 15 ] += pCB_element[ 15 ];
+ } else {
+ /* Point to the first vector element */
+ pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q15[ SKP_SMULBB( NLSFIndices[ s ], LPC_order ) ];
+
+ /* Add the codebook vector from the current stage */
+ for( i = 0; i < LPC_order; i++ ) {
+ pNLSF_Q15[ i ] += pCB_element[ i ];
+ }
+ }
+ }
+
+ /* NLSF stabilization */
+ SKP_Silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->NDeltaMin_Q15, LPC_order );
+}
--- /dev/null
+++ b/src_common/SKP_Silk_NSQ.c
@@ -1,0 +1,468 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+SKP_INLINE void SKP_Silk_nsq_scale_states(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ const SKP_int16 x[], /* I input in Q0 */
+ SKP_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
+ SKP_int length, /* I length of input */
+ SKP_int16 sLTP[], /* I re-whitened LTP state in Q0 */
+ SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
+ SKP_int subfr, /* I subframe number */
+ const SKP_int LTP_scale_Q14, /* I */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int pitchL[ MAX_NB_SUBFR ] /* I */
+);
+
+SKP_INLINE void SKP_Silk_noise_shape_quantizer(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ SKP_int sigtype, /* I Signal type */
+ const SKP_int32 x_sc_Q10[], /* I */
+ SKP_int8 q[], /* O */
+ SKP_int16 xq[], /* O */
+ SKP_int32 sLTP_Q16[], /* I/O LTP state */
+ const SKP_int16 a_Q12[], /* I Short term prediction coefs */
+ const SKP_int16 b_Q14[], /* I Long term prediction coefs */
+ const SKP_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
+ SKP_int lag, /* I Pitch lag */
+ SKP_int32 HarmShapeFIRPacked_Q14, /* I */
+ SKP_int Tilt_Q14, /* I Spectral tilt */
+ SKP_int32 LF_shp_Q14, /* I */
+ SKP_int32 Gain_Q16, /* I */
+ SKP_int Lambda_Q10, /* I */
+ SKP_int offset_Q10, /* I */
+ SKP_int length, /* I Input length */
+ SKP_int shapingLPCOrder, /* I Noise shaping AR filter order */
+ SKP_int predictLPCOrder, /* I Prediction filter order */
+ SKP_int32 warping_Q16 /* I */
+#ifdef SAVE_ALL_INTERNAL_DATA
+ ,SKP_float q_in_env[], /* O */
+ SKP_float q_exc[], /* O */
+ SKP_float q_LPC_exc[], /* O */
+ SKP_float q_exc_prev[] /* O */
+#endif
+);
+
+void SKP_Silk_NSQ(
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
+ SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ const SKP_int16 x[], /* I prefiltered input signal */
+ SKP_int8 q[], /* O quantized qulse signal */
+ const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
+ const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefficients */
+ const SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefficients */
+ const SKP_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */
+ const SKP_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
+ const SKP_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Lambda_Q10, /* I */
+ const SKP_int LTP_scale_Q14 /* I LTP state scaling */
+)
+{
+ SKP_int k, lag, start_idx, subfr_length, LSF_interpolation_flag;
+ const SKP_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
+ SKP_int16 *pxq;
+ SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ];
+ SKP_int16 sLTP[ 2 * MAX_FRAME_LENGTH ];
+ SKP_int32 HarmShapeFIRPacked_Q14;
+ SKP_int offset_Q10;
+ SKP_int32 FiltState[ MAX_LPC_ORDER ];
+ SKP_int32 x_sc_Q10[ MAX_FRAME_LENGTH / MAX_NB_SUBFR ];
+#ifdef SAVE_ALL_INTERNAL_DATA
+ /* Date buffers for analysing */
+ SKP_float q_in_env_buf[ MAX_FRAME_LENGTH ];
+ SKP_float q_exc_buf[ MAX_FRAME_LENGTH ];
+ SKP_float q_LPC_exc_buf[ MAX_FRAME_LENGTH ];
+ SKP_float q_exc_prev_buf[ MAX_FRAME_LENGTH ];
+ SKP_float *q_in_env, *q_exc, *q_LPC_exc, *q_exc_prev;
+
+ q_in_env = q_in_env_buf;
+ q_exc = q_exc_buf;
+ q_LPC_exc = q_LPC_exc_buf;
+ q_exc_prev = q_exc_prev_buf;
+#endif
+
+ subfr_length = psEncC->frame_length / MAX_NB_SUBFR;
+
+ NSQ->rand_seed = psEncCtrlC->Seed;
+ /* Set unvoiced lag to the previous one, overwrite later for voiced */
+ lag = NSQ->lagPrev;
+
+ offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrlC->sigtype ][ psEncCtrlC->QuantOffsetType ];
+
+ if( LSFInterpFactor_Q2 == ( 1 << 2 ) ) {
+ LSF_interpolation_flag = 0;
+ } else {
+ LSF_interpolation_flag = 1;
+ }
+
+ /* Setup pointers to start of sub frame */
+ NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
+ NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
+ pxq = &NSQ->xq[ psEncC->ltp_mem_length ];
+ for( k = 0; k < psEncC->nb_subfr; k++ ) {
+ A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ];
+ B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
+ AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ];
+
+ /* Noise shape parameters */
+ SKP_assert( HarmShapeGain_Q14[ k ] >= 0 );
+ HarmShapeFIRPacked_Q14 = SKP_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
+ HarmShapeFIRPacked_Q14 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
+
+ if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
+ /* Voiced */
+ lag = psEncCtrlC->pitchL[ k ];
+
+ NSQ->rewhite_flag = 0;
+ /* Re-whitening */
+ if( ( k & ( 3 - SKP_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
+ /* Rewhiten with new A coefs */
+
+ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
+ start_idx = SKP_LIMIT_int( start_idx, 0, psEncC->ltp_mem_length - psEncC->predictLPCOrder ); /* Limit */
+
+ SKP_memset( FiltState, 0, psEncC->predictLPCOrder * sizeof( SKP_int32 ) );
+ SKP_Silk_MA_Prediction( &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
+ A_Q12, FiltState, sLTP + start_idx, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder );
+
+ NSQ->rewhite_flag = 1;
+ NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
+ }
+ }
+
+ SKP_Silk_nsq_scale_states( NSQ, x, x_sc_Q10, psEncC->subfr_length, sLTP,
+ sLTP_Q16, k, LTP_scale_Q14, Gains_Q16, psEncCtrlC->pitchL );
+
+ SKP_Silk_noise_shape_quantizer( NSQ, psEncCtrlC->sigtype, x_sc_Q10, q, pxq, sLTP_Q16, A_Q12, B_Q14,
+ AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10,
+ offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncCtrlC->warping_Q16
+#ifdef SAVE_ALL_INTERNAL_DATA
+ , q_in_env, q_exc, q_LPC_exc, q_exc_prev
+#endif
+ );
+
+ x += psEncC->subfr_length;
+ q += psEncC->subfr_length;
+ pxq += psEncC->subfr_length;
+#ifdef SAVE_ALL_INTERNAL_DATA
+ q_in_env += psEncC->subfr_length;
+ q_exc += psEncC->subfr_length;
+ q_LPC_exc += psEncC->subfr_length;
+ q_exc_prev += subfr_length;
+#endif
+ }
+
+ /* Update lagPrev for next frame */
+ NSQ->lagPrev = psEncCtrlC->pitchL[ psEncC->nb_subfr - 1 ];
+ /* Save quantized speech and noise shaping signals */
+ SKP_memcpy( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( SKP_int16 ) );
+ SKP_memcpy( NSQ->sLTP_shp_Q10, &NSQ->sLTP_shp_Q10[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( SKP_int32 ) );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( q_in_env.dat, q_in_env_buf, psEncC->frame_length * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( q_exc.dat, q_exc_buf, psEncC->frame_length * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( q_lpc_exc.dat, q_LPC_exc_buf, psEncC->frame_length * sizeof( SKP_float ) );
+ DEBUG_STORE_DATA( xq.dat, &NSQ->xq[ psEncC->ltp_mem_length - psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int16 ) );
+ DEBUG_STORE_DATA( q.dat, &q[ -psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int8 ) );
+#endif
+}
+
+/***********************************/
+/* SKP_Silk_noise_shape_quantizer */
+/***********************************/
+SKP_INLINE void SKP_Silk_noise_shape_quantizer(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ SKP_int sigtype, /* I Signal type */
+ const SKP_int32 x_sc_Q10[], /* I */
+ SKP_int8 q[], /* O */
+ SKP_int16 xq[], /* O */
+ SKP_int32 sLTP_Q16[], /* I/O LTP state */
+ const SKP_int16 a_Q12[], /* I Short term prediction coefs */
+ const SKP_int16 b_Q14[], /* I Long term prediction coefs */
+ const SKP_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
+ SKP_int lag, /* I Pitch lag */
+ SKP_int32 HarmShapeFIRPacked_Q14, /* I */
+ SKP_int Tilt_Q14, /* I Spectral tilt */
+ SKP_int32 LF_shp_Q14, /* I */
+ SKP_int32 Gain_Q16, /* I */
+ SKP_int Lambda_Q10, /* I */
+ SKP_int offset_Q10, /* I */
+ SKP_int length, /* I Input length */
+ SKP_int shapingLPCOrder, /* I Noise shaping AR filter order */
+ SKP_int predictLPCOrder, /* I Prediction filter order */
+ SKP_int warping_Q16 /* I */
+#ifdef SAVE_ALL_INTERNAL_DATA
+ ,SKP_float q_in_env[], /* O */
+ SKP_float q_exc[], /* O */
+ SKP_float q_LPC_exc[], /* O */
+ SKP_float q_exc_prev[] /* O */
+#endif
+)
+{
+ SKP_int i, j;
+ SKP_int32 LTP_pred_Q14, LPC_pred_Q10, n_AR_Q10, n_LTP_Q14;
+ SKP_int32 n_LF_Q10, r_Q10, q_Q0, q_Q10;
+ SKP_int32 thr1_Q10, thr2_Q10, thr3_Q10;
+ SKP_int32 dither, exc_Q10, LPC_exc_Q10, xq_Q10;
+ SKP_int32 tmp1, tmp2, sLF_AR_shp_Q10;
+ SKP_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr;
+
+ shp_lag_ptr = &NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
+ pred_lag_ptr = &sLTP_Q16[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
+
+ /* Setup short term AR state */
+ psLPC_Q14 = &NSQ->sLPC_Q14[ MAX_LPC_ORDER - 1 ];
+
+ /* Quantization thresholds */
+ thr1_Q10 = SKP_SUB_RSHIFT32( -1536, Lambda_Q10, 1);
+ thr2_Q10 = SKP_SUB_RSHIFT32( -512, Lambda_Q10, 1);
+ thr2_Q10 = SKP_ADD_RSHIFT32( thr2_Q10, SKP_SMULBB( offset_Q10, Lambda_Q10 ), 10 );
+ thr3_Q10 = SKP_ADD_RSHIFT32( 512, Lambda_Q10, 1);
+
+ for( i = 0; i < length; i++ ) {
+ /* Generate dither */
+ NSQ->rand_seed = SKP_RAND( NSQ->rand_seed );
+
+ /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */
+ dither = SKP_RSHIFT( NSQ->rand_seed, 31 );
+
+ /* Short-term prediction */
+ SKP_assert( ( predictLPCOrder & 1 ) == 0 ); /* check that order is even */
+ SKP_assert( ( (SKP_int64)a_Q12 & 3 ) == 0 ); /* check that array starts at 4-byte aligned address */
+ SKP_assert( predictLPCOrder >= 10 ); /* check that unrolling works */
+
+ /* Partially unrolled */
+ LPC_pred_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], a_Q12[ 0 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -1 ], a_Q12[ 1 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], a_Q12[ 2 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -3 ], a_Q12[ 3 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], a_Q12[ 4 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -5 ], a_Q12[ 5 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], a_Q12[ 6 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -7 ], a_Q12[ 7 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], a_Q12[ 8 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -9 ], a_Q12[ 9 ] );
+
+ for( j = 10; j < predictLPCOrder; j ++ ) {
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -j ], a_Q12[ j ] );
+ }
+
+ /* Long-term prediction */
+ if( sigtype == SIG_TYPE_VOICED ) {
+ /* Unrolled loop */
+ LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], b_Q14[ 0 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
+ pred_lag_ptr++;
+ } else {
+ LTP_pred_Q14 = 0;
+ }
+
+ /* Noise shape feedback */
+ SKP_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */
+ /* Output of lowpass section */
+ tmp2 = SKP_SMLAWB( psLPC_Q14[ 0 ], NSQ->sAR2_Q14[ 0 ], warping_Q16 );
+ /* Output of allpass section */
+ tmp1 = SKP_SMLAWB( NSQ->sAR2_Q14[ 0 ], NSQ->sAR2_Q14[ 1 ] - tmp2, warping_Q16 );
+ NSQ->sAR2_Q14[ 0 ] = tmp2;
+ n_AR_Q10 = SKP_SMULWB( tmp2, AR_shp_Q13[ 0 ] );
+ /* Loop over allpass sections */
+ for( j = 2; j < shapingLPCOrder; j += 2 ) {
+ /* Output of allpass section */
+ tmp2 = SKP_SMLAWB( NSQ->sAR2_Q14[ j - 1 ], NSQ->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 );
+ NSQ->sAR2_Q14[ j - 1 ] = tmp1;
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ j - 1 ] );
+ /* Output of allpass section */
+ tmp1 = SKP_SMLAWB( NSQ->sAR2_Q14[ j + 0 ], NSQ->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 );
+ NSQ->sAR2_Q14[ j + 0 ] = tmp2;
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp2, AR_shp_Q13[ j ] );
+ }
+ NSQ->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1;
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] );
+
+ n_AR_Q10 = SKP_RSHIFT( n_AR_Q10, 1 ); /* Q11 -> Q10 */
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, NSQ->sLF_AR_shp_Q12, Tilt_Q14 );
+
+ n_LF_Q10 = SKP_LSHIFT( SKP_SMULWB( NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ), 2 );
+ n_LF_Q10 = SKP_SMLAWT( n_LF_Q10, NSQ->sLF_AR_shp_Q12, LF_shp_Q14 );
+
+ SKP_assert( lag > 0 || sigtype == SIG_TYPE_UNVOICED );
+
+ /* Long-term shaping */
+ if( lag > 0 ) {
+ /* Symmetric, packed FIR coefficients */
+ n_LTP_Q14 = SKP_SMULWB( SKP_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
+ n_LTP_Q14 = SKP_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
+ shp_lag_ptr++;
+ n_LTP_Q14 = SKP_LSHIFT( n_LTP_Q14, 6 );
+ } else {
+ n_LTP_Q14 = 0;
+ }
+
+ /* Input minus prediction plus noise feedback */
+ //r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP;
+ tmp1 = SKP_SUB32( LTP_pred_Q14, n_LTP_Q14 ); /* Add Q14 stuff */
+ tmp1 = SKP_RSHIFT( tmp1, 4 ); /* convert to Q10 */
+ tmp1 = SKP_ADD32( tmp1, LPC_pred_Q10 ); /* add Q10 stuff */
+ tmp1 = SKP_SUB32( tmp1, n_AR_Q10 ); /* subtract Q10 stuff */
+ tmp1 = SKP_SUB32( tmp1, n_LF_Q10 ); /* subtract Q10 stuff */
+ r_Q10 = SKP_SUB32( x_sc_Q10[ i ], tmp1 );
+
+ /* Flip sign depending on dither */
+ r_Q10 = ( r_Q10 ^ dither ) - dither;
+ r_Q10 = SKP_SUB32( r_Q10, offset_Q10 );
+ r_Q10 = SKP_LIMIT_32( r_Q10, -64 << 10, 64 << 10 );
+
+ /* Quantize */
+ if( r_Q10 < thr1_Q10 ) {
+ q_Q0 = SKP_RSHIFT_ROUND( SKP_ADD_RSHIFT32( r_Q10, Lambda_Q10, 1 ), 10 );
+ q_Q10 = SKP_LSHIFT( q_Q0, 10 );
+ } else if( r_Q10 < thr2_Q10 ) {
+ q_Q0 = -1;
+ q_Q10 = -1024;
+ } else if( r_Q10 > thr3_Q10 ) {
+ q_Q0 = SKP_RSHIFT_ROUND( SKP_SUB_RSHIFT32( r_Q10, Lambda_Q10, 1 ), 10 );
+ q_Q10 = SKP_LSHIFT( q_Q0, 10 );
+ } else {
+ q_Q0 = 0;
+ q_Q10 = 0;
+ }
+ q[ i ] = ( SKP_int8 )q_Q0; /* No saturation needed because max is 64 */
+
+ /* Excitation */
+ exc_Q10 = SKP_ADD32( q_Q10, offset_Q10 );
+ exc_Q10 = ( exc_Q10 ^ dither ) - dither;
+
+ /* Add predictions */
+ LPC_exc_Q10 = SKP_ADD32( exc_Q10, SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) );
+ xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 );
+
+ /* Scale XQ back to normal level before saving */
+ xq[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( xq_Q10, Gain_Q16 ), 10 ) );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ q_in_env[ i ] = ( (SKP_float)r_Q10 * (SKP_float)Gain_Q16 ) / ( 1024.0f * 65536.0f );
+ q_exc[ i ] = ( (SKP_float)exc_Q10 * (SKP_float)Gain_Q16 ) / ( 1024.0f * 65536.0f );
+ q_LPC_exc[ i ] = ( (SKP_float)LPC_exc_Q10 * (SKP_float)Gain_Q16 ) / ( 1024.0f * 65536.0f );
+#endif
+
+ /* Update states */
+ psLPC_Q14++;
+ *psLPC_Q14 = SKP_LSHIFT( xq_Q10, 4 );
+ sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 );
+ NSQ->sLF_AR_shp_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 );
+
+ NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx ] = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 );
+ sLTP_Q16[ NSQ->sLTP_buf_idx ] = SKP_LSHIFT( LPC_exc_Q10, 6 );
+ NSQ->sLTP_shp_buf_idx++;
+ NSQ->sLTP_buf_idx++;
+
+ /* Make dither dependent on quantized signal */
+ NSQ->rand_seed += q[ i ];
+ }
+ /* Update LPC synth buffer */
+ SKP_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) );
+}
+
+SKP_INLINE void SKP_Silk_nsq_scale_states(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ const SKP_int16 x[], /* I input in Q0 */
+ SKP_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
+ SKP_int length, /* I length of input */
+ SKP_int16 sLTP[], /* I re-whitened LTP state in Q0 */
+ SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
+ SKP_int subfr, /* I subframe number */
+ const SKP_int LTP_scale_Q14, /* I */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int pitchL[ MAX_NB_SUBFR ] /* I */
+)
+{
+ SKP_int i, scale_length, lag;
+ SKP_int32 inv_gain_Q16, gain_adj_Q16, inv_gain_Q32;
+
+ inv_gain_Q16 = SKP_INVERSE32_varQ( SKP_max( Gains_Q16[ subfr ], 1 ), 32 );
+ inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX );
+ lag = pitchL[ subfr ];
+
+ /* After rewhitening the LTP state is un-scaled */
+ if( NSQ->rewhite_flag ) {
+ inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 );
+ if( subfr == 0 ) {
+ /* Do LTP downscaling */
+ inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, LTP_scale_Q14 ), 2 );
+ }
+ for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
+ sLTP_Q16[ i ] = SKP_SMULWB( inv_gain_Q32, sLTP[ i ] );
+ }
+ }
+
+ /* Prepare for Worst case. Next frame starts with max lag voiced */
+ scale_length = length * MAX_NB_SUBFR; /* approx max lag */
+ scale_length = scale_length - SKP_SMULBB( MAX_NB_SUBFR - (subfr + 1), length ); /* subtract samples that will be too old in next frame */
+ scale_length = SKP_max_int( scale_length, lag + LTP_ORDER ); /* make sure to scale whole pitch period if voiced */
+
+ /* Adjust for changing gain */
+ if( inv_gain_Q16 != NSQ->prev_inv_gain_Q16 ) {
+ gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, NSQ->prev_inv_gain_Q16, 16 );
+
+ for( i = NSQ->sLTP_shp_buf_idx - scale_length; i < NSQ->sLTP_shp_buf_idx; i++ ) {
+ NSQ->sLTP_shp_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q10[ i ] );
+ }
+
+ /* Scale LTP predict state */
+ if( NSQ->rewhite_flag == 0 ) {
+ for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
+ sLTP_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, sLTP_Q16[ i ] );
+ }
+ }
+ NSQ->sLF_AR_shp_Q12 = SKP_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q12 );
+
+ /* scale short term state */
+ for( i = 0; i < MAX_LPC_ORDER; i++ ) {
+ NSQ->sLPC_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] );
+ }
+ for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
+ NSQ->sAR2_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] );
+ }
+ }
+
+ /* Scale input */
+ for( i = 0; i < length; i++ ) {
+ x_sc_Q10[ i ] = SKP_RSHIFT( SKP_SMULBB( x[ i ], ( SKP_int16 )inv_gain_Q16 ), 6 );
+ }
+
+ /* save inv_gain */
+ SKP_assert( inv_gain_Q16 != 0 );
+ NSQ->prev_inv_gain_Q16 = inv_gain_Q16;
+}
\ No newline at end of file
--- /dev/null
+++ b/src_common/SKP_Silk_NSQ_del_dec.c
@@ -1,0 +1,702 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+typedef struct {
+ SKP_int32 RandState[ DECISION_DELAY ];
+ SKP_int32 Q_Q10[ DECISION_DELAY ];
+ SKP_int32 Xq_Q10[ DECISION_DELAY ];
+ SKP_int32 Pred_Q16[ DECISION_DELAY ];
+ SKP_int32 Shape_Q10[ DECISION_DELAY ];
+ SKP_int32 Gain_Q16[ DECISION_DELAY ];
+ SKP_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ];
+ SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / MAX_NB_SUBFR + NSQ_LPC_BUF_LENGTH ];
+ SKP_int32 LF_AR_Q12;
+ SKP_int32 Seed;
+ SKP_int32 SeedInit;
+ SKP_int32 RD_Q10;
+} NSQ_del_dec_struct;
+
+typedef struct {
+ SKP_int32 Q_Q10;
+ SKP_int32 RD_Q10;
+ SKP_int32 xq_Q14;
+ SKP_int32 LF_AR_Q12;
+ SKP_int32 sLTP_shp_Q10;
+ SKP_int32 LPC_exc_Q16;
+} NSQ_sample_struct;
+
+SKP_INLINE void SKP_Silk_copy_del_dec_state(
+ NSQ_del_dec_struct *DD_dst, /* I Dst del dec state */
+ NSQ_del_dec_struct *DD_src, /* I Src del dec state */
+ SKP_int LPC_state_idx /* I Index to LPC buffer */
+);
+
+SKP_INLINE void SKP_Silk_nsq_del_dec_scale_states(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
+ const SKP_int16 x[], /* I Input in Q0 */
+ SKP_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
+ SKP_int length, /* I Length of input */
+ SKP_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
+ SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
+ SKP_int subfr, /* I Subframe number */
+ SKP_int nStatesDelayedDecision, /* I Number of del dec states */
+ SKP_int smpl_buf_idx, /* I Index to newest samples in buffers */
+ const SKP_int LTP_scale_Q14, /* I LTP state scaling */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int pitchL[ MAX_NB_SUBFR ] /* I Pitch lag */
+);
+
+/******************************************/
+/* Noise shape quantizer for one subframe */
+/******************************************/
+SKP_INLINE void SKP_Silk_noise_shape_quantizer_del_dec(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
+ SKP_int sigtype, /* I Signal type */
+ const SKP_int32 x_Q10[], /* I */
+ SKP_int8 q[], /* O */
+ SKP_int16 xq[], /* O */
+ SKP_int32 sLTP_Q16[], /* I/O LTP filter state */
+ const SKP_int16 a_Q12[], /* I Short term prediction coefs */
+ const SKP_int16 b_Q14[], /* I Long term prediction coefs */
+ const SKP_int16 AR_shp_Q13[], /* I Noise shaping coefs */
+ SKP_int lag, /* I Pitch lag */
+ SKP_int32 HarmShapeFIRPacked_Q14, /* I */
+ SKP_int Tilt_Q14, /* I Spectral tilt */
+ SKP_int32 LF_shp_Q14, /* I */
+ SKP_int32 Gain_Q16, /* I */
+ SKP_int Lambda_Q10, /* I */
+ SKP_int offset_Q10, /* I */
+ SKP_int length, /* I Input length */
+ SKP_int subfr, /* I Subframe number */
+ SKP_int shapingLPCOrder, /* I Shaping LPC filter order */
+ SKP_int predictLPCOrder, /* I Prediction filter order */
+ SKP_int warping_Q16, /* I */
+ SKP_int nStatesDelayedDecision, /* I Number of states in decision tree */
+ SKP_int *smpl_buf_idx, /* I Index to newest samples in buffers */
+ SKP_int decisionDelay /* I */
+);
+
+void SKP_Silk_NSQ_del_dec(
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
+ SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ const SKP_int16 x[], /* I Prefiltered input signal */
+ SKP_int8 q[], /* O Quantized pulse signal */
+ const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
+ const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Prediction coefs */
+ const SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I LT prediction coefs */
+ const SKP_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */
+ const SKP_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
+ const SKP_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Lambda_Q10, /* I */
+ const SKP_int LTP_scale_Q14 /* I LTP state scaling */
+)
+{
+ SKP_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
+ SKP_int last_smple_idx, smpl_buf_idx, decisionDelay, subfr_length;
+ const SKP_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
+ SKP_int16 *pxq;
+ SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ];
+ SKP_int16 sLTP[ 2 * MAX_FRAME_LENGTH ];
+ SKP_int32 HarmShapeFIRPacked_Q14;
+ SKP_int offset_Q10;
+ SKP_int32 FiltState[ MAX_LPC_ORDER ], RDmin_Q10;
+ SKP_int32 x_sc_Q10[ MAX_SUB_FRAME_LENGTH ];
+ NSQ_del_dec_struct psDelDec[ MAX_DEL_DEC_STATES ];
+ NSQ_del_dec_struct *psDD;
+
+ subfr_length = psEncC->subfr_length;
+
+ /* Set unvoiced lag to the previous one, overwrite later for voiced */
+ lag = NSQ->lagPrev;
+
+ SKP_assert( NSQ->prev_inv_gain_Q16 != 0 );
+
+ /* Initialize delayed decision states */
+ SKP_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) );
+ for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) {
+ psDD = &psDelDec[ k ];
+ psDD->Seed = ( k + psEncCtrlC->Seed ) & 3;
+ psDD->SeedInit = psDD->Seed;
+ psDD->RD_Q10 = 0;
+ psDD->LF_AR_Q12 = NSQ->sLF_AR_shp_Q12;
+ psDD->Shape_Q10[ 0 ] = NSQ->sLTP_shp_Q10[ psEncC->ltp_mem_length - 1 ];
+ SKP_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
+ SKP_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) );
+ }
+
+ offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrlC->sigtype ][ psEncCtrlC->QuantOffsetType ];
+ smpl_buf_idx = 0; /* index of oldest samples */
+
+ decisionDelay = SKP_min_int( DECISION_DELAY, subfr_length );
+ /* For voiced frames limit the decision delay to lower than the pitch lag */
+ if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
+ for( k = 0; k < psEncC->nb_subfr; k++ ) {
+ decisionDelay = SKP_min_int( decisionDelay, psEncCtrlC->pitchL[ k ] - LTP_ORDER / 2 - 1 );
+ }
+ }
+
+ if( LSFInterpFactor_Q2 == ( 1 << 2 ) ) {
+ LSF_interpolation_flag = 0;
+ } else {
+ LSF_interpolation_flag = 1;
+ }
+
+ /* Setup pointers to start of sub frame */
+ pxq = &NSQ->xq[ psEncC->ltp_mem_length ];
+ NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
+ NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
+ subfr = 0;
+ for( k = 0; k < psEncC->nb_subfr; k++ ) {
+ A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ];
+ B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
+ AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ];
+
+ NSQ->rewhite_flag = 0;
+ if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
+ /* Voiced */
+ lag = psEncCtrlC->pitchL[ k ];
+
+ /* Re-whitening */
+ if( ( k & ( 3 - SKP_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
+ if( k == 2 ) {
+ /* RESET DELAYED DECISIONS */
+ /* Find winner */
+ RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
+ Winner_ind = 0;
+ for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) {
+ if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) {
+ RDmin_Q10 = psDelDec[ i ].RD_Q10;
+ Winner_ind = i;
+ }
+ }
+ for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) {
+ if( i != Winner_ind ) {
+ psDelDec[ i ].RD_Q10 += ( SKP_int32_MAX >> 4 );
+ SKP_assert( psDelDec[ i ].RD_Q10 >= 0 );
+ }
+ }
+
+ /* Copy final part of signals from winner state to output and long-term filter states */
+ psDD = &psDelDec[ Winner_ind ];
+ last_smple_idx = smpl_buf_idx + decisionDelay;
+ for( i = 0; i < decisionDelay; i++ ) {
+ last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK;
+ q[ i - decisionDelay ] = ( SKP_int )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 );
+ pxq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND(
+ SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ],
+ psDD->Gain_Q16[ last_smple_idx ] ), 10 ) );
+ NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q10[ last_smple_idx ];
+ }
+
+ subfr = 0;
+ }
+
+ /* Rewhiten with new A coefs */
+ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
+ start_idx = SKP_LIMIT_int( start_idx, 0, psEncC->ltp_mem_length - psEncC->predictLPCOrder );
+
+ SKP_memset( FiltState, 0, psEncC->predictLPCOrder * sizeof( SKP_int32 ) );
+ SKP_Silk_MA_Prediction( &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
+ A_Q12, FiltState, sLTP + start_idx, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder );
+
+ NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
+ NSQ->rewhite_flag = 1;
+ }
+ }
+
+ /* Noise shape parameters */
+ SKP_assert( HarmShapeGain_Q14[ k ] >= 0 );
+ HarmShapeFIRPacked_Q14 = SKP_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
+ HarmShapeFIRPacked_Q14 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
+
+ SKP_Silk_nsq_del_dec_scale_states( NSQ, psDelDec, x, x_sc_Q10,
+ subfr_length, sLTP, sLTP_Q16, k, psEncC->nStatesDelayedDecision, smpl_buf_idx,
+ LTP_scale_Q14, Gains_Q16, psEncCtrlC->pitchL );
+
+ SKP_Silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psEncCtrlC->sigtype, x_sc_Q10, q, pxq, sLTP_Q16,
+ A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ],
+ Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, psEncC->predictLPCOrder,
+ psEncCtrlC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay );
+
+ x += psEncC->subfr_length;
+ q += psEncC->subfr_length;
+ pxq += psEncC->subfr_length;
+ }
+
+ /* Find winner */
+ RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
+ Winner_ind = 0;
+ for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) {
+ if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) {
+ RDmin_Q10 = psDelDec[ k ].RD_Q10;
+ Winner_ind = k;
+ }
+ }
+
+ /* Copy final part of signals from winner state to output and long-term filter states */
+ psDD = &psDelDec[ Winner_ind ];
+ psEncCtrlC->Seed = psDD->SeedInit;
+ last_smple_idx = smpl_buf_idx + decisionDelay;
+ for( i = 0; i < decisionDelay; i++ ) {
+ last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK;
+ q[ i - decisionDelay ] = ( SKP_int8 )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 );
+ pxq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND(
+ SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ], psDD->Gain_Q16[ last_smple_idx ] ), 10 ) );
+ NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q10[ last_smple_idx ];
+ sLTP_Q16[ NSQ->sLTP_buf_idx - decisionDelay + i ] = psDD->Pred_Q16[ last_smple_idx ];
+ }
+ SKP_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
+ SKP_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) );
+
+ /* Update states */
+ NSQ->sLF_AR_shp_Q12 = psDD->LF_AR_Q12;
+ NSQ->lagPrev = psEncCtrlC->pitchL[ psEncC->nb_subfr - 1 ];
+
+ /* Save quantized speech and noise shaping signals */
+ SKP_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( SKP_int16 ) );
+ SKP_memmove( NSQ->sLTP_shp_Q10, &NSQ->sLTP_shp_Q10[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( SKP_int32 ) );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( sLTP_Q16, &sLTP_Q16[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int32 ) );
+ DEBUG_STORE_DATA( xq.dat, &NSQ->xq[ psEncC->ltp_mem_length - psEncC->frame_length], psEncC->frame_length * sizeof( SKP_int16 ) );
+#endif
+}
+
+/******************************************/
+/* Noise shape quantizer for one subframe */
+/******************************************/
+SKP_INLINE void SKP_Silk_noise_shape_quantizer_del_dec(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
+ SKP_int sigtype, /* I Signal type */
+ const SKP_int32 x_Q10[], /* I */
+ SKP_int8 q[], /* O */
+ SKP_int16 xq[], /* O */
+ SKP_int32 sLTP_Q16[], /* I/O LTP filter state */
+ const SKP_int16 a_Q12[], /* I Short term prediction coefs */
+ const SKP_int16 b_Q14[], /* I Long term prediction coefs */
+ const SKP_int16 AR_shp_Q13[], /* I Noise shaping coefs */
+ SKP_int lag, /* I Pitch lag */
+ SKP_int32 HarmShapeFIRPacked_Q14, /* I */
+ SKP_int Tilt_Q14, /* I Spectral tilt */
+ SKP_int32 LF_shp_Q14, /* I */
+ SKP_int32 Gain_Q16, /* I */
+ SKP_int Lambda_Q10, /* I */
+ SKP_int offset_Q10, /* I */
+ SKP_int length, /* I Input length */
+ SKP_int subfr, /* I Subframe number */
+ SKP_int shapingLPCOrder, /* I Shaping LPC filter order */
+ SKP_int predictLPCOrder, /* I Prediction filter order */
+ SKP_int warping_Q16, /* I */
+ SKP_int nStatesDelayedDecision, /* I Number of states in decision tree */
+ SKP_int *smpl_buf_idx, /* I Index to newest samples in buffers */
+ SKP_int decisionDelay /* I */
+)
+{
+ SKP_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx;
+ SKP_int32 Winner_rand_state;
+ SKP_int32 LTP_pred_Q14, LPC_pred_Q10, n_AR_Q10, n_LTP_Q14;
+ SKP_int32 n_LF_Q10, r_Q10, rr_Q20, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10;
+ SKP_int32 q1_Q10, q2_Q10, dither, exc_Q10, LPC_exc_Q10, xq_Q10;
+ SKP_int32 tmp1, tmp2, sLF_AR_shp_Q10;
+ SKP_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14;
+ NSQ_sample_struct psSampleState[ MAX_DEL_DEC_STATES ][ 2 ];
+ NSQ_del_dec_struct *psDD;
+ NSQ_sample_struct *psSS;
+
+ shp_lag_ptr = &NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
+ pred_lag_ptr = &sLTP_Q16[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
+
+ for( i = 0; i < length; i++ ) {
+ /* Perform common calculations used in all states */
+
+ /* Long-term prediction */
+ if( sigtype == SIG_TYPE_VOICED ) {
+ /* Unrolled loop */
+ LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], b_Q14[ 0 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
+ pred_lag_ptr++;
+ } else {
+ LTP_pred_Q14 = 0;
+ }
+
+ /* Long-term shaping */
+ if( lag > 0 ) {
+ /* Symmetric, packed FIR coefficients */
+ n_LTP_Q14 = SKP_SMULWB( SKP_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
+ n_LTP_Q14 = SKP_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
+ n_LTP_Q14 = SKP_LSHIFT( n_LTP_Q14, 6 );
+ shp_lag_ptr++;
+ } else {
+ n_LTP_Q14 = 0;
+ }
+
+ for( k = 0; k < nStatesDelayedDecision; k++ ) {
+ /* Delayed decision state */
+ psDD = &psDelDec[ k ];
+
+ /* Sample state */
+ psSS = psSampleState[ k ];
+
+ /* Generate dither */
+ psDD->Seed = SKP_RAND( psDD->Seed );
+
+ /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */
+ dither = SKP_RSHIFT( psDD->Seed, 31 );
+
+ /* Pointer used in short term prediction and shaping */
+ psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ];
+ /* Short-term prediction */
+ SKP_assert( predictLPCOrder >= 10 ); /* check that unrolling works */
+ SKP_assert( ( predictLPCOrder & 1 ) == 0 ); /* check that order is even */
+ SKP_assert( ( (SKP_int64)a_Q12 & 3 ) == 0 ); /* check that array starts at 4-byte aligned address */
+ /* Partially unrolled */
+ LPC_pred_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], a_Q12[ 0 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -1 ], a_Q12[ 1 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], a_Q12[ 2 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -3 ], a_Q12[ 3 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], a_Q12[ 4 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -5 ], a_Q12[ 5 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], a_Q12[ 6 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -7 ], a_Q12[ 7 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], a_Q12[ 8 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -9 ], a_Q12[ 9 ] );
+ for( j = 10; j < predictLPCOrder; j ++ ) {
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -j ], a_Q12[ j ] );
+ }
+
+ /* Noise shape feedback */
+ SKP_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */
+ /* Output of lowpass section */
+ tmp2 = SKP_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 );
+ /* Output of allpass section */
+ tmp1 = SKP_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 );
+ psDD->sAR2_Q14[ 0 ] = tmp2;
+ n_AR_Q10 = SKP_SMULWB( tmp2, AR_shp_Q13[ 0 ] );
+ /* Loop over allpass sections */
+ for( j = 2; j < shapingLPCOrder; j += 2 ) {
+ /* Output of allpass section */
+ tmp2 = SKP_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 );
+ psDD->sAR2_Q14[ j - 1 ] = tmp1;
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ j - 1 ] );
+ /* Output of allpass section */
+ tmp1 = SKP_SMLAWB( psDD->sAR2_Q14[ j + 0 ], psDD->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 );
+ psDD->sAR2_Q14[ j + 0 ] = tmp2;
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp2, AR_shp_Q13[ j ] );
+ }
+ psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1;
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] );
+
+ n_AR_Q10 = SKP_RSHIFT( n_AR_Q10, 1 ); /* Q11 -> Q10 */
+ n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psDD->LF_AR_Q12, Tilt_Q14 );
+
+ n_LF_Q10 = SKP_LSHIFT( SKP_SMULWB( psDD->Shape_Q10[ *smpl_buf_idx ], LF_shp_Q14 ), 2 );
+ n_LF_Q10 = SKP_SMLAWT( n_LF_Q10, psDD->LF_AR_Q12, LF_shp_Q14 );
+
+ /* Input minus prediction plus noise feedback */
+ /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */
+ tmp1 = SKP_SUB32( LTP_pred_Q14, n_LTP_Q14 ); /* Add Q14 stuff */
+ tmp1 = SKP_RSHIFT( tmp1, 4 ); /* convert to Q10 */
+ tmp1 = SKP_ADD32( tmp1, LPC_pred_Q10 ); /* add Q10 stuff */
+ tmp1 = SKP_SUB32( tmp1, n_AR_Q10 ); /* subtract Q10 stuff */
+ tmp1 = SKP_SUB32( tmp1, n_LF_Q10 ); /* subtract Q10 stuff */
+ r_Q10 = SKP_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */
+
+ /* Flip sign depending on dither */
+ r_Q10 = ( r_Q10 ^ dither ) - dither;
+ r_Q10 = SKP_SUB32( r_Q10, offset_Q10 );
+ r_Q10 = SKP_LIMIT_32( r_Q10, -64 << 10, 64 << 10 );
+
+ /* Find two quantization level candidates and measure their rate-distortion */
+ if( r_Q10 < -1536 ) {
+ q1_Q10 = SKP_LSHIFT( SKP_RSHIFT_ROUND( r_Q10, 10 ), 10 );
+ r_Q10 = SKP_SUB32( r_Q10, q1_Q10 );
+ rd1_Q10 = SKP_RSHIFT( SKP_SMLABB( SKP_MUL( -SKP_ADD32( q1_Q10, offset_Q10 ), Lambda_Q10 ), r_Q10, r_Q10 ), 10 );
+ rd2_Q10 = SKP_ADD32( rd1_Q10, 1024 );
+ rd2_Q10 = SKP_SUB32( rd2_Q10, SKP_ADD_LSHIFT32( Lambda_Q10, r_Q10, 1 ) );
+ q2_Q10 = SKP_ADD32( q1_Q10, 1024 );
+ } else if( r_Q10 > 512 ) {
+ q1_Q10 = SKP_LSHIFT( SKP_RSHIFT_ROUND( r_Q10, 10 ), 10 );
+ r_Q10 = SKP_SUB32( r_Q10, q1_Q10 );
+ rd1_Q10 = SKP_RSHIFT( SKP_SMLABB( SKP_MUL( SKP_ADD32( q1_Q10, offset_Q10 ), Lambda_Q10 ), r_Q10, r_Q10 ), 10 );
+ rd2_Q10 = SKP_ADD32( rd1_Q10, 1024 );
+ rd2_Q10 = SKP_SUB32( rd2_Q10, SKP_SUB_LSHIFT32( Lambda_Q10, r_Q10, 1 ) );
+ q2_Q10 = SKP_SUB32( q1_Q10, 1024 );
+ } else { /* r_Q10 >= -1536 && q1_Q10 <= 512 */
+ rr_Q20 = SKP_SMULBB( offset_Q10, Lambda_Q10 );
+ rd2_Q10 = SKP_RSHIFT( SKP_SMLABB( rr_Q20, r_Q10, r_Q10 ), 10 );
+ rd1_Q10 = SKP_ADD32( rd2_Q10, 1024 );
+ rd1_Q10 = SKP_ADD32( rd1_Q10, SKP_SUB_RSHIFT32( SKP_ADD_LSHIFT32( Lambda_Q10, r_Q10, 1 ), rr_Q20, 9 ) );
+ q1_Q10 = -1024;
+ q2_Q10 = 0;
+ }
+
+ if( rd1_Q10 < rd2_Q10 ) {
+ psSS[ 0 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd1_Q10 );
+ psSS[ 1 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd2_Q10 );
+ psSS[ 0 ].Q_Q10 = q1_Q10;
+ psSS[ 1 ].Q_Q10 = q2_Q10;
+ } else {
+ psSS[ 0 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd2_Q10 );
+ psSS[ 1 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd1_Q10 );
+ psSS[ 0 ].Q_Q10 = q2_Q10;
+ psSS[ 1 ].Q_Q10 = q1_Q10;
+ }
+
+ /* Update states for best quantization */
+
+ /* Quantized excitation */
+ exc_Q10 = SKP_ADD32( offset_Q10, psSS[ 0 ].Q_Q10 );
+ exc_Q10 = ( exc_Q10 ^ dither ) - dither;
+
+ /* Add predictions */
+ LPC_exc_Q10 = exc_Q10 + SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 );
+ xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 );
+
+ /* Update states */
+ sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 );
+ psSS[ 0 ].sLTP_shp_Q10 = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 );
+ psSS[ 0 ].LF_AR_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 );
+ psSS[ 0 ].xq_Q14 = SKP_LSHIFT( xq_Q10, 4 );
+ psSS[ 0 ].LPC_exc_Q16 = SKP_LSHIFT( LPC_exc_Q10, 6 );
+
+ /* Update states for second best quantization */
+
+ /* Quantized excitation */
+ exc_Q10 = SKP_ADD32( offset_Q10, psSS[ 1 ].Q_Q10 );
+ exc_Q10 = ( exc_Q10 ^ dither ) - dither;
+
+ /* Add predictions */
+ LPC_exc_Q10 = exc_Q10 + SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 );
+ xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 );
+
+ /* Update states */
+ sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 );
+ psSS[ 1 ].sLTP_shp_Q10 = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 );
+ psSS[ 1 ].LF_AR_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 );
+ psSS[ 1 ].xq_Q14 = SKP_LSHIFT( xq_Q10, 4 );
+ psSS[ 1 ].LPC_exc_Q16 = SKP_LSHIFT( LPC_exc_Q10, 6 );
+ }
+
+ *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */
+ last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */
+
+ /* Find winner */
+ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
+ Winner_ind = 0;
+ for( k = 1; k < nStatesDelayedDecision; k++ ) {
+ if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) {
+ RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
+ Winner_ind = k;
+ }
+ }
+
+ /* Increase RD values of expired states */
+ Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ];
+ for( k = 0; k < nStatesDelayedDecision; k++ ) {
+ if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) {
+ psSampleState[ k ][ 0 ].RD_Q10 = SKP_ADD32( psSampleState[ k ][ 0 ].RD_Q10, ( SKP_int32_MAX >> 4 ) );
+ psSampleState[ k ][ 1 ].RD_Q10 = SKP_ADD32( psSampleState[ k ][ 1 ].RD_Q10, ( SKP_int32_MAX >> 4 ) );
+ SKP_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 );
+ }
+ }
+
+ /* Find worst in first set and best in second set */
+ RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
+ RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10;
+ RDmax_ind = 0;
+ RDmin_ind = 0;
+ for( k = 1; k < nStatesDelayedDecision; k++ ) {
+ /* find worst in first set */
+ if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) {
+ RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
+ RDmax_ind = k;
+ }
+ /* find best in second set */
+ if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) {
+ RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10;
+ RDmin_ind = k;
+ }
+ }
+
+ /* Replace a state if best from second set outperforms worst in first set */
+ if( RDmin_Q10 < RDmax_Q10 ) {
+ SKP_Silk_copy_del_dec_state( &psDelDec[ RDmax_ind ], &psDelDec[ RDmin_ind ], i );
+ SKP_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) );
+ }
+
+ /* Write samples from winner to output and long-term filter states */
+ psDD = &psDelDec[ Winner_ind ];
+ if( subfr > 0 || i >= decisionDelay ) {
+ q[ i - decisionDelay ] = ( SKP_int8 )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 );
+ xq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND(
+ SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ], psDD->Gain_Q16[ last_smple_idx ] ), 10 ) );
+ NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q10[ last_smple_idx ];
+ sLTP_Q16[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q16[ last_smple_idx ];
+ }
+ NSQ->sLTP_shp_buf_idx++;
+ NSQ->sLTP_buf_idx++;
+
+ /* Update states */
+ for( k = 0; k < nStatesDelayedDecision; k++ ) {
+ psDD = &psDelDec[ k ];
+ psSS = &psSampleState[ k ][ 0 ];
+ psDD->LF_AR_Q12 = psSS->LF_AR_Q12;
+ psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14;
+ psDD->Xq_Q10[ *smpl_buf_idx ] = SKP_RSHIFT( psSS->xq_Q14, 4 );
+ psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10;
+ psDD->Pred_Q16[ *smpl_buf_idx ] = psSS->LPC_exc_Q16;
+ psDD->Shape_Q10[ *smpl_buf_idx ] = psSS->sLTP_shp_Q10;
+ psDD->Seed = SKP_ADD_RSHIFT32( psDD->Seed, psSS->Q_Q10, 10 );
+ psDD->RandState[ *smpl_buf_idx ] = psDD->Seed;
+ psDD->RD_Q10 = psSS->RD_Q10;
+ psDD->Gain_Q16[ *smpl_buf_idx ] = Gain_Q16;
+ }
+ }
+ /* Update LPC states */
+ for( k = 0; k < nStatesDelayedDecision; k++ ) {
+ psDD = &psDelDec[ k ];
+ SKP_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
+ }
+}
+
+SKP_INLINE void SKP_Silk_nsq_del_dec_scale_states(
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
+ const SKP_int16 x[], /* I Input in Q0 */
+ SKP_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
+ SKP_int length, /* I Length of input */
+ SKP_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
+ SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */
+ SKP_int subfr, /* I Subframe number */
+ SKP_int nStatesDelayedDecision, /* I Number of del dec states */
+ SKP_int smpl_buf_idx, /* I Index to newest samples in buffers */
+ const SKP_int LTP_scale_Q14, /* I LTP state scaling */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int pitchL[ MAX_NB_SUBFR ] /* I Pitch lag */
+)
+{
+ SKP_int i, k, scale_length, lag;
+ SKP_int32 inv_gain_Q16, gain_adj_Q16, inv_gain_Q32;
+ NSQ_del_dec_struct *psDD;
+
+ inv_gain_Q16 = SKP_INVERSE32_varQ( SKP_max( Gains_Q16[ subfr ], 1 ), 32 );
+ inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX );
+ lag = pitchL[ subfr ];
+ /* After rewhitening the LTP state is un-scaled. So scale with inv_gain_Q16 */
+ if( NSQ->rewhite_flag ) {
+ inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 );
+ if( subfr == 0 ) {
+ /* Do LTP downscaling */
+ inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, LTP_scale_Q14 ), 2 );
+ }
+ for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
+ SKP_assert( i < MAX_FRAME_LENGTH );
+ sLTP_Q16[ i ] = SKP_SMULWB( inv_gain_Q32, sLTP[ i ] );
+ }
+ }
+
+ /* Adjust for changing gain */
+ if( inv_gain_Q16 != NSQ->prev_inv_gain_Q16 ) {
+ gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, NSQ->prev_inv_gain_Q16, 16 );
+
+ for( k = 0; k < nStatesDelayedDecision; k++ ) {
+ psDD = &psDelDec[ k ];
+
+ /* Scale scalar states */
+ psDD->LF_AR_Q12 = SKP_SMULWW( gain_adj_Q16, psDD->LF_AR_Q12 );
+
+ /* scale short term state */
+ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
+ psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - i - 1 ] = SKP_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - i - 1 ] );
+ }
+ for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
+ psDD->sAR2_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] );
+ }
+ for( i = 0; i < DECISION_DELAY; i++ ) {
+ psDD->Pred_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->Pred_Q16[ i ] );
+ psDD->Shape_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->Shape_Q10[ i ] );
+ }
+ }
+
+ /* Scale long term shaping state */
+
+ /* Calculate length to be scaled, Worst case: Next frame is voiced with max lag */
+ scale_length = length * MAX_NB_SUBFR; /* aprox max lag */
+ scale_length = scale_length - SKP_SMULBB( MAX_NB_SUBFR - ( subfr + 1 ), length ); /* subtract samples that will be too old in next frame */
+ scale_length = SKP_max_int( scale_length, lag + LTP_ORDER ); /* make sure to scale whole pitch period if voiced */
+
+ for( i = NSQ->sLTP_shp_buf_idx - scale_length; i < NSQ->sLTP_shp_buf_idx; i++ ) {
+ NSQ->sLTP_shp_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q10[ i ] );
+ }
+
+ /* Scale LTP predict state */
+ if( NSQ->rewhite_flag == 0 ) {
+ for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
+ sLTP_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, sLTP_Q16[ i ] );
+ }
+ }
+ }
+
+ /* Scale input */
+ for( i = 0; i < length; i++ ) {
+ x_sc_Q10[ i ] = SKP_RSHIFT( SKP_SMULBB( x[ i ], ( SKP_int16 )inv_gain_Q16 ), 6 );
+ }
+
+ /* save inv_gain */
+ SKP_assert( inv_gain_Q16 != 0 );
+ NSQ->prev_inv_gain_Q16 = inv_gain_Q16;
+}
+
+SKP_INLINE void SKP_Silk_copy_del_dec_state(
+ NSQ_del_dec_struct *DD_dst, /* I Dst del dec state */
+ NSQ_del_dec_struct *DD_src, /* I Src del dec state */
+ SKP_int LPC_state_idx /* I Index to LPC buffer */
+)
+{
+ SKP_memcpy( DD_dst->RandState, DD_src->RandState, sizeof( DD_src->RandState ) );
+ SKP_memcpy( DD_dst->Q_Q10, DD_src->Q_Q10, sizeof( DD_src->Q_Q10 ) );
+ SKP_memcpy( DD_dst->Pred_Q16, DD_src->Pred_Q16, sizeof( DD_src->Pred_Q16 ) );
+ SKP_memcpy( DD_dst->Shape_Q10, DD_src->Shape_Q10, sizeof( DD_src->Shape_Q10 ) );
+ SKP_memcpy( DD_dst->Xq_Q10, DD_src->Xq_Q10, sizeof( DD_src->Xq_Q10 ) );
+ SKP_memcpy( DD_dst->sAR2_Q14, DD_src->sAR2_Q14, sizeof( DD_src->sAR2_Q14 ) );
+ SKP_memcpy( &DD_dst->sLPC_Q14[ LPC_state_idx ], &DD_src->sLPC_Q14[ LPC_state_idx ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) );
+ DD_dst->LF_AR_Q12 = DD_src->LF_AR_Q12;
+ DD_dst->Seed = DD_src->Seed;
+ DD_dst->SeedInit = DD_src->SeedInit;
+ DD_dst->RD_Q10 = DD_src->RD_Q10;
+}
--- /dev/null
+++ b/src_common/SKP_Silk_PLC.c
@@ -1,0 +1,387 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+#include "SKP_Silk_PLC.h"
+
+#define NB_ATT 2
+static const SKP_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /* 0.99, 0.95 */
+static const SKP_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /* 0.95, 0.8 */
+static const SKP_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /* 0.99, 0.9 */
+
+void SKP_Silk_PLC_Reset(
+ SKP_Silk_decoder_state *psDec /* I/O Decoder state */
+)
+{
+ psDec->sPLC.pitchL_Q8 = SKP_RSHIFT( psDec->frame_length, 1 );
+}
+
+void SKP_Silk_PLC(
+ SKP_Silk_decoder_state *psDec, /* I Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */
+ SKP_int16 signal[], /* O Concealed signal */
+ SKP_int length, /* I length of residual */
+ SKP_int lost /* I Loss flag */
+)
+{
+ /* PLC control function */
+ if( psDec->fs_kHz != psDec->sPLC.fs_kHz ) {
+ SKP_Silk_PLC_Reset( psDec );
+ psDec->sPLC.fs_kHz = psDec->fs_kHz;
+ }
+
+ if( lost ) {
+ /****************************/
+ /* Generate Signal */
+ /****************************/
+ SKP_Silk_PLC_conceal( psDec, psDecCtrl, signal, length );
+
+ psDec->lossCnt++;
+ } else {
+ /****************************/
+ /* Update state */
+ /****************************/
+ SKP_Silk_PLC_update( psDec, psDecCtrl, signal, length );
+ }
+}
+
+/**************************************************/
+/* Update state of PLC */
+/**************************************************/
+void SKP_Silk_PLC_update(
+ SKP_Silk_decoder_state *psDec, /* (I/O) Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* (I/O) Decoder control */
+ SKP_int16 signal[],
+ SKP_int length
+)
+{
+ SKP_int32 LTP_Gain_Q14, temp_LTP_Gain_Q14;
+ SKP_int i, j;
+ SKP_Silk_PLC_struct *psPLC;
+
+ psPLC = &psDec->sPLC;
+
+ /* Update parameters used in case of packet loss */
+ psDec->prev_sigtype = psDecCtrl->sigtype;
+ LTP_Gain_Q14 = 0;
+ if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) {
+ /* Find the parameters for the last subframe which contains a pitch pulse */
+ for( j = 0; j * psDec->subfr_length < psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; j++ ) {
+ if( j == psDec->nb_subfr ){
+ break;
+ }
+ temp_LTP_Gain_Q14 = 0;
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( psDec->nb_subfr - 1 - j ) * LTP_ORDER + i ];
+ }
+ if( temp_LTP_Gain_Q14 > LTP_Gain_Q14 ) {
+ LTP_Gain_Q14 = temp_LTP_Gain_Q14;
+ SKP_memcpy( psPLC->LTPCoef_Q14,
+ &psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( psDec->nb_subfr - 1 - j, LTP_ORDER ) ],
+ LTP_ORDER * sizeof( SKP_int16 ) );
+
+ psPLC->pitchL_Q8 = SKP_LSHIFT( psDecCtrl->pitchL[ psDec->nb_subfr - 1 - j ], 8 );
+ }
+ }
+
+#if USE_SINGLE_TAP
+ SKP_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ) );
+ psPLC->LTPCoef_Q14[ LTP_ORDER / 2 ] = LTP_Gain_Q14;
+#endif
+
+ /* Limit LT coefs */
+ if( LTP_Gain_Q14 < V_PITCH_GAIN_START_MIN_Q14 ) {
+ SKP_int scale_Q10;
+ SKP_int32 tmp;
+
+ tmp = SKP_LSHIFT( V_PITCH_GAIN_START_MIN_Q14, 10 );
+ scale_Q10 = SKP_DIV32( tmp, SKP_max( LTP_Gain_Q14, 1 ) );
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ psPLC->LTPCoef_Q14[ i ] = SKP_RSHIFT( SKP_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q10 ), 10 );
+ }
+ } else if( LTP_Gain_Q14 > V_PITCH_GAIN_START_MAX_Q14 ) {
+ SKP_int scale_Q14;
+ SKP_int32 tmp;
+
+ tmp = SKP_LSHIFT( V_PITCH_GAIN_START_MAX_Q14, 14 );
+ scale_Q14 = SKP_DIV32( tmp, SKP_max( LTP_Gain_Q14, 1 ) );
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ psPLC->LTPCoef_Q14[ i ] = SKP_RSHIFT( SKP_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q14 ), 14 );
+ }
+ }
+ } else {
+ psPLC->pitchL_Q8 = SKP_LSHIFT( SKP_SMULBB( psDec->fs_kHz, 18 ), 8 );
+ SKP_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ));
+ }
+
+ /* Save LPC coeficients */
+ SKP_memcpy( psPLC->prevLPC_Q12, psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( SKP_int16 ) );
+ psPLC->prevLTP_scale_Q14 = psDecCtrl->LTP_scale_Q14;
+
+ /* Save Gains */
+ SKP_memcpy( psPLC->prevGain_Q16, psDecCtrl->Gains_Q16, psDec->nb_subfr * sizeof( SKP_int32 ) );
+}
+
+void SKP_Silk_PLC_conceal(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[], /* O concealed signal */
+ SKP_int length /* I length of residual */
+)
+{
+ SKP_int i, j, k;
+ SKP_int16 *B_Q14, exc_buf[ MAX_FRAME_LENGTH ], *exc_buf_ptr;
+ SKP_int16 rand_scale_Q14, A_Q12_tmp[ MAX_LPC_ORDER ];
+ SKP_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15;
+ SKP_int lag, idx, shift1, shift2;
+ SKP_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr;
+ SKP_int32 sig_Q10[ MAX_FRAME_LENGTH ], *sig_Q10_ptr, LPC_exc_Q10, LPC_pred_Q10, LTP_pred_Q14;
+ SKP_Silk_PLC_struct *psPLC;
+ psPLC = &psDec->sPLC;
+
+ /* Update LTP buffer */
+ SKP_memmove( psDec->sLTP_Q16, &psDec->sLTP_Q16[ psDec->frame_length ], psDec->ltp_mem_length * sizeof( SKP_int32 ) );
+
+ /* LPC concealment. Apply BWE to previous LPC */
+ SKP_Silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, BWE_COEF_Q16 );
+
+ /* Find random noise component */
+ /* Scale previous excitation signal */
+ exc_buf_ptr = exc_buf;
+ for( k = ( psDec->nb_subfr >> 1 ); k < psDec->nb_subfr; k++ ) {
+ for( i = 0; i < psDec->subfr_length; i++ ) {
+ exc_buf_ptr[ i ] = ( SKP_int16 )SKP_RSHIFT(
+ SKP_SMULWW( psDec->exc_Q10[ i + k * psDec->subfr_length ], psPLC->prevGain_Q16[ k ] ), 10 );
+ }
+ exc_buf_ptr += psDec->subfr_length;
+ }
+ /* Find the subframe with lowest energy of the last two and use that as random noise generator */
+ SKP_Silk_sum_sqr_shift( &energy1, &shift1, exc_buf, psDec->subfr_length );
+ SKP_Silk_sum_sqr_shift( &energy2, &shift2, &exc_buf[ psDec->subfr_length ], psDec->subfr_length );
+
+ if( SKP_RSHIFT( energy1, shift2 ) < SKP_RSHIFT( energy1, shift2 ) ) {
+ /* First sub-frame has lowest energy */
+ rand_ptr = &psDec->exc_Q10[ SKP_max_int( 0, 3 * psDec->subfr_length - RAND_BUF_SIZE ) ];
+ } else {
+ /* Second sub-frame has lowest energy */
+ rand_ptr = &psDec->exc_Q10[ SKP_max_int( 0, psDec->frame_length - RAND_BUF_SIZE ) ];
+ }
+
+ /* Setup Gain to random noise component */
+ B_Q14 = psPLC->LTPCoef_Q14;
+ rand_scale_Q14 = psPLC->randScale_Q14;
+
+ /* Setup attenuation gains */
+ harm_Gain_Q15 = HARM_ATT_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ];
+ if( psDec->prev_sigtype == SIG_TYPE_VOICED ) {
+ rand_Gain_Q15 = PLC_RAND_ATTENUATE_V_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ];
+ } else {
+ rand_Gain_Q15 = PLC_RAND_ATTENUATE_UV_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ];
+ }
+
+ /* First Lost frame */
+ if( psDec->lossCnt == 0 ) {
+ rand_scale_Q14 = (1 << 14 );
+
+ /* Reduce random noise Gain for voiced frames */
+ if( psDec->prev_sigtype == SIG_TYPE_VOICED ) {
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ rand_scale_Q14 -= B_Q14[ i ];
+ }
+ rand_scale_Q14 = SKP_max_16( 3277, rand_scale_Q14 ); /* 0.2 */
+ rand_scale_Q14 = ( SKP_int16 )SKP_RSHIFT( SKP_SMULBB( rand_scale_Q14, psPLC->prevLTP_scale_Q14 ), 14 );
+ }
+
+ /* Reduce random noise for unvoiced frames with high LPC gain */
+ if( psDec->prev_sigtype == SIG_TYPE_UNVOICED ) {
+ SKP_int32 invGain_Q30, down_scale_Q30;
+
+ SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, psPLC->prevLPC_Q12, psDec->LPC_order );
+
+ down_scale_Q30 = SKP_min_32( SKP_RSHIFT( ( 1 << 30 ), LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 );
+ down_scale_Q30 = SKP_max_32( SKP_RSHIFT( ( 1 << 30 ), LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 );
+ down_scale_Q30 = SKP_LSHIFT( down_scale_Q30, LOG2_INV_LPC_GAIN_HIGH_THRES );
+
+ rand_Gain_Q15 = SKP_RSHIFT( SKP_SMULWB( down_scale_Q30, rand_Gain_Q15 ), 14 );
+ }
+ }
+
+ rand_seed = psPLC->rand_seed;
+ lag = SKP_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 );
+ psDec->sLTP_buf_idx = psDec->ltp_mem_length;
+
+ /***************************/
+ /* LTP synthesis filtering */
+ /***************************/
+ sig_Q10_ptr = sig_Q10;
+ for( k = 0; k < psDec->nb_subfr; k++ ) {
+ /* Setup pointer */
+ pred_lag_ptr = &psDec->sLTP_Q16[ psDec->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
+ for( i = 0; i < psDec->subfr_length; i++ ) {
+ rand_seed = SKP_RAND( rand_seed );
+ idx = SKP_RSHIFT( rand_seed, 25 ) & RAND_BUF_MASK;
+
+ /* Unrolled loop */
+ LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], B_Q14[ 0 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], B_Q14[ 1 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], B_Q14[ 2 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], B_Q14[ 3 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], B_Q14[ 4 ] );
+ pred_lag_ptr++;
+
+ /* Generate LPC residual */
+ LPC_exc_Q10 = SKP_LSHIFT( SKP_SMULWB( rand_ptr[ idx ], rand_scale_Q14 ), 2 ); /* Random noise part */
+ LPC_exc_Q10 = SKP_ADD32( LPC_exc_Q10, SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) ); /* Harmonic part */
+
+ /* Update states */
+ psDec->sLTP_Q16[ psDec->sLTP_buf_idx ] = SKP_LSHIFT( LPC_exc_Q10, 6 );
+ psDec->sLTP_buf_idx++;
+
+ /* Save LPC residual */
+ sig_Q10_ptr[ i ] = LPC_exc_Q10;
+ }
+ sig_Q10_ptr += psDec->subfr_length;
+ /* Gradually reduce LTP gain */
+ for( j = 0; j < LTP_ORDER; j++ ) {
+ B_Q14[ j ] = SKP_RSHIFT( SKP_SMULBB( harm_Gain_Q15, B_Q14[ j ] ), 15 );
+ }
+ /* Gradually reduce excitation gain */
+ rand_scale_Q14 = SKP_RSHIFT( SKP_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 );
+
+ /* Slowly increase pitch lag */
+ psPLC->pitchL_Q8 += SKP_SMULWB( psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 );
+ psPLC->pitchL_Q8 = SKP_min_32( psPLC->pitchL_Q8, SKP_LSHIFT( SKP_SMULBB( MAX_PITCH_LAG_MS, psDec->fs_kHz ), 8 ) );
+ lag = SKP_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 );
+ }
+
+ /***************************/
+ /* LPC synthesis filtering */
+ /***************************/
+ sig_Q10_ptr = sig_Q10;
+ /* Preload LPC coeficients to array on stack. Gives small performance gain */
+ SKP_memcpy( A_Q12_tmp, psPLC->prevLPC_Q12, psDec->LPC_order * sizeof( SKP_int16 ) );
+ SKP_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */
+ for( k = 0; k < psDec->nb_subfr; k++ ) {
+ for( i = 0; i < psDec->subfr_length; i++ ){
+ /* partly unrolled */
+ LPC_pred_Q10 = SKP_SMULWB( psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp[ 0 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12_tmp[ 1 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12_tmp[ 2 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12_tmp[ 3 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12_tmp[ 4 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12_tmp[ 5 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12_tmp[ 6 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12_tmp[ 7 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12_tmp[ 8 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp[ 9 ] );
+
+ for( j = 10; j < psDec->LPC_order; j++ ) {
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - j - 1 ], A_Q12_tmp[ j ] );
+ }
+
+ /* Add prediction to LPC residual */
+ sig_Q10_ptr[ i ] = SKP_ADD32( sig_Q10_ptr[ i ], LPC_pred_Q10 );
+
+ /* Update states */
+ psDec->sLPC_Q14[ MAX_LPC_ORDER + i ] = SKP_LSHIFT( sig_Q10_ptr[ i ], 4 );
+ }
+ sig_Q10_ptr += psDec->subfr_length;
+ /* Update LPC filter state */
+ SKP_memcpy( psDec->sLPC_Q14, &psDec->sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) );
+ }
+
+ /* Scale with Gain */
+ for( i = 0; i < psDec->frame_length; i++ ) {
+ signal[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( sig_Q10[ i ], psPLC->prevGain_Q16[ psDec->nb_subfr - 1 ] ), 10 ) );
+ }
+
+ /**************************************/
+ /* Update states */
+ /**************************************/
+ psPLC->rand_seed = rand_seed;
+ psPLC->randScale_Q14 = rand_scale_Q14;
+ for( i = 0; i < MAX_NB_SUBFR; i++ ) {
+ psDecCtrl->pitchL[ i ] = lag;
+ }
+}
+
+/* Glues concealed frames with new good recieved frames */
+void SKP_Silk_PLC_glue_frames(
+ SKP_Silk_decoder_state *psDec, /* I/O decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[], /* I/O signal */
+ SKP_int length /* I length of residual */
+)
+{
+ SKP_int i, energy_shift;
+ SKP_int32 energy;
+ SKP_Silk_PLC_struct *psPLC;
+ psPLC = &psDec->sPLC;
+
+ if( psDec->lossCnt ) {
+ /* Calculate energy in concealed residual */
+ SKP_Silk_sum_sqr_shift( &psPLC->conc_energy, &psPLC->conc_energy_shift, signal, length );
+
+ psPLC->last_frame_lost = 1;
+ } else {
+ if( psDec->sPLC.last_frame_lost ) {
+ /* Calculate residual in decoded signal if last frame was lost */
+ SKP_Silk_sum_sqr_shift( &energy, &energy_shift, signal, length );
+
+ /* Normalize energies */
+ if( energy_shift > psPLC->conc_energy_shift ) {
+ psPLC->conc_energy = SKP_RSHIFT( psPLC->conc_energy, energy_shift - psPLC->conc_energy_shift );
+ } else if( energy_shift < psPLC->conc_energy_shift ) {
+ energy = SKP_RSHIFT( energy, psPLC->conc_energy_shift - energy_shift );
+ }
+
+ /* Fade in the energy difference */
+ if( energy > psPLC->conc_energy ) {
+ SKP_int32 frac_Q24, LZ;
+ SKP_int32 gain_Q12, slope_Q12;
+
+ LZ = SKP_Silk_CLZ32( psPLC->conc_energy );
+ LZ = LZ - 1;
+ psPLC->conc_energy = SKP_LSHIFT( psPLC->conc_energy, LZ );
+ energy = SKP_RSHIFT( energy, SKP_max_32( 24 - LZ, 0 ) );
+
+ frac_Q24 = SKP_DIV32( psPLC->conc_energy, SKP_max( energy, 1 ) );
+
+ gain_Q12 = SKP_Silk_SQRT_APPROX( frac_Q24 );
+ slope_Q12 = SKP_DIV32_16( ( 1 << 12 ) - gain_Q12, length );
+
+ for( i = 0; i < length; i++ ) {
+ signal[ i ] = SKP_RSHIFT( SKP_MUL( gain_Q12, signal[ i ] ), 12 );
+ gain_Q12 += slope_Q12;
+ gain_Q12 = SKP_min( gain_Q12, ( 1 << 12 ) );
+ }
+ }
+ }
+ psPLC->last_frame_lost = 0;
+
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_PLC.h
@@ -1,0 +1,79 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_PLC_FIX_H
+#define SKP_SILK_PLC_FIX_H
+
+#include "SKP_Silk_main.h"
+
+#define BWE_COEF_Q16 64880 /* 0.99 in Q16 */
+#define V_PITCH_GAIN_START_MIN_Q14 11469 /* 0.7 in Q14 */
+#define V_PITCH_GAIN_START_MAX_Q14 15565 /* 0.95 in Q14 */
+#define MAX_PITCH_LAG_MS 18
+#define SA_THRES_Q8 50
+#define USE_SINGLE_TAP 1
+#define RAND_BUF_SIZE 128
+#define RAND_BUF_MASK (RAND_BUF_SIZE - 1)
+#define LOG2_INV_LPC_GAIN_HIGH_THRES 3 /* 2^3 = 8 dB LPC gain */
+#define LOG2_INV_LPC_GAIN_LOW_THRES 8 /* 2^8 = 24 dB LPC gain */
+#define PITCH_DRIFT_FAC_Q16 655 /* 0.01 in Q16 */
+
+void SKP_Silk_PLC_Reset(
+ SKP_Silk_decoder_state *psDec /* I/O Decoder state */
+);
+
+void SKP_Silk_PLC(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[], /* I/O signal */
+ SKP_int length, /* I length of residual */
+ SKP_int lost /* I Loss flag */
+);
+
+void SKP_Silk_PLC_update(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[],
+ SKP_int length
+);
+
+void SKP_Silk_PLC_conceal(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[], /* O LPC residual signal */
+ SKP_int length /* I length of signal */
+);
+
+void SKP_Silk_PLC_glue_frames(
+ SKP_Silk_decoder_state *psDec, /* I/O decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[], /* I/O signal */
+ SKP_int length /* I length of signal */
+);
+
+#endif
+
--- /dev/null
+++ b/src_common/SKP_Silk_VAD.c
@@ -1,0 +1,348 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/*
+ * File Name: SKP_Silk_VAD.c
+ * Description: Silk VAD.
+ */
+
+#include <stdlib.h>
+#include "SKP_Silk_main.h"
+
+#define SKP_SILK_VAD_HANDLE_10MS_FRAMES 1
+
+/**********************************/
+/* Initialization of the Silk VAD */
+/**********************************/
+SKP_int SKP_Silk_VAD_Init( /* O Return value, 0 if success */
+ SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
+)
+{
+ SKP_int b, ret = 0;
+
+ /* reset state memory */
+ SKP_memset( psSilk_VAD, 0, sizeof( SKP_Silk_VAD_state ) );
+
+ /* init noise levels */
+ /* Initialize array with approx pink noise levels (psd proportional to inverse of frequency) */
+ for( b = 0; b < VAD_N_BANDS; b++ ) {
+ psSilk_VAD->NoiseLevelBias[ b ] = SKP_max_32( SKP_DIV32_16( VAD_NOISE_LEVELS_BIAS, b + 1 ), 1 );
+ }
+
+ /* Initialize state */
+ for( b = 0; b < VAD_N_BANDS; b++ ) {
+ psSilk_VAD->NL[ b ] = SKP_MUL( 100, psSilk_VAD->NoiseLevelBias[ b ] );
+ psSilk_VAD->inv_NL[ b ] = SKP_DIV32( SKP_int32_MAX, psSilk_VAD->NL[ b ] );
+ }
+ psSilk_VAD->counter = 15;
+
+ /* init smoothed energy-to-noise ratio*/
+ for( b = 0; b < VAD_N_BANDS; b++ ) {
+ psSilk_VAD->NrgRatioSmth_Q8[ b ] = 100 * 256; /* 100 * 256 --> 20 dB SNR */
+ }
+
+ return( ret );
+}
+
+/* Weighting factors for tilt measure */
+const static SKP_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -12000 };
+
+/***************************************/
+/* Get the speech activity level in Q8 */
+/***************************************/
+SKP_int SKP_Silk_VAD_GetSA_Q8( /* O Return value, 0 if success */
+ SKP_Silk_VAD_state *psSilk_VAD, /* I/O Silk VAD state */
+ SKP_int *pSA_Q8, /* O Speech activity level in Q8 */
+ SKP_int pQuality_Q15[ VAD_N_BANDS ], /* O Smoothed SNR for each band */
+ SKP_int *pTilt_Q15, /* O current frame's frequency tilt */
+ const SKP_int16 pIn[], /* I PCM input [framelength] */
+ const SKP_int framelength, /* I Input frame length */
+ const SKP_int fs_kHz /* I Input frame sample frequency */
+)
+{
+ SKP_int SA_Q15, input_tilt;
+ SKP_int32 scratch[ 3 * MAX_FRAME_LENGTH / 2 ];
+ SKP_int decimated_framelength, dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s;
+ SKP_int32 sumSquared, smooth_coef_Q16;
+ SKP_int16 HPstateTmp, SNR_dB_Q7;
+
+ SKP_int16 X[ VAD_N_BANDS ][ MAX_FRAME_LENGTH / 2 ];
+ SKP_int32 Xnrg[ VAD_N_BANDS ];
+ SKP_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ];
+ SKP_int32 speech_nrg, x_tmp;
+ SKP_int ret = 0;
+
+#if SKP_SILK_VAD_HANDLE_10MS_FRAMES
+ SKP_int normalizer;
+#endif
+
+ /* Safety checks */
+ SKP_assert( VAD_N_BANDS == 4 );
+ SKP_assert( MAX_FRAME_LENGTH >= framelength );
+ SKP_assert( framelength <= 512 );
+ SKP_assert( framelength == 8 * SKP_RSHIFT( framelength, 3 ) );
+
+ /***********************/
+ /* Filter and Decimate */
+ /***********************/
+ /* 0-8 kHz to 0-4 kHz and 4-8 kHz */
+ SKP_Silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], &X[ 0 ][ 0 ], &X[ 3 ][ 0 ], &scratch[ 0 ], framelength );
+
+ /* 0-4 kHz to 0-2 kHz and 2-4 kHz */
+ SKP_Silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState1[ 0 ], &X[ 0 ][ 0 ], &X[ 2 ][ 0 ], &scratch[ 0 ], SKP_RSHIFT( framelength, 1 ) );
+
+ /* 0-2 kHz to 0-1 kHz and 1-2 kHz */
+ SKP_Silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState2[ 0 ], &X[ 0 ][ 0 ], &X[ 1 ][ 0 ], &scratch[ 0 ], SKP_RSHIFT( framelength, 2 ) );
+
+ /*********************************************/
+ /* HP filter on lowest band (differentiator) */
+ /*********************************************/
+ // y( n ) = 0.5 * x( n ) - 0.5 * x( n - 1 )
+ decimated_framelength = SKP_RSHIFT( framelength, 3 );
+ X[ 0 ][ decimated_framelength - 1 ] = SKP_RSHIFT( X[ 0 ][ decimated_framelength - 1 ], 1 );
+ HPstateTmp = X[ 0 ][ decimated_framelength - 1 ];
+ for( i = decimated_framelength - 1; i > 0; i-- ) {
+ X[ 0 ][ i - 1 ] = SKP_RSHIFT( X[ 0 ][ i - 1 ], 1 );
+ X[ 0 ][ i ] -= X[ 0 ][ i - 1 ];
+ }
+ X[ 0 ][ 0 ] -= psSilk_VAD->HPstate;
+ psSilk_VAD->HPstate = HPstateTmp;
+
+ /*************************************/
+ /* Calculate the energy in each band */
+ /*************************************/
+ for( b = 0; b < VAD_N_BANDS; b++ ) {
+ /* Find the decimated framelength in the non-uniformly divided bands */
+ decimated_framelength = SKP_RSHIFT( framelength, SKP_min_int( VAD_N_BANDS - b, VAD_N_BANDS - 1 ) );
+
+ /* Split length into subframe lengths */
+ dec_subframe_length = SKP_RSHIFT( decimated_framelength, VAD_INTERNAL_SUBFRAMES_LOG2 );
+ dec_subframe_offset = 0;
+
+ /* Compute energy per sub-frame */
+ /* initialize with summed energy of last subframe */
+ Xnrg[ b ] = psSilk_VAD->XnrgSubfr[ b ];
+ for( s = 0; s < VAD_INTERNAL_SUBFRAMES; s++ ) {
+ sumSquared = 0;
+ for( i = 0; i < dec_subframe_length; i++ ) {
+ /* The energy will be less than dec_subframe_length * ( SKP_int16_MIN / 8 ) ^ 2. */
+ /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */
+ x_tmp = SKP_RSHIFT( X[ b ][ i + dec_subframe_offset ], 3 );
+ sumSquared = SKP_SMLABB( sumSquared, x_tmp, x_tmp );
+
+ /* Safety check */
+ SKP_assert( sumSquared >= 0 );
+ }
+
+ /* Add/saturate summed energy of current subframe */
+ if( s < VAD_INTERNAL_SUBFRAMES - 1 ) {
+ Xnrg[ b ] = SKP_ADD_POS_SAT32( Xnrg[ b ], sumSquared );
+ } else {
+ /* Look-ahead subframe */
+ Xnrg[ b ] = SKP_ADD_POS_SAT32( Xnrg[ b ], SKP_RSHIFT( sumSquared, 1 ) );
+ }
+
+ dec_subframe_offset += dec_subframe_length;
+ }
+ psSilk_VAD->XnrgSubfr[ b ] = sumSquared;
+ }
+
+ /********************/
+ /* Noise estimation */
+ /********************/
+ SKP_Silk_VAD_GetNoiseLevels( &Xnrg[ 0 ], psSilk_VAD );
+
+ /***********************************************/
+ /* Signal-plus-noise to noise ratio estimation */
+ /***********************************************/
+ sumSquared = 0;
+ input_tilt = 0;
+ for( b = 0; b < VAD_N_BANDS; b++ ) {
+ speech_nrg = Xnrg[ b ] - psSilk_VAD->NL[ b ];
+ if( speech_nrg > 0 ) {
+ /* Divide, with sufficient resolution */
+ if( ( Xnrg[ b ] & 0xFF800000 ) == 0 ) {
+ NrgToNoiseRatio_Q8[ b ] = SKP_DIV32( SKP_LSHIFT( Xnrg[ b ], 8 ), psSilk_VAD->NL[ b ] + 1 );
+ } else {
+ NrgToNoiseRatio_Q8[ b ] = SKP_DIV32( Xnrg[ b ], SKP_RSHIFT( psSilk_VAD->NL[ b ], 8 ) + 1 );
+ }
+
+ /* Convert to log domain */
+ SNR_Q7 = SKP_Silk_lin2log( NrgToNoiseRatio_Q8[ b ] ) - 8 * 128;
+
+ /* Sum-of-squares */
+ sumSquared = SKP_SMLABB( sumSquared, SNR_Q7, SNR_Q7 ); /* Q14 */
+
+ /* Tilt measure */
+ if( speech_nrg < ( 1 << 20 ) ) {
+ /* Scale down SNR value for small subband speech energies */
+ SNR_Q7 = SKP_SMULWB( SKP_LSHIFT( SKP_Silk_SQRT_APPROX( speech_nrg ), 6 ), SNR_Q7 );
+ }
+ input_tilt = SKP_SMLAWB( input_tilt, tiltWeights[ b ], SNR_Q7 );
+ } else {
+ NrgToNoiseRatio_Q8[ b ] = 256;
+ }
+ }
+
+ /* Mean-of-squares */
+ sumSquared = SKP_DIV32_16( sumSquared, VAD_N_BANDS ); /* Q14 */
+
+ /* Root-mean-square approximation, scale to dBs, and write to output pointer */
+ SNR_dB_Q7 = ( SKP_int16 )( 3 * SKP_Silk_SQRT_APPROX( sumSquared ) ); /* Q7 */
+
+ /*********************************/
+ /* Speech Probability Estimation */
+ /*********************************/
+ SA_Q15 = SKP_Silk_sigm_Q15( SKP_SMULWB( VAD_SNR_FACTOR_Q16, SNR_dB_Q7 ) - VAD_NEGATIVE_OFFSET_Q5 );
+
+ /**************************/
+ /* Frequency Tilt Measure */
+ /**************************/
+ *pTilt_Q15 = SKP_LSHIFT( SKP_Silk_sigm_Q15( input_tilt ) - 16384, 1 );
+
+ /**************************************************/
+ /* Scale the sigmoid output based on power levels */
+ /**************************************************/
+ speech_nrg = 0;
+ for( b = 0; b < VAD_N_BANDS; b++ ) {
+ /* Accumulate signal-without-noise energies, higher frequency bands have more weight */
+ speech_nrg += ( b + 1 ) * SKP_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 );
+ }
+
+ /* Power scaling */
+ if( speech_nrg <= 0 ) {
+ SA_Q15 = SKP_RSHIFT( SA_Q15, 1 );
+ } else if( speech_nrg < 32768 ) {
+
+#if SKP_SILK_VAD_HANDLE_10MS_FRAMES
+ /* Energy normalization of frames shorter than 320 samples */
+ normalizer = 0;
+ while( SKP_LSHIFT( framelength, normalizer ) < 320 ) {
+ normalizer++;
+ }
+ speech_nrg = SKP_LSHIFT_SAT32( speech_nrg, 15 + normalizer );
+#else
+ speech_nrg = SKP_LSHIFT_SAT32( speech_nrg, 15 );
+#endif
+ /* square-root */
+ speech_nrg = SKP_Silk_SQRT_APPROX( speech_nrg );
+ SA_Q15 = SKP_SMULWB( 32768 + speech_nrg, SA_Q15 );
+ }
+
+ /* Copy the resulting speech activity in Q8 to *pSA_Q8 */
+ *pSA_Q8 = SKP_min_int( SKP_RSHIFT( SA_Q15, 7 ), SKP_uint8_MAX );
+
+ /***********************************/
+ /* Energy Level and SNR estimation */
+ /***********************************/
+ /* Smoothing coefficient */
+ smooth_coef_Q16 = SKP_SMULWB( VAD_SNR_SMOOTH_COEF_Q18, SKP_SMULWB( SA_Q15, SA_Q15 ) );
+
+#if SKP_SILK_VAD_HANDLE_10MS_FRAMES
+ if( framelength == 10 * fs_kHz ) {
+ smooth_coef_Q16 >>= 1;
+ } else {
+ SKP_assert( framelength == 20 * fs_kHz );
+ }
+#endif
+
+ for( b = 0; b < VAD_N_BANDS; b++ ) {
+ /* compute smoothed energy-to-noise ratio per band */
+ psSilk_VAD->NrgRatioSmth_Q8[ b ] = SKP_SMLAWB( psSilk_VAD->NrgRatioSmth_Q8[ b ],
+ NrgToNoiseRatio_Q8[ b ] - psSilk_VAD->NrgRatioSmth_Q8[ b ], smooth_coef_Q16 );
+
+ /* signal to noise ratio in dB per band */
+ SNR_Q7 = 3 * ( SKP_Silk_lin2log( psSilk_VAD->NrgRatioSmth_Q8[b] ) - 8 * 128 );
+ /* quality = sigmoid( 0.25 * ( SNR_dB - 16 ) ); */
+ pQuality_Q15[ b ] = SKP_Silk_sigm_Q15( SKP_RSHIFT( SNR_Q7 - 16 * 128, 4 ) );
+ }
+
+ return( ret );
+}
+
+/**************************/
+/* Noise level estimation */
+/**************************/
+void SKP_Silk_VAD_GetNoiseLevels(
+ const SKP_int32 pX[ VAD_N_BANDS ], /* I subband energies */
+ SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
+)
+{
+ SKP_int k;
+ SKP_int32 nl, nrg, inv_nrg;
+ SKP_int coef, min_coef;
+
+ /* Initially faster smoothing */
+ if( psSilk_VAD->counter < 1000 ) { /* 1000 = 20 sec */
+ min_coef = SKP_DIV32_16( SKP_int16_MAX, SKP_RSHIFT( psSilk_VAD->counter, 4 ) + 1 );
+ } else {
+ min_coef = 0;
+ }
+
+ for( k = 0; k < VAD_N_BANDS; k++ ) {
+ /* Get old noise level estimate for current band */
+ nl = psSilk_VAD->NL[ k ];
+ SKP_assert( nl >= 0 );
+
+ /* Add bias */
+ nrg = SKP_ADD_POS_SAT32( pX[ k ], psSilk_VAD->NoiseLevelBias[ k ] );
+ SKP_assert( nrg > 0 );
+
+ /* Invert energies */
+ inv_nrg = SKP_DIV32( SKP_int32_MAX, nrg );
+ SKP_assert( inv_nrg >= 0 );
+
+ /* Less update when subband energy is high */
+ if( nrg > SKP_LSHIFT( nl, 3 ) ) {
+ coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 >> 3;
+ } else if( nrg < nl ) {
+ coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16;
+ } else {
+ coef = SKP_SMULWB( SKP_SMULWW( inv_nrg, nl ), VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 << 1 );
+ }
+
+ /* Initially faster smoothing */
+ coef = SKP_max_int( coef, min_coef );
+
+ /* Smooth inverse energies */
+ psSilk_VAD->inv_NL[ k ] = SKP_SMLAWB( psSilk_VAD->inv_NL[ k ], inv_nrg - psSilk_VAD->inv_NL[ k ], coef );
+ SKP_assert( psSilk_VAD->inv_NL[ k ] >= 0 );
+
+ /* Compute noise level by inverting again */
+ nl = SKP_DIV32( SKP_int32_MAX, psSilk_VAD->inv_NL[ k ] );
+ SKP_assert( nl >= 0 );
+
+ /* Limit noise levels (guarantee 7 bits of head room) */
+ nl = SKP_min( nl, 0x00FFFFFF );
+
+ /* Store as part of state */
+ psSilk_VAD->NL[ k ] = nl;
+ }
+
+ /* Increment frame counter */
+ psSilk_VAD->counter++;
+}
--- /dev/null
+++ b/src_common/SKP_Silk_code_signs.c
@@ -1,0 +1,91 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+//#define SKP_enc_map(a) ((a) > 0 ? 1 : 0)
+//#define SKP_dec_map(a) ((a) > 0 ? 1 : -1)
+/* shifting avoids if-statement */
+#define SKP_enc_map(a) ( SKP_RSHIFT( (a), 15 ) + 1 )
+#define SKP_dec_map(a) ( SKP_LSHIFT( (a), 1 ) - 1 )
+
+/* Encodes signs of excitation */
+void SKP_Silk_encode_signs(
+ SKP_Silk_range_coder_state *sRC, /* I/O Range coder state */
+ const SKP_int8 q[], /* I Pulse signal */
+ const SKP_int length, /* I Length of input */
+ const SKP_int sigtype, /* I Signal type */
+ const SKP_int QuantOffsetType, /* I Quantization offset type */
+ const SKP_int RateLevelIndex /* I Rate level index */
+)
+{
+ SKP_int i;
+ SKP_int inData;
+ SKP_uint16 cdf[ 3 ];
+
+ i = SKP_SMULBB( N_RATE_LEVELS - 1, SKP_LSHIFT( sigtype, 1 ) + QuantOffsetType ) + RateLevelIndex;
+ cdf[ 0 ] = 0;
+ cdf[ 1 ] = SKP_Silk_sign_CDF[ i ];
+ cdf[ 2 ] = 65535;
+
+ for( i = 0; i < length; i++ ) {
+ if( q[ i ] != 0 ) {
+ inData = SKP_enc_map( q[ i ] ); /* - = 0, + = 1 */
+ SKP_Silk_range_encoder( sRC, inData, cdf );
+ }
+ }
+}
+
+/* Decodes signs of excitation */
+void SKP_Silk_decode_signs(
+ SKP_Silk_range_coder_state *sRC, /* I/O Range coder state */
+ SKP_int q[], /* I/O pulse signal */
+ const SKP_int length, /* I length of output */
+ const SKP_int sigtype, /* I Signal type */
+ const SKP_int QuantOffsetType, /* I Quantization offset type */
+ const SKP_int RateLevelIndex /* I Rate Level Index */
+)
+{
+ SKP_int i;
+ SKP_int data;
+ SKP_uint16 cdf[ 3 ];
+
+ i = SKP_SMULBB( N_RATE_LEVELS - 1, SKP_LSHIFT( sigtype, 1 ) + QuantOffsetType ) + RateLevelIndex;
+ cdf[ 0 ] = 0;
+ cdf[ 1 ] = SKP_Silk_sign_CDF[ i ];
+ cdf[ 2 ] = 65535;
+
+ for( i = 0; i < length; i++ ) {
+ if( q[ i ] > 0 ) {
+ SKP_Silk_range_decoder( &data, sRC, cdf, 1 );
+ /* attach sign */
+ /* implementation with shift, subtraction, multiplication */
+ q[ i ] *= SKP_dec_map( data );
+ }
+ }
+}
+
--- /dev/null
+++ b/src_common/SKP_Silk_create_init_destroy.c
@@ -1,0 +1,56 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+
+/************************/
+/* Init Decoder State */
+/************************/
+SKP_int SKP_Silk_init_decoder(
+ SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */
+)
+{
+ /* Clear the entire encoder state, except anything copied */
+ SKP_memset( psDec, 0, sizeof( SKP_Silk_decoder_state ) );
+
+ /* Set sampling rate to 24 kHz, and init non-zero values */
+ SKP_Silk_decoder_set_fs( psDec, 24, MAX_NB_SUBFR );
+
+ /* Used to deactivate e.g. LSF interpolation and fluctuation reduction */
+ psDec->first_frame_after_reset = 1;
+ psDec->prev_inv_gain_Q16 = 65536;
+
+ /* Reset CNG state */
+ SKP_Silk_CNG_Reset( psDec );
+
+ /* Reset PLC state */
+ SKP_Silk_PLC_Reset( psDec );
+
+ return(0);
+}
+
--- /dev/null
+++ b/src_common/SKP_Silk_dec_SDK_API.c
@@ -1,0 +1,234 @@
+#include "SKP_Silk_SDK_API.h"
+#include "SKP_Silk_main.h"
+
+/*********************/
+/* Decoder functions */
+/*********************/
+
+SKP_int SKP_Silk_SDK_Get_Decoder_Size( SKP_int32 *decSizeBytes )
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+ *decSizeBytes = sizeof( SKP_Silk_decoder_state );
+
+ return ret;
+}
+
+/* Reset decoder state */
+SKP_int SKP_Silk_SDK_InitDecoder(
+ void* decState /* I/O: State */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+ SKP_Silk_decoder_state *struc;
+
+ struc = (SKP_Silk_decoder_state *)decState;
+
+ ret = SKP_Silk_init_decoder( struc );
+
+ return ret;
+}
+
+/* Decode a frame */
+SKP_int SKP_Silk_SDK_Decode(
+ void* decState, /* I/O: State */
+ SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control structure */
+ SKP_int lostFlag, /* I: 0: no loss, 1 loss */
+ const SKP_uint8 *inData, /* I: Encoded input vector */
+ const SKP_int nBytesIn, /* I: Number of input Bytes */
+ SKP_int16 *samplesOut, /* O: Decoded output speech vector */
+ SKP_int16 *nSamplesOut /* I/O: Number of samples (vector/decoded) */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR, used_bytes, prev_fs_kHz;
+ SKP_Silk_decoder_state *psDec;
+
+ psDec = (SKP_Silk_decoder_state *)decState;
+
+ /**********************************/
+ /* Test if first frame in payload */
+ /**********************************/
+ if( psDec->moreInternalDecoderFrames == 0 ) {
+ /* First Frame in Payload */
+ psDec->nFramesDecoded = 0; /* Used to count frames in packet */
+ }
+
+ if( psDec->moreInternalDecoderFrames == 0 && /* First frame in packet */
+ lostFlag == 0 && /* Not packet loss */
+ nBytesIn > MAX_ARITHM_BYTES ) { /* Too long payload */
+ /* Avoid trying to decode a too large packet */
+ lostFlag = 1;
+ ret = SKP_SILK_DEC_PAYLOAD_TOO_LARGE;
+ }
+
+ /* Save previous sample frequency */
+ prev_fs_kHz = psDec->fs_kHz;
+
+ /* Call decoder for one frame */
+ ret += SKP_Silk_decode_frame( psDec, samplesOut, nSamplesOut, inData, nBytesIn,
+ lostFlag, &used_bytes );
+
+ if( used_bytes ) { /* Only Call if not a packet loss */
+ if( psDec->nBytesLeft > 0 && psDec->FrameTermination == SKP_SILK_MORE_FRAMES && psDec->nFramesDecoded < 5 ) {
+ /* We have more frames in the Payload */
+ psDec->moreInternalDecoderFrames = 1;
+ } else {
+ /* Last frame in Payload */
+ psDec->moreInternalDecoderFrames = 0;
+ psDec->nFramesInPacket = psDec->nFramesDecoded;
+
+ /* Track inband FEC usage */
+ if( psDec->vadFlag == VOICE_ACTIVITY ) {
+ if( psDec->FrameTermination == SKP_SILK_LAST_FRAME ) {
+ psDec->no_FEC_counter++;
+ if( psDec->no_FEC_counter > NO_LBRR_THRES ) {
+ psDec->inband_FEC_offset = 0;
+ }
+ } else if( psDec->FrameTermination == SKP_SILK_LBRR_VER1 ) {
+ psDec->inband_FEC_offset = 1; /* FEC info with 1 packet delay */
+ psDec->no_FEC_counter = 0;
+ } else if( psDec->FrameTermination == SKP_SILK_LBRR_VER2 ) {
+ psDec->inband_FEC_offset = 2; /* FEC info with 2 packets delay */
+ psDec->no_FEC_counter = 0;
+ }
+ }
+ }
+ }
+
+ if( MAX_API_FS_KHZ * 1000 < decControl->API_sampleRate ||
+ 8000 > decControl->API_sampleRate ) {
+ ret = SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY;
+ return( ret );
+ }
+
+ /* Resample if needed */
+ if( psDec->fs_kHz * 1000 != decControl->API_sampleRate ) {
+ SKP_int16 samplesOut_tmp[ MAX_API_FS_KHZ * MAX_FRAME_LENGTH_MS ];
+ SKP_assert( psDec->fs_kHz <= MAX_API_FS_KHZ );
+
+ /* Copy to a tmp buffer as the resampling writes to samplesOut */
+ SKP_memcpy( samplesOut_tmp, samplesOut, *nSamplesOut * sizeof( SKP_int16 ) );
+
+ /* (Re-)initialize resampler state when switching internal sampling frequency */
+ if( prev_fs_kHz != psDec->fs_kHz || psDec->prev_API_sampleRate != decControl->API_sampleRate ) {
+ ret = SKP_Silk_resampler_init( &psDec->resampler_state, SKP_SMULBB( psDec->fs_kHz, 1000 ), decControl->API_sampleRate );
+ }
+
+ /* Resample the output to API_sampleRate */
+ ret += SKP_Silk_resampler( &psDec->resampler_state, samplesOut, samplesOut_tmp, *nSamplesOut );
+
+ /* Update the number of output samples */
+ *nSamplesOut = SKP_DIV32( ( SKP_int32 )*nSamplesOut * decControl->API_sampleRate, psDec->fs_kHz * 1000 );
+ }
+
+ psDec->prev_API_sampleRate = decControl->API_sampleRate;
+
+ /* Copy all parameters that are needed out of internal structure to the control stucture */
+ decControl->frameSize = ( SKP_int )psDec->frame_length;
+ decControl->framesPerPacket = ( SKP_int )psDec->nFramesInPacket;
+ decControl->inBandFECOffset = ( SKP_int )psDec->inband_FEC_offset;
+ decControl->moreInternalDecoderFrames = ( SKP_int )psDec->moreInternalDecoderFrames;
+
+ return ret;
+}
+
+/* Function to find LBRR information in a packet */
+void SKP_Silk_SDK_search_for_LBRR(
+ const SKP_uint8 *inData, /* I: Encoded input vector */
+ const SKP_int16 nBytesIn, /* I: Number of input Bytes */
+ SKP_int lost_offset, /* I: Offset from lost packet */
+ SKP_uint8 *LBRRData, /* O: LBRR payload */
+ SKP_int16 *nLBRRBytes /* O: Number of LBRR Bytes */
+)
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+ SKP_Silk_decoder_state sDec; // Local decoder state to avoid interfering with running decoder */
+ SKP_Silk_decoder_control sDecCtrl;
+ SKP_int i, TempQ[ MAX_FRAME_LENGTH ];
+
+ if( lost_offset < 1 || lost_offset > MAX_LBRR_DELAY ) {
+ /* No useful FEC in this packet */
+ *nLBRRBytes = 0;
+ return;
+ }
+
+ sDec.nFramesDecoded = 0;
+ sDec.fs_kHz = 0; /* Force update parameters LPC_order etc */
+ SKP_memset( sDec.prevNLSF_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) );
+ SKP_Silk_range_dec_init( &sDec.sRC, inData, ( SKP_int32 )nBytesIn );
+
+ /* Decode all parameter indices for the whole packet*/
+ SKP_Silk_decode_indices_v4( &sDec );
+
+ /* Is there usable LBRR in this packet */
+ *nLBRRBytes = 0;
+ if( ( sDec.FrameTermination - 1 ) & lost_offset && sDec.FrameTermination > 0 && sDec.nBytesLeft >= 0 ) {
+ /* The wanted FEC is present in the packet */
+ for( i = 0; i < sDec.nFramesInPacket; i++ ) {
+ SKP_Silk_decode_parameters_v4( &sDec, &sDecCtrl, TempQ, 0 );
+
+ if( sDec.nBytesLeft <= 0 || sDec.sRC.error ) {
+ /* Corrupt stream */
+ LBRRData = NULL;
+ *nLBRRBytes = 0;
+ break;
+ } else {
+ sDec.nFramesDecoded++;
+ }
+ }
+
+ if( LBRRData != NULL ) {
+ /* The wanted FEC is present in the packet */
+ *nLBRRBytes = sDec.nBytesLeft;
+ SKP_memcpy( LBRRData, &inData[ nBytesIn - sDec.nBytesLeft ], sDec.nBytesLeft * sizeof( SKP_uint8 ) );
+ }
+ }
+}
+
+/* Getting type of content for a packet */
+void SKP_Silk_SDK_get_TOC(
+ const SKP_uint8 *inData, /* I: Encoded input vector */
+ const SKP_int16 nBytesIn, /* I: Number of input bytes */
+ SKP_Silk_TOC_struct *Silk_TOC /* O: Type of content */
+)
+{
+ SKP_Silk_decoder_state sDec; // Local Decoder state to avoid interfering with running decoder */
+ SKP_int i, ret = SKP_SILK_NO_ERROR;
+
+ sDec.nFramesDecoded = 0;
+ sDec.fs_kHz = 0; /* Force update parameters LPC_order etc */
+ SKP_Silk_range_dec_init( &sDec.sRC, inData, ( SKP_int32 )nBytesIn );
+
+ /* Decode all parameter indices for the whole packet*/
+ SKP_Silk_decode_indices_v4( &sDec );
+
+ if( sDec.nFramesInPacket > SILK_MAX_FRAMES_PER_PACKET || sDec.sRC.error ) {
+ /* Corrupt packet */
+ SKP_memset( Silk_TOC, 0, sizeof( SKP_Silk_TOC_struct ) );
+ Silk_TOC->corrupt = 1;
+ } else {
+ Silk_TOC->corrupt = 0;
+ Silk_TOC->framesInPacket = sDec.nFramesInPacket;
+ Silk_TOC->fs_kHz = sDec.fs_kHz;
+ if( sDec.FrameTermination == SKP_SILK_LAST_FRAME ) {
+ Silk_TOC->inbandLBRR = sDec.FrameTermination;
+ } else {
+ Silk_TOC->inbandLBRR = sDec.FrameTermination - 1;
+ }
+ /* Copy data */
+ for( i = 0; i < sDec.nFramesInPacket; i++ ) {
+ Silk_TOC->vadFlags[ i ] = sDec.vadFlagBuf[ i ];
+ Silk_TOC->sigtypeFlags[ i ] = sDec.sigtype[ i ];
+ }
+ }
+}
+
+/**************************/
+/* Get the version number */
+/**************************/
+/* Return a pointer to string specifying the version */
+const char *SKP_Silk_SDK_get_version()
+{
+ static const char version[] = "1.0.4";
+ return version;
+}
\ No newline at end of file
--- /dev/null
+++ b/src_common/SKP_Silk_decode_core.c
@@ -1,0 +1,231 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/**********************************************************/
+/* Core decoder. Performs inverse NSQ operation LTP + LPC */
+/**********************************************************/
+void SKP_Silk_decode_core(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */
+ SKP_int16 xq[], /* O Decoded speech */
+ const SKP_int q[ MAX_FRAME_LENGTH ] /* I Pulse signal */
+)
+{
+ SKP_int i, k, lag = 0, start_idx, NLSF_interpolation_flag, sigtype, LTP_scale_Q14;
+ SKP_int16 *A_Q12, *B_Q14, *pxq, A_Q12_tmp[ MAX_LPC_ORDER ];
+ SKP_int16 sLTP[ MAX_FRAME_LENGTH ];
+ SKP_int32 Gain_Q16, *pred_lag_ptr, *pexc_Q10, *pres_Q10, LTP_pred_Q14, LPC_pred_Q10;
+ SKP_int32 rand_seed, offset_Q10, dither;
+ SKP_int32 vec_Q10[ MAX_SUB_FRAME_LENGTH ];
+ SKP_int32 inv_gain_Q16, inv_gain_Q32, gain_adj_Q16, FiltState[ MAX_LPC_ORDER ];
+ SKP_int j;
+
+ SKP_assert( psDec->prev_inv_gain_Q16 != 0 );
+
+ offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psDecCtrl->sigtype ][ psDecCtrl->QuantOffsetType ];
+
+ if( psDecCtrl->NLSFInterpCoef_Q2 < ( 1 << 2 ) ) {
+ NLSF_interpolation_flag = 1;
+ } else {
+ NLSF_interpolation_flag = 0;
+ }
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( q_dec.dat, q, psDec->frame_length * sizeof( SKP_int ));
+#endif
+
+ /* Decode excitation */
+ rand_seed = psDecCtrl->Seed;
+ for( i = 0; i < psDec->frame_length; i++ ) {
+ rand_seed = SKP_RAND( rand_seed );
+ /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */
+ dither = SKP_RSHIFT( rand_seed, 31 );
+
+ psDec->exc_Q10[ i ] = SKP_LSHIFT( ( SKP_int32 )q[ i ], 10 ) + offset_Q10;
+ psDec->exc_Q10[ i ] = ( psDec->exc_Q10[ i ] ^ dither ) - dither;
+
+ rand_seed += q[ i ];
+ }
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( exc_Q10.dat, psDec->exc_Q10, psDec->frame_length * sizeof( SKP_int32 ));
+
+ /* Resync LTP state here after loss */
+#endif
+
+ pexc_Q10 = psDec->exc_Q10;
+ pres_Q10 = psDec->res_Q10;
+ pxq = &psDec->outBuf[ psDec->ltp_mem_length ];
+ psDec->sLTP_buf_idx = psDec->ltp_mem_length;
+ /* Loop over subframes */
+ for( k = 0; k < psDec->nb_subfr; k++ ) {
+ A_Q12 = psDecCtrl->PredCoef_Q12[ k >> 1 ];
+
+ /* Preload LPC coeficients to array on stack. Gives small performance gain */
+ SKP_memcpy( A_Q12_tmp, A_Q12, psDec->LPC_order * sizeof( SKP_int16 ) );
+ B_Q14 = &psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER ];
+ Gain_Q16 = psDecCtrl->Gains_Q16[ k ];
+ LTP_scale_Q14 = psDecCtrl->LTP_scale_Q14;
+ sigtype = psDecCtrl->sigtype;
+
+ inv_gain_Q16 = SKP_INVERSE32_varQ( SKP_max( Gain_Q16, 1 ), 32 );
+ inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX );
+
+ /* Calculate Gain adjustment factor */
+ gain_adj_Q16 = ( SKP_int32 )1 << 16;
+ if( inv_gain_Q16 != psDec->prev_inv_gain_Q16 ) {
+ gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, psDec->prev_inv_gain_Q16, 16 );
+ }
+
+ /* Avoid abrupt transition from voiced PLC to unvoiced normal decoding */
+ if( psDec->lossCnt && psDec->prev_sigtype == SIG_TYPE_VOICED &&
+ psDecCtrl->sigtype == SIG_TYPE_UNVOICED && k < ( MAX_NB_SUBFR >> 1 ) ) {
+
+ SKP_memset( B_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ) );
+ B_Q14[ LTP_ORDER/2 ] = ( SKP_int16 )1 << 12; /* 0.25 */
+
+ sigtype = SIG_TYPE_VOICED;
+ psDecCtrl->pitchL[ k ] = psDec->lagPrev;
+ LTP_scale_Q14 = ( SKP_int )1 << 14;
+ }
+
+ if( sigtype == SIG_TYPE_VOICED ) {
+ /* Voiced */
+
+ lag = psDecCtrl->pitchL[ k ];
+ /* Re-whitening */
+ if( ( k & ( 3 - SKP_LSHIFT( NLSF_interpolation_flag, 1 ) ) ) == 0 ) {
+ /* Rewhiten with new A coefs */
+ start_idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2;
+ start_idx = SKP_LIMIT_int( start_idx, 0, psDec->ltp_mem_length - psDec->LPC_order );
+
+ SKP_memset( FiltState, 0, psDec->LPC_order * sizeof( SKP_int32 ) ); /* Not really necessary, but Valgrind and Coverity will complain otherwise */
+ SKP_Silk_MA_Prediction( &psDec->outBuf[ start_idx + k * psDec->subfr_length ],
+ A_Q12, FiltState, sLTP + start_idx, psDec->ltp_mem_length - start_idx, psDec->LPC_order );
+
+ /* After rewhitening the LTP state is unscaled */
+ inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 );
+ if( k == 0 ) {
+ /* Do LTP downscaling */
+ inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, psDecCtrl->LTP_scale_Q14 ), 2 );
+ }
+ for( i = 0; i < (lag + LTP_ORDER/2); i++ ) {
+ psDec->sLTP_Q16[ psDec->sLTP_buf_idx - i - 1 ] = SKP_SMULWB( inv_gain_Q32, sLTP[ psDec->ltp_mem_length - i - 1 ] );
+ }
+ } else {
+ /* Update LTP state when Gain changes */
+ if( gain_adj_Q16 != ( SKP_int32 )1 << 16 ) {
+ for( i = 0; i < ( lag + LTP_ORDER / 2 ); i++ ) {
+ psDec->sLTP_Q16[ psDec->sLTP_buf_idx - i - 1 ] = SKP_SMULWW( gain_adj_Q16, psDec->sLTP_Q16[ psDec->sLTP_buf_idx - i - 1 ] );
+ }
+ }
+ }
+ }
+
+ /* Scale short term state */
+ for( i = 0; i < MAX_LPC_ORDER; i++ ) {
+ psDec->sLPC_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, psDec->sLPC_Q14[ i ] );
+ }
+
+ /* Save inv_gain */
+ SKP_assert( inv_gain_Q16 != 0 );
+ psDec->prev_inv_gain_Q16 = inv_gain_Q16;
+
+ /* Long-term prediction */
+ if( sigtype == SIG_TYPE_VOICED ) {
+ /* Setup pointer */
+ pred_lag_ptr = &psDec->sLTP_Q16[ psDec->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
+ for( i = 0; i < psDec->subfr_length; i++ ) {
+ /* Unrolled loop */
+ LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], B_Q14[ 0 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], B_Q14[ 1 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], B_Q14[ 2 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], B_Q14[ 3 ] );
+ LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], B_Q14[ 4 ] );
+ pred_lag_ptr++;
+
+ /* Generate LPC residual */
+ pres_Q10[ i ] = SKP_ADD32( pexc_Q10[ i ], SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) );
+
+ /* Update states */
+ psDec->sLTP_Q16[ psDec->sLTP_buf_idx ] = SKP_LSHIFT( pres_Q10[ i ], 6 );
+ psDec->sLTP_buf_idx++;
+ }
+ } else {
+ SKP_memcpy( pres_Q10, pexc_Q10, psDec->subfr_length * sizeof( SKP_int32 ) );
+ }
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( res_Q10.dat, pres_Q10, psDec->subfr_length * sizeof( SKP_int32 ) );
+#endif
+
+ for( i = 0; i < psDec->subfr_length; i++ ) {
+ /* Partially unrolled */
+ LPC_pred_Q10 = SKP_SMULWB( psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp[ 0 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12_tmp[ 1 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12_tmp[ 2 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12_tmp[ 3 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12_tmp[ 4 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12_tmp[ 5 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12_tmp[ 6 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12_tmp[ 7 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12_tmp[ 8 ] );
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp[ 9 ] );
+
+ for( j = 10; j < psDec->LPC_order; j ++ ) {
+ LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - j - 1 ], A_Q12_tmp[ j ] );
+ }
+
+ /* Add prediction to LPC residual */
+ vec_Q10[ i ] = SKP_ADD32( pres_Q10[ i ], LPC_pred_Q10 );
+
+ /* Update states */
+ psDec->sLPC_Q14[ MAX_LPC_ORDER + i ] = SKP_LSHIFT( vec_Q10[ i ], 4 );
+ }
+
+ /* Scale with Gain */
+ for( i = 0; i < psDec->subfr_length; i++ ) {
+ pxq[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( vec_Q10[ i ], Gain_Q16 ), 10 ) );
+ }
+
+ /* Update LPC filter state */
+ SKP_memcpy( psDec->sLPC_Q14, &psDec->sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) );
+ pexc_Q10 += psDec->subfr_length;
+ pres_Q10 += psDec->subfr_length;
+ pxq += psDec->subfr_length;
+ }
+
+ /* Copy to output */
+ SKP_memcpy( xq, &psDec->outBuf[ psDec->ltp_mem_length ], psDec->frame_length * sizeof( SKP_int16 ) );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( LTP_buf_Q16.dat, &psDec->sLTP_Q16[psDec->frame_length], psDec->frame_length * sizeof( SKP_int32 ));
+ DEBUG_STORE_DATA( xq_dec.dat, xq, psDec->frame_length * sizeof( SKP_int16 ) );
+#endif
+}
--- /dev/null
+++ b/src_common/SKP_Silk_decode_frame.c
@@ -1,0 +1,176 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+
+#include "SKP_Silk_main.h"
+#include "SKP_Silk_PLC.h"
+
+/****************/
+/* Decode frame */
+/****************/
+SKP_int SKP_Silk_decode_frame(
+ SKP_Silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */
+ SKP_int16 pOut[], /* O Pointer to output speech frame */
+ SKP_int16 *pN, /* O Pointer to size of output frame */
+ const SKP_uint8 pCode[], /* I Pointer to payload */
+ const SKP_int nBytes, /* I Payload length */
+ SKP_int action, /* I Action from Jitter Buffer */
+ SKP_int *decBytes /* O Used bytes to decode this frame */
+)
+{
+ SKP_Silk_decoder_control sDecCtrl;
+ SKP_int L, fs_Khz_old, nb_subfr_old, mv_len, ret = 0;
+ SKP_int Pulses[ MAX_FRAME_LENGTH ];
+ ec_byte_buffer range_dec_celt_buf;
+
+TIC(decode_frame)
+
+ L = psDec->frame_length;
+ sDecCtrl.LTP_scale_Q14 = 0;
+
+ /* Safety checks */
+ SKP_assert( L > 0 && L <= MAX_FRAME_LENGTH );
+
+ /********************************************/
+ /* Decode Frame if packet is not lost */
+ /********************************************/
+ *decBytes = 0;
+ if( action == 0 ) {
+ /********************************************/
+ /* Initialize arithmetic coder */
+ /********************************************/
+ fs_Khz_old = psDec->fs_kHz;
+ nb_subfr_old = psDec->nb_subfr;
+ if( psDec->nFramesDecoded == 0 ) {
+ /* Initialize range decoder state */
+ /* check input */
+ psDec->sRC.error = 0;
+ if( nBytes > MAX_ARITHM_BYTES ) {
+ psDec->sRC.error = RANGE_CODER_DEC_PAYLOAD_TOO_LONG;
+ }
+ ec_byte_writeinit_buffer( &range_dec_celt_buf, psDec->sRC.buffer, nBytes );
+ SKP_memcpy( psDec->sRC.buffer, pCode, nBytes * sizeof( SKP_uint8 ) );
+ ec_dec_init( &psDec->sRC.range_dec_celt_state, &range_dec_celt_buf );
+
+ SKP_Silk_decode_indices_v4( psDec );
+ }
+
+ /********************************************/
+ /* Decode parameters and pulse signal */
+ /********************************************/
+TIC(decode_params)
+ SKP_Silk_decode_parameters_v4( psDec, &sDecCtrl, Pulses, 1 );
+TOC(decode_params)
+
+ if( psDec->sRC.error ) {
+ psDec->nBytesLeft = 0;
+
+ action = 1; /* PLC operation */
+ SKP_Silk_decoder_set_fs( psDec, fs_Khz_old, nb_subfr_old );
+
+ /* Avoid crashing */
+ *decBytes = psDec->sRC.range_dec_celt_state.buf->storage;
+ if( psDec->sRC.error == RANGE_CODER_DEC_PAYLOAD_TOO_LONG ) {
+ ret = SKP_SILK_DEC_PAYLOAD_TOO_LARGE;
+ } else {
+ ret = SKP_SILK_DEC_PAYLOAD_ERROR;
+ }
+ } else {
+ *decBytes = psDec->sRC.range_dec_celt_state.buf->storage - psDec->nBytesLeft;
+ psDec->nFramesDecoded++;
+
+ /* Update lengths. Sampling frequency could have changed */
+ L = psDec->frame_length;
+
+ /********************************************************/
+ /* Run inverse NSQ */
+ /********************************************************/
+TIC(decode_core)
+ SKP_Silk_decode_core( psDec, &sDecCtrl, pOut, Pulses );
+TOC(decode_core)
+
+ /********************************************************/
+ /* Update PLC state */
+ /********************************************************/
+ SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, action );
+
+ psDec->lossCnt = 0;
+ psDec->prev_sigtype = sDecCtrl.sigtype;
+
+ /* A frame has been decoded without errors */
+ psDec->first_frame_after_reset = 0;
+ }
+ }
+ /*************************************************************/
+ /* Generate Concealment frame if packet is lost, or corrupt */
+ /*************************************************************/
+ if( action == 1 ) {
+ /* Handle packet loss by extrapolation */
+ SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, action );
+ psDec->lossCnt++;
+ }
+
+ /*************************/
+ /* Update output buffer. */
+ /*************************/
+ SKP_assert( psDec->ltp_mem_length >= psDec->frame_length );
+ mv_len = psDec->ltp_mem_length - psDec->frame_length;
+ SKP_memmove( psDec->outBuf, &psDec->outBuf[ psDec->ltp_mem_length - mv_len ],
+ mv_len * sizeof(SKP_int16) );
+ SKP_memcpy( &psDec->outBuf[ mv_len ], pOut,
+ psDec->frame_length * sizeof( SKP_int16 ) );
+
+ /****************************************************************/
+ /* Ensure smooth connection of extrapolated and good frames */
+ /****************************************************************/
+ SKP_Silk_PLC_glue_frames( psDec, &sDecCtrl, pOut, L );
+
+ /************************************************/
+ /* Comfort noise generation / estimation */
+ /************************************************/
+ SKP_Silk_CNG( psDec, &sDecCtrl, pOut , L );
+
+ /********************************************/
+ /* HP filter output */
+ /********************************************/
+ SKP_assert( ( ( psDec->fs_kHz == 12 ) && ( L % 3 ) == 0 ) ||
+ ( ( psDec->fs_kHz != 12 ) && ( L % 2 ) == 0 ) );
+TIC(HP_out)
+ SKP_Silk_biquad( pOut, psDec->HP_B, psDec->HP_A, psDec->HPState, pOut, L );
+TOC(HP_out)
+
+ /********************************************/
+ /* set output frame length */
+ /********************************************/
+ *pN = ( SKP_int16 )L;
+
+ /* Update some decoder state variables */
+ psDec->lagPrev = sDecCtrl.pitchL[ MAX_NB_SUBFR - 1 ];
+TOC(decode_frame)
+
+ return ret;
+}
--- /dev/null
+++ b/src_common/SKP_Silk_decode_indices_v4.c
@@ -1,0 +1,202 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Decode indices from payload */
+void SKP_Silk_decode_indices_v4(
+ SKP_Silk_decoder_state *psDec /* I/O State */
+)
+{
+ SKP_int i, k, Ix, fs_kHz_dec, nb_subfr, FrameIndex = 0, FrameTermination;
+ SKP_int sigtype, QuantOffsetType, seed_int, nBytesUsed;
+ SKP_int decode_absolute_lagIndex, delta_lagIndex, prev_lagIndex = 0;
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB = NULL;
+ SKP_Silk_range_coder_state *psRC = &psDec->sRC;
+ /************************/
+ /* Decode sampling rate */
+ /************************/
+ /* only done for first frame of packet */
+ if( psDec->nFramesDecoded == 0 ) {
+ SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_SamplingRates_CDF, SKP_Silk_SamplingRates_offset );
+
+ /* check that sampling rate is supported */
+ if( Ix < 0 || Ix > 3 ) {
+ psRC->error = RANGE_CODER_ILLEGAL_SAMPLING_RATE;
+ return;
+ }
+ fs_kHz_dec = SKP_Silk_SamplingRates_table[ Ix ];
+
+ /* Convert number of subframes to index */
+ SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_NbSubframes_CDF, SKP_Silk_NbSubframes_offset );
+ nb_subfr = (Ix + 1) << 1;
+ SKP_assert( nb_subfr == MAX_NB_SUBFR >> 1 || nb_subfr == MAX_NB_SUBFR );
+
+ SKP_Silk_decoder_set_fs( psDec, fs_kHz_dec, nb_subfr );
+
+ FrameIndex = 0;
+ FrameTermination = SKP_SILK_MORE_FRAMES;
+ }
+
+ while( FrameTermination == SKP_SILK_MORE_FRAMES ) {
+ /*******************/
+ /* Decode VAD flag */
+ /*******************/
+ SKP_Silk_range_decoder( &psDec->vadFlagBuf[ FrameIndex ], psRC, SKP_Silk_vadflag_CDF, SKP_Silk_vadflag_offset );
+
+ /*******************************************/
+ /* Decode signal type and quantizer offset */
+ /*******************************************/
+ if( FrameIndex == 0 ) {
+ /* first frame in packet: independent coding */
+ SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_CDF, SKP_Silk_type_offset_CDF_offset );
+ } else {
+ /* condidtional coding */
+ SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_joint_CDF[ psDec->typeOffsetPrev ],
+ SKP_Silk_type_offset_CDF_offset );
+ }
+ sigtype = SKP_RSHIFT( Ix, 1 );
+ QuantOffsetType = Ix & 1;
+ psDec->typeOffsetPrev = Ix;
+
+ /****************/
+ /* Decode gains */
+ /****************/
+ /* first subframe */
+ if( FrameIndex == 0 ) {
+ /* first frame in packet: independent coding */
+ SKP_Silk_range_decoder( &psDec->GainsIndices[ FrameIndex ][ 0 ], psRC, SKP_Silk_gain_CDF[ sigtype ], SKP_Silk_gain_CDF_offset );
+ } else {
+ /* condidtional coding */
+ SKP_Silk_range_decoder( &psDec->GainsIndices[ FrameIndex ][ 0 ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset );
+ }
+
+ /* remaining subframes */
+ for( i = 1; i < psDec->nb_subfr; i++ ) {
+ SKP_Silk_range_decoder( &psDec->GainsIndices[ FrameIndex ][ i ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset );
+ }
+
+ /**********************/
+ /* Decode LSF Indices */
+ /**********************/
+
+ /* Set pointer to LSF VQ CB for the current signal type */
+ psNLSF_CB = psDec->psNLSF_CB[ sigtype ];
+
+ /* Arithmetically decode NLSF path */
+ SKP_Silk_range_decoder_multi( psDec->NLSFIndices[ FrameIndex ], psRC, psNLSF_CB->StartPtr, psNLSF_CB->MiddleIx, psNLSF_CB->nStages );
+
+ /***********************************/
+ /* Decode LSF interpolation factor */
+ /***********************************/
+ SKP_Silk_range_decoder( &psDec->NLSFInterpCoef_Q2[ FrameIndex ], psRC, SKP_Silk_NLSF_interpolation_factor_CDF,
+ SKP_Silk_NLSF_interpolation_factor_offset );
+
+ if( sigtype == SIG_TYPE_VOICED ) {
+ /*********************/
+ /* Decode pitch lags */
+ /*********************/
+ /* Get lag index */
+ decode_absolute_lagIndex = 1;
+ if( FrameIndex > 0 && psDec->sigtype[ FrameIndex - 1 ] == SIG_TYPE_VOICED ) {
+ /* Decode Delta index */
+ SKP_Silk_range_decoder( &delta_lagIndex,psRC, SKP_Silk_pitch_delta_CDF, SKP_Silk_pitch_delta_CDF_offset );
+ if( delta_lagIndex < ( MAX_DELTA_LAG << 1 ) + 1 ) {
+ delta_lagIndex = delta_lagIndex - MAX_DELTA_LAG;
+ psDec->lagIndex[ FrameIndex ] = prev_lagIndex + delta_lagIndex;
+ decode_absolute_lagIndex = 0;
+ }
+ }
+ if( decode_absolute_lagIndex ) {
+ /* Absolute decoding */
+ if( psDec->fs_kHz == 8 ) {
+ SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_NB_CDF, SKP_Silk_pitch_lag_NB_CDF_offset );
+ } else if( psDec->fs_kHz == 12 ) {
+ SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_MB_CDF, SKP_Silk_pitch_lag_MB_CDF_offset );
+ } else if( psDec->fs_kHz == 16 ) {
+ SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_WB_CDF, SKP_Silk_pitch_lag_WB_CDF_offset );
+ } else {
+ SKP_Silk_range_decoder( &psDec->lagIndex[ FrameIndex ], psRC, SKP_Silk_pitch_lag_SWB_CDF, SKP_Silk_pitch_lag_SWB_CDF_offset );
+ }
+ }
+ prev_lagIndex = psDec->lagIndex[ FrameIndex ];
+
+ /* Get countour index */
+ if( psDec->fs_kHz == 8 ) {
+ /* Less codevectors used in 8 khz mode */
+ SKP_Silk_range_decoder( &psDec->contourIndex[ FrameIndex ], psRC, SKP_Silk_pitch_contour_NB_CDF, SKP_Silk_pitch_contour_NB_CDF_offset );
+ } else {
+ /* Joint for 12, 16, and 24 khz */
+ SKP_Silk_range_decoder( &psDec->contourIndex[ FrameIndex ], psRC, SKP_Silk_pitch_contour_CDF, SKP_Silk_pitch_contour_CDF_offset );
+ }
+
+ /********************/
+ /* Decode LTP gains */
+ /********************/
+ /* Decode PERIndex value */
+ SKP_Silk_range_decoder( &psDec->PERIndex[ FrameIndex ], psRC, SKP_Silk_LTP_per_index_CDF, SKP_Silk_LTP_per_index_CDF_offset );
+
+ for( k = 0; k < psDec->nb_subfr; k++ ) {
+ SKP_Silk_range_decoder( &psDec->LTPIndex[ FrameIndex ][ k ], psRC, SKP_Silk_LTP_gain_CDF_ptrs[ psDec->PERIndex[ FrameIndex ] ],
+ SKP_Silk_LTP_gain_CDF_offsets[ psDec->PERIndex[ FrameIndex ] ] );
+ }
+
+ /**********************/
+ /* Decode LTP scaling */
+ /**********************/
+ SKP_Silk_range_decoder( &psDec->LTP_scaleIndex[ FrameIndex ], psRC, SKP_Silk_LTPscale_CDF, SKP_Silk_LTPscale_offset );
+ }
+
+ /***************/
+ /* Decode seed */
+ /***************/
+ SKP_Silk_range_decoder( &seed_int, psRC, SKP_Silk_Seed_CDF, SKP_Silk_Seed_offset );
+ psDec->Seed[ FrameIndex ] = ( SKP_int32 )seed_int;
+ /**************************************/
+ /* Decode Frame termination indicator */
+ /**************************************/
+ SKP_Silk_range_decoder( &FrameTermination, psRC, SKP_Silk_FrameTermination_v4_CDF, SKP_Silk_FrameTermination_v4_offset );
+
+ psDec->sigtype[ FrameIndex ] = sigtype;
+ psDec->QuantOffsetType[ FrameIndex ] = QuantOffsetType;
+
+ FrameIndex++;
+ }
+
+ /****************************************/
+ /* get number of bytes used so far */
+ /****************************************/
+ SKP_Silk_range_decoder_get_length( psRC, &nBytesUsed );
+ psDec->nBytesLeft = psRC->range_dec_celt_state.buf->storage - nBytesUsed;
+
+ if( psDec->nBytesLeft < 0 ) {
+ psRC->error = RANGE_CODER_READ_BEYOND_BUFFER;
+ }
+
+ psDec->nFramesInPacket = FrameIndex;
+ psDec->FrameTermination = FrameTermination;
+}
--- /dev/null
+++ b/src_common/SKP_Silk_decode_parameters_v4.c
@@ -1,0 +1,162 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Decode parameters from payload */
+void SKP_Silk_decode_parameters_v4(
+ SKP_Silk_decoder_state *psDec, /* I/O State */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int q[ MAX_FRAME_LENGTH ], /* O Excitation signal */
+ const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */
+)
+{
+ SKP_int i, k, Ix, nBytesUsed;
+ SKP_int pNLSF_Q15[ MAX_LPC_ORDER ], pNLSF0_Q15[ MAX_LPC_ORDER ];
+ const SKP_int16 *cbk_ptr_Q14;
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB = NULL;
+ SKP_Silk_range_coder_state *psRC = &psDec->sRC;
+
+ psDec->FrameTermination = SKP_SILK_MORE_FRAMES;
+ psDecCtrl->sigtype = psDec->sigtype[ psDec->nFramesDecoded ];
+ psDecCtrl->QuantOffsetType = psDec->QuantOffsetType[ psDec->nFramesDecoded ];
+ psDec->vadFlag = psDec->vadFlagBuf[ psDec->nFramesDecoded ];
+ psDecCtrl->NLSFInterpCoef_Q2 = psDec->NLSFInterpCoef_Q2[ psDec->nFramesDecoded ];
+ psDecCtrl->Seed = psDec->Seed[ psDec->nFramesDecoded ];
+
+ /* Dequant Gains */
+ SKP_Silk_gains_dequant( psDecCtrl->Gains_Q16, psDec->GainsIndices[ psDec->nFramesDecoded ],
+ &psDec->LastGainIndex, psDec->nFramesDecoded, psDec->nb_subfr );
+ /****************/
+ /* Decode NLSFs */
+ /****************/
+
+ /* Set pointer to NLSF VQ CB for the current signal type */
+ psNLSF_CB = psDec->psNLSF_CB[ psDecCtrl->sigtype ];
+
+ /* From the NLSF path, decode an NLSF vector */
+ SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, psDec->NLSFIndices[ psDec->nFramesDecoded ], psDec->LPC_order );
+
+ /* Convert NLSF parameters to AR prediction filter coefficients */
+ SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order );
+
+ /* If just reset, e.g., because internal Fs changed, do not allow interpolation */
+ /* improves the case of packet loss in the first frame after a switch */
+ if( psDec->first_frame_after_reset == 1 ) {
+ psDecCtrl->NLSFInterpCoef_Q2 = 4;
+ }
+
+ if( psDecCtrl->NLSFInterpCoef_Q2 < 4 ) {
+ /* Calculation of the interpolated NLSF0 vector from the interpolation factor, */
+ /* the previous NLSF1, and the current NLSF1 */
+ for( i = 0; i < psDec->LPC_order; i++ ) {
+ pNLSF0_Q15[ i ] = psDec->prevNLSF_Q15[ i ] + SKP_RSHIFT( SKP_MUL( psDecCtrl->NLSFInterpCoef_Q2,
+ ( pNLSF_Q15[ i ] - psDec->prevNLSF_Q15[ i ] ) ), 2 );
+ }
+
+ /* Convert NLSF parameters to AR prediction filter coefficients */
+ SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order );
+ } else {
+ /* Copy LPC coefficients for first half from second half */
+ SKP_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ],
+ psDec->LPC_order * sizeof( SKP_int16 ) );
+ }
+
+ SKP_memcpy( psDec->prevNLSF_Q15, pNLSF_Q15, psDec->LPC_order * sizeof( SKP_int ) );
+
+ /* After a packet loss do BWE of LPC coefs */
+ if( psDec->lossCnt ) {
+ SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 0 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 );
+ SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 );
+ }
+
+ if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) {
+ /*********************/
+ /* Decode pitch lags */
+ /*********************/
+
+ /* Decode pitch values */
+ SKP_Silk_decode_pitch( psDec->lagIndex[ psDec->nFramesDecoded ], psDec->contourIndex[ psDec->nFramesDecoded ],
+ psDecCtrl->pitchL, psDec->fs_kHz, psDec->nb_subfr );
+
+ /********************/
+ /* Decode LTP gains */
+ /********************/
+ psDecCtrl->PERIndex = psDec->PERIndex[ psDec->nFramesDecoded ];
+
+ /* Decode Codebook Index */
+ cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ psDecCtrl->PERIndex ]; /* set pointer to start of codebook */
+
+ for( k = 0; k < psDec->nb_subfr; k++ ) {
+ Ix = psDec->LTPIndex[ psDec->nFramesDecoded ][ k ];
+ for( i = 0; i < LTP_ORDER; i++ ) {
+ psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( k, LTP_ORDER ) + i ] = cbk_ptr_Q14[ SKP_SMULBB( Ix, LTP_ORDER ) + i ];
+ }
+ }
+
+ /**********************/
+ /* Decode LTP scaling */
+ /**********************/
+ Ix = psDec->LTP_scaleIndex[ psDec->nFramesDecoded ];
+ psDecCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ Ix ];
+ } else {
+ SKP_assert( psDecCtrl->sigtype == SIG_TYPE_UNVOICED );
+ SKP_memset( psDecCtrl->pitchL, 0, psDec->nb_subfr * sizeof( SKP_int ) );
+ SKP_memset( psDecCtrl->LTPCoef_Q14, 0, psDec->nb_subfr * LTP_ORDER * sizeof( SKP_int16 ) );
+ psDecCtrl->PERIndex = 0;
+ psDecCtrl->LTP_scale_Q14 = 0;
+ }
+
+ /*********************************************/
+ /* Decode quantization indices of excitation */
+ /*********************************************/
+TIC(decode_pulses)
+ SKP_Silk_decode_pulses( psRC, psDecCtrl, q, psDec->frame_length );
+TOC(decode_pulses)
+
+ /****************************************/
+ /* get number of bytes used so far */
+ /****************************************/
+ SKP_Silk_range_decoder_get_length( psRC, &nBytesUsed );
+ psDec->nBytesLeft = psRC->range_dec_celt_state.buf->storage - nBytesUsed;
+
+ if( psDec->nBytesLeft < 0 ) {
+ psRC->error = RANGE_CODER_READ_BEYOND_BUFFER;
+ }
+
+ /****************************************/
+ /* check remaining bits in last byte */
+ /****************************************/
+ if( psDec->nBytesLeft == 0 ) {
+ SKP_Silk_range_coder_check_after_decoding( psRC );
+ }
+
+ if( psDec->nFramesInPacket == (psDec->nFramesDecoded + 1)) {
+ /* To indicate the packet has been fully decoded */
+ psDec->FrameTermination = SKP_SILK_LAST_FRAME;
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_decode_pulses.c
@@ -1,0 +1,109 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/*********************************************/
+/* Decode quantization indices of excitation */
+/*********************************************/
+void SKP_Silk_decode_pulses(
+ SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int q[], /* O Excitation signal */
+ const SKP_int frame_length /* I Frame length (preliminary) */
+)
+{
+ SKP_int i, j, k, iter, abs_q, nLS, bit;
+ SKP_int sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ];
+ SKP_int *pulses_ptr;
+ const SKP_uint16 *cdf_ptr;
+
+ /*********************/
+ /* Decode rate level */
+ /*********************/
+ SKP_Silk_range_decoder( &psDecCtrl->RateLevelIndex, psRC,
+ SKP_Silk_rate_levels_CDF[ psDecCtrl->sigtype ], SKP_Silk_rate_levels_CDF_offset );
+
+ /* Calculate number of shell blocks */
+ SKP_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH );
+ iter = SKP_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH );
+ if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ){
+ SKP_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */
+ iter++;
+ }
+ /***************************************************/
+ /* Sum-Weighted-Pulses Decoding */
+ /***************************************************/
+ cdf_ptr = SKP_Silk_pulses_per_block_CDF[ psDecCtrl->RateLevelIndex ];
+ for( i = 0; i < iter; i++ ) {
+ nLshifts[ i ] = 0;
+ SKP_Silk_range_decoder( &sum_pulses[ i ], psRC, cdf_ptr, SKP_Silk_pulses_per_block_CDF_offset );
+
+ /* LSB indication */
+ while( sum_pulses[ i ] == ( MAX_PULSES + 1 ) ) {
+ nLshifts[ i ]++;
+ SKP_Silk_range_decoder( &sum_pulses[ i ], psRC,
+ SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ], SKP_Silk_pulses_per_block_CDF_offset );
+ }
+ }
+
+ /***************************************************/
+ /* Shell decoding */
+ /***************************************************/
+ for( i = 0; i < iter; i++ ) {
+ if( sum_pulses[ i ] > 0 ) {
+ SKP_Silk_shell_decoder( &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRC, sum_pulses[ i ] );
+ } else {
+ SKP_memset( &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( SKP_int ) );
+ }
+ }
+
+ /***************************************************/
+ /* LSB Decoding */
+ /***************************************************/
+ for( i = 0; i < iter; i++ ) {
+ if( nLshifts[ i ] > 0 ) {
+ nLS = nLshifts[ i ];
+ pulses_ptr = &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ];
+ for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
+ abs_q = pulses_ptr[ k ];
+ for( j = 0; j < nLS; j++ ) {
+ abs_q = SKP_LSHIFT( abs_q, 1 );
+ SKP_Silk_range_decoder( &bit, psRC, SKP_Silk_lsb_CDF, 1 );
+ abs_q += bit;
+ }
+ pulses_ptr[ k ] = abs_q;
+ }
+ }
+ }
+
+ /****************************************/
+ /* Decode and add signs to pulse signal */
+ /****************************************/
+ SKP_Silk_decode_signs( psRC, q, frame_length, psDecCtrl->sigtype,
+ psDecCtrl->QuantOffsetType, psDecCtrl->RateLevelIndex);
+}
--- /dev/null
+++ b/src_common/SKP_Silk_decoder_set_fs.c
@@ -1,0 +1,85 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Set decoder sampling rate */
+void SKP_Silk_decoder_set_fs(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state pointer */
+ SKP_int fs_kHz, /* I Sampling frequency (kHz) */
+ SKP_int nb_subfr /* I Number of subframes */
+)
+{
+ psDec->nb_subfr = nb_subfr;
+ psDec->frame_length = SKP_SMULBB( psDec->nb_subfr, psDec->subfr_length );
+ if( psDec->fs_kHz != fs_kHz ) {
+ psDec->fs_kHz = fs_kHz;
+ psDec->subfr_length = SKP_SMULBB( SUB_FRAME_LENGTH_MS, fs_kHz );
+ psDec->frame_length = SKP_SMULBB( psDec->nb_subfr, psDec->subfr_length );
+ psDec->ltp_mem_length = SKP_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz );
+ if( psDec->fs_kHz == 8 ) {
+ psDec->LPC_order = MIN_LPC_ORDER;
+ psDec->psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_10;
+ psDec->psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_10;
+ } else {
+ psDec->LPC_order = MAX_LPC_ORDER;
+ psDec->psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_16;
+ psDec->psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_16;
+ }
+ /* Reset part of the decoder state */
+ SKP_memset( psDec->sLPC_Q14, 0, MAX_LPC_ORDER * sizeof( SKP_int32 ) );
+ SKP_memset( psDec->outBuf, 0, MAX_FRAME_LENGTH * sizeof( SKP_int16 ) );
+ SKP_memset( psDec->prevNLSF_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) );
+
+ psDec->sLTP_buf_idx = 0;
+ psDec->lagPrev = 100;
+ psDec->LastGainIndex = 1;
+ psDec->prev_sigtype = 0;
+ psDec->first_frame_after_reset = 1;
+
+ if( fs_kHz == 24 ) {
+ psDec->HP_A = SKP_Silk_Dec_A_HP_24;
+ psDec->HP_B = SKP_Silk_Dec_B_HP_24;
+ } else if( fs_kHz == 16 ) {
+ psDec->HP_A = SKP_Silk_Dec_A_HP_16;
+ psDec->HP_B = SKP_Silk_Dec_B_HP_16;
+ } else if( fs_kHz == 12 ) {
+ psDec->HP_A = SKP_Silk_Dec_A_HP_12;
+ psDec->HP_B = SKP_Silk_Dec_B_HP_12;
+ } else if( fs_kHz == 8 ) {
+ psDec->HP_A = SKP_Silk_Dec_A_HP_8;
+ psDec->HP_B = SKP_Silk_Dec_B_HP_8;
+ } else {
+ /* unsupported sampling rate */
+ SKP_assert( 0 );
+ }
+ }
+
+ /* Check that settings are valid */
+ SKP_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH );
+}
+
--- /dev/null
+++ b/src_common/SKP_Silk_define.h
@@ -1,0 +1,317 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_DEFINE_H
+#define SKP_SILK_DEFINE_H
+
+#include "SKP_Silk_errors.h"
+#include "SKP_Silk_typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define MAX_FRAMES_PER_PACKET 3
+
+#ifndef FIXED_POINT
+# define FIXED_POINT 0
+#endif
+
+/* MAX DELTA LAG used for multiframe packets */
+#define MAX_DELTA_LAG 10
+
+/* Lower limit on bitrate for each mode */
+#define MIN_TARGET_RATE_NB_BPS 5000
+#define MIN_TARGET_RATE_MB_BPS 7000
+#define MIN_TARGET_RATE_WB_BPS 8000
+#define MIN_TARGET_RATE_SWB_BPS 20000
+
+/* Transition bitrates between modes */
+#define SWB2WB_BITRATE_BPS 25000
+#define WB2SWB_BITRATE_BPS 30000
+#define WB2MB_BITRATE_BPS 14000
+#define MB2WB_BITRATE_BPS 18000
+#define MB2NB_BITRATE_BPS 10000
+#define NB2MB_BITRATE_BPS 14000
+
+/* Integration/hysteresis threshold for lowering internal sample frequency */
+/* 30000000 -> 6 sec if bitrate is 5000 bps below limit; 3 sec if bitrate is 10000 bps below limit */
+#define ACCUM_BITS_DIFF_THRESHOLD 30000000
+#define TARGET_RATE_TAB_SZ 8
+
+/* DTX settings */
+#define NO_SPEECH_FRAMES_BEFORE_DTX 5 /* eq 100 ms */
+#define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */
+
+#define USE_LBRR 1
+
+/* Amount of concecutive no FEC packets before telling JB */
+#define NO_LBRR_THRES 10
+
+/* Maximum delay between real packet and LBRR packet */
+#define MAX_LBRR_DELAY 2
+#define LBRR_IDX_MASK 1
+
+#define INBAND_FEC_MIN_RATE_BPS 18000 /* Dont use inband FEC below this total target rate */
+#define LBRR_LOSS_THRES 2 /* Start adding LBRR at this loss rate (needs tuning) */
+
+/* LBRR usage defines */
+#define SKP_SILK_NO_LBRR 0 /* No LBRR information for this packet */
+#define SKP_SILK_ADD_LBRR_TO_PLUS1 1 /* Add LBRR for this packet to packet n + 1 */
+#define SKP_SILK_ADD_LBRR_TO_PLUS2 2 /* Add LBRR for this packet to packet n + 2 */
+
+/* Frame termination indicator defines */
+#define SKP_SILK_LAST_FRAME 0 /* Last frames in packet */
+#define SKP_SILK_MORE_FRAMES 1 /* More frames to follow this one */
+#define SKP_SILK_LBRR_VER1 2 /* LBRR information from packet n - 1 */
+#define SKP_SILK_LBRR_VER2 3 /* LBRR information from packet n - 2 */
+#define SKP_SILK_EXT_LAYER 4 /* Extension layers added */
+
+/* Number of Second order Sections for SWB detection HP filter */
+#define NB_SOS 3
+#define HP_8_KHZ_THRES 10 /* average energy per sample, above 8 kHz */
+#define CONCEC_SWB_SMPLS_THRES 480 * 15 /* 300 ms */
+#define WB_DETECT_ACTIVE_SPEECH_MS_THRES 15000 /* ms of active speech needed for WB detection */
+
+/* Low complexity setting */
+#define LOW_COMPLEXITY_ONLY 0
+
+/* Activate bandwidth transition filtering for mode switching */
+# define SWITCH_TRANSITION_FILTERING 1
+
+/* Decoder Parameters */
+#define DEC_HP_ORDER 2
+
+/* Maximum sampling frequency, should be 16 for embedded */
+#define MAX_FS_KHZ 24
+#define MAX_API_FS_KHZ 48
+
+/* Signal Types used by silk */
+#define SIG_TYPE_VOICED 0
+#define SIG_TYPE_UNVOICED 1
+
+/* VAD Types used by silk */
+#define NO_VOICE_ACTIVITY 0
+#define VOICE_ACTIVITY 1
+
+/* Number of subframes */
+#define MAX_NB_SUBFR 4
+
+/* number of samples per frame */
+#define LTP_MEM_LENGTH_MS 20
+#define SUB_FRAME_LENGTH_MS 5
+#define MAX_SUB_FRAME_LENGTH ( SUB_FRAME_LENGTH_MS * MAX_FS_KHZ )
+#define MAX_FRAME_LENGTH_MS ( SUB_FRAME_LENGTH_MS * MAX_NB_SUBFR )
+#define MAX_FRAME_LENGTH ( MAX_FRAME_LENGTH_MS * MAX_FS_KHZ )
+
+/* number of lookahead samples for pitch analysis */
+#define LA_PITCH_MS 3
+#define LA_PITCH_MAX (LA_PITCH_MS * MAX_FS_KHZ)
+
+/* number of lookahead samples for noise shape analysis */
+#define LA_SHAPE_MS 5
+#define LA_SHAPE_MAX (LA_SHAPE_MS * MAX_FS_KHZ)
+
+/* Order of LPC used in find pitch */
+#define MAX_FIND_PITCH_LPC_ORDER 16
+
+/* Length of LPC window used in find pitch */
+#define FIND_PITCH_LPC_WIN_MS (30 + (LA_PITCH_MS << 1))
+#define FIND_PITCH_LPC_WIN_MS_2_SF (15 + (LA_PITCH_MS << 1))
+#define FIND_PITCH_LPC_WIN_MAX (FIND_PITCH_LPC_WIN_MS * MAX_FS_KHZ)
+
+#define PITCH_EST_COMPLEXITY_HC_MODE SKP_Silk_PE_MAX_COMPLEX
+#define PITCH_EST_COMPLEXITY_MC_MODE SKP_Silk_PE_MID_COMPLEX
+#define PITCH_EST_COMPLEXITY_LC_MODE SKP_Silk_PE_MIN_COMPLEX
+
+
+/* Max number of bytes in payload output buffer (may contain multiple frames) */
+#define MAX_ARITHM_BYTES 1024
+
+#define RANGE_CODER_WRITE_BEYOND_BUFFER -1
+#define RANGE_CODER_CDF_OUT_OF_RANGE -2
+#define RANGE_CODER_NORMALIZATION_FAILED -3
+#define RANGE_CODER_ZERO_INTERVAL_WIDTH -4
+#define RANGE_CODER_DECODER_CHECK_FAILED -5
+#define RANGE_CODER_READ_BEYOND_BUFFER -6
+#define RANGE_CODER_ILLEGAL_SAMPLING_RATE -7
+#define RANGE_CODER_DEC_PAYLOAD_TOO_LONG -8
+
+/* dB level of lowest gain quantization level */
+#define MIN_QGAIN_DB 6
+/* dB level of highest gain quantization level */
+#define MAX_QGAIN_DB 86
+/* Number of gain quantization levels */
+#define N_LEVELS_QGAIN 64
+/* Max increase in gain quantization index */
+#define MAX_DELTA_GAIN_QUANT 40
+/* Max decrease in gain quantization index */
+#define MIN_DELTA_GAIN_QUANT -4
+
+/* Quantization offsets (multiples of 4) */
+#define OFFSET_VL_Q10 32
+#define OFFSET_VH_Q10 100
+#define OFFSET_UVL_Q10 100
+#define OFFSET_UVH_Q10 256
+
+/* Maximum numbers of iterations used to stabilize a LPC vector */
+#define MAX_LPC_STABILIZE_ITERATIONS 20
+
+#define MAX_LPC_ORDER 16
+#define MIN_LPC_ORDER 10
+
+/* Find Pred Coef defines */
+#define LTP_ORDER 5
+
+/* LTP quantization settings */
+#define NB_LTP_CBKS 3
+
+/* Flag to use harmonic noise shaping */
+#define USE_HARM_SHAPING 1
+
+/* Max LPC order of noise shaping filters */
+#define MAX_SHAPE_LPC_ORDER 16
+
+#define HARM_SHAPE_FIR_TAPS 3
+
+/* Length of LPC window used in noise shape analysis */
+#define SHAPE_LPC_WIN_MS 15
+#define SHAPE_LPC_WIN_16_KHZ (SHAPE_LPC_WIN_MS * 16)
+#define SHAPE_LPC_WIN_24_KHZ (SHAPE_LPC_WIN_MS * 24)
+#define SHAPE_LPC_WIN_MAX (SHAPE_LPC_WIN_MS * MAX_FS_KHZ)
+
+/* Maximum number of delayed decision states */
+#define MAX_DEL_DEC_STATES 4
+
+#define LTP_BUF_LENGTH 512
+#define LTP_MASK (LTP_BUF_LENGTH - 1)
+
+#define DECISION_DELAY 32
+#define DECISION_DELAY_MASK (DECISION_DELAY - 1)
+
+/* number of subframes for excitation entropy coding */
+#define SHELL_CODEC_FRAME_LENGTH 16
+#define LOG2_SHELL_CODEC_FRAME_LENGTH 4
+#define MAX_NB_SHELL_BLOCKS (MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH)
+
+/* number of rate levels, for entropy coding of excitation */
+#define N_RATE_LEVELS 10
+
+/* maximum sum of pulses per shell coding frame */
+#define MAX_PULSES 18
+
+#define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */
+
+#if( MAX_LPC_ORDER > DECISION_DELAY )
+# define NSQ_LPC_BUF_LENGTH MAX_LPC_ORDER
+#else
+# define NSQ_LPC_BUF_LENGTH DECISION_DELAY
+#endif
+
+/***********************/
+/* High pass filtering */
+/***********************/
+#define HIGH_PASS_INPUT 1
+
+/***************************/
+/* Voice activity detector */
+/***************************/
+#define VAD_N_BANDS 4
+
+#define VAD_INTERNAL_SUBFRAMES_LOG2 2
+#define VAD_INTERNAL_SUBFRAMES (1 << VAD_INTERNAL_SUBFRAMES_LOG2)
+
+#define VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 1024 /* Must be < 4096 */
+#define VAD_NOISE_LEVELS_BIAS 50
+
+/* Sigmoid settings */
+#define VAD_NEGATIVE_OFFSET_Q5 128 /* sigmoid is 0 at -128 */
+#define VAD_SNR_FACTOR_Q16 45000
+
+/* smoothing for SNR measurement */
+#define VAD_SNR_SMOOTH_COEF_Q18 4096
+
+/******************/
+/* NLSF quantizer */
+/******************/
+# define NLSF_MSVQ_MAX_CB_STAGES 10 /* Update manually when changing codebooks */
+# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE 128 /* Update manually when changing codebooks */
+# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END 16 /* Update manually when changing codebooks */
+
+#define NLSF_MSVQ_FLUCTUATION_REDUCTION 1
+#define MAX_NLSF_MSVQ_SURVIVORS 16
+#define MAX_NLSF_MSVQ_SURVIVORS_LC_MODE 2
+#define MAX_NLSF_MSVQ_SURVIVORS_MC_MODE 4
+
+/* Based on above defines, calculate how much memory is necessary to allocate */
+#if( NLSF_MSVQ_MAX_VECTORS_IN_STAGE > ( MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END ) )
+# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE NLSF_MSVQ_MAX_VECTORS_IN_STAGE
+#else
+# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END
+#endif
+
+#if( NLSF_MSVQ_MAX_VECTORS_IN_STAGE > ( MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END ) )
+# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED NLSF_MSVQ_MAX_VECTORS_IN_STAGE
+#else
+# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END
+#endif
+
+#define NLSF_MSVQ_SURV_MAX_REL_RD 4
+
+/* Transition filtering for mode switching */
+#if SWITCH_TRANSITION_FILTERING
+# define TRANSITION_TIME_UP_MS 5120 // 5120 = 64 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 64*(20*4)
+# define TRANSITION_TIME_DOWN_MS 2560 // 2560 = 32 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 32*(20*4)
+# define TRANSITION_NB 3 /* Hardcoded in tables */
+# define TRANSITION_NA 2 /* Hardcoded in tables */
+# define TRANSITION_INT_NUM 5 /* Hardcoded in tables */
+# define TRANSITION_FRAMES_UP ( TRANSITION_TIME_UP_MS / MAX_FRAME_LENGTH_MS ) // NB! needs to be made flexible for 10 ms frames
+# define TRANSITION_FRAMES_DOWN ( TRANSITION_TIME_DOWN_MS / MAX_FRAME_LENGTH_MS ) // NB! needs to be made flexible for 10 ms frames
+# define TRANSITION_INT_STEPS_UP ( TRANSITION_FRAMES_UP / ( TRANSITION_INT_NUM - 1 ) )
+# define TRANSITION_INT_STEPS_DOWN ( TRANSITION_FRAMES_DOWN / ( TRANSITION_INT_NUM - 1 ) )
+#endif
+
+/* BWE factors to apply after packet loss */
+#define BWE_AFTER_LOSS_Q16 63570
+
+/*************************/
+/* Perceptual parameters */
+/*************************/
+/* Amount of warping to apply */
+#define WARPING_MULTIPLIER_Q16 SKP_FIX_CONST( 0.02, 16 )
+
+/* Defines for CN generation */
+#define CNG_BUF_MASK_MAX 255 /* 2^floor(log2(MAX_FRAME_LENGTH))-1 */
+#define CNG_GAIN_SMTH_Q16 4634 /* 0.25^(1/4) */
+#define CNG_NLSF_SMTH_Q16 16348 /* 0.25 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_common/SKP_Silk_detect_SWB_input.c
@@ -1,0 +1,76 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/*
+ * Detect SWB input by measuring energy above 8 kHz.
+ */
+
+#include "SKP_Silk_main.h"
+
+void SKP_Silk_detect_SWB_input(
+ SKP_Silk_detect_SWB_state *psSWBdetect, /* (I/O) encoder state */
+ const SKP_int16 samplesIn[], /* (I) input to encoder */
+ SKP_int nSamplesIn /* (I) length of input */
+)
+{
+ SKP_int HP_8_kHz_len, i, shift;
+ SKP_int16 in_HP_8_kHz[ MAX_FRAME_LENGTH ];
+ SKP_int32 energy_32;
+
+ /* High pass filter with cutoff at 8 khz */
+ HP_8_kHz_len = SKP_min_int( nSamplesIn, MAX_FRAME_LENGTH );
+ HP_8_kHz_len = SKP_max_int( HP_8_kHz_len, 0 );
+
+ /* Cutoff around 9 khz */
+ /* A = conv(conv([8192,14613, 6868], [8192,12883, 7337]), [8192,11586, 7911]); */
+ /* B = conv(conv([575, -948, 575], [575, -221, 575]), [575, 104, 575]); */
+ SKP_Silk_biquad( samplesIn, SKP_Silk_SWB_detect_B_HP_Q13[ 0 ], SKP_Silk_SWB_detect_A_HP_Q13[ 0 ],
+ psSWBdetect->S_HP_8_kHz[ 0 ], in_HP_8_kHz, HP_8_kHz_len );
+ for( i = 1; i < NB_SOS; i++ ) {
+ SKP_Silk_biquad( in_HP_8_kHz, SKP_Silk_SWB_detect_B_HP_Q13[ i ], SKP_Silk_SWB_detect_A_HP_Q13[ i ],
+ psSWBdetect->S_HP_8_kHz[ i ], in_HP_8_kHz, HP_8_kHz_len );
+ }
+
+ /* Calculate energy in HP signal */
+ SKP_Silk_sum_sqr_shift( &energy_32, &shift, in_HP_8_kHz, HP_8_kHz_len );
+
+ /* Count concecutive samples above threshold, after adjusting threshold for number of input samples and shift */
+ if( energy_32 > SKP_RSHIFT( SKP_SMULBB( HP_8_KHZ_THRES, HP_8_kHz_len ), shift ) ) {
+ psSWBdetect->ConsecSmplsAboveThres += nSamplesIn;
+ if( psSWBdetect->ConsecSmplsAboveThres > CONCEC_SWB_SMPLS_THRES ) {
+ psSWBdetect->SWB_detected = 1;
+ }
+ } else {
+ psSWBdetect->ConsecSmplsAboveThres -= nSamplesIn;
+ psSWBdetect->ConsecSmplsAboveThres = SKP_max( psSWBdetect->ConsecSmplsAboveThres, 0 );
+ }
+
+ /* If sufficient speech activity and no SWB detected, we detect the signal as being WB */
+ if( ( psSWBdetect->ActiveSpeech_ms > WB_DETECT_ACTIVE_SPEECH_MS_THRES ) && ( psSWBdetect->SWB_detected == 0 ) ) {
+ psSWBdetect->WB_detected = 1;
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_enc_API.c
@@ -1,0 +1,242 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+
+#include "SKP_Silk_define.h"
+#include "SKP_Silk_SDK_API.h"
+#include "SKP_Silk_control.h"
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_structs.h"
+#if FIXED_POINT
+#include "SKP_Silk_main_FIX.h"
+#define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FIX
+#define SKP_Silk_init_encoder_Fxx SKP_Silk_init_encoder_FIX
+#define SKP_Silk_control_encoder_Fxx SKP_Silk_control_encoder_FIX
+#define SKP_Silk_encode_frame_Fxx SKP_Silk_encode_frame_FIX
+#else
+#include "SKP_Silk_main_FLP.h"
+#define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FLP
+#define SKP_Silk_init_encoder_Fxx SKP_Silk_init_encoder_FLP
+#define SKP_Silk_control_encoder_Fxx SKP_Silk_control_encoder_FLP
+#define SKP_Silk_encode_frame_Fxx SKP_Silk_encode_frame_FLP
+#endif
+#define SKP_Silk_EncodeControlStruct SKP_SILK_SDK_EncControlStruct
+
+
+/****************************************/
+/* Encoder functions */
+/****************************************/
+
+SKP_int SKP_Silk_SDK_Get_Encoder_Size( SKP_int32 *encSizeBytes )
+{
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+ *encSizeBytes = sizeof( SKP_Silk_encoder_state_Fxx );
+
+ return ret;
+}
+
+
+/***************************************/
+/* Read control structure from encoder */
+/***************************************/
+SKP_int SKP_Silk_SDK_QueryEncoder(
+ const void *encState, /* I: State Vector */
+ SKP_Silk_EncodeControlStruct *encStatus /* O: Control Structure */
+)
+{
+ SKP_Silk_encoder_state_Fxx *psEnc;
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+ psEnc = ( SKP_Silk_encoder_state_Fxx* )encState;
+
+ encStatus->API_sampleRate = psEnc->sCmn.API_fs_Hz;
+ encStatus->maxInternalSampleRate = SKP_SMULBB( psEnc->sCmn.maxInternal_fs_kHz, 1000 );
+ encStatus->packetSize = ( SKP_int )SKP_DIV32_16( psEnc->sCmn.API_fs_Hz * psEnc->sCmn.PacketSize_ms, 1000 ); /* convert samples -> ms */
+ encStatus->bitRate = psEnc->sCmn.TargetRate_bps;
+ encStatus->packetLossPercentage = psEnc->sCmn.PacketLoss_perc;
+ encStatus->complexity = psEnc->sCmn.Complexity;
+ encStatus->useInBandFEC = psEnc->sCmn.useInBandFEC;
+ encStatus->useDTX = psEnc->sCmn.useDTX;
+ return ret;
+}
+
+/*************************/
+/* Init or Reset encoder */
+/*************************/
+SKP_int SKP_Silk_SDK_InitEncoder(
+ void *encState, /* I/O: State */
+ SKP_Silk_EncodeControlStruct *encStatus /* O: Control structure */
+)
+{
+ SKP_Silk_encoder_state_Fxx *psEnc;
+ SKP_int ret = SKP_SILK_NO_ERROR;
+
+
+ psEnc = ( SKP_Silk_encoder_state_Fxx* )encState;
+
+ /* Reset Encoder */
+ if( ret += SKP_Silk_init_encoder_Fxx( psEnc ) ) {
+ SKP_assert( 0 );
+ }
+
+ /* Read control structure */
+ if( ret += SKP_Silk_SDK_QueryEncoder( encState, encStatus ) ) {
+ SKP_assert( 0 );
+ }
+
+
+ return ret;
+}
+
+/**************************/
+/* Encode frame with Silk */
+/**************************/
+SKP_int SKP_Silk_SDK_Encode(
+ void *encState, /* I/O: State */
+ const SKP_Silk_EncodeControlStruct *encControl, /* I: Control structure */
+ const SKP_int16 *samplesIn, /* I: Speech sample input vector */
+ SKP_int nSamplesIn, /* I: Number of samples in input vector */
+ SKP_uint8 *outData, /* O: Encoded output vector */
+ SKP_int16 *nBytesOut /* I/O: Number of bytes in outData (input: Max bytes) */
+)
+{
+ SKP_int max_internal_fs_kHz, PacketSize_ms, PacketLoss_perc, UseInBandFEC, UseDTX, ret = SKP_SILK_NO_ERROR;
+ SKP_int nSamplesToBuffer, Complexity, input_ms, nSamplesFromInput = 0;
+ SKP_int32 TargetRate_bps, API_fs_Hz;
+ SKP_int16 MaxBytesOut;
+ SKP_Silk_encoder_state_Fxx *psEnc = ( SKP_Silk_encoder_state_Fxx* )encState;
+
+ SKP_assert( encControl != NULL );
+
+ /* Check sampling frequency first, to avoid divide by zero later */
+ if( ( ( encControl->API_sampleRate != 8000 ) &&
+ ( encControl->API_sampleRate != 12000 ) &&
+ ( encControl->API_sampleRate != 16000 ) &&
+ ( encControl->API_sampleRate != 24000 ) &&
+ ( encControl->API_sampleRate != 32000 ) &&
+ ( encControl->API_sampleRate != 44100 ) &&
+ ( encControl->API_sampleRate != 48000 ) ) ||
+ ( ( encControl->maxInternalSampleRate != 8000 ) &&
+ ( encControl->maxInternalSampleRate != 12000 ) &&
+ ( encControl->maxInternalSampleRate != 16000 ) &&
+ ( encControl->maxInternalSampleRate != 24000 ) ) ) {
+ ret = SKP_SILK_ENC_FS_NOT_SUPPORTED;
+ SKP_assert( 0 );
+ return( ret );
+ }
+
+ /* Set encoder parameters from control structure */
+ API_fs_Hz = encControl->API_sampleRate;
+ max_internal_fs_kHz = SKP_DIV32_16( ( SKP_int )encControl->maxInternalSampleRate, 1000 ); /* convert Hz -> kHz */
+ PacketSize_ms = SKP_DIV32( 1000 * ( SKP_int )encControl->packetSize, API_fs_Hz );
+ TargetRate_bps = ( SKP_int32 )encControl->bitRate;
+ PacketLoss_perc = ( SKP_int )encControl->packetLossPercentage;
+ UseInBandFEC = ( SKP_int )encControl->useInBandFEC;
+ Complexity = ( SKP_int )encControl->complexity;
+ UseDTX = ( SKP_int )encControl->useDTX;
+ /* Save values in state */
+ psEnc->sCmn.API_fs_Hz = API_fs_Hz;
+ psEnc->sCmn.maxInternal_fs_kHz = max_internal_fs_kHz;
+ psEnc->sCmn.useInBandFEC = UseInBandFEC;
+
+ /* Only accept input lengths that are a multiplum of 10 ms */
+ input_ms = SKP_DIV32( 1000 * nSamplesIn, API_fs_Hz );
+ if( ( input_ms % 10) != 0 || nSamplesIn < 0 ) {
+ ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
+ SKP_assert( 0 );
+ return( ret );
+ }
+
+ /* Make sure no more than one packet can be produced */
+ if( nSamplesIn > SKP_DIV32_16( psEnc->sCmn.PacketSize_ms * API_fs_Hz, 1000 ) ) {
+ ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
+ SKP_assert( 0 );
+ return( ret );
+ }
+ if( ( ret = SKP_Silk_control_encoder_Fxx( psEnc, API_fs_Hz, max_internal_fs_kHz, PacketSize_ms, TargetRate_bps,
+ PacketLoss_perc, UseInBandFEC, UseDTX, input_ms, Complexity) ) != 0 ) {
+ SKP_assert( 0 );
+ return( ret );
+ }
+
+ /* Detect energy above 8 kHz */
+ if( SKP_min( API_fs_Hz, 1000 * max_internal_fs_kHz ) == 24000 && psEnc->sCmn.sSWBdetect.SWB_detected == 0 && psEnc->sCmn.sSWBdetect.WB_detected == 0 ) {
+ SKP_Silk_detect_SWB_input( &psEnc->sCmn.sSWBdetect, samplesIn, ( SKP_int )nSamplesIn );
+ }
+
+ /* Input buffering/resampling and encoding */
+ MaxBytesOut = 0; /* return 0 output bytes if no encoder called */
+ while( 1 ) {
+ nSamplesToBuffer = psEnc->sCmn.frame_length - psEnc->sCmn.inputBufIx;
+ if( API_fs_Hz == SKP_SMULBB( 1000, psEnc->sCmn.fs_kHz ) ) {
+ nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, nSamplesIn );
+ nSamplesFromInput = nSamplesToBuffer;
+ /* Copy to buffer */
+ SKP_memcpy( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], samplesIn, nSamplesFromInput * sizeof( SKP_int16 ) );
+ } else {
+ nSamplesToBuffer = SKP_min( nSamplesToBuffer, SKP_DIV32( ( SKP_int32 )nSamplesIn * psEnc->sCmn.fs_kHz * 1000, API_fs_Hz ) );
+ nSamplesFromInput = SKP_DIV32_16( nSamplesToBuffer * API_fs_Hz, psEnc->sCmn.fs_kHz * 1000 );
+ /* Resample and write to buffer */
+ ret += SKP_Silk_resampler( &psEnc->sCmn.resampler_state, &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], samplesIn, nSamplesFromInput );
+ }
+ samplesIn += nSamplesFromInput;
+ nSamplesIn -= nSamplesFromInput;
+ psEnc->sCmn.inputBufIx += nSamplesToBuffer;
+
+ /* Silk encoder */
+ if( psEnc->sCmn.inputBufIx >= psEnc->sCmn.frame_length ) {
+ /* Enough data in input buffer, so encode */
+ if( MaxBytesOut == 0 ) {
+ /* No payload obtained so far */
+ MaxBytesOut = *nBytesOut;
+ if( ( ret = SKP_Silk_encode_frame_Fxx( psEnc, outData, &MaxBytesOut, psEnc->sCmn.inputBuf ) ) != 0 ) {
+ SKP_assert( 0 );
+ }
+ } else {
+ /* outData already contains a payload */
+ if( ( ret = SKP_Silk_encode_frame_Fxx( psEnc, outData, nBytesOut, psEnc->sCmn.inputBuf ) ) != 0 ) {
+ SKP_assert( 0 );
+ }
+ /* Check that no second payload was created */
+ SKP_assert( *nBytesOut == 0 );
+ }
+ psEnc->sCmn.inputBufIx = 0;
+ } else {
+ break;
+ }
+ }
+
+ *nBytesOut = MaxBytesOut;
+ if( psEnc->sCmn.useDTX && psEnc->sCmn.inDTX ) {
+ /* DTX simulation */
+ *nBytesOut = 0;
+ }
+
+ return ret;
+}
+
--- /dev/null
+++ b/src_common/SKP_Silk_encode_parameters_v4.c
@@ -1,0 +1,232 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/*******************************************/
+/* Encode parameters to create the payload */
+/*******************************************/
+void SKP_Silk_encode_parameters_v4(
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */
+ SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */
+ SKP_Silk_range_coder_state *psRC /* I/O Range encoder state */
+)
+{
+ SKP_int i, k, typeOffset;
+ SKP_int encode_absolute_lagIndex, delta_lagIndex;
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB;
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_int nBytes_lagIndex, nBytes_contourIndex, nBytes_LTP;
+ SKP_int nBytes_after, nBytes_before;
+#endif
+
+ /*************************************/
+ /* Encode sampling rate and */
+ /* number of subframes in each frame */
+ /*************************************/
+ /* only done for first frame in packet */
+ if( psEncC->nFramesInPayloadBuf == 0 ) {
+ /* get sampling rate index */
+ for( i = 0; i < 3; i++ ) {
+ if( SKP_Silk_SamplingRates_table[ i ] == psEncC->fs_kHz ) {
+ break;
+ }
+ }
+ SKP_Silk_range_encoder( psRC, i, SKP_Silk_SamplingRates_CDF );
+
+ /* Convert number of subframes to index */
+ SKP_assert( psEncC->nb_subfr == MAX_NB_SUBFR >> 1 || psEncC->nb_subfr == MAX_NB_SUBFR );
+ i = (psEncC->nb_subfr >> 1) - 1;
+ SKP_Silk_range_encoder( psRC, i, SKP_Silk_NbSubframes_CDF );
+ }
+
+ /*********************************************/
+ /* Encode VAD flag */
+ /*********************************************/
+ SKP_Silk_range_encoder( psRC, psEncC->vadFlag, SKP_Silk_vadflag_CDF );
+
+ /*******************************************/
+ /* Encode signal type and quantizer offset */
+ /*******************************************/
+ typeOffset = 2 * psEncCtrlC->sigtype + psEncCtrlC->QuantOffsetType;
+ if( psEncC->nFramesInPayloadBuf == 0 ) {
+ /* first frame in packet: independent coding */
+ SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_CDF );
+ } else {
+ /* condidtional coding */
+ SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_joint_CDF[ psEncC->typeOffsetPrev ] );
+ }
+ psEncC->typeOffsetPrev = typeOffset;
+
+ /****************/
+ /* Encode gains */
+ /****************/
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_before );
+#endif
+ /* first subframe */
+ if( psEncC->nFramesInPayloadBuf == 0 ) {
+ /* first frame in packet: independent coding */
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_gain_CDF[ psEncCtrlC->sigtype ] );
+ } else {
+ /* condidtional coding */
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_delta_gain_CDF );
+ }
+
+ /* remaining subframes */
+ for( i = 1; i < psEncC->nb_subfr; i++ ) {
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ i ], SKP_Silk_delta_gain_CDF );
+ }
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_after );
+ nBytes_after -= nBytes_before; // bytes just added
+ DEBUG_STORE_DATA( nBytes_gains.dat, &nBytes_after, sizeof( SKP_int ) );
+#endif
+
+ /****************/
+ /* Encode NLSFs */
+ /****************/
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_before );
+#endif
+ /* Range encoding of the NLSF path */
+ psNLSF_CB = psEncC->psNLSF_CB[ psEncCtrlC->sigtype ];
+ SKP_Silk_range_encoder_multi( psRC, psEncCtrlC->NLSFIndices, psNLSF_CB->StartPtr, psNLSF_CB->nStages );
+
+ /* Encode NLSF interpolation factor */
+ SKP_assert( psEncC->useInterpolatedNLSFs == 1 || psEncCtrlC->NLSFInterpCoef_Q2 == ( 1 << 2 ) );
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->NLSFInterpCoef_Q2, SKP_Silk_NLSF_interpolation_factor_CDF );
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_after );
+ nBytes_after -= nBytes_before; // bytes just added
+ DEBUG_STORE_DATA( nBytes_LSF.dat, &nBytes_after, sizeof( SKP_int ) );
+#endif
+
+ if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) {
+ /*********************/
+ /* Encode pitch lags */
+ /*********************/
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_before );
+#endif
+ /* lag index */
+ encode_absolute_lagIndex = 1;
+ if( psEncC->nFramesInPayloadBuf > 0 && psEncC->prev_sigtype == SIG_TYPE_VOICED ) {
+ /* Delta Encoding */
+ delta_lagIndex = psEncCtrlC->lagIndex - psEncC->prev_lagIndex;
+ if( delta_lagIndex > MAX_DELTA_LAG ) {
+ delta_lagIndex = ( MAX_DELTA_LAG << 1 ) + 1;
+ } else if ( delta_lagIndex < -MAX_DELTA_LAG ) {
+ delta_lagIndex = ( MAX_DELTA_LAG << 1 ) + 1;
+ } else {
+ delta_lagIndex = delta_lagIndex + MAX_DELTA_LAG;
+ encode_absolute_lagIndex = 0; /* Only use delta */
+ }
+ SKP_Silk_range_encoder( psRC, delta_lagIndex, SKP_Silk_pitch_delta_CDF );
+ }
+ if( encode_absolute_lagIndex ) {
+ /* Absolute encoding */
+ if( psEncC->fs_kHz == 8 ) {
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_NB_CDF );
+ } else if( psEncC->fs_kHz == 12 ) {
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_MB_CDF );
+ } else if( psEncC->fs_kHz == 16 ) {
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_WB_CDF );
+ } else {
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_SWB_CDF );
+ }
+ }
+ psEncC->prev_lagIndex = psEncCtrlC->lagIndex;
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_after );
+ nBytes_lagIndex = nBytes_after - nBytes_before; // bytes just added
+#endif
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_before );
+#endif
+ /* countour index */
+ if( psEncC->fs_kHz == 8 ) {
+ /* Less codevectors used in 8 khz mode */
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_NB_CDF );
+ } else {
+ /* Joint for 12, 16, 24 khz */
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_CDF );
+ }
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_after );
+ nBytes_contourIndex = nBytes_after - nBytes_before; // bytes just added
+#endif
+
+ /********************/
+ /* Encode LTP gains */
+ /********************/
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_before );
+#endif
+ /* PERIndex value */
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->PERIndex, SKP_Silk_LTP_per_index_CDF );
+
+ /* Codebook Indices */
+ for( k = 0; k < psEncC->nb_subfr; k++ ) {
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->LTPIndex[ k ], SKP_Silk_LTP_gain_CDF_ptrs[ psEncCtrlC->PERIndex ] );
+ }
+
+ /**********************/
+ /* Encode LTP scaling */
+ /**********************/
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->LTP_scaleIndex, SKP_Silk_LTPscale_CDF );
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_after );
+ nBytes_LTP = nBytes_after - nBytes_before; // bytes just added
+#endif
+ }
+#ifdef SAVE_ALL_INTERNAL_DATA
+ else {
+ // Unvoiced speech
+ nBytes_lagIndex = 0;
+ nBytes_contourIndex = 0;
+ nBytes_LTP = 0;
+ }
+ DEBUG_STORE_DATA( nBytes_lagIndex.dat, &nBytes_lagIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( nBytes_contourIndex.dat, &nBytes_contourIndex, sizeof( SKP_int ) );
+ DEBUG_STORE_DATA( nBytes_LTP.dat, &nBytes_LTP, sizeof( SKP_int ) );
+#endif
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ SKP_Silk_range_encoder_get_length( psRC, &nBytes_before );
+#endif
+
+ /***************/
+ /* Encode seed */
+ /***************/
+ SKP_Silk_range_encoder( psRC, psEncCtrlC->Seed, SKP_Silk_Seed_CDF );
+}
--- /dev/null
+++ b/src_common/SKP_Silk_encode_pulses.c
@@ -1,0 +1,222 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Tables generated with pyramid_combinations_generalized_tree.m */
+/* Pyramid L1 norm */
+static const float PVQ_W_SIGNS_BITS[ 32 ] =
+{
+ 0.0000f, 5.0000f, 9.0000f, 12.4179f, 15.4263f, 18.1210f, 20.5637f, 22.7972f,
+ 24.8536f, 26.7576f, 28.5290f, 30.1838f, 31.7353f, 33.1949f, 34.5719f, 35.8747f,
+ 37.1102f, 38.2847f, 39.4034f, 40.4712f, 41.4922f, 42.4702f, 43.4083f, 44.3097f,
+ 45.1769f, 46.0123f, 46.8181f, 47.5961f, 48.3483f, 49.0762f, 49.7813f, 50.4648f
+};
+
+static const float PVQ_WO_SIGNS_BITS[ 32 ] =
+{
+ 0.0000f, 4.0000f, 7.0875f, 9.6724f, 11.9204f, 13.9204f, 15.7277f, 17.3798f,
+ 18.9033f, 20.3184f, 21.6403f, 22.8813f, 24.0512f, 25.1582f, 26.2088f, 27.2088f,
+ 28.1630f, 29.0755f, 29.9500f, 30.7895f, 31.5969f, 32.3745f, 33.1245f, 33.8489f,
+ 34.5493f, 35.2274f, 35.8845f, 36.5219f, 37.1408f, 37.7423f, 38.3273f, 38.8966f
+};
+
+/*********************************************/
+/* Encode quantization indices of excitation */
+/*********************************************/
+
+SKP_INLINE SKP_int combine_and_check( /* return ok */
+ SKP_int *pulses_comb, /* O */
+ const SKP_int *pulses_in, /* I */
+ SKP_int max_pulses, /* I max value for sum of pulses */
+ SKP_int len /* I number of output values */
+)
+{
+ SKP_int k, sum;
+
+ for( k = 0; k < len; k++ ) {
+ sum = pulses_in[ 2 * k ] + pulses_in[ 2 * k + 1 ];
+ if( sum > max_pulses ) {
+ return 1;
+ }
+ pulses_comb[ k ] = sum;
+ }
+
+ return 0;
+}
+
+/* Encode quantization indices of excitation */
+void SKP_Silk_encode_pulses(
+ SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
+ const SKP_int sigtype, /* I Sigtype */
+ const SKP_int QuantOffsetType,/* I QuantOffsetType */
+ SKP_int8 q[], /* I quantization indices */
+ const SKP_int frame_length /* I Frame length */
+)
+{
+ SKP_int i, k, j, iter, bit, nLS, scale_down, RateLevelIndex = 0;
+ SKP_int32 abs_q, minSumBits_Q6, sumBits_Q6;
+ SKP_int abs_pulses[ MAX_FRAME_LENGTH ];
+ SKP_int sum_pulses[ MAX_NB_SHELL_BLOCKS ];
+ SKP_int nRshifts[ MAX_NB_SHELL_BLOCKS ];
+ SKP_int pulses_comb[ 8 ];
+ SKP_int *abs_pulses_ptr;
+ const SKP_int8 *pulses_ptr;
+ const SKP_uint16 *cdf_ptr;
+ const SKP_int16 *nBits_ptr;
+ //extern SKP_int nbits_extra;
+
+ SKP_memset( pulses_comb, 0, 8 * sizeof( SKP_int ) ); // Fixing Valgrind reported problem
+
+ /****************************/
+ /* Prepare for shell coding */
+ /****************************/
+ /* Calculate number of shell blocks */
+ SKP_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH );
+ iter = SKP_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH );
+ if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ){
+ SKP_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */
+ iter++;
+ SKP_memset( &q[ frame_length ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof(SKP_int8));
+ }
+
+ /* Take the absolute value of the pulses */
+ for( i = 0; i < iter * SHELL_CODEC_FRAME_LENGTH; i+=4 ) {
+ abs_pulses[i+0] = ( SKP_int )SKP_abs( q[ i + 0 ] );
+ abs_pulses[i+1] = ( SKP_int )SKP_abs( q[ i + 1 ] );
+ abs_pulses[i+2] = ( SKP_int )SKP_abs( q[ i + 2 ] );
+ abs_pulses[i+3] = ( SKP_int )SKP_abs( q[ i + 3 ] );
+ }
+
+ /* Calc sum pulses per shell code frame */
+ abs_pulses_ptr = abs_pulses;
+ for( i = 0; i < iter; i++ ) {
+ nRshifts[ i ] = 0;
+
+ while( 1 ) {
+ /* 1+1 -> 2 */
+ scale_down = combine_and_check( pulses_comb, abs_pulses_ptr, SKP_Silk_max_pulses_table[ 0 ], 8 );
+
+ /* 2+2 -> 4 */
+ scale_down += combine_and_check( pulses_comb, pulses_comb, SKP_Silk_max_pulses_table[ 1 ], 4 );
+
+ /* 4+4 -> 8 */
+ scale_down += combine_and_check( pulses_comb, pulses_comb, SKP_Silk_max_pulses_table[ 2 ], 2 );
+
+ /* 8+8 -> 16 */
+ sum_pulses[ i ] = pulses_comb[ 0 ] + pulses_comb[ 1 ];
+ if( sum_pulses[ i ] > SKP_Silk_max_pulses_table[ 3 ] ) {
+ scale_down++;
+ }
+
+ if( scale_down ) {
+ /* We need to down scale the quantization signal */
+ nRshifts[ i ]++;
+ for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
+ abs_pulses_ptr[ k ] = SKP_RSHIFT( abs_pulses_ptr[ k ], 1 );
+ }
+ } else {
+ /* Jump out of while(1) loop and go to next shell coding frame */
+ break;
+ }
+ }
+ abs_pulses_ptr += SHELL_CODEC_FRAME_LENGTH;
+ }
+
+ /**************/
+ /* Rate level */
+ /**************/
+ /* find rate level that leads to fewest bits for coding of pulses per block info */
+ minSumBits_Q6 = SKP_int32_MAX;
+ for( k = 0; k < N_RATE_LEVELS - 1; k++ ) {
+ nBits_ptr = SKP_Silk_pulses_per_block_BITS_Q6[ k ];
+ sumBits_Q6 = SKP_Silk_rate_levels_BITS_Q6[sigtype][ k ];
+ for( i = 0; i < iter; i++ ) {
+ if( nRshifts[ i ] > 0 ) {
+ sumBits_Q6 += nBits_ptr[ MAX_PULSES + 1 ];
+ } else {
+ sumBits_Q6 += nBits_ptr[ sum_pulses[ i ] ];
+ }
+ }
+ if( sumBits_Q6 < minSumBits_Q6 ) {
+ minSumBits_Q6 = sumBits_Q6;
+ RateLevelIndex = k;
+ }
+ }
+ SKP_Silk_range_encoder( psRC, RateLevelIndex, SKP_Silk_rate_levels_CDF[ sigtype ] );
+
+ /***************************************************/
+ /* Sum-Weighted-Pulses Encoding */
+ /***************************************************/
+ cdf_ptr = SKP_Silk_pulses_per_block_CDF[ RateLevelIndex ];
+ for( i = 0; i < iter; i++ ) {
+ if( nRshifts[ i ] == 0 ) {
+ SKP_Silk_range_encoder( psRC, sum_pulses[ i ], cdf_ptr );
+ } else {
+ SKP_Silk_range_encoder( psRC, MAX_PULSES + 1, cdf_ptr );
+ for( k = 0; k < nRshifts[ i ] - 1; k++ ) {
+ SKP_Silk_range_encoder( psRC, MAX_PULSES + 1, SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ] );
+ }
+ SKP_Silk_range_encoder( psRC, sum_pulses[ i ], SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ] );
+ }
+ }
+
+ /******************/
+ /* Shell Encoding */
+ /******************/
+ for( i = 0; i < iter; i++ ) {
+ if( sum_pulses[ i ] > 0 ) {
+ SKP_Silk_shell_encoder( psRC, &abs_pulses[ i * SHELL_CODEC_FRAME_LENGTH ] );
+ }
+ }
+
+ /****************/
+ /* LSB Encoding */
+ /****************/
+ for( i = 0; i < iter; i++ ) {
+ if( nRshifts[ i ] > 0 ) {
+ pulses_ptr = &q[ i * SHELL_CODEC_FRAME_LENGTH ];
+ nLS = nRshifts[ i ] - 1;
+ for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {
+ abs_q = (SKP_int8)SKP_abs( pulses_ptr[ k ] );
+ for( j = nLS; j > 0; j-- ) {
+ bit = SKP_RSHIFT( abs_q, j ) & 1;
+ SKP_Silk_range_encoder( psRC, bit, SKP_Silk_lsb_CDF );
+ }
+ bit = abs_q & 1;
+ SKP_Silk_range_encoder( psRC, bit, SKP_Silk_lsb_CDF );
+ }
+ }
+ }
+
+#if! USE_CELT_PVQ
+ /****************/
+ /* Encode signs */
+ /****************/
+ SKP_Silk_encode_signs( psRC, q, frame_length, sigtype, QuantOffsetType, RateLevelIndex );
+#endif
+}
--- /dev/null
+++ b/src_common/SKP_Silk_gain_quant.c
@@ -1,0 +1,96 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+#define OFFSET ( ( MIN_QGAIN_DB * 128 ) / 6 + 16 * 128 )
+#define SCALE_Q16 ( ( 65536 * ( N_LEVELS_QGAIN - 1 ) ) / ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) )
+#define INV_SCALE_Q16 ( ( 65536 * ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) / ( N_LEVELS_QGAIN - 1 ) )
+
+/* Gain scalar quantization with hysteresis, uniform on log scale */
+void SKP_Silk_gains_quant(
+ SKP_int ind[ MAX_NB_SUBFR ], /* O gain indices */
+ SKP_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */
+ SKP_int *prev_ind, /* I/O last index in previous frame */
+ const SKP_int conditional, /* I first gain is delta coded if 1 */
+ const SKP_int nb_subfr /* I number of subframes */
+)
+{
+ SKP_int k;
+
+ for( k = 0; k < nb_subfr; k++ ) {
+ /* Add half of previous quantization error, convert to log scale, scale, floor() */
+ ind[ k ] = SKP_SMULWB( SCALE_Q16, SKP_Silk_lin2log( gain_Q16[ k ] ) - OFFSET );
+
+ /* Round towards previous quantized gain (hysteresis) */
+ if( ind[ k ] < *prev_ind ) {
+ ind[ k ]++;
+ }
+
+ /* Compute delta indices and limit */
+ if( k == 0 && conditional == 0 ) {
+ /* Full index */
+ ind[ k ] = SKP_LIMIT_int( ind[ k ], 0, N_LEVELS_QGAIN - 1 );
+ ind[ k ] = SKP_max_int( ind[ k ], *prev_ind + MIN_DELTA_GAIN_QUANT );
+ *prev_ind = ind[ k ];
+ } else {
+ /* Delta index */
+ ind[ k ] = SKP_LIMIT_int( ind[ k ] - *prev_ind, MIN_DELTA_GAIN_QUANT, MAX_DELTA_GAIN_QUANT );
+ /* Accumulate deltas */
+ *prev_ind += ind[ k ];
+ /* Shift to make non-negative */
+ ind[ k ] -= MIN_DELTA_GAIN_QUANT;
+ }
+
+ /* Convert to linear scale and scale */
+ gain_Q16[ k ] = SKP_Silk_log2lin( SKP_min_32( SKP_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */
+ }
+}
+
+/* Gains scalar dequantization, uniform on log scale */
+void SKP_Silk_gains_dequant(
+ SKP_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */
+ const SKP_int ind[ MAX_NB_SUBFR ], /* I gain indices */
+ SKP_int *prev_ind, /* I/O last index in previous frame */
+ const SKP_int conditional, /* I first gain is delta coded if 1 */
+ const SKP_int nb_subfr /* I number of subframes */
+)
+{
+ SKP_int k;
+
+ for( k = 0; k < nb_subfr; k++ ) {
+ if( k == 0 && conditional == 0 ) {
+ *prev_ind = ind[ k ];
+ } else {
+ /* Delta index */
+ *prev_ind += ind[ k ] + MIN_DELTA_GAIN_QUANT;
+ }
+
+ /* Convert to linear scale and scale */
+ gain_Q16[ k ] = SKP_Silk_log2lin( SKP_min_32( SKP_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_interpolate.c
@@ -1,0 +1,47 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* Interpolate two vectors */
+void SKP_Silk_interpolate(
+ SKP_int xi[ MAX_LPC_ORDER ], /* O interpolated vector */
+ const SKP_int x0[ MAX_LPC_ORDER ], /* I first vector */
+ const SKP_int x1[ MAX_LPC_ORDER ], /* I second vector */
+ const SKP_int ifact_Q2, /* I interp. factor, weight on 2nd vector */
+ const SKP_int d /* I number of parameters */
+)
+{
+ SKP_int i;
+
+ SKP_assert( ifact_Q2 >= 0 );
+ SKP_assert( ifact_Q2 <= ( 1 << 2 ) );
+
+ for( i = 0; i < d; i++ ) {
+ xi[ i ] = ( SKP_int )( ( SKP_int32 )x0[ i ] + SKP_RSHIFT( SKP_MUL( ( SKP_int32 )x1[ i ] - ( SKP_int32 )x0[ i ], ifact_Q2 ), 2 ) );
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_main.h
@@ -1,0 +1,410 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_MAIN_H
+#define SKP_SILK_MAIN_H
+
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_define.h"
+#include "SKP_Silk_structs.h"
+#include "SKP_Silk_tables.h"
+#include "SKP_Silk_PLC.h"
+#include "SKP_debug.h"
+#include "entenc.h"
+#include "entdec.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Encodes signs of excitation */
+void SKP_Silk_encode_signs(
+ SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
+ const SKP_int8 q[], /* I pulse signal */
+ const SKP_int length, /* I length of input */
+ const SKP_int sigtype, /* I Signal type */
+ const SKP_int QuantOffsetType, /* I Quantization offset type */
+ const SKP_int RateLevelIndex /* I Rate Level Index */
+);
+
+/* Decodes signs of excitation */
+void SKP_Silk_decode_signs(
+ SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
+ SKP_int q[], /* I/O pulse signal */
+ const SKP_int length, /* I length of output */
+ const SKP_int sigtype, /* I Signal type */
+ const SKP_int QuantOffsetType, /* I Quantization offset type */
+ const SKP_int RateLevelIndex /* I Rate Level Index */
+);
+
+/***************/
+/* Shell coder */
+/***************/
+
+/* Encode quantization indices of excitation */
+void SKP_Silk_encode_pulses(
+ SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
+ const SKP_int sigtype, /* I Sigtype */
+ const SKP_int QuantOffsetType, /* I QuantOffsetType */
+ SKP_int8 q[], /* I quantization indices */
+ const SKP_int frame_length /* I Frame length */
+);
+
+/* Shell encoder, operates on one shell code frame of 16 pulses */
+void SKP_Silk_shell_encoder(
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int *pulses0 /* I data: nonnegative pulse amplitudes */
+);
+
+/* Shell decoder, operates on one shell code frame of 16 pulses */
+void SKP_Silk_shell_decoder(
+ SKP_int *pulses0, /* O data: nonnegative pulse amplitudes */
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int pulses4 /* I number of pulses per pulse-subframe */
+);
+
+/***************/
+/* Range coder */
+/***************/
+/* Range encoder for one symbol */
+void SKP_Silk_range_encoder(
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int data, /* I uncompressed data */
+ const SKP_uint16 prob[] /* I cumulative density functions */
+);
+
+/* Range encoder for one symbol, with uniform PDF*/
+void SKP_Silk_range_encode_uniform(
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int data, /* I uncompressed data */
+ const SKP_int N /* I number of possible outcomes */
+);
+
+/* Range encoder for multiple symbols */
+void SKP_Silk_range_encoder_multi(
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int data[], /* I uncompressed data [nSymbols] */
+ const SKP_uint16 * const prob[], /* I cumulative density functions */
+ const SKP_int nSymbols /* I number of data symbols */
+);
+
+/* Range decoder for one symbol */
+void SKP_Silk_range_decoder(
+ SKP_int data[], /* O uncompressed data */
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_uint16 prob[], /* I cumulative density function */
+ SKP_int probIx /* I initial (middle) entry of cdf */
+);
+
+/* Range decoder for one symbol, with uniform PDF*/
+void SKP_Silk_range_decode_uniform(
+ SKP_int data[], /* O uncompressed data */
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int N /* I number of possible outcomes */
+);
+
+/* Range decoder for multiple symbols */
+void SKP_Silk_range_decoder_multi(
+ SKP_int data[], /* O uncompressed data [nSymbols] */
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_uint16 * const prob[], /* I cumulative density functions */
+ const SKP_int probStartIx[], /* I initial (middle) entries of cdfs [nSymbols] */
+ const SKP_int nSymbols /* I number of data symbols */
+);
+
+/* Initialize range coder structure for encoder */
+void SKP_Silk_range_enc_init(
+ SKP_Silk_range_coder_state *psRC /* O compressor data structure */
+);
+
+/* Initialize range coder structure for decoder */
+void SKP_Silk_range_dec_init(
+ SKP_Silk_range_coder_state *psRC, /* O compressor data structure */
+ const SKP_uint8 buffer[], /* I buffer for compressed data [bufferLength] */
+ const SKP_int32 bufferLength /* I buffer length (in bytes) */
+);
+
+/* Determine length of bitstream */
+SKP_int SKP_Silk_range_encoder_get_length( /* O returns number of BITS in stream */
+ SKP_Silk_range_coder_state *psRC, /* I compressed data structure */
+ SKP_int *nBytes /* O number of BYTES in stream */
+);
+
+/* Determine length of bitstream */
+SKP_int SKP_Silk_range_decoder_get_length( /* O returns number of BITS in stream */
+ SKP_Silk_range_coder_state *psRC, /* I compressed data structure */
+ SKP_int *nBytes /* O number of BYTES in stream */
+);
+
+/* Check that any remaining bits in the last byte are set to 1 */
+void SKP_Silk_range_coder_check_after_decoding(
+ SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */
+);
+
+/* Gain scalar quantization with hysteresis, uniform on log scale */
+void SKP_Silk_gains_quant(
+ SKP_int ind[ MAX_NB_SUBFR ], /* O gain indices */
+ SKP_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */
+ SKP_int *prev_ind, /* I/O last index in previous frame */
+ const SKP_int conditional, /* I first gain is delta coded if 1 */
+ const SKP_int nb_subfr /* I number of subframes */
+);
+
+/* Gains scalar dequantization, uniform on log scale */
+void SKP_Silk_gains_dequant(
+ SKP_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */
+ const SKP_int ind[ MAX_NB_SUBFR ], /* I gain indices */
+ SKP_int *prev_ind, /* I/O last index in previous frame */
+ const SKP_int conditional, /* I first gain is delta coded if 1 */
+ const SKP_int nb_subfr /* I number of subframes */
+);
+
+/* Convert NLSF parameters to stable AR prediction filter coefficients */
+void SKP_Silk_NLSF2A_stable(
+ SKP_int16 pAR_Q12[ MAX_LPC_ORDER ], /* O Stabilized AR coefs [LPC_order] */
+ const SKP_int pNLSF[ MAX_LPC_ORDER ], /* I NLSF vector [LPC_order] */
+ const SKP_int LPC_order /* I LPC/LSF order */
+);
+
+/* Interpolate two vectors */
+void SKP_Silk_interpolate(
+ SKP_int xi[ MAX_LPC_ORDER ], /* O interpolated vector */
+ const SKP_int x0[ MAX_LPC_ORDER ], /* I first vector */
+ const SKP_int x1[ MAX_LPC_ORDER ], /* I second vector */
+ const SKP_int ifact_Q2, /* I interp. factor, weight on 2nd vector */
+ const SKP_int d /* I number of parameters */
+);
+
+/***********************************/
+/* Noise shaping quantization (NSQ)*/
+/***********************************/
+void SKP_Silk_NSQ(
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
+ SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ const SKP_int16 x[], /* I prefiltered input signal */
+ SKP_int8 q[], /* O quantized qulse signal */
+ const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
+ const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefficients */
+ const SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefficients */
+ const SKP_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */
+ const SKP_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
+ const SKP_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Lambda_Q10, /* I */
+ const SKP_int LTP_scale_Q14 /* I LTP state scaling */
+);
+
+/* Noise shaping using delayed decision */
+void SKP_Silk_NSQ_del_dec(
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
+ SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */
+ SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */
+ const SKP_int16 x[], /* I Prefiltered input signal */
+ SKP_int8 q[], /* O Quantized pulse signal */
+ const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */
+ const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Prediction coefs */
+ const SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I LT prediction coefs */
+ const SKP_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */
+ const SKP_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
+ const SKP_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I */
+ const SKP_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
+ const SKP_int Lambda_Q10, /* I */
+ const SKP_int LTP_scale_Q14 /* I LTP state scaling */
+);
+
+/************/
+/* Silk VAD */
+/************/
+/* Initialize the Silk VAD */
+SKP_int SKP_Silk_VAD_Init( /* O Return value, 0 if success */
+ SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
+);
+
+/* Silk VAD noise level estimation */
+void SKP_Silk_VAD_GetNoiseLevels(
+ const SKP_int32 pX[ VAD_N_BANDS ], /* I subband energies */
+ SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */
+);
+
+/* Get speech activity level in Q8 */
+SKP_int SKP_Silk_VAD_GetSA_Q8( /* O Return value, 0 if success */
+ SKP_Silk_VAD_state *psSilk_VAD, /* I/O Silk VAD state */
+ SKP_int *pSA_Q8, /* O Speech activity level in Q8 */
+ SKP_int pQuality_Q15[ VAD_N_BANDS ], /* O Smoothed SNR for each band */
+ SKP_int *pTilt_Q15, /* O current frame's frequency tilt */
+ const SKP_int16 pIn[], /* I PCM input [framelength] */
+ const SKP_int framelength, /* I Input frame length */
+ const SKP_int fs_kHz /* I Input frame sample frequency */
+);
+
+/* Detect signal in 8 - 12 khz range */
+void SKP_Silk_detect_SWB_input(
+ SKP_Silk_detect_SWB_state *psSWBdetect, /* I/O Encoder state */
+ const SKP_int16 samplesIn[], /* I Input to encoder */
+ SKP_int nSamplesIn /* I Length of input */
+);
+
+#if SWITCH_TRANSITION_FILTERING
+/* Low-pass filter with variable cutoff frequency based on */
+/* piece-wise linear interpolation between elliptic filters */
+/* Start by setting transition_frame_no = 1; */
+void SKP_Silk_LP_variable_cutoff(
+ SKP_Silk_LP_state *psLP, /* I/O LP filter state */
+ SKP_int16 *out, /* O Low-pass filtered output signal */
+ const SKP_int16 *in, /* I Input signal */
+ const SKP_int frame_length /* I Frame length */
+);
+#endif
+
+/****************************************************/
+/* Decoder Functions */
+/****************************************************/
+SKP_int SKP_Silk_create_decoder(
+ SKP_Silk_decoder_state **ppsDec /* I/O Decoder state pointer pointer */
+);
+
+SKP_int SKP_Silk_free_decoder(
+ SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */
+);
+
+SKP_int SKP_Silk_init_decoder(
+ SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */
+);
+
+/* Set decoder sampling rate */
+void SKP_Silk_decoder_set_fs(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state pointer */
+ SKP_int fs_kHz, /* I Sampling frequency (kHz) */
+ SKP_int nb_subfr /* I Number of subframes */
+);
+
+/****************/
+/* Decode frame */
+/****************/
+SKP_int SKP_Silk_decode_frame(
+ SKP_Silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */
+ SKP_int16 pOut[], /* O Pointer to output speech frame */
+ SKP_int16 *pN, /* O Pointer to size of output frame */
+ const SKP_uint8 pCode[], /* I Pointer to payload */
+ const SKP_int nBytes, /* I Payload length */
+ SKP_int action, /* I Action from Jitter Buffer */
+ SKP_int *decBytes /* O Used bytes to decode this frame */
+);
+
+/* Decode indices from payload v4 Bitstream */
+void SKP_Silk_decode_indices_v4(
+ SKP_Silk_decoder_state *psDec /* I/O State */
+);
+
+/* Decode parameters from payload v4 Bitstream */
+void SKP_Silk_decode_parameters_v4(
+ SKP_Silk_decoder_state *psDec, /* I/O State */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int q[ MAX_FRAME_LENGTH ], /* O Excitation signal */
+ const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */
+);
+
+/* Core decoder. Performs inverse NSQ operation LTP + LPC */
+void SKP_Silk_decode_core(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */
+ SKP_int16 xq[], /* O Decoded speech */
+ const SKP_int q[ MAX_FRAME_LENGTH ] /* I Pulse signal */
+);
+
+/* NLSF vector decoder */
+void SKP_Silk_NLSF_MSVQ_decode(
+ SKP_int *pNLSF_Q15, /* O Pointer to decoded output [LPC_ORDER x 1] */
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Pointer to NLSF codebook struct */
+ const SKP_int *NLSFIndices, /* I Pointer to NLSF indices [nStages x 1] */
+ const SKP_int LPC_order /* I LPC order */
+);
+
+/**********************/
+/* Arithmetic coding */
+/*********************/
+
+/* Decode quantization indices of excitation (Shell coding) */
+void SKP_Silk_decode_pulses(
+ SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int q[], /* O Excitation signal */
+ const SKP_int frame_length /* I Frame length (preliminary) */
+);
+
+/******************/
+/* CNG */
+/******************/
+
+/* Reset CNG */
+void SKP_Silk_CNG_Reset(
+ SKP_Silk_decoder_state *psDec /* I/O Decoder state */
+);
+
+/* Updates CNG estimate, and applies the CNG when packet was lost */
+void SKP_Silk_CNG(
+ SKP_Silk_decoder_state *psDec, /* I/O Decoder state */
+ SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */
+ SKP_int16 signal[], /* I/O Signal */
+ SKP_int length /* I Length of residual */
+);
+
+/* Encoding of various parameters */
+void SKP_Silk_encode_parameters_v4(
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */
+ SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */
+ SKP_Silk_range_coder_state *psRC /* I/O Range encoder state */
+);
+
+/* Extract lowest layer encoding */
+void SKP_Silk_get_low_layer_internal(
+ const SKP_uint8 *indata, /* I: Encoded input vector */
+ const SKP_int16 nBytesIn, /* I: Number of input Bytes */
+ SKP_uint8 *Layer0data, /* O: Layer0 payload */
+ SKP_int16 *nLayer0Bytes /* O: Number of FEC Bytes */
+);
+
+/* Resets LBRR buffer, used if packet size changes */
+void SKP_Silk_LBRR_reset(
+ SKP_Silk_encoder_state *psEncC /* I/O Pointer to Silk encoder state */
+);
+
+/* Predict number of bytes used to encode q */
+SKP_int SKP_Silk_pulses_to_bytes( /* O Return value, predicted number of bytes used to encode q */
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder State*/
+ SKP_int8 q[] /* I Pulse signal */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_common/SKP_Silk_perceptual_parameters.h
@@ -1,0 +1,115 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_PERCEPTUAL_PARAMETERS_H
+#define SKP_SILK_PERCEPTUAL_PARAMETERS_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* reduction in coding SNR during low speech activity */
+#define BG_SNR_DECR_dB 4.0f
+
+/* factor for reducing quantization noise during voiced speech */
+#define HARM_SNR_INCR_dB 2.0f
+
+/* factor for reducing quantization noise for unvoiced sparse signals */
+#define SPARSE_SNR_INCR_dB 2.0f
+
+/* threshold for sparseness measure above which to use lower quantization offset during unvoiced */
+#define SPARSENESS_THRESHOLD_QNT_OFFSET 0.75f
+
+
+/* noise shaping filter chirp factor */
+#define BANDWIDTH_EXPANSION 0.95f
+
+/* difference between chirp factors for analysis and synthesis noise shaping filters at low bitrates */
+#define LOW_RATE_BANDWIDTH_EXPANSION_DELTA 0.01f
+
+/* factor to reduce all bandwdith expansion coefficients for super wideband, relative to wideband */
+#define SWB_BANDWIDTH_EXPANSION_REDUCTION 1.0f
+
+/* gain reduction for fricatives */
+#define DE_ESSER_COEF_SWB_dB 2.0f
+#define DE_ESSER_COEF_WB_dB 1.0f
+
+/* extra harmonic boosting (signal shaping) at low bitrates */
+#define LOW_RATE_HARMONIC_BOOST 0.1f
+
+/* extra harmonic boosting (signal shaping) for noisy input signals */
+#define LOW_INPUT_QUALITY_HARMONIC_BOOST 0.1f
+
+/* harmonic noise shaping */
+#define HARMONIC_SHAPING 0.3f
+
+/* extra harmonic noise shaping for high bitrates or noisy input */
+#define HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING 0.2f
+
+
+/* parameter for shaping noise towards higher frequencies */
+#define HP_NOISE_COEF 0.3f
+
+/* parameter for shaping noise extra towards higher frequencies during voiced speech */
+#define HARM_HP_NOISE_COEF 0.4f
+
+/* parameter for applying a high-pass tilt to the input signal */
+#define INPUT_TILT 0.04f
+
+/* parameter for extra high-pass tilt to the input signal at high rates */
+#define HIGH_RATE_INPUT_TILT 0.04f
+
+/* parameter for reducing noise at the very low frequencies */
+#define LOW_FREQ_SHAPING 3.0f
+
+/* less reduction of noise at the very low frequencies for signals with low SNR at low frequencies */
+#define LOW_QUALITY_LOW_FREQ_SHAPING_DECR 0.5f
+
+/* fraction added to first autocorrelation value */
+#define SHAPE_WHITE_NOISE_FRACTION 3.8147e-5f
+
+/* fraction of first autocorrelation value added to residual energy value; limits prediction gain */
+#define SHAPE_MIN_ENERGY_RATIO 1.526e-5f // 1.526e-5 = 1/65536
+
+/* noise floor to put a low limit on the quantization step size */
+#define NOISE_FLOOR_dB 4.0f
+
+/* noise floor relative to active speech gain level */
+#define RELATIVE_MIN_GAIN_dB -50.0f
+
+/* subframe smoothing coefficient for determining active speech gain level (lower -> more smoothing) */
+#define GAIN_SMOOTHING_COEF 1e-3f
+
+/* subframe smoothing coefficient for HarmBoost, HarmShapeGain, Tilt (lower -> more smoothing) */
+#define SUBFR_SMTH_COEF 0.4f
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_common/SKP_Silk_pulses_to_bytes.c
@@ -1,0 +1,81 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/*
+ * File Name: SKP_Silk_pulses_to_bytes.c
+ */
+
+#include <stdlib.h>
+#include "SKP_Silk_main.h"
+
+/* nBytes = sum_over_shell_blocks( POLY_FIT_0 + POLY_FIT_1 * sum_abs_val + POLY_FIT_2 * sum_abs_val^2 ) */
+#define POLY_FIT_0_Q15 12520
+#define POLY_FIT_1_Q15 15862
+#define POLY_FIT_2_Q20 -9222
+
+/* Predict number of bytes used to encode q */
+SKP_int SKP_Silk_pulses_to_bytes( /* O Return value, predicted number of bytes used to encode q */
+ SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */
+ SKP_int8 q[] /* I Pulse signal */
+)
+{
+ SKP_int i, j, iter;
+ SKP_int8 *q_ptr;
+ SKP_int32 sum_abs_val, nBytes, acc_nBytes;
+ /* Take the absolute value of the pulses */
+ iter = psEncC->frame_length / SHELL_CODEC_FRAME_LENGTH;
+
+ /* Calculate rate as a nonlinaer mapping of sum abs value of each Shell block */
+ q_ptr = q;
+ acc_nBytes = 0;
+ for( j = 0; j < iter; j++ ) {
+ sum_abs_val = 0;
+ for(i = 0; i < SHELL_CODEC_FRAME_LENGTH; i+=4){
+ sum_abs_val += (SKP_int32)SKP_abs( q_ptr[ i + 0 ] );
+ sum_abs_val += (SKP_int32)SKP_abs( q_ptr[ i + 1 ] );
+ sum_abs_val += (SKP_int32)SKP_abs( q_ptr[ i + 2 ] );
+ sum_abs_val += (SKP_int32)SKP_abs( q_ptr[ i + 3 ] );
+ }
+ /* Calculate nBytes used for thi sshell frame */
+ nBytes = SKP_SMULWB( SKP_SMULBB( sum_abs_val, sum_abs_val ), POLY_FIT_2_Q20 ); // Q4
+ nBytes = SKP_LSHIFT_SAT32( nBytes, 11 ); // Q15
+ nBytes += SKP_SMULBB( sum_abs_val, POLY_FIT_1_Q15 ); // Q15
+ nBytes += POLY_FIT_0_Q15; // Q15
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( sum_abs_val.dat, &sum_abs_val, sizeof( SKP_int32 ) );
+#endif
+ acc_nBytes += nBytes;
+
+ q_ptr += SHELL_CODEC_FRAME_LENGTH; /* update pointer */
+ }
+
+ acc_nBytes = SKP_RSHIFT_ROUND( acc_nBytes, 15 ); // Q0
+ acc_nBytes = SKP_SAT16( acc_nBytes ); // just to be sure // Q0
+
+ return(( SKP_int )acc_nBytes);
+}
--- /dev/null
+++ b/src_common/SKP_Silk_range_coder.c
@@ -1,0 +1,290 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+#define MAX_SIZE 10000
+
+/* Range encoder for one symbol */
+void SKP_Silk_range_encoder(
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int data, /* I uncompressed data */
+ const SKP_uint16 prob[] /* I cumulative density functions */
+)
+{
+ SKP_uint32 low_Q16, high_Q16;
+
+ if( psRC->error ) {
+ return;
+ }
+ low_Q16 = prob[ data ];
+ high_Q16 = prob[ data + 1 ];
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( enc_l.dat, &low_Q16, sizeof(SKP_uint32) );
+ DEBUG_STORE_DATA( enc_h.dat, &high_Q16, sizeof(SKP_uint32) );
+ DEBUG_STORE_DATA( enc.dat, &data, sizeof(SKP_int) );
+#endif
+
+ if( prob[ 2 ] == 65535 ) {
+ /* Instead of detection, we could add a separate function and call when we know that input is a bit */
+ ec_enc_bit_prob( &psRC->range_enc_celt_state, data, 65536 - prob[ 1 ] );
+ } else {
+ ec_encode_bin( &psRC->range_enc_celt_state, low_Q16, high_Q16, 16 );
+ }
+}
+
+/* Range encoder for one symbol, with uniform PDF*/
+void SKP_Silk_range_encode_uniform(
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int data, /* I uncompressed data */
+ const SKP_int N /* I number of possible outcomes */
+)
+{
+ SKP_int i;
+ SKP_uint16 delta, prob[ MAX_SIZE + 1 ];
+
+ SKP_assert( N < MAX_SIZE );
+
+ delta = ( SKP_uint16 )SKP_DIV32_16( 65535, N );
+ prob[ 0 ] = 0;
+ for( i = 0; i < N - 1; i++ ) {
+ prob[ i + 1 ] = prob[ i ] + delta;
+ }
+ prob[ N ] = 65535;
+
+ SKP_Silk_range_encoder( psRC, data, prob );
+}
+
+/* Range encoder for multiple symbols */
+void SKP_Silk_range_encoder_multi(
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int data[], /* I uncompressed data [nSymbols] */
+ const SKP_uint16 * const prob[], /* I cumulative density functions */
+ const SKP_int nSymbols /* I number of data symbols */
+)
+{
+ SKP_int k;
+ for( k = 0; k < nSymbols; k++ ) {
+ SKP_Silk_range_encoder( psRC, data[ k ], prob[ k ] );
+ }
+}
+
+/* Range decoder for one symbol */
+void SKP_Silk_range_decoder(
+ SKP_int data[], /* O uncompressed data */
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_uint16 prob[], /* I cumulative density function */
+ SKP_int probIx /* I initial (middle) entry of cdf */
+)
+{
+ SKP_uint32 low_Q16, high_Q16;
+
+ SKP_uint32 low_Q16_returned;
+ SKP_int temp;
+
+ if( psRC->error ) {
+ /* Set output to zero */
+ *data = 0;
+ return;
+ }
+
+ if( prob[ 2 ] == 65535 ) {
+ /* Instead of detection, we could add a separate function and call when we know that output is a bit */
+ *data = ec_dec_bit_prob( &psRC->range_dec_celt_state, 65536 - prob[ 1 ] );
+ } else {
+ low_Q16_returned = ec_decode_bin( &psRC->range_dec_celt_state, 16 );
+ }
+
+ /* OPTIMIZE ME WITH BI-SECTION */
+ if( prob[ 2 ] != 65535 ) {
+#if 1
+ temp = 0;
+ while( low_Q16_returned >= prob[ ++temp ] ) {}
+ *data = temp - 1;
+#else
+ temp = probIx;
+ if( low_Q16_returned >= prob[ temp ] ){
+ while( low_Q16_returned >= prob[ temp ] ) {
+ temp++;
+ }
+ temp = temp - 1;
+ } else {
+ /* search down */
+ while( low_Q16_returned < prob[ temp ] ) {
+ temp--;
+ }
+ }
+ *data = temp;
+#endif
+
+ low_Q16 = prob[ *data ];
+ high_Q16 = prob[ *data + 1 ];
+
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( dec_lr.dat, &low_Q16_returned, sizeof( SKP_uint32 ) );
+ DEBUG_STORE_DATA( dec_l.dat, &low_Q16, sizeof( SKP_uint32 ) );
+ DEBUG_STORE_DATA( dec_h.dat, &high_Q16, sizeof( SKP_uint32 ) );
+#endif
+ ec_dec_update( &psRC->range_dec_celt_state, low_Q16, high_Q16,( 1 << 16 ) );
+ }
+#ifdef SAVE_ALL_INTERNAL_DATA
+ DEBUG_STORE_DATA( dec.dat, data, sizeof( SKP_int ) );
+#endif
+}
+
+/* Range decoder for one symbol, with uniform PDF*/
+void SKP_Silk_range_decode_uniform(
+ SKP_int data[], /* O uncompressed data */
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_int N /* I number of possible outcomes */
+)
+{
+ SKP_int i;
+ SKP_uint16 delta, prob[ MAX_SIZE + 1 ];
+
+ SKP_assert( N < MAX_SIZE );
+
+ delta = ( SKP_uint16 )SKP_DIV32_16( 65535, N );
+ prob[ 0 ] = 0;
+ for( i = 0; i < N - 1; i++ ) {
+ prob[ i + 1 ] = prob[ i ] + delta;
+ }
+ prob[ N ] = 65535;
+
+ SKP_Silk_range_decoder( data, psRC, prob, ( N >> 1 ) );
+}
+
+/* Range decoder for multiple symbols */
+void SKP_Silk_range_decoder_multi(
+ SKP_int data[], /* O uncompressed data [nSymbols] */
+ SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */
+ const SKP_uint16 * const prob[], /* I cumulative density functions */
+ const SKP_int probStartIx[], /* I initial (middle) entries of cdfs [nSymbols] */
+ const SKP_int nSymbols /* I number of data symbols */
+)
+{
+ SKP_int k;
+ for( k = 0; k < nSymbols; k++ ) {
+ SKP_Silk_range_decoder( &data[ k ], psRC, prob[ k ], probStartIx[ k ] );
+ }
+}
+
+/* Initialize range encoder */
+void SKP_Silk_range_enc_init(
+ SKP_Silk_range_coder_state *psRC /* O compressor data structure */
+)
+{
+ psRC->error = 0;
+}
+
+/* Initialize range decoder */
+void SKP_Silk_range_dec_init(
+ SKP_Silk_range_coder_state *psRC, /* O compressor data structure */
+ const SKP_uint8 buffer[], /* I buffer for compressed data [bufferLength] */
+ const SKP_int32 bufferLength /* I buffer length (in bytes) */
+)
+{
+ /* check input */
+ if( bufferLength > MAX_ARITHM_BYTES ) {
+ psRC->error = RANGE_CODER_DEC_PAYLOAD_TOO_LONG;
+ return;
+ }
+ /* Initialize structure */
+ /* Copy to internal buffer */
+ SKP_memcpy( psRC->buffer, buffer, bufferLength * sizeof( SKP_uint8 ) );
+ psRC->bufferLength = bufferLength;
+ psRC->bufferIx = 0;
+ psRC->base_Q32 =
+ SKP_LSHIFT_uint( ( SKP_uint32 )buffer[ 0 ], 24 ) |
+ SKP_LSHIFT_uint( ( SKP_uint32 )buffer[ 1 ], 16 ) |
+ SKP_LSHIFT_uint( ( SKP_uint32 )buffer[ 2 ], 8 ) |
+ ( SKP_uint32 )buffer[ 3 ];
+ psRC->range_Q16 = 0x0000FFFF;
+ psRC->error = 0;
+}
+
+/* Determine length of bitstream */
+SKP_int SKP_Silk_range_encoder_get_length( /* O returns number of BITS in stream */
+ SKP_Silk_range_coder_state *psRC, /* I compressed data structure */
+ SKP_int *nBytes /* O number of BYTES in stream */
+)
+{
+ SKP_int nBits;
+
+ /* Get number of bits in bitstream */
+ nBits = ec_enc_tell( &psRC->range_enc_celt_state, 0 );
+
+ /* Round up to an integer number of bytes */
+ *nBytes = SKP_RSHIFT( nBits + 7, 3 );
+
+ /* Return number of bits in bitstream */
+ return nBits;
+}
+
+/* Determine length of bitstream */
+SKP_int SKP_Silk_range_decoder_get_length( /* O returns number of BITS in stream */
+ SKP_Silk_range_coder_state *psRC, /* I compressed data structure */
+ SKP_int *nBytes /* O number of BYTES in stream */
+)
+{
+ SKP_int nBits;
+
+ /* Get number of bits in bitstream */
+ nBits = ec_dec_tell( &psRC->range_dec_celt_state, 0 );
+
+ /* Round up to an integer number of bytes */
+ *nBytes = SKP_RSHIFT( nBits + 7, 3 );
+
+ /* Return number of bits in bitstream */
+ return nBits;
+}
+
+/* Check that any remaining bits in the last byte are set to 1 */
+void SKP_Silk_range_coder_check_after_decoding(
+ SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */
+)
+{
+ SKP_int bits_in_stream, nBytes, mask;
+
+ bits_in_stream = SKP_Silk_range_decoder_get_length( psRC, &nBytes );
+
+ /* Make sure not to read beyond buffer */
+ if( nBytes - 1 >= psRC->range_dec_celt_state.buf->storage ) {
+ psRC->error = RANGE_CODER_DECODER_CHECK_FAILED;
+ return;
+ }
+
+ /* Test any remaining bits in last byte */
+ if( bits_in_stream & 7 ) {
+ mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 );
+ if( ( psRC->range_dec_celt_state.buf->buf[ nBytes - 1 ] & mask ) != mask ) {
+ psRC->error = RANGE_CODER_DECODER_CHECK_FAILED;
+ return;
+ }
+ }
+}
--- /dev/null
+++ b/src_common/SKP_Silk_shell_coder.c
@@ -1,0 +1,155 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_main.h"
+
+/* shell coder; pulse-subframe length is hardcoded */
+
+SKP_INLINE void combine_pulses(
+ SKP_int *out, /* O: combined pulses vector [len] */
+ const SKP_int *in, /* I: input vector [2 * len] */
+ const SKP_int len /* I: number of OUTPUT samples */
+)
+{
+ SKP_int k;
+ for( k = 0; k < len; k++ ) {
+ out[ k ] = in[ 2 * k ] + in[ 2 * k + 1 ];
+ }
+}
+
+SKP_INLINE void encode_split(
+ SKP_Silk_range_coder_state *sRC, /* I/O: compressor data structure */
+ const SKP_int p_child1, /* I: pulse amplitude of first child subframe */
+ const SKP_int p, /* I: pulse amplitude of current subframe */
+ const SKP_uint16 *shell_table /* I: table of shell cdfs */
+)
+{
+ const SKP_uint16 *cdf;
+
+ if( p > 0 ) {
+ cdf = &shell_table[ SKP_Silk_shell_code_table_offsets[ p ] ];
+ SKP_Silk_range_encoder( sRC, p_child1, cdf );
+ }
+}
+
+SKP_INLINE void decode_split(
+ SKP_int *p_child1, /* O: pulse amplitude of first child subframe */
+ SKP_int *p_child2, /* O: pulse amplitude of second child subframe */
+ SKP_Silk_range_coder_state *sRC, /* I/O: compressor data structure */
+ const SKP_int p, /* I: pulse amplitude of current subframe */
+ const SKP_uint16 *shell_table /* I: table of shell cdfs */
+)
+{
+ SKP_int cdf_middle;
+ const SKP_uint16 *cdf;
+
+ if( p > 0 ) {
+ cdf_middle = SKP_RSHIFT( p, 1 );
+ cdf = &shell_table[ SKP_Silk_shell_code_table_offsets[ p ] ];
+ SKP_Silk_range_decoder( p_child1, sRC, cdf, cdf_middle );
+ p_child2[ 0 ] = p - p_child1[ 0 ];
+ } else {
+ p_child1[ 0 ] = 0;
+ p_child2[ 0 ] = 0;
+ }
+}
+
+/* Shell encoder, operates on one shell code frame of 16 pulses */
+void SKP_Silk_shell_encoder(
+ SKP_Silk_range_coder_state *sRC, /* I/O compressor data structure */
+ const SKP_int *pulses0 /* I data: nonnegative pulse amplitudes */
+)
+{
+ SKP_int pulses1[ 8 ], pulses2[ 4 ], pulses3[ 2 ], pulses4[ 1 ];
+
+ /* this function operates on one shell code frame of 16 pulses */
+ SKP_assert( SHELL_CODEC_FRAME_LENGTH == 16 );
+
+ /* tree representation per pulse-subframe */
+ combine_pulses( pulses1, pulses0, 8 );
+ combine_pulses( pulses2, pulses1, 4 );
+ combine_pulses( pulses3, pulses2, 2 );
+ combine_pulses( pulses4, pulses3, 1 );
+
+ encode_split( sRC, pulses3[ 0 ], pulses4[ 0 ], SKP_Silk_shell_code_table3 );
+
+ encode_split( sRC, pulses2[ 0 ], pulses3[ 0 ], SKP_Silk_shell_code_table2 );
+
+ encode_split( sRC, pulses1[ 0 ], pulses2[ 0 ], SKP_Silk_shell_code_table1 );
+ encode_split( sRC, pulses0[ 0 ], pulses1[ 0 ], SKP_Silk_shell_code_table0 );
+ encode_split( sRC, pulses0[ 2 ], pulses1[ 1 ], SKP_Silk_shell_code_table0 );
+
+ encode_split( sRC, pulses1[ 2 ], pulses2[ 1 ], SKP_Silk_shell_code_table1 );
+ encode_split( sRC, pulses0[ 4 ], pulses1[ 2 ], SKP_Silk_shell_code_table0 );
+ encode_split( sRC, pulses0[ 6 ], pulses1[ 3 ], SKP_Silk_shell_code_table0 );
+
+ encode_split( sRC, pulses2[ 2 ], pulses3[ 1 ], SKP_Silk_shell_code_table2 );
+
+ encode_split( sRC, pulses1[ 4 ], pulses2[ 2 ], SKP_Silk_shell_code_table1 );
+ encode_split( sRC, pulses0[ 8 ], pulses1[ 4 ], SKP_Silk_shell_code_table0 );
+ encode_split( sRC, pulses0[ 10 ], pulses1[ 5 ], SKP_Silk_shell_code_table0 );
+
+ encode_split( sRC, pulses1[ 6 ], pulses2[ 3 ], SKP_Silk_shell_code_table1 );
+ encode_split( sRC, pulses0[ 12 ], pulses1[ 6 ], SKP_Silk_shell_code_table0 );
+ encode_split( sRC, pulses0[ 14 ], pulses1[ 7 ], SKP_Silk_shell_code_table0 );
+}
+
+
+/* Shell decoder, operates on one shell code frame of 16 pulses */
+void SKP_Silk_shell_decoder(
+ SKP_int *pulses0, /* O data: nonnegative pulse amplitudes */
+ SKP_Silk_range_coder_state *sRC, /* I/O compressor data structure */
+ const SKP_int pulses4 /* I number of pulses per pulse-subframe */
+)
+{
+ SKP_int pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ];
+
+ /* this function operates on one shell code frame of 16 pulses */
+ SKP_assert( SHELL_CODEC_FRAME_LENGTH == 16 );
+
+ decode_split( &pulses3[ 0 ], &pulses3[ 1 ], sRC, pulses4, SKP_Silk_shell_code_table3 );
+
+ decode_split( &pulses2[ 0 ], &pulses2[ 1 ], sRC, pulses3[ 0 ], SKP_Silk_shell_code_table2 );
+
+ decode_split( &pulses1[ 0 ], &pulses1[ 1 ], sRC, pulses2[ 0 ], SKP_Silk_shell_code_table1 );
+ decode_split( &pulses0[ 0 ], &pulses0[ 1 ], sRC, pulses1[ 0 ], SKP_Silk_shell_code_table0 );
+ decode_split( &pulses0[ 2 ], &pulses0[ 3 ], sRC, pulses1[ 1 ], SKP_Silk_shell_code_table0 );
+
+ decode_split( &pulses1[ 2 ], &pulses1[ 3 ], sRC, pulses2[ 1 ], SKP_Silk_shell_code_table1 );
+ decode_split( &pulses0[ 4 ], &pulses0[ 5 ], sRC, pulses1[ 2 ], SKP_Silk_shell_code_table0 );
+ decode_split( &pulses0[ 6 ], &pulses0[ 7 ], sRC, pulses1[ 3 ], SKP_Silk_shell_code_table0 );
+
+ decode_split( &pulses2[ 2 ], &pulses2[ 3 ], sRC, pulses3[ 1 ], SKP_Silk_shell_code_table2 );
+
+ decode_split( &pulses1[ 4 ], &pulses1[ 5 ], sRC, pulses2[ 2 ], SKP_Silk_shell_code_table1 );
+ decode_split( &pulses0[ 8 ], &pulses0[ 9 ], sRC, pulses1[ 4 ], SKP_Silk_shell_code_table0 );
+ decode_split( &pulses0[ 10 ], &pulses0[ 11 ], sRC, pulses1[ 5 ], SKP_Silk_shell_code_table0 );
+
+ decode_split( &pulses1[ 6 ], &pulses1[ 7 ], sRC, pulses2[ 3 ], SKP_Silk_shell_code_table1 );
+ decode_split( &pulses0[ 12 ], &pulses0[ 13 ], sRC, pulses1[ 6 ], SKP_Silk_shell_code_table0 );
+ decode_split( &pulses0[ 14 ], &pulses0[ 15 ], sRC, pulses1[ 7 ], SKP_Silk_shell_code_table0 );
+}
--- /dev/null
+++ b/src_common/SKP_Silk_structs.h
@@ -1,0 +1,371 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_STRUCTS_H
+#define SKP_SILK_STRUCTS_H
+
+#include "SKP_Silk_typedef.h"
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_Silk_define.h"
+#include "entenc.h"
+#include "entdec.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+/************************************/
+/* Noise shaping quantization state */
+/************************************/
+typedef struct {
+ SKP_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */
+ SKP_int32 sLTP_shp_Q10[ 2 * MAX_FRAME_LENGTH ];
+ SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / MAX_NB_SUBFR + MAX_LPC_ORDER ];
+ SKP_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ];
+ SKP_int32 sLF_AR_shp_Q12;
+ SKP_int lagPrev;
+ SKP_int sLTP_buf_idx;
+ SKP_int sLTP_shp_buf_idx;
+ SKP_int32 rand_seed;
+ SKP_int32 prev_inv_gain_Q16;
+ SKP_int rewhite_flag;
+} SKP_Silk_nsq_state; /* FIX*/
+
+/* Struct for Low BitRate Redundant (LBRR) information */
+typedef struct {
+ SKP_uint8 payload[ MAX_ARITHM_BYTES ];
+ SKP_int nBytes; /* Number of bytes in payload */
+ SKP_int usage; /* Tells how the payload should be used as FEC */
+} SKP_SILK_LBRR_struct;
+
+/********************************/
+/* VAD state */
+/********************************/
+typedef struct {
+ SKP_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */
+ SKP_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */
+ SKP_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */
+ SKP_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */
+ SKP_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */
+ SKP_int16 HPstate; /* State of differentiator in the lowest band */
+ SKP_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */
+ SKP_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */
+ SKP_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */
+ SKP_int32 counter; /* Frame counter used in the initial phase */
+} SKP_Silk_VAD_state;
+
+/*******************************/
+/* Range encoder/decoder state */
+/*******************************/
+typedef struct {
+ SKP_int32 bufferLength;
+ SKP_int32 bufferIx;
+ SKP_uint32 base_Q32;
+ SKP_uint32 range_Q16;
+ SKP_int32 error;
+ SKP_uint8 buffer[ MAX_ARITHM_BYTES ]; /* Buffer containing payload */
+ /* The CELT entropy encoder + decoder */
+ ec_enc range_enc_celt_state;
+ ec_dec range_dec_celt_state;
+} SKP_Silk_range_coder_state;
+
+/* Input frequency range detection struct */
+typedef struct {
+ SKP_int32 S_HP_8_kHz[ NB_SOS ][ 2 ]; /* HP filter State */
+ SKP_int32 ConsecSmplsAboveThres;
+ SKP_int32 ActiveSpeech_ms; /* Accumulated time with active speech */
+ SKP_int SWB_detected; /* Flag to indicate SWB input */
+ SKP_int WB_detected; /* Flag to indicate WB input */
+} SKP_Silk_detect_SWB_state;
+
+#if SWITCH_TRANSITION_FILTERING
+/* Variable cut-off low-pass filter state */
+typedef struct {
+ SKP_int32 In_LP_State[ 2 ]; /* Low pass filter state */
+ SKP_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */
+ SKP_int mode; /* Operating mode, 0: switch down, 1: switch up */
+} SKP_Silk_LP_state;
+#endif
+
+/* Structure for one stage of MSVQ */
+typedef struct {
+ const SKP_int32 nVectors;
+ const SKP_int16 *CB_NLSF_Q15;
+ const SKP_int16 *Rates_Q5;
+} SKP_Silk_NLSF_CBS;
+
+/* Structure containing NLSF MSVQ codebook */
+typedef struct {
+ const SKP_int32 nStages;
+
+ /* Fields for (de)quantizing */
+ const SKP_Silk_NLSF_CBS *CBStages;
+ const SKP_int *NDeltaMin_Q15;
+
+ /* Fields for arithmetic (de)coding */
+ const SKP_uint16 *CDF;
+ const SKP_uint16 * const *StartPtr;
+ const SKP_int *MiddleIx;
+} SKP_Silk_NLSF_CB_struct;
+
+/********************************/
+/* Encoder state */
+/********************************/
+typedef struct {
+ SKP_Silk_range_coder_state sRC; /* Range coder state */
+ SKP_Silk_range_coder_state sRC_LBRR; /* Range coder state (for low bitrate redundancy) */
+#if HIGH_PASS_INPUT
+ SKP_int32 In_HP_State[ 2 ]; /* High pass filter state */
+#endif
+#if SWITCH_TRANSITION_FILTERING
+ SKP_Silk_LP_state sLP; /* Low pass filter state */
+#endif
+ SKP_Silk_VAD_state sVAD; /* Voice activity detector state */
+
+ SKP_int LBRRprevLastGainIndex;
+ SKP_int prev_sigtype;
+ SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */
+ SKP_int prevLag;
+ SKP_int prev_lagIndex;
+ SKP_int32 API_fs_Hz; /* API sampling frequency (Hz) */
+ SKP_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */
+ SKP_int maxInternal_fs_kHz; /* Maximum internal sampling frequency (kHz) */
+ SKP_int fs_kHz; /* Internal sampling frequency (kHz) */
+ SKP_int fs_kHz_changed; /* Did we switch yet? */
+ SKP_int nb_subfr; /* Number of 5 ms subframes in a frame */
+ SKP_int frame_length; /* Frame length (samples) */
+ SKP_int subfr_length; /* Subframe length (samples) */
+ SKP_int ltp_mem_length; /* Length of LTP memory */
+ SKP_int la_pitch; /* Look-ahead for pitch analysis (samples) */
+ SKP_int la_shape; /* Look-ahead for noise shape analysis (samples) */
+ SKP_int32 TargetRate_bps; /* Target bitrate (bps) */
+ SKP_int PacketSize_ms; /* Number of milliseconds to put in each packet */
+ SKP_int PacketLoss_perc; /* Packet loss rate measured by farend */
+ SKP_int32 frameCounter;
+ SKP_int Complexity; /* Complexity setting: 0-> low; 1-> medium; 2->high */
+ SKP_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */
+ SKP_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */
+ SKP_int shapingLPCOrder; /* Filter order for noise shaping filters */
+ SKP_int predictLPCOrder; /* Filter order for prediction filters */
+ SKP_int pitchEstimationComplexity; /* Complexity level for pitch estimator */
+ SKP_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */
+ SKP_int LTPQuantLowComplexity; /* Flag for low complexity LTP quantization */
+ SKP_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */
+ SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */
+
+ /* Input/output buffering */
+ SKP_int16 inputBuf[ MAX_FRAME_LENGTH ]; /* buffer containin input signal */
+ SKP_int inputBufIx;
+ SKP_int nFramesInPayloadBuf; /* number of frames sitting in outputBuf */
+ SKP_int nBytesInPayloadBuf; /* number of bytes sitting in outputBuf */
+
+ /* Parameters For LTP scaling Control */
+ SKP_int frames_since_onset;
+
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
+
+ /* Struct for Inband LBRR */
+ SKP_SILK_LBRR_struct LBRR_buffer[ MAX_LBRR_DELAY ];
+ SKP_int oldest_LBRR_idx;
+ SKP_int useInBandFEC; /* Saves the API setting for query */
+ SKP_int LBRR_enabled;
+ SKP_int LBRR_GainIncreases; /* Number of shifts to Gains to get LBRR rate Voiced frames */
+
+ /* Bitrate control */
+ SKP_int32 bitrateDiff; /* Accumulated diff. between the target bitrate and the switch bitrates */
+ SKP_int32 bitrate_threshold_up; /* Threshold for switching to a higher internal sample frequency */
+ SKP_int32 bitrate_threshold_down; /* Threshold for switching to a lower internal sample frequency */
+
+ SKP_Silk_resampler_state_struct resampler_state;
+
+ /* DTX */
+ SKP_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */
+ SKP_int useDTX; /* Flag to enable DTX */
+ SKP_int inDTX; /* Flag to signal DTX period */
+ SKP_int vadFlag; /* Flag to indicate Voice Activity */
+
+ /* Struct for detecting SWB input */
+ SKP_Silk_detect_SWB_state sSWBdetect;
+
+
+ /* Buffers */
+ SKP_int8 q[ MAX_FRAME_LENGTH * MAX_FRAMES_PER_PACKET ]; /* pulse signal buffer */
+ SKP_int8 q_LBRR[ MAX_FRAME_LENGTH * MAX_FRAMES_PER_PACKET ]; /* pulse signal buffer */
+ SKP_int sigtype[ MAX_FRAMES_PER_PACKET ];
+ SKP_int QuantOffsetType[ MAX_FRAMES_PER_PACKET ];
+} SKP_Silk_encoder_state;
+
+
+/************************/
+/* Encoder control */
+/************************/
+typedef struct {
+ /* Quantization indices */
+ SKP_int lagIndex;
+ SKP_int contourIndex;
+ SKP_int PERIndex;
+ SKP_int LTPIndex[ MAX_NB_SUBFR ];
+ SKP_int NLSFIndices[ NLSF_MSVQ_MAX_CB_STAGES ]; /* NLSF path of quantized LSF vector */
+ SKP_int NLSFInterpCoef_Q2;
+ SKP_int GainsIndices[ MAX_NB_SUBFR ];
+ SKP_int warping_Q16;
+ SKP_int32 Seed;
+ SKP_int LTP_scaleIndex;
+ SKP_int RateLevelIndex;
+ SKP_int QuantOffsetType;
+ SKP_int sigtype;
+
+ /* Prediction and coding parameters */
+ SKP_int pitchL[ MAX_NB_SUBFR ];
+
+ SKP_int LBRR_usage; /* Low bitrate redundancy usage */
+} SKP_Silk_encoder_control;
+
+/* Struct for Packet Loss Concealment */
+typedef struct {
+ SKP_int pitchL[ MAX_NB_SUBFR ]; /* Pitch lag per 5 ms for last 20 ms */
+ SKP_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */
+ SKP_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */
+ SKP_int16 prevLPC_Q12[ MAX_LPC_ORDER ];
+ SKP_int last_frame_lost; /* Was previous frame lost */
+ SKP_int32 rand_seed; /* Seed for unvoiced signal generation */
+ SKP_int16 randScale_Q14; /* Scaling of unvoiced random signal */
+ SKP_int32 conc_energy;
+ SKP_int conc_energy_shift;
+ SKP_int16 prevLTP_scale_Q14;
+ SKP_int32 prevGain_Q16[ MAX_NB_SUBFR ];
+ SKP_int fs_kHz;
+} SKP_Silk_PLC_struct;
+
+/* Struct for CNG */
+typedef struct {
+ SKP_int32 CNG_exc_buf_Q10[ MAX_FRAME_LENGTH ];
+ SKP_int CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ];
+ SKP_int32 CNG_synth_state[ MAX_LPC_ORDER ];
+ SKP_int32 CNG_smth_Gain_Q16;
+ SKP_int32 rand_seed;
+ SKP_int fs_kHz;
+} SKP_Silk_CNG_struct;
+
+/********************************/
+/* Decoder state */
+/********************************/
+typedef struct {
+ SKP_Silk_range_coder_state sRC; /* Range coder state */
+ SKP_int32 prev_inv_gain_Q16;
+ SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ];
+ SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / MAX_NB_SUBFR + MAX_LPC_ORDER ];
+ SKP_int32 exc_Q10[ MAX_FRAME_LENGTH ];
+ SKP_int32 res_Q10[ MAX_FRAME_LENGTH ];
+ SKP_int16 outBuf[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for output signal */
+ SKP_int sLTP_buf_idx; /* LTP_buf_index */
+ SKP_int lagPrev; /* Previous Lag */
+ SKP_int LastGainIndex; /* Previous gain index */
+ SKP_int LastGainIndex_EnhLayer; /* Previous gain index */
+ SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */
+ SKP_int32 HPState[ DEC_HP_ORDER ]; /* HP filter state */
+ const SKP_int16 *HP_A; /* HP filter AR coefficients */
+ const SKP_int16 *HP_B; /* HP filter MA coefficients */
+ SKP_int fs_kHz; /* Sampling frequency in kHz */
+ SKP_int32 prev_API_sampleRate; /* Previous API sample frequency (Hz) */
+ SKP_int nb_subfr; /* Number of 5 ms subframes in a frame */
+ SKP_int frame_length; /* Frame length (samples) */
+ SKP_int subfr_length; /* Subframe length (samples) */
+ SKP_int ltp_mem_length; /* Length of LTP memory */
+ SKP_int LPC_order; /* LPC order */
+ SKP_int prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */
+ SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */
+
+ /* For buffering payload in case of more frames per packet */
+ SKP_int nBytesLeft;
+ SKP_int nFramesDecoded;
+ SKP_int nFramesInPacket;
+ SKP_int moreInternalDecoderFrames;
+ SKP_int FrameTermination;
+
+ SKP_Silk_resampler_state_struct resampler_state;
+
+ const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
+
+ SKP_int sigtype[ MAX_FRAMES_PER_PACKET ];
+ SKP_int QuantOffsetType[ MAX_FRAMES_PER_PACKET ];
+ SKP_int GainsIndices[ MAX_FRAMES_PER_PACKET ][ MAX_NB_SUBFR ];
+ SKP_int GainsIndices_EnhLayer[ MAX_FRAMES_PER_PACKET ][ MAX_NB_SUBFR ];
+ SKP_int NLSFIndices[ MAX_FRAMES_PER_PACKET ][ NLSF_MSVQ_MAX_CB_STAGES ];
+ SKP_int NLSFInterpCoef_Q2[ MAX_FRAMES_PER_PACKET ];
+ SKP_int lagIndex[ MAX_FRAMES_PER_PACKET ];
+ SKP_int contourIndex[ MAX_FRAMES_PER_PACKET ];
+ SKP_int PERIndex[ MAX_FRAMES_PER_PACKET ];
+ SKP_int LTPIndex[ MAX_FRAMES_PER_PACKET ][ MAX_NB_SUBFR ];
+ SKP_int LTP_scaleIndex[ MAX_FRAMES_PER_PACKET ];
+ SKP_int Seed[ MAX_FRAMES_PER_PACKET ];
+ SKP_int vadFlagBuf[ MAX_FRAMES_PER_PACKET ];
+
+ /* Parameters used to investigate if inband FEC is used */
+ SKP_int vadFlag;
+ SKP_int no_FEC_counter; /* Counts number of frames wo inband FEC */
+ SKP_int inband_FEC_offset; /* 0: no FEC, 1: FEC with 1 packet offset, 2: FEC w 2 packets offset */
+
+ /* CNG state */
+ SKP_Silk_CNG_struct sCNG;
+
+ /* Stuff used for PLC */
+ SKP_int lossCnt;
+ SKP_int prev_sigtype; /* Previous sigtype */
+
+ SKP_Silk_PLC_struct sPLC;
+
+} SKP_Silk_decoder_state;
+
+/************************/
+/* Decoder control */
+/************************/
+typedef struct {
+ /* prediction and coding parameters */
+ SKP_int pitchL[ MAX_NB_SUBFR ];
+ SKP_int32 Gains_Q16[ MAX_NB_SUBFR ];
+ SKP_int32 Seed;
+ /* holds interpolated and final coefficients, 4-byte aligned */
+ SKP_array_of_int16_4_byte_aligned( PredCoef_Q12[ 2 ], MAX_LPC_ORDER );
+ SKP_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ];
+ SKP_int LTP_scale_Q14;
+
+ /* quantization indices */
+ SKP_int PERIndex;
+ SKP_int RateLevelIndex;
+ SKP_int QuantOffsetType;
+ SKP_int sigtype;
+ SKP_int NLSFInterpCoef_Q2;
+} SKP_Silk_decoder_control;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_common/SKP_Silk_tables.h
@@ -1,0 +1,171 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_TABLES_H
+#define SKP_SILK_TABLES_H
+
+#include "SKP_Silk_define.h"
+#include "SKP_Silk_structs.h"
+
+#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */
+#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* entropy coding tables */
+extern const SKP_uint16 SKP_Silk_type_offset_CDF[ 5 ]; /* 5 */
+extern const SKP_uint16 SKP_Silk_type_offset_joint_CDF[ 4 ][ 5 ]; /* 20 */
+extern const SKP_int SKP_Silk_type_offset_CDF_offset;
+
+extern const SKP_uint16 SKP_Silk_gain_CDF[ 2 ][ N_LEVELS_QGAIN + 1 ]; /* 130 */
+extern const SKP_int SKP_Silk_gain_CDF_offset;
+extern const SKP_uint16 SKP_Silk_delta_gain_CDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 2 ]; /* 46 */
+extern const SKP_int SKP_Silk_delta_gain_CDF_offset;
+
+extern const SKP_uint16 SKP_Silk_pitch_lag_NB_CDF[ 8 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 130 */
+extern const SKP_int SKP_Silk_pitch_lag_NB_CDF_offset;
+extern const SKP_uint16 SKP_Silk_pitch_lag_MB_CDF[ 12 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 194 */
+extern const SKP_int SKP_Silk_pitch_lag_MB_CDF_offset;
+extern const SKP_uint16 SKP_Silk_pitch_lag_WB_CDF[ 16 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 258 */
+extern const SKP_int SKP_Silk_pitch_lag_WB_CDF_offset;
+extern const SKP_uint16 SKP_Silk_pitch_lag_SWB_CDF[ 24 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 386 */
+extern const SKP_int SKP_Silk_pitch_lag_SWB_CDF_offset;
+
+extern const SKP_uint16 SKP_Silk_pitch_contour_CDF[ 35 ]; /* 35 */
+extern const SKP_int SKP_Silk_pitch_contour_CDF_offset;
+extern const SKP_uint16 SKP_Silk_pitch_contour_NB_CDF[ 12 ]; /* 12 */
+extern const SKP_int SKP_Silk_pitch_contour_NB_CDF_offset;
+extern const SKP_uint16 SKP_Silk_pitch_delta_CDF[23]; /* 23 */
+extern const SKP_int SKP_Silk_pitch_delta_CDF_offset;
+
+extern const SKP_uint16 SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS ][ MAX_PULSES + 3 ]; /* 210 */
+extern const SKP_int SKP_Silk_pulses_per_block_CDF_offset;
+extern const SKP_int16 SKP_Silk_pulses_per_block_BITS_Q6[ N_RATE_LEVELS - 1 ][ MAX_PULSES + 2 ]; /* 180 */
+
+extern const SKP_uint16 SKP_Silk_rate_levels_CDF[ 2 ][ N_RATE_LEVELS ]; /* 20 */
+extern const SKP_int SKP_Silk_rate_levels_CDF_offset;
+extern const SKP_int16 SKP_Silk_rate_levels_BITS_Q6[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */
+
+extern const SKP_int SKP_Silk_max_pulses_table[ 4 ]; /* 4 */
+
+extern const SKP_uint16 SKP_Silk_shell_code_table0[ 33 ]; /* 33 */
+extern const SKP_uint16 SKP_Silk_shell_code_table1[ 52 ]; /* 52 */
+extern const SKP_uint16 SKP_Silk_shell_code_table2[ 102 ]; /* 102 */
+extern const SKP_uint16 SKP_Silk_shell_code_table3[ 207 ]; /* 207 */
+extern const SKP_uint16 SKP_Silk_shell_code_table_offsets[ 19 ]; /* 19 */
+
+extern const SKP_uint16 SKP_Silk_lsb_CDF[ 3 ]; /* 3 */
+
+extern const SKP_uint16 SKP_Silk_sign_CDF[ 36 ]; /* 36 */
+
+extern const SKP_uint16 SKP_Silk_LTP_per_index_CDF[ 4 ]; /* 4 */
+extern const SKP_int SKP_Silk_LTP_per_index_CDF_offset;
+extern const SKP_int16 * const SKP_Silk_LTP_gain_BITS_Q6_ptrs[ NB_LTP_CBKS ]; /* 3 */
+extern const SKP_uint16 * const SKP_Silk_LTP_gain_CDF_ptrs[ NB_LTP_CBKS ]; /* 3 */
+extern const SKP_int SKP_Silk_LTP_gain_CDF_offsets[ NB_LTP_CBKS ]; /* 3 */
+extern const SKP_int32 SKP_Silk_LTP_gain_middle_avg_RD_Q14;
+extern const SKP_uint16 SKP_Silk_LTPscale_CDF[ 4 ]; /* 4 */
+extern const SKP_int SKP_Silk_LTPscale_offset;
+
+/* Tables for LTPScale */
+extern const SKP_int16 SKP_Silk_LTPScales_table_Q14[ 3 ];
+
+extern const SKP_uint16 SKP_Silk_vadflag_CDF[ 3 ]; /* 3 */
+extern const SKP_int SKP_Silk_vadflag_offset;
+
+extern const SKP_int SKP_Silk_SamplingRates_table[ 4 ]; /* 4 */
+extern const SKP_uint16 SKP_Silk_SamplingRates_CDF[ 5 ]; /* 5 */
+extern const SKP_int SKP_Silk_SamplingRates_offset;
+
+extern const SKP_uint16 SKP_Silk_NbSubframes_CDF[ 3 ]; /* 3 */
+extern const SKP_int SKP_Silk_NbSubframes_offset;
+
+extern const SKP_uint16 SKP_Silk_NLSF_interpolation_factor_CDF[ 6 ];
+extern const SKP_int SKP_Silk_NLSF_interpolation_factor_offset;
+
+/* NLSF codebooks */
+extern const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_16, SKP_Silk_NLSF_CB1_16;
+extern const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_10, SKP_Silk_NLSF_CB1_10;
+
+/* quantization tables */
+extern const SKP_int16 * const SKP_Silk_LTP_vq_ptrs_Q14[ NB_LTP_CBKS ]; /* 168 */
+extern const SKP_int SKP_Silk_LTP_vq_sizes[ NB_LTP_CBKS ]; /* 3 */
+
+/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */
+extern const SKP_int32 TargetRate_table_NB[ TARGET_RATE_TAB_SZ ];
+extern const SKP_int32 TargetRate_table_MB[ TARGET_RATE_TAB_SZ ];
+extern const SKP_int32 TargetRate_table_WB[ TARGET_RATE_TAB_SZ ];
+extern const SKP_int32 TargetRate_table_SWB[ TARGET_RATE_TAB_SZ ];
+extern const SKP_int32 SNR_table_Q1[ TARGET_RATE_TAB_SZ ];
+
+extern const SKP_int32 SNR_table_one_bit_per_sample_Q7[ 4 ];
+
+/* Filter coeficicnts for HP filter: 4. Order filter implementad as two biquad filters */
+extern const SKP_int16 SKP_Silk_SWB_detect_B_HP_Q13[ NB_SOS ][ 3 ];
+extern const SKP_int16 SKP_Silk_SWB_detect_A_HP_Q13[ NB_SOS ][ 2 ];
+
+/* Decoder high-pass filter coefficients for 24 kHz sampling */
+extern const SKP_int16 SKP_Silk_Dec_A_HP_24[ DEC_HP_ORDER ]; /* 2 */
+extern const SKP_int16 SKP_Silk_Dec_B_HP_24[ DEC_HP_ORDER + 1 ]; /* 3 */
+
+/* Decoder high-pass filter coefficients for 16 kHz sampling */
+extern const SKP_int16 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ]; /* 2 */
+extern const SKP_int16 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ]; /* 3 */
+
+/* Decoder high-pass filter coefficients for 12 kHz sampling */
+extern const SKP_int16 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ]; /* 2 */
+extern const SKP_int16 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ]; /* 3 */
+
+/* Decoder high-pass filter coefficients for 8 kHz sampling */
+extern const SKP_int16 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ]; /* 2 */
+extern const SKP_int16 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ]; /* 3 */
+
+/* Table for frame termination indication */
+extern const SKP_uint16 SKP_Silk_FrameTermination_v4_CDF[ 6 ];
+extern const SKP_int SKP_Silk_FrameTermination_v4_offset;
+
+/* Table for random seed */
+extern const SKP_uint16 SKP_Silk_Seed_CDF[ 5 ];
+extern const SKP_int SKP_Silk_Seed_offset;
+
+/* Quantization offsets */
+extern const SKP_int16 SKP_Silk_Quantization_Offsets_Q10[ 2 ][ 2 ];
+
+#if SWITCH_TRANSITION_FILTERING
+/* Interpolation points for filter coefficients used in the bandwidth transition smoother */
+extern const SKP_int32 SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ];
+extern const SKP_int32 SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ];
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src_common/SKP_Silk_tables_LTP.c
@@ -1,0 +1,324 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_tables.h"
+
+const SKP_uint16 SKP_Silk_LTP_per_index_CDF[ 4 ] = {
+ 0, 20992, 40788, 65535
+};
+
+const SKP_int SKP_Silk_LTP_per_index_CDF_offset = 1;
+
+
+const SKP_uint16 SKP_Silk_LTP_gain_CDF_0[ 11 ] = {
+ 0, 49380, 54463, 56494, 58437, 60101, 61683, 62985,
+ 64066, 64823, 65535
+};
+
+const SKP_uint16 SKP_Silk_LTP_gain_CDF_1[ 21 ] = {
+ 0, 25290, 30654, 35710, 40386, 42937, 45250, 47459,
+ 49411, 51348, 52974, 54517, 55976, 57423, 58865, 60285,
+ 61667, 62895, 63827, 64724, 65535
+};
+
+const SKP_uint16 SKP_Silk_LTP_gain_CDF_2[ 41 ] = {
+ 0, 4958, 9439, 13581, 17638, 21651, 25015, 28025,
+ 30287, 32406, 34330, 36240, 38130, 39790, 41281, 42764,
+ 44229, 45676, 47081, 48431, 49675, 50849, 51932, 52966,
+ 53957, 54936, 55869, 56789, 57708, 58504, 59285, 60043,
+ 60796, 61542, 62218, 62871, 63483, 64076, 64583, 65062,
+ 65535
+};
+
+const SKP_int SKP_Silk_LTP_gain_CDF_offsets[ 3 ] = {
+ 1, 3, 10
+};
+
+const SKP_int32 SKP_Silk_LTP_gain_middle_avg_RD_Q14 = 11010;
+
+const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_0[ 10 ] = {
+ 26, 236, 321, 325, 339, 344, 362, 379,
+ 412, 418
+};
+
+const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_1[ 20 ] = {
+ 88, 231, 237, 244, 300, 309, 313, 324,
+ 325, 341, 346, 351, 352, 352, 354, 356,
+ 367, 393, 396, 406
+};
+
+const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_2[ 40 ] = {
+ 238, 248, 255, 257, 258, 274, 284, 311,
+ 317, 326, 326, 327, 339, 349, 350, 351,
+ 352, 355, 358, 366, 371, 379, 383, 387,
+ 388, 393, 394, 394, 407, 409, 412, 412,
+ 413, 422, 426, 432, 434, 449, 454, 455
+};
+
+const SKP_uint16 * const SKP_Silk_LTP_gain_CDF_ptrs[ NB_LTP_CBKS ] = {
+ SKP_Silk_LTP_gain_CDF_0,
+ SKP_Silk_LTP_gain_CDF_1,
+ SKP_Silk_LTP_gain_CDF_2
+};
+
+const SKP_int16 * const SKP_Silk_LTP_gain_BITS_Q6_ptrs[ NB_LTP_CBKS ] = {
+ SKP_Silk_LTP_gain_BITS_Q6_0,
+ SKP_Silk_LTP_gain_BITS_Q6_1,
+ SKP_Silk_LTP_gain_BITS_Q6_2
+};
+
+const SKP_int16 SKP_Silk_LTP_gain_vq_0_Q14[ 10 ][ 5 ] =
+{
+{
+ 594, 984, 2840, 1021, 669
+},
+{
+ 10, 35, 304, -1, 23
+},
+{
+ -694, 1923, 4603, 2975, 2335
+},
+{
+ 2437, 3176, 3778, 1940, 481
+},
+{
+ 214, -46, 7870, 4406, -521
+},
+{
+ -896, 4818, 8501, 1623, -887
+},
+{
+ -696, 3178, 6480, -302, 1081
+},
+{
+ 517, 599, 1002, 567, 560
+},
+{
+ -2075, -834, 4712, -340, 896
+},
+{
+ 1435, -644, 3993, -612, -2063
+}
+};
+
+const SKP_int16 SKP_Silk_LTP_gain_vq_1_Q14[ 20 ][ 5 ] =
+{
+{
+ 1655, 2918, 5001, 3010, 1775
+},
+{
+ 113, 198, 856, 176, 178
+},
+{
+ -843, 2479, 7858, 5371, 574
+},
+{
+ 59, 5356, 7648, 2850, -315
+},
+{
+ 3840, 4851, 6527, 1583, -1233
+},
+{
+ 1620, 1760, 2330, 1876, 2045
+},
+{
+ -545, 1854, 11792, 1547, -307
+},
+{
+ -604, 689, 5369, 5074, 4265
+},
+{
+ 521, -1331, 9829, 6209, -1211
+},
+{
+ -1315, 6747, 9929, -1410, 546
+},
+{
+ 117, -144, 2810, 1649, 5240
+},
+{
+ 5392, 3476, 2425, -38, 633
+},
+{
+ 14, -449, 5274, 3547, -171
+},
+{
+ -98, 395, 9114, 1676, 844
+},
+{
+ -908, 3843, 8861, -957, 1474
+},
+{
+ 396, 6747, 5379, -329, 1269
+},
+{
+ -335, 2830, 4281, 270, -54
+},
+{
+ 1502, 5609, 8958, 6045, 2059
+},
+{
+ -370, 479, 5267, 5726, 1174
+},
+{
+ 5237, -1144, 6510, 455, 512
+}
+};
+
+const SKP_int16 SKP_Silk_LTP_gain_vq_2_Q14[ 40 ][ 5 ] =
+{
+{
+ -278, 415, 9345, 7106, -431
+},
+{
+ -1006, 3863, 9524, 4724, -871
+},
+{
+ -954, 4624, 11722, 973, -300
+},
+{
+ -117, 7066, 8331, 1959, -901
+},
+{
+ 593, 3412, 6070, 4914, 1567
+},
+{
+ 54, -51, 12618, 4228, -844
+},
+{
+ 3157, 4822, 5229, 2313, 717
+},
+{
+ -244, 1161, 14198, 779, 69
+},
+{
+ -1218, 5603, 12894, -2301, 1001
+},
+{
+ -132, 3960, 9526, 577, 1806
+},
+{
+ -1633, 8815, 10484, -2452, 895
+},
+{
+ 235, 450, 1243, 667, 437
+},
+{
+ 959, -2630, 10897, 8772, -1852
+},
+{
+ 2420, 2046, 8893, 4427, -1569
+},
+{
+ 23, 7091, 8356, -1285, 1508
+},
+{
+ -1133, 835, 7662, 6043, 2800
+},
+{
+ 439, 391, 11016, 2253, 1362
+},
+{
+ -1020, 2876, 13436, 4015, -3020
+},
+{
+ 1060, -2690, 13512, 5565, -1394
+},
+{
+ -1420, 8007, 11421, -152, -1672
+},
+{
+ -893, 2895, 15434, -1490, 159
+},
+{
+ -1054, 428, 12208, 8538, -3344
+},
+{
+ 1772, -1304, 7593, 6185, 561
+},
+{
+ 525, -1207, 6659, 11151, -1170
+},
+{
+ 439, 2667, 4743, 2359, 5515
+},
+{
+ 2951, 7432, 7909, -230, -1564
+},
+{
+ -72, 2140, 5477, 1391, 1580
+},
+{
+ 476, -1312, 15912, 2174, -1027
+},
+{
+ 5737, 441, 2493, 2043, 2757
+},
+{
+ 228, -43, 1803, 6663, 7064
+},
+{
+ 4596, 9182, 1917, -200, 203
+},
+{
+ -704, 12039, 5451, -1188, 542
+},
+{
+ 1782, -1040, 10078, 7513, -2767
+},
+{
+ -2626, 7747, 9019, 62, 1710
+},
+{
+ 235, -233, 2954, 10921, 1947
+},
+{
+ 10854, 2814, 1232, -111, 222
+},
+{
+ 2267, 2778, 12325, 156, -1658
+},
+{
+ -2950, 8095, 16330, 268, -3626
+},
+{
+ 67, 2083, 7950, -80, -2432
+},
+{
+ 518, -66, 1718, 415, 11435
+}
+};
+
+const SKP_int16 * const SKP_Silk_LTP_vq_ptrs_Q14[ NB_LTP_CBKS ] = {
+ &SKP_Silk_LTP_gain_vq_0_Q14[ 0 ][ 0 ],
+ &SKP_Silk_LTP_gain_vq_1_Q14[ 0 ][ 0 ],
+ &SKP_Silk_LTP_gain_vq_2_Q14[ 0 ][ 0 ]
+};
+
+const SKP_int SKP_Silk_LTP_vq_sizes[ NB_LTP_CBKS ] = {
+ 10, 20, 40
+};
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB0_10.c
@@ -1,0 +1,889 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 0.29 + 2.66 kB */
+/**********************************************/
+
+#include "SKP_Silk_structs.h"
+#include "SKP_Silk_tables_NLSF_CB0_10.h"
+
+const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS + NLSF_MSVQ_CB0_10_STAGES ] =
+{
+ 0,
+ 2658,
+ 4420,
+ 6107,
+ 7757,
+ 9408,
+ 10955,
+ 12502,
+ 13983,
+ 15432,
+ 16882,
+ 18331,
+ 19750,
+ 21108,
+ 22409,
+ 23709,
+ 25010,
+ 26256,
+ 27501,
+ 28747,
+ 29965,
+ 31158,
+ 32351,
+ 33544,
+ 34736,
+ 35904,
+ 36997,
+ 38091,
+ 39185,
+ 40232,
+ 41280,
+ 42327,
+ 43308,
+ 44290,
+ 45271,
+ 46232,
+ 47192,
+ 48132,
+ 49032,
+ 49913,
+ 50775,
+ 51618,
+ 52462,
+ 53287,
+ 54095,
+ 54885,
+ 55675,
+ 56449,
+ 57222,
+ 57979,
+ 58688,
+ 59382,
+ 60076,
+ 60726,
+ 61363,
+ 61946,
+ 62505,
+ 63052,
+ 63543,
+ 63983,
+ 64396,
+ 64766,
+ 65023,
+ 65279,
+ 65535,
+ 0,
+ 4977,
+ 9542,
+ 14106,
+ 18671,
+ 23041,
+ 27319,
+ 31596,
+ 35873,
+ 39969,
+ 43891,
+ 47813,
+ 51652,
+ 55490,
+ 59009,
+ 62307,
+ 65535,
+ 0,
+ 8571,
+ 17142,
+ 25529,
+ 33917,
+ 42124,
+ 49984,
+ 57844,
+ 65535,
+ 0,
+ 8732,
+ 17463,
+ 25825,
+ 34007,
+ 42189,
+ 50196,
+ 58032,
+ 65535,
+ 0,
+ 8948,
+ 17704,
+ 25733,
+ 33762,
+ 41791,
+ 49821,
+ 57678,
+ 65535,
+ 0,
+ 4374,
+ 8655,
+ 12936,
+ 17125,
+ 21313,
+ 25413,
+ 29512,
+ 33611,
+ 37710,
+ 41809,
+ 45820,
+ 49832,
+ 53843,
+ 57768,
+ 61694,
+ 65535
+};
+
+const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr[ NLSF_MSVQ_CB0_10_STAGES ] =
+{
+ &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 0 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 65 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 82 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 91 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 100 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 109 ]
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx[ NLSF_MSVQ_CB0_10_STAGES ] =
+{
+ 23,
+ 8,
+ 5,
+ 5,
+ 5,
+ 9
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ NLSF_MSVQ_CB0_10_VECTORS ] =
+{
+ 148, 167,
+ 169, 170,
+ 170, 173,
+ 173, 175,
+ 176, 176,
+ 176, 177,
+ 179, 181,
+ 181, 181,
+ 183, 183,
+ 183, 184,
+ 185, 185,
+ 185, 185,
+ 186, 189,
+ 189, 189,
+ 191, 191,
+ 191, 194,
+ 194, 194,
+ 195, 195,
+ 196, 198,
+ 199, 200,
+ 201, 201,
+ 202, 203,
+ 204, 204,
+ 205, 205,
+ 206, 209,
+ 210, 210,
+ 213, 214,
+ 218, 220,
+ 221, 226,
+ 231, 234,
+ 239, 256,
+ 256, 256,
+ 119, 123,
+ 123, 123,
+ 125, 126,
+ 126, 126,
+ 128, 130,
+ 130, 131,
+ 131, 135,
+ 138, 139,
+ 94, 94,
+ 95, 95,
+ 96, 98,
+ 98, 99,
+ 93, 93,
+ 95, 96,
+ 96, 97,
+ 98, 100,
+ 92, 93,
+ 97, 97,
+ 97, 97,
+ 98, 98,
+ 125, 126,
+ 126, 127,
+ 127, 128,
+ 128, 128,
+ 128, 128,
+ 129, 129,
+ 129, 130,
+ 130, 131
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min_Q15[ 10 + 1 ] =
+{
+ 563,
+ 3,
+ 22,
+ 20,
+ 3,
+ 3,
+ 132,
+ 119,
+ 358,
+ 86,
+ 964
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * NLSF_MSVQ_CB0_10_VECTORS ] =
+{
+ 2210, 4023,
+ 6981, 9260,
+ 12573, 15687,
+ 19207, 22383,
+ 25981, 29142,
+ 3285, 4172,
+ 6116, 10856,
+ 15289, 16826,
+ 19701, 22010,
+ 24721, 29313,
+ 1554, 2511,
+ 6577, 10337,
+ 13837, 16511,
+ 20086, 23214,
+ 26480, 29464,
+ 3062, 4017,
+ 5771, 10037,
+ 13365, 14952,
+ 20140, 22891,
+ 25229, 29603,
+ 2085, 3457,
+ 5934, 8718,
+ 11501, 13670,
+ 17997, 21817,
+ 24935, 28745,
+ 2776, 4093,
+ 6421, 10413,
+ 15111, 16806,
+ 20825, 23826,
+ 26308, 29411,
+ 2717, 4034,
+ 5697, 8463,
+ 14301, 16354,
+ 19007, 23413,
+ 25812, 28506,
+ 2872, 3702,
+ 5881, 11034,
+ 17141, 18879,
+ 21146, 23451,
+ 25817, 29600,
+ 2999, 4015,
+ 7357, 11219,
+ 12866, 17307,
+ 20081, 22644,
+ 26774, 29107,
+ 2942, 3866,
+ 5918, 11915,
+ 13909, 16072,
+ 20453, 22279,
+ 27310, 29826,
+ 2271, 3527,
+ 6606, 9729,
+ 12943, 17382,
+ 20224, 22345,
+ 24602, 28290,
+ 2207, 3310,
+ 5844, 9339,
+ 11141, 15651,
+ 18576, 21177,
+ 25551, 28228,
+ 3963, 4975,
+ 6901, 11588,
+ 13466, 15577,
+ 19231, 21368,
+ 25510, 27759,
+ 2749, 3549,
+ 6966, 13808,
+ 15653, 17645,
+ 20090, 22599,
+ 26467, 28537,
+ 2126, 3504,
+ 5109, 9954,
+ 12550, 14620,
+ 19703, 21687,
+ 26457, 29106,
+ 3966, 5745,
+ 7442, 9757,
+ 14468, 16404,
+ 19135, 23048,
+ 25375, 28391,
+ 3197, 4751,
+ 6451, 9298,
+ 13038, 14874,
+ 17962, 20627,
+ 23835, 28464,
+ 3195, 4081,
+ 6499, 12252,
+ 14289, 16040,
+ 18357, 20730,
+ 26980, 29309,
+ 1533, 2471,
+ 4486, 7796,
+ 12332, 15758,
+ 19567, 22298,
+ 25673, 29051,
+ 2002, 2971,
+ 4985, 8083,
+ 13181, 15435,
+ 18237, 21517,
+ 24595, 28351,
+ 3808, 4925,
+ 6710, 10201,
+ 12011, 14300,
+ 18457, 20391,
+ 26525, 28956,
+ 2281, 3418,
+ 4979, 8726,
+ 15964, 18104,
+ 20250, 22771,
+ 25286, 28954,
+ 3051, 5479,
+ 7290, 9848,
+ 12744, 14503,
+ 18665, 23684,
+ 26065, 28947,
+ 2364, 3565,
+ 5502, 9621,
+ 14922, 16621,
+ 19005, 20996,
+ 26310, 29302,
+ 4093, 5212,
+ 6833, 9880,
+ 16303, 18286,
+ 20571, 23614,
+ 26067, 29128,
+ 2941, 3996,
+ 6038, 10638,
+ 12668, 14451,
+ 16798, 19392,
+ 26051, 28517,
+ 3863, 5212,
+ 7019, 9468,
+ 11039, 13214,
+ 19942, 22344,
+ 25126, 29539,
+ 4615, 6172,
+ 7853, 10252,
+ 12611, 14445,
+ 19719, 22441,
+ 24922, 29341,
+ 3566, 4512,
+ 6985, 8684,
+ 10544, 16097,
+ 18058, 22475,
+ 26066, 28167,
+ 4481, 5489,
+ 7432, 11414,
+ 13191, 15225,
+ 20161, 22258,
+ 26484, 29716,
+ 3320, 4320,
+ 6621, 9867,
+ 11581, 14034,
+ 21168, 23210,
+ 26588, 29903,
+ 3794, 4689,
+ 6916, 8655,
+ 10143, 16144,
+ 19568, 21588,
+ 27557, 29593,
+ 2446, 3276,
+ 5918, 12643,
+ 16601, 18013,
+ 21126, 23175,
+ 27300, 29634,
+ 2450, 3522,
+ 5437, 8560,
+ 15285, 19911,
+ 21826, 24097,
+ 26567, 29078,
+ 2580, 3796,
+ 5580, 8338,
+ 9969, 12675,
+ 18907, 22753,
+ 25450, 29292,
+ 3325, 4312,
+ 6241, 7709,
+ 9164, 14452,
+ 21665, 23797,
+ 27096, 29857,
+ 3338, 4163,
+ 7738, 11114,
+ 12668, 14753,
+ 16931, 22736,
+ 25671, 28093,
+ 3840, 4755,
+ 7755, 13471,
+ 15338, 17180,
+ 20077, 22353,
+ 27181, 29743,
+ 2504, 4079,
+ 8351, 12118,
+ 15046, 18595,
+ 21684, 24704,
+ 27519, 29937,
+ 5234, 6342,
+ 8267, 11821,
+ 15155, 16760,
+ 20667, 23488,
+ 25949, 29307,
+ 2681, 3562,
+ 6028, 10827,
+ 18458, 20458,
+ 22303, 24701,
+ 26912, 29956,
+ 3374, 4528,
+ 6230, 8256,
+ 9513, 12730,
+ 18666, 20720,
+ 26007, 28425,
+ 2731, 3629,
+ 8320, 12450,
+ 14112, 16431,
+ 18548, 22098,
+ 25329, 27718,
+ 3481, 4401,
+ 7321, 9319,
+ 11062, 13093,
+ 15121, 22315,
+ 26331, 28740,
+ 3577, 4945,
+ 6669, 8792,
+ 10299, 12645,
+ 19505, 24766,
+ 26996, 29634,
+ 4058, 5060,
+ 7288, 10190,
+ 11724, 13936,
+ 15849, 18539,
+ 26701, 29845,
+ 4262, 5390,
+ 7057, 8982,
+ 10187, 15264,
+ 20480, 22340,
+ 25958, 28072,
+ 3404, 4329,
+ 6629, 7946,
+ 10121, 17165,
+ 19640, 22244,
+ 25062, 27472,
+ 3157, 4168,
+ 6195, 9319,
+ 10771, 13325,
+ 15416, 19816,
+ 24672, 27634,
+ 2503, 3473,
+ 5130, 6767,
+ 8571, 14902,
+ 19033, 21926,
+ 26065, 28728,
+ 4133, 5102,
+ 7553, 10054,
+ 11757, 14924,
+ 17435, 20186,
+ 23987, 26272,
+ 4972, 6139,
+ 7894, 9633,
+ 11320, 14295,
+ 21737, 24306,
+ 26919, 29907,
+ 2958, 3816,
+ 6851, 9204,
+ 10895, 18052,
+ 20791, 23338,
+ 27556, 29609,
+ 5234, 6028,
+ 8034, 10154,
+ 11242, 14789,
+ 18948, 20966,
+ 26585, 29127,
+ 5241, 6838,
+ 10526, 12819,
+ 14681, 17328,
+ 19928, 22336,
+ 26193, 28697,
+ 3412, 4251,
+ 5988, 7094,
+ 9907, 18243,
+ 21669, 23777,
+ 26969, 29087,
+ 2470, 3217,
+ 7797, 15296,
+ 17365, 19135,
+ 21979, 24256,
+ 27322, 29442,
+ 4939, 5804,
+ 8145, 11809,
+ 13873, 15598,
+ 17234, 19423,
+ 26476, 29645,
+ 5051, 6167,
+ 8223, 9655,
+ 12159, 17995,
+ 20464, 22832,
+ 26616, 28462,
+ 4987, 5907,
+ 9319, 11245,
+ 13132, 15024,
+ 17485, 22687,
+ 26011, 28273,
+ 5137, 6884,
+ 11025, 14950,
+ 17191, 19425,
+ 21807, 24393,
+ 26938, 29288,
+ 7057, 7884,
+ 9528, 10483,
+ 10960, 14811,
+ 19070, 21675,
+ 25645, 28019,
+ 6759, 7160,
+ 8546, 11779,
+ 12295, 13023,
+ 16627, 21099,
+ 24697, 28287,
+ 3863, 9762,
+ 11068, 11445,
+ 12049, 13960,
+ 18085, 21507,
+ 25224, 28997,
+ 397, 335,
+ 651, 1168,
+ 640, 765,
+ 465, 331,
+ 214, -194,
+ -578, -647,
+ -657, 750,
+ 564, 613,
+ 549, 630,
+ 304, -52,
+ 828, 922,
+ 443, 111,
+ 138, 124,
+ 169, 14,
+ 144, 83,
+ 132, 58,
+ -413, -752,
+ 869, 336,
+ 385, 69,
+ 56, 830,
+ -227, -266,
+ -368, -440,
+ -1195, 163,
+ 126, -228,
+ 802, 156,
+ 188, 120,
+ 376, 59,
+ -358, -558,
+ -1326, -254,
+ -202, -789,
+ 296, 92,
+ -70, -129,
+ -718, -1135,
+ 292, -29,
+ -631, 487,
+ -157, -153,
+ -279, 2,
+ -419, -342,
+ -34, -514,
+ -799, -1571,
+ -687, -609,
+ -546, -130,
+ -215, -252,
+ -446, -574,
+ -1337, 207,
+ -72, 32,
+ 103, -642,
+ 942, 733,
+ 187, 29,
+ -211, -814,
+ 143, 225,
+ 20, 24,
+ -268, -377,
+ 1623, 1133,
+ 667, 164,
+ 307, 366,
+ 187, 34,
+ 62, -313,
+ -832, -1482,
+ -1181, 483,
+ -42, -39,
+ -450, -1406,
+ -587, -52,
+ -760, 334,
+ 98, -60,
+ -500, -488,
+ -1058, 299,
+ 131, -250,
+ -251, -703,
+ 1037, 568,
+ -413, -265,
+ 1687, 573,
+ 345, 323,
+ 98, 61,
+ -102, 31,
+ 135, 149,
+ 617, 365,
+ -39, 34,
+ -611, 1201,
+ 1421, 736,
+ -414, -393,
+ -492, -343,
+ -316, -532,
+ 528, 172,
+ 90, 322,
+ -294, -319,
+ -541, 503,
+ 639, 401,
+ 1, -149,
+ -73, -167,
+ 150, 118,
+ 308, 218,
+ 121, 195,
+ -143, -261,
+ -1013, -802,
+ 387, 436,
+ 130, -427,
+ -448, -681,
+ 123, -87,
+ -251, -113,
+ 274, 310,
+ 445, 501,
+ 354, 272,
+ 141, -285,
+ 569, 656,
+ 37, -49,
+ 251, -386,
+ -263, 1122,
+ 604, 606,
+ 336, 95,
+ 34, 0,
+ 85, 180,
+ 207, -367,
+ -622, 1070,
+ -6, -79,
+ -160, -92,
+ -137, -276,
+ -323, -371,
+ -696, -1036,
+ 407, 102,
+ -86, -214,
+ -482, -647,
+ -28, -291,
+ -97, -180,
+ -250, -435,
+ -18, -76,
+ -332, 410,
+ 407, 168,
+ 539, 411,
+ 254, 111,
+ 58, -145,
+ 200, 30,
+ 187, 116,
+ 131, -367,
+ -475, 781,
+ -559, 561,
+ 195, -115,
+ 8, -168,
+ 30, 55,
+ -122, 131,
+ 82, -5,
+ -273, -50,
+ -632, 668,
+ 4, 32,
+ -26, -279,
+ 315, 165,
+ 197, 377,
+ 155, -41,
+ -138, -324,
+ -109, -617,
+ 360, 98,
+ -53, -319,
+ -114, -245,
+ -82, 507,
+ 468, 263,
+ -137, -389,
+ 652, 354,
+ -18, -227,
+ -462, -135,
+ 317, 53,
+ -16, 66,
+ -72, -126,
+ -356, -347,
+ -328, -72,
+ -337, 324,
+ 152, 349,
+ 169, -196,
+ 179, 254,
+ 260, 325,
+ -74, -80,
+ 75, -31,
+ 270, 275,
+ 87, 278,
+ -446, -301,
+ 309, 71,
+ -25, -242,
+ 516, 161,
+ -162, -83,
+ 329, 230,
+ -311, -259,
+ 177, -26,
+ -462, 89,
+ 257, 6,
+ -130, -93,
+ -456, -317,
+ -221, -206,
+ -417, -182,
+ -74, 234,
+ 48, 261,
+ 359, 231,
+ 258, 85,
+ -282, 252,
+ -147, -222,
+ 251, -207,
+ 443, 123,
+ -417, -36,
+ 273, -241,
+ 240, -112,
+ 44, -167,
+ 126, -124,
+ -77, 58,
+ -401, 333,
+ -118, 82,
+ 126, 151,
+ -433, 359,
+ -130, -102,
+ 131, -244,
+ 86, 85,
+ -462, 414,
+ -240, 16,
+ 145, 28,
+ -205, -481,
+ 373, 293,
+ -72, -174,
+ 62, 259,
+ -8, -18,
+ 362, 233,
+ 185, 43,
+ 278, 27,
+ 193, 570,
+ -248, 189,
+ 92, 31,
+ -275, -3,
+ 243, 176,
+ 438, 209,
+ 206, -51,
+ 79, 109,
+ 168, -185,
+ -308, -68,
+ -618, 385,
+ -310, -108,
+ -164, 165,
+ 61, -152,
+ -101, -412,
+ -268, -257,
+ -40, -20,
+ -28, -158,
+ -301, 271,
+ 380, -338,
+ -367, -132,
+ 64, 114,
+ -131, -225,
+ -156, -260,
+ -63, -116,
+ 155, -586,
+ -202, 254,
+ -287, 178,
+ 227, -106,
+ -294, 164,
+ 298, -100,
+ 185, 317,
+ 193, -45,
+ 28, 80,
+ -87, -433,
+ 22, -48,
+ 48, -237,
+ -229, -139,
+ 120, -364,
+ 268, -136,
+ 396, 125,
+ 130, -89,
+ -272, 118,
+ -256, -68,
+ -451, 488,
+ 143, -165,
+ -48, -190,
+ 106, 219,
+ 47, 435,
+ 245, 97,
+ 75, -418,
+ 121, -187,
+ 570, -200,
+ -351, 225,
+ -21, -217,
+ 234, -111,
+ 194, 14,
+ 242, 118,
+ 140, -397,
+ 355, 361,
+ -45, -195
+};
+
+const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_10_Stage_info[ NLSF_MSVQ_CB0_10_STAGES ] =
+{
+ { 64, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 0 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 64 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 80 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 80 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 88 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 88 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 96 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 96 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 104 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 104 ] }
+};
+
+const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_10 =
+{
+ NLSF_MSVQ_CB0_10_STAGES,
+ SKP_Silk_NLSF_CB0_10_Stage_info,
+ SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min_Q15,
+ SKP_Silk_NLSF_MSVQ_CB0_10_CDF,
+ SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB0_10.h
@@ -1,0 +1,51 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_TABLES_NLSF_CB0_10_H
+#define SKP_SILK_TABLES_NLSF_CB0_10_H
+
+#include "SKP_Silk_define.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define NLSF_MSVQ_CB0_10_STAGES 6
+#define NLSF_MSVQ_CB0_10_VECTORS 120
+
+/* NLSF codebook entropy coding tables */
+extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS + NLSF_MSVQ_CB0_10_STAGES ];
+extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr[ NLSF_MSVQ_CB0_10_STAGES ];
+extern const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx[ NLSF_MSVQ_CB0_10_STAGES ];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB0_16.c
@@ -1,0 +1,1319 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 0.51 + 7.38 kB */
+/**********************************************/
+
+#include "SKP_Silk_structs.h"
+#include "SKP_Silk_tables_NLSF_CB0_16.h"
+
+const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS + NLSF_MSVQ_CB0_16_STAGES ] =
+{
+ 0,
+ 1449,
+ 2749,
+ 4022,
+ 5267,
+ 6434,
+ 7600,
+ 8647,
+ 9695,
+ 10742,
+ 11681,
+ 12601,
+ 13444,
+ 14251,
+ 15008,
+ 15764,
+ 16521,
+ 17261,
+ 18002,
+ 18710,
+ 19419,
+ 20128,
+ 20837,
+ 21531,
+ 22225,
+ 22919,
+ 23598,
+ 24277,
+ 24956,
+ 25620,
+ 26256,
+ 26865,
+ 27475,
+ 28071,
+ 28667,
+ 29263,
+ 29859,
+ 30443,
+ 31026,
+ 31597,
+ 32168,
+ 32727,
+ 33273,
+ 33808,
+ 34332,
+ 34855,
+ 35379,
+ 35902,
+ 36415,
+ 36927,
+ 37439,
+ 37941,
+ 38442,
+ 38932,
+ 39423,
+ 39914,
+ 40404,
+ 40884,
+ 41364,
+ 41844,
+ 42324,
+ 42805,
+ 43285,
+ 43754,
+ 44224,
+ 44694,
+ 45164,
+ 45623,
+ 46083,
+ 46543,
+ 46993,
+ 47443,
+ 47892,
+ 48333,
+ 48773,
+ 49213,
+ 49653,
+ 50084,
+ 50515,
+ 50946,
+ 51377,
+ 51798,
+ 52211,
+ 52614,
+ 53018,
+ 53422,
+ 53817,
+ 54212,
+ 54607,
+ 55002,
+ 55388,
+ 55775,
+ 56162,
+ 56548,
+ 56910,
+ 57273,
+ 57635,
+ 57997,
+ 58352,
+ 58698,
+ 59038,
+ 59370,
+ 59702,
+ 60014,
+ 60325,
+ 60630,
+ 60934,
+ 61239,
+ 61537,
+ 61822,
+ 62084,
+ 62346,
+ 62602,
+ 62837,
+ 63072,
+ 63302,
+ 63517,
+ 63732,
+ 63939,
+ 64145,
+ 64342,
+ 64528,
+ 64701,
+ 64867,
+ 65023,
+ 65151,
+ 65279,
+ 65407,
+ 65535,
+ 0,
+ 5099,
+ 9982,
+ 14760,
+ 19538,
+ 24213,
+ 28595,
+ 32976,
+ 36994,
+ 41012,
+ 44944,
+ 48791,
+ 52557,
+ 56009,
+ 59388,
+ 62694,
+ 65535,
+ 0,
+ 9955,
+ 19697,
+ 28825,
+ 36842,
+ 44686,
+ 52198,
+ 58939,
+ 65535,
+ 0,
+ 8949,
+ 17335,
+ 25720,
+ 33926,
+ 41957,
+ 49987,
+ 57845,
+ 65535,
+ 0,
+ 9724,
+ 18642,
+ 26998,
+ 35355,
+ 43532,
+ 51534,
+ 59365,
+ 65535,
+ 0,
+ 8750,
+ 17499,
+ 26249,
+ 34448,
+ 42471,
+ 50494,
+ 58178,
+ 65535,
+ 0,
+ 8730,
+ 17273,
+ 25816,
+ 34176,
+ 42536,
+ 50203,
+ 57869,
+ 65535,
+ 0,
+ 8769,
+ 17538,
+ 26307,
+ 34525,
+ 42742,
+ 50784,
+ 58319,
+ 65535,
+ 0,
+ 8736,
+ 17101,
+ 25466,
+ 33653,
+ 41839,
+ 50025,
+ 57864,
+ 65535,
+ 0,
+ 4368,
+ 8735,
+ 12918,
+ 17100,
+ 21283,
+ 25465,
+ 29558,
+ 33651,
+ 37744,
+ 41836,
+ 45929,
+ 50022,
+ 54027,
+ 57947,
+ 61782,
+ 65535
+};
+
+const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr[ NLSF_MSVQ_CB0_16_STAGES ] =
+{
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 0 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 129 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 146 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 155 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 164 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 173 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 182 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 191 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 200 ],
+ &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 209 ]
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx[ NLSF_MSVQ_CB0_16_STAGES ] =
+{
+ 42,
+ 8,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 9
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ NLSF_MSVQ_CB0_16_VECTORS ] =
+{
+ 176, 181,
+ 182, 183,
+ 186, 186,
+ 191, 191,
+ 191, 196,
+ 197, 201,
+ 203, 206,
+ 206, 206,
+ 207, 207,
+ 209, 209,
+ 209, 209,
+ 210, 210,
+ 210, 211,
+ 211, 211,
+ 212, 214,
+ 216, 216,
+ 217, 217,
+ 217, 217,
+ 218, 218,
+ 219, 219,
+ 220, 221,
+ 222, 223,
+ 223, 223,
+ 223, 224,
+ 224, 224,
+ 225, 225,
+ 226, 226,
+ 226, 226,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 228, 228,
+ 228, 228,
+ 229, 229,
+ 229, 230,
+ 230, 230,
+ 231, 231,
+ 231, 231,
+ 232, 232,
+ 232, 232,
+ 233, 234,
+ 235, 235,
+ 235, 236,
+ 236, 236,
+ 236, 237,
+ 237, 237,
+ 237, 240,
+ 240, 240,
+ 240, 241,
+ 242, 243,
+ 244, 244,
+ 247, 247,
+ 248, 248,
+ 248, 249,
+ 251, 255,
+ 255, 256,
+ 260, 260,
+ 261, 264,
+ 264, 266,
+ 266, 268,
+ 271, 274,
+ 276, 279,
+ 288, 288,
+ 288, 288,
+ 118, 120,
+ 121, 121,
+ 122, 125,
+ 125, 129,
+ 129, 130,
+ 131, 132,
+ 136, 137,
+ 138, 145,
+ 87, 88,
+ 91, 97,
+ 98, 100,
+ 105, 106,
+ 92, 95,
+ 95, 96,
+ 97, 97,
+ 98, 99,
+ 88, 92,
+ 95, 95,
+ 96, 97,
+ 98, 109,
+ 93, 93,
+ 93, 96,
+ 97, 97,
+ 99, 101,
+ 93, 94,
+ 94, 95,
+ 95, 99,
+ 99, 99,
+ 93, 93,
+ 93, 96,
+ 96, 97,
+ 100, 102,
+ 93, 95,
+ 95, 96,
+ 96, 96,
+ 98, 99,
+ 125, 125,
+ 127, 127,
+ 127, 127,
+ 128, 128,
+ 128, 128,
+ 128, 128,
+ 129, 130,
+ 131, 132
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min_Q15[ 16 + 1 ] =
+{
+ 266,
+ 3,
+ 40,
+ 3,
+ 3,
+ 16,
+ 78,
+ 89,
+ 107,
+ 141,
+ 188,
+ 146,
+ 272,
+ 240,
+ 235,
+ 215,
+ 632
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * NLSF_MSVQ_CB0_16_VECTORS ] =
+{
+ 1170, 2278, 3658, 5374,
+ 7666, 9113, 11298, 13304,
+ 15371, 17549, 19587, 21487,
+ 23798, 26038, 28318, 30201,
+ 1628, 2334, 4115, 6036,
+ 7818, 9544, 11777, 14021,
+ 15787, 17408, 19466, 21261,
+ 22886, 24565, 26714, 28059,
+ 1724, 2670, 4056, 6532,
+ 8357, 10119, 12093, 14061,
+ 16491, 18795, 20417, 22402,
+ 24251, 26224, 28410, 29956,
+ 1493, 3427, 4789, 6399,
+ 8435, 10168, 12000, 14066,
+ 16229, 18210, 20040, 22098,
+ 24153, 26095, 28183, 30121,
+ 1119, 2089, 4295, 6245,
+ 8691, 10741, 12688, 15057,
+ 17028, 18792, 20717, 22514,
+ 24497, 26548, 28619, 30630,
+ 1363, 2417, 3927, 5556,
+ 7422, 9315, 11879, 13767,
+ 16143, 18520, 20458, 22578,
+ 24539, 26436, 28318, 30318,
+ 1122, 2503, 5216, 7148,
+ 9310, 11078, 13175, 14800,
+ 16864, 18700, 20436, 22488,
+ 24572, 26602, 28555, 30426,
+ 600, 1317, 2970, 5609,
+ 7694, 9784, 12169, 14087,
+ 16379, 18378, 20551, 22686,
+ 24739, 26697, 28646, 30355,
+ 941, 1882, 4274, 5540,
+ 8482, 9858, 11940, 14287,
+ 16091, 18501, 20326, 22612,
+ 24711, 26638, 28814, 30430,
+ 635, 1699, 4376, 5948,
+ 8097, 10115, 12274, 14178,
+ 16111, 17813, 19695, 21773,
+ 23927, 25866, 28022, 30134,
+ 1408, 2222, 3524, 5615,
+ 7345, 8849, 10989, 12772,
+ 15352, 17026, 18919, 21062,
+ 23329, 25215, 27209, 29023,
+ 701, 1307, 3548, 6301,
+ 7744, 9574, 11227, 12978,
+ 15170, 17565, 19775, 22097,
+ 24230, 26335, 28377, 30231,
+ 1752, 2364, 4879, 6569,
+ 7813, 9796, 11199, 14290,
+ 15795, 18000, 20396, 22417,
+ 24308, 26124, 28360, 30633,
+ 901, 1629, 3356, 4635,
+ 7256, 8767, 9971, 11558,
+ 15215, 17544, 19523, 21852,
+ 23900, 25978, 28133, 30184,
+ 981, 1669, 3323, 4693,
+ 6213, 8692, 10614, 12956,
+ 15211, 17711, 19856, 22122,
+ 24344, 26592, 28723, 30481,
+ 1607, 2577, 4220, 5512,
+ 8532, 10388, 11627, 13671,
+ 15752, 17199, 19840, 21859,
+ 23494, 25786, 28091, 30131,
+ 811, 1471, 3144, 5041,
+ 7430, 9389, 11174, 13255,
+ 15157, 16741, 19583, 22167,
+ 24115, 26142, 28383, 30395,
+ 1543, 2144, 3629, 6347,
+ 7333, 9339, 10710, 13596,
+ 15099, 17340, 20102, 21886,
+ 23732, 25637, 27818, 29917,
+ 492, 1185, 2940, 5488,
+ 7095, 8751, 11596, 13579,
+ 16045, 18015, 20178, 22127,
+ 24265, 26406, 28484, 30357,
+ 1547, 2282, 3693, 6341,
+ 7758, 9607, 11848, 13236,
+ 16564, 18069, 19759, 21404,
+ 24110, 26606, 28786, 30655,
+ 685, 1338, 3409, 5262,
+ 6950, 9222, 11414, 14523,
+ 16337, 17893, 19436, 21298,
+ 23293, 25181, 27973, 30520,
+ 887, 1581, 3057, 4318,
+ 7192, 8617, 10047, 13106,
+ 16265, 17893, 20233, 22350,
+ 24379, 26384, 28314, 30189,
+ 2285, 3745, 5662, 7576,
+ 9323, 11320, 13239, 15191,
+ 17175, 19225, 21108, 22972,
+ 24821, 26655, 28561, 30460,
+ 1496, 2108, 3448, 6898,
+ 8328, 9656, 11252, 12823,
+ 14979, 16482, 18180, 20085,
+ 22962, 25160, 27705, 29629,
+ 575, 1261, 3861, 6627,
+ 8294, 10809, 12705, 14768,
+ 17076, 19047, 20978, 23055,
+ 24972, 26703, 28720, 30345,
+ 1682, 2213, 3882, 6238,
+ 7208, 9646, 10877, 13431,
+ 14805, 16213, 17941, 20873,
+ 23550, 25765, 27756, 29461,
+ 888, 1616, 3924, 5195,
+ 7206, 8647, 9842, 11473,
+ 16067, 18221, 20343, 22774,
+ 24503, 26412, 28054, 29731,
+ 805, 1454, 2683, 4472,
+ 7936, 9360, 11398, 14345,
+ 16205, 17832, 19453, 21646,
+ 23899, 25928, 28387, 30463,
+ 1640, 2383, 3484, 5082,
+ 6032, 8606, 11640, 12966,
+ 15842, 17368, 19346, 21182,
+ 23638, 25889, 28368, 30299,
+ 1632, 2204, 4510, 7580,
+ 8718, 10512, 11962, 14096,
+ 15640, 17194, 19143, 22247,
+ 24563, 26561, 28604, 30509,
+ 2043, 2612, 3985, 6851,
+ 8038, 9514, 10979, 12789,
+ 15426, 16728, 18899, 20277,
+ 22902, 26209, 28711, 30618,
+ 2224, 2798, 4465, 5320,
+ 7108, 9436, 10986, 13222,
+ 14599, 18317, 20141, 21843,
+ 23601, 25700, 28184, 30582,
+ 835, 1541, 4083, 5769,
+ 7386, 9399, 10971, 12456,
+ 15021, 18642, 20843, 23100,
+ 25292, 26966, 28952, 30422,
+ 1795, 2343, 4809, 5896,
+ 7178, 8545, 10223, 13370,
+ 14606, 16469, 18273, 20736,
+ 23645, 26257, 28224, 30390,
+ 1734, 2254, 4031, 5188,
+ 6506, 7872, 9651, 13025,
+ 14419, 17305, 19495, 22190,
+ 24403, 26302, 28195, 30177,
+ 1841, 2349, 3968, 4764,
+ 6376, 9825, 11048, 13345,
+ 14682, 16252, 18183, 21363,
+ 23918, 26156, 28031, 29935,
+ 1432, 2047, 5631, 6927,
+ 8198, 9675, 11358, 13506,
+ 14802, 16419, 18339, 22019,
+ 24124, 26177, 28130, 30586,
+ 1730, 2320, 3744, 4808,
+ 6007, 9666, 10997, 13622,
+ 15234, 17495, 20088, 22002,
+ 23603, 25400, 27379, 29254,
+ 1267, 1915, 5483, 6812,
+ 8229, 9919, 11589, 13337,
+ 14747, 17965, 20552, 22167,
+ 24519, 26819, 28883, 30642,
+ 1526, 2229, 4240, 7388,
+ 8953, 10450, 11899, 13718,
+ 16861, 18323, 20379, 22672,
+ 24797, 26906, 28906, 30622,
+ 2175, 2791, 4104, 6875,
+ 8612, 9798, 12152, 13536,
+ 15623, 17682, 19213, 21060,
+ 24382, 26760, 28633, 30248,
+ 454, 1231, 4339, 5738,
+ 7550, 9006, 10320, 13525,
+ 16005, 17849, 20071, 21992,
+ 23949, 26043, 28245, 30175,
+ 2250, 2791, 4230, 5283,
+ 6762, 10607, 11879, 13821,
+ 15797, 17264, 20029, 22266,
+ 24588, 26437, 28244, 30419,
+ 1696, 2216, 4308, 8385,
+ 9766, 11030, 12556, 14099,
+ 16322, 17640, 19166, 20590,
+ 23967, 26858, 28798, 30562,
+ 2452, 3236, 4369, 6118,
+ 7156, 9003, 11509, 12796,
+ 15749, 17291, 19491, 22241,
+ 24530, 26474, 28273, 30073,
+ 1811, 2541, 3555, 5480,
+ 9123, 10527, 11894, 13659,
+ 15262, 16899, 19366, 21069,
+ 22694, 24314, 27256, 29983,
+ 1553, 2246, 4559, 5500,
+ 6754, 7874, 11739, 13571,
+ 15188, 17879, 20281, 22510,
+ 24614, 26649, 28786, 30755,
+ 1982, 2768, 3834, 5964,
+ 8732, 9908, 11797, 14813,
+ 16311, 17946, 21097, 22851,
+ 24456, 26304, 28166, 29755,
+ 1824, 2529, 3817, 5449,
+ 6854, 8714, 10381, 12286,
+ 14194, 15774, 19524, 21374,
+ 23695, 26069, 28096, 30212,
+ 2212, 2854, 3947, 5898,
+ 9930, 11556, 12854, 14788,
+ 16328, 17700, 20321, 22098,
+ 23672, 25291, 26976, 28586,
+ 2023, 2599, 4024, 4916,
+ 6613, 11149, 12457, 14626,
+ 16320, 17822, 19673, 21172,
+ 23115, 26051, 28825, 30758,
+ 1628, 2206, 3467, 4364,
+ 8679, 10173, 11864, 13679,
+ 14998, 16938, 19207, 21364,
+ 23850, 26115, 28124, 30273,
+ 2014, 2603, 4114, 7254,
+ 8516, 10043, 11822, 13503,
+ 16329, 17826, 19697, 21280,
+ 23151, 24661, 26807, 30161,
+ 2376, 2980, 4422, 5770,
+ 7016, 9723, 11125, 13516,
+ 15485, 16985, 19160, 20587,
+ 24401, 27180, 29046, 30647,
+ 2454, 3502, 4624, 6019,
+ 7632, 8849, 10792, 13964,
+ 15523, 17085, 19611, 21238,
+ 22856, 25108, 28106, 29890,
+ 1573, 2274, 3308, 5999,
+ 8977, 10104, 12457, 14258,
+ 15749, 18180, 19974, 21253,
+ 23045, 25058, 27741, 30315,
+ 1943, 2730, 4140, 6160,
+ 7491, 8986, 11309, 12775,
+ 14820, 16558, 17909, 19757,
+ 21512, 23605, 27274, 29527,
+ 2021, 2582, 4494, 5835,
+ 6993, 8245, 9827, 14733,
+ 16462, 17894, 19647, 21083,
+ 23764, 26667, 29072, 30990,
+ 1052, 1775, 3218, 4378,
+ 7666, 9403, 11248, 13327,
+ 14972, 17962, 20758, 22354,
+ 25071, 27209, 29001, 30609,
+ 2218, 2866, 4223, 5352,
+ 6581, 9980, 11587, 13121,
+ 15193, 16583, 18386, 20080,
+ 22013, 25317, 28127, 29880,
+ 2146, 2840, 4397, 5840,
+ 7449, 8721, 10512, 11936,
+ 13595, 17253, 19310, 20891,
+ 23417, 25627, 27749, 30231,
+ 1972, 2619, 3756, 6367,
+ 7641, 8814, 12286, 13768,
+ 15309, 18036, 19557, 20904,
+ 22582, 24876, 27800, 30440,
+ 2005, 2577, 4272, 7373,
+ 8558, 10223, 11770, 13402,
+ 16502, 18000, 19645, 21104,
+ 22990, 26806, 29505, 30942,
+ 1153, 1822, 3724, 5443,
+ 6990, 8702, 10289, 11899,
+ 13856, 15315, 17601, 21064,
+ 23692, 26083, 28586, 30639,
+ 1304, 1869, 3318, 7195,
+ 9613, 10733, 12393, 13728,
+ 15822, 17474, 18882, 20692,
+ 23114, 25540, 27684, 29244,
+ 2093, 2691, 4018, 6658,
+ 7947, 9147, 10497, 11881,
+ 15888, 17821, 19333, 21233,
+ 23371, 25234, 27553, 29998,
+ 575, 1331, 5304, 6910,
+ 8425, 10086, 11577, 13498,
+ 16444, 18527, 20565, 22847,
+ 24914, 26692, 28759, 30157,
+ 1435, 2024, 3283, 4156,
+ 7611, 10592, 12049, 13927,
+ 15459, 18413, 20495, 22270,
+ 24222, 26093, 28065, 30099,
+ 1632, 2168, 5540, 7478,
+ 8630, 10391, 11644, 14321,
+ 15741, 17357, 18756, 20434,
+ 22799, 26060, 28542, 30696,
+ 1407, 2245, 3405, 5639,
+ 9419, 10685, 12104, 13495,
+ 15535, 18357, 19996, 21689,
+ 24351, 26550, 28853, 30564,
+ 1675, 2226, 4005, 8223,
+ 9975, 11155, 12822, 14316,
+ 16504, 18137, 19574, 21050,
+ 22759, 24912, 28296, 30634,
+ 1080, 1614, 3622, 7565,
+ 8748, 10303, 11713, 13848,
+ 15633, 17434, 19761, 21825,
+ 23571, 25393, 27406, 29063,
+ 1693, 2229, 3456, 4354,
+ 5670, 10890, 12563, 14167,
+ 15879, 17377, 19817, 21971,
+ 24094, 26131, 28298, 30099,
+ 2042, 2959, 4195, 5740,
+ 7106, 8267, 11126, 14973,
+ 16914, 18295, 20532, 21982,
+ 23711, 25769, 27609, 29351,
+ 984, 1612, 3808, 5265,
+ 6885, 8411, 9547, 10889,
+ 12522, 16520, 19549, 21639,
+ 23746, 26058, 28310, 30374,
+ 2036, 2538, 4166, 7761,
+ 9146, 10412, 12144, 13609,
+ 15588, 17169, 18559, 20113,
+ 21820, 24313, 28029, 30612,
+ 1871, 2355, 4061, 5143,
+ 7464, 10129, 11941, 15001,
+ 16680, 18354, 19957, 22279,
+ 24861, 26872, 28988, 30615,
+ 2566, 3161, 4643, 6227,
+ 7406, 9970, 11618, 13416,
+ 15889, 17364, 19121, 20817,
+ 22592, 24720, 28733, 31082,
+ 1700, 2327, 4828, 5939,
+ 7567, 9154, 11087, 12771,
+ 14209, 16121, 20222, 22671,
+ 24648, 26656, 28696, 30745,
+ 3169, 3873, 5046, 6868,
+ 8184, 9480, 12335, 14068,
+ 15774, 17971, 20231, 21711,
+ 23520, 25245, 27026, 28730,
+ 1564, 2391, 4229, 6730,
+ 8905, 10459, 13026, 15033,
+ 17265, 19809, 21849, 23741,
+ 25490, 27312, 29061, 30527,
+ 2864, 3559, 4719, 6441,
+ 9592, 11055, 12763, 14784,
+ 16428, 18164, 20486, 22262,
+ 24183, 26263, 28383, 30224,
+ 2673, 3449, 4581, 5983,
+ 6863, 8311, 12464, 13911,
+ 15738, 17791, 19416, 21182,
+ 24025, 26561, 28723, 30440,
+ 2419, 3049, 4274, 6384,
+ 8564, 9661, 11288, 12676,
+ 14447, 17578, 19816, 21231,
+ 23099, 25270, 26899, 28926,
+ 1278, 2001, 3000, 5353,
+ 9995, 11777, 13018, 14570,
+ 16050, 17762, 19982, 21617,
+ 23371, 25083, 27656, 30172,
+ 932, 1624, 2798, 4570,
+ 8592, 9988, 11552, 13050,
+ 16921, 18677, 20415, 22810,
+ 24817, 26819, 28804, 30385,
+ 2324, 2973, 4156, 5702,
+ 6919, 8806, 10259, 12503,
+ 15015, 16567, 19418, 21375,
+ 22943, 24550, 27024, 29849,
+ 1564, 2373, 3455, 4907,
+ 5975, 7436, 11786, 14505,
+ 16107, 18148, 20019, 21653,
+ 23740, 25814, 28578, 30372,
+ 3025, 3729, 4866, 6520,
+ 9487, 10943, 12358, 14258,
+ 16174, 17501, 19476, 21408,
+ 23227, 24906, 27347, 29407,
+ 1270, 1965, 6802, 7995,
+ 9204, 10828, 12507, 14230,
+ 15759, 17860, 20369, 22502,
+ 24633, 26514, 28535, 30525,
+ 2210, 2749, 4266, 7487,
+ 9878, 11018, 12823, 14431,
+ 16247, 18626, 20450, 22054,
+ 23739, 25291, 27074, 29169,
+ 1275, 1926, 4330, 6573,
+ 8441, 10920, 13260, 15008,
+ 16927, 18573, 20644, 22217,
+ 23983, 25474, 27372, 28645,
+ 3015, 3670, 5086, 6372,
+ 7888, 9309, 10966, 12642,
+ 14495, 16172, 18080, 19972,
+ 22454, 24899, 27362, 29975,
+ 2882, 3733, 5113, 6482,
+ 8125, 9685, 11598, 13288,
+ 15405, 17192, 20178, 22426,
+ 24801, 27014, 29212, 30811,
+ 2300, 2968, 4101, 5442,
+ 6327, 7910, 12455, 13862,
+ 15747, 17505, 19053, 20679,
+ 22615, 24658, 27499, 30065,
+ 2257, 2940, 4430, 5991,
+ 7042, 8364, 9414, 11224,
+ 15723, 17420, 19253, 21469,
+ 23915, 26053, 28430, 30384,
+ 1227, 2045, 3818, 5011,
+ 6990, 9231, 11024, 13011,
+ 17341, 19017, 20583, 22799,
+ 25195, 26876, 29351, 30805,
+ 1354, 1924, 3789, 8077,
+ 10453, 11639, 13352, 14817,
+ 16743, 18189, 20095, 22014,
+ 24593, 26677, 28647, 30256,
+ 3142, 4049, 6197, 7417,
+ 8753, 10156, 11533, 13181,
+ 15947, 17655, 19606, 21402,
+ 23487, 25659, 28123, 30304,
+ 1317, 2263, 4725, 7611,
+ 9667, 11634, 14143, 16258,
+ 18724, 20698, 22379, 24007,
+ 25775, 27251, 28930, 30593,
+ 1570, 2323, 3818, 6215,
+ 9893, 11556, 13070, 14631,
+ 16152, 18290, 21386, 23346,
+ 25114, 26923, 28712, 30168,
+ 2297, 3905, 6287, 8558,
+ 10668, 12766, 15019, 17102,
+ 19036, 20677, 22341, 23871,
+ 25478, 27085, 28851, 30520,
+ 1915, 2507, 4033, 5749,
+ 7059, 8871, 10659, 12198,
+ 13937, 15383, 16869, 18707,
+ 23175, 25818, 28514, 30501,
+ 2404, 2918, 5190, 6252,
+ 7426, 9887, 12387, 14795,
+ 16754, 18368, 20338, 22003,
+ 24236, 26456, 28490, 30397,
+ 1621, 2227, 3479, 5085,
+ 9425, 12892, 14246, 15652,
+ 17205, 18674, 20446, 22209,
+ 23778, 25867, 27931, 30093,
+ 1869, 2390, 4105, 7021,
+ 11221, 12775, 14059, 15590,
+ 17024, 18608, 20595, 22075,
+ 23649, 25154, 26914, 28671,
+ 2551, 3252, 4688, 6562,
+ 7869, 9125, 10475, 11800,
+ 15402, 18780, 20992, 22555,
+ 24289, 25968, 27465, 29232,
+ 2705, 3493, 4735, 6360,
+ 7905, 9352, 11538, 13430,
+ 15239, 16919, 18619, 20094,
+ 21800, 23342, 25200, 29257,
+ 2166, 2791, 4011, 5081,
+ 5896, 9038, 13407, 14703,
+ 16543, 18189, 19896, 21857,
+ 24872, 26971, 28955, 30514,
+ 1865, 3021, 4696, 6534,
+ 8343, 9914, 12789, 14103,
+ 16533, 17729, 21340, 22439,
+ 24873, 26330, 28428, 30154,
+ 3369, 4345, 6573, 8763,
+ 10309, 11713, 13367, 14784,
+ 16483, 18145, 19839, 21247,
+ 23292, 25477, 27555, 29447,
+ 1265, 2184, 5443, 7893,
+ 10591, 13139, 15105, 16639,
+ 18402, 19826, 21419, 22995,
+ 24719, 26437, 28363, 30125,
+ 1584, 2004, 3535, 4450,
+ 8662, 10764, 12832, 14978,
+ 16972, 18794, 20932, 22547,
+ 24636, 26521, 28701, 30567,
+ 3419, 4528, 6602, 7890,
+ 9508, 10875, 12771, 14357,
+ 16051, 18330, 20630, 22490,
+ 25070, 26936, 28946, 30542,
+ 1726, 2252, 4597, 6950,
+ 8379, 9823, 11363, 12794,
+ 14306, 15476, 16798, 18018,
+ 21671, 25550, 28148, 30367,
+ 3385, 3870, 5307, 6388,
+ 7141, 8684, 12695, 14939,
+ 16480, 18277, 20537, 22048,
+ 23947, 25965, 28214, 29956,
+ 2771, 3306, 4450, 5560,
+ 6453, 9493, 13548, 14754,
+ 16743, 18447, 20028, 21736,
+ 23746, 25353, 27141, 29066,
+ 3028, 3900, 6617, 7893,
+ 9211, 10480, 12047, 13583,
+ 15182, 16662, 18502, 20092,
+ 22190, 24358, 26302, 28957,
+ 2000, 2550, 4067, 6837,
+ 9628, 11002, 12594, 14098,
+ 15589, 17195, 18679, 20099,
+ 21530, 23085, 24641, 29022,
+ 2844, 3302, 5103, 6107,
+ 6911, 8598, 12416, 14054,
+ 16026, 18567, 20672, 22270,
+ 23952, 25771, 27658, 30026,
+ 4043, 5150, 7268, 9056,
+ 10916, 12638, 14543, 16184,
+ 17948, 19691, 21357, 22981,
+ 24825, 26591, 28479, 30233,
+ 2109, 2625, 4320, 5525,
+ 7454, 10220, 12980, 14698,
+ 17627, 19263, 20485, 22381,
+ 24279, 25777, 27847, 30458,
+ 1550, 2667, 6473, 9496,
+ 10985, 12352, 13795, 15233,
+ 17099, 18642, 20461, 22116,
+ 24197, 26291, 28403, 30132,
+ 2411, 3084, 4145, 5394,
+ 6367, 8154, 13125, 16049,
+ 17561, 19125, 21258, 22762,
+ 24459, 26317, 28255, 29702,
+ 4159, 4516, 5956, 7635,
+ 8254, 8980, 11208, 14133,
+ 16210, 17875, 20196, 21864,
+ 23840, 25747, 28058, 30012,
+ 2026, 2431, 2845, 3618,
+ 7950, 9802, 12721, 14460,
+ 16576, 18984, 21376, 23319,
+ 24961, 26718, 28971, 30640,
+ 3429, 3833, 4472, 4912,
+ 7723, 10386, 12981, 15322,
+ 16699, 18807, 20778, 22551,
+ 24627, 26494, 28334, 30482,
+ 4740, 5169, 5796, 6485,
+ 6998, 8830, 11777, 14414,
+ 16831, 18413, 20789, 22369,
+ 24236, 25835, 27807, 30021,
+ 150, 168, -17, -107,
+ -142, -229, -320, -406,
+ -503, -620, -867, -935,
+ -902, -680, -398, -114,
+ -398, -355, 49, 255,
+ 114, 260, 399, 264,
+ 317, 431, 514, 531,
+ 435, 356, 238, 106,
+ -43, -36, -169, -224,
+ -391, -633, -776, -970,
+ -844, -455, -181, -12,
+ 85, 85, 164, 195,
+ 122, 85, -158, -640,
+ -903, 9, 7, -124,
+ 149, 32, 220, 369,
+ 242, 115, 79, 84,
+ -146, -216, -70, 1024,
+ 751, 574, 440, 377,
+ 352, 203, 30, 16,
+ -3, 81, 161, 100,
+ -148, -176, 933, 750,
+ 404, 171, -2, -146,
+ -411, -442, -541, -552,
+ -442, -269, -240, -52,
+ 603, 635, 405, 178,
+ 215, 19, -153, -167,
+ -290, -219, 151, 271,
+ 151, 119, 303, 266,
+ 100, 69, -293, -657,
+ 939, 659, 442, 351,
+ 132, 98, -16, -1,
+ -135, -200, -223, -89,
+ 167, 154, 172, 237,
+ -45, -183, -228, -486,
+ 263, 608, 158, -125,
+ -390, -227, -118, 43,
+ -457, -392, -769, -840,
+ 20, -117, -194, -189,
+ -173, -173, -33, 32,
+ 174, 144, 115, 167,
+ 57, 44, 14, 147,
+ 96, -54, -142, -129,
+ -254, -331, 304, 310,
+ -52, -419, -846, -1060,
+ -88, -123, -202, -343,
+ -554, -961, -951, 327,
+ 159, 81, 255, 227,
+ 120, 203, 256, 192,
+ 164, 224, 290, 195,
+ 216, 209, 128, 832,
+ 1028, 889, 698, 504,
+ 408, 355, 218, 32,
+ -115, -84, -276, -100,
+ -312, -484, 899, 682,
+ 465, 456, 241, -12,
+ -275, -425, -461, -367,
+ -33, -28, -102, -194,
+ -527, 863, 906, 463,
+ 245, 13, -212, -305,
+ -105, 163, 279, 176,
+ 93, 67, 115, 192,
+ 61, -50, -132, -175,
+ -224, -271, -629, -252,
+ 1158, 972, 638, 280,
+ 300, 326, 143, -152,
+ -214, -287, 53, -42,
+ -236, -352, -423, -248,
+ -129, -163, -178, -119,
+ 85, 57, 514, 382,
+ 374, 402, 424, 423,
+ 271, 197, 97, 40,
+ 39, -97, -191, -164,
+ -230, -256, -410, 396,
+ 327, 127, 10, -119,
+ -167, -291, -274, -141,
+ -99, -226, -218, -139,
+ -224, -209, -268, -442,
+ -413, 222, 58, 521,
+ 344, 258, 76, -42,
+ -142, -165, -123, -92,
+ 47, 8, -3, -191,
+ -11, -164, -167, -351,
+ -740, 311, 538, 291,
+ 184, 29, -105, 9,
+ -30, -54, -17, -77,
+ -271, -412, -622, -648,
+ 476, 186, -66, -197,
+ -73, -94, -15, 47,
+ 28, 112, -58, -33,
+ 65, 19, 84, 86,
+ 276, 114, 472, 786,
+ 799, 625, 415, 178,
+ -35, -26, 5, 9,
+ 83, 39, 37, 39,
+ -184, -374, -265, -362,
+ -501, 337, 716, 478,
+ -60, -125, -163, 362,
+ 17, -122, -233, 279,
+ 138, 157, 318, 193,
+ 189, 209, 266, 252,
+ -46, -56, -277, -429,
+ 464, 386, 142, 44,
+ -43, 66, 264, 182,
+ 47, 14, -26, -79,
+ 49, 15, -128, -203,
+ -400, -478, 325, 27,
+ 234, 411, 205, 129,
+ 12, 58, 123, 57,
+ 171, 137, 96, 128,
+ -32, 134, -12, 57,
+ 119, 26, -22, -165,
+ -500, -701, -528, -116,
+ 64, -8, 97, -9,
+ -162, -66, -156, -194,
+ -303, -546, -341, 546,
+ 358, 95, 45, 76,
+ 270, 403, 205, 100,
+ 123, 50, -53, -144,
+ -110, -13, 32, -228,
+ -130, 353, 296, 56,
+ -372, -253, 365, 73,
+ 10, -34, -139, -191,
+ -96, 5, 44, -85,
+ -179, -129, -192, -246,
+ -85, -110, -155, -44,
+ -27, 145, 138, 79,
+ 32, -148, -577, -634,
+ 191, 94, -9, -35,
+ -77, -84, -56, -171,
+ -298, -271, -243, -156,
+ -328, -235, -76, -128,
+ -121, 129, 13, -22,
+ 32, 45, -248, -65,
+ 193, -81, 299, 57,
+ -147, 192, -165, -354,
+ -334, -106, -156, -40,
+ -3, -68, 124, -257,
+ 78, 124, 170, 412,
+ 227, 105, -104, 12,
+ 154, 250, 274, 258,
+ 4, -27, 235, 152,
+ 51, 338, 300, 7,
+ -314, -411, 215, 170,
+ -9, -93, -77, 76,
+ 67, 54, 200, 315,
+ 163, 72, -91, -402,
+ 158, 187, -156, -91,
+ 290, 267, 167, 91,
+ 140, 171, 112, 9,
+ -42, -177, -440, 385,
+ 80, 15, 172, 129,
+ 41, -129, -372, -24,
+ -75, -30, -170, 10,
+ -118, 57, 78, -101,
+ 232, 161, 123, 256,
+ 277, 101, -192, -629,
+ -100, -60, -232, 66,
+ 13, -13, -80, -239,
+ 239, 37, 32, 89,
+ -319, -579, 450, 360,
+ 3, -29, -299, -89,
+ -54, -110, -246, -164,
+ 6, -188, 338, 176,
+ -92, 197, 137, 134,
+ 12, -2, 56, -183,
+ 114, -36, -131, -204,
+ 75, -25, -174, 191,
+ -15, -290, -429, -267,
+ 79, 37, 106, 23,
+ -384, 425, 70, -14,
+ 212, 105, 15, -2,
+ -42, -37, -123, 108,
+ 28, -48, 193, 197,
+ 173, -33, 37, 73,
+ -57, 256, 137, -58,
+ -430, -228, 217, -51,
+ -10, -58, -6, 22,
+ 104, 61, -119, 169,
+ 144, 16, -46, -394,
+ 60, 454, -80, -298,
+ -65, 25, 0, -24,
+ -65, -417, 465, 276,
+ -3, -194, -13, 130,
+ 19, -6, -21, -24,
+ -180, -53, -85, 20,
+ 118, 147, 113, -75,
+ -289, 226, -122, 227,
+ 270, 125, 109, 197,
+ 125, 138, 44, 60,
+ 25, -55, -167, -32,
+ -139, -193, -173, -316,
+ 287, -208, 253, 239,
+ 27, -80, -188, -28,
+ -182, -235, 156, -117,
+ 128, -48, -58, -226,
+ 172, 181, 167, 19,
+ 62, 10, 2, 181,
+ 151, 108, -16, -11,
+ -78, -331, 411, 133,
+ 17, 104, 64, -184,
+ 24, -30, -3, -283,
+ 121, 204, -8, -199,
+ -21, -80, -169, -157,
+ -191, -136, 81, 155,
+ 14, -131, 244, 74,
+ -57, -47, -280, 347,
+ 111, -77, -128, -142,
+ -194, -125, -6, -68,
+ 91, 1, 23, 14,
+ -154, -34, 23, -38,
+ -343, 503, 146, -38,
+ -46, -41, 58, 31,
+ 63, -48, -117, 45,
+ 28, 1, -89, -5,
+ -44, -29, -448, 487,
+ 204, 81, 46, -106,
+ -302, 380, 120, -38,
+ -12, -39, 70, -3,
+ 25, -65, 30, -11,
+ 34, -15, 22, -115,
+ 0, -79, -83, 45,
+ 114, 43, 150, 36,
+ 233, 149, 195, 5,
+ 25, -52, -475, 274,
+ 28, -39, -8, -66,
+ -255, 258, 56, 143,
+ -45, -190, 165, -60,
+ 20, 2, 125, -129,
+ 51, -8, -335, 288,
+ 38, 59, 25, -42,
+ 23, -118, -112, 11,
+ -55, -133, -109, 24,
+ -105, 78, -64, -245,
+ 202, -65, -127, 162,
+ 40, -94, 89, -85,
+ -119, -103, 97, 9,
+ -70, -28, 194, 86,
+ -112, -92, -114, 74,
+ -49, 46, -84, -178,
+ 113, 52, -205, 333,
+ 88, 222, 56, -55,
+ 13, 86, 4, -77,
+ 224, 114, -105, 112,
+ 125, -29, -18, -144,
+ 22, -58, -99, 28,
+ 114, -66, -32, -169,
+ -314, 285, 72, -74,
+ 179, 28, -79, -182,
+ 13, -55, 147, 13,
+ 12, -54, 31, -84,
+ -17, -75, -228, 83,
+ -375, 436, 110, -63,
+ -27, -136, 169, -56,
+ -8, -171, 184, -42,
+ 148, 68, 204, 235,
+ 110, -229, 91, 171,
+ -43, -3, -26, -99,
+ -111, 71, -170, 202,
+ -67, 181, -37, 109,
+ -120, 3, -55, -260,
+ -16, 152, 91, 142,
+ 42, 44, 134, 47,
+ 17, -35, 22, 79,
+ -169, 41, 46, 277,
+ -93, -49, -126, 37,
+ -103, -34, -22, -90,
+ -134, -205, 92, -9,
+ 1, -195, -239, 45,
+ 54, 18, -23, -1,
+ -80, -98, -20, -261,
+ 306, 72, 20, -89,
+ -217, 11, 6, -82,
+ 89, 13, -129, -89,
+ 83, -71, -55, 130,
+ -98, -146, -27, -57,
+ 53, 275, 17, 170,
+ -5, -54, 132, -64,
+ 72, 160, -125, -168,
+ 72, 40, 170, 78,
+ 248, 116, 20, 84,
+ 31, -34, 190, 38,
+ 13, -106, 225, 27,
+ -168, 24, -157, -122,
+ 165, 11, -161, -213,
+ -12, -51, -101, 42,
+ 101, 27, 55, 111,
+ 75, 71, -96, -1,
+ 65, -277, 393, -26,
+ -44, -68, -84, -66,
+ -95, 235, 179, -25,
+ -41, 27, -91, -128,
+ -222, 146, -72, -30,
+ -24, 55, -126, -68,
+ -58, -127, 13, -97,
+ -106, 174, -100, 155,
+ 101, -146, -21, 261,
+ 22, 38, -66, 65,
+ 4, 70, 64, 144,
+ 59, 213, 71, -337,
+ 303, -52, 51, -56,
+ 1, 10, -15, -5,
+ 34, 52, 228, 131,
+ 161, -127, -214, 238,
+ 123, 64, -147, -50,
+ -34, -127, 204, 162,
+ 85, 41, 5, -140,
+ 73, -150, 56, -96,
+ -66, -20, 2, -235,
+ 59, -22, -107, 150,
+ -16, -47, -4, 81,
+ -67, 167, 149, 149,
+ -157, 288, -156, -27,
+ -8, 18, 83, -24,
+ -41, -167, 158, -100,
+ 93, 53, 201, 15,
+ 42, 266, 278, -12,
+ -6, -37, 85, 6,
+ 20, -188, -271, 107,
+ -13, -80, 51, 202,
+ 173, -69, 78, -188,
+ 46, 4, 153, 12,
+ -138, 169, 5, -58,
+ -123, -108, -243, 150,
+ 10, -191, 246, -15,
+ 38, 25, -10, 14,
+ 61, 50, -206, -215,
+ -220, 90, 5, -149,
+ -219, 56, 142, 24,
+ -376, 77, -80, 75,
+ 6, 42, -101, 16,
+ 56, 14, -57, 3,
+ -17, 80, 57, -36,
+ 88, -59, -97, -19,
+ -148, 46, -219, 226,
+ 114, -4, -72, -15,
+ 37, -49, -28, 247,
+ 44, 123, 47, -122,
+ -38, 17, 4, -113,
+ -32, -224, 154, -134,
+ 196, 71, -267, -85,
+ 28, -70, 89, -120,
+ 99, -2, 64, 76,
+ -166, -48, 189, -35,
+ -92, -169, -123, 339,
+ 38, -25, 38, -35,
+ 225, -139, -50, -63,
+ 246, 60, -185, -109,
+ -49, -53, -167, 51,
+ 149, 60, -101, -33,
+ 25, -76, 120, 32,
+ -30, -83, 102, 91,
+ -186, -261, 131, -197
+};
+
+const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_16_Stage_info[ NLSF_MSVQ_CB0_16_STAGES ] =
+{
+ { 128, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 0 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 128 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 128 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 144 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 144 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 152 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 152 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 160 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 160 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 168 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 168 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 176 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 176 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 184 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 184 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 192 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 192 ] },
+ { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 200 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 200 ] }
+};
+
+const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_16 =
+{
+ NLSF_MSVQ_CB0_16_STAGES,
+ SKP_Silk_NLSF_CB0_16_Stage_info,
+ SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min_Q15,
+ SKP_Silk_NLSF_MSVQ_CB0_16_CDF,
+ SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB0_16.h
@@ -1,0 +1,51 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_TABLES_NLSF_CB0_16_H
+#define SKP_SILK_TABLES_NLSF_CB0_16_H
+
+#include "SKP_Silk_define.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define NLSF_MSVQ_CB0_16_STAGES 10
+#define NLSF_MSVQ_CB0_16_VECTORS 216
+
+/* NLSF codebook entropy coding tables */
+extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS + NLSF_MSVQ_CB0_16_STAGES ];
+extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr[ NLSF_MSVQ_CB0_16_STAGES ];
+extern const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx[ NLSF_MSVQ_CB0_16_STAGES ];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB1_10.c
@@ -1,0 +1,577 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 0.19 + 1.61 kB */
+/**********************************************/
+
+#include "SKP_Silk_structs.h"
+#include "SKP_Silk_tables_NLSF_CB1_10.h"
+
+const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS + NLSF_MSVQ_CB1_10_STAGES ] =
+{
+ 0,
+ 17096,
+ 24130,
+ 28997,
+ 33179,
+ 36696,
+ 40213,
+ 42493,
+ 44252,
+ 45973,
+ 47551,
+ 49095,
+ 50542,
+ 51898,
+ 53196,
+ 54495,
+ 55685,
+ 56851,
+ 57749,
+ 58628,
+ 59435,
+ 60207,
+ 60741,
+ 61220,
+ 61700,
+ 62179,
+ 62659,
+ 63138,
+ 63617,
+ 64097,
+ 64576,
+ 65056,
+ 65535,
+ 0,
+ 20378,
+ 33032,
+ 40395,
+ 46721,
+ 51707,
+ 56585,
+ 61157,
+ 65535,
+ 0,
+ 15055,
+ 25472,
+ 35447,
+ 42501,
+ 48969,
+ 54773,
+ 60212,
+ 65535,
+ 0,
+ 12069,
+ 22440,
+ 32812,
+ 40145,
+ 46870,
+ 53595,
+ 59630,
+ 65535,
+ 0,
+ 10839,
+ 19954,
+ 27957,
+ 35961,
+ 43965,
+ 51465,
+ 58805,
+ 65535,
+ 0,
+ 8933,
+ 17674,
+ 26415,
+ 34785,
+ 42977,
+ 50820,
+ 58496,
+ 65535
+};
+
+const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr[ NLSF_MSVQ_CB1_10_STAGES ] =
+{
+ &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 0 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 33 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 42 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 51 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 60 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 69 ]
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx[ NLSF_MSVQ_CB1_10_STAGES ] =
+{
+ 5,
+ 3,
+ 4,
+ 4,
+ 5,
+ 5
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ NLSF_MSVQ_CB1_10_VECTORS ] =
+{
+ 62, 103,
+ 120, 127,
+ 135, 135,
+ 155, 167,
+ 168, 172,
+ 173, 176,
+ 179, 181,
+ 181, 185,
+ 186, 198,
+ 199, 203,
+ 205, 222,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 54, 76,
+ 101, 108,
+ 119, 120,
+ 123, 125,
+ 68, 85,
+ 87, 103,
+ 107, 112,
+ 115, 116,
+ 78, 85,
+ 85, 101,
+ 105, 105,
+ 110, 111,
+ 83, 91,
+ 97, 97,
+ 97, 100,
+ 101, 105,
+ 92, 93,
+ 93, 95,
+ 96, 98,
+ 99, 103
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min_Q15[ 10 + 1 ] =
+{
+ 462,
+ 3,
+ 64,
+ 74,
+ 98,
+ 50,
+ 97,
+ 68,
+ 120,
+ 53,
+ 639
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * NLSF_MSVQ_CB1_10_VECTORS ] =
+{
+ 1877, 4646,
+ 7712, 10745,
+ 13964, 17028,
+ 20239, 23182,
+ 26471, 29287,
+ 1612, 3278,
+ 7086, 9975,
+ 13228, 16264,
+ 19596, 22690,
+ 26037, 28965,
+ 2169, 3830,
+ 6460, 8958,
+ 11960, 14750,
+ 18408, 21659,
+ 25018, 28043,
+ 3680, 6024,
+ 8986, 12256,
+ 15201, 18188,
+ 21741, 24460,
+ 27484, 30059,
+ 2584, 5187,
+ 7799, 10902,
+ 13179, 15765,
+ 19017, 22431,
+ 25891, 28698,
+ 3731, 5751,
+ 8650, 11742,
+ 15090, 17407,
+ 20391, 23421,
+ 26228, 29247,
+ 2107, 6323,
+ 8915, 12226,
+ 14775, 17791,
+ 20664, 23679,
+ 26829, 29353,
+ 1677, 2870,
+ 5386, 8077,
+ 11817, 15176,
+ 18657, 22006,
+ 25513, 28689,
+ 2111, 3625,
+ 7027, 10588,
+ 14059, 17193,
+ 21137, 24260,
+ 27577, 30036,
+ 2428, 4010,
+ 5765, 9376,
+ 13805, 15821,
+ 19444, 22389,
+ 25295, 29310,
+ 2256, 4628,
+ 8377, 12441,
+ 15283, 19462,
+ 22257, 25551,
+ 28432, 30304,
+ 2352, 3675,
+ 6129, 11868,
+ 14551, 16655,
+ 19624, 21883,
+ 26526, 28849,
+ 5243, 7248,
+ 10558, 13269,
+ 15651, 17919,
+ 21141, 23827,
+ 27102, 29519,
+ 4422, 6725,
+ 10449, 13273,
+ 16124, 19921,
+ 22826, 26061,
+ 28763, 30583,
+ 4508, 6291,
+ 9504, 11809,
+ 13827, 15950,
+ 19077, 22084,
+ 25740, 28658,
+ 2540, 4297,
+ 8579, 13578,
+ 16634, 19101,
+ 21547, 23887,
+ 26777, 29146,
+ 3377, 6358,
+ 10224, 14518,
+ 17905, 21056,
+ 23637, 25784,
+ 28161, 30109,
+ 4177, 5942,
+ 8159, 10108,
+ 12130, 15470,
+ 20191, 23326,
+ 26782, 29359,
+ 2492, 3801,
+ 6144, 9825,
+ 16000, 18671,
+ 20893, 23663,
+ 25899, 28974,
+ 3011, 4727,
+ 6834, 10505,
+ 12465, 14496,
+ 17065, 20052,
+ 25265, 28057,
+ 4149, 7197,
+ 12338, 15076,
+ 18002, 20190,
+ 22187, 24723,
+ 27083, 29125,
+ 2975, 4578,
+ 6448, 8378,
+ 9671, 13225,
+ 19502, 22277,
+ 26058, 28850,
+ 4102, 5760,
+ 7744, 9484,
+ 10744, 12308,
+ 14677, 19607,
+ 24841, 28381,
+ 4931, 9287,
+ 12477, 13395,
+ 13712, 14351,
+ 16048, 19867,
+ 24188, 28994,
+ 4141, 7867,
+ 13140, 17720,
+ 20064, 21108,
+ 21692, 22722,
+ 23736, 27449,
+ 4011, 8720,
+ 13234, 16206,
+ 17601, 18289,
+ 18524, 19689,
+ 23234, 27882,
+ 3420, 5995,
+ 11230, 15117,
+ 15907, 16783,
+ 17762, 23347,
+ 26898, 29946,
+ 3080, 6786,
+ 10465, 13676,
+ 18059, 23615,
+ 27058, 29082,
+ 29563, 29905,
+ 3038, 5620,
+ 9266, 12870,
+ 18803, 19610,
+ 20010, 20802,
+ 23882, 29306,
+ 3314, 6420,
+ 9046, 13262,
+ 15869, 23117,
+ 23667, 24215,
+ 24487, 25915,
+ 3469, 6963,
+ 10103, 15282,
+ 20531, 23240,
+ 25024, 26021,
+ 26736, 27255,
+ 3041, 6459,
+ 9777, 12896,
+ 16315, 19410,
+ 24070, 29353,
+ 31795, 32075,
+ -200, -134,
+ -113, -204,
+ -347, -440,
+ -352, -211,
+ -418, -172,
+ -313, 59,
+ 495, 772,
+ 721, 614,
+ 334, 444,
+ 225, 242,
+ 161, 16,
+ 274, 564,
+ -73, -188,
+ -395, -171,
+ 777, 508,
+ 1340, 1145,
+ 699, 196,
+ 223, 173,
+ 90, 25,
+ -26, 18,
+ 133, -105,
+ -360, -277,
+ 859, 634,
+ 41, -557,
+ -768, -926,
+ -601, -1021,
+ -1189, -365,
+ 225, 107,
+ 374, -50,
+ 433, 417,
+ 156, 39,
+ -597, -1397,
+ -1594, -592,
+ -485, -292,
+ 253, 87,
+ -0, -6,
+ -25, -345,
+ -240, 120,
+ 1261, 946,
+ 166, -277,
+ 241, 167,
+ 170, 429,
+ 518, 714,
+ 602, 254,
+ 134, 92,
+ -152, -324,
+ -394, 49,
+ -151, -304,
+ -724, -657,
+ -162, -369,
+ -35, 3,
+ -2, -312,
+ -200, -92,
+ -227, 242,
+ 628, 565,
+ -124, 1056,
+ 770, 101,
+ -84, -33,
+ 4, -192,
+ -272, 5,
+ -627, -977,
+ 419, 472,
+ 53, -103,
+ 145, 322,
+ -95, -31,
+ -100, -303,
+ -560, -1067,
+ -413, 714,
+ 283, 2,
+ -223, -367,
+ 523, 360,
+ -38, -115,
+ 378, -591,
+ -718, 448,
+ -481, -274,
+ 180, -88,
+ -581, -157,
+ -696, -1265,
+ 394, -479,
+ -23, 124,
+ -43, 19,
+ -113, -236,
+ -412, -659,
+ -200, 2,
+ -69, -342,
+ 199, 55,
+ 58, -36,
+ -51, -62,
+ 507, 507,
+ 427, 442,
+ 36, 601,
+ -141, 68,
+ 274, 274,
+ 68, -12,
+ -4, 71,
+ -193, -464,
+ -425, -383,
+ 408, 203,
+ -337, 236,
+ 410, -59,
+ -25, -341,
+ -449, 28,
+ -9, 90,
+ 332, -14,
+ -905, 96,
+ -540, -242,
+ 679, -59,
+ 192, -24,
+ 60, -217,
+ 5, -37,
+ 179, -20,
+ 311, 519,
+ 274, 72,
+ -326, -1030,
+ -262, 213,
+ 380, 82,
+ 328, 411,
+ -540, 574,
+ -283, 151,
+ 181, -402,
+ -278, -240,
+ -110, -227,
+ -264, -89,
+ -250, -259,
+ -27, 106,
+ -239, -98,
+ -390, 118,
+ 61, 104,
+ 294, 532,
+ 92, -13,
+ 60, -233,
+ 335, 541,
+ 307, -26,
+ -110, -91,
+ -231, -460,
+ 170, 201,
+ 96, -372,
+ 132, 435,
+ -302, 216,
+ -279, -41,
+ 74, 190,
+ 368, 273,
+ -186, -608,
+ -157, 159,
+ 12, 278,
+ 245, 307,
+ 25, -187,
+ -16, 55,
+ 30, -163,
+ 548, -307,
+ 106, -5,
+ 27, 330,
+ -416, 475,
+ 438, -235,
+ 104, 137,
+ 21, -5,
+ -300, -468,
+ 521, -347,
+ 170, -200,
+ -219, 308,
+ -122, -133,
+ 219, -16,
+ 359, 412,
+ -89, -111,
+ 48, 322,
+ 142, 177,
+ -286, -127,
+ -39, -63,
+ -42, -451,
+ 160, 308,
+ -57, 193,
+ -48, 74,
+ -346, 59,
+ -27, 27,
+ -469, -277,
+ -344, 282,
+ 262, 122,
+ 171, -249,
+ 27, 258,
+ 188, -3,
+ 67, -206,
+ -284, 291,
+ -117, -88,
+ -477, 375,
+ 50, 106,
+ 99, -182,
+ 438, -376,
+ -401, -49,
+ 119, -23,
+ -10, -48,
+ -116, -200,
+ -310, 121,
+ 73, 7,
+ 237, -226,
+ 139, -456,
+ 397, 35,
+ 3, -108,
+ 323, -75,
+ 332, 198,
+ -99, -21
+};
+
+const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_10_Stage_info[ NLSF_MSVQ_CB1_10_STAGES ] =
+{
+ { 32, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 0 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 32 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 40 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 48 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 56 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 64 ] }
+};
+
+const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB1_10 =
+{
+ NLSF_MSVQ_CB1_10_STAGES,
+ SKP_Silk_NLSF_CB1_10_Stage_info,
+ SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min_Q15,
+ SKP_Silk_NLSF_MSVQ_CB1_10_CDF,
+ SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB1_10.h
@@ -1,0 +1,51 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_TABLES_NLSF_CB1_10_H
+#define SKP_SILK_TABLES_NLSF_CB1_10_H
+
+#include "SKP_Silk_define.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define NLSF_MSVQ_CB1_10_STAGES 6
+#define NLSF_MSVQ_CB1_10_VECTORS 72
+
+/* NLSF codebook entropy coding tables */
+extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS + NLSF_MSVQ_CB1_10_STAGES ];
+extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr[ NLSF_MSVQ_CB1_10_STAGES ];
+extern const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx[ NLSF_MSVQ_CB1_10_STAGES ];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB1_16.c
@@ -1,0 +1,703 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/**********************************************/
+/* This file has been automatically generated */
+/* */
+/* ROM usage: 0.29 + 3.57 kB */
+/**********************************************/
+
+#include "SKP_Silk_structs.h"
+#include "SKP_Silk_tables_NLSF_CB1_16.h"
+
+const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS + NLSF_MSVQ_CB1_16_STAGES ] =
+{
+ 0,
+ 19099,
+ 26957,
+ 30639,
+ 34242,
+ 37546,
+ 40447,
+ 43287,
+ 46005,
+ 48445,
+ 49865,
+ 51284,
+ 52673,
+ 53975,
+ 55221,
+ 56441,
+ 57267,
+ 58025,
+ 58648,
+ 59232,
+ 59768,
+ 60248,
+ 60729,
+ 61210,
+ 61690,
+ 62171,
+ 62651,
+ 63132,
+ 63613,
+ 64093,
+ 64574,
+ 65054,
+ 65535,
+ 0,
+ 28808,
+ 38775,
+ 46801,
+ 51785,
+ 55886,
+ 59410,
+ 62572,
+ 65535,
+ 0,
+ 27376,
+ 38639,
+ 45052,
+ 51465,
+ 55448,
+ 59021,
+ 62594,
+ 65535,
+ 0,
+ 33403,
+ 39569,
+ 45102,
+ 49961,
+ 54047,
+ 57959,
+ 61788,
+ 65535,
+ 0,
+ 25851,
+ 43356,
+ 47828,
+ 52204,
+ 55964,
+ 59413,
+ 62507,
+ 65535,
+ 0,
+ 34277,
+ 40337,
+ 45432,
+ 50311,
+ 54326,
+ 58171,
+ 61853,
+ 65535,
+ 0,
+ 33538,
+ 39865,
+ 45302,
+ 50076,
+ 54549,
+ 58478,
+ 62159,
+ 65535,
+ 0,
+ 27445,
+ 35258,
+ 40665,
+ 46072,
+ 51362,
+ 56540,
+ 61086,
+ 65535,
+ 0,
+ 22080,
+ 30779,
+ 37065,
+ 43085,
+ 48849,
+ 54613,
+ 60133,
+ 65535,
+ 0,
+ 13417,
+ 21748,
+ 30078,
+ 38231,
+ 46383,
+ 53091,
+ 59515,
+ 65535
+};
+
+const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr[ NLSF_MSVQ_CB1_16_STAGES ] =
+{
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 0 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 33 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 42 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 51 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 60 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 69 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 78 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 87 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 96 ],
+ &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 105 ]
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx[ NLSF_MSVQ_CB1_16_STAGES ] =
+{
+ 5,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ NLSF_MSVQ_CB1_16_VECTORS ] =
+{
+ 57, 98,
+ 133, 134,
+ 138, 144,
+ 145, 147,
+ 152, 177,
+ 177, 178,
+ 181, 183,
+ 184, 202,
+ 206, 215,
+ 218, 222,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 227, 227,
+ 38, 87,
+ 97, 119,
+ 128, 135,
+ 140, 143,
+ 40, 81,
+ 107, 107,
+ 129, 134,
+ 134, 143,
+ 31, 109,
+ 114, 120,
+ 128, 130,
+ 131, 132,
+ 43, 61,
+ 124, 125,
+ 132, 136,
+ 141, 142,
+ 30, 110,
+ 118, 120,
+ 129, 131,
+ 133, 133,
+ 31, 108,
+ 115, 121,
+ 124, 130,
+ 133, 137,
+ 40, 98,
+ 115, 115,
+ 116, 117,
+ 123, 124,
+ 50, 93,
+ 108, 110,
+ 112, 112,
+ 114, 115,
+ 73, 95,
+ 95, 96,
+ 96, 105,
+ 107, 110
+};
+
+const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min_Q15[ 16 + 1 ] =
+{
+ 148,
+ 3,
+ 60,
+ 68,
+ 117,
+ 86,
+ 121,
+ 124,
+ 152,
+ 153,
+ 207,
+ 151,
+ 225,
+ 239,
+ 126,
+ 183,
+ 792
+};
+
+const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * NLSF_MSVQ_CB1_16_VECTORS ] =
+{
+ 1309, 3060, 5071, 6996,
+ 9028, 10938, 12934, 14891,
+ 16933, 18854, 20792, 22764,
+ 24753, 26659, 28626, 30501,
+ 1264, 2745, 4610, 6408,
+ 8286, 10043, 12084, 14108,
+ 16118, 18163, 20095, 22164,
+ 24264, 26316, 28329, 30251,
+ 1044, 2080, 3672, 5179,
+ 7140, 9100, 11070, 13065,
+ 15423, 17790, 19931, 22101,
+ 24290, 26361, 28499, 30418,
+ 1131, 2476, 4478, 6149,
+ 7902, 9875, 11938, 13809,
+ 15869, 17730, 19948, 21707,
+ 23761, 25535, 27426, 28917,
+ 1040, 2004, 4026, 6100,
+ 8432, 10494, 12610, 14694,
+ 16797, 18775, 20799, 22782,
+ 24772, 26682, 28631, 30516,
+ 2310, 3812, 5913, 7933,
+ 10033, 11881, 13885, 15798,
+ 17751, 19576, 21482, 23276,
+ 25157, 27010, 28833, 30623,
+ 1254, 2847, 5013, 6781,
+ 8626, 10370, 12726, 14633,
+ 16281, 17852, 19870, 21472,
+ 23002, 24629, 26710, 27960,
+ 1468, 3059, 4987, 7026,
+ 8741, 10412, 12281, 14020,
+ 15970, 17723, 19640, 21522,
+ 23472, 25661, 27986, 30225,
+ 2171, 3566, 5605, 7384,
+ 9404, 11220, 13030, 14758,
+ 16687, 18417, 20346, 22091,
+ 24055, 26212, 28356, 30397,
+ 2409, 4676, 7543, 9786,
+ 11419, 12935, 14368, 15653,
+ 17366, 18943, 20762, 22477,
+ 24440, 26327, 28284, 30242,
+ 2354, 4222, 6820, 9107,
+ 11596, 13934, 15973, 17682,
+ 19158, 20517, 21991, 23420,
+ 25178, 26936, 28794, 30527,
+ 1323, 2414, 4184, 6039,
+ 7534, 9398, 11099, 13097,
+ 14799, 16451, 18434, 20887,
+ 23490, 25838, 28046, 30225,
+ 1361, 3243, 6048, 8511,
+ 11001, 13145, 15073, 16608,
+ 18126, 19381, 20912, 22607,
+ 24660, 26668, 28663, 30566,
+ 1216, 2648, 5901, 8422,
+ 10037, 11425, 12973, 14603,
+ 16686, 18600, 20555, 22415,
+ 24450, 26280, 28206, 30077,
+ 2417, 4048, 6316, 8433,
+ 10510, 12757, 15072, 17295,
+ 19573, 21503, 23329, 24782,
+ 26235, 27689, 29214, 30819,
+ 1012, 2345, 4991, 7377,
+ 9465, 11916, 14296, 16566,
+ 18672, 20544, 22292, 23838,
+ 25415, 27050, 28848, 30551,
+ 1937, 3693, 6267, 8019,
+ 10372, 12194, 14287, 15657,
+ 17431, 18864, 20769, 22206,
+ 24037, 25463, 27383, 28602,
+ 1969, 3305, 5017, 6726,
+ 8375, 9993, 11634, 13280,
+ 15078, 16751, 18464, 20119,
+ 21959, 23858, 26224, 29298,
+ 1198, 2647, 5428, 7423,
+ 9775, 12155, 14665, 16344,
+ 18121, 19790, 21557, 22847,
+ 24484, 25742, 27639, 28711,
+ 1636, 3353, 5447, 7597,
+ 9837, 11647, 13964, 16019,
+ 17862, 20116, 22319, 24037,
+ 25966, 28086, 29914, 31294,
+ 2676, 4105, 6378, 8223,
+ 10058, 11549, 13072, 14453,
+ 15956, 17355, 18931, 20402,
+ 22183, 23884, 25717, 27723,
+ 1373, 2593, 4449, 5633,
+ 7300, 8425, 9474, 10818,
+ 12769, 15722, 19002, 21429,
+ 23682, 25924, 28135, 30333,
+ 1596, 3183, 5378, 7164,
+ 8670, 10105, 11470, 12834,
+ 13991, 15042, 16642, 17903,
+ 20759, 25283, 27770, 30240,
+ 2037, 3987, 6237, 8117,
+ 9954, 12245, 14217, 15892,
+ 17775, 20114, 22314, 25942,
+ 26305, 26483, 26796, 28561,
+ 2181, 3858, 5760, 7924,
+ 10041, 11577, 13769, 15700,
+ 17429, 19879, 23583, 24538,
+ 25212, 25693, 28688, 30507,
+ 1992, 3882, 6474, 7883,
+ 9381, 12672, 14340, 15701,
+ 16658, 17832, 20850, 22885,
+ 24677, 26457, 28491, 30460,
+ 2391, 3988, 5448, 7432,
+ 11014, 12579, 13140, 14146,
+ 15898, 18592, 21104, 22993,
+ 24673, 27186, 28142, 29612,
+ 1713, 5102, 6989, 7798,
+ 8670, 10110, 12746, 14881,
+ 16709, 18407, 20126, 22107,
+ 24181, 26198, 28237, 30137,
+ 1612, 3617, 6148, 8359,
+ 9576, 11528, 14936, 17809,
+ 18287, 18729, 19001, 21111,
+ 24631, 26596, 28740, 30643,
+ 2266, 4168, 7862, 9546,
+ 9618, 9703, 10134, 13897,
+ 16265, 18432, 20587, 22605,
+ 24754, 26994, 29125, 30840,
+ 1840, 3917, 6272, 7809,
+ 9714, 11438, 13767, 15799,
+ 19244, 21972, 22980, 23180,
+ 23723, 25650, 29117, 31085,
+ 1458, 3612, 6008, 7488,
+ 9827, 11893, 14086, 15734,
+ 17440, 19535, 22424, 24767,
+ 29246, 29928, 30516, 30947,
+ -102, -121, -31, -6,
+ 5, -2, 8, -18,
+ -4, 6, 14, -2,
+ -12, -16, -12, -60,
+ -126, -353, -574, -677,
+ -657, -617, -498, -393,
+ -348, -277, -225, -164,
+ -102, -70, -31, 33,
+ 4, 379, 387, 551,
+ 605, 620, 532, 482,
+ 442, 454, 385, 347,
+ 322, 299, 266, 200,
+ 1168, 951, 672, 246,
+ 60, -161, -259, -234,
+ -253, -282, -203, -187,
+ -155, -176, -198, -178,
+ 10, 170, 393, 609,
+ 555, 208, -330, -571,
+ -769, -633, -319, -43,
+ 95, 105, 106, 116,
+ -152, -140, -125, 5,
+ 173, 274, 264, 331,
+ -37, -293, -609, -786,
+ -959, -814, -645, -238,
+ -91, 36, -11, -101,
+ -279, -227, -40, 90,
+ 530, 677, 890, 1104,
+ 999, 835, 564, 295,
+ -280, -364, -340, -331,
+ -284, 288, 761, 880,
+ 988, 627, 146, -226,
+ -203, -181, -142, 39,
+ 24, -26, -107, -92,
+ -161, -135, -131, -88,
+ -160, -156, -75, -43,
+ -36, -6, -33, 33,
+ -324, -415, -108, 124,
+ 157, 191, 203, 197,
+ 144, 109, 152, 176,
+ 190, 122, 101, 159,
+ 663, 668, 480, 400,
+ 379, 444, 446, 458,
+ 343, 351, 310, 228,
+ 133, 44, 75, 63,
+ -84, 39, -29, 35,
+ -94, -233, -261, -354,
+ 77, 262, -24, -145,
+ -333, -409, -404, -597,
+ -488, -300, 910, 592,
+ 412, 120, 130, -51,
+ -37, -77, -172, -181,
+ -159, -148, -72, -62,
+ 510, 516, 113, -585,
+ -1075, -957, -417, -195,
+ 9, 7, -88, -173,
+ -91, 54, 98, 95,
+ -28, 197, -527, -621,
+ 157, 122, -168, 147,
+ 309, 300, 336, 315,
+ 396, 408, 376, 106,
+ -162, -170, -315, 98,
+ 821, 908, 570, -33,
+ -312, -568, -572, -378,
+ -107, 23, 156, 93,
+ -129, -87, 20, -72,
+ -37, 40, 21, 27,
+ 48, 75, 77, 65,
+ 46, 71, 66, 47,
+ 136, 344, 236, 322,
+ 170, 283, 269, 291,
+ 162, -43, -204, -259,
+ -240, -305, -350, -312,
+ 447, 348, 345, 257,
+ 71, -131, -77, -190,
+ -202, -40, 35, 133,
+ 261, 365, 438, 303,
+ -8, 22, 140, 137,
+ -300, -641, -764, -268,
+ -23, -25, 73, -162,
+ -150, -212, -72, 6,
+ 39, 78, 104, -93,
+ -308, -136, 117, -71,
+ -513, -820, -700, -450,
+ -161, -23, 29, 78,
+ 337, 106, -406, -782,
+ -112, 233, 383, 62,
+ -126, 6, -77, -29,
+ -146, -123, -51, -27,
+ -27, -381, -641, 402,
+ 539, 8, -207, -366,
+ -36, -27, -204, -227,
+ -237, -189, -64, 51,
+ -92, -137, -281, 62,
+ 233, 92, 148, 294,
+ 363, 416, 564, 625,
+ 370, -36, -469, -462,
+ 102, 168, 32, 117,
+ -21, 97, 139, 89,
+ 104, 35, 4, 82,
+ 66, 58, 73, 93,
+ -76, -320, -236, -189,
+ -203, -142, -27, -73,
+ 9, -9, -25, 12,
+ -15, 4, 4, -50,
+ 314, 180, 162, -49,
+ 199, -108, -227, -66,
+ -447, -67, -264, -394,
+ 5, 55, -133, -176,
+ -116, -241, 272, 109,
+ 282, 262, 192, -64,
+ -392, -514, 156, 203,
+ 154, 72, -34, -160,
+ -73, 3, -33, -431,
+ 321, 18, -567, -590,
+ -108, 88, 66, 51,
+ -31, -193, -46, 65,
+ -29, -23, 215, -31,
+ 101, -113, 32, 304,
+ 88, 320, 448, 5,
+ -439, -562, -508, -135,
+ -13, -171, -8, 182,
+ -99, -181, -149, 376,
+ 476, 64, -396, -652,
+ -150, 176, 222, 65,
+ -590, 719, 271, 399,
+ 245, 72, -156, -152,
+ -176, 59, 94, 125,
+ -9, -7, 9, 1,
+ -61, -116, -82, 1,
+ 79, 22, -44, -15,
+ -48, -65, -62, -101,
+ -102, -54, -70, -78,
+ -80, -25, 398, 71,
+ 139, 38, 90, 194,
+ 222, 249, 165, 94,
+ 221, 262, 163, 91,
+ -206, 573, 200, -287,
+ -147, 5, -18, -85,
+ -74, -125, -87, 85,
+ 141, 4, -4, 28,
+ 234, 48, -150, -111,
+ -506, 237, -209, 345,
+ 94, -124, 77, 121,
+ 143, 12, -80, -48,
+ 191, 144, -93, -65,
+ -151, -643, 435, 106,
+ 87, 7, 65, 102,
+ 94, 68, 5, 99,
+ 222, 93, 94, 355,
+ -13, -89, -228, -503,
+ 287, 109, 108, 449,
+ 253, -29, -109, -116,
+ 15, -73, -20, 131,
+ -147, 72, 59, -150,
+ -594, 273, 316, 132,
+ 199, 106, 198, 212,
+ 220, 82, 45, -13,
+ 223, 137, 270, 38,
+ 252, 135, -177, -207,
+ -360, -102, 403, 406,
+ -14, 83, 64, 51,
+ -7, -99, -97, -88,
+ -124, -65, 42, 32,
+ 28, 29, 12, 20,
+ 119, -26, -212, -201,
+ 373, 251, 141, 103,
+ 36, -52, 66, 18,
+ -6, -95, -196, 5,
+ 98, -85, -108, 218,
+ -164, 20, 356, 172,
+ 37, 266, 23, 112,
+ -24, -99, -92, -178,
+ 29, -278, 388, -60,
+ -220, 300, -13, 154,
+ 191, 15, -37, -110,
+ -153, -150, -114, -7,
+ -94, -31, -62, -177,
+ 4, -70, 35, 453,
+ 147, -247, -328, 101,
+ 20, -114, 147, 108,
+ -119, -109, -102, -238,
+ 55, -102, 173, -89,
+ 129, 138, -330, -160,
+ 485, 154, -59, -170,
+ -20, -34, -261, -40,
+ -129, 77, -84, 69,
+ 83, 160, 169, 63,
+ -516, 30, 336, 52,
+ -0, -52, -124, 158,
+ 19, 197, -10, -375,
+ 405, 285, 114, -395,
+ -47, 196, 62, 87,
+ -106, -65, -75, -69,
+ -13, 34, 99, 59,
+ 83, 98, 44, 0,
+ 24, 18, 17, 70,
+ -22, 194, 208, 144,
+ -79, -15, 32, -104,
+ -28, -105, -186, -212,
+ -228, -79, -76, 51,
+ -71, 72, 118, -34,
+ -3, -171, 5, 2,
+ -108, -125, 62, -58,
+ 58, -121, 73, -466,
+ 92, 63, -94, -78,
+ -76, 212, 36, -225,
+ -71, -354, 152, 143,
+ -79, -246, -51, -31,
+ -6, -270, 240, 210,
+ 30, -157, -231, 74,
+ -146, 88, -273, 156,
+ 92, 56, 71, 2,
+ 318, 164, 32, -110,
+ -35, -41, -95, -106,
+ 11, 132, -68, 55,
+ 123, -83, -149, 212,
+ 132, 0, -194, 55,
+ 206, -108, -353, 289,
+ -195, 1, 233, -22,
+ -60, 20, 26, 68,
+ 166, 27, -58, 130,
+ 112, 107, 27, -165,
+ 115, -93, -37, 38,
+ 83, 483, 65, -229,
+ -13, 157, 85, 50,
+ 136, 10, 32, 83,
+ 82, 55, 5, -9,
+ -52, -78, -81, -51,
+ 40, 18, -127, -224,
+ -41, 53, -210, -113,
+ 24, -17, -187, -89,
+ 8, 121, 83, 77,
+ 91, -74, -35, -112,
+ -161, -173, 102, 132,
+ -125, -61, 103, -260,
+ 52, 166, -32, -156,
+ -87, -56, 60, -70,
+ -124, 242, 114, -251,
+ -166, 201, 127, 28,
+ -11, 23, -80, -115,
+ -20, -51, -348, 340,
+ -34, 133, 13, 92,
+ -124, -136, -120, -26,
+ -6, 17, 28, 21,
+ 120, -168, 160, -35,
+ 115, 28, 9, 7,
+ -56, 39, 156, 256,
+ -18, 1, 277, 82,
+ -70, -144, -88, -13,
+ -59, -157, 8, -134,
+ 21, -40, 58, -21,
+ 194, -276, 97, 279,
+ -56, -140, 125, 57,
+ -184, -204, -70, -2,
+ 128, -202, -78, 230,
+ -23, 161, -102, 1,
+ 1, 180, -31, -86,
+ -167, -57, -60, 27,
+ -13, 99, 108, 111,
+ 76, 69, 34, -21,
+ 53, 38, 34, 78,
+ 73, 219, 51, 15,
+ -72, -103, -207, 30,
+ 213, -14, 31, -94,
+ -40, -144, 67, 4,
+ 105, 59, -240, 25,
+ 244, 69, 58, 23,
+ -24, -5, -15, -133,
+ -71, -67, 181, 29,
+ -45, 121, 96, 51,
+ -72, -53, 56, -153,
+ -27, 85, 183, 211,
+ 105, -34, -46, 43,
+ -72, -93, 36, -128,
+ 29, 111, -95, -156,
+ -179, -235, 21, -39,
+ -71, -33, -61, -252,
+ 230, -131, 157, -21,
+ -85, -28, -123, 80,
+ -160, 63, 47, -6,
+ -49, -96, -19, 17,
+ -58, 17, -0, -13,
+ -170, 25, -35, 59,
+ 10, -31, -413, 81,
+ 62, 18, -164, 245,
+ 92, -165, 42, 26,
+ 126, -248, 193, -55,
+ 16, 39, 14, 50
+};
+
+const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_16_Stage_info[ NLSF_MSVQ_CB1_16_STAGES ] =
+{
+ { 32, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 0 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 32 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 40 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 48 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 56 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 64 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 72 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 72 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 80 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 80 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 88 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 88 ] },
+ { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 96 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 96 ] }
+};
+
+const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB1_16 =
+{
+ NLSF_MSVQ_CB1_16_STAGES,
+ SKP_Silk_NLSF_CB1_16_Stage_info,
+ SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min_Q15,
+ SKP_Silk_NLSF_MSVQ_CB1_16_CDF,
+ SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr,
+ SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx
+};
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_NLSF_CB1_16.h
@@ -1,0 +1,51 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#ifndef SKP_SILK_TABLES_NLSF_CB1_16_H
+#define SKP_SILK_TABLES_NLSF_CB1_16_H
+
+#include "SKP_Silk_define.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define NLSF_MSVQ_CB1_16_STAGES 10
+#define NLSF_MSVQ_CB1_16_VECTORS 104
+
+/* NLSF codebook entropy coding tables */
+extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS + NLSF_MSVQ_CB1_16_STAGES ];
+extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr[ NLSF_MSVQ_CB1_16_STAGES ];
+extern const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx[ NLSF_MSVQ_CB1_16_STAGES ];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_gain.c
@@ -1,0 +1,77 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_tables.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+const SKP_uint16 SKP_Silk_gain_CDF[ 2 ][ 65 ] =
+{
+{
+ 0, 18, 45, 94, 181, 320, 519, 777,
+ 1093, 1468, 1909, 2417, 2997, 3657, 4404, 5245,
+ 6185, 7228, 8384, 9664, 11069, 12596, 14244, 16022,
+ 17937, 19979, 22121, 24345, 26646, 29021, 31454, 33927,
+ 36438, 38982, 41538, 44068, 46532, 48904, 51160, 53265,
+ 55184, 56904, 58422, 59739, 60858, 61793, 62568, 63210,
+ 63738, 64165, 64504, 64769, 64976, 65133, 65249, 65330,
+ 65386, 65424, 65451, 65471, 65487, 65501, 65513, 65524,
+ 65535
+},
+{
+ 0, 214, 581, 1261, 2376, 3920, 5742, 7632,
+ 9449, 11157, 12780, 14352, 15897, 17427, 18949, 20462,
+ 21957, 23430, 24889, 26342, 27780, 29191, 30575, 31952,
+ 33345, 34763, 36200, 37642, 39083, 40519, 41930, 43291,
+ 44602, 45885, 47154, 48402, 49619, 50805, 51959, 53069,
+ 54127, 55140, 56128, 57101, 58056, 58979, 59859, 60692,
+ 61468, 62177, 62812, 63368, 63845, 64242, 64563, 64818,
+ 65023, 65184, 65306, 65391, 65447, 65482, 65505, 65521,
+ 65535
+}
+};
+
+const SKP_int SKP_Silk_gain_CDF_offset = 32;
+
+
+const SKP_uint16 SKP_Silk_delta_gain_CDF[ 46 ] = {
+ 0, 2358, 3856, 7023, 15376, 53058, 59135, 61555,
+ 62784, 63498, 63949, 64265, 64478, 64647, 64783, 64894,
+ 64986, 65052, 65113, 65169, 65213, 65252, 65284, 65314,
+ 65338, 65359, 65377, 65392, 65403, 65415, 65424, 65432,
+ 65440, 65448, 65455, 65462, 65470, 65477, 65484, 65491,
+ 65499, 65506, 65513, 65521, 65528, 65535
+};
+
+const SKP_int SKP_Silk_delta_gain_CDF_offset = 5;
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null
+++ b/src_common/SKP_Silk_tables_other.c
@@ -1,0 +1,152 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_structs.h"
+#include "SKP_Silk_define.h"
+#include "SKP_Silk_tables.h"
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */
+const SKP_int32 TargetRate_table_NB[ TARGET_RATE_TAB_SZ ] = {
+ 0, 8000, 9000, 11000, 13000, 16000, 22000, 100000
+};
+const SKP_int32 TargetRate_table_MB[ TARGET_RATE_TAB_SZ ] = {
+ 0, 10000, 12000, 14000, 17000, 21000, 28000, 100000
+};
+const SKP_int32 TargetRate_table_WB[ TARGET_RATE_TAB_SZ ] = {
+ 0, 11000, 14000, 17000, 21000, 26000, 36000, 100000
+};
+const SKP_int32 TargetRate_table_SWB[ TARGET_RATE_TAB_SZ ] = {
+ 0, 13000, 16000, 19000, 25000, 32000, 46000, 100000
+};
+const SKP_int32 SNR_table_Q1[ TARGET_RATE_TAB_SZ ] = {
+ 19, 31, 35, 39, 43, 47, 54, 59
+};
+
+const SKP_int32 SNR_table_one_bit_per_sample_Q7[ 4 ] = {
+ 1984, 2240, 2408, 2708
+};
+
+/* Filter coeficicnts for HP filter: 4. Order filter implementad as two biquad filters */
+const SKP_int16 SKP_Silk_SWB_detect_B_HP_Q13[ NB_SOS ][ 3 ] = {
+ //{400, -550, 400}, {400, 130, 400}, {400, 390, 400}
+ {575, -948, 575}, {575, -221, 575}, {575, 104, 575}
+};
+const SKP_int16 SKP_Silk_SWB_detect_A_HP_Q13[ NB_SOS ][ 2 ] = {
+ {14613, 6868}, {12883, 7337}, {11586, 7911}
+ //{14880, 6900}, {14400, 7300}, {13700, 7800}
+};
+
+/* Decoder high-pass filter coefficients for 24 kHz sampling, -6 dB @ 44 Hz */
+const SKP_int16 SKP_Silk_Dec_A_HP_24[ DEC_HP_ORDER ] = {-16220, 8030}; // second order AR coefs, Q13
+const SKP_int16 SKP_Silk_Dec_B_HP_24[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
+
+/* Decoder high-pass filter coefficients for 16 kHz sampling, - 6 dB @ 46 Hz */
+const SKP_int16 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ] = {-16127, 7940}; // second order AR coefs, Q13
+const SKP_int16 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
+
+/* Decoder high-pass filter coefficients for 12 kHz sampling, -6 dB @ 44 Hz */
+const SKP_int16 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ] = {-16043, 7859}; // second order AR coefs, Q13
+const SKP_int16 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
+
+/* Decoder high-pass filter coefficients for 8 kHz sampling, -6 dB @ 43 Hz */
+const SKP_int16 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ] = {-15885, 7710}; // second order AR coefs, Q13
+const SKP_int16 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13
+
+/* table for LSB coding */
+const SKP_uint16 SKP_Silk_lsb_CDF[ 3 ] = {0, 40000, 65535};
+
+/* tables for LTPScale */
+const SKP_uint16 SKP_Silk_LTPscale_CDF[ 4 ] = {0, 32000, 48000, 65535};
+const SKP_int SKP_Silk_LTPscale_offset = 2;
+
+/* tables for VAD flag */
+const SKP_uint16 SKP_Silk_vadflag_CDF[ 3 ] = {0, 22000, 65535}; // 66% for speech, 33% for no speech
+const SKP_int SKP_Silk_vadflag_offset = 1;
+
+/* tables for sampling rate */
+const SKP_int SKP_Silk_SamplingRates_table[ 4 ] = {8, 12, 16, 24};
+const SKP_uint16 SKP_Silk_SamplingRates_CDF[ 5 ] = {0, 16000, 32000, 48000, 65535};
+const SKP_int SKP_Silk_SamplingRates_offset = 2;
+
+/* tables for number of subframes */
+const SKP_uint16 SKP_Silk_NbSubframes_CDF[ 3 ] = {0, 40000, 65535};
+const SKP_int SKP_Silk_NbSubframes_offset = 1;
+
+/* tables for NLSF interpolation factor */
+const SKP_uint16 SKP_Silk_NLSF_interpolation_factor_CDF[ 6 ] = {0, 3706, 8703, 19226, 30926, 65535};
+const SKP_int SKP_Silk_NLSF_interpolation_factor_offset = 4;
+
+/* Table for frame termination indication */
+const SKP_uint16 SKP_Silk_FrameTermination_v4_CDF[ 6 ] = {0, 13107, 26214, 39321, 52428, 65535};
+const SKP_int SKP_Silk_FrameTermination_v4_offset = 4;
+
+/* Table for random seed */
+const SKP_uint16 SKP_Silk_Seed_CDF[ 5 ] = {0, 16384, 32768, 49152, 65535};
+const SKP_int SKP_Silk_Seed_offset = 2;
+
+/* Quantization offsets */
+const SKP_int16 SKP_Silk_Quantization_Offsets_Q10[ 2 ][ 2 ] = {
+ { OFFSET_VL_Q10, OFFSET_VH_Q10 }, { OFFSET_UVL_Q10, OFFSET_UVH_Q10 }
+};
+
+/* Table for LTPScale */
+const SKP_int16 SKP_Silk_LTPScales_table_Q14[ 3 ] = { 15565, 11469, 8192 };
+
+#if SWITCH_TRANSITION_FILTERING
+/* Elliptic/Cauer filters designed with 0.1 dB passband ripple,
+ 80 dB minimum stopband attenuation, and
+ [0.95 : 0.15 : 0.35] normalized cut off frequencies. */
+
+/* Interpolation points for filter coefficients used in the bandwidth transition smoother */
+const SKP_int32 SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ] =
+{
+{ 250767114, 501534038, 250767114 },
+{ 209867381, 419732057, 209867381 },
+{ 170987846, 341967853, 170987846 },
+{ 131531482, 263046905, 131531482 },
+{ 89306658, 178584282, 89306658 }
+};
+
+/* Interpolation points for filter coefficients used in the bandwidth transition smoother */
+const SKP_int32 SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ] =
+{
+{ 506393414, 239854379 },
+{ 411067935, 169683996 },
+{ 306733530, 116694253 },
+{ 185807084, 77959395 },
+{ 35497197, 57401098 }
+};
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_pitch_lag.c
@@ -1,0 +1,199 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_tables.h"
+
+const SKP_uint16 SKP_Silk_pitch_lag_NB_CDF[ 8 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
+ 0, 194, 395, 608, 841, 1099, 1391, 1724,
+ 2105, 2544, 3047, 3624, 4282, 5027, 5865, 6799,
+ 7833, 8965, 10193, 11510, 12910, 14379, 15905, 17473,
+ 19065, 20664, 22252, 23814, 25335, 26802, 28206, 29541,
+ 30803, 31992, 33110, 34163, 35156, 36098, 36997, 37861,
+ 38698, 39515, 40319, 41115, 41906, 42696, 43485, 44273,
+ 45061, 45847, 46630, 47406, 48175, 48933, 49679, 50411,
+ 51126, 51824, 52502, 53161, 53799, 54416, 55011, 55584,
+ 56136, 56666, 57174, 57661, 58126, 58570, 58993, 59394,
+ 59775, 60134, 60472, 60790, 61087, 61363, 61620, 61856,
+ 62075, 62275, 62458, 62625, 62778, 62918, 63045, 63162,
+ 63269, 63368, 63459, 63544, 63623, 63698, 63769, 63836,
+ 63901, 63963, 64023, 64081, 64138, 64194, 64248, 64301,
+ 64354, 64406, 64457, 64508, 64558, 64608, 64657, 64706,
+ 64754, 64803, 64851, 64899, 64946, 64994, 65041, 65088,
+ 65135, 65181, 65227, 65272, 65317, 65361, 65405, 65449,
+ 65492, 65535
+};
+
+const SKP_int SKP_Silk_pitch_lag_NB_CDF_offset = 43;
+
+const SKP_uint16 SKP_Silk_pitch_contour_NB_CDF[ 12 ] = {
+ 0, 14445, 18587, 25628, 30013, 34859, 40597, 48426,
+ 54460, 59033, 62990, 65535
+};
+
+const SKP_int SKP_Silk_pitch_contour_NB_CDF_offset = 5;
+
+const SKP_uint16 SKP_Silk_pitch_lag_MB_CDF[ 12 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
+ 0, 132, 266, 402, 542, 686, 838, 997,
+ 1167, 1349, 1546, 1760, 1993, 2248, 2528, 2835,
+ 3173, 3544, 3951, 4397, 4882, 5411, 5984, 6604,
+ 7270, 7984, 8745, 9552, 10405, 11300, 12235, 13206,
+ 14209, 15239, 16289, 17355, 18430, 19507, 20579, 21642,
+ 22688, 23712, 24710, 25677, 26610, 27507, 28366, 29188,
+ 29971, 30717, 31427, 32104, 32751, 33370, 33964, 34537,
+ 35091, 35630, 36157, 36675, 37186, 37692, 38195, 38697,
+ 39199, 39701, 40206, 40713, 41222, 41733, 42247, 42761,
+ 43277, 43793, 44309, 44824, 45336, 45845, 46351, 46851,
+ 47347, 47836, 48319, 48795, 49264, 49724, 50177, 50621,
+ 51057, 51484, 51902, 52312, 52714, 53106, 53490, 53866,
+ 54233, 54592, 54942, 55284, 55618, 55944, 56261, 56571,
+ 56873, 57167, 57453, 57731, 58001, 58263, 58516, 58762,
+ 58998, 59226, 59446, 59656, 59857, 60050, 60233, 60408,
+ 60574, 60732, 60882, 61024, 61159, 61288, 61410, 61526,
+ 61636, 61742, 61843, 61940, 62033, 62123, 62210, 62293,
+ 62374, 62452, 62528, 62602, 62674, 62744, 62812, 62879,
+ 62945, 63009, 63072, 63135, 63196, 63256, 63316, 63375,
+ 63434, 63491, 63549, 63605, 63661, 63717, 63772, 63827,
+ 63881, 63935, 63988, 64041, 64094, 64147, 64199, 64252,
+ 64304, 64356, 64409, 64461, 64513, 64565, 64617, 64669,
+ 64721, 64773, 64824, 64875, 64925, 64975, 65024, 65072,
+ 65121, 65168, 65215, 65262, 65308, 65354, 65399, 65445,
+ 65490, 65535
+};
+
+const SKP_int SKP_Silk_pitch_lag_MB_CDF_offset = 64;
+
+const SKP_uint16 SKP_Silk_pitch_lag_WB_CDF[ 16 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
+ 0, 106, 213, 321, 429, 539, 651, 766,
+ 884, 1005, 1132, 1264, 1403, 1549, 1705, 1870,
+ 2047, 2236, 2439, 2658, 2893, 3147, 3420, 3714,
+ 4030, 4370, 4736, 5127, 5546, 5993, 6470, 6978,
+ 7516, 8086, 8687, 9320, 9985, 10680, 11405, 12158,
+ 12938, 13744, 14572, 15420, 16286, 17166, 18057, 18955,
+ 19857, 20759, 21657, 22547, 23427, 24293, 25141, 25969,
+ 26774, 27555, 28310, 29037, 29736, 30406, 31048, 31662,
+ 32248, 32808, 33343, 33855, 34345, 34815, 35268, 35704,
+ 36127, 36537, 36938, 37330, 37715, 38095, 38471, 38844,
+ 39216, 39588, 39959, 40332, 40707, 41084, 41463, 41844,
+ 42229, 42615, 43005, 43397, 43791, 44186, 44583, 44982,
+ 45381, 45780, 46179, 46578, 46975, 47371, 47765, 48156,
+ 48545, 48930, 49312, 49690, 50064, 50433, 50798, 51158,
+ 51513, 51862, 52206, 52544, 52877, 53204, 53526, 53842,
+ 54152, 54457, 54756, 55050, 55338, 55621, 55898, 56170,
+ 56436, 56697, 56953, 57204, 57449, 57689, 57924, 58154,
+ 58378, 58598, 58812, 59022, 59226, 59426, 59620, 59810,
+ 59994, 60173, 60348, 60517, 60681, 60840, 60993, 61141,
+ 61284, 61421, 61553, 61679, 61800, 61916, 62026, 62131,
+ 62231, 62326, 62417, 62503, 62585, 62663, 62737, 62807,
+ 62874, 62938, 62999, 63057, 63113, 63166, 63217, 63266,
+ 63314, 63359, 63404, 63446, 63488, 63528, 63567, 63605,
+ 63642, 63678, 63713, 63748, 63781, 63815, 63847, 63879,
+ 63911, 63942, 63973, 64003, 64033, 64063, 64092, 64121,
+ 64150, 64179, 64207, 64235, 64263, 64291, 64319, 64347,
+ 64374, 64401, 64428, 64455, 64481, 64508, 64534, 64560,
+ 64585, 64610, 64635, 64660, 64685, 64710, 64734, 64758,
+ 64782, 64807, 64831, 64855, 64878, 64902, 64926, 64950,
+ 64974, 64998, 65022, 65045, 65069, 65093, 65116, 65139,
+ 65163, 65186, 65209, 65231, 65254, 65276, 65299, 65321,
+ 65343, 65364, 65386, 65408, 65429, 65450, 65471, 65493,
+ 65514, 65535
+};
+
+const SKP_int SKP_Silk_pitch_lag_WB_CDF_offset = 86;
+
+
+const SKP_uint16 SKP_Silk_pitch_lag_SWB_CDF[ 24 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = {
+ 0, 253, 505, 757, 1008, 1258, 1507, 1755,
+ 2003, 2249, 2494, 2738, 2982, 3225, 3469, 3713,
+ 3957, 4202, 4449, 4698, 4949, 5203, 5460, 5720,
+ 5983, 6251, 6522, 6798, 7077, 7361, 7650, 7942,
+ 8238, 8539, 8843, 9150, 9461, 9775, 10092, 10411,
+ 10733, 11057, 11383, 11710, 12039, 12370, 12701, 13034,
+ 13368, 13703, 14040, 14377, 14716, 15056, 15398, 15742,
+ 16087, 16435, 16785, 17137, 17492, 17850, 18212, 18577,
+ 18946, 19318, 19695, 20075, 20460, 20849, 21243, 21640,
+ 22041, 22447, 22856, 23269, 23684, 24103, 24524, 24947,
+ 25372, 25798, 26225, 26652, 27079, 27504, 27929, 28352,
+ 28773, 29191, 29606, 30018, 30427, 30831, 31231, 31627,
+ 32018, 32404, 32786, 33163, 33535, 33902, 34264, 34621,
+ 34973, 35320, 35663, 36000, 36333, 36662, 36985, 37304,
+ 37619, 37929, 38234, 38535, 38831, 39122, 39409, 39692,
+ 39970, 40244, 40513, 40778, 41039, 41295, 41548, 41796,
+ 42041, 42282, 42520, 42754, 42985, 43213, 43438, 43660,
+ 43880, 44097, 44312, 44525, 44736, 44945, 45153, 45359,
+ 45565, 45769, 45972, 46175, 46377, 46578, 46780, 46981,
+ 47182, 47383, 47585, 47787, 47989, 48192, 48395, 48599,
+ 48804, 49009, 49215, 49422, 49630, 49839, 50049, 50259,
+ 50470, 50682, 50894, 51107, 51320, 51533, 51747, 51961,
+ 52175, 52388, 52601, 52813, 53025, 53236, 53446, 53655,
+ 53863, 54069, 54274, 54477, 54679, 54879, 55078, 55274,
+ 55469, 55662, 55853, 56042, 56230, 56415, 56598, 56779,
+ 56959, 57136, 57311, 57484, 57654, 57823, 57989, 58152,
+ 58314, 58473, 58629, 58783, 58935, 59084, 59230, 59373,
+ 59514, 59652, 59787, 59919, 60048, 60174, 60297, 60417,
+ 60533, 60647, 60757, 60865, 60969, 61070, 61167, 61262,
+ 61353, 61442, 61527, 61609, 61689, 61765, 61839, 61910,
+ 61979, 62045, 62109, 62170, 62230, 62287, 62343, 62396,
+ 62448, 62498, 62547, 62594, 62640, 62685, 62728, 62770,
+ 62811, 62852, 62891, 62929, 62967, 63004, 63040, 63075,
+ 63110, 63145, 63178, 63212, 63244, 63277, 63308, 63340,
+ 63371, 63402, 63432, 63462, 63491, 63521, 63550, 63578,
+ 63607, 63635, 63663, 63690, 63718, 63744, 63771, 63798,
+ 63824, 63850, 63875, 63900, 63925, 63950, 63975, 63999,
+ 64023, 64046, 64069, 64092, 64115, 64138, 64160, 64182,
+ 64204, 64225, 64247, 64268, 64289, 64310, 64330, 64351,
+ 64371, 64391, 64411, 64431, 64450, 64470, 64489, 64508,
+ 64527, 64545, 64564, 64582, 64600, 64617, 64635, 64652,
+ 64669, 64686, 64702, 64719, 64735, 64750, 64766, 64782,
+ 64797, 64812, 64827, 64842, 64857, 64872, 64886, 64901,
+ 64915, 64930, 64944, 64959, 64974, 64988, 65003, 65018,
+ 65033, 65048, 65063, 65078, 65094, 65109, 65125, 65141,
+ 65157, 65172, 65188, 65204, 65220, 65236, 65252, 65268,
+ 65283, 65299, 65314, 65330, 65345, 65360, 65375, 65390,
+ 65405, 65419, 65434, 65449, 65463, 65477, 65492, 65506,
+ 65521, 65535
+};
+
+const SKP_int SKP_Silk_pitch_lag_SWB_CDF_offset = 128;
+
+
+const SKP_uint16 SKP_Silk_pitch_contour_CDF[ 35 ] = {
+ 0, 372, 843, 1315, 1836, 2644, 3576, 4719,
+ 6088, 7621, 9396, 11509, 14245, 17618, 20777, 24294,
+ 27992, 33116, 40100, 44329, 47558, 50679, 53130, 55557,
+ 57510, 59022, 60285, 61345, 62316, 63140, 63762, 64321,
+ 64729, 65099, 65535
+};
+
+const SKP_int SKP_Silk_pitch_contour_CDF_offset = 17;
+
+const SKP_uint16 SKP_Silk_pitch_delta_CDF[23] = {
+ 0, 343, 740, 1249, 1889, 2733, 3861, 5396,
+ 7552, 10890, 16053, 24152, 30220, 34680, 37973, 40405,
+ 42243, 43708, 44823, 45773, 46462, 47055, 65535
+};
+
+const SKP_int SKP_Silk_pitch_delta_CDF_offset = 11;
--- /dev/null
+++ b/src_common/SKP_Silk_tables_pulses_per_block.c
@@ -1,0 +1,235 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_tables.h"
+
+const SKP_int SKP_Silk_max_pulses_table[ 4 ] = {
+ 6, 8, 12, 18
+};
+
+const SKP_uint16 SKP_Silk_pulses_per_block_CDF[ 10 ][ 21 ] =
+{
+{
+ 0, 47113, 61501, 64590, 65125, 65277, 65352, 65407,
+ 65450, 65474, 65488, 65501, 65508, 65514, 65516, 65520,
+ 65521, 65523, 65524, 65526, 65535
+},
+{
+ 0, 26368, 47760, 58803, 63085, 64567, 65113, 65333,
+ 65424, 65474, 65498, 65511, 65517, 65520, 65523, 65525,
+ 65526, 65528, 65529, 65530, 65535
+},
+{
+ 0, 9601, 28014, 45877, 57210, 62560, 64611, 65260,
+ 65447, 65500, 65511, 65519, 65521, 65525, 65526, 65529,
+ 65530, 65531, 65532, 65534, 65535
+},
+{
+ 0, 3351, 12462, 25972, 39782, 50686, 57644, 61525,
+ 63521, 64506, 65009, 65255, 65375, 65441, 65471, 65488,
+ 65497, 65505, 65509, 65512, 65535
+},
+{
+ 0, 488, 2944, 9295, 19712, 32160, 43976, 53121,
+ 59144, 62518, 64213, 65016, 65346, 65470, 65511, 65515,
+ 65525, 65529, 65531, 65534, 65535
+},
+{
+ 0, 17013, 30405, 40812, 48142, 53466, 57166, 59845,
+ 61650, 62873, 63684, 64223, 64575, 64811, 64959, 65051,
+ 65111, 65143, 65165, 65183, 65535
+},
+{
+ 0, 2994, 8323, 15845, 24196, 32300, 39340, 45140,
+ 49813, 53474, 56349, 58518, 60167, 61397, 62313, 62969,
+ 63410, 63715, 63906, 64056, 65535
+},
+{
+ 0, 88, 721, 2795, 7542, 14888, 24420, 34593,
+ 43912, 51484, 56962, 60558, 62760, 64037, 64716, 65069,
+ 65262, 65358, 65398, 65420, 65535
+},
+{
+ 0, 287, 789, 2064, 4398, 8174, 13534, 20151,
+ 27347, 34533, 41295, 47242, 52070, 55772, 58458, 60381,
+ 61679, 62533, 63109, 63519, 65535
+},
+{
+ 0, 1, 3, 91, 4521, 14708, 28329, 41955,
+ 52116, 58375, 61729, 63534, 64459, 64924, 65092, 65164,
+ 65182, 65198, 65203, 65211, 65535
+}
+};
+
+const SKP_int SKP_Silk_pulses_per_block_CDF_offset = 6;
+
+
+const SKP_int16 SKP_Silk_pulses_per_block_BITS_Q6[ 9 ][ 20 ] =
+{
+{
+ 30, 140, 282, 444, 560, 625, 654, 677,
+ 731, 780, 787, 844, 859, 960, 896, 1024,
+ 960, 1024, 960, 821
+},
+{
+ 84, 103, 164, 252, 350, 442, 526, 607,
+ 663, 731, 787, 859, 923, 923, 960, 1024,
+ 960, 1024, 1024, 875
+},
+{
+ 177, 117, 120, 162, 231, 320, 426, 541,
+ 657, 803, 832, 960, 896, 1024, 923, 1024,
+ 1024, 1024, 960, 1024
+},
+{
+ 275, 182, 146, 144, 166, 207, 261, 322,
+ 388, 450, 516, 582, 637, 710, 762, 821,
+ 832, 896, 923, 734
+},
+{
+ 452, 303, 216, 170, 153, 158, 182, 220,
+ 274, 337, 406, 489, 579, 681, 896, 811,
+ 896, 960, 923, 1024
+},
+{
+ 125, 147, 170, 202, 232, 265, 295, 332,
+ 368, 406, 443, 483, 520, 563, 606, 646,
+ 704, 739, 757, 483
+},
+{
+ 285, 232, 200, 190, 193, 206, 224, 244,
+ 266, 289, 315, 340, 367, 394, 425, 462,
+ 496, 539, 561, 350
+},
+{
+ 611, 428, 319, 242, 202, 178, 172, 180,
+ 199, 229, 268, 313, 364, 422, 482, 538,
+ 603, 683, 739, 586
+},
+{
+ 501, 450, 364, 308, 264, 231, 212, 204,
+ 204, 210, 222, 241, 265, 295, 326, 362,
+ 401, 437, 469, 321
+}
+};
+
+const SKP_uint16 SKP_Silk_rate_levels_CDF[ 2 ][ 10 ] =
+{
+{
+ 0, 2005, 12717, 20281, 31328, 36234, 45816, 57753,
+ 63104, 65535
+},
+{
+ 0, 8553, 23489, 36031, 46295, 53519, 56519, 59151,
+ 64185, 65535
+}
+};
+
+const SKP_int SKP_Silk_rate_levels_CDF_offset = 4;
+
+
+const SKP_int16 SKP_Silk_rate_levels_BITS_Q6[ 2 ][ 9 ] =
+{
+{
+ 322, 167, 199, 164, 239, 178, 157, 231,
+ 304
+},
+{
+ 188, 137, 153, 171, 204, 285, 297, 237,
+ 358
+}
+};
+
+const SKP_uint16 SKP_Silk_shell_code_table0[ 33 ] = {
+ 0, 32748, 65535, 0, 9505, 56230, 65535, 0,
+ 4093, 32204, 61720, 65535, 0, 2285, 16207, 48750,
+ 63424, 65535, 0, 1709, 9446, 32026, 55752, 63876,
+ 65535, 0, 1623, 6986, 21845, 45381, 59147, 64186,
+ 65535
+};
+
+const SKP_uint16 SKP_Silk_shell_code_table1[ 52 ] = {
+ 0, 32691, 65535, 0, 12782, 52752, 65535, 0,
+ 4847, 32665, 60899, 65535, 0, 2500, 17305, 47989,
+ 63369, 65535, 0, 1843, 10329, 32419, 55433, 64277,
+ 65535, 0, 1485, 7062, 21465, 43414, 59079, 64623,
+ 65535, 0, 0, 4841, 14797, 31799, 49667, 61309,
+ 65535, 65535, 0, 0, 0, 8032, 21695, 41078,
+ 56317, 65535, 65535, 65535
+};
+
+const SKP_uint16 SKP_Silk_shell_code_table2[ 102 ] = {
+ 0, 32615, 65535, 0, 14447, 50912, 65535, 0,
+ 6301, 32587, 59361, 65535, 0, 3038, 18640, 46809,
+ 62852, 65535, 0, 1746, 10524, 32509, 55273, 64278,
+ 65535, 0, 1234, 6360, 21259, 43712, 59651, 64805,
+ 65535, 0, 1020, 4461, 14030, 32286, 51249, 61904,
+ 65100, 65535, 0, 851, 3435, 10006, 23241, 40797,
+ 55444, 63009, 65252, 65535, 0, 0, 2075, 7137,
+ 17119, 31499, 46982, 58723, 63976, 65535, 65535, 0,
+ 0, 0, 3820, 11572, 23038, 37789, 51969, 61243,
+ 65535, 65535, 65535, 0, 0, 0, 0, 6882,
+ 16828, 30444, 44844, 57365, 65535, 65535, 65535, 65535,
+ 0, 0, 0, 0, 0, 10093, 22963, 38779,
+ 54426, 65535, 65535, 65535, 65535, 65535
+};
+
+const SKP_uint16 SKP_Silk_shell_code_table3[ 207 ] = {
+ 0, 32324, 65535, 0, 15328, 49505, 65535, 0,
+ 7474, 32344, 57955, 65535, 0, 3944, 19450, 45364,
+ 61873, 65535, 0, 2338, 11698, 32435, 53915, 63734,
+ 65535, 0, 1506, 7074, 21778, 42972, 58861, 64590,
+ 65535, 0, 1027, 4490, 14383, 32264, 50980, 61712,
+ 65043, 65535, 0, 760, 3022, 9696, 23264, 41465,
+ 56181, 63253, 65251, 65535, 0, 579, 2256, 6873,
+ 16661, 31951, 48250, 59403, 64198, 65360, 65535, 0,
+ 464, 1783, 5181, 12269, 24247, 39877, 53490, 61502,
+ 64591, 65410, 65535, 0, 366, 1332, 3880, 9273,
+ 18585, 32014, 45928, 56659, 62616, 64899, 65483, 65535,
+ 0, 286, 1065, 3089, 6969, 14148, 24859, 38274,
+ 50715, 59078, 63448, 65091, 65481, 65535, 0, 0,
+ 482, 2010, 5302, 10408, 18988, 30698, 43634, 54233,
+ 60828, 64119, 65288, 65535, 65535, 0, 0, 0,
+ 1006, 3531, 7857, 14832, 24543, 36272, 47547, 56883,
+ 62327, 64746, 65535, 65535, 65535, 0, 0, 0,
+ 0, 1863, 4950, 10730, 19284, 29397, 41382, 52335,
+ 59755, 63834, 65535, 65535, 65535, 65535, 0, 0,
+ 0, 0, 0, 2513, 7290, 14487, 24275, 35312,
+ 46240, 55841, 62007, 65535, 65535, 65535, 65535, 65535,
+ 0, 0, 0, 0, 0, 0, 3606, 9573,
+ 18764, 28667, 40220, 51290, 59924, 65535, 65535, 65535,
+ 65535, 65535, 65535, 0, 0, 0, 0, 0,
+ 0, 0, 4879, 13091, 23376, 36061, 49395, 59315,
+ 65535, 65535, 65535, 65535, 65535, 65535, 65535
+};
+
+const SKP_uint16 SKP_Silk_shell_code_table_offsets[ 19 ] = {
+ 0, 0, 3, 7, 12, 18, 25, 33,
+ 42, 52, 63, 75, 88, 102, 117, 133,
+ 150, 168, 187
+};
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_sign.c
@@ -1,0 +1,42 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_tables.h"
+
+const SKP_uint16 SKP_Silk_sign_CDF[ 36 ] =
+{
+ 37840, 36944, 36251, 35304,
+ 34715, 35503, 34529, 34296,
+ 34016, 47659, 44945, 42503,
+ 40235, 38569, 40254, 37851,
+ 37243, 36595, 43410, 44121,
+ 43127, 40978, 38845, 40433,
+ 38252, 37795, 36637, 59159,
+ 55630, 51806, 48073, 45036,
+ 48416, 43857, 42678, 41146,
+};
+
--- /dev/null
+++ b/src_common/SKP_Silk_tables_type_offset.c
@@ -1,0 +1,52 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+#include "SKP_Silk_tables.h"
+
+const SKP_uint16 SKP_Silk_type_offset_CDF[ 5 ] = {
+ 0, 37522, 41030, 44212, 65535
+};
+
+const SKP_int SKP_Silk_type_offset_CDF_offset = 2;
+
+
+const SKP_uint16 SKP_Silk_type_offset_joint_CDF[ 4 ][ 5 ] =
+{
+{
+ 0, 57686, 61230, 62358, 65535
+},
+{
+ 0, 18346, 40067, 43659, 65535
+},
+{
+ 0, 22694, 24279, 35507, 65535
+},
+{
+ 0, 6067, 7215, 13010, 65535
+}
+};
+
--- /dev/null
+++ b/src_common/Silk_Common.vcproj
@@ -1,0 +1,360 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="Silk_Common"
+ ProjectGUID="{0E29E502-AB22-4147-93A1-AC91528ED758}"
+ RootNamespace="Silk"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories=""../../../celt-0.7.1/libcelt";../interface;../src_SigProc_FIX;../src_FIX"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;FIXED_POINT;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_Common_Win32_debug.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories=""../../../celt-0.7.1/libcelt";../interface;../src_SigProc_FIX;../src_FIX"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FIXED_POINT;HAVE_CONFIG_H"
+ GeneratePreprocessedFile="0"
+ RuntimeLibrary="0"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_Common_Win32_mt.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_CNG.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_code_signs.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_create_init_destroy.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_dec_SDK_API.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_core.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_frame.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_indices_v4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_parameters_v4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_pulses.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decoder_set_fs.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_detect_SWB_input.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_enc_API.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_encode_parameters_v4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_encode_pulses.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_gain_quant.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_interpolate.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LBRR_reset.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LP_variable_cutoff.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF2A_stable.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_MSVQ_decode.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NSQ.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NSQ_del_dec.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_PLC.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_pulses_to_bytes.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_range_coder.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_shell_coder.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_gain.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_LTP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_10.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_16.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_10.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_16.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_other.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_pitch_lag.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_pulses_per_block.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_sign.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_type_offset.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_VAD.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_define.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_main.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_PLC.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_structs.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_10.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_16.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_10.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_16.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null
+++ b/src_common/Silk_CommonFLP.vcproj
@@ -1,0 +1,364 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="Silk_Common"
+ ProjectGUID="{0E29E502-AB22-4147-93A1-AC91528ED758}"
+ RootNamespace="Silk"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../../../celt-0.8.0/libcelt;../interface;../src_SigProc_FIX;../src_SigProc_FLP;../src_FLP"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_CommonFLP_Win32_debug.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories="../../../celt-0.8.0/libcelt;../interface;../src_SigProc_FIX;../src_SigProc_FLP;../src_FLP"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;HAVE_CONFIG_H"
+ GeneratePreprocessedFile="0"
+ RuntimeLibrary="0"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="SKP_Silk_CommonFLP_Win32_mt.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_CNG.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_code_signs.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_create_init_destroy.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_dec_SDK_API.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_core.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_frame.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_indices_v4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_parameters_v4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decode_pulses.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_decoder_set_fs.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_detect_SWB_input.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_enc_API.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_encode_parameters_v4.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_encode_pulses.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_gain_quant.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_interpolate.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LBRR_reset.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_LP_variable_cutoff.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF2A_stable.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NLSF_MSVQ_decode.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NSQ.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_NSQ_del_dec.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_PLC.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_pulses_to_bytes.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_range_coder.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_shell_coder.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_gain.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_LTP.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_10.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_16.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_10.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_16.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_other.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_pitch_lag.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_pulses_per_block.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_sign.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_type_offset.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_VAD.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\SKP_Silk_define.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_main.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_perceptual_parameters.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_PLC.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_structs.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_10.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB0_16.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_10.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_Silk_tables_NLSF_CB1_16.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- a/test/Dec_SDK.vcproj
+++ b/test/Dec_SDK.vcproj
@@ -2,7 +2,7 @@
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
- Name="Dec_SDK"
+ Name="Dec"
ProjectGUID="{82685D7F-0589-42BD-877C-31A952D53A8E}"
RootNamespace="Test"
Keyword="Win32Proj"
@@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="../interface;../src"
+ AdditionalIncludeDirectories="../interface;../src_SigProc_FIX"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;COMPILE_SDK"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -121,7 +121,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../interface;../src"
+ AdditionalIncludeDirectories="../interface;../src_SigProc_FIX"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;COMPILE_SDK"
RuntimeLibrary="0"
FloatingPointModel="2"
@@ -188,6 +188,10 @@
>
<File
RelativePath=".\Decoder.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_debug.c"
>
</File>
</Filter>
--- /dev/null
+++ b/test/Dec_SDK.vcproj.SKYPE-KOEN.koen.user
@@ -1,0 +1,65 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioUserFile
+ ProjectType="Visual C++"
+ Version="8.00"
+ ShowAllFiles="false"
+ >
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ >
+ <DebugSettings
+ Command="$(TargetPath)"
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="SKYPE-KOEN"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment=""
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ >
+ <DebugSettings
+ Command="$(TargetPath)"
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="SKYPE-KOEN"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment=""
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ </Configurations>
+</VisualStudioUserFile>
--- a/test/Decoder.c
+++ b/test/Decoder.c
@@ -25,6 +25,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
***********************************************************************/
+
/*****************************/
/* Silk decoder test program */
/*****************************/
@@ -38,42 +39,74 @@
#include <string.h>
#include "SKP_Silk_SDK_API.h"
#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_debug.h"
/* Define codec specific settings should be moved to h file */
#define MAX_BYTES_PER_FRAME 1024
#define MAX_INPUT_FRAMES 5
#define MAX_FRAME_LENGTH 480
+#define MAX_FRAME_LENGTH_MS 20
+#define MAX_API_FS_KHZ 48
#define MAX_LBRR_DELAY 2
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+/* Function to convert a little endian int16 to a */
+/* big endian int16 or vica verca */
+void swap_endian(
+ SKP_int16 vec[],
+ SKP_int len
+)
+{
+ SKP_int i;
+ SKP_int16 tmp;
+ SKP_uint8 *p1, *p2;
+
+ for( i = 0; i < len; i++ ){
+ tmp = vec[ i ];
+ p1 = (SKP_uint8 *)&vec[ i ]; p2 = (SKP_uint8 *)&tmp;
+ p1[ 0 ] = p2[ 1 ]; p1[ 1 ] = p2[ 0 ];
+ }
+}
+#endif
+
static void print_usage(char* argv[]) {
printf( "\nusage: %s in.bit out.pcm [settings]\n", argv[ 0 ] );
- printf( "\nin.bit : Bitstream input to decoder" );
- printf( "\nout.pcm : Speech output from decoder" );
+ printf( "\nin.bit : Bitstream input to decoder" );
+ printf( "\nout.pcm : Speech output from decoder" );
printf( "\n settings:" );
- printf( "\n-fs <kHz> : Sampling rate of output signal in kHz; default: 24" );
- printf( "\n-loss <perc> : Simulated packet loss percentage (0-100); default: 0" );
+ printf( "\n-Fs_API <Hz> : Sampling rate of output signal in Hz; default: 24000" );
+ printf( "\n-loss <perc> : Simulated packet loss percentage (0-100); default: 0" );
printf( "\n" );
}
+#ifdef SKP_MACRO_COUNT
+ varDefine /* Define and reset global counters */
+#endif
+
int main( int argc, char* argv[] )
{
+ unsigned long tottime, starttime;
+ double filetime;
size_t counter;
- SKP_int args, totPackets, i, k;
+ SKP_int32 args, totPackets, i, k;
SKP_int16 ret, len, tot_len;
SKP_int16 nBytes;
SKP_uint8 payload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES * ( MAX_LBRR_DELAY + 1 ) ];
- SKP_uint8 FECpayload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ], *payloadPtr;
SKP_uint8 *payloadEnd = NULL, *payloadToDec = NULL;
+ SKP_uint8 FECpayload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ], *payloadPtr;
SKP_int16 nBytesFEC;
SKP_int16 nBytesPerPacket[ MAX_LBRR_DELAY + 1 ], totBytes;
- SKP_int16 out[ ( MAX_FRAME_LENGTH << 1 ) * MAX_INPUT_FRAMES ], *outPtr;
+ SKP_int16 out[ ( ( MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ ) << 1 ) * MAX_INPUT_FRAMES ], *outPtr;
char speechOutFileName[ 150 ], bitInFileName[ 150 ];
FILE *bitInFile, *speechOutFile;
- SKP_int Fs_kHz = 0;
+ SKP_int32 API_Fs_Hz = 0, packetSize_ms=0;
SKP_int32 decSizeBytes;
void *psDec;
+#ifdef SKP_MACRO_COUNT
+ SKP_int64 Ops, maxOps = 0, totOps = 0;
+#endif
float loss_prob;
- SKP_int frames, lost, quiet;
+ SKP_int32 frames, lost, quiet;
SKP_SILK_SDK_DecControlStruct DecControl;
if( argc < 3 ) {
@@ -95,8 +128,8 @@
if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-loss" ) == 0 ) {
sscanf( argv[ args + 1 ], "%f", &loss_prob );
args += 2;
- } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-fs" ) == 0 ) {
- sscanf( argv[ args + 1 ], "%d", &Fs_kHz );
+ } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_API" ) == 0 ) {
+ sscanf( argv[ args + 1 ], "%d", &API_Fs_Hz );
args += 2;
} else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-quiet" ) == 0 ) {
quiet = 1;
@@ -127,11 +160,11 @@
exit( 0 );
}
- /* Set the samplingrate that is requested for the output */
- if( Fs_kHz == 0 ) {
- DecControl.sampleRate = 24000;
+ /* Set the samplingrate that is requested for the output */
+ if( API_Fs_Hz == 0 ) {
+ DecControl.API_sampleRate = 24000;
} else {
- DecControl.sampleRate = Fs_kHz * 1000;
+ DecControl.API_sampleRate = API_Fs_Hz;
}
/* Create decoder */
@@ -147,6 +180,7 @@
printf( "\nSKP_Silk_InitDecoder returned %d", ret );
}
+ tottime = 0;
totPackets = 0;
payloadEnd = payload;
@@ -154,10 +188,13 @@
for( i = 0; i < MAX_LBRR_DELAY; i++ ) {
/* Read payload size */
counter = fread( &nBytes, sizeof( SKP_int16 ), 1, bitInFile );
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+ swap_endian( &nBytes, 1 );
+#endif
/* Read payload */
counter = fread( payloadEnd, sizeof( SKP_uint8 ), nBytes, bitInFile );
- if( (SKP_int16)counter < nBytes ) {
+ if( ( SKP_int16 )counter < nBytes ) {
break;
}
nBytesPerPacket[ i ] = nBytes;
@@ -167,6 +204,9 @@
while( 1 ) {
/* Read payload size */
counter = fread( &nBytes, sizeof( SKP_int16 ), 1, bitInFile );
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+ swap_endian( &nBytes, 1 );
+#endif
if( nBytes < 0 || counter < 1 ) {
break;
}
@@ -173,7 +213,7 @@
/* Read payload */
counter = fread( payloadEnd, sizeof( SKP_uint8 ), nBytes, bitInFile );
- if( (SKP_int16)counter < nBytes ) {
+ if( ( SKP_int16 )counter < nBytes ) {
break;
}
@@ -193,7 +233,9 @@
payloadPtr = payload;
for( i = 0; i < MAX_LBRR_DELAY; i++ ) {
if( nBytesPerPacket[ i + 1 ] > 0 ) {
- SKP_Silk_SDK_search_for_LBRR( psDec, payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );
+ starttime = GetHighResolutionTime();
+ SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );
+ tottime += GetHighResolutionTime() - starttime;
if( nBytesFEC > 0 ) {
payloadToDec = FECpayload;
nBytes = nBytesFEC;
@@ -218,11 +260,17 @@
frames = 0;
do {
/* Decode 20 ms */
+ starttime = GetHighResolutionTime();
ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 0, payloadToDec, nBytes, outPtr, &len );
+ tottime += GetHighResolutionTime() - starttime;
if( ret ) {
printf( "\nSKP_Silk_SDK_Decode returned %d", ret );
}
-
+#ifdef SKP_MACRO_COUNT
+ Ops = SKP_SaveResetCount();
+ if( Ops > maxOps ){ maxOps = Ops; }
+ totOps += Ops;
+#endif
frames++;
outPtr += len;
tot_len += len;
@@ -238,17 +286,28 @@
/* Loss: Decode enough frames to cover one packet duration */
for( i = 0; i < DecControl.framesPerPacket; i++ ) {
/* Generate 20 ms */
+ starttime = GetHighResolutionTime();
ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, payloadToDec, nBytes, outPtr, &len );
+ tottime += GetHighResolutionTime() - starttime;
if( ret ) {
printf( "\nSKP_Silk_Decode returned %d", ret );
}
+#ifdef SKP_MACRO_COUNT
+ Ops = SKP_SaveResetCount();
+ if( Ops > maxOps ){ maxOps = Ops; }
+ totOps += Ops;
+#endif
outPtr += len;
tot_len += len;
}
}
totPackets++;
+ packetSize_ms = tot_len / ( DecControl.API_sampleRate / 1000 );
/* Write output to file */
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+ swap_endian( out, tot_len );
+#endif
fwrite( out, sizeof( SKP_int16 ), tot_len, speechOutFile );
/* Update buffer */
@@ -261,7 +320,7 @@
SKP_memmove( nBytesPerPacket, &nBytesPerPacket[ 1 ], MAX_LBRR_DELAY * sizeof( SKP_int16 ) );
if( !quiet ) {
- fprintf( stderr, "\rFrames decoded: %d", totPackets );
+ fprintf( stderr, "\rPackets decoded: %d", totPackets );
}
}
@@ -275,7 +334,9 @@
payloadPtr = payload;
for( i = 0; i < MAX_LBRR_DELAY; i++ ) {
if( nBytesPerPacket[ i + 1 ] > 0 ) {
- SKP_Silk_SDK_search_for_LBRR( psDec, payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );
+ starttime = GetHighResolutionTime();
+ SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );
+ tottime += GetHighResolutionTime() - starttime;
if( nBytesFEC > 0 ) {
payloadToDec = FECpayload;
nBytes = nBytesFEC;
@@ -300,7 +361,9 @@
frames = 0;
do {
/* Decode 20 ms */
+ starttime = GetHighResolutionTime();
ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 0, payloadToDec, nBytes, outPtr, &len );
+ tottime += GetHighResolutionTime() - starttime;
if( ret ) {
printf( "\nSKP_Silk_SDK_Decode returned %d", ret );
}
@@ -321,7 +384,9 @@
/* Generate 20 ms */
for( i = 0; i < DecControl.framesPerPacket; i++ ) {
+ starttime = GetHighResolutionTime();
ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, payloadToDec, nBytes, outPtr, &len );
+ tottime += GetHighResolutionTime() - starttime;
if( ret ) {
printf( "\nSKP_Silk_Decode returned %d", ret );
}
@@ -332,6 +397,9 @@
totPackets++;
/* Write output to file */
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+ swap_endian( out, tot_len );
+#endif
fwrite( out, sizeof( SKP_int16 ), tot_len, speechOutFile );
/* Update Buffer */
@@ -348,8 +416,27 @@
}
}
+ filetime = totPackets * 1e-3 * packetSize_ms;
if( !quiet ) {
- printf( "\nDecoding Finished \n" );
+ printf("\nFile length: %.3f s", filetime);
+ printf("\nTime for decoding: %.3f s (%.3f%% of realtime)", 1e-6 * tottime, 1e-4 * tottime / filetime);
+
+#ifdef SKP_MACRO_COUNT
+ printf("\n \nWMOPS calculation");
+ printf("\nMean: %.3f WMOPS", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3));
+ printf("\nMax: %.3f WMOPS", (float)maxOps / ((float)packetSize_ms * 1e3));
+#endif
+ printf("\n\n");
+ } else {
+ /* print time and % of realtime */
+ printf( "%.3f %.3f %d ", 1e-6 * tottime, 1e-4 * tottime / filetime, totPackets );
+#ifdef SKP_MACRO_COUNT
+ /* print average and max WMOPS */
+ printf( "%.3f %.3f \n", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3),
+ (float)maxOps / ((float)packetSize_ms * 1e3));
+#else
+ printf( "%.3f %.3f \n", 0, 0);
+#endif
}
/* Free decoder */
@@ -358,6 +445,9 @@
/* Close files */
fclose( speechOutFile );
fclose( bitInFile );
+
+ /* Save timing file if TIC/TOC used */
+ SKP_TimerSave("decoder_timings.txt");
return 0;
}
--- a/test/Enc_SDK.vcproj
+++ b/test/Enc_SDK.vcproj
@@ -2,7 +2,7 @@
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
- Name="Enc_SDK"
+ Name="Enc"
ProjectGUID="{6D97A8EF-5724-4D85-8BF4-C583714BBA78}"
RootNamespace="Enc"
Keyword="Win32Proj"
@@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="../interface"
+ AdditionalIncludeDirectories="../interface;../src_SigProc_FIX"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -121,7 +121,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../interface"
+ AdditionalIncludeDirectories="../interface;../src_SigProc_FIX"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0"
FloatingPointModel="2"
@@ -188,6 +188,10 @@
>
<File
RelativePath=".\Encoder.c"
+ >
+ </File>
+ <File
+ RelativePath=".\SKP_debug.c"
>
</File>
</Filter>
--- /dev/null
+++ b/test/Enc_SDK.vcproj.SKYPE-KOEN.koen.user
@@ -1,0 +1,65 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioUserFile
+ ProjectType="Visual C++"
+ Version="8.00"
+ ShowAllFiles="false"
+ >
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ >
+ <DebugSettings
+ Command="$(TargetPath)"
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="SKYPE-KOEN"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment=""
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ >
+ <DebugSettings
+ Command="$(TargetPath)"
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="SKYPE-KOEN"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment=""
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ </Configurations>
+</VisualStudioUserFile>
--- a/test/Encoder.c
+++ b/test/Encoder.c
@@ -25,6 +25,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
***********************************************************************/
+
/*****************************/
/* Silk encoder test program */
/*****************************/
@@ -38,6 +39,8 @@
#include <string.h>
#include <math.h>
#include "SKP_Silk_SDK_API.h"
+#include "SKP_Silk_SigProc_FIX.h"
+#include "SKP_debug.h"
/* Define codec specific settings */
#define MAX_BYTES_PER_FRAME 250 // Equals peak bitrate of 100 kbps
@@ -44,43 +47,79 @@
#define MAX_INPUT_FRAMES 5
#define MAX_LBRR_DELAY 2
#define MAX_FRAME_LENGTH 480
+#define MAX_FRAME_LENGTH_MS 20
+#define MAX_API_FS_KHZ 48
+#ifdef SKP_MACRO_COUNT
+ varDefine /* Define and reset global counters */
+#endif
+
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+/* Function to convert a little endian int16 to a */
+/* big endian int16 or vica verca */
+void swap_endian(
+ SKP_int16 vec[], /* I/O array of */
+ SKP_int len /* I length */
+)
+{
+ SKP_int i;
+ SKP_int16 tmp;
+ SKP_uint8 *p1, *p2;
+
+ for( i = 0; i < len; i++ ){
+ tmp = vec[ i ];
+ p1 = (SKP_uint8 *)&vec[ i ]; p2 = (SKP_uint8 *)&tmp;
+ p1[ 0 ] = p2[ 1 ]; p1[ 1 ] = p2[ 0 ];
+ }
+}
+#endif
+
static void print_usage( char* argv[] ) {
printf( "\nusage: %s in.pcm out.bit [settings]\n", argv[ 0 ] );
- printf( "\nin.pcm : Speech input to encoder" );
- printf( "\nout.bit : Bitstream output from encoder" );
+ printf( "\nin.pcm : Speech input to encoder" );
+ printf( "\nout.bit : Bitstream output from encoder" );
printf( "\n settings:" );
- printf( "\n-fs <kHz> : Sampling rate in kHz, default: 24" );
- printf( "\n-packetlength <ms> : Packet interval in ms, default: 20" );
- printf( "\n-rate <bps> : Target bitrate; default: 25000" );
- printf( "\n-loss <perc> : Uplink loss estimate, in percent (0-100); default: 0" );
- printf( "\n-inbandFEC <flag> : Enable inband FEC usage (0/1); default: 0" );
- printf( "\n-complexity <comp> : Set complexity, 0: low, 1: medium, 2: high; default: 2" );
- printf( "\n-DTX <flag> : Enable DTX (0/1); default: 0" );
- printf( "\n-quiet : Print only some basic values" );
+ printf( "\n-Fs_API <Hz> : API sampling rate in Hz, default: 24000" );
+ printf( "\n-Fs_maxInternal <Hz> : Maximum internal sampling rate in Hz, default: 24000" );
+ printf( "\n-packetlength <ms> : Packet interval in ms, default: 20" );
+ printf( "\n-rate <bps> : Target bitrate; default: 25000" );
+ printf( "\n-loss <perc> : Uplink loss estimate, in percent (0-100); default: 0" );
+ printf( "\n-inbandFEC <flag> : Enable inband FEC usage (0/1); default: 0" );
+ printf( "\n-complexity <comp> : Set complexity, 0: low, 1: medium, 2: high; default: 2" );
+ printf( "\n-DTX <flag> : Enable DTX (0/1); default: 0" );
+ printf( "\n-quiet : Print only some basic values" );
printf( "\n");
}
int main( int argc, char* argv[] )
{
+ unsigned long tottime, starttime;
+ double filetime;
size_t counter;
- SKP_int k, args, totPackets, totActPackets, ret;
+ SKP_int32 k, args, totPackets, totActPackets, ret;
SKP_int16 nBytes;
- double sumBytes, sumWBytes, sumActBytes, avg_rate, act_rate, wght_rate, nrg;
+ double sumBytes, sumActBytes, avg_rate, act_rate, nrg;
SKP_uint8 payload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ];
- SKP_int16 in[ MAX_FRAME_LENGTH * MAX_INPUT_FRAMES ];
+ SKP_int16 in[ MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ * MAX_INPUT_FRAMES ];
char speechInFileName[ 150 ], bitOutFileName[ 150 ];
FILE *bitOutFile, *speechInFile;
SKP_int32 encSizeBytes;
void *psEnc;
+#ifdef SKP_MACRO_COUNT
+ SKP_int64 Ops, maxOps = 0, totOps = 0;
+#endif
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+ SKP_int16 nBytes_LE;
+#endif
/* default settings */
- SKP_int fs_kHz = 24;
- SKP_int targetRate_bps = 25000;
- SKP_int packetSize_ms = 20;
- SKP_int frameSizeReadFromFile_ms = 20;
- SKP_int packetLoss_perc = 0, complexity_mode = 2, smplsSinceLastPacket;
- SKP_int INBandFec_enabled = 0, DTX_enabled = 0, quiet = 0;
+ SKP_int32 API_fs_Hz = 24000;
+ SKP_int32 max_internal_fs_Hz = 0;
+ SKP_int32 targetRate_bps = 25000;
+ SKP_int32 packetSize_ms = 20;
+ SKP_int32 frameSizeReadFromFile_ms = 10;
+ SKP_int32 packetLoss_perc = 0, complexity_mode = 2, smplsSinceLastPacket;
+ SKP_int32 INBandFEC_enabled = 0, DTX_enabled = 0, quiet = 0;
SKP_SILK_SDK_EncControlStruct encControl; // Struct for input to encoder
if( argc < 3 ) {
@@ -95,9 +134,12 @@
strcpy( bitOutFileName, argv[ args ] );
args++;
while( args < argc ) {
- if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-fs" ) == 0 ) {
- sscanf( argv[ args + 1 ], "%d", &fs_kHz );
+ if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_API" ) == 0 ) {
+ sscanf( argv[ args + 1 ], "%d", &API_fs_Hz );
args += 2;
+ } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_maxInternal" ) == 0 ) {
+ sscanf( argv[ args + 1 ], "%d", &max_internal_fs_Hz );
+ args += 2;
} else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-packetlength" ) == 0 ) {
sscanf( argv[ args + 1 ], "%d", &packetSize_ms );
args += 2;
@@ -111,7 +153,7 @@
sscanf( argv[ args + 1 ], "%d", &complexity_mode );
args += 2;
} else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-inbandFEC" ) == 0 ) {
- sscanf( argv[ args + 1 ], "%d", &INBandFec_enabled );
+ sscanf( argv[ args + 1 ], "%d", &INBandFEC_enabled );
args += 2;
} else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-DTX") == 0 ) {
sscanf( argv[ args + 1 ], "%d", &DTX_enabled );
@@ -126,18 +168,24 @@
}
}
+ /* If no max internal set set to API fs */
+ if( max_internal_fs_Hz == 0 ) {
+ max_internal_fs_Hz = API_fs_Hz;
+ }
+
/* Print options */
if( !quiet ) {
printf("******************* Silk Encoder v %s ****************\n", SKP_Silk_SDK_get_version());
printf("******************* Compiled for %d bit cpu ********* \n", (int)sizeof(void*) * 8 );
- printf( "Input: %s\n", speechInFileName );
- printf( "Output: %s\n", bitOutFileName );
- printf( "Sampling rate: %d kHz\n", fs_kHz);
- printf( "Packet interval: %d ms\n", packetSize_ms);
- printf( "Inband FEC used: %d\n", INBandFec_enabled);
- printf( "DTX used: %d\n", DTX_enabled);
- printf( "Complexity: %d\n", complexity_mode);
- printf( "Target bitrate: %d bps\n", targetRate_bps);
+ printf( "Input: %s\n", speechInFileName );
+ printf( "Output: %s\n", bitOutFileName );
+ printf( "API sampling rate: %d Hz\n", API_fs_Hz );
+ printf( "Maximum internal sampling rate: %d Hz\n", max_internal_fs_Hz );
+ printf( "Packet interval: %d ms\n", packetSize_ms );
+ printf( "Inband FEC used: %d\n", INBandFEC_enabled );
+ printf( "DTX used: %d\n", DTX_enabled );
+ printf( "Complexity: %d\n", complexity_mode );
+ printf( "Target bitrate: %d bps\n", targetRate_bps );
}
/* Open files */
@@ -159,7 +207,7 @@
}
psEnc = malloc( encSizeBytes );
-
+
/* Reset Encoder */
ret = SKP_Silk_SDK_InitEncoder( psEnc, &encControl );
if( ret ) {
@@ -167,30 +215,34 @@
}
/* Set Encoder parameters */
- encControl.sampleRate = fs_kHz * 1000;
- encControl.packetSize = packetSize_ms * fs_kHz;
- encControl.packetLossPercentage = packetLoss_perc;
- encControl.useInBandFEC = INBandFec_enabled;
- encControl.useDTX = DTX_enabled;
- encControl.complexity = complexity_mode;
- encControl.bitRate = targetRate_bps;
+ encControl.API_sampleRate = API_fs_Hz;
+ encControl.maxInternalSampleRate = max_internal_fs_Hz;
+ encControl.packetSize = ( packetSize_ms * API_fs_Hz ) / 1000;
+ encControl.packetLossPercentage = packetLoss_perc;
+ encControl.useInBandFEC = INBandFEC_enabled;
+ encControl.useDTX = DTX_enabled;
+ encControl.complexity = complexity_mode;
+ encControl.bitRate = ( targetRate_bps > 0 ? targetRate_bps : 0 );
- if( fs_kHz > 24 || fs_kHz < 0 ) {
- printf( "\nError: Sampling rate = %d out of range, valid range 8 - 24 \n \n", fs_kHz );
+ if( API_fs_Hz > MAX_API_FS_KHZ * 1000 || API_fs_Hz < 0 ) {
+ printf( "\nError: API sampling rate = %d out of range, valid range 8000 - 48000 \n \n", API_fs_Hz );
exit( 0 );
}
+ tottime = 0;
totPackets = 0;
totActPackets = 0;
smplsSinceLastPacket = 0;
sumBytes = 0.0;
sumActBytes = 0.0;
- sumWBytes = 0.0;
while( 1 ) {
- /* Read input to file */
- counter = fread( in, sizeof( SKP_int16 ), frameSizeReadFromFile_ms * fs_kHz, speechInFile );
- if( (SKP_int)counter < frameSizeReadFromFile_ms * fs_kHz ) {
+ /* Read input from file */
+ counter = fread( in, sizeof( SKP_int16 ), ( frameSizeReadFromFile_ms * API_fs_Hz ) / 1000, speechInFile );
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+ swap_endian( in, counter );
+#endif
+ if( (SKP_int)counter < ( ( frameSizeReadFromFile_ms * API_fs_Hz ) / 1000 ) ) {
break;
}
@@ -197,6 +249,7 @@
/* max payload size */
nBytes = MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES;
+ starttime = GetHighResolutionTime();
/* Silk Encoder */
ret = SKP_Silk_SDK_Encode( psEnc, &encControl, in, (SKP_int16)counter, payload, &nBytes );
if( ret ) {
@@ -203,30 +256,42 @@
printf( "\nSKP_Silk_Encode returned %d", ret );
break;
}
+ tottime += GetHighResolutionTime() - starttime;
+#ifdef SKP_MACRO_COUNT
+ Ops = SKP_SaveResetCount();
+ if( Ops > maxOps ){ maxOps = Ops; }
+ totOps += Ops;
+#endif
+
/* Get packet size */
- packetSize_ms = (SKP_int)( 1000 * encControl.packetSize ) / encControl.sampleRate;
+ packetSize_ms = ( SKP_int )( ( 1000 * ( SKP_int32 )encControl.packetSize ) / encControl.API_sampleRate );
- smplsSinceLastPacket += (SKP_int)counter;
+ smplsSinceLastPacket += ( SKP_int )counter;
- if( ( smplsSinceLastPacket / fs_kHz ) == packetSize_ms ) {
+ if( ( ( 1000 * smplsSinceLastPacket ) / API_fs_Hz ) == packetSize_ms ) {
/* Sends a dummy zero size packet in case of DTX period */
/* to make it work with the decoder test program. */
/* In practice should be handled by RTP sequence numbers */
totPackets++;
- sumBytes += nBytes;
- sumWBytes += pow( (double)nBytes, 10.0 );
+ sumBytes += nBytes;
nrg = 0.0;
- for( k = 0; k < (SKP_int)counter; k++ ) {
+ for( k = 0; k < ( SKP_int )counter; k++ ) {
nrg += in[ k ] * (double)in[ k ];
}
- if( ( nrg / (SKP_int)counter ) > 1e3 ) {
+ if( ( nrg / ( SKP_int )counter ) > 1e3 ) {
sumActBytes += nBytes;
totActPackets++;
}
/* Write payload size */
+#ifdef _SYSTEM_IS_BIG_ENDIAN
+ nBytes_LE = nBytes;
+ swap_endian( &nBytes_LE, 1 );
+ fwrite( &nBytes_LE, sizeof( SKP_int16 ), 1, bitOutFile );
+#else
fwrite( &nBytes, sizeof( SKP_int16 ), 1, bitOutFile );
+#endif
/* Write payload */
fwrite( payload, sizeof( SKP_uint8 ), nBytes, bitOutFile );
@@ -244,9 +309,6 @@
/* Write payload size */
fwrite( &nBytes, sizeof( SKP_int16 ), 1, bitOutFile );
- /* Query encoder */
- packetSize_ms = (SKP_int)( 1000 * encControl.packetSize ) / encControl.sampleRate;
-
/* Free Encoder */
free( psEnc );
@@ -253,17 +315,37 @@
fclose( speechInFile );
fclose( bitOutFile );
+ filetime = totPackets * 1e-3 * packetSize_ms;
avg_rate = 8.0 / packetSize_ms * sumBytes / totPackets;
act_rate = 8.0 / packetSize_ms * sumActBytes / totActPackets;
- wght_rate = 8.0 / packetSize_ms * pow( sumWBytes / totPackets, 0.1 );
if( !quiet ) {
+ printf( "\nFile length: %.3f s", filetime );
+ printf( "\nTime for encoding: %.3f s (%.3f%% of realtime)", 1e-6 * tottime, 1e-4 * tottime / filetime );
printf( "\nAverage bitrate: %.3f kbps", avg_rate );
printf( "\nActive bitrate: %.3f kbps", act_rate );
- printf( "\nWeighted bitrate: %.3f kbps", wght_rate );
+#ifdef SKP_MACRO_COUNT
+ printf( "\n \nWMOPS calculation");
+ printf( "\nMean: %.3f WMOPS", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3));
+ printf( "\nMax: %.3f WMOPS", (float)maxOps / ((float)packetSize_ms * 1e3));
+#endif
printf( "\n\n" );
} else {
- /* print average and weighted bitrates */
- printf( "%.3f %.3f %.3f \n", avg_rate, act_rate, wght_rate );
+ /* print time and % of realtime */
+ printf("%.3f %.3f %d ", 1e-6 * tottime, 1e-4 * tottime / filetime, totPackets );
+
+ /* print average and active bitrates */
+ printf( "%.3f %.3f ", avg_rate, act_rate );
+#ifdef SKP_MACRO_COUNT
+ /* print average and max WMOPS */
+ printf( "%.3f %.3f \n", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3),
+ (float)maxOps / ((float)packetSize_ms * 1e3));
+#else
+ printf( "%.3f %.3f \n", 0, 0);
+#endif
}
+
+ /* Save timing file if TIC/TOC used */
+ SKP_TimerSave("encoder_timings.txt");
+
return 0;
}
--- /dev/null
+++ b/test/SKP_debug.c
@@ -1,0 +1,169 @@
+/***********************************************************************
+Copyright (c) 2006-2010, Skype Limited. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, (subject to the limitations in the disclaimer below)
+are permitted provided that the following conditions are met:
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+- Neither the name of Skype Limited, nor the names of specific
+contributors, may be used to endorse or promote products derived from
+this software without specific prior written permission.
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
+BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************/
+
+/* *
+ * SKP_debug.c *
+ * *
+ * This contains code to help debugging *
+ * *
+ * Copyright 2009 (c), Skype Limited *
+ * Date: 090629 *
+ * */
+
+#include "SKP_debug.h"
+#include "../src_SigProc_FIX/SKP_Silk_SigProc_FIX.h"
+
+#ifdef _WIN32
+
+#if (defined(_WIN32) || defined(_WINCE))
+#include <windows.h> /* timer */
+#else // Linux or Mac
+#include <sys/time.h>
+#endif
+
+unsigned long GetHighResolutionTime() /* O: time in usec*/
+{
+ /* Returns a time counter in microsec */
+ /* the resolution is platform dependent */
+ /* but is typically 1.62 us resolution */
+ LARGE_INTEGER lpPerformanceCount;
+ LARGE_INTEGER lpFrequency;
+ QueryPerformanceCounter(&lpPerformanceCount);
+ QueryPerformanceFrequency(&lpFrequency);
+ return (unsigned long)((1000000*(lpPerformanceCount.QuadPart)) / lpFrequency.QuadPart);
+}
+#else // Linux or Mac
+unsigned long GetHighResolutionTime() /* O: time in usec*/
+{
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ return((tv.tv_sec*1000000)+(tv.tv_usec));
+}
+#endif
+
+#if SKP_TIC_TOC
+
+int SKP_Timer_nTimers = 0;
+int SKP_Timer_depth_ctr = 0;
+char SKP_Timer_tags[SKP_NUM_TIMERS_MAX][SKP_NUM_TIMERS_MAX_TAG_LEN];
+#ifdef WIN32
+LARGE_INTEGER SKP_Timer_start[SKP_NUM_TIMERS_MAX];
+#else
+unsigned long SKP_Timer_start[SKP_NUM_TIMERS_MAX];
+#endif
+unsigned int SKP_Timer_cnt[SKP_NUM_TIMERS_MAX];
+SKP_int64 SKP_Timer_min[SKP_NUM_TIMERS_MAX];
+SKP_int64 SKP_Timer_sum[SKP_NUM_TIMERS_MAX];
+SKP_int64 SKP_Timer_max[SKP_NUM_TIMERS_MAX];
+SKP_int64 SKP_Timer_depth[SKP_NUM_TIMERS_MAX];
+
+#ifdef WIN32
+void SKP_TimerSave(char *file_name)
+{
+ if( SKP_Timer_nTimers > 0 )
+ {
+ int k;
+ FILE *fp;
+ LARGE_INTEGER lpFrequency;
+ LARGE_INTEGER lpPerformanceCount1, lpPerformanceCount2;
+ int del = 0x7FFFFFFF;
+ double avg, sum_avg;
+ /* estimate overhead of calling performance counters */
+ for( k = 0; k < 1000; k++ ) {
+ QueryPerformanceCounter(&lpPerformanceCount1);
+ QueryPerformanceCounter(&lpPerformanceCount2);
+ lpPerformanceCount2.QuadPart -= lpPerformanceCount1.QuadPart;
+ if( (int)lpPerformanceCount2.LowPart < del )
+ del = lpPerformanceCount2.LowPart;
+ }
+ QueryPerformanceFrequency(&lpFrequency);
+ /* print results to file */
+ sum_avg = 0.0f;
+ for( k = 0; k < SKP_Timer_nTimers; k++ ) {
+ if (SKP_Timer_depth[k] == 0) {
+ sum_avg += (1e6 * SKP_Timer_sum[k] / SKP_Timer_cnt[k] - del) / lpFrequency.QuadPart * SKP_Timer_cnt[k];
+ }
+ }
+ fp = fopen(file_name, "w");
+ fprintf(fp, " min avg %% max count\n");
+ for( k = 0; k < SKP_Timer_nTimers; k++ ) {
+ if (SKP_Timer_depth[k] == 0) {
+ fprintf(fp, "%-28s", SKP_Timer_tags[k]);
+ } else if (SKP_Timer_depth[k] == 1) {
+ fprintf(fp, " %-27s", SKP_Timer_tags[k]);
+ } else if (SKP_Timer_depth[k] == 2) {
+ fprintf(fp, " %-26s", SKP_Timer_tags[k]);
+ } else if (SKP_Timer_depth[k] == 3) {
+ fprintf(fp, " %-25s", SKP_Timer_tags[k]);
+ } else {
+ fprintf(fp, " %-24s", SKP_Timer_tags[k]);
+ }
+ avg = (1e6 * SKP_Timer_sum[k] / SKP_Timer_cnt[k] - del) / lpFrequency.QuadPart;
+ fprintf(fp, "%8.2f", (1e6 * (SKP_max_64(SKP_Timer_min[k] - del, 0))) / lpFrequency.QuadPart);
+ fprintf(fp, "%12.2f %6.2f", avg, 100.0 * avg / sum_avg * SKP_Timer_cnt[k]);
+ fprintf(fp, "%12.2f", (1e6 * (SKP_max_64(SKP_Timer_max[k] - del, 0))) / lpFrequency.QuadPart);
+ fprintf(fp, "%10d\n", SKP_Timer_cnt[k]);
+ }
+ fprintf(fp, " microseconds\n");
+ fclose(fp);
+ }
+}
+#else
+void SKP_TimerSave(char *file_name)
+{
+ if( SKP_Timer_nTimers > 0 )
+ {
+ int k;
+ FILE *fp;
+ /* print results to file */
+ fp = fopen(file_name, "w");
+ fprintf(fp, " min avg max count\n");
+ for( k = 0; k < SKP_Timer_nTimers; k++ )
+ {
+ if (SKP_Timer_depth[k] == 0) {
+ fprintf(fp, "%-28s", SKP_Timer_tags[k]);
+ } else if (SKP_Timer_depth[k] == 1) {
+ fprintf(fp, " %-27s", SKP_Timer_tags[k]);
+ } else if (SKP_Timer_depth[k] == 2) {
+ fprintf(fp, " %-26s", SKP_Timer_tags[k]);
+ } else if (SKP_Timer_depth[k] == 3) {
+ fprintf(fp, " %-25s", SKP_Timer_tags[k]);
+ } else {
+ fprintf(fp, " %-24s", SKP_Timer_tags[k]);
+ }
+ fprintf(fp, "%d ", SKP_Timer_min[k]);
+ fprintf(fp, "%f ", (double)SKP_Timer_sum[k] / (double)SKP_Timer_cnt[k]);
+ fprintf(fp, "%d ", SKP_Timer_max[k]);
+ fprintf(fp, "%10d\n", SKP_Timer_cnt[k]);
+ }
+ fprintf(fp, " microseconds\n");
+ fclose(fp);
+ }
+}
+#endif
+
+#endif /* SKP_TIC_TOC */
--- a/test/SignalCompare.vcproj
+++ b/test/SignalCompare.vcproj
@@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\interface;..\src"
+ AdditionalIncludeDirectories="..\interface;..\src_SigProc_FIX"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -121,7 +121,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\interface;..\src"
+ AdditionalIncludeDirectories="..\interface;..\src_SigProc_FIX"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0"
FloatingPointModel="2"
--- /dev/null
+++ b/test/SignalCompare.vcproj.SKYPE-KOEN.koen.user
@@ -1,0 +1,65 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioUserFile
+ ProjectType="Visual C++"
+ Version="8.00"
+ ShowAllFiles="false"
+ >
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ >
+ <DebugSettings
+ Command="$(TargetPath)"
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="SKYPE-KOEN"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment=""
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ >
+ <DebugSettings
+ Command="$(TargetPath)"
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="SKYPE-KOEN"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment=""
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ </Configurations>
+</VisualStudioUserFile>
--- a/test/signalCompare.c
+++ b/test/signalCompare.c
@@ -30,7 +30,7 @@
*/
#ifdef _WIN32
-#define _CRT_SECURE_NO_DEPRECATE 1
+#define _CRT_SECURE_NO_DEPRECATE 1
#endif
#include <stdio.h>
@@ -40,12 +40,12 @@
#include "SKP_Silk_SigProc_FIX.h"
-#define FRAME_LENGTH_MS 10
-#define WIN_LENGTH_MS 20
-#define BW_EXPANSION 0.7f
+#define FRAME_LENGTH_MS 10
+#define WIN_LENGTH_MS 20
+#define BW_EXPANSION 0.7f
-#define MAX_FS_KHZ 24
-#define LPC_ORDER 10
+#define MAX_FS_KHZ 24
+#define LPC_ORDER 10
#ifdef __cplusplus
extern "C"
@@ -53,30 +53,30 @@
#endif
/* Internally used functions */
void Autocorrelation(
- SKP_float *results, /* o result (length correlationCount) */
- const SKP_float *inputData, /* i input data to correlate */
- SKP_int inputDataSize, /* i length of input */
- SKP_int correlationCount /* i number of correlation taps to compute */
+ SKP_float *results, /* o result (length correlationCount) */
+ const SKP_float *inputData, /* i input data to correlate */
+ SKP_int inputDataSize, /* i length of input */
+ SKP_int correlationCount /* i number of correlation taps to compute */
);
/* inner product of two SKP_float arrays, with result as double */
double Inner_product(
- const SKP_float *data1,
- const SKP_float *data2,
- SKP_int dataSize
+ const SKP_float *data1,
+ const SKP_float *data2,
+ SKP_int dataSize
);
/* Solve the normal equations using the Levinson-Durbin recursion */
-SKP_float Levinsondurbin( /* O prediction error energy */
- SKP_float A[], /* O prediction coefficients [order] */
- const SKP_float corr[], /* I input auto-correlations [order + 1] */
- const SKP_int order /* I prediction order */
+SKP_float Levinsondurbin( /* O prediction error energy */
+ SKP_float A[], /* O prediction coefficients [order] */
+ const SKP_float corr[], /* I input auto-correlations [order + 1] */
+ const SKP_int order /* I prediction order */
);
/* Chirp (bw expand) LP AR filter */
void Bwexpander(
- SKP_float *ar, /* io AR filter to be expanded (without leading 1) */
- const SKP_int d, /* i length of ar */
- const SKP_float chirp /* i chirp factor (typically in range (0..1) ) */
+ SKP_float *ar, /* io AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* i length of ar */
+ const SKP_float chirp /* i chirp factor (typically in range (0..1) ) */
);
#ifdef __cplusplus
@@ -84,283 +84,290 @@
#endif
static void print_usage(char* argv[]) {
- printf("\nusage: %s ref.pcm test.pcm [settings]\n", argv[ 0 ]);
- printf("\nref.pcm : Reference file");
- printf("\ntest.pcm : File to be tested, should be of same length as ref.pcm");
- printf("\n settings:");
- printf("\n-diff : Only determine bit-exactness");
- printf("\n-fs <kHz> : Sampling rate in kHz, max: %d; default: 24", MAX_FS_KHZ);
- printf("\n");
+ printf("\nusage: %s ref.pcm test.pcm [settings]\n", argv[ 0 ]);
+ printf("\nref.pcm : Reference file");
+ printf("\ntest.pcm : File to be tested, should be of same length as ref.pcm");
+ printf("\n settings:");
+ printf("\n-diff : Only determine bit-exactness");
+ printf("\n-fs <Hz> : Sampling rate in Hz, max: %d; default: 24000", MAX_FS_KHZ * 1000 );
+ printf("\n");
}
+#ifdef SKP_MACRO_COUNT
+ varDefine /* Define and reset global counters */
+#endif
+
int main(int argc, char* argv[])
{
- SKP_int args, n, i, counterRef, counterTest;
- char testInFileName[150], refInFileName[150];
- FILE *refInFile, *testInFile;
- SKP_int nFrames = 0, isUnequal = 0;
- SKP_int diff = 0, Fs_kHz = 24; /* defaults */
- SKP_float c, refWhtnd, testWhtnd, refNrg, diffNrg;
- double SNR = 0.0;
- SKP_int16 refIn[WIN_LENGTH_MS * MAX_FS_KHZ], testIn[WIN_LENGTH_MS * MAX_FS_KHZ];
- SKP_float refWin[WIN_LENGTH_MS * MAX_FS_KHZ], testWin[WIN_LENGTH_MS * MAX_FS_KHZ];
- SKP_float autoCorr[LPC_ORDER + 1], LPC_Coef[LPC_ORDER];
+ SKP_int args, n, i, counterRef, counterTest;
+ char testInFileName[150], refInFileName[150];
+ FILE *refInFile, *testInFile;
+ SKP_int nFrames = 0, isUnequal = 0;
+ SKP_int diff = 0, Fs_kHz;
+ SKP_int32 Fs_Hz = 24000;
+ SKP_float c, refWhtnd, testWhtnd, refNrg, diffNrg;
+ double SNR = 0.0;
+ SKP_int16 refIn[WIN_LENGTH_MS * MAX_FS_KHZ], testIn[WIN_LENGTH_MS * MAX_FS_KHZ];
+ SKP_float refWin[WIN_LENGTH_MS * MAX_FS_KHZ], testWin[WIN_LENGTH_MS * MAX_FS_KHZ];
+ SKP_float autoCorr[LPC_ORDER + 1], LPC_Coef[LPC_ORDER];
- if (argc < 3) {
- print_usage(argv);
- exit(0);
- }
+ if (argc < 3) {
+ print_usage(argv);
+ exit(0);
+ }
- /* get arguments */
- args = 1;
- strcpy(refInFileName, argv[args]);
- args++;
- strcpy(testInFileName, argv[args]);
- args++;
- while(args < argc ) {
- if (SKP_STR_CASEINSENSITIVE_COMPARE(argv[args], "-diff") == 0) {
- diff = 1;
- args++;
- }else if (SKP_STR_CASEINSENSITIVE_COMPARE(argv[args], "-fs") == 0) {
- sscanf(argv[args+1], "%d", &Fs_kHz);
- args += 2;
- } else {
- printf("Error: unrecognized setting: %s\n\n", argv[args]);
- print_usage(argv);
- exit(0);
- }
- }
+ /* get arguments */
+ args = 1;
+ strcpy(refInFileName, argv[args]);
+ args++;
+ strcpy(testInFileName, argv[args]);
+ args++;
+ while(args < argc ) {
+ if (SKP_STR_CASEINSENSITIVE_COMPARE(argv[args], "-diff") == 0) {
+ diff = 1;
+ args++;
+ }else if (SKP_STR_CASEINSENSITIVE_COMPARE(argv[args], "-fs") == 0) {
+ sscanf(argv[args+1], "%d", &Fs_Hz);
+ args += 2;
+ } else {
+ printf("Error: unrecognized setting: %s\n\n", argv[args]);
+ print_usage(argv);
+ exit(0);
+ }
+ }
- if( Fs_kHz > MAX_FS_KHZ ) {
- printf("Error: sampling rate too high: %d\n\n", Fs_kHz);
- print_usage(argv);
- exit(0);
- }
+ Fs_kHz = SKP_DIV32_16( Fs_Hz, 1000 );
- printf("Reference: %s\n", refInFileName);
- //printf("Test: %s\n", testInFileName);
+ if( Fs_kHz > MAX_FS_KHZ ) {
+ printf("Error: sampling rate too high: %d\n\n", Fs_kHz);
+ print_usage(argv);
+ exit(0);
+ }
- /* open files */
- refInFile = fopen(refInFileName, "rb");
- if (refInFile==NULL) {
- printf("Error: could not open input file %s\n", refInFileName);
- exit(0);
- }
- testInFile = fopen(testInFileName, "rb");
- if (testInFile==NULL) {
- printf("Error: could not open input file %s\n", testInFileName);
- exit(0);
- }
+ printf("Reference: %s\n", refInFileName);
+ //printf("Test: %s\n", testInFileName);
- SKP_memset( refIn, 0, sizeof(refIn) );
- SKP_memset( testIn, 0, sizeof(testIn) );
+ /* open files */
+ refInFile = fopen(refInFileName, "rb");
+ if (refInFile==NULL) {
+ printf("Error: could not open input file %s\n", refInFileName);
+ exit(0);
+ }
+ testInFile = fopen(testInFileName, "rb");
+ if (testInFile==NULL) {
+ printf("Error: could not open input file %s\n", testInFileName);
+ exit(0);
+ }
- while(1) {
- /* Read inputs */
- counterRef = (SKP_int)fread(&refIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz],
- sizeof(SKP_int16), FRAME_LENGTH_MS * Fs_kHz, refInFile);
- counterTest = (SKP_int)fread(&testIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz],
- sizeof(SKP_int16), FRAME_LENGTH_MS * Fs_kHz, testInFile);
- if(counterRef != FRAME_LENGTH_MS * Fs_kHz || counterTest != FRAME_LENGTH_MS * Fs_kHz){
- break;
- }
+ SKP_memset( refIn, 0, sizeof(refIn) );
+ SKP_memset( testIn, 0, sizeof(testIn) );
- /* test for bit-exactness */
- for( n = 0; n < FRAME_LENGTH_MS * Fs_kHz; n++ ) {
- if( refIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz + n] !=
- testIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz + n] ) {
- isUnequal = 1;
- break;
- }
- }
+ while(1) {
+ /* Read inputs */
+ counterRef = (SKP_int)fread(&refIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz],
+ sizeof(SKP_int16), FRAME_LENGTH_MS * Fs_kHz, refInFile);
+ counterTest = (SKP_int)fread(&testIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz],
+ sizeof(SKP_int16), FRAME_LENGTH_MS * Fs_kHz, testInFile);
+ if(counterRef != FRAME_LENGTH_MS * Fs_kHz || counterTest != FRAME_LENGTH_MS * Fs_kHz){
+ break;
+ }
- /* apply sine window */
- for( n = 0; n < WIN_LENGTH_MS * Fs_kHz; n++ ) {
- c = (SKP_float)sin( 3.14159265 * (n + 1) / (WIN_LENGTH_MS * Fs_kHz + 1) );
- refWin[n] = refIn[n] * c;
- testWin[n] = testIn[n] * c;
- }
+ /* test for bit-exactness */
+ for( n = 0; n < FRAME_LENGTH_MS * Fs_kHz; n++ ) {
+ if( refIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz + n] !=
+ testIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz + n] ) {
+ isUnequal = 1;
+ break;
+ }
+ }
- /* LPC analysis on reference signal */
+ /* apply sine window */
+ for( n = 0; n < WIN_LENGTH_MS * Fs_kHz; n++ ) {
+ c = (SKP_float)sin( 3.14159265 * (n + 1) / (WIN_LENGTH_MS * Fs_kHz + 1) );
+ refWin[n] = refIn[n] * c;
+ testWin[n] = testIn[n] * c;
+ }
- /* Calculate auto correlation */
- Autocorrelation(autoCorr, refWin, WIN_LENGTH_MS * Fs_kHz, LPC_ORDER + 1);
+ /* LPC analysis on reference signal */
- /* Add white noise */
- autoCorr[ 0 ] += autoCorr[ 0 ] * 1e-6f + 1.0f;
+ /* Calculate auto correlation */
+ Autocorrelation(autoCorr, refWin, WIN_LENGTH_MS * Fs_kHz, LPC_ORDER + 1);
- /* Convert correlations to prediction coefficients */
- Levinsondurbin(LPC_Coef, autoCorr, LPC_ORDER);
+ /* Add white noise */
+ autoCorr[ 0 ] += autoCorr[ 0 ] * 1e-6f + 1.0f;
- /* Bandwdith expansion */
- Bwexpander(LPC_Coef, LPC_ORDER, BW_EXPANSION);
+ /* Convert correlations to prediction coefficients */
+ Levinsondurbin(LPC_Coef, autoCorr, LPC_ORDER);
- /* Filter both signals */
- refNrg = 1.0f;
- diffNrg = 1e-10f;
- for( n = (WIN_LENGTH_MS - FRAME_LENGTH_MS) / 2 * Fs_kHz;
- n < (WIN_LENGTH_MS + FRAME_LENGTH_MS) / 2 * Fs_kHz; n++ ) {
- refWhtnd = refIn[n];
- testWhtnd = testIn[n];
- for( i = 0; i < LPC_ORDER; i++ ) {
- refWhtnd -= LPC_Coef[ i ] * refIn[n - i - 1];
- testWhtnd -= LPC_Coef[ i ] * testIn[n - i - 1];
- }
- refNrg += refWhtnd * refWhtnd;
- diffNrg += (refWhtnd - testWhtnd) * (refWhtnd - testWhtnd);
- }
+ /* Bandwdith expansion */
+ Bwexpander(LPC_Coef, LPC_ORDER, BW_EXPANSION);
- /* weighted SNR */
- if( refNrg > FRAME_LENGTH_MS * Fs_kHz ) {
- SNR += 10.0 * log10( refNrg / diffNrg );
- nFrames++;
- }
+ /* Filter both signals */
+ refNrg = 1.0f;
+ diffNrg = 1e-10f;
+ for( n = (WIN_LENGTH_MS - FRAME_LENGTH_MS) / 2 * Fs_kHz;
+ n < (WIN_LENGTH_MS + FRAME_LENGTH_MS) / 2 * Fs_kHz; n++ ) {
+ refWhtnd = refIn[n];
+ testWhtnd = testIn[n];
+ for( i = 0; i < LPC_ORDER; i++ ) {
+ refWhtnd -= LPC_Coef[ i ] * refIn[n - i - 1];
+ testWhtnd -= LPC_Coef[ i ] * testIn[n - i - 1];
+ }
+ refNrg += refWhtnd * refWhtnd;
+ diffNrg += (refWhtnd - testWhtnd) * (refWhtnd - testWhtnd);
+ }
- /* Update Buffer */
- SKP_memmove( refIn, &refIn[FRAME_LENGTH_MS * Fs_kHz], (WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz * sizeof(SKP_int16));
- SKP_memmove( testIn, &testIn[FRAME_LENGTH_MS * Fs_kHz], (WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz * sizeof(SKP_int16));
- }
+ /* weighted SNR */
+ if( refNrg > FRAME_LENGTH_MS * Fs_kHz ) {
+ SNR += 10.0 * log10( refNrg / diffNrg );
+ nFrames++;
+ }
- if( diff ) {
- if( isUnequal ) {
- printf("Signals DIFFER\n");
- } else {
- if(counterRef != counterTest){
- printf("Warning: signals differ in length\n");
- }
- printf("Signals BIT-EXACT\n");
- }
- } else {
- if( nFrames == 0 ) {
- printf("At least one signal too short or not loud enough\n");
- exit(0);
- }
- if(counterRef != counterTest){
- printf("Warning: signals differ in length\n");
- }
- if( isUnequal == 0 ) {
- printf("Signals BIT-EXACT\n");
- } else {
- printf("AVERAGE WEIGHTED SNR: %4.1f dB\n", SNR / nFrames);
- }
- }
- printf("\n");
+ /* Update Buffer */
+ SKP_memmove( refIn, &refIn[FRAME_LENGTH_MS * Fs_kHz], (WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz * sizeof(SKP_int16));
+ SKP_memmove( testIn, &testIn[FRAME_LENGTH_MS * Fs_kHz], (WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz * sizeof(SKP_int16));
+ }
- /* Close Files */
- fclose(refInFile);
- fclose(testInFile);
+ if( diff ) {
+ if( isUnequal ) {
+ printf("Signals DIFFER\n");
+ } else {
+ if(counterRef != counterTest){
+ printf("Warning: signals differ in length\n");
+ }
+ printf("Signals BIT-EXACT\n");
+ }
+ } else {
+ if( nFrames == 0 ) {
+ printf("At least one signal too short or not loud enough\n");
+ exit(0);
+ }
+ if(counterRef != counterTest){
+ printf("Warning: signals differ in length\n");
+ }
+ if( isUnequal == 0 ) {
+ printf("Signals BIT-EXACT\n");
+ } else {
+ printf("AVERAGE WEIGHTED SNR: %4.1f dB\n", SNR / nFrames);
+ }
+ }
+ printf("\n");
- return 0;
+ /* Close Files */
+ fclose(refInFile);
+ fclose(testInFile);
+
+ return 0;
}
/* compute autocorrelation */
void Autocorrelation(
- SKP_float *results, /* o result (length correlationCount) */
- const SKP_float *inputData, /* i input data to correlate */
- SKP_int inputDataSize, /* i length of input */
- SKP_int correlationCount /* i number of correlation taps to compute */
+ SKP_float *results, /* o result (length correlationCount) */
+ const SKP_float *inputData, /* i input data to correlate */
+ SKP_int inputDataSize, /* i length of input */
+ SKP_int correlationCount /* i number of correlation taps to compute */
)
{
- SKP_int i;
+ SKP_int i;
- if (correlationCount > inputDataSize) {
- correlationCount = inputDataSize;
- }
+ if (correlationCount > inputDataSize) {
+ correlationCount = inputDataSize;
+ }
- for( i = 0; i < correlationCount; i++ ) {
- results[ i ] = (SKP_float)Inner_product( inputData, inputData + i, inputDataSize - i );
- }
+ for( i = 0; i < correlationCount; i++ ) {
+ results[ i ] = (SKP_float)Inner_product( inputData, inputData + i, inputDataSize - i );
+ }
}
/* inner product of two SKP_float arrays, with result as double */
double Inner_product(
- const SKP_float *data1,
- const SKP_float *data2,
- SKP_int dataSize
+ const SKP_float *data1,
+ const SKP_float *data2,
+ SKP_int dataSize
)
{
- SKP_int i, dataSize4;
- double result;
+ SKP_int i, dataSize4;
+ double result;
- /* 4x unrolled loop */
- result = 0.0f;
- dataSize4 = dataSize & 0xFFFC;
- for( i = 0; i < dataSize4; i += 4 ) {
- result += data1[ i + 0 ] * data2[ i + 0 ] +
- data1[ i + 1 ] * data2[ i + 1 ] +
- data1[ i + 2 ] * data2[ i + 2 ] +
- data1[ i + 3 ] * data2[ i + 3 ];
- }
+ /* 4x unrolled loop */
+ result = 0.0f;
+ dataSize4 = dataSize & 0xFFFC;
+ for( i = 0; i < dataSize4; i += 4 ) {
+ result += data1[ i + 0 ] * data2[ i + 0 ] +
+ data1[ i + 1 ] * data2[ i + 1 ] +
+ data1[ i + 2 ] * data2[ i + 2 ] +
+ data1[ i + 3 ] * data2[ i + 3 ];
+ }
- /* add any remaining products */
- for( ; i < dataSize; i++ ) {
- result += data1[ i ] * data2[ i ];
- }
+ /* add any remaining products */
+ for( ; i < dataSize; i++ ) {
+ result += data1[ i ] * data2[ i ];
+ }
- return result;
+ return result;
}
/* Solve the normal equations using the Levinson-Durbin recursion */
-SKP_float Levinsondurbin( /* O prediction error energy */
- SKP_float A[], /* O prediction coefficients [order] */
- const SKP_float corr[], /* I input auto-correlations [order + 1] */
- const SKP_int order /* I prediction order */
+SKP_float Levinsondurbin( /* O prediction error energy */
+ SKP_float A[], /* O prediction coefficients [order] */
+ const SKP_float corr[], /* I input auto-correlations [order + 1] */
+ const SKP_int order /* I prediction order */
)
{
- SKP_int i, mHalf, m;
- SKP_float min_nrg, nrg, t, km, Atmp1, Atmp2;
-
- min_nrg = 1e-12f * corr[ 0 ] + 1e-9f;
- nrg = corr[ 0 ];
- nrg = SKP_max(min_nrg, nrg);
- A[ 0 ] = corr[ 1 ] / nrg;
- nrg -= A[ 0 ] * corr[ 1 ];
- nrg = SKP_max(min_nrg, nrg);
+ SKP_int i, mHalf, m;
+ SKP_float min_nrg, nrg, t, km, Atmp1, Atmp2;
+
+ min_nrg = 1e-12f * corr[ 0 ] + 1e-9f;
+ nrg = corr[ 0 ];
+ nrg = SKP_max( min_nrg, nrg );
+ A[ 0 ] = corr[ 1 ] / nrg;
+ nrg -= A[ 0 ] * corr[ 1 ];
+ nrg = SKP_max(min_nrg, nrg);
- for( m = 1; m < order; m++ )
- {
- t = corr[ m + 1 ];
- for( i = 0; i < m; i++ ) {
- t -= A[ i ] * corr[ m - i ];
- }
+ for( m = 1; m < order; m++ )
+ {
+ t = corr[ m + 1 ];
+ for( i = 0; i < m; i++ ) {
+ t -= A[ i ] * corr[ m - i ];
+ }
- /* reflection coefficient */
- km = t / nrg;
+ /* reflection coefficient */
+ km = t / nrg;
- /* residual energy */
- nrg -= km * t;
- nrg = SKP_max(min_nrg, nrg);
+ /* residual energy */
+ nrg -= km * t;
+ nrg = SKP_max(min_nrg, nrg);
- mHalf = m >> 1;
- for( i = 0; i < mHalf; i++ ) {
- Atmp1 = A[ i ];
- Atmp2 = A[ m - i - 1 ];
- A[ m - i - 1 ] -= km * Atmp1;
- A[ i ] -= km * Atmp2;
- }
- if( m & 1 ) {
- A[ mHalf ] -= km * A[ mHalf ];
- }
- A[ m ] = km;
- }
+ mHalf = m >> 1;
+ for( i = 0; i < mHalf; i++ ) {
+ Atmp1 = A[ i ];
+ Atmp2 = A[ m - i - 1 ];
+ A[ m - i - 1 ] -= km * Atmp1;
+ A[ i ] -= km * Atmp2;
+ }
+ if( m & 1 ) {
+ A[ mHalf ] -= km * A[ mHalf ];
+ }
+ A[ m ] = km;
+ }
- /* return the residual energy */
- return nrg;
+ /* return the residual energy */
+ return nrg;
}
/* Chirp (bw expand) LP AR filter */
void Bwexpander(
- SKP_float *ar, /* io AR filter to be expanded (without leading 1) */
- const SKP_int d, /* i length of ar */
- const SKP_float chirp /* i chirp factor (typically in range (0..1) ) */
+ SKP_float *ar, /* io AR filter to be expanded (without leading 1) */
+ const SKP_int d, /* i length of ar */
+ const SKP_float chirp /* i chirp factor (typically in range (0..1) ) */
)
{
- SKP_int i;
- SKP_float cfac = chirp;
+ SKP_int i;
+ SKP_float cfac = chirp;
- for( i = 0; i < d - 1; i++ ) {
- ar[ i ] *= cfac;
- cfac *= chirp;
- }
- ar[ d - 1 ] *= cfac;
+ for( i = 0; i < d - 1; i++ ) {
+ ar[ i ] *= cfac;
+ cfac *= chirp;
+ }
+ ar[ d - 1 ] *= cfac;
}