cwrs.c links to derf's article on pulse vector encoding.
[opus.git] / libcelt / pitch.c
index 44ff08a..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)
+void find_spectral_pitch(kiss_fftr_cfg fft, struct PsyDecay *decay, float *x, float *y, int lag, int len, int C, int *pitch)
 {
+   int c;
    int n2 = lag/2;
-   float xx[lag];
-   float X[lag];
-   float Y[lag];
-   float curve[n2];
+   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];
-   
-   spx_fft(fft, xx, X);
-   spx_fft(fft, y, Y);
-   curve[0] = 1;
-   for (i=1;i<n2;i++)
+   for (c=0;c<C;c++)
    {
-      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=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];
+      
    }
-   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++)
+   kiss_fftr(fft, xx, X);
+   kiss_fftr(fft, yy, Y);
+   
+   compute_masking(decay, X, curve, lag*C, 44100);
+   
+   for (i=1;i<C*n2;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/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;
+      n = 1.f/sqrt(1+curve[i]);
+      //n = 1.f/(1+curve[i]);
+      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=-1e10;
    //int pitch;