diff --git a/libcelt/pitch.c b/libcelt/pitch.c index abbe20329b8a10fa9714e13b72ea14c3d37e8bde..df4ddba40e94f36aa68c710b8eddbc40b0738745 100644 --- a/libcelt/pitch.c +++ b/libcelt/pitch.c @@ -234,20 +234,34 @@ float remove_doubling(celt_word32 *pre[2], int COMBFILTER_MAXPERIOD, int N, int g = g0 = xy/sqrt(1+xx*yy); pg = xy/(1+yy); k0 = 1; - for (k=2;k<=5;k++) + for (k=2;k<=6;k++) { - int T1; + int T1, T1b; float g1; T1 = (2*T0+k)/(2*k); - xx=xy=yy=0; + if (k==2) + { + if (T1+T0>COMBFILTER_MAXPERIOD) + T1b = T0; + else + T1b = T0+T1; + } else if (k==4) + { + T1b = (6*T0+k)/(2*k); + } else { + T1b = (4*T0+k)/(2*k); + } + xy=yy=0; for (i=0;i<N;i++) { xy += x[i]*x[i-T1]; - xx += x[i]*x[i]; yy += x[i-T1]*x[i-T1]; + + xy += x[i]*x[i-T1b]; + yy += x[i-T1b]*x[i-T1b]; } - g1 = xy/sqrt(1+xx*yy); - if (T1 > 50 && (g1 > .85*g0 || g1 > .8 || (k==2*k0 && g1 > .7))) + g1 = xy/sqrt(1+2*xx*yy); + if (T1 > 50 && (g1 > .75*g0 || g1 > .65 || (k==2*k0 && g1 > .7))) { pg = xy/(1+yy); g = g1; @@ -256,7 +270,7 @@ float remove_doubling(celt_word32 *pre[2], int COMBFILTER_MAXPERIOD, int N, int } if (pg > g) pg = g; - /*printf ("%d %f\n", T, g);*/ + /*printf ("%d %d ", T0, T);*/ *_T0 = T; return pg; }