1 /**********************************************************************
5 Real-time library interface by Dominic Mazzoni
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>
24 #define MIN(A, B) (A) < (B)? (A) : (B)
26 void dostat(char *name
, float *d1
, float *d2
, int len
)
29 double sum
, sumsq
, err
, rmserr
;
33 for(i
=0; i
<len
; i
++) {
34 double diff
= d1
[i
] - d2
[i
];
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
,
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));
54 int srcblocksize
= srclen
;
55 int dstblocksize
= dstlen
;
56 int i
, out
, out_rabbit
, o
, srcused
;
61 for(i
=0; i
<dstlen
+100; i
++)
64 gettimeofday(&tv0
, NULL
);
66 handle
= resample_open(1, factor
, factor
);
70 int srcBlock
= MIN(srclen
-srcpos
, srcblocksize
);
71 int lastFlag
= (srcBlock
== srclen
-srcpos
);
73 o
= resample_process(handle
, factor
,
74 &src
[srcpos
], srcBlock
,
76 &dst_rs
[out
], MIN(dstlen
-out
, dstblocksize
));
80 if (o
< 0 || (o
== 0 && srcpos
== srclen
))
83 resample_close(handle
);
85 gettimeofday(&tv1
, NULL
);
87 (tv1
.tv_sec
+ tv1
.tv_usec
* 0.000001) -
88 (tv0
.tv_sec
+ tv0
.tv_usec
* 0.000001);
91 printf("Error: resample_process returned an error: %d\n", o
);
95 printf("Error: resample_process returned %d samples\n", out
);
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
);
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",
132 statlen
= MIN(out
, out_rabbit
);
134 statlen
= MIN(statlen
, anslen
);
137 dostat("resample ", dst_rs
, ans
, statlen
);
138 dostat("rabbit ", dst_rabbit
, ans
, statlen
);
140 dostat( "RS vs rabbit", dst_rs
, dst_rabbit
, statlen
);
146 int main(int argc
, char **argv
)
151 printf("\n*** sin wave, factor = 1.0 *** \n\n");
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");
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);
170 printf("\n*** sin wave, factor = 4.0 *** \n\n");
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);