From 73461494d75ab794224cbe93021acfa51a8c98a9 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 9 Dec 2011 19:59:23 +0000 Subject: Add simple framewalk_to_beats test and normalise naming of test files. git-svn-id: svn://localhost/ardour2/branches/3.0@10954 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/test/interpolation_test.cc | 168 +++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 libs/ardour/test/interpolation_test.cc (limited to 'libs/ardour/test/interpolation_test.cc') diff --git a/libs/ardour/test/interpolation_test.cc b/libs/ardour/test/interpolation_test.cc new file mode 100644 index 0000000000..0bbb697b85 --- /dev/null +++ b/libs/ardour/test/interpolation_test.cc @@ -0,0 +1,168 @@ +#include +#include "interpolation_test.h" + +CPPUNIT_TEST_SUITE_REGISTRATION(InterpolationTest); + +using namespace std; +using namespace ARDOUR; + +void +InterpolationTest::linearInterpolationTest () +{ + framecnt_t result = 0; +// cout << "\nLinear Interpolation Test\n"; + +// cout << "\nSpeed: 1/3"; + for (int i = 0; 3*i < NUM_SAMPLES - 1024;) { + linear.set_speed (double(1.0)/double(3.0)); + linear.set_target_speed (double(1.0)/double(3.0)); + result = linear.interpolate (0, 1024, input + i, output + i*3); + i += result; + } + +// cout << "\nSpeed: 1.0"; + linear.reset(); + linear.set_speed (1.0); + linear.set_target_speed (linear.speed()); + result = linear.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * linear.speed()), result); + for (int i = 0; i < NUM_SAMPLES; i += INTERVAL) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } + +// cout << "\nSpeed: 0.5"; + linear.reset(); + linear.set_speed (0.5); + linear.set_target_speed (linear.speed()); + result = linear.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * linear.speed()), result); + for (int i = 0; i < NUM_SAMPLES; i += (INTERVAL / linear.speed() +0.5)) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } + +// cout << "\nSpeed: 0.2"; + linear.reset(); + linear.set_speed (0.2); + linear.set_target_speed (linear.speed()); + result = linear.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * linear.speed()), result); + +// cout << "\nSpeed: 0.02"; + linear.reset(); + linear.set_speed (0.02); + linear.set_target_speed (linear.speed()); + result = linear.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * linear.speed()), result); + + /* This one fails due too error accumulation + cout << "\nSpeed: 0.002"; + linear.reset(); + linear.set_speed (0.002); + linear.set_target_speed (linear.speed()); + result = linear.interpolate (0, NUM_SAMPLES, input, output); + linear.speed(); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * linear.speed()), result); + */ + +// cout << "\nSpeed: 2.0"; + linear.reset(); + linear.set_speed (2.0); + linear.set_target_speed (linear.speed()); + result = linear.interpolate (0, NUM_SAMPLES / 2, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES / 2 * linear.speed()), result); + for (int i = 0; i < NUM_SAMPLES / 2; i += (INTERVAL / linear.speed() +0.5)) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } + +// cout << "\nSpeed: 10.0"; + linear.set_speed (10.0); + linear.set_target_speed (linear.speed()); + result = linear.interpolate (0, NUM_SAMPLES / 10, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES / 10 * linear.speed()), result); + for (int i = 0; i < NUM_SAMPLES / 10; i += (INTERVAL / linear.speed() +0.5)) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } + /* + for (int i=0; i < NUM_SAMPLES; ++i) { + cout << i << " " << output[i] << endl; + } + */ +} + +void +InterpolationTest::cubicInterpolationTest () +{ + framecnt_t result = 0; +// cout << "\nCubic Interpolation Test\n"; + +// cout << "\nSpeed: 1/3"; + for (int i = 0; 3*i < NUM_SAMPLES - 1024;) { + cubic.set_speed (double(1.0)/double(3.0)); + cubic.set_target_speed (double(1.0)/double(3.0)); + result = cubic.interpolate (0, 1024, input + i, output + i*3); + i += result; + } + +// cout << "\nSpeed: 1.0"; + cubic.reset(); + cubic.set_speed (1.0); + cubic.set_target_speed (cubic.speed()); + result = cubic.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * cubic.speed()), result); + for (int i = 0; i < NUM_SAMPLES; i += INTERVAL) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } + +// cout << "\nSpeed: 0.5"; + cubic.reset(); + cubic.set_speed (0.5); + cubic.set_target_speed (cubic.speed()); + result = cubic.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * cubic.speed()), result); + for (int i = 0; i < NUM_SAMPLES; i += (INTERVAL / cubic.speed() +0.5)) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } + +// cout << "\nSpeed: 0.2"; + cubic.reset(); + cubic.set_speed (0.2); + cubic.set_target_speed (cubic.speed()); + result = cubic.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * cubic.speed()), result); + +// cout << "\nSpeed: 0.02"; + cubic.reset(); + cubic.set_speed (0.02); + cubic.set_target_speed (cubic.speed()); + result = cubic.interpolate (0, NUM_SAMPLES, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * cubic.speed()), result); + + /* This one fails due too error accumulation + cout << "\nSpeed: 0.002"; + cubic.reset(); + cubic.set_speed (0.002); + cubic.set_target_speed (cubic.speed()); + result = cubic.interpolate (0, NUM_SAMPLES, input, output); + cubic.speed(); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES * cubic.speed()), result); + */ + +// cout << "\nSpeed: 2.0"; + cubic.reset(); + cubic.set_speed (2.0); + cubic.set_target_speed (cubic.speed()); + result = cubic.interpolate (0, NUM_SAMPLES / 2, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES / 2 * cubic.speed()), result); + for (int i = 0; i < NUM_SAMPLES / 2; i += (INTERVAL / cubic.speed() +0.5)) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } + +// cout << "\nSpeed: 10.0"; + cubic.set_speed (10.0); + cubic.set_target_speed (cubic.speed()); + result = cubic.interpolate (0, NUM_SAMPLES / 10, input, output); + CPPUNIT_ASSERT_EQUAL ((framecnt_t)(NUM_SAMPLES / 10 * cubic.speed()), result); + for (int i = 0; i < NUM_SAMPLES / 10; i += (INTERVAL / cubic.speed() +0.5)) { + CPPUNIT_ASSERT_EQUAL (1.0f, output[i]); + } +} -- cgit v1.2.3