The open source OpenXR runtime
at prediction 3.2 kB view raw
1// Copyright 2022, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3/*! 4 * @file 5 * @brief Integer low pass filter tests. 6 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 7 */ 8 9#include <math/m_lowpass_integer.hpp> 10#include <math/m_lowpass_integer.h> 11 12#include "catch_amalgamated.hpp" 13 14using xrt::auxiliary::math::IntegerLowPassIIRFilter; 15using xrt::auxiliary::math::Rational; 16static constexpr uint16_t InitialState = 300; 17 18TEMPLATE_TEST_CASE("IntegerLowPassIIRFilter", "", int32_t, uint32_t) 19{ 20 IntegerLowPassIIRFilter<TestType> filter(Rational<TestType>{1, 2}); 21 22 CHECK_FALSE(filter.isInitialized()); 23 24 filter.addSample(InitialState); 25 CHECK(filter.getState() == InitialState); 26 CHECK(filter.isInitialized()); 27 28 auto prev = filter.getState(); 29 SECTION("Increase") 30 { 31 constexpr auto newTarget = InitialState * 2; 32 for (int i = 0; i < 20; ++i) { 33 filter.addSample(newTarget); 34 REQUIRE(filter.isInitialized()); 35 // not going to exceed this 36 if (prev == newTarget || prev == newTarget - 1) { 37 REQUIRE(filter.getState() == prev); 38 } else { 39 REQUIRE(filter.getState() > prev); 40 prev = filter.getState(); 41 } 42 } 43 } 44 45 SECTION("Decrease") 46 { 47 constexpr auto newTarget = InitialState / 2; 48 for (int i = 0; i < 20; ++i) { 49 50 filter.addSample(newTarget); 51 REQUIRE(filter.isInitialized()); 52 if (prev == newTarget) { 53 REQUIRE(filter.getState() == newTarget); 54 } else { 55 REQUIRE(filter.getState() < prev); 56 prev = filter.getState(); 57 } 58 } 59 } 60 SECTION("Stay Same") 61 { 62 for (int i = 0; i < 20; ++i) { 63 64 filter.addSample(InitialState); 65 REQUIRE(filter.isInitialized()); 66 REQUIRE(filter.getState() == InitialState); 67 } 68 } 69} 70 71TEST_CASE("m_lowpass_integer") 72{ 73 74 struct m_lowpass_integer *filter = m_lowpass_integer_create(1, 2); 75 CHECK(filter); 76 77 CHECK_FALSE(m_lowpass_integer_is_initialized(filter)); 78 79 m_lowpass_integer_add_sample(filter, InitialState); 80 REQUIRE(m_lowpass_integer_is_initialized(filter)); 81 CHECK(m_lowpass_integer_get_state(filter) == InitialState); 82 83 84 auto prev = m_lowpass_integer_get_state(filter); 85 SECTION("Increase") 86 { 87 constexpr auto newTarget = InitialState * 2; 88 for (int i = 0; i < 20; ++i) { 89 m_lowpass_integer_add_sample(filter, newTarget); 90 REQUIRE(m_lowpass_integer_is_initialized(filter)); 91 // not going to exceed this 92 if (prev == newTarget || prev == newTarget - 1) { 93 REQUIRE(m_lowpass_integer_get_state(filter) == prev); 94 } else { 95 REQUIRE(m_lowpass_integer_get_state(filter) > prev); 96 prev = m_lowpass_integer_get_state(filter); 97 } 98 } 99 } 100 101 SECTION("Decrease") 102 { 103 constexpr auto newTarget = InitialState / 2; 104 for (int i = 0; i < 20; ++i) { 105 106 m_lowpass_integer_add_sample(filter, newTarget); 107 REQUIRE(m_lowpass_integer_is_initialized(filter)); 108 if (prev == newTarget) { 109 REQUIRE(m_lowpass_integer_get_state(filter) == newTarget); 110 } else { 111 REQUIRE(m_lowpass_integer_get_state(filter) < prev); 112 prev = m_lowpass_integer_get_state(filter); 113 } 114 } 115 } 116 SECTION("Stay Same") 117 { 118 for (int i = 0; i < 20; ++i) { 119 120 m_lowpass_integer_add_sample(filter, InitialState); 121 REQUIRE(m_lowpass_integer_is_initialized(filter)); 122 REQUIRE(m_lowpass_integer_get_state(filter) == InitialState); 123 } 124 } 125}