summaryrefslogtreecommitdiff
path: root/gr-vocoder/lib/codec2/lpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gr-vocoder/lib/codec2/lpc.c')
-rw-r--r--gr-vocoder/lib/codec2/lpc.c309
1 files changed, 0 insertions, 309 deletions
diff --git a/gr-vocoder/lib/codec2/lpc.c b/gr-vocoder/lib/codec2/lpc.c
deleted file mode 100644
index 9a730eb4ad..0000000000
--- a/gr-vocoder/lib/codec2/lpc.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-#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 <assert.h>
-#include <math.h>
-#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 hensea 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<Nsam; i++) {
- Sn_pre[i] = Sn[i] - ALPHA * mem[0];
- mem[0] = Sn[i];
- }
-
-}
-
-
-/*---------------------------------------------------------------------------*\
-
- de_emp()
-
- De-emphasis filter (low pass filter with polse close to 0 Hz).
-
-\*---------------------------------------------------------------------------*/
-
-void de_emp(
- float Sn_de[], /* 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<Nsam; i++) {
- Sn_de[i] = Sn[i] + BETA * mem[0];
- mem[0] = Sn_de[i];
- }
-
-}
-
-
-/*---------------------------------------------------------------------------*\
-
- hanning_window()
-
- Hanning windows a frame of speech samples.
-
-\*---------------------------------------------------------------------------*/
-
-void hanning_window(
- float Sn[], /* input frame of speech samples */
- float Wn[], /* output frame of windowed samples */
- int Nsam /* number of samples */
-)
-{
- int i; /* loop variable */
-
- for(i=0; i<Nsam; i++)
- Wn[i] = Sn[i]*(0.5 - 0.5*cosf(2*PI*(float)i/(Nsam-1)));
-}
-
-/*---------------------------------------------------------------------------*\
-
- autocorrelate()
-
- Finds the first P autocorrelation values of an array of windowed speech
- samples Sn[].
-
-\*---------------------------------------------------------------------------*/
-
-void autocorrelate(
- float Sn[], /* frame of Nsam windowed speech samples */
- float Rn[], /* array of P+1 autocorrelation coefficients */
- int Nsam, /* number of windowed samples to use */
- int order /* order of LPC analysis */
-)
-{
- int i,j; /* loop variables */
-
- for(j=0; j<order+1; j++) {
- Rn[j] = 0.0;
- for(i=0; i<Nsam-j; i++)
- Rn[j] += Sn[i]*Sn[i+j];
- }
-}
-
-/*---------------------------------------------------------------------------*\
-
- levinson_durbin()
-
- Given P+1 autocorrelation coefficients, finds P Linear Prediction Coeff.
- (LPCs) where P is the order of the LPC all-pole model. The Levinson-Durbin
- algorithm is used, and is described in:
-
- J. Makhoul
- "Linear prediction, a tutorial review"
- Proceedings of the IEEE
- Vol-63, No. 4, April 1975
-
-\*---------------------------------------------------------------------------*/
-
-void levinson_durbin(
- float R[], /* order+1 autocorrelation coeff */
- float lpcs[], /* order+1 LPC's */
- int order /* order of the LPC analysis */
-)
-{
- float E[LPC_MAX+1];
- float k[LPC_MAX+1];
- float a[LPC_MAX+1][LPC_MAX+1];
- float sum;
- int i,j; /* loop variables */
-
- E[0] = R[0]; /* Equation 38a, Makhoul */
-
- for(i=1; i<=order; i++) {
- sum = 0.0;
- for(j=1; j<=i-1; j++)
- sum += a[i-1][j]*R[i-j];
- k[i] = -1.0*(R[i] + sum)/E[i-1]; /* Equation 38b, Makhoul */
- if (fabsf(k[i]) > 1.0)
- k[i] = 0.0;
-
- a[i][i] = k[i];
-
- for(j=1; j<=i-1; j++)
- a[i][j] = a[i-1][j] + k[i]*a[i-1][i-j]; /* Equation 38c, Makhoul */
-
- E[i] = (1-k[i]*k[i])*E[i-1]; /* 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<Nsam; i++) {
- res[i] = 0.0;
- for(j=0; j<=order; j++)
- res[i] += Sn[i-j]*a[j];
- }
-}
-
-/*---------------------------------------------------------------------------*\
-
- synthesis_filter()
-
- C version of the Speech Synthesis Filter, 1/A(z). Given an array of
- residual or excitation samples, and the the LP filter coefficients, this
- function will produce an array of speech samples. This filter structure is
- IIR.
-
- The synthesis filter has memory as well, this is treated in the same way
- as the memory for the inverse filter (see inverse_filter() notes above).
- The difference is that the memory for the synthesis filter is stored in
- the output array, wheras the memory of the inverse filter is stored in the
- input array.
-
- Note: the calling function must update the filter memory.
-
-\*---------------------------------------------------------------------------*/
-
-void synthesis_filter(
- float res[], /* Nsam input residual (excitation) samples */
- float a[], /* LPCs for this frame of speech samples */
- int Nsam, /* number of speech samples */
- int order, /* LPC order */
- float Sn_[] /* Nsam output synthesised speech samples */
-)
-{
- int i,j; /* loop variables */
-
- /* Filter Nsam samples */
-
- for(i=0; i<Nsam; i++) {
- Sn_[i] = res[i]*a[0];
- for(j=1; j<=order; j++)
- Sn_[i] -= Sn_[i-j]*a[j];
- }
-}
-
-/*---------------------------------------------------------------------------*\
-
- find_aks()
-
- This function takes a frame of samples, and determines the linear
- prediction coefficients for that frame of samples.
-
-\*---------------------------------------------------------------------------*/
-
-void find_aks(
- float Sn[], /* Nsam samples with order sample memory */
- float a[], /* order+1 LPCs with first coeff 1.0 */
- int Nsam, /* number of input speech samples */
- int order, /* order of the LPC analysis */
- float *E /* residual energy */
-)
-{
- float Wn[LPC_MAX_N]; /* windowed frame of Nsam speech samples */
- float R[LPC_MAX+1]; /* order+1 autocorrelation values of Sn[] */
- int i;
-
- assert(order < LPC_MAX);
- assert(Nsam < LPC_MAX_N);
-
- hanning_window(Sn,Wn,Nsam);
- autocorrelate(Wn,R,Nsam,order);
- levinson_durbin(R,a,order);
-
- *E = 0.0;
- for(i=0; i<=order; i++)
- *E += a[i]*R[i];
- if (*E < 0.0)
- *E = 1E-12;
-}
-
-/*---------------------------------------------------------------------------*\
-
- weight()
-
- Weights a vector of LPCs.
-
-\*---------------------------------------------------------------------------*/
-
-void weight(
- float ak[], /* vector of order+1 LPCs */
- float gamma, /* weighting factor */
- int order, /* num LPCs (excluding leading 1.0) */
- float akw[] /* weighted vector of order+1 LPCs */
-)
-{
- int i;
-
- for(i=1; i<=order; i++)
- akw[i] = ak[i]*powf(gamma,(float)i);
-}
-