}
#ifdef HAVE_CPU_PPC
+#if 0
static union { int i[4]; float f[4]; } av_tmp __attribute__ ((__aligned__ (16)));
void conv_double_short_altivec(double *dest, short *src, int n)
}
}
#endif
+#endif
#endif
+void conv_double_short_dstr(double *dest, short *src, int n, int dstr)
+{
+ int i;
+ void *d = dest;
+ for(i=0;i<n;i++){
+ (*(double *)d)=*src++;
+ d += dstr;
+ }
+}
+
+void conv_short_double_sstr(short *dest, double *src, int n, int sstr)
+{
+ int i;
+ double x;
+ void *s = src;
+
+ for(i=0;i<n;i++){
+ x = *(double *)s;
+ if(x<-32768.0)x=-32768.0;
+ if(x>32767.0)x=32767.0;
+ *dest++ = rint(x);
+ s += sstr;
+ }
+}
+
r->i_start, r->i_end, r->o_start);
}
- if ((r->filter_length + r->i_samples)*2*r->channels > r->buffer_len) {
- //int size = taps * 2 * r->channels;
- int size = (r->filter_length + r->i_samples) * sizeof(double) * r->channels;
+ if ((r->filter_length + r->i_samples)*2*2 > r->buffer_len) {
+ int size = (r->filter_length + r->i_samples) * sizeof(double) * 2;
if(r->verbose){
printf("resample temp buffer size=%d\n",size);
memset(r->buffer, 0, size);
}
- conv_double_short(
- r->buffer + r->filter_length * sizeof(double) * r->channels,
- r->i_buf, r->i_samples * r->channels);
+ if(r->channels==2){
+ conv_double_short(
+ r->buffer + r->filter_length * sizeof(double) * 2,
+ r->i_buf, r->i_samples * 2);
+ }else{
+ conv_double_short_dstr(
+ r->buffer + r->filter_length * sizeof(double) * 2,
+ r->i_buf, r->i_samples, sizeof(double) * 2);
+ }
r->scale(r);
memcpy(r->buffer,
- r->buffer + r->i_samples * sizeof(double) * r->channels,
- r->filter_length * sizeof(double) * r->channels);
+ r->buffer + r->i_samples * sizeof(double) * 2,
+ r->filter_length * sizeof(double) * 2);
/* updating times */
r->i_start += r->i_samples * r->i_inc;
}
}
- conv_short_double(r->o_buf,out_tmp,2 * r->o_samples);
- //o_ptr[0] = double_to_s16(c0);
- //o_ptr[1] = double_to_s16(c1);
+ if(r->channels==2){
+ conv_short_double(r->o_buf,out_tmp,2 * r->o_samples);
+ }else{
+ conv_short_double_sstr(r->o_buf,out_tmp,r->o_samples,2 * sizeof(double));
+ }
}
#ifndef __RESAMPLE_H__
#define __RESAMPLE_H__
+#include <config.h>
+
typedef struct resample_s resample_t;
struct resample_s {
#define conv_short_double conv_short_double_ref
#endif
+void conv_double_short_dstr(double *dest, short *src, int n, int dstr);
+void conv_short_double_sstr(short *dest, double *src, int n, int dstr);
+
#endif /* __RESAMPLE_H__ */
void test_res4(void);
void test_res5(void);
void test_res6(void);
+void test_res7(void);
int main(int argc,char *argv[])
{
out = fopen("out","w");
- test_res1();
+ test_res7();
return 0;
}
}
}
+void test_res7(void)
+{
+ resample_t *r;
+ int i;
+ double sum10k,sum22k;
+ double f;
+ int n10k,n22k;
+ double x;
+
+ for(i=0;i<I_RATE;i++){
+ i_buf[i] = rint(AMP * test_func((double)i/I_RATE));
+ }
+
+ r = malloc(sizeof(resample_t));
+ memset(r,0,sizeof(resample_t));
+
+ r->i_rate = I_RATE;
+ r->o_rate = O_RATE;
+ //r->method = RESAMPLE_SINC_SLOW;
+ r->method = RESAMPLE_SINC;
+ r->channels = 1;
+ //r->verbose = 1;
+ r->filter_length = 64;
+ r->get_buffer = get_buffer;
+
+ resample_init(r);
+
+ start_timer();
+#define blocked
+#ifdef blocked
+ for(i=0;i+256<I_RATE;i+=256){
+ resample_scale(r,i_buf+i,256*2);
+ }
+ if(I_RATE-i){
+ resample_scale(r,i_buf+i,(I_RATE-i)*2);
+ }
+#else
+ resample_scale(r,i_buf,I_RATE*2);
+#endif
+ end_timer();
+
+ for(i=0;i<O_RATE;i++){
+ f = AMP*test_func((double)i/O_RATE);
+ //f = rint(AMP*test_func((double)i/O_RATE));
+ fprintf(out,"%d %d %d %g %g\n",i,
+ o_buf[i],0,
+ f,o_buf[i]-f);
+ }
+
+ sum10k=0;
+ sum22k=0;
+ n10k=0;
+ n22k=0;
+ for(i=0;i<O_RATE;i++){
+ f = AMP*test_func((double)i/O_RATE);
+ //f = rint(AMP*test_func((double)i/O_RATE));
+ x = o_buf[i]-f;
+ if(((0.5*i)/O_RATE*I_RATE)<10000){
+ sum10k += x*x;
+ n10k++;
+ }
+ if(((0.5*i)/O_RATE*I_RATE)<22050){
+ sum22k += x*x;
+ n22k++;
+ }
+ }
+ printf("average error 10k=%g 22k=%g\n",
+ sqrt(sum10k/n10k),
+ sqrt(sum22k/n22k));
+}
+