annotate garage-resampler/TestResampler.cpp @ 2:bda8d2e803ee

Save extra samples from one process to next (+ other fixes and debug out)
author Chris Cannam
date Mon, 14 Oct 2013 08:15:51 +0100
parents af48ddb3542a
children 58e0bf3f87e3
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 #include "Resampler.h"
Chris@0 4
Chris@0 5 #include <iostream>
Chris@0 6
Chris@0 7 #include <cmath>
Chris@0 8
Chris@0 9 #define BOOST_TEST_DYN_LINK
Chris@0 10 #define BOOST_TEST_MAIN
Chris@0 11
Chris@0 12 #include <boost/test/unit_test.hpp>
Chris@0 13
Chris@0 14 BOOST_AUTO_TEST_SUITE(TestResampler)
Chris@0 15
Chris@0 16 using std::cout;
Chris@0 17 using std::endl;
Chris@1 18 using std::vector;
Chris@1 19
Chris@1 20 void
Chris@1 21 testResamplerOneShot(int sourceRate,
Chris@1 22 int targetRate,
Chris@1 23 int n,
Chris@1 24 double *in,
Chris@1 25 int m,
Chris@1 26 double *expected)
Chris@1 27 {
Chris@1 28 vector<double> resampled = Resampler::resample(sourceRate, targetRate,
Chris@1 29 in, n);
Chris@1 30 BOOST_CHECK_EQUAL(resampled.size(), m);
Chris@1 31 for (int i = 0; i < m; ++i) {
Chris@1 32 BOOST_CHECK_SMALL(resampled[i] - expected[i], 1e-8);
Chris@1 33 }
Chris@1 34 }
Chris@0 35
Chris@0 36 void
Chris@0 37 testResampler(int sourceRate,
Chris@0 38 int targetRate,
Chris@0 39 int n,
Chris@0 40 double *in,
Chris@0 41 int m,
Chris@0 42 double *expected)
Chris@0 43 {
Chris@2 44 // Here we provide the input in chunks (of varying size)
Chris@1 45
Chris@0 46 Resampler r(sourceRate, targetRate);
Chris@0 47 int latency = r.getLatency();
Chris@0 48 std::cerr << "latency = " << latency << std::endl;
Chris@0 49
Chris@0 50 int m1 = m + latency;
Chris@0 51 int n1 = int((m1 * sourceRate) / targetRate);
Chris@0 52
Chris@0 53 double *inPadded = new double[n1];
Chris@0 54 double *outPadded = new double[m1];
Chris@0 55
Chris@0 56 for (int i = 0; i < n1; ++i) {
Chris@0 57 if (i < n) inPadded[i] = in[i];
Chris@0 58 else inPadded[i] = 0.0;
Chris@0 59 }
Chris@0 60
Chris@0 61 for (int i = 0; i < m1; ++i) {
Chris@0 62 outPadded[i] = -999.0;
Chris@0 63 }
Chris@0 64
Chris@2 65 int chunkSize = 1;
Chris@2 66 int got = 0;
Chris@2 67 int i = 0;
Chris@0 68
Chris@2 69 while (true) {
Chris@2 70 std::cerr << "i = " << i << ", n1 = " << n1 << ", chunkSize = " << chunkSize << std::endl;
Chris@2 71 got += r.process(inPadded + i, outPadded + got, chunkSize);
Chris@2 72 i = i + chunkSize;
Chris@2 73 chunkSize = chunkSize + 1;
Chris@2 74 if (i + 1 >= n1) {
Chris@2 75 break;
Chris@2 76 } else if (i + chunkSize >= n1) {
Chris@2 77 chunkSize = n1 - i;
Chris@2 78 }
Chris@2 79 }
Chris@2 80
Chris@2 81 // int got = r.process(inPadded, outPadded, n1);
Chris@2 82 std::cerr << i << " in, " << got << " out" << std::endl;
Chris@0 83
Chris@0 84 BOOST_CHECK_EQUAL(got, m1);
Chris@2 85 /*
Chris@0 86 std::cerr << "results including latency padding:" << std::endl;
Chris@0 87 for (int i = 0; i < m1; ++i) {
Chris@0 88 std::cerr << outPadded[i] << " ";
Chris@0 89 if (i % 6 == 5) std::cerr << "\n";
Chris@0 90 }
Chris@0 91 std::cerr << "\n";
Chris@2 92 */
Chris@0 93 for (int i = latency; i < m1; ++i) {
Chris@1 94 BOOST_CHECK_SMALL(outPadded[i] - expected[i-latency], 1e-8);
Chris@0 95 }
Chris@0 96 delete[] outPadded;
Chris@0 97 delete[] inPadded;
Chris@0 98 }
Chris@0 99
Chris@0 100 BOOST_AUTO_TEST_CASE(sameRate)
Chris@0 101 {
Chris@0 102 double d[] = { 0, 0.1, -0.3, -0.4, -0.3, 0, 0.5, 0.2, 0.8, -0.1 };
Chris@1 103 testResamplerOneShot(4, 4, 10, d, 10, d);
Chris@0 104 testResampler(4, 4, 10, d, 10, d);
Chris@0 105 }
Chris@0 106
Chris@0 107 BOOST_AUTO_TEST_SUITE_END()
Chris@0 108