Dump enhancements
This commit is contained in:
@@ -29,6 +29,8 @@
|
|||||||
#include "../../rubberband/RubberBandLiveShifter.h"
|
#include "../../rubberband/RubberBandLiveShifter.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
@@ -37,50 +39,61 @@ using namespace RubberBand;
|
|||||||
using std::vector;
|
using std::vector;
|
||||||
using std::cerr;
|
using std::cerr;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
using std::string;
|
||||||
|
using std::ofstream;
|
||||||
|
|
||||||
namespace tt = boost::test_tools;
|
namespace tt = boost::test_tools;
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE(TestLiveShifter)
|
BOOST_AUTO_TEST_SUITE(TestLiveShifter)
|
||||||
|
|
||||||
static void dump(const vector<float> &in,
|
static void dumpTo(string basename,
|
||||||
|
const vector<float> &data)
|
||||||
|
{
|
||||||
|
string dir = "/tmp";
|
||||||
|
string filename = dir + "/" + basename + ".csv";
|
||||||
|
ofstream file(filename, std::ios::out | std::ios::binary);
|
||||||
|
if (!file) {
|
||||||
|
cerr << "dumpTo: failed to open file \"" << filename << "\" for writing" << endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
file << "sample,V" << endl;
|
||||||
|
for (int i = 0; i < int(data.size()); ++i) {
|
||||||
|
file << i << "," << data[i] << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump(string prefix,
|
||||||
|
const vector<float> &in,
|
||||||
const vector<float> &out,
|
const vector<float> &out,
|
||||||
const vector<float> &expected,
|
const vector<float> &expected,
|
||||||
int delay)
|
int delay)
|
||||||
{
|
{
|
||||||
std::cerr << "dump: delay reported as " << delay << std::endl;
|
cerr << "dump: delay reported as " << delay << endl;
|
||||||
|
|
||||||
// The prefix is to allow grep on the test output
|
if (prefix != "") {
|
||||||
|
prefix += "-";
|
||||||
std::cout << "IN,sample,V" << std::endl;
|
|
||||||
for (int i = 0; i < int(in.size()); ++i) {
|
|
||||||
std::cout << "IN," << i << "," << in[i] << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "OUT,sample,V" << std::endl;
|
dumpTo(prefix + "in", in);
|
||||||
for (int i = 0; i < int(out.size()); ++i) {
|
dumpTo(prefix + "out", out);
|
||||||
std::cout << "OUT," << i << "," << out[i] << std::endl;
|
dumpTo(prefix + "expected", expected);
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "SHIFTED,sample,V" << std::endl;
|
vector<float> shifted;
|
||||||
|
vector<float> diff;
|
||||||
for (int i = 0; i + delay < int(out.size()); ++i) {
|
for (int i = 0; i + delay < int(out.size()); ++i) {
|
||||||
std::cout << "SHIFTED," << i << "," << out[i + delay] << std::endl;
|
shifted.push_back(out[i + delay]);
|
||||||
}
|
diff.push_back(out[i + delay] - expected[i]);
|
||||||
|
|
||||||
std::cout << "EXPECTED,sample,V" << std::endl;
|
|
||||||
for (int i = 0; i < int(expected.size()); ++i) {
|
|
||||||
std::cout << "EXPECTED," << i << "," << expected[i] << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "DIFF,sample,V" << std::endl;
|
|
||||||
for (int i = 0; i + delay < int(expected.size()); ++i) {
|
|
||||||
std::cout << "DIFF," << i << "," << out[i + delay] - expected[i] << std::endl;
|
|
||||||
}
|
}
|
||||||
|
dumpTo(prefix + "shifted", shifted);
|
||||||
|
dumpTo(prefix + "diff", diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_sinusoid_unchanged(int n, int rate, float freq,
|
static void check_sinusoid_unchanged(int n, int rate, float freq,
|
||||||
RubberBandLiveShifter::Options options,
|
RubberBandLiveShifter::Options options,
|
||||||
bool printDebug)
|
string debugPrefix = {})
|
||||||
{
|
{
|
||||||
|
bool printDebug = (debugPrefix != "");
|
||||||
|
|
||||||
if (printDebug) {
|
if (printDebug) {
|
||||||
RubberBandLiveShifter::setDefaultDebugLevel(2);
|
RubberBandLiveShifter::setDefaultDebugLevel(2);
|
||||||
}
|
}
|
||||||
@@ -124,9 +137,9 @@ static void check_sinusoid_unchanged(int n, int rate, float freq,
|
|||||||
float fout = out[delay + i];
|
float fout = out[delay + i];
|
||||||
float err = fabsf(fin - fout);
|
float err = fabsf(fin - fout);
|
||||||
if (err > slackeps) {
|
if (err > slackeps) {
|
||||||
std::cerr << "Error at index " << i << " exceeds slack eps "
|
cerr << "Error at index " << i << " exceeds slack eps "
|
||||||
<< slackeps << ": output " << fout << " - input "
|
<< slackeps << ": output " << fout << " - input "
|
||||||
<< fin << " = " << fout - fin << std::endl;
|
<< fin << " = " << fout - fin << endl;
|
||||||
BOOST_TEST(err < eps);
|
BOOST_TEST(err < eps);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -137,9 +150,9 @@ static void check_sinusoid_unchanged(int n, int rate, float freq,
|
|||||||
float fout = out[delay + i];
|
float fout = out[delay + i];
|
||||||
float err = fabsf(fin - fout);
|
float err = fabsf(fin - fout);
|
||||||
if (err > eps) {
|
if (err > eps) {
|
||||||
std::cerr << "Error at index " << i << " exceeds tight eps "
|
cerr << "Error at index " << i << " exceeds tight eps "
|
||||||
<< eps << ": output " << fout << " - input "
|
<< eps << ": output " << fout << " - input "
|
||||||
<< fin << " = " << fout - fin << std::endl;
|
<< fin << " = " << fout - fin << endl;
|
||||||
BOOST_TEST(err < eps);
|
BOOST_TEST(err < eps);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -147,14 +160,16 @@ static void check_sinusoid_unchanged(int n, int rate, float freq,
|
|||||||
|
|
||||||
if (printDebug) {
|
if (printDebug) {
|
||||||
RubberBandLiveShifter::setDefaultDebugLevel(0);
|
RubberBandLiveShifter::setDefaultDebugLevel(0);
|
||||||
dump(in, out, in, delay);
|
dump(debugPrefix, in, out, in, delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_sinusoid_shifted(int n, int rate, float freq, float shift,
|
static void check_sinusoid_shifted(int n, int rate, float freq, float shift,
|
||||||
RubberBandLiveShifter::Options options,
|
RubberBandLiveShifter::Options options,
|
||||||
bool printDebug)
|
string debugPrefix = {})
|
||||||
{
|
{
|
||||||
|
bool printDebug = (debugPrefix != "");
|
||||||
|
|
||||||
if (printDebug) {
|
if (printDebug) {
|
||||||
RubberBandLiveShifter::setDefaultDebugLevel(2);
|
RubberBandLiveShifter::setDefaultDebugLevel(2);
|
||||||
}
|
}
|
||||||
@@ -201,9 +216,9 @@ static void check_sinusoid_shifted(int n, int rate, float freq, float shift,
|
|||||||
float fout = out[delay + i];
|
float fout = out[delay + i];
|
||||||
float err = fabsf(fin - fout);
|
float err = fabsf(fin - fout);
|
||||||
if (err > slackeps) {
|
if (err > slackeps) {
|
||||||
std::cerr << "Error at index " << i << " exceeds slack eps "
|
cerr << "Error at index " << i << " exceeds slack eps "
|
||||||
<< slackeps << ": output " << fout << " - expected "
|
<< slackeps << ": output " << fout << " - expected "
|
||||||
<< fin << " = " << fout - fin << std::endl;
|
<< fin << " = " << fout - fin << endl;
|
||||||
BOOST_TEST(err < eps);
|
BOOST_TEST(err < eps);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -214,9 +229,9 @@ static void check_sinusoid_shifted(int n, int rate, float freq, float shift,
|
|||||||
float fout = out[delay + i];
|
float fout = out[delay + i];
|
||||||
float err = fabsf(fin - fout);
|
float err = fabsf(fin - fout);
|
||||||
if (err > eps) {
|
if (err > eps) {
|
||||||
std::cerr << "Error at index " << i << " exceeds tight eps "
|
cerr << "Error at index " << i << " exceeds tight eps "
|
||||||
<< eps << ": output " << fout << " - expected "
|
<< eps << ": output " << fout << " - expected "
|
||||||
<< fin << " = " << fout - fin << std::endl;
|
<< fin << " = " << fout - fin << endl;
|
||||||
BOOST_TEST(err < eps);
|
BOOST_TEST(err < eps);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -224,43 +239,53 @@ static void check_sinusoid_shifted(int n, int rate, float freq, float shift,
|
|||||||
|
|
||||||
if (printDebug) {
|
if (printDebug) {
|
||||||
RubberBandLiveShifter::setDefaultDebugLevel(0);
|
RubberBandLiveShifter::setDefaultDebugLevel(0);
|
||||||
dump(in, out, expected, delay);
|
dump(debugPrefix, in, out, expected, delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(sinusoid_unchanged)
|
BOOST_AUTO_TEST_CASE(sinusoid_unchanged)
|
||||||
{
|
{
|
||||||
int n = 20000;
|
int n = 20000;
|
||||||
check_sinusoid_unchanged(n, 44100, 440.f, 0, false);
|
check_sinusoid_unchanged(n, 44100, 440.f, 0);
|
||||||
check_sinusoid_unchanged(n, 48000, 260.f, 0, false);
|
check_sinusoid_unchanged(n, 48000, 260.f, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(sinusoid_down_octave)
|
BOOST_AUTO_TEST_CASE(sinusoid_down_octave_440)
|
||||||
{
|
{
|
||||||
int n = 20000;
|
int n = 20000;
|
||||||
check_sinusoid_shifted(n, 44100, 440.f, 0.5f, 0, false);
|
check_sinusoid_shifted(n, 44100, 440.f, 0.5f, 0);
|
||||||
// check_sinusoid_shifted(n, 48000, 260.f, 0.5f, 0, false);
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(sinusoid_down_octave_260)
|
||||||
|
{
|
||||||
|
int n = 20000;
|
||||||
|
check_sinusoid_shifted(n, 48000, 260.f, 0.5f, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(sinusoid_down_2octave)
|
BOOST_AUTO_TEST_CASE(sinusoid_down_2octave)
|
||||||
{
|
{
|
||||||
int n = 20000;
|
int n = 20000;
|
||||||
check_sinusoid_shifted(n, 44100, 440.f, 0.25f, 0, false);
|
// check_sinusoid_shifted(n, 44100, 440.f, 0.25f, 0);
|
||||||
// check_sinusoid_shifted(n, 48000, 260.f, 0.5f, 0, false);
|
// check_sinusoid_shifted(n, 48000, 260.f, 0.5f, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(sinusoid_up_octave)
|
BOOST_AUTO_TEST_CASE(sinusoid_up_octave_440)
|
||||||
{
|
{
|
||||||
int n = 20000;
|
int n = 20000;
|
||||||
check_sinusoid_shifted(n, 44100, 440.f, 2.0f, 0, false);
|
check_sinusoid_shifted(n, 44100, 440.f, 2.0f, 0);
|
||||||
// check_sinusoid_shifted(n, 48000, 260.f, 0.5f, 0, false);
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(sinusoid_up_octave_260)
|
||||||
|
{
|
||||||
|
int n = 20000;
|
||||||
|
check_sinusoid_shifted(n, 44100, 260.f, 2.0f, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(sinusoid_up_2octave)
|
BOOST_AUTO_TEST_CASE(sinusoid_up_2octave)
|
||||||
{
|
{
|
||||||
int n = 20000;
|
int n = 20000;
|
||||||
check_sinusoid_shifted(n, 44100, 440.f, 4.0f, 0, false);
|
// check_sinusoid_shifted(n, 44100, 440.f, 4.0f, 0, true);
|
||||||
// check_sinusoid_shifted(n, 48000, 260.f, 0.5f, 0, false);
|
// check_sinusoid_shifted(n, 48000, 260.f, 0.5f, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|||||||
Reference in New Issue
Block a user