Enable higher quality resampling, as it doesn't have a noticeable performance
[asterisk-bristuff.git] / main / libresample / tests / compareresample.c
blob8773c9d4e9b3f92405771ddd2645b92e145d59ae
1 /**********************************************************************
3 compareresample.c
5 Real-time library interface by Dominic Mazzoni
7 Based on resample-1.7:
8 http://www-ccrma.stanford.edu/~jos/resample/
10 License: LGPL - see the file LICENSE.txt for more information
12 **********************************************************************/
14 #include "../include/libresample.h"
16 #include <samplerate.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <math.h>
22 #include <sys/time.h>
24 #define MIN(A, B) (A) < (B)? (A) : (B)
26 void dostat(char *name, float *d1, float *d2, int len)
28 int i;
29 double sum, sumsq, err, rmserr;
31 sum = 0.0;
32 sumsq = 0.0;
33 for(i=0; i<len; i++) {
34 double diff = d1[i] - d2[i];
35 sum += fabs(diff);
36 sumsq += diff * diff;
38 err = sum / len;
39 rmserr = sqrt(sumsq / len);
40 printf(" %s: Avg err: %f RMS err: %f\n", name, err, rmserr);
43 void runtest(float *src, int srclen,
44 float *ans, int anslen,
45 double factor)
47 struct timeval tv0, tv1;
48 int dstlen = (int)(srclen * factor);
49 float *dst_rs = (float *)malloc((dstlen+100) * sizeof(float));
50 float *dst_rabbit = (float *)malloc((dstlen+100) * sizeof(float));
51 void *handle;
52 SRC_DATA rabbit;
53 double deltat;
54 int srcblocksize = srclen;
55 int dstblocksize = dstlen;
56 int i, out, out_rabbit, o, srcused;
57 int statlen, srcpos;
59 /* do resample */
61 for(i=0; i<dstlen+100; i++)
62 dst_rs[i] = -99.0;
64 gettimeofday(&tv0, NULL);
66 handle = resample_open(1, factor, factor);
67 out = 0;
68 srcpos = 0;
69 for(;;) {
70 int srcBlock = MIN(srclen-srcpos, srcblocksize);
71 int lastFlag = (srcBlock == srclen-srcpos);
73 o = resample_process(handle, factor,
74 &src[srcpos], srcBlock,
75 lastFlag, &srcused,
76 &dst_rs[out], MIN(dstlen-out, dstblocksize));
77 srcpos += srcused;
78 if (o >= 0)
79 out += o;
80 if (o < 0 || (o == 0 && srcpos == srclen))
81 break;
83 resample_close(handle);
85 gettimeofday(&tv1, NULL);
86 deltat =
87 (tv1.tv_sec + tv1.tv_usec * 0.000001) -
88 (tv0.tv_sec + tv0.tv_usec * 0.000001);
90 if (o < 0) {
91 printf("Error: resample_process returned an error: %d\n", o);
94 if (out <= 0) {
95 printf("Error: resample_process returned %d samples\n", out);
96 free(dst_rs);
97 return;
100 printf(" resample: %.3f seconds, %d outputs\n", deltat, out);
102 /* do rabbit (Erik's libsamplerate) */
104 for(i=0; i<dstlen+100; i++)
105 dst_rabbit[i] = -99.0;
107 rabbit.data_in = src;
108 rabbit.data_out = dst_rabbit;
109 rabbit.input_frames = srclen;
110 rabbit.output_frames = dstlen;
111 rabbit.input_frames_used = 0;
112 rabbit.output_frames_gen = 0;
113 rabbit.end_of_input = 1;
114 rabbit.src_ratio = factor;
116 gettimeofday(&tv0, NULL);
118 /* src_simple(&rabbit, SRC_SINC_BEST_QUALITY, 1); */
119 src_simple(&rabbit, SRC_SINC_FASTEST, 1);
120 /* src_simple(&rabbit, SRC_LINEAR, 1); */
122 gettimeofday(&tv1, NULL);
123 deltat =
124 (tv1.tv_sec + tv1.tv_usec * 0.000001) -
125 (tv0.tv_sec + tv0.tv_usec * 0.000001);
127 out_rabbit = rabbit.output_frames_gen;
129 printf(" rabbit : %.3f seconds, %d outputs\n",
130 deltat, out_rabbit);
132 statlen = MIN(out, out_rabbit);
133 if (anslen > 0)
134 statlen = MIN(statlen, anslen);
136 if (ans) {
137 dostat("resample ", dst_rs, ans, statlen);
138 dostat("rabbit ", dst_rabbit, ans, statlen);
140 dostat( "RS vs rabbit", dst_rs, dst_rabbit, statlen);
142 free(dst_rs);
143 free(dst_rabbit);
146 int main(int argc, char **argv)
148 int i, srclen;
149 float *src, *ans;
151 printf("\n*** sin wave, factor = 1.0 *** \n\n");
152 srclen = 100000;
153 src = malloc(srclen * sizeof(float));
154 for(i=0; i<srclen; i++)
155 src[i] = sin(i/100.0);
157 runtest(src, srclen, src, srclen, 1.0);
159 printf("\n*** sin wave, factor = 0.25 *** \n\n");
160 srclen = 100000;
161 for(i=0; i<srclen; i++)
162 src[i] = sin(i/100.0);
163 ans = malloc((srclen/4) * sizeof(float));
164 for(i=0; i<srclen/4; i++)
165 ans[i] = sin(i/25.0);
167 runtest(src, srclen, ans, srclen/4, 0.25);
168 free(ans);
170 printf("\n*** sin wave, factor = 4.0 *** \n\n");
171 srclen = 20000;
172 for(i=0; i<srclen; i++)
173 src[i] = sin(i/100.0);
174 ans = malloc((srclen*4) * sizeof(float));
175 for(i=0; i<srclen*4; i++)
176 ans[i] = sin(i/400.0);
178 runtest(src, srclen, ans, srclen*4, 4.0);
179 free(ans);
180 free(src);
182 return 0;