The open source OpenXR runtime
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}