cwrs.c links to derf's article on pulse vector encoding.
[opus.git] / libcelt / pitch.c
index 28c9b52..206f158 100644 (file)
 
 #include <stdio.h>
 #include <math.h>
-#include "fftwrap.h"
+#include "pitch.h"
+#include "psy.h"
 
-
-void find_spectral_pitch(void *fft, float *x, float *y, int lag, int len, int *pitch, float *curve)
+void find_spectral_pitch(kiss_fftr_cfg fft, struct PsyDecay *decay, float *x, float *y, int lag, int len, int C, int *pitch)
 {
-   float xx[lag];
-   float X[lag];
-   float Y[lag];
+   int c;
+   int n2 = lag/2;
+   float xx[lag*C];
+   float yy[lag*C];
+   float X[lag*C];
+   float Y[lag*C];
+   float curve[n2*C];
    int i;
    
-   for (i=0;i<lag;i++)
+   for (i=0;i<C*lag;i++)
       xx[i] = 0;
-   for (i=0;i<len;i++)
-      xx[i] = x[i];
+   for (c=0;c<C;c++)
+   {
+      for (i=0;i<len;i++)
+         xx[c*lag+i] = x[C*i+c];
+      for (i=0;i<lag;i++)
+         yy[c*lag+i] = y[C*i+c];
+      
+   }
+   
+   kiss_fftr(fft, xx, X);
+   kiss_fftr(fft, yy, Y);
+   
+   compute_masking(decay, X, curve, lag*C, 44100);
    
-   spx_fft(fft, xx, X);
-   spx_fft(fft, y, Y);
-   X[0] = X[0]*Y[0];
-   for (i=1;i<lag/2;i++)
+   for (i=1;i<C*n2;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/sqrt(1+curve[i]);
       //n = 1.f/(1+curve[i]);
-      if (i>lag/6)
-         n=0;
-      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;
+      float tmp = X[2*i];
+      X[2*i] = (X[2*i  ]*Y[2*i  ] + X[2*i+1]*Y[2*i+1])*n;
+      X[2*i+1] = (- X[2*i+1]*Y[2*i  ] + tmp*Y[2*i+1])*n;
    }
-   X[lag-1] = 0;
-   X[0] = X[lag-1] = 0;
-   spx_ifft(fft, X, xx);
+   X[0] = X[1] = 0;
+   kiss_fftri(fft, X, xx);
    
-   float max_corr=-1;
+   float max_corr=-1e10;
    //int pitch;
-   *pitch = -1;
+   *pitch = 0;
    for (i=0;i<lag-len;i++)
    {
       //printf ("%f ", xx[i]);