diff options
Diffstat (limited to 'main/libresample/tests/testresample.c')
-rw-r--r-- | main/libresample/tests/testresample.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/main/libresample/tests/testresample.c b/main/libresample/tests/testresample.c new file mode 100644 index 000000000..a59aa8bfd --- /dev/null +++ b/main/libresample/tests/testresample.c @@ -0,0 +1,182 @@ +/********************************************************************** + + testresample.c + + Real-time library interface by Dominic Mazzoni + + Based on resample-1.7: + http://www-ccrma.stanford.edu/~jos/resample/ + + License: LGPL - see the file LICENSE.txt for more information + +**********************************************************************/ + +#include "../include/libresample.h" + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#define MIN(A, B) (A) < (B)? (A) : (B) + +void runtest(int srclen, double freq, double factor, + int srcblocksize, int dstblocksize) +{ + int expectedlen = (int)(srclen * factor); + int dstlen = expectedlen + 1000; + float *src = (float *)malloc((srclen+100) * sizeof(float)); + float *dst = (float *)malloc((dstlen+100) * sizeof(float)); + void *handle; + double sum, sumsq, err, rmserr; + int i, out, o, srcused, errcount, rangecount; + int statlen, srcpos, lendiff; + int fwidth; + + printf("-- srclen: %d sin freq: %.1f factor: %.3f srcblk: %d dstblk: %d\n", + srclen, freq, factor, srcblocksize, dstblocksize); + + for(i=0; i<srclen; i++) + src[i] = sin(i/freq); + for(i=srclen; i<srclen+100; i++) + src[i] = -99.0; + + for(i=0; i<dstlen+100; i++) + dst[i] = -99.0; + + handle = resample_open(1, factor, factor); + fwidth = resample_get_filter_width(handle); + out = 0; + srcpos = 0; + for(;;) { + int srcBlock = MIN(srclen-srcpos, srcblocksize); + int lastFlag = (srcBlock == srclen-srcpos); + + o = resample_process(handle, factor, + &src[srcpos], srcBlock, + lastFlag, &srcused, + &dst[out], MIN(dstlen-out, dstblocksize)); + srcpos += srcused; + if (o >= 0) + out += o; + if (o < 0 || (o == 0 && srcpos == srclen)) + break; + } + resample_close(handle); + + if (o < 0) { + printf("Error: resample_process returned an error: %d\n", o); + } + + if (out <= 0) { + printf("Error: resample_process returned %d samples\n", out); + free(src); + free(dst); + return; + } + + lendiff = abs(out - expectedlen); + if (lendiff > (int)(2*factor + 1.0)) { + printf(" Expected ~%d, got %d samples out\n", + expectedlen, out); + } + + sum = 0.0; + sumsq = 0.0; + errcount = 0.0; + + /* Don't compute statistics on all output values; the last few + are guaranteed to be off because it's based on far less + interpolation. */ + statlen = out - fwidth; + + for(i=0; i<statlen; i++) { + double diff = sin((i/freq)/factor) - dst[i]; + if (fabs(diff) > 0.05) { + if (errcount == 0) + printf(" First error at i=%d: expected %.3f, got %.3f\n", + i, sin((i/freq)/factor), dst[i]); + errcount++; + } + sum += fabs(diff); + sumsq += diff * diff; + } + + rangecount = 0; + for(i=0; i<statlen; i++) { + if (dst[i] < -1.01 || dst[i] > 1.01) { + if (rangecount == 0) + printf(" Error at i=%d: value is %.3f\n", i, dst[i]); + rangecount++; + } + } + if (rangecount > 1) + printf(" At least %d samples were out of range\n", rangecount); + + if (errcount > 0) { + i = out - 1; + printf(" i=%d: expected %.3f, got %.3f\n", + i, sin((i/freq)/factor), dst[i]); + printf(" At least %d samples had significant error.\n", errcount); + } + err = sum / statlen; + rmserr = sqrt(sumsq / statlen); + printf(" Out: %d samples Avg err: %f RMS err: %f\n", out, err, rmserr); + free(src); + free(dst); +} + +int main(int argc, char **argv) +{ + int i, srclen, dstlen, ifreq; + double factor; + + printf("\n*** Vary source block size*** \n\n"); + srclen = 10000; + ifreq = 100; + for(i=0; i<20; i++) { + factor = ((rand() % 16) + 1) / 4.0; + dstlen = (int)(srclen * factor + 10); + runtest(srclen, (double)ifreq, factor, 64, dstlen); + runtest(srclen, (double)ifreq, factor, 32, dstlen); + runtest(srclen, (double)ifreq, factor, 8, dstlen); + runtest(srclen, (double)ifreq, factor, 2, dstlen); + runtest(srclen, (double)ifreq, factor, srclen, dstlen); + } + + printf("\n*** Vary dest block size ***\n\n"); + srclen = 10000; + ifreq = 100; + for(i=0; i<20; i++) { + factor = ((rand() % 16) + 1) / 4.0; + runtest(srclen, (double)ifreq, factor, srclen, 32); + dstlen = (int)(srclen * factor + 10); + runtest(srclen, (double)ifreq, factor, srclen, dstlen); + } + + printf("\n*** Resample factor 1.0, testing different srclen ***\n\n"); + ifreq = 40; + for(i=0; i<100; i++) { + srclen = (rand() % 30000) + 10; + dstlen = (int)(srclen + 10); + runtest(srclen, (double)ifreq, 1.0, srclen, dstlen); + } + + printf("\n*** Resample factor 1.0, testing different sin freq ***\n\n"); + srclen = 10000; + for(i=0; i<100; i++) { + ifreq = ((int)rand() % 10000) + 1; + dstlen = (int)(srclen * 10); + runtest(srclen, (double)ifreq, 1.0, srclen, dstlen); + } + + printf("\n*** Resample with different factors ***\n\n"); + srclen = 10000; + ifreq = 100; + for(i=0; i<100; i++) { + factor = ((rand() % 64) + 1) / 4.0; + dstlen = (int)(srclen * factor + 10); + runtest(srclen, (double)ifreq, factor, srclen, dstlen); + } + + return 0; +} |