diff options
Diffstat (limited to 'gst-libs/gst/resample/test.c')
-rw-r--r-- | gst-libs/gst/resample/test.c | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/gst-libs/gst/resample/test.c b/gst-libs/gst/resample/test.c new file mode 100644 index 00000000..44d19a65 --- /dev/null +++ b/gst-libs/gst/resample/test.c @@ -0,0 +1,352 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <sys/time.h> + +#include <resample.h> + +#define AMP 16000 +#define I_RATE 48000 +#define O_RATE 44100 +//#define O_RATE 24000 + +//#define test_func(x) 1 +//#define test_func(x) sin(2*M_PI*(x)*10) +//#define test_func(x) sin(2*M_PI*(x)*(x)*1000) +#define test_func(x) sin(2*M_PI*(x)*(x)*12000) + +short i_buf[I_RATE*2*2]; +short o_buf[O_RATE*2*2]; + +static int i_offset; +static int o_offset; + +FILE *out; + +void test_res1(void); +void test_res2(void); +void test_res3(void); +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_res7(); + + return 0; +} + +void *get_buffer(void *priv, unsigned int size) +{ + void *ret; + ret = ((void *)o_buf) + o_offset; + o_offset += size; + return ret; +} + +struct timeval start_time; +void start_timer(void) +{ + gettimeofday(&start_time,NULL); + //printf("start %ld.%06ld\n",start_time.tv_sec,start_time.tv_usec); +} + +void end_timer(void) +{ + struct timeval end_time; + double diff; + + gettimeofday(&end_time,NULL); + //printf("end %ld.%06ld\n",end_time.tv_sec,end_time.tv_usec); + diff = (end_time.tv_sec - start_time.tv_sec) + + 1e-6*(end_time.tv_usec - start_time.tv_usec); + + printf("time %g\n",diff); + +} + +void test_res1(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*2+0] = rint(AMP * test_func((double)i/I_RATE)); + //i_buf[i*2+1] = rint(AMP * test_func((double)i/I_RATE)); + i_buf[i*2+1] = (i<1000)?AMP:0; + } + + 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 = 2; + //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*2,256*2*2); + } + if(I_RATE-i){ + resample_scale(r,i_buf+i*2,(I_RATE-i)*2*2); + } +#else + resample_scale(r,i_buf,I_RATE*2*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[2*i+0],o_buf[2*i+1], + f,o_buf[2*i+0]-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[2*i+0]-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)); +} + + +void test_res2(void) +{ + functable_t *t; + int i; + double x; + double f1,f2; + + t = malloc(sizeof(*t)); + memset(t,0,sizeof(*t)); + + t->start = -50.0; + t->offset = 1; + t->len = 100; + + t->func_x = functable_sinc; + t->func_dx = functable_dsinc; + + functable_init(t); + + for(i=0;i<1000;i++){ + x = -50.0 + 0.1 * i; + f1 = functable_sinc(NULL,x); + f2 = functable_eval(t,x); + fprintf(out,"%d %g %g %g\n",i,f1,f2,f1-f2); + } +} + +void test_res3(void) +{ + functable_t *t; + int i; + double x; + double f1,f2; + int n = 1; + + t = malloc(sizeof(*t)); + memset(t,0,sizeof(*t)); + + t->start = -50.0; + t->offset = 1.0 / n; + t->len = 100 * n; + + t->func_x = functable_sinc; + t->func_dx = functable_dsinc; + + t->func2_x = functable_window_std; + t->func2_dx = functable_window_dstd; + + t->scale = 1.0; + t->scale2 = 1.0 / (M_PI * 16); + + functable_init(t); + + for(i=0;i<1000 * n;i++){ + x = -50.0 + 0.1/n * i; + f1 = functable_sinc(NULL,t->scale * x) * + functable_window_std(NULL,t->scale2 * x); + f2 = functable_eval(t,x); + fprintf(out,"%d %g %g %g\n",i,f1,f2,f2-f1); + } +} + +double sinc_poly(double x) +{ +#define INV3FAC 1.66666666666666666e-1 +#define INV5FAC 8.33333333333333333e-3 +#define INV7FAC 1.984126984e-4 +#define INV9FAC 2.755731922e-6 +#define INV11FAC 2.505210839e-8 + double x2 = x * x; + + return 1 + - x2 * INV3FAC + + x2 * x2 * INV5FAC + - x2 * x2 * x2 * INV7FAC; + //+ x2 * x2 * x2 * x2 * INV9FAC + //- x2 * x2 * x2 * x2 * x2 * INV11FAC; +} + +void test_res4(void) +{ + int i; + double x,f1,f2; + + for(i=1;i<100;i++){ + x = 0.01 * i; + f1 = 1 - sin(x)/x; + f2 = 1 - sinc_poly(x); + + fprintf(out,"%g %.20g %.20g %.20g\n",x,f1,f2,f2-f1); + } +} + + +void test_res5(void) +{ + int i; + double sum; + + start_timer(); + sum = 0; + for(i=0;i<I_RATE;i++){ + sum += i_buf[i*2]; + } + end_timer(); + i_buf[0] = sum; +} + + +void short_to_double(double *d,short *x) { *d = *x; } +void short_to_float(float *f,short *x) { *f = *x; } +void float_to_double(double *f,float *x) { *f = *x; } +void double_to_short(short *f,double *x) { *f = *x; } + +double res6_tmp[1000]; + +void test_res6(void) +{ + int i; + + for(i=0;i<I_RATE;i++){ + i_buf[i] = rint(AMP * test_func((double)i/I_RATE)); + } + + conv_double_short_ref(res6_tmp,i_buf,1000); + for(i=0;i<1000;i++){ + res6_tmp[i] *= 3.0; + } + conv_short_double_ppcasm(o_buf,res6_tmp,1000); + + for(i=0;i<1000;i++){ + fprintf(out,"%d %d %g %d\n",i,i_buf[i],res6_tmp[i],o_buf[i]); + } +} + +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)); +} + |