Mercurial > hg > sv-dependency-builds
comparison src/libvorbis-1.3.3/lib/lpc.c @ 1:05aa0afa9217
Bring in flac, ogg, vorbis
author | Chris Cannam |
---|---|
date | Tue, 19 Mar 2013 17:37:49 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:c7265573341e | 1:05aa0afa9217 |
---|---|
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 float vorbis_lpc_from_data(float *data,float *lpci,int n,int m){ | |
62 double *aut=alloca(sizeof(*aut)*(m+1)); | |
63 double *lpc=alloca(sizeof(*lpc)*(m)); | |
64 double error; | |
65 double epsilon; | |
66 int i,j; | |
67 | |
68 /* autocorrelation, p+1 lag coefficients */ | |
69 j=m+1; | |
70 while(j--){ | |
71 double d=0; /* double needed for accumulator depth */ | |
72 for(i=j;i<n;i++)d+=(double)data[i]*data[i-j]; | |
73 aut[j]=d; | |
74 } | |
75 | |
76 /* Generate lpc coefficients from autocorr values */ | |
77 | |
78 /* set our noise floor to about -100dB */ | |
79 error=aut[0] * (1. + 1e-10); | |
80 epsilon=1e-9*aut[0]+1e-10; | |
81 | |
82 for(i=0;i<m;i++){ | |
83 double r= -aut[i+1]; | |
84 | |
85 if(error<epsilon){ | |
86 memset(lpc+i,0,(m-i)*sizeof(*lpc)); | |
87 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 for(j=0;j<i;j++)r-=lpc[j]*aut[i-j]; | |
96 r/=error; | |
97 | |
98 /* Update LPC coefficients and total error */ | |
99 | |
100 lpc[i]=r; | |
101 for(j=0;j<i/2;j++){ | |
102 double tmp=lpc[j]; | |
103 | |
104 lpc[j]+=r*lpc[i-1-j]; | |
105 lpc[i-1-j]+=r*tmp; | |
106 } | |
107 if(i&1)lpc[j]+=lpc[j]*r; | |
108 | |
109 error*=1.-r*r; | |
110 | |
111 } | |
112 | |
113 done: | |
114 | |
115 /* slightly damp the filter */ | |
116 { | |
117 double g = .99; | |
118 double damp = g; | |
119 for(j=0;j<m;j++){ | |
120 lpc[j]*=damp; | |
121 damp*=g; | |
122 } | |
123 } | |
124 | |
125 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 return error; | |
131 } | |
132 | |
133 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 float *work=alloca(sizeof(*work)*(m+n)); | |
143 | |
144 if(!prime) | |
145 for(i=0;i<m;i++) | |
146 work[i]=0.f; | |
147 else | |
148 for(i=0;i<m;i++) | |
149 work[i]=prime[i]; | |
150 | |
151 for(i=0;i<n;i++){ | |
152 y=0; | |
153 o=i; | |
154 p=m; | |
155 for(j=0;j<m;j++) | |
156 y-=work[o++]*coeff[--p]; | |
157 | |
158 data[i]=work[o]=y; | |
159 } | |
160 } |