Actually, basic resampling seems to be working...
[speexdsp.git] / libspeex / resample.c
index 276ebad..4cb22eb 100644 (file)
 
 #include "misc.h"
 #include <math.h>
+#include <stdio.h>
             
+//#define float double
+#define FILTER_SIZE 64
+      
 typedef struct {
    int in_rate;
    int out_rate;
@@ -63,7 +67,7 @@ SpeexResamplerState *speex_resampler_init(int in_rate, int out_rate, int in_rate
       }
    }
    st->last_sample = 0;
-   st->filt_len = 64;
+   st->filt_len = FILTER_SIZE;
    st->mem = speex_alloc((st->filt_len-1) * sizeof(float));
    for (i=0;i<st->filt_len-1;i++)
       st->mem[i] = 0;
@@ -82,13 +86,14 @@ static float sinc(float x, int N)
       return 1;
    else if (fabs(x) > .5f*N)
       return 0;
-   return sin(M_PI*x)/(M_PI*x) * (.5-.5*cos(2*x*M_PI/N));
+   return sin(M_PI*x)/(M_PI*x) * (.5+.5*cos(2*x*M_PI/N));
 }
 
 int speex_resample_float(SpeexResamplerState *st, const float *in, int len, float *out)
 {
-   int i=0;
+   int j=0;
    int N = st->filt_len;
+   int out_sample = 0;
    while (1)
    {
       int j;
@@ -100,49 +105,58 @@ int speex_resample_float(SpeexResamplerState *st, const float *in, int len, floa
          else
             sum += in[st->last_sample-N+1+j]*sinc((j-N/2)-((float)st->samp_frac_num)/st->den_rate, N);
       }
-      out[i++] = sum;
+      out[out_sample++] = sum;
       
       st->last_sample += st->num_rate/st->den_rate;
       st->samp_frac_num += st->num_rate%st->den_rate;
       if (st->samp_frac_num >= st->den_rate)
       {
-         st->samp_frac_num >= st->den_rate;
+         st->samp_frac_num -= st->den_rate;
          st->last_sample++;
       }
+      //fprintf (stderr, "%d %d %d %d\n", st->last_sample, st->samp_frac_num, st->num_rate, st->den_rate);
       if (st->last_sample >= len)
       {
+         st->last_sample -= len;
          break;
       }      
    }
-   for (i=0;i<st->filt_len-1;i++)
-      st->mem[i] = in[i+len-N+1];
-   return i;
+   for (j=0;j<st->filt_len-1;j++)
+      st->mem[j] = in[j+len-N+1];
+   return out_sample;
 }
 
-#include <stdio.h>
 #define NN 256
 
 int main(int argc, char **argv)
 {
    int i;
-   SpeexResamplerState *st = speex_resampler_init(8000, 16000, 1, 1);
+   SpeexResamplerState *st = speex_resampler_init(8000, 12000, 1, 1);
+   short *in;
+   short *out;
+   float *fin, *fout;
+   in = speex_alloc(NN*sizeof(short));
+   out = speex_alloc(2*NN*sizeof(short));
+   fin = speex_alloc(NN*sizeof(float));
+   fout = speex_alloc(2*NN*sizeof(float));
    while (1)
    {
       int out_num;
-      short in[NN];
-      short out[2*NN];
-      float fin[NN], fout[2*NN];
       fread(in, sizeof(short), NN, stdin);
       if (feof(stdin))
          break;
       for (i=0;i<NN;i++)
          fin[i]=in[i];
       out_num = speex_resample_float(st, fin, NN, fout);
-      fprintf (stderr, "%d\n", out_num);
+      //fprintf (stderr, "%d\n", out_num);
       for (i=0;i<2*NN;i++)
          out[i]=fout[i];
-      fwrite(in, sizeof(short), 2*NN, stdout);
+      fwrite(out, sizeof(short), out_num, stdout);
    }
+   speex_free(in);
+   speex_free(out);
+   speex_free(fin);
+   speex_free(fout);
    return 0;
 }