Some improvements to the pitch period estimation
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Fri, 30 Nov 2007 14:55:17 +0000 (01:55 +1100)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Fri, 30 Nov 2007 14:55:17 +0000 (01:55 +1100)
libcelt/bands.c
libcelt/celt.c
libcelt/pitch.c
libcelt/pitch.h

index 9c13444..34e72f0 100644 (file)
@@ -34,7 +34,9 @@
 #include "vq.h"
 
 const int qbank[NBANDS+2] =   {0, 2, 4, 6, 8, 12, 16, 20, 24, 28, 36, 44, 52, 68, 84, 116, 128};
-int qpulses[] = {4, 5, 4, 4, 3,  3,  3,  3,  3,  4,  4,  4,  0,  0,  0}; //c: 134 bits
+
+const int qpulses[NBANDS  ] = {7, 5, 4, 4, 3,  3,  3,  3,  3,  4,  4,  4,  0,  0,  0};
+
 #define WAVEFORM_END 52
 
 /* Start frequency of each band */
index 936aff8..35623ee 100644 (file)
@@ -181,7 +181,7 @@ int celt_encode(CELTState *st, short *pcm)
       in[i] *= st->window[i];
       in[B*N+i] *= st->window[N+i];
    }
-   find_spectral_pitch(st->fft, in, st->out_mem, MAX_PERIOD, (B+1)*N, &pitch_index, NULL);
+   find_spectral_pitch(st->fft, in, st->out_mem, MAX_PERIOD, (B+1)*N, &pitch_index);
    
    /* Compute MDCTs of the pitch part */
    compute_mdcts(&st->mdct_lookup, st->window, st->out_mem+pitch_index, P, N, B);
@@ -212,6 +212,10 @@ int celt_encode(CELTState *st, short *pcm)
    for (i=0;i<B*N;i++)
       X[i] -= P[i];
 
+   /*float sum=0;
+   for (i=0;i<B*N;i++)
+      sum += X[i]*X[i];
+   printf ("%f\n", sum);*/
    /* Residual quantisation */
 #if 1
    quant_bands(X, B, P);
index 0cce22e..44ff08a 100644 (file)
 #include <stdio.h>
 #include <math.h>
 #include "fftwrap.h"
+#include "pitch.h"
 
-
-void find_spectral_pitch(void *fft, float *x, float *y, int lag, int len, int *pitch, float *curve)
+void find_spectral_pitch(void *fft, float *x, float *y, int lag, int len, int *pitch)
 {
+   int n2 = lag/2;
    float xx[lag];
    float X[lag];
    float Y[lag];
+   float curve[n2];
    int i;
    
    for (i=0;i<lag;i++)
@@ -40,14 +42,24 @@ void find_spectral_pitch(void *fft, float *x, float *y, int lag, int len, int *p
    
    spx_fft(fft, xx, X);
    spx_fft(fft, y, Y);
-   X[0] = X[0]*Y[0];
+   curve[0] = 1;
+   for (i=1;i<n2;i++)
+   {
+      curve[i] = sqrt((X[2*i-1]*X[2*i-1] + X[2*i  ]*X[2*i  ])*(Y[2*i-1]*Y[2*i-1] + Y[2*i  ]*Y[2*i  ]));
+      curve[i] = curve[i]+.7*curve[i];
+   }
+   for (i=n2-2;i>=0;i--)
+      curve[i] = curve[i] + .7*curve[i+1];
+   
+   X[0] = 0;
    for (i=1;i<lag/2;i++)
    {
-      float n = 1.f/(1e1+sqrt(sqrt((X[2*i-1]*X[2*i-1] + X[2*i  ]*X[2*i  ])*(Y[2*i-1]*Y[2*i-1] + Y[2*i  ]*Y[2*i  ]))));
+      float n;
+      //n = 1.f/(1e1+sqrt(sqrt((X[2*i-1]*X[2*i-1] + X[2*i  ]*X[2*i  ])*(Y[2*i-1]*Y[2*i-1] + Y[2*i  ]*Y[2*i  ]))));
       //n = 1;
-      //n = 1.f/(1+curve[i]);
-      if (i>lag/6)
-         n=0;
+      n = 1.f/pow(1+curve[i],.8)/(i+60);
+      //if (i>lag/6)
+      //   n *= .5;
       float tmp = X[2*i-1];
       X[2*i-1] = (X[2*i-1]*Y[2*i-1] + X[2*i  ]*Y[2*i  ])*n;
       X[2*i  ] = (- X[2*i  ]*Y[2*i-1] + tmp*Y[2*i  ])*n;
index 026f08d..b61bcce 100644 (file)
@@ -23,6 +23,6 @@
 #ifndef _PITCH_H
 #define _PITCH_H
 
-void find_spectral_pitch(void *fft, float *x, float *y, int lag, int len, int *pitch, float *curve);
+void find_spectral_pitch(void *fft, float *x, float *y, int lag, int len, int *pitch);
 
 #endif