Actually, basic resampling seems to be working...
[speexdsp.git] / libspeex / resample.c
index 49dd4ad..4cb22eb 100644 (file)
@@ -34,6 +34,9 @@
 #include <math.h>
 #include <stdio.h>
             
+//#define float double
+#define FILTER_SIZE 64
+      
 typedef struct {
    int in_rate;
    int out_rate;
@@ -64,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;
@@ -83,7 +86,7 @@ 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)
@@ -128,7 +131,7 @@ int speex_resample_float(SpeexResamplerState *st, const float *in, int len, floa
 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;
@@ -148,12 +151,12 @@ int main(int argc, char **argv)
       //fprintf (stderr, "%d\n", out_num);
       for (i=0;i<2*NN;i++)
          out[i]=fout[i];
-      fwrite(out, sizeof(short), 2*NN, stdout);
+      fwrite(out, sizeof(short), out_num, stdout);
    }
-   free(in);
-   free(out);
-   free(fin);
-   free(fout);
+   speex_free(in);
+   speex_free(out);
+   speex_free(fin);
+   speex_free(fout);
    return 0;
 }