/src/speex/libspeex/lpc.c
Line | Count | Source |
1 | | /* |
2 | | Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, |
3 | | Technische Universitaet Berlin |
4 | | |
5 | | Any use of this software is permitted provided that this notice is not |
6 | | removed and that neither the authors nor the Technische Universitaet Berlin |
7 | | are deemed to have made any representations as to the suitability of this |
8 | | software for any purpose nor are held responsible for any defects of |
9 | | this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. |
10 | | |
11 | | As a matter of courtesy, the authors request to be informed about uses |
12 | | this software has found, about bugs in this software, and about any |
13 | | improvements that may be of general interest. |
14 | | |
15 | | Berlin, 28.11.1994 |
16 | | Jutta Degener |
17 | | Carsten Bormann |
18 | | |
19 | | |
20 | | Code modified by Jean-Marc Valin |
21 | | |
22 | | Speex License: |
23 | | |
24 | | Redistribution and use in source and binary forms, with or without |
25 | | modification, are permitted provided that the following conditions |
26 | | are met: |
27 | | |
28 | | - Redistributions of source code must retain the above copyright |
29 | | notice, this list of conditions and the following disclaimer. |
30 | | |
31 | | - Redistributions in binary form must reproduce the above copyright |
32 | | notice, this list of conditions and the following disclaimer in the |
33 | | documentation and/or other materials provided with the distribution. |
34 | | |
35 | | - Neither the name of the Xiph.org Foundation nor the names of its |
36 | | contributors may be used to endorse or promote products derived from |
37 | | this software without specific prior written permission. |
38 | | |
39 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
40 | | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
41 | | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
42 | | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
43 | | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
44 | | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
45 | | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
46 | | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
47 | | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
48 | | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
49 | | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
50 | | */ |
51 | | |
52 | | #ifdef HAVE_CONFIG_H |
53 | | #include "config.h" |
54 | | #endif |
55 | | |
56 | | #ifndef DISABLE_ENCODER |
57 | | |
58 | | #include "lpc.h" |
59 | | |
60 | | #ifdef BFIN_ASM |
61 | | #include "lpc_bfin.h" |
62 | | #endif |
63 | | |
64 | | /* LPC analysis |
65 | | * |
66 | | * The next two functions calculate linear prediction coefficients |
67 | | * and/or the related reflection coefficients from the first P_MAX+1 |
68 | | * values of the autocorrelation function. |
69 | | */ |
70 | | |
71 | | /* Invented by N. Levinson in 1947, modified by J. Durbin in 1959. |
72 | | */ |
73 | | |
74 | | /* returns minimum mean square error */ |
75 | | spx_word32_t _spx_lpc( |
76 | | spx_coef_t *lpc, /* out: [0...p-1] LPC coefficients */ |
77 | | const spx_word16_t *ac, /* in: [0...p] autocorrelation values */ |
78 | | int p |
79 | | ) |
80 | 27.3k | { |
81 | 27.3k | int i, j; |
82 | 27.3k | spx_word16_t r; |
83 | 27.3k | spx_word16_t error = ac[0]; |
84 | | |
85 | 287k | for (i = 0; i < p; i++) { |
86 | | |
87 | | /* Sum up this iteration's reflection coefficient */ |
88 | 259k | spx_word32_t rr = NEG32(SHL32(EXTEND32(ac[i + 1]),13)); |
89 | 1.37M | for (j = 0; j < i; j++) |
90 | 1.11M | rr = SUB32(rr,MULT16_16(lpc[j],ac[i - j])); |
91 | 259k | #ifdef FIXED_POINT |
92 | 259k | r = DIV32_16(rr+PSHR32(error,1),ADD16(error,8)); |
93 | | #else |
94 | | r = rr/(error+.003*ac[0]); |
95 | | #endif |
96 | | /* Update LPC coefficients and total error */ |
97 | 259k | lpc[i] = r; |
98 | 881k | for (j = 0; j < (i+1)>>1; j++) |
99 | 621k | { |
100 | 621k | spx_word16_t tmp1, tmp2; |
101 | | /* It could be that j == i-1-j, in which case, we're updating the same value twice, which is OK */ |
102 | 621k | tmp1 = lpc[j]; |
103 | 621k | tmp2 = lpc[i-1-j]; |
104 | 621k | lpc[j] = MAC16_16_P13(tmp1,r,tmp2); |
105 | 621k | lpc[i-1-j] = MAC16_16_P13(tmp2,r,tmp1); |
106 | 621k | } |
107 | | |
108 | 259k | error = SUB16(error,MULT16_16_Q13(r,MULT16_16_Q13(error,r))); |
109 | 259k | } |
110 | 27.3k | return error; |
111 | 27.3k | } |
112 | | |
113 | | |
114 | | #ifdef FIXED_POINT |
115 | | |
116 | | /* Compute the autocorrelation |
117 | | * ,--, |
118 | | * ac(i) = > x(n) * x(n-i) for all n |
119 | | * `--' |
120 | | * for lags between 0 and lag-1, and x == 0 outside 0...n-1 |
121 | | */ |
122 | | |
123 | | #ifndef OVERRIDE_SPEEX_AUTOCORR |
124 | | void _spx_autocorr( |
125 | | const spx_word16_t *x, /* in: [0...n-1] samples x */ |
126 | | spx_word16_t *ac, /* out: [0...lag-1] ac values */ |
127 | | int lag, |
128 | | int n |
129 | | ) |
130 | 27.3k | { |
131 | 27.3k | spx_word32_t d; |
132 | 27.3k | int i, j; |
133 | 27.3k | spx_word32_t ac0=1; |
134 | 27.3k | int shift, ac_shift; |
135 | | |
136 | 5.81M | for (j=0;j<n;j++) |
137 | 5.78M | ac0 = ADD32(ac0,SHR32(MULT16_16(x[j],x[j]),8)); |
138 | 27.3k | ac0 = ADD32(ac0,n); |
139 | 27.3k | shift = 8; |
140 | 227k | while (shift && ac0<0x40000000) |
141 | 200k | { |
142 | 200k | shift--; |
143 | 200k | ac0 <<= 1; |
144 | 200k | } |
145 | 27.3k | ac_shift = 18; |
146 | 255k | while (ac_shift && ac0<0x40000000) |
147 | 228k | { |
148 | 228k | ac_shift--; |
149 | 228k | ac0 <<= 1; |
150 | 228k | } |
151 | | |
152 | | |
153 | 314k | for (i=0;i<lag;i++) |
154 | 287k | { |
155 | 287k | d=0; |
156 | 59.1M | for (j=i;j<n;j++) |
157 | 58.8M | { |
158 | 58.8M | d = ADD32(d,SHR32(MULT16_16(x[j],x[j-i]), shift)); |
159 | 58.8M | } |
160 | | |
161 | 287k | ac[i] = SHR32(d, ac_shift); |
162 | 287k | } |
163 | 27.3k | } |
164 | | #endif |
165 | | |
166 | | |
167 | | #else |
168 | | |
169 | | |
170 | | |
171 | | /* Compute the autocorrelation |
172 | | * ,--, |
173 | | * ac(i) = > x(n) * x(n-i) for all n |
174 | | * `--' |
175 | | * for lags between 0 and lag-1, and x == 0 outside 0...n-1 |
176 | | */ |
177 | | void _spx_autocorr( |
178 | | const spx_word16_t *x, /* in: [0...n-1] samples x */ |
179 | | float *ac, /* out: [0...lag-1] ac values */ |
180 | | int lag, |
181 | | int n |
182 | | ) |
183 | | { |
184 | | float d; |
185 | | int i; |
186 | | while (lag--) |
187 | | { |
188 | | for (i = lag, d = 0; i < n; i++) |
189 | | d += x[i] * x[i-lag]; |
190 | | ac[lag] = d; |
191 | | } |
192 | | ac[0] += 10; |
193 | | } |
194 | | |
195 | | #endif |
196 | | |
197 | | |
198 | | #endif /* DISABLE_ENCODER */ |