interpolation.cc/h: Remove all failed and obsolete attempts, leave linear and cubic
[ardour.git] / libs / ardour / tests / interpolation-test.cc
index 6a5bcd5ed496b2cdf4d838d2e9f3d7e865d83e20..45e350d12b083bf6b7934ec6897508f90ecb1a31 100644 (file)
@@ -16,10 +16,7 @@ InterpolationTest::linearInterpolationTest ()
          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));
-             //printf ("Interpolate: input: %d, output: %d, i: %d\n", input + i, output + i, i);
              result = linear.interpolate (0, 1024, input + i, output + i*3);
-             //printf ("Result: %d\n", result);
-             //CPPUNIT_ASSERT_EQUAL ((uint32_t)((NUM_SAMPLES - 100) * interpolation.speed()), result);
              i += result;
          }
          
@@ -87,146 +84,87 @@ InterpolationTest::linearInterpolationTest ()
          }
          /*
          for (int i=0; i < NUM_SAMPLES; ++i) {
-         cout << "input[" << i << "] = " << input[i] << "  output[" << i << "] = " << output[i] << endl; 
-     }
-     */   
+             cout  << i << " " << output[i] << endl; 
+         }
+         */
 }
 
 void
-InterpolationTest::splineInterpolationTest ()
+InterpolationTest::cubicInterpolationTest ()
 {
         nframes_t result = 0;
-         cout << "\nspline Interpolation Test\n";
-         
-         cout << "\nSpeed: 1/2" << endl;
-         spline.reset();
-         spline.set_speed (0.5);
-         int one_period = 1024;
-         
-         /*
-         
-         for (int i = 0; 2 * i < NUM_SAMPLES - one_period;) {
-             result = spline.interpolate (0, one_period, input + i, output + 2*i);
+         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;
          }
-         for (int i=0; i < NUM_SAMPLES - one_period; ++i) {
-             //cout << "input[" << i << "] = " << input[i] << "  output[" << i << "] = " << output[i] << endl; 
-             if (i % 200 == 0) { CPPUNIT_ASSERT_EQUAL (double(1.0), double(output[i])); }
-             else if (i % 2 == 0) { CPPUNIT_ASSERT_EQUAL (double(0.0), double(output[i])); }
-         }
-         */
          
+         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 ((uint32_t)(NUM_SAMPLES * cubic.speed()), result);
+         for (int i = 0; i < NUM_SAMPLES; i += INTERVAL) {
+                 CPPUNIT_ASSERT_EQUAL (1.0f, output[i]);
+         }
          
-         // square wave
-         for (int i = 0; i < NUM_SAMPLES; ++i) {
-             if (i % (INTERVAL/2) < INTERVAL/4 ) {
-                 input[i] = 1.0f;
-             } else {
-                 input[i] = 0.0f;
-             }
-             output[i] = 0.0f;
+         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 ((uint32_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 ((uint32_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 ((uint32_t)(NUM_SAMPLES * cubic.speed()), result);
          
-         /*
-         //sine wave
-         for (int i = 0; i < NUM_SAMPLES; ++i) {
-             input[i] = sin(double(i) * M_2_PI / INTERVAL * 10.0);
-         } 
+         /* 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 ((nframes_t)(NUM_SAMPLES * cubic.speed()), result);
          */
          
-         one_period = 512;
-         
-         cout << "\nSpeed: 1/60" << endl;
-         spline.reset();
-         spline.set_speed (1.0/90.0);
-         
-         
-         for (int i = 0, o = 0; 90 * i < NUM_SAMPLES - one_period; o++) {
-             result = spline.interpolate (0, one_period, input + i, output + o * one_period);
-             //printf ("Result: %d\n", result);
-             i += result;
-         }
-         
-         for (int i=0; i < NUM_SAMPLES - one_period; ++i) {
-             cout  << i << " " << output[i] << endl; 
-             //if (i % 333 == 0) { CPPUNIT_ASSERT_EQUAL (double(1.0), double(output[i])); }
-             //else if (i % 2 == 0) { CPPUNIT_ASSERT_EQUAL (double(0.0), double(output[i])); }
+         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 ((uint32_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]);
          }
-}
-
-void
-InterpolationTest::libSamplerateInterpolationTest ()
-{
-    nframes_t result;
-    
-    cout << "\nLibSamplerate Interpolation Test\n";
-/*
-    cout << "\nSpeed: 1.0";
-    interpolation.set_speed (1.0);
-    for (int i = 0; i < NUM_SAMPLES;) {
-        interpolation.set_speed (1.0);
-        result = interpolation.interpolate (0, INTERVAL/10, input + i, output + i);
-        CPPUNIT_ASSERT_EQUAL ((uint32_t)(INTERVAL/10 * interpolation.speed()), result);
-        i += result;
-    }
-    
-    for (int i = 0; i < NUM_SAMPLES; i += INTERVAL) {
-        CPPUNIT_ASSERT_EQUAL (1.0f, output[i+1]);
-    }
-*/
-    
-    cout << "\nSpeed: 0.5";
-    for (int i = 0; i < NUM_SAMPLES;) {
-        interpolation.set_speed (0.5);
-        //printf ("Interpolate: input: %d, output: %d, i: %d\n", input + i, output + i, i);
-        result = interpolation.interpolate (0, NUM_SAMPLES - 100, input + i, output + i);
-        printf ("Result: %d\n", result);
-        //CPPUNIT_ASSERT_EQUAL ((uint32_t)((NUM_SAMPLES - 100) * interpolation.speed()), result);
-        //i += result;
-        break;
-    }
-
-    for (int i=0; i < NUM_SAMPLES; ++i) {
-        cout << "input[" << i << "] = " << input[i] << "  output[" << i << "] = " << output[i] << endl;    
-    }
 
-    
-    cout << "\nSpeed: 0.2";
-    interpolation.set_speed (0.2);
-    result = interpolation.interpolate (0, NUM_SAMPLES, input, output);
-    CPPUNIT_ASSERT_EQUAL ((uint32_t)(NUM_SAMPLES * interpolation.speed()), result);
-
-    cout << "\nSpeed: 0.02";
-    interpolation.set_speed (0.02);
-    result = interpolation.interpolate (0, NUM_SAMPLES, input, output);
-    CPPUNIT_ASSERT_EQUAL ((uint32_t)(NUM_SAMPLES * interpolation.speed()), result);
-    
-    cout << "\nSpeed: 0.002";
-    interpolation.set_speed (0.002);
-    result = interpolation.interpolate (0, NUM_SAMPLES, input, output);
-    CPPUNIT_ASSERT_EQUAL ((uint32_t)(NUM_SAMPLES * interpolation.speed()), result);
-    
-    cout << "\nSpeed: 2.0";
-    interpolation.set_speed (2.0);
-    result = interpolation.interpolate (0, NUM_SAMPLES / 2, input, output);
-    CPPUNIT_ASSERT_EQUAL ((uint32_t)(NUM_SAMPLES / 2 * interpolation.speed()), result);
-    for (int i = 0; i < NUM_SAMPLES / 2; i += (INTERVAL / interpolation.speed() +0.5)) {
-        CPPUNIT_ASSERT_EQUAL (1.0f, output[i]);
-    }
-
-    cout << "\nSpeed: 10.0";
-    interpolation.set_speed (10.0);
-    result = interpolation.interpolate (0, NUM_SAMPLES / 10, input, output);
-    CPPUNIT_ASSERT_EQUAL ((uint32_t)(NUM_SAMPLES / 10 * interpolation.speed()), result);
-    for (int i = 0; i < NUM_SAMPLES / 10; i += (INTERVAL / interpolation.speed() +0.5)) {
-        CPPUNIT_ASSERT_EQUAL (1.0f, output[i]);
-    }
-    /*
-    for (int i=0; i < NUM_SAMPLES; ++i) {
-        cout << "input[" << i << "] = " << input[i] << "  output[" << i << "] = " << output[i] << endl;    
-    }
-    */
+         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 ((uint32_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]);
+         }
 }