diff options
Diffstat (limited to 'engine/voice_codecs/speex/source/libspeex/lpc.c')
| -rw-r--r-- | engine/voice_codecs/speex/source/libspeex/lpc.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/engine/voice_codecs/speex/source/libspeex/lpc.c b/engine/voice_codecs/speex/source/libspeex/lpc.c new file mode 100644 index 0000000..9aec141 --- /dev/null +++ b/engine/voice_codecs/speex/source/libspeex/lpc.c @@ -0,0 +1,119 @@ +/* + Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, + Technische Universitaet Berlin + + Any use of this software is permitted provided that this notice is not + removed and that neither the authors nor the Technische Universitaet Berlin + are deemed to have made any representations as to the suitability of this + software for any purpose nor are held responsible for any defects of + this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + + As a matter of courtesy, the authors request to be informed about uses + this software has found, about bugs in this software, and about any + improvements that may be of general interest. + + Berlin, 28.11.1994 + Jutta Degener + Carsten Bormann + + + Code slightly modified by Jean-Marc Valin + + Speex License: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +/* LPC- and Reflection Coefficients + * + * The next two functions calculate linear prediction coefficients + * and/or the related reflection coefficients from the first P_MAX+1 + * values of the autocorrelation function. + */ + +/* Invented by N. Levinson in 1947, modified by J. Durbin in 1959. + */ + +#include "lpc.h" + +float /* returns minimum mean square error */ +wld( + float * lpc, /* [0...p-1] LPC coefficients */ + const float * ac, /* in: [0...p] autocorrelation values */ + float * ref, /* out: [0...p-1] reflection coef's */ + int p + ) +{ + int i, j; float r, error = ac[0]; + + if (ac[0] == 0) { + for (i = 0; i < p; i++) ref[i] = 0; return 0; } + + for (i = 0; i < p; i++) { + + /* Sum up this iteration's reflection coefficient. + */ + r = -ac[i + 1]; + for (j = 0; j < i; j++) r -= lpc[j] * ac[i - j]; + ref[i] = r /= error; + + /* Update LPC coefficients and total error. + */ + lpc[i] = r; + for (j = 0; j < i/2; j++) { + float tmp = lpc[j]; + lpc[j] += r * lpc[i-1-j]; + lpc[i-1-j] += r * tmp; + } + if (i % 2) lpc[j] += lpc[j] * r; + + error *= 1.0 - r * r; + } + return error; +} + + +/* Compute the autocorrelation + * ,--, + * ac(i) = > x(n) * x(n-i) for all n + * `--' + * for lags between 0 and lag-1, and x == 0 outside 0...n-1 + */ +void _spx_autocorr( + const float * x, /* in: [0...n-1] samples x */ + float *ac, /* out: [0...lag-1] ac values */ + int lag, int n) +{ + float d; int i; + while (lag--) { + for (i = lag, d = 0; i < n; i++) d += x[i] * x[i-lag]; + ac[lag] = d; + } +} |