66static void *speex_alloc (
int size) {
return calloc(size,1);}
67static void *speex_realloc (
void *ptr,
int size) {
return realloc(ptr, size);}
68static void speex_free (
void *ptr) {
free(ptr);}
75#include "os_support.h"
83#define M_PI 3.14159265358979323846
87#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x)))
89#define WORD2INT(x) ((x) < -32767.5f ? -32768 : ((x) > 32766.5f ? 32767 : floor(.5+(x))))
92#define IMAX(a,b) ((a) > (b) ? (a) : (b))
93#define IMIN(a,b) ((a) < (b) ? (a) : (b))
104#include "resample_neon.h"
109#define FIXED_STACK_ALLOC 8192
111#define FIXED_STACK_ALLOC 1024
149 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076,
150 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014,
151 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601,
152 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014,
153 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490,
154 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546,
155 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178,
156 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947,
157 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058,
158 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438,
159 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734,
160 0.00001000, 0.00000000};
171 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446,
172 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347,
173 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962,
174 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451,
175 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739,
176 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000};
179 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200,
180 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126,
181 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272,
182 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758,
183 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490,
184 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000};
187 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003,
188 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565,
189 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561,
190 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058,
191 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600,
192 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000};
200#define KAISER12 (&_KAISER12)
204#define KAISER10 (&_KAISER10)
206#define KAISER8 (&_KAISER8)
208#define KAISER6 (&_KAISER6)
229 { 8, 4, 0.830f, 0.860f,
KAISER6 },
230 { 16, 4, 0.850f, 0.880f,
KAISER6 },
231 { 32, 4, 0.882f, 0.910f,
KAISER6 },
232 { 48, 8, 0.895f, 0.917f,
KAISER8 },
233 { 64, 8, 0.921f, 0.940f,
KAISER8 },
234 { 80, 16, 0.922f, 0.940f,
KAISER10},
235 { 96, 16, 0.940f, 0.945f,
KAISER10},
236 {128, 16, 0.950f, 0.950f,
KAISER10},
237 {160, 16, 0.960f, 0.960f,
KAISER10},
238 {192, 32, 0.968f, 0.968f,
KAISER12},
239 {256, 32, 0.975f, 0.975f,
KAISER12},
251 interp[3] = -0.1666666667*frac + 0.1666666667*(frac*frac*frac);
252 interp[2] = frac + 0.5*(frac*frac) - 0.5*(frac*frac*frac);
254 interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac);
256 interp[1] = 1.f-interp[3]-interp[2]-interp[0];
259 return interp[0]*func->
table[ind] + interp[1]*func->
table[ind+1] + interp[2]*func->
table[ind+2] + interp[3]*func->
table[ind+3];
264int main(
int argc,
char **argv)
280 float xx = x * cutoff;
283 else if (fabs(x) > .5f*N)
293 float xx = x * cutoff;
296 else if (fabs(x) > .5*N)
315 interp[2] =
Q15_ONE-interp[0]-interp[1]-interp[3];
324 interp[0] = -0.16667f*frac + 0.16667f*frac*frac*frac;
325 interp[1] = frac + 0.5f*frac*frac - 0.5f*frac*frac*frac;
327 interp[3] = -0.33333f*frac + 0.5f*frac*frac - 0.16667f*frac*frac*frac;
329 interp[2] = 1.-interp[0]-interp[1]-interp[3];
338 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
343 const spx_uint32_t den_rate = st->
den_rate;
346 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
348 const spx_word16_t *sinct = & sinc_table[samp_frac_num*N];
351#ifndef OVERRIDE_INNER_PRODUCT_SINGLE
354 for(j=0;j<N;j++) sum +=
MULT16_16(sinct[j], iptr[j]);
373 out[out_stride * out_sample++] = sum;
374 last_sample += int_advance;
375 samp_frac_num += frac_advance;
376 if (samp_frac_num >= den_rate)
378 samp_frac_num -= den_rate;
396 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
401 const spx_uint32_t den_rate = st->
den_rate;
404 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
406 const spx_word16_t *sinct = & sinc_table[samp_frac_num*N];
409#ifndef OVERRIDE_INNER_PRODUCT_DOUBLE
411 double accum[4] = {0,0,0,0};
414 accum[0] += sinct[j]*iptr[j];
415 accum[1] += sinct[j+1]*iptr[j+1];
416 accum[2] += sinct[j+2]*iptr[j+2];
417 accum[3] += sinct[j+3]*iptr[j+3];
419 sum = accum[0] + accum[1] + accum[2] + accum[3];
421 sum = inner_product_double(sinct, iptr, N);
424 out[out_stride * out_sample++] =
PSHR32(sum, 15);
425 last_sample += int_advance;
426 samp_frac_num += frac_advance;
427 if (samp_frac_num >= den_rate)
429 samp_frac_num -= den_rate;
445 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
449 const spx_uint32_t den_rate = st->
den_rate;
452 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
465#ifndef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE
485 out[out_stride * out_sample++] = sum;
486 last_sample += int_advance;
487 samp_frac_num += frac_advance;
488 if (samp_frac_num >= den_rate)
490 samp_frac_num -= den_rate;
508 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
512 const spx_uint32_t den_rate = st->
den_rate;
515 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
528#ifndef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE
530 double accum[4] = {0,0,0,0};
533 const double curr_in=iptr[j];
547 out[out_stride * out_sample++] =
PSHR32(sum,15);
548 last_sample += int_advance;
549 samp_frac_num += frac_advance;
550 if (samp_frac_num >= den_rate)
552 samp_frac_num -= den_rate;
571 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
575 const spx_uint32_t den_rate = st->
den_rate;
577 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
579 out[out_stride * out_sample++] = 0;
580 last_sample += int_advance;
581 samp_frac_num += frac_advance;
582 if (samp_frac_num >= den_rate)
584 samp_frac_num -= den_rate;
596 spx_uint32_t old_length = st->
filt_len;
599 spx_uint32_t min_sinc_table_length;
600 spx_uint32_t min_alloc_size;
631#ifdef RESAMPLE_FULL_SINC_TABLE
716 }
else if (st->
filt_len > old_length)
724 spx_uint32_t olen = old_length;
741 for (j=0;j<olen-1;j++)
755 }
else if (st->
filt_len < old_length)
822 st->
last_sample = (spx_int32_t*)speex_alloc(nb_channels*
sizeof(spx_int32_t));
823 st->
magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*
sizeof(spx_uint32_t));
824 st->
samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*
sizeof(spx_uint32_t));
825 for (i=0;i<nb_channels;i++)
870 out_sample = st->
resampler_ptr(st, channel_index, mem, in_len,
out, out_len);
872 if (st->
last_sample[channel_index] < (spx_int32_t)*in_len)
874 *out_len = out_sample;
880 mem[j] = mem[j+ilen];
899 mem[N-1+i]=mem[N-1+i+tmp_in_len];
912 spx_uint32_t ilen = *in_len;
913 spx_uint32_t olen = *out_len;
915 const int filt_offs = st->
filt_len - 1;
922 while (ilen && olen) {
923 spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
924 spx_uint32_t ochunk = olen;
927 for(j=0;j<ichunk;++j)
928 x[j+filt_offs]=
in[j*istride];
930 for(j=0;j<ichunk;++j)
938 in += ichunk * istride;
955 spx_uint32_t ilen = *in_len;
956 spx_uint32_t olen = *out_len;
970 while (ilen && olen) {
972 spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
973 spx_uint32_t ochunk = (olen > ylen) ? ylen : olen;
974 spx_uint32_t omagic = 0;
983 for(j=0;j<ichunk;++j)
990 for(j=0;j<ichunk;++j)
1000 for (j=0;j<ochunk+omagic;++j)
1002 out[j*ostride_save] = ystack[j];
1009 out += (ochunk+omagic) * ostride_save;
1011 in += ichunk * istride_save;
1023 int istride_save, ostride_save;
1024 spx_uint32_t bak_out_len = *out_len;
1025 spx_uint32_t bak_in_len = *in_len;
1031 *out_len = bak_out_len;
1032 *in_len = bak_in_len;
1046 int istride_save, ostride_save;
1047 spx_uint32_t bak_out_len = *out_len;
1048 spx_uint32_t bak_in_len = *in_len;
1054 *out_len = bak_out_len;
1055 *in_len = bak_in_len;
1080 spx_uint32_t old_den;
1198 return "Memory allocation failed.";
1200 return "Bad resampler state.";
1202 return "Invalid argument.";
1204 return "Input and output buffers overlap.";
1206 return "Unknown error. Bad error code or strange version mismatch.";
Various architecture definitions Speex.
int main(int argc, char *argv[])
#define QCONST16(x, bits)
#define SATURATE32PSHR(x, shift, a)
#define MULT16_16_P15(a, b)
#define MULT16_32_Q15(a, b)
#define FIXED_STACK_ALLOC
EXPORT void speex_resampler_destroy(SpeexResamplerState *st)
static const struct QualityMapping quality_map[11]
int(* resampler_basic_func)(SpeexResamplerState *, spx_uint32_t, const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *)
static int resampler_basic_interpolate_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
static void cubic_coef(spx_word16_t x, spx_word16_t interp[4])
EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate)
static spx_word16_t sinc(float cutoff, float x, int N, const struct FuncDef *window_func)
EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len)
EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride)
static double compute_func(float x, const struct FuncDef *func)
EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den)
EXPORT const char * speex_resampler_strerror(int err)
EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate)
EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
static const struct FuncDef _KAISER12
static const double kaiser6_table[36]
EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality)
static const double kaiser8_table[36]
EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride)
EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride)
static const struct FuncDef _KAISER8
static const double kaiser10_table[36]
EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride)
EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st)
EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len)
static int update_filter(SpeexResamplerState *st)
static int resampler_basic_direct_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
static int speex_resampler_magic(SpeexResamplerState *st, spx_uint32_t channel_index, spx_word16_t **out, spx_uint32_t out_len)
static int speex_resampler_process_native(SpeexResamplerState *st, spx_uint32_t channel_index, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality)
EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len)
static const struct FuncDef _KAISER10
EXPORT SpeexResamplerState * speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err)
EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate)
static const double kaiser12_table[68]
EXPORT SpeexResamplerState * speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err)
Create a new resampler with integer input and output rates.
EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st)
static int resampler_basic_zero(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
static const struct FuncDef _KAISER6
EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len)
Resampler functions (SSE version)
static float interpolate_product_single(const float *a, const float *b, unsigned int len, const spx_uint32_t oversample, float *frac)
static float inner_product_single(const float *a, const float *b, unsigned int len)
@ RESAMPLER_ERR_BAD_STATE
@ RESAMPLER_ERR_ALLOC_FAILED
@ RESAMPLER_ERR_INVALID_ARG
@ RESAMPLER_ERR_PTR_OVERLAP
Temporary memory allocation on stack.
#define ALLOC(var, size, type)
float downsample_bandwidth
const struct FuncDef * window_func
resampler_basic_func resampler_ptr
spx_uint32_t * samp_frac_num
spx_uint32_t sinc_table_length
spx_word16_t * sinc_table
spx_uint32_t mem_alloc_size
spx_int32_t * last_sample
spx_uint32_t * magic_samples