Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: third_party/opus/src/celt/celt_lpc.c

Issue 2962373002: [Opus] Update to v1.2.1 (Closed)
Patch Set: Include minor updates including fix for win_clang Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* Copyright (c) 2009-2010 Xiph.Org Foundation 1 /* Copyright (c) 2009-2010 Xiph.Org Foundation
2 Written by Jean-Marc Valin */ 2 Written by Jean-Marc Valin */
3 /* 3 /*
4 Redistribution and use in source and binary forms, with or without 4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions 5 modification, are permitted provided that the following conditions
6 are met: 6 are met:
7 7
8 - Redistributions of source code must retain the above copyright 8 - Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer. 9 notice, this list of conditions and the following disclaimer.
10 10
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 } 82 }
83 } 83 }
84 #ifdef FIXED_POINT 84 #ifdef FIXED_POINT
85 for (i=0;i<p;i++) 85 for (i=0;i<p;i++)
86 _lpc[i] = ROUND16(lpc[i],16); 86 _lpc[i] = ROUND16(lpc[i],16);
87 #endif 87 #endif
88 } 88 }
89 89
90 90
91 void celt_fir_c( 91 void celt_fir_c(
92 const opus_val16 *_x, 92 const opus_val16 *x,
93 const opus_val16 *num, 93 const opus_val16 *num,
94 opus_val16 *_y, 94 opus_val16 *y,
95 int N, 95 int N,
96 int ord, 96 int ord,
97 opus_val16 *mem,
98 int arch) 97 int arch)
99 { 98 {
100 int i,j; 99 int i,j;
101 VARDECL(opus_val16, rnum); 100 VARDECL(opus_val16, rnum);
102 VARDECL(opus_val16, x);
103 SAVE_STACK; 101 SAVE_STACK;
104 102
105 ALLOC(rnum, ord, opus_val16); 103 ALLOC(rnum, ord, opus_val16);
106 ALLOC(x, N+ord, opus_val16);
107 for(i=0;i<ord;i++) 104 for(i=0;i<ord;i++)
108 rnum[i] = num[ord-i-1]; 105 rnum[i] = num[ord-i-1];
109 for(i=0;i<ord;i++)
110 x[i] = mem[ord-i-1];
111 for (i=0;i<N;i++)
112 x[i+ord]=_x[i];
113 for(i=0;i<ord;i++)
114 mem[i] = _x[N-i-1];
115 #ifdef SMALL_FOOTPRINT
116 (void)arch;
117 for (i=0;i<N;i++)
118 {
119 opus_val32 sum = SHL32(EXTEND32(_x[i]), SIG_SHIFT);
120 for (j=0;j<ord;j++)
121 {
122 sum = MAC16_16(sum,rnum[j],x[i+j]);
123 }
124 _y[i] = SATURATE16(PSHR32(sum, SIG_SHIFT));
125 }
126 #else
127 for (i=0;i<N-3;i+=4) 106 for (i=0;i<N-3;i+=4)
128 { 107 {
129 opus_val32 sum[4]={0,0,0,0}; 108 opus_val32 sum[4];
130 xcorr_kernel(rnum, x+i, sum, ord, arch); 109 sum[0] = SHL32(EXTEND32(x[i ]), SIG_SHIFT);
131 _y[i ] = SATURATE16(ADD32(EXTEND32(_x[i ]), PSHR32(sum[0], SIG_SHIFT))); 110 sum[1] = SHL32(EXTEND32(x[i+1]), SIG_SHIFT),
132 _y[i+1] = SATURATE16(ADD32(EXTEND32(_x[i+1]), PSHR32(sum[1], SIG_SHIFT))); 111 sum[2] = SHL32(EXTEND32(x[i+2]), SIG_SHIFT);
133 _y[i+2] = SATURATE16(ADD32(EXTEND32(_x[i+2]), PSHR32(sum[2], SIG_SHIFT))); 112 sum[3] = SHL32(EXTEND32(x[i+3]), SIG_SHIFT);
134 _y[i+3] = SATURATE16(ADD32(EXTEND32(_x[i+3]), PSHR32(sum[3], SIG_SHIFT))); 113 xcorr_kernel(rnum, x+i-ord, sum, ord, arch);
114 y[i ] = ROUND16(sum[0], SIG_SHIFT);
115 y[i+1] = ROUND16(sum[1], SIG_SHIFT);
116 y[i+2] = ROUND16(sum[2], SIG_SHIFT);
117 y[i+3] = ROUND16(sum[3], SIG_SHIFT);
135 } 118 }
136 for (;i<N;i++) 119 for (;i<N;i++)
137 { 120 {
138 opus_val32 sum = 0; 121 opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
139 for (j=0;j<ord;j++) 122 for (j=0;j<ord;j++)
140 sum = MAC16_16(sum,rnum[j],x[i+j]); 123 sum = MAC16_16(sum,rnum[j],x[i+j-ord]);
141 _y[i] = SATURATE16(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT))); 124 y[i] = ROUND16(sum, SIG_SHIFT);
142 } 125 }
143 #endif
144 RESTORE_STACK; 126 RESTORE_STACK;
145 } 127 }
146 128
147 void celt_iir(const opus_val32 *_x, 129 void celt_iir(const opus_val32 *_x,
148 const opus_val16 *den, 130 const opus_val16 *den,
149 opus_val32 *_y, 131 opus_val32 *_y,
150 int N, 132 int N,
151 int ord, 133 int ord,
152 opus_val16 *mem, 134 opus_val16 *mem,
153 int arch) 135 int arch)
154 { 136 {
155 #ifdef SMALL_FOOTPRINT 137 #ifdef SMALL_FOOTPRINT
156 int i,j; 138 int i,j;
157 (void)arch; 139 (void)arch;
158 for (i=0;i<N;i++) 140 for (i=0;i<N;i++)
159 { 141 {
160 opus_val32 sum = _x[i]; 142 opus_val32 sum = _x[i];
161 for (j=0;j<ord;j++) 143 for (j=0;j<ord;j++)
162 { 144 {
163 sum -= MULT16_16(den[j],mem[j]); 145 sum -= MULT16_16(den[j],mem[j]);
164 } 146 }
165 for (j=ord-1;j>=1;j--) 147 for (j=ord-1;j>=1;j--)
166 { 148 {
167 mem[j]=mem[j-1]; 149 mem[j]=mem[j-1];
168 } 150 }
169 mem[0] = ROUND16(sum,SIG_SHIFT); 151 mem[0] = SROUND16(sum, SIG_SHIFT);
170 _y[i] = sum; 152 _y[i] = sum;
171 } 153 }
172 #else 154 #else
173 int i,j; 155 int i,j;
174 VARDECL(opus_val16, rden); 156 VARDECL(opus_val16, rden);
175 VARDECL(opus_val16, y); 157 VARDECL(opus_val16, y);
176 SAVE_STACK; 158 SAVE_STACK;
177 159
178 celt_assert((ord&3)==0); 160 celt_assert((ord&3)==0);
179 ALLOC(rden, ord, opus_val16); 161 ALLOC(rden, ord, opus_val16);
180 ALLOC(y, N+ord, opus_val16); 162 ALLOC(y, N+ord, opus_val16);
181 for(i=0;i<ord;i++) 163 for(i=0;i<ord;i++)
182 rden[i] = den[ord-i-1]; 164 rden[i] = den[ord-i-1];
183 for(i=0;i<ord;i++) 165 for(i=0;i<ord;i++)
184 y[i] = -mem[ord-i-1]; 166 y[i] = -mem[ord-i-1];
185 for(;i<N+ord;i++) 167 for(;i<N+ord;i++)
186 y[i]=0; 168 y[i]=0;
187 for (i=0;i<N-3;i+=4) 169 for (i=0;i<N-3;i+=4)
188 { 170 {
189 /* Unroll by 4 as if it were an FIR filter */ 171 /* Unroll by 4 as if it were an FIR filter */
190 opus_val32 sum[4]; 172 opus_val32 sum[4];
191 sum[0]=_x[i]; 173 sum[0]=_x[i];
192 sum[1]=_x[i+1]; 174 sum[1]=_x[i+1];
193 sum[2]=_x[i+2]; 175 sum[2]=_x[i+2];
194 sum[3]=_x[i+3]; 176 sum[3]=_x[i+3];
195 xcorr_kernel(rden, y+i, sum, ord, arch); 177 xcorr_kernel(rden, y+i, sum, ord, arch);
196 178
197 /* Patch up the result to compensate for the fact that this is an IIR */ 179 /* Patch up the result to compensate for the fact that this is an IIR */
198 y[i+ord ] = -ROUND16(sum[0],SIG_SHIFT); 180 y[i+ord ] = -SROUND16(sum[0],SIG_SHIFT);
199 _y[i ] = sum[0]; 181 _y[i ] = sum[0];
200 sum[1] = MAC16_16(sum[1], y[i+ord ], den[0]); 182 sum[1] = MAC16_16(sum[1], y[i+ord ], den[0]);
201 y[i+ord+1] = -ROUND16(sum[1],SIG_SHIFT); 183 y[i+ord+1] = -SROUND16(sum[1],SIG_SHIFT);
202 _y[i+1] = sum[1]; 184 _y[i+1] = sum[1];
203 sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]); 185 sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]);
204 sum[2] = MAC16_16(sum[2], y[i+ord ], den[1]); 186 sum[2] = MAC16_16(sum[2], y[i+ord ], den[1]);
205 y[i+ord+2] = -ROUND16(sum[2],SIG_SHIFT); 187 y[i+ord+2] = -SROUND16(sum[2],SIG_SHIFT);
206 _y[i+2] = sum[2]; 188 _y[i+2] = sum[2];
207 189
208 sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]); 190 sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]);
209 sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]); 191 sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]);
210 sum[3] = MAC16_16(sum[3], y[i+ord ], den[2]); 192 sum[3] = MAC16_16(sum[3], y[i+ord ], den[2]);
211 y[i+ord+3] = -ROUND16(sum[3],SIG_SHIFT); 193 y[i+ord+3] = -SROUND16(sum[3],SIG_SHIFT);
212 _y[i+3] = sum[3]; 194 _y[i+3] = sum[3];
213 } 195 }
214 for (;i<N;i++) 196 for (;i<N;i++)
215 { 197 {
216 opus_val32 sum = _x[i]; 198 opus_val32 sum = _x[i];
217 for (j=0;j<ord;j++) 199 for (j=0;j<ord;j++)
218 sum -= MULT16_16(rden[j],y[i+j]); 200 sum -= MULT16_16(rden[j],y[i+j]);
219 y[i+ord] = ROUND16(sum,SIG_SHIFT); 201 y[i+ord] = SROUND16(sum,SIG_SHIFT);
220 _y[i] = sum; 202 _y[i] = sum;
221 } 203 }
222 for(i=0;i<ord;i++) 204 for(i=0;i<ord;i++)
223 mem[i] = _y[N-i-1]; 205 mem[i] = _y[N-i-1];
224 RESTORE_STACK; 206 RESTORE_STACK;
225 #endif 207 #endif
226 } 208 }
227 209
228 int _celt_autocorr( 210 int _celt_autocorr(
229 const opus_val16 *x, /* in: [0...n-1] samples x */ 211 const opus_val16 *x, /* in: [0...n-1] samples x */
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 shift2++; 287 shift2++;
306 for (i=0;i<=lag;i++) 288 for (i=0;i<=lag;i++)
307 ac[i] = SHR32(ac[i], shift2); 289 ac[i] = SHR32(ac[i], shift2);
308 shift += shift2; 290 shift += shift2;
309 } 291 }
310 #endif 292 #endif
311 293
312 RESTORE_STACK; 294 RESTORE_STACK;
313 return shift; 295 return shift;
314 } 296 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698