Some initial resampling code. Nothing even remotely working so far.
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 15 Jan 2007 12:42:15 +0000 (12:42 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 15 Jan 2007 12:42:15 +0000 (12:42 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@12326 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/resample.c [new file with mode: 0644]

diff --git a/libspeex/resample.c b/libspeex/resample.c
new file mode 100644 (file)
index 0000000..b75ff7e
--- /dev/null
@@ -0,0 +1,100 @@
+/* Copyright (C) 2007 Jean-Marc Valin
+      
+   File: resample.c
+   Resample code
+
+      Redistribution and use in source and binary forms, with or without
+      modification, are permitted provided that the following conditions are
+   met:
+
+      1. Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+      2. Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+      3. The name of the author may not be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+      THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+      IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+      OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+      DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+      (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+      SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+      HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+      STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+      ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+      POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "misc.h"
+      
+typedef struct {
+   int in_rate;
+   int out_rate;
+   int num_rate;
+   int den_rate;
+   int last_sample;
+   int samp_frac_num;
+   int filt_len;
+   float *mem;
+} SpeexResamplerState;
+
+
+SpeexResamplerState *speex_resampler_init(int in_rate, int out_rate)
+{
+   SpeexResamplerState *st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState));
+   int fact, i;
+   st->in_rate = in_rate;
+   st->out_rate = out_rate;
+   st->num_rate = in_rate;
+   st->den_rate = out_rate;
+   /* FIXME: This is terribly inefficient, but who cares (at least for now)? */
+   for (fact=2;fact<=spx_sqrt(MAX32(in_rate, out_rate));fact++)
+   {
+      while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0))
+      {
+         st->num_rate /= fact;
+         st->den_rate /= fact;
+      }
+   }
+   st->last_sample = 0;
+   st->filt_len = 64;
+   st->mem = speex_alloc((st->filt_len-1) * sizeof(float));
+   for (i=0;i<st->filt_len-1;i++)
+      st->mem[i] = 0;
+}
+
+
+int speex_resample_float(SpeexResamplerState *st, const float *in, int len, float *out)
+{
+   int i=0;
+   int N = st->filt_len;
+   while (1)
+   {
+      int j;
+      float sum=0;
+      for (j=0;j<N;j++)
+      {
+         sum += in[st->last_sample-N+1+j]*sinc((j-N/2)-((float)st->samp_frac_num)/st->den_rate);
+      }
+      out[i++] = 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->last_sample++;
+      }
+      if (st->last_sample >= len)
+      {
+         break;
+      }      
+   }
+   return i;
+}
+