LCOV - app.info - media/libvorbis/lib/vorbis_lpc.c

LCOV - code coverage report
| Current view: | directory - media/libvorbis/lib - vorbis_lpc.c (source / functions) |  | Found | Hit | Coverage |
| Test: | app.info | Lines: | 46 | 0 | 0.0 %
| Date: | 2012-06-02 | Functions: | 2 | 0 | 0.0 %

           1                 : /********************************************************************
           2                 :  *                                                                  *
           3                 :  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
           4                 :  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
           5                 :  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
           6                 :  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
           7                 :  *                                                                  *
           8                 :  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
           9                 :  * by the Xiph.Org Foundation http://www.xiph.org/                  *
          10                 :  *                                                                  *
          11                 :  ********************************************************************
          12                 :
          13                 :   function: LPC low level routines
          14                 :   last mod: $Id: lpc.c 16227 2009-07-08 06:58:46Z xiphmont $
          15                 :
          16                 :  ********************************************************************/
          17                 :
          18                 : /* Some of these routines (autocorrelator, LPC coefficient estimator)
          19                 :    are derived from code written by Jutta Degener and Carsten Bormann;
          20                 :    thus we include their copyright below.  The entirety of this file
          21                 :    is freely redistributable on the condition that both of these
          22                 :    copyright notices are preserved without modification.  */
          23                 :
          24                 : /* Preserved Copyright: *********************************************/
          25                 :
          26                 : /* Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
          27                 : Technische Universita"t Berlin
          28                 :
          29                 : Any use of this software is permitted provided that this notice is not
          30                 : removed and that neither the authors nor the Technische Universita"t
          31                 : Berlin are deemed to have made any representations as to the
          32                 : suitability of this software for any purpose nor are held responsible
          33                 : for any defects of this software. THERE IS ABSOLUTELY NO WARRANTY FOR
          34                 : THIS SOFTWARE.
          35                 :
          36                 : As a matter of courtesy, the authors request to be informed about uses
          37                 : this software has found, about bugs in this software, and about any
          38                 : improvements that may be of general interest.
          39                 :
          40                 : Berlin, 28.11.1994
          41                 : Jutta Degener
          42                 : Carsten Bormann
          43                 :
          44                 : *********************************************************************/
          45                 :
          46                 : #include <stdlib.h>
          47                 : #include <string.h>
          48                 : #include <math.h>
          49                 : #include "os.h"
          50                 : #include "smallft.h"
          51                 : #include "lpc.h"
          52                 : #include "scales.h"
          53                 : #include "misc.h"
          54                 :
          55                 : /* Autocorrelation LPC coeff generation algorithm invented by
          56                 :    N. Levinson in 1947, modified by J. Durbin in 1959. */
          57                 :
          58                 : /* Input : n elements of time doamin data
          59                 :    Output: m lpc coefficients, excitation energy */
          60                 :
          61               0 : float vorbis_lpc_from_data(float *data,float *lpci,int n,int m){
          62               0 :   double *aut=alloca(sizeof(*aut)*(m+1));
          63               0 :   double *lpc=alloca(sizeof(*lpc)*(m));
          64                 :   double error;
          65                 :   double epsilon;
          66                 :   int i,j;
          67                 :
          68                 :   /* autocorrelation, p+1 lag coefficients */
          69               0 :   j=m+1;
          70               0 :   while(j--){
          71               0 :     double d=0; /* double needed for accumulator depth */
          72               0 :     for(i=j;i<n;i++)d+=(double)data[i]*data[i-j];
          73               0 :     aut[j]=d;
          74                 :   }
          75                 :
          76                 :   /* Generate lpc coefficients from autocorr values */
          77                 :
          78                 :   /* set our noise floor to about -100dB */
          79               0 :   error=aut[0] * (1. + 1e-10);
          80               0 :   epsilon=1e-9*aut[0]+1e-10;
          81                 :
          82               0 :   for(i=0;i<m;i++){
          83               0 :     double r= -aut[i+1];
          84                 :
          85               0 :     if(error<epsilon){
          86               0 :       memset(lpc+i,0,(m-i)*sizeof(*lpc));
          87               0 :       goto done;
          88                 :     }
          89                 :
          90                 :     /* Sum up this iteration's reflection coefficient; note that in
          91                 :        Vorbis we don't save it.  If anyone wants to recycle this code
          92                 :        and needs reflection coefficients, save the results of 'r' from
          93                 :        each iteration. */
          94                 :
          95               0 :     for(j=0;j<i;j++)r-=lpc[j]*aut[i-j];
          96               0 :     r/=error;
          97                 :
          98                 :     /* Update LPC coefficients and total error */
          99                 :
         100               0 :     lpc[i]=r;
         101               0 :     for(j=0;j<i/2;j++){
         102               0 :       double tmp=lpc[j];
         103                 :
         104               0 :       lpc[j]+=r*lpc[i-1-j];
         105               0 :       lpc[i-1-j]+=r*tmp;
         106                 :     }
         107               0 :     if(i&1)lpc[j]+=lpc[j]*r;
         108                 :
         109               0 :     error*=1.-r*r;
         110                 :
         111                 :   }
         112                 :
         113                 :  done:
         114                 :
         115                 :   /* slightly damp the filter */
         116                 :   {
         117               0 :     double g = .99;
         118               0 :     double damp = g;
         119               0 :     for(j=0;j<m;j++){
         120               0 :       lpc[j]*=damp;
         121               0 :       damp*=g;
         122                 :     }
         123                 :   }
         124                 :
         125               0 :   for(j=0;j<m;j++)lpci[j]=(float)lpc[j];
         126                 :
         127                 :   /* we need the error value to know how big an impulse to hit the
         128                 :      filter with later */
         129                 :
         130               0 :   return error;
         131                 : }
         132                 :
         133               0 : void vorbis_lpc_predict(float *coeff,float *prime,int m,
         134                 :                      float *data,long n){
         135                 :
         136                 :   /* in: coeff[0...m-1] LPC coefficients
         137                 :          prime[0...m-1] initial values (allocated size of n+m-1)
         138                 :     out: data[0...n-1] data samples */
         139                 :
         140                 :   long i,j,o,p;
         141                 :   float y;
         142               0 :   float *work=alloca(sizeof(*work)*(m+n));
         143                 :
         144               0 :   if(!prime)
         145               0 :     for(i=0;i<m;i++)
         146               0 :       work[i]=0.f;
         147                 :   else
         148               0 :     for(i=0;i<m;i++)
         149               0 :       work[i]=prime[i];
         150                 :
         151               0 :   for(i=0;i<n;i++){
         152               0 :     y=0;
         153               0 :     o=i;
         154               0 :     p=m;
         155               0 :     for(j=0;j<m;j++)
         156               0 :       y-=work[o++]*coeff[--p];
         157                 :
         158               0 :     data[i]=work[o]=y;
         159                 :   }
         160               0 : }

Generated by: LCOV version 1.7