/*---------------------------------------------------------------------------*\ FILE........: lpc.c AUTHOR......: David Rowe DATE CREATED: 30 Sep 1990 (!) Linear Prediction functions written in C. \*---------------------------------------------------------------------------*/ /* Copyright (C) 2009-2012 David Rowe All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, see . */ #define LPC_MAX_N 512 /* maximum no. of samples in frame */ #define PI 3.141592654 /* mathematical constant */ #define ALPHA 1.0 #define BETA 0.94 #include #include #include "defines.h" #include "lpc.h" /*---------------------------------------------------------------------------*\ pre_emp() Pre-emphasise (high pass filter with zero close to 0 Hz) a frame of speech samples. Helps reduce dynamic range of LPC spectrum, giving greater weight and hense a better match to low energy formants. Should be balanced by de-emphasis of the output speech. \*---------------------------------------------------------------------------*/ void pre_emp( float Sn_pre[], /* output frame of speech samples */ float Sn[], /* input frame of speech samples */ float *mem, /* Sn[-1]single sample memory */ int Nsam /* number of speech samples to use */ ) { int i; for(i=0; i 1.0) k = 0.0; a[i][i] = k; for(j=1; j<=i-1; j++) a[i][j] = a[i-1][j] + k*a[i-1][i-j]; /* Equation 38c, Makhoul */ e *= (1-k*k); /* Equation 38d, Makhoul */ } for(i=1; i<=order; i++) lpcs[i] = a[order][i]; lpcs[0] = 1.0; } /*---------------------------------------------------------------------------*\ inverse_filter() Inverse Filter, A(z). Produces an array of residual samples from an array of input samples and linear prediction coefficients. The filter memory is stored in the first order samples of the input array. \*---------------------------------------------------------------------------*/ void inverse_filter( float Sn[], /* Nsam input samples */ float a[], /* LPCs for this frame of samples */ int Nsam, /* number of samples */ float res[], /* Nsam residual samples */ int order /* order of LPC */ ) { int i,j; /* loop variables */ for(i=0; i