/*
 * iLBC - a library for the iLBC codec
 *
 * helpfun.h - The iLBC low bit rate speech codec.
 *
 * Adapted by Steve Underwood <steveu@coppice.org> from the reference
 * iLBC code supplied in RFC3951.
 *
 * Original code Copyright (C) The Internet Society (2004).
 * All changes to produce this version Copyright (C) 2008 by Steve Underwood
 * All Rights Reserved.
 *
 * 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.
 *
 * $Id: helpfun.h,v 1.2 2008/03/06 12:27:38 steveu Exp $
 */

#ifndef __iLBC_HELPFUN_H
#define __iLBC_HELPFUN_H

void autocorr(float *r,         /* (o) autocorrelation vector */
              const float *x,   /* (i) data vector */
              int N,            /* (i) length of data vector */
              int order);       /* largest lag for calculated
                                 autocorrelations */

void window(float *z,           /* (o) the windowed data */
            const float *x,     /* (i) the original data vector */
            const float *y,     /* (i) the window */
            int N);             /* (i) length of all vectors */

void levdurb(float *a,          /* (o) lpc coefficient vector starting with 1.0 */
             float *k,          /* (o) reflection coefficients */
             float *r,          /* (i) autocorrelation vector */
             int order);        /* (i) order of lpc filter */

void interpolate(float *out,    /* (o) the interpolated vector */
                 float *in1,    /* (i) the first vector for the
                                       interpolation */
                 float *in2,    /* (i) the second vector for the
                                       interpolation */
                 float coef,    /* (i) interpolation weights */
                 int length);   /* (i) length of all vectors */

void bwexpand(float *out,       /* (o) the bandwidth expanded lpc coefficients */
              float *in,        /* (i) the lpc coefficients before bandwidth
                                       expansion */
              float coef,       /* (i) the bandwidth expansion factor */
              int length);      /* (i) the length of lpc coefficient vectors */

void vq(float *Xq,              /* (o) the quantized vector */
        int *index,             /* (o) the quantization index */
        const float *CB,        /* (i) the vector quantization codebook */
        float *X,               /* (i) the vector to quantize */
        int n_cb,               /* (i) the number of vectors in the codebook */
        int dim);               /* (i) the dimension of all vectors */

void SplitVQ(float *qX,             /* (o) the quantized vector */
             int *index,            /* (o) a vector of indexes for all vector
                                           codebooks in the split */
             float *X,              /* (i) the vector to quantize */
             const float *CB,       /* (i) the quantizer codebook */
             int nsplit,            /* the number of vector splits */
             const int *dim,        /* the dimension of X and qX */
             const int *cbsize);    /* the number of vectors in the codebook */

void sort_sq(float *xq,         /* (o) the quantized value */
             int *index,        /* (o) the quantization index */
             float x,           /* (i) the value to quantize */
             const float *cb,   /* (i) the quantization codebook */
             int cb_size);      /* (i) the size of the quantization codebook */

int LSF_check(                  /* (o) 1 for stable lsf vectors and 0 for nonstable ones */
              float *lsf,       /* (i) a table of lsf vectors */
              int dim,          /* (i) the dimension of each lsf vector */
              int NoAn);        /* (i) the number of lsf vectors in the table */

#endif
