diff options
author | Aaron Rossetto <aaron.rossetto@ni.com> | 2022-01-19 13:52:51 -0600 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2022-02-28 14:47:47 -0600 |
commit | d835d348b3d2ba5e790855dde2d7824234e3c531 (patch) | |
tree | e97af5f88bd1bf0444f2681b7bbaab5b6b45be18 /host | |
parent | 0871ac23092d815ee7db86d3a82d234a28ed8111 (diff) | |
download | uhd-d835d348b3d2ba5e790855dde2d7824234e3c531.tar.gz uhd-d835d348b3d2ba5e790855dde2d7824234e3c531.tar.bz2 uhd-d835d348b3d2ba5e790855dde2d7824234e3c531.zip |
convert: Minor cleanup
This commit implements some minor cleanup of various converter- and
convert test-related code:
* Improves the log messages regarding which converter was returned for a
request.
* Modifies the result checking code in the converter tests to only
report an out-of-range sample error once, rather than reporting every
out-of-range sample encountered during the test. This vastly cuts down
on the output when a conversion has failed.
* Adds a function `reverse_converter()` which, given a
`convert::id_type` describing a conversion from C1 to C2, returns a
`convert::id_type` describing the reverse conversion (C2 to C1).
* Removes two redundant test cases from the converter test.
Diffstat (limited to 'host')
-rw-r--r-- | host/lib/convert/convert_impl.cpp | 4 | ||||
-rw-r--r-- | host/tests/convert_test.cpp | 149 |
2 files changed, 38 insertions, 115 deletions
diff --git a/host/lib/convert/convert_impl.cpp b/host/lib/convert/convert_impl.cpp index 228f15552..491b8ba1d 100644 --- a/host/lib/convert/convert_impl.cpp +++ b/host/lib/convert/convert_impl.cpp @@ -83,7 +83,7 @@ convert::function_type convert::get_converter(const id_type& id, const priority_ //----------------------------------------------------------------// UHD_LOGGER_DEBUG("CONVERT") << "get_converter: For converter ID: " << id.to_pp_string() - << " Using prio: " << prio; + << " Found exact match for prio: " << prio; ; //----------------------------------------------------------------// return get_table()[id][prio]; @@ -99,7 +99,7 @@ convert::function_type convert::get_converter(const id_type& id, const priority_ //----------------------------------------------------------------// UHD_LOGGER_DEBUG("CONVERT") << "get_converter: For converter ID: " << id.to_pp_string() - << " Using prio: " << best_prio; + << " Using best available prio: " << best_prio; //----------------------------------------------------------------// // otherwise, return best prio diff --git a/host/tests/convert_test.cpp b/host/tests/convert_test.cpp index ac0340cc1..f002b16a2 100644 --- a/host/tests/convert_test.cpp +++ b/host/tests/convert_test.cpp @@ -22,10 +22,25 @@ typedef std::complex<double> fc64_t; #define MY_CHECK_CLOSE(a, b, f) \ { \ - BOOST_CHECK_MESSAGE(std::abs((a) - (b)) < f, \ + static bool error_encountered = false; \ + if(!error_encountered && (std::abs((a) - (b)) >= f)) { \ + BOOST_ERROR( \ "\n\t" << #a << " (" << (a) << ") error " << #b << " (" << (b) << ")"); \ + error_encountered = true; \ + } \ } +// Given a converter ID describing a conversion from input type to +// output type, return the 'reverse' converter ID from output type to +// input type +static convert::id_type reverse_converter(const convert::id_type& in) +{ + convert::id_type out = in; + std::swap(out.input_format, out.output_format); + std::swap(out.num_inputs, out.num_outputs); + return out; +} + /*********************************************************************** * Loopback runner: * convert input buffer into intermediate buffer @@ -43,8 +58,8 @@ static void loopback(size_t nsamps, // make this buffer large enough for all test types std::vector<uint64_t> interm(nsamps); - std::vector<const void*> input0(1, &input[0]), input1(1, &interm[0]); - std::vector<void*> output0(1, &interm[0]), output1(1, &output[0]); + std::vector<const void*> input0{&input[0]}, input1{&interm[0]}; + std::vector<void*> output0{&interm[0]}, output1{&output[0]}; // convert to intermediate type convert::converter::sptr c0 = convert::get_converter(in_id, prio_in)(); @@ -66,17 +81,17 @@ static void test_convert_types_sc16( // fill the input samples std::vector<sc16_t> input(nsamps), output(nsamps); for (sc16_t& in : input) + { in = sc16_t( short((float((std::rand()) / (double(RAND_MAX) / 2)) - 1) * 32767 / extra_div) & mask, short((float((std::rand()) / (double(RAND_MAX) / 2)) - 1) * 32767 / extra_div) & mask); + } // run the loopback and test convert::id_type in_id = id; - convert::id_type out_id = id; - std::swap(out_id.input_format, out_id.output_format); - std::swap(out_id.num_inputs, out_id.num_outputs); + convert::id_type out_id = reverse_converter(id); loopback(nsamps, in_id, out_id, input, output); BOOST_CHECK_EQUAL_COLLECTIONS( input.begin(), input.end(), output.begin(), output.end()); @@ -136,15 +151,15 @@ static void test_convert_types_for_floats( // fill the input samples std::vector<data_type> input(nsamps), output(nsamps); for (data_type& in : input) + { in = data_type( ((std::rand() / (value_type(RAND_MAX) / 2)) - 1) * float(extra_scale), ((std::rand() / (value_type(RAND_MAX) / 2)) - 1) * float(extra_scale)); + } // run the loopback and test convert::id_type in_id = id; - convert::id_type out_id = id; - std::swap(out_id.input_format, out_id.output_format); - std::swap(out_id.num_inputs, out_id.num_outputs); + convert::id_type out_id = reverse_converter(id); // make a list of all prio: best/generic combos typedef std::pair<int, int> int_pair_t; @@ -351,95 +366,6 @@ BOOST_AUTO_TEST_CASE(test_convert_types_fc32_with_fc32_chdr) } /*********************************************************************** - * Test float to short conversion loopback - **********************************************************************/ -BOOST_AUTO_TEST_CASE(test_convert_types_fc32_to_sc16) -{ - convert::id_type in_id; - in_id.input_format = "fc32"; - in_id.num_inputs = 1; - in_id.output_format = "sc16_item32_le"; - in_id.num_outputs = 1; - - convert::id_type out_id; - out_id.input_format = "sc16_item32_le"; - out_id.num_inputs = 1; - out_id.output_format = "sc16"; - out_id.num_outputs = 1; - - const size_t nsamps = 13; - std::vector<fc32_t> input(nsamps); - for (fc32_t& in : input) - in = fc32_t( - (std::rand() / (RAND_MAX / 2.0)) - 1, (std::rand() / (RAND_MAX / 2.0)) - 1); - std::vector<uint32_t> interm(nsamps); - std::vector<sc16_t> output(nsamps); - - std::vector<const void*> input0(1, &input[0]), input1(1, &interm[0]); - std::vector<void*> output0(1, &interm[0]), output1(1, &output[0]); - - // convert float to intermediate - convert::converter::sptr c0 = convert::get_converter(in_id)(); - c0->set_scalar(32767.); - c0->conv(input0, output0, nsamps); - - // convert intermediate to short - convert::converter::sptr c1 = convert::get_converter(out_id)(); - c1->set_scalar(1 / 32767.); - c1->conv(input1, output1, nsamps); - - // test that the inputs and outputs match - for (size_t i = 0; i < nsamps; i++) { - MY_CHECK_CLOSE(input[i].real(), output[i].real() / float(32767), float(0.01)); - MY_CHECK_CLOSE(input[i].imag(), output[i].imag() / float(32767), float(0.01)); - } -} - -/*********************************************************************** - * Test short to float conversion loopback - **********************************************************************/ -BOOST_AUTO_TEST_CASE(test_convert_types_sc16_to_fc32) -{ - convert::id_type in_id; - in_id.input_format = "sc16"; - in_id.num_inputs = 1; - in_id.output_format = "sc16_item32_le"; - in_id.num_outputs = 1; - - convert::id_type out_id; - out_id.input_format = "sc16_item32_le"; - out_id.num_inputs = 1; - out_id.output_format = "fc32"; - out_id.num_outputs = 1; - - const size_t nsamps = 13; - std::vector<sc16_t> input(nsamps); - for (sc16_t& in : input) - in = sc16_t(std::rand() - (RAND_MAX / 2), std::rand() - (RAND_MAX / 2)); - std::vector<uint32_t> interm(nsamps); - std::vector<fc32_t> output(nsamps); - - std::vector<const void*> input0(1, &input[0]), input1(1, &interm[0]); - std::vector<void*> output0(1, &interm[0]), output1(1, &output[0]); - - // convert short to intermediate - convert::converter::sptr c0 = convert::get_converter(in_id)(); - c0->set_scalar(32767.); - c0->conv(input0, output0, nsamps); - - // convert intermediate to float - convert::converter::sptr c1 = convert::get_converter(out_id)(); - c1->set_scalar(1 / 32767.); - c1->conv(input1, output1, nsamps); - - // test that the inputs and outputs match - for (size_t i = 0; i < nsamps; i++) { - MY_CHECK_CLOSE(input[i].real() / float(32767), output[i].real(), float(0.01)); - MY_CHECK_CLOSE(input[i].imag() / float(32767), output[i].imag(), float(0.01)); - } -} - -/*********************************************************************** * Test sc8 conversions **********************************************************************/ BOOST_AUTO_TEST_CASE(test_convert_types_fc64_and_sc8) @@ -509,16 +435,15 @@ static void test_convert_types_u8(size_t nsamps, convert::id_type& id) { // fill the input samples std::vector<uint8_t> input(nsamps), output(nsamps); - for (uint8_t& in : input) + for (uint8_t& in : input) { in = uint8_t(std::rand() & 0xFF); + } // uint32_t d = 48; // for(uint8_t &in: input) in = d++; // run the loopback and test convert::id_type in_id = id; - convert::id_type out_id = id; - std::swap(out_id.input_format, out_id.output_format); - std::swap(out_id.num_inputs, out_id.num_outputs); + convert::id_type out_id = reverse_converter(id); loopback(nsamps, in_id, out_id, input, output); BOOST_CHECK_EQUAL_COLLECTIONS( input.begin(), input.end(), output.begin(), output.end()); @@ -565,14 +490,13 @@ static void test_convert_types_s8(size_t nsamps, convert::id_type& id) { // fill the input samples std::vector<int8_t> input(nsamps), output(nsamps); - for (int8_t& in : input) + for (int8_t& in : input) { in = int8_t(std::rand() & 0xFF); + } // run the loopback and test convert::id_type in_id = id; - convert::id_type out_id = id; - std::swap(out_id.input_format, out_id.output_format); - std::swap(out_id.num_inputs, out_id.num_outputs); + convert::id_type out_id = reverse_converter(id); loopback(nsamps, in_id, out_id, input, output); BOOST_CHECK_EQUAL_COLLECTIONS( input.begin(), input.end(), output.begin(), output.end()); @@ -619,14 +543,13 @@ static void test_convert_types_s16(size_t nsamps, convert::id_type& id) { // fill the input samples std::vector<int16_t> input(nsamps), output(nsamps); - for (int16_t& in : input) + for (int16_t& in : input) { in = int16_t(std::rand() & 0xFFFF); + } // run the loopback and test convert::id_type in_id = id; - convert::id_type out_id = id; - std::swap(out_id.input_format, out_id.output_format); - std::swap(out_id.num_inputs, out_id.num_outputs); + convert::id_type out_id = reverse_converter(id); loopback(nsamps, in_id, out_id, input, output); BOOST_CHECK_EQUAL_COLLECTIONS( input.begin(), input.end(), output.begin(), output.end()); @@ -674,14 +597,14 @@ static void test_convert_types_fc32(size_t nsamps, convert::id_type& id) // fill the input samples std::vector<std::complex<float>> input(nsamps), output(nsamps); for (fc32_t& in : input) + { in = fc32_t((std::rand() / float(RAND_MAX / 2)) - 1, (std::rand() / float(RAND_MAX / 2)) - 1); + } // run the loopback and test convert::id_type in_id = id; - convert::id_type out_id = id; - std::swap(out_id.input_format, out_id.output_format); - std::swap(out_id.num_inputs, out_id.num_outputs); + convert::id_type out_id = reverse_converter(id); loopback(nsamps, in_id, out_id, input, output); for (size_t i = 0; i < nsamps; i++) { MY_CHECK_CLOSE(input[i].real(), output[i].real(), float(1. / (1 << 16))); |