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

Side by Side Diff: celt/pitch.c

Issue 28553003: Updating Opus to a pre-release of 1.1 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/opus
Patch Set: Removing failing file Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « celt/pitch.h ('k') | celt/quant_bands.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Copyright (c) 2007-2008 CSIRO 1 /* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2009 Xiph.Org Foundation 2 Copyright (c) 2007-2009 Xiph.Org Foundation
3 Written by Jean-Marc Valin */ 3 Written by Jean-Marc Valin */
4 /** 4 /**
5 @file pitch.c 5 @file pitch.c
6 @brief Pitch analysis 6 @brief Pitch analysis
7 */ 7 */
8 8
9 /* 9 /*
10 Redistribution and use in source and binary forms, with or without 10 Redistribution and use in source and binary forms, with or without
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 best_den[1] = Syy; 95 best_den[1] = Syy;
96 best_pitch[1] = i; 96 best_pitch[1] = i;
97 } 97 }
98 } 98 }
99 } 99 }
100 Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y [i]),yshift); 100 Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y [i]),yshift);
101 Syy = MAX32(1, Syy); 101 Syy = MAX32(1, Syy);
102 } 102 }
103 } 103 }
104 104
105 static void celt_fir5(const opus_val16 *x,
106 const opus_val16 *num,
107 opus_val16 *y,
108 int N,
109 opus_val16 *mem)
110 {
111 int i;
112 opus_val16 num0, num1, num2, num3, num4;
113 opus_val32 mem0, mem1, mem2, mem3, mem4;
114 num0=num[0];
115 num1=num[1];
116 num2=num[2];
117 num3=num[3];
118 num4=num[4];
119 mem0=mem[0];
120 mem1=mem[1];
121 mem2=mem[2];
122 mem3=mem[3];
123 mem4=mem[4];
124 for (i=0;i<N;i++)
125 {
126 opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
127 sum = MAC16_16(sum,num0,mem0);
128 sum = MAC16_16(sum,num1,mem1);
129 sum = MAC16_16(sum,num2,mem2);
130 sum = MAC16_16(sum,num3,mem3);
131 sum = MAC16_16(sum,num4,mem4);
132 mem4 = mem3;
133 mem3 = mem2;
134 mem2 = mem1;
135 mem1 = mem0;
136 mem0 = x[i];
137 y[i] = ROUND16(sum, SIG_SHIFT);
138 }
139 mem[0]=mem0;
140 mem[1]=mem1;
141 mem[2]=mem2;
142 mem[3]=mem3;
143 mem[4]=mem4;
144 }
145
146
105 void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x _lp, 147 void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x _lp,
106 int len, int C) 148 int len, int C)
107 { 149 {
108 int i; 150 int i;
109 opus_val32 ac[5]; 151 opus_val32 ac[5];
110 opus_val16 tmp=Q15ONE; 152 opus_val16 tmp=Q15ONE;
111 opus_val16 lpc[4], mem[4]={0,0,0,0}; 153 opus_val16 lpc[4], mem[5]={0,0,0,0,0};
154 opus_val16 lpc2[5];
155 opus_val16 c1 = QCONST16(.8f,15);
112 #ifdef FIXED_POINT 156 #ifdef FIXED_POINT
113 int shift; 157 int shift;
114 opus_val32 maxabs = celt_maxabs32(x[0], len); 158 opus_val32 maxabs = celt_maxabs32(x[0], len);
115 if (C==2) 159 if (C==2)
116 { 160 {
117 opus_val32 maxabs_1 = celt_maxabs32(x[1], len); 161 opus_val32 maxabs_1 = celt_maxabs32(x[1], len);
118 maxabs = MAX32(maxabs, maxabs_1); 162 maxabs = MAX32(maxabs, maxabs_1);
119 } 163 }
120 if (maxabs<1) 164 if (maxabs<1)
121 maxabs=1; 165 maxabs=1;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 ac[i] -= ac[i]*(.008f*i)*(.008f*i); 198 ac[i] -= ac[i]*(.008f*i)*(.008f*i);
155 #endif 199 #endif
156 } 200 }
157 201
158 _celt_lpc(lpc, ac, 4); 202 _celt_lpc(lpc, ac, 4);
159 for (i=0;i<4;i++) 203 for (i=0;i<4;i++)
160 { 204 {
161 tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp); 205 tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp);
162 lpc[i] = MULT16_16_Q15(lpc[i], tmp); 206 lpc[i] = MULT16_16_Q15(lpc[i], tmp);
163 } 207 }
164 celt_fir(x_lp, lpc, x_lp, len>>1, 4, mem); 208 /* Add a zero */
165 209 lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT);
166 mem[0]=0; 210 lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]);
167 lpc[0]=QCONST16(.8f,12); 211 lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]);
168 celt_fir(x_lp, lpc, x_lp, len>>1, 1, mem); 212 lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]);
169 213 lpc2[4] = MULT16_16_Q15(c1,lpc[3]);
214 celt_fir5(x_lp, lpc2, x_lp, len>>1, mem);
170 } 215 }
171 216
217 #if 0 /* This is a simple version of the pitch correlation that should work
218 well on DSPs like Blackfin and TI C5x/C6x */
219
220 #ifdef FIXED_POINT
221 opus_val32
222 #else
223 void
224 #endif
225 celt_pitch_xcorr(opus_val16 *x, opus_val16 *y, opus_val32 *xcorr, int len, int m ax_pitch)
226 {
227 int i, j;
228 #ifdef FIXED_POINT
229 opus_val32 maxcorr=1;
230 #endif
231 for (i=0;i<max_pitch;i++)
232 {
233 opus_val32 sum = 0;
234 for (j=0;j<len;j++)
235 sum = MAC16_16(sum, x[j],y[i+j]);
236 xcorr[i] = sum;
237 #ifdef FIXED_POINT
238 maxcorr = MAX32(maxcorr, sum);
239 #endif
240 }
241 #ifdef FIXED_POINT
242 return maxcorr;
243 #endif
244 }
245
246 #else /* Unrolled version of the pitch correlation -- runs faster on x86 and ARM */
247
248 #ifdef FIXED_POINT
249 opus_val32
250 #else
251 void
252 #endif
253 celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch)
254 {
255 int i,j;
256 #ifdef FIXED_POINT
257 opus_val32 maxcorr=1;
258 #endif
259 for (i=0;i<max_pitch-3;i+=4)
260 {
261 opus_val32 sum[4]={0,0,0,0};
262 xcorr_kernel(_x, _y+i, sum, len);
263 xcorr[i]=sum[0];
264 xcorr[i+1]=sum[1];
265 xcorr[i+2]=sum[2];
266 xcorr[i+3]=sum[3];
267 #ifdef FIXED_POINT
268 sum[0] = MAX32(sum[0], sum[1]);
269 sum[2] = MAX32(sum[2], sum[3]);
270 sum[0] = MAX32(sum[0], sum[2]);
271 maxcorr = MAX32(maxcorr, sum[0]);
272 #endif
273 }
274 /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
275 for (;i<max_pitch;i++)
276 {
277 opus_val32 sum = 0;
278 for (j=0;j<len;j++)
279 sum = MAC16_16(sum, _x[j],_y[i+j]);
280 xcorr[i] = sum;
281 #ifdef FIXED_POINT
282 maxcorr = MAX32(maxcorr, sum);
283 #endif
284 }
285 #ifdef FIXED_POINT
286 return maxcorr;
287 #endif
288 }
289
290 #endif
172 void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR ICT y, 291 void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR ICT y,
173 int len, int max_pitch, int *pitch) 292 int len, int max_pitch, int *pitch)
174 { 293 {
175 int i, j; 294 int i, j;
176 int lag; 295 int lag;
177 int best_pitch[2]={0,0}; 296 int best_pitch[2]={0,0};
178 VARDECL(opus_val16, x_lp4); 297 VARDECL(opus_val16, x_lp4);
179 VARDECL(opus_val16, y_lp4); 298 VARDECL(opus_val16, y_lp4);
180 VARDECL(opus_val32, xcorr); 299 VARDECL(opus_val32, xcorr);
181 #ifdef FIXED_POINT 300 #ifdef FIXED_POINT
182 opus_val32 maxcorr=1; 301 opus_val32 maxcorr;
183 opus_val16 xmax, ymax; 302 opus_val32 xmax, ymax;
184 int shift=0; 303 int shift=0;
185 #endif 304 #endif
186 int offset; 305 int offset;
187 306
188 SAVE_STACK; 307 SAVE_STACK;
189 308
190 celt_assert(len>0); 309 celt_assert(len>0);
191 celt_assert(max_pitch>0); 310 celt_assert(max_pitch>0);
192 lag = len+max_pitch; 311 lag = len+max_pitch;
193 312
194 ALLOC(x_lp4, len>>2, opus_val16); 313 ALLOC(x_lp4, len>>2, opus_val16);
195 ALLOC(y_lp4, lag>>2, opus_val16); 314 ALLOC(y_lp4, lag>>2, opus_val16);
196 ALLOC(xcorr, max_pitch>>1, opus_val32); 315 ALLOC(xcorr, max_pitch>>1, opus_val32);
197 316
198 /* Downsample by 2 again */ 317 /* Downsample by 2 again */
199 for (j=0;j<len>>2;j++) 318 for (j=0;j<len>>2;j++)
200 x_lp4[j] = x_lp[2*j]; 319 x_lp4[j] = x_lp[2*j];
201 for (j=0;j<lag>>2;j++) 320 for (j=0;j<lag>>2;j++)
202 y_lp4[j] = y[2*j]; 321 y_lp4[j] = y[2*j];
203 322
204 #ifdef FIXED_POINT 323 #ifdef FIXED_POINT
205 xmax = celt_maxabs16(x_lp4, len>>2); 324 xmax = celt_maxabs16(x_lp4, len>>2);
206 ymax = celt_maxabs16(y_lp4, lag>>2); 325 ymax = celt_maxabs16(y_lp4, lag>>2);
207 shift = celt_ilog2(MAX16(1, MAX16(xmax, ymax)))-11; 326 shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11;
208 if (shift>0) 327 if (shift>0)
209 { 328 {
210 for (j=0;j<len>>2;j++) 329 for (j=0;j<len>>2;j++)
211 x_lp4[j] = SHR16(x_lp4[j], shift); 330 x_lp4[j] = SHR16(x_lp4[j], shift);
212 for (j=0;j<lag>>2;j++) 331 for (j=0;j<lag>>2;j++)
213 y_lp4[j] = SHR16(y_lp4[j], shift); 332 y_lp4[j] = SHR16(y_lp4[j], shift);
214 /* Use double the shift for a MAC */ 333 /* Use double the shift for a MAC */
215 shift *= 2; 334 shift *= 2;
216 } else { 335 } else {
217 shift = 0; 336 shift = 0;
218 } 337 }
219 #endif 338 #endif
220 339
221 /* Coarse search with 4x decimation */ 340 /* Coarse search with 4x decimation */
222 341
223 for (i=0;i<max_pitch>>2;i++)
224 {
225 opus_val32 sum = 0;
226 for (j=0;j<len>>2;j++)
227 sum = MAC16_16(sum, x_lp4[j],y_lp4[i+j]);
228 xcorr[i] = MAX32(-1, sum);
229 #ifdef FIXED_POINT 342 #ifdef FIXED_POINT
230 maxcorr = MAX32(maxcorr, sum); 343 maxcorr =
231 #endif 344 #endif
232 } 345 celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2);
346
233 find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch 347 find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch
234 #ifdef FIXED_POINT 348 #ifdef FIXED_POINT
235 , 0, maxcorr 349 , 0, maxcorr
236 #endif 350 #endif
237 ); 351 );
238 352
239 /* Finer search with 2x decimation */ 353 /* Finer search with 2x decimation */
240 #ifdef FIXED_POINT 354 #ifdef FIXED_POINT
241 maxcorr=1; 355 maxcorr=1;
242 #endif 356 #endif
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 RESTORE_STACK; 394 RESTORE_STACK;
281 } 395 }
282 396
283 static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3 , 2}; 397 static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3 , 2};
284 opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, 398 opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
285 int N, int *T0_, int prev_period, opus_val16 prev_gain) 399 int N, int *T0_, int prev_period, opus_val16 prev_gain)
286 { 400 {
287 int k, i, T, T0; 401 int k, i, T, T0;
288 opus_val16 g, g0; 402 opus_val16 g, g0;
289 opus_val16 pg; 403 opus_val16 pg;
290 opus_val32 xy,xx,yy; 404 opus_val32 xy,xx,yy,xy2;
291 opus_val32 xcorr[3]; 405 opus_val32 xcorr[3];
292 opus_val32 best_xy, best_yy; 406 opus_val32 best_xy, best_yy;
293 int offset; 407 int offset;
294 int minperiod0; 408 int minperiod0;
409 VARDECL(opus_val32, yy_lookup);
410 SAVE_STACK;
295 411
296 minperiod0 = minperiod; 412 minperiod0 = minperiod;
297 maxperiod /= 2; 413 maxperiod /= 2;
298 minperiod /= 2; 414 minperiod /= 2;
299 *T0_ /= 2; 415 *T0_ /= 2;
300 prev_period /= 2; 416 prev_period /= 2;
301 N /= 2; 417 N /= 2;
302 x += maxperiod; 418 x += maxperiod;
303 if (*T0_>=maxperiod) 419 if (*T0_>=maxperiod)
304 *T0_=maxperiod-1; 420 *T0_=maxperiod-1;
305 421
306 T = T0 = *T0_; 422 T = T0 = *T0_;
307 xx=xy=yy=0; 423 ALLOC(yy_lookup, maxperiod+1, opus_val32);
308 for (i=0;i<N;i++) 424 dual_inner_prod(x, x, x-T0, N, &xx, &xy);
425 yy_lookup[0] = xx;
426 yy=xx;
427 for (i=1;i<=maxperiod;i++)
309 { 428 {
310 xy = MAC16_16(xy, x[i], x[i-T0]); 429 yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]);
311 xx = MAC16_16(xx, x[i], x[i]); 430 yy_lookup[i] = MAX32(0, yy);
312 yy = MAC16_16(yy, x[i-T0],x[i-T0]);
313 } 431 }
432 yy = yy_lookup[T0];
314 best_xy = xy; 433 best_xy = xy;
315 best_yy = yy; 434 best_yy = yy;
316 #ifdef FIXED_POINT 435 #ifdef FIXED_POINT
317 { 436 {
318 opus_val32 x2y2; 437 opus_val32 x2y2;
319 int sh, t; 438 int sh, t;
320 x2y2 = 1+HALF32(MULT32_32_Q31(xx,yy)); 439 x2y2 = 1+HALF32(MULT32_32_Q31(xx,yy));
321 sh = celt_ilog2(x2y2)>>1; 440 sh = celt_ilog2(x2y2)>>1;
322 t = VSHR32(x2y2, 2*(sh-7)); 441 t = VSHR32(x2y2, 2*(sh-7));
323 g = g0 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1); 442 g = g0 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
324 } 443 }
325 #else 444 #else
326 g = g0 = xy/celt_sqrt(1+xx*yy); 445 g = g0 = xy/celt_sqrt(1+xx*yy);
327 #endif 446 #endif
328 /* Look for any pitch at T/k */ 447 /* Look for any pitch at T/k */
329 for (k=2;k<=15;k++) 448 for (k=2;k<=15;k++)
330 { 449 {
331 int T1, T1b; 450 int T1, T1b;
332 opus_val16 g1; 451 opus_val16 g1;
333 opus_val16 cont=0; 452 opus_val16 cont=0;
453 opus_val16 thresh;
334 T1 = (2*T0+k)/(2*k); 454 T1 = (2*T0+k)/(2*k);
335 if (T1 < minperiod) 455 if (T1 < minperiod)
336 break; 456 break;
337 /* Look for another strong correlation at T1b */ 457 /* Look for another strong correlation at T1b */
338 if (k==2) 458 if (k==2)
339 { 459 {
340 if (T1+T0>maxperiod) 460 if (T1+T0>maxperiod)
341 T1b = T0; 461 T1b = T0;
342 else 462 else
343 T1b = T0+T1; 463 T1b = T0+T1;
344 } else 464 } else
345 { 465 {
346 T1b = (2*second_check[k]*T0+k)/(2*k); 466 T1b = (2*second_check[k]*T0+k)/(2*k);
347 } 467 }
348 xy=yy=0; 468 dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2);
349 for (i=0;i<N;i++) 469 xy += xy2;
350 { 470 yy = yy_lookup[T1] + yy_lookup[T1b];
351 xy = MAC16_16(xy, x[i], x[i-T1]);
352 yy = MAC16_16(yy, x[i-T1], x[i-T1]);
353
354 xy = MAC16_16(xy, x[i], x[i-T1b]);
355 yy = MAC16_16(yy, x[i-T1b], x[i-T1b]);
356 }
357 #ifdef FIXED_POINT 471 #ifdef FIXED_POINT
358 { 472 {
359 opus_val32 x2y2; 473 opus_val32 x2y2;
360 int sh, t; 474 int sh, t;
361 x2y2 = 1+MULT32_32_Q31(xx,yy); 475 x2y2 = 1+MULT32_32_Q31(xx,yy);
362 sh = celt_ilog2(x2y2)>>1; 476 sh = celt_ilog2(x2y2)>>1;
363 t = VSHR32(x2y2, 2*(sh-7)); 477 t = VSHR32(x2y2, 2*(sh-7));
364 g1 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1); 478 g1 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
365 } 479 }
366 #else 480 #else
367 g1 = xy/celt_sqrt(1+2.f*xx*1.f*yy); 481 g1 = xy/celt_sqrt(1+2.f*xx*1.f*yy);
368 #endif 482 #endif
369 if (abs(T1-prev_period)<=1) 483 if (abs(T1-prev_period)<=1)
370 cont = prev_gain; 484 cont = prev_gain;
371 else if (abs(T1-prev_period)<=2 && 5*k*k < T0) 485 else if (abs(T1-prev_period)<=2 && 5*k*k < T0)
372 cont = HALF32(prev_gain); 486 cont = HALF32(prev_gain);
373 else 487 else
374 cont = 0; 488 cont = 0;
375 if (g1 > QCONST16(.3f,15) + MULT16_16_Q15(QCONST16(.4f,15),g0)-cont) 489 thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont);
490 /* Bias against very high pitch (very short period) to avoid false-positiv es
491 due to short-term correlation */
492 if (T1<3*minperiod)
493 thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-co nt);
494 else if (T1<2*minperiod)
495 thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-con t);
496 if (g1 > thresh)
376 { 497 {
377 best_xy = xy; 498 best_xy = xy;
378 best_yy = yy; 499 best_yy = yy;
379 T = T1; 500 T = T1;
380 g = g1; 501 g = g1;
381 } 502 }
382 } 503 }
383 best_xy = MAX32(0, best_xy); 504 best_xy = MAX32(0, best_xy);
384 if (best_yy <= best_xy) 505 if (best_yy <= best_xy)
385 pg = Q15ONE; 506 pg = Q15ONE;
(...skipping 13 matching lines...) Expand all
399 else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[ 2])) 520 else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[ 2]))
400 offset = -1; 521 offset = -1;
401 else 522 else
402 offset = 0; 523 offset = 0;
403 if (pg > g) 524 if (pg > g)
404 pg = g; 525 pg = g;
405 *T0_ = 2*T+offset; 526 *T0_ = 2*T+offset;
406 527
407 if (*T0_<minperiod0) 528 if (*T0_<minperiod0)
408 *T0_=minperiod0; 529 *T0_=minperiod0;
530 RESTORE_STACK;
409 return pg; 531 return pg;
410 } 532 }
OLDNEW
« no previous file with comments | « celt/pitch.h ('k') | celt/quant_bands.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698