diff options
Diffstat (limited to 'host/tests/cal_data_gain_pwr_test.cpp')
-rw-r--r-- | host/tests/cal_data_gain_pwr_test.cpp | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/host/tests/cal_data_gain_pwr_test.cpp b/host/tests/cal_data_gain_pwr_test.cpp new file mode 100644 index 000000000..e066a96f3 --- /dev/null +++ b/host/tests/cal_data_gain_pwr_test.cpp @@ -0,0 +1,134 @@ +// +// Copyright 2020 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#include <uhd/cal/pwr_cal.hpp> +#include <uhd/exception.hpp> +#include <boost/test/unit_test.hpp> +#include <iostream> + +using namespace uhd::usrp::cal; + +BOOST_AUTO_TEST_CASE(test_pwr_cal_api) +{ + const std::string name = "Mock Gain/Power Data"; + const std::string serial = "ABC1234"; + const uint64_t timestamp = 0x12340000; + + auto gain_power_data = pwr_cal::make(name, serial, timestamp); + BOOST_CHECK_EQUAL(gain_power_data->get_name(), name); + BOOST_CHECK_EQUAL(gain_power_data->get_serial(), serial); + BOOST_CHECK_EQUAL(gain_power_data->get_timestamp(), timestamp); + + constexpr int NEW_TEMP = 25; + gain_power_data->set_temperature(NEW_TEMP); + BOOST_CHECK_EQUAL(gain_power_data->get_temperature(), NEW_TEMP); + + // Write a table... + gain_power_data->add_power_table({{0.0, -30.0}, {10.0, -20.0}}, -40.0, -10.0, 1e9); + // ...read it back... + BOOST_CHECK_EQUAL(gain_power_data->get_power(0.0, 1e9), -30.0); + BOOST_CHECK_EQUAL(gain_power_data->get_power(10.0, 1e9), -20.0); + // ...and make sure any other index will do the same + BOOST_CHECK_EQUAL(gain_power_data->get_power(47.2, 23e6), -20.0); + + // Let's say power goes down 10 dB per octave + gain_power_data->add_power_table({{0.0, -40.0}, {10.0, -30.0}}, -40.0, -10.0, 2e9); + // Do uninterpolated readbacks again + BOOST_CHECK_EQUAL(gain_power_data->get_power(10.0, 1e9), -20.0); + BOOST_CHECK_EQUAL(gain_power_data->get_power(47.2, 23e6), -20.0); + // Now interpolate + BOOST_CHECK_CLOSE(gain_power_data->get_power(5.0, 1.5e9), -30.0, 1e-6); + + // Some ref gain checks + BOOST_CHECK_EQUAL(gain_power_data->get_ref_gain(), 0.0); + gain_power_data->set_ref_gain(5.0); + BOOST_CHECK_EQUAL(gain_power_data->get_ref_gain(), 5.0); + + // Clear, make sure the container doesn't work anymore, and add the value + // back for future tests + gain_power_data->clear(); + BOOST_REQUIRE_THROW(gain_power_data->get_power(47.2, 23e6), uhd::exception); + gain_power_data->add_power_table({{10.0, -20.0}}, -20.0, -20.0, 1e9); + + constexpr int ROOM_TEMP = 20; + gain_power_data->set_temperature(ROOM_TEMP); + BOOST_CHECK_EQUAL(gain_power_data->get_temperature(), ROOM_TEMP); + // Shouldn't change anything yet + BOOST_CHECK_EQUAL(gain_power_data->get_power(10.0, 1e9), -20.0); + // Power shall go down 5 dB at this new temperature (whoa) + gain_power_data->add_power_table({{10.0, -25.0}}, -20.0, -20.0, 1e9); + BOOST_CHECK_EQUAL(gain_power_data->get_power(10.0, 1e9), -25.0); + // And if we have to interpolate, temp compensation uses NN: + BOOST_CHECK_EQUAL(gain_power_data->get_power(10.0, 1e9, 21), -25.0); + + // Now clear, then add a more useful data set. We can stay at ROOM_TEMP. + gain_power_data->clear(); + constexpr double power_offset = -20.0; // 0 dB shall map to -20 dBm + constexpr double lin_error = 0.1; // The linearization error shall increase by 0.1 + // dB per dB gain + constexpr double ref_freq = 1e9; + std::map<double, double> test_gain_power; + constexpr double max_gain = 10.0; + for (double gain = 0.0; gain <= max_gain; gain += 1.0) { + test_gain_power[gain] = gain + power_offset + lin_error * gain; + } + const double min_power = test_gain_power.cbegin()->second; + const double max_power = test_gain_power.crbegin()->second; + gain_power_data->add_power_table(test_gain_power, min_power, max_power, ref_freq); + // Quick check + BOOST_CHECK_EQUAL(gain_power_data->get_power(0.0, ref_freq), power_offset); + const std::pair<double, double> expected_limits{min_power, max_power}; + const auto limits = gain_power_data->get_power_limits(ref_freq); + BOOST_CHECK_EQUAL(limits.start(), min_power); + BOOST_CHECK_EQUAL(limits.stop(), max_power); + + BOOST_CHECK_CLOSE(gain_power_data->get_gain(-20.0, ref_freq), 0.0, 1e-6); + BOOST_CHECK_CLOSE( + gain_power_data->get_gain(test_gain_power.crbegin()->second, ref_freq), + test_gain_power.crbegin()->first, + 1e-6); + BOOST_CHECK_CLOSE(gain_power_data->get_gain(-19.0, ref_freq), 1/1.1, 1e-6); +} + +BOOST_AUTO_TEST_CASE(test_pwr_cal_serdes) +{ + const std::string name = "Mock Gain/Power Data"; + const std::string serial = "ABC1234"; + const uint64_t timestamp = 0x12340000; + auto gain_power_data_blueprint = pwr_cal::make(name, serial, timestamp); + + constexpr double power_offset = -20.0; + constexpr double lin_error = 0.1; + constexpr double ref_freq = 1e9; + std::map<double, double> test_gain_power; + for (double gain = 0.0; gain < 10.0; gain += 1.0) { + test_gain_power[gain] = gain + power_offset + lin_error * gain; + } + const double min_power = test_gain_power[0.0]; + const double max_power = test_gain_power[9.0]; + gain_power_data_blueprint->add_power_table( + test_gain_power, min_power, max_power, ref_freq); + + const auto serialized = gain_power_data_blueprint->serialize(); + auto pwr_cal_data = container::make<pwr_cal>(serialized); + + BOOST_CHECK_EQUAL(pwr_cal_data->get_name(), name); + BOOST_CHECK_EQUAL(pwr_cal_data->get_serial(), serial); + BOOST_CHECK_EQUAL(pwr_cal_data->get_timestamp(), timestamp); + + for (auto& gp : test_gain_power) { + BOOST_CHECK_EQUAL( + pwr_cal_data->get_power(gp.first, ref_freq), + gp.second); + } +} + +BOOST_AUTO_TEST_CASE(test_pwr_cal_des_fail) +{ + std::vector<uint8_t> not_actual_data(42, 23); + + BOOST_REQUIRE_THROW(container::make<pwr_cal>(not_actual_data), uhd::runtime_error); +} |