1 /* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2009 Xiph.Org Foundation
3 Written by Jean-Marc Valin */
10 Redistribution and use in source and binary forms, with or without
11 modification, are permitted provided that the following conditions
14 - Redistributions of source code must retain the above copyright
15 notice, this list of conditions and the following disclaimer.
17 - Redistributions in binary form must reproduce the above copyright
18 notice, this list of conditions and the following disclaimer in the
19 documentation and/or other materials provided with the distribution.
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
25 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 #include "os_support.h"
41 #include "stack_alloc.h"
45 static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len,
46 int max_pitch, int *best_pitch
48 , int yshift, opus_val32 maxcorr
54 opus_val16 best_num[2];
55 opus_val32 best_den[2];
59 xshift = celt_ilog2(maxcorr)-14;
69 Syy = ADD32(Syy, SHR32(MULT16_16(y[j],y[j]), yshift));
70 for (i=0;i<max_pitch;i++)
76 xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift));
78 /* Considering the range of xcorr16, this should avoid both underflows
79 and overflows (inf) when squaring xcorr16 */
82 num = MULT16_16_Q15(xcorr16,xcorr16);
83 if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy))
85 if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy))
87 best_num[1] = best_num[0];
88 best_den[1] = best_den[0];
89 best_pitch[1] = best_pitch[0];
100 Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift);
105 static void celt_fir5(const opus_val16 *x,
106 const opus_val16 *num,
112 opus_val16 num0, num1, num2, num3, num4;
113 opus_val32 mem0, mem1, mem2, mem3, mem4;
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);
137 y[i] = ROUND16(sum, SIG_SHIFT);
147 void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
152 opus_val16 tmp=Q15ONE;
153 opus_val16 lpc[4], mem[5]={0,0,0,0,0};
155 opus_val16 c1 = QCONST16(.8f,15);
158 opus_val32 maxabs = celt_maxabs32(x[0], len);
161 opus_val32 maxabs_1 = celt_maxabs32(x[1], len);
162 maxabs = MAX32(maxabs, maxabs_1);
166 shift = celt_ilog2(maxabs)-10;
172 for (i=1;i<len>>1;i++)
173 x_lp[i] = SHR32(HALF32(HALF32(x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]), shift);
174 x_lp[0] = SHR32(HALF32(HALF32(x[0][1])+x[0][0]), shift);
177 for (i=1;i<len>>1;i++)
178 x_lp[i] += SHR32(HALF32(HALF32(x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]), shift);
179 x_lp[0] += SHR32(HALF32(HALF32(x[1][1])+x[1][0]), shift);
182 _celt_autocorr(x_lp, ac, NULL, 0,
185 /* Noise floor -40 dB */
187 ac[0] += SHR32(ac[0],13);
194 /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
196 ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
198 ac[i] -= ac[i]*(.008f*i)*(.008f*i);
202 _celt_lpc(lpc, ac, 4);
205 tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp);
206 lpc[i] = MULT16_16_Q15(lpc[i], tmp);
209 lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT);
210 lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]);
211 lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]);
212 lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]);
213 lpc2[4] = MULT16_16_Q15(c1,lpc[3]);
214 celt_fir5(x_lp, lpc2, x_lp, len>>1, mem);
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 */
225 celt_pitch_xcorr(opus_val16 *x, opus_val16 *y, opus_val32 *xcorr, int len, int max_pitch)
229 opus_val32 maxcorr=1;
231 for (i=0;i<max_pitch;i++)
235 sum = MAC16_16(sum, x[j],y[i+j]);
238 maxcorr = MAX32(maxcorr, sum);
246 #else /* Unrolled version of the pitch correlation -- runs faster on x86 and ARM */
253 celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch)
257 opus_val32 maxcorr=1;
259 for (i=0;i<max_pitch-3;i+=4)
261 opus_val32 sum[4]={0,0,0,0};
262 xcorr_kernel(_x, _y+i, sum, len);
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]);
274 /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
275 for (;i<max_pitch;i++)
279 sum = MAC16_16(sum, _x[j],_y[i+j]);
282 maxcorr = MAX32(maxcorr, sum);
291 void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y,
292 int len, int max_pitch, int *pitch)
296 int best_pitch[2]={0,0};
297 VARDECL(opus_val16, x_lp4);
298 VARDECL(opus_val16, y_lp4);
299 VARDECL(opus_val32, xcorr);
302 opus_val32 xmax, ymax;
310 celt_assert(max_pitch>0);
313 ALLOC(x_lp4, len>>2, opus_val16);
314 ALLOC(y_lp4, lag>>2, opus_val16);
315 ALLOC(xcorr, max_pitch>>1, opus_val32);
317 /* Downsample by 2 again */
318 for (j=0;j<len>>2;j++)
319 x_lp4[j] = x_lp[2*j];
320 for (j=0;j<lag>>2;j++)
324 xmax = celt_maxabs16(x_lp4, len>>2);
325 ymax = celt_maxabs16(y_lp4, lag>>2);
326 shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11;
329 for (j=0;j<len>>2;j++)
330 x_lp4[j] = SHR16(x_lp4[j], shift);
331 for (j=0;j<lag>>2;j++)
332 y_lp4[j] = SHR16(y_lp4[j], shift);
333 /* Use double the shift for a MAC */
340 /* Coarse search with 4x decimation */
345 celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2);
347 find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch
353 /* Finer search with 2x decimation */
357 for (i=0;i<max_pitch>>1;i++)
361 if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2)
363 for (j=0;j<len>>1;j++)
364 sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift);
365 xcorr[i] = MAX32(-1, sum);
367 maxcorr = MAX32(maxcorr, sum);
370 find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch
376 /* Refine by pseudo-interpolation */
377 if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1)
380 a = xcorr[best_pitch[0]-1];
381 b = xcorr[best_pitch[0]];
382 c = xcorr[best_pitch[0]+1];
383 if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a))
385 else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c))
392 *pitch = 2*best_pitch[0]-offset;
397 static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2};
398 opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
399 int N, int *T0_, int prev_period, opus_val16 prev_gain)
404 opus_val32 xy,xx,yy,xy2;
406 opus_val32 best_xy, best_yy;
409 VARDECL(opus_val32, yy_lookup);
412 minperiod0 = minperiod;
423 ALLOC(yy_lookup, maxperiod+1, opus_val32);
424 dual_inner_prod(x, x, x-T0, N, &xx, &xy);
427 for (i=1;i<=maxperiod;i++)
429 yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]);
430 yy_lookup[i] = MAX32(0, yy);
439 x2y2 = 1+HALF32(MULT32_32_Q31(xx,yy));
440 sh = celt_ilog2(x2y2)>>1;
441 t = VSHR32(x2y2, 2*(sh-7));
442 g = g0 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
445 g = g0 = xy/celt_sqrt(1+xx*yy);
447 /* Look for any pitch at T/k */
457 /* Look for another strong correlation at T1b */
466 T1b = (2*second_check[k]*T0+k)/(2*k);
468 dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2);
470 yy = yy_lookup[T1] + yy_lookup[T1b];
475 x2y2 = 1+MULT32_32_Q31(xx,yy);
476 sh = celt_ilog2(x2y2)>>1;
477 t = VSHR32(x2y2, 2*(sh-7));
478 g1 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
481 g1 = xy/celt_sqrt(1+2.f*xx*1.f*yy);
483 if (abs(T1-prev_period)<=1)
485 else if (abs(T1-prev_period)<=2 && 5*k*k < T0)
486 cont = HALF32(prev_gain);
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-positives
491 due to short-term correlation */
493 thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont);
494 else if (T1<2*minperiod)
495 thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont);
504 best_xy = MAX32(0, best_xy);
505 if (best_yy <= best_xy)
508 pg = SHR32(frac_div32(best_xy,best_yy+1),16);
515 xy = MAC16_16(xy, x[i], x[i-T1]);
518 if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0]))
520 else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2]))