1 // Copyright 2019 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "biquad.h"
6
7 #include <assert.h>
8 #include <gtest/gtest.h>
9 #include <math.h>
10
11 namespace {
12
TEST(InvalidFrequencyTest,All)13 TEST(InvalidFrequencyTest, All) {
14 struct biquad bq, test_bq;
15 float f_over = 1.5;
16 float f_under = -0.1;
17 double db_gain = 2;
18 double A = pow(10.0, db_gain / 40);
19
20 // check response to freq >= 1
21 biquad_set(&bq, BQ_LOWPASS, f_over, 0, db_gain);
22 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
23 test_bq.b0 = 1;
24 EXPECT_EQ(bq.b0, test_bq.b0);
25 EXPECT_EQ(bq.b1, test_bq.b1);
26 EXPECT_EQ(bq.b2, test_bq.b2);
27 EXPECT_EQ(bq.a1, test_bq.a1);
28 EXPECT_EQ(bq.a2, test_bq.a2);
29
30 biquad_set(&bq, BQ_HIGHPASS, f_over, 0, db_gain);
31 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
32 EXPECT_EQ(bq.b0, test_bq.b0);
33 EXPECT_EQ(bq.b1, test_bq.b1);
34 EXPECT_EQ(bq.b2, test_bq.b2);
35 EXPECT_EQ(bq.a1, test_bq.a1);
36 EXPECT_EQ(bq.a2, test_bq.a2);
37
38 biquad_set(&bq, BQ_BANDPASS, f_over, 0, db_gain);
39 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
40 EXPECT_EQ(bq.b0, test_bq.b0);
41 EXPECT_EQ(bq.b1, test_bq.b1);
42 EXPECT_EQ(bq.b2, test_bq.b2);
43 EXPECT_EQ(bq.a1, test_bq.a1);
44 EXPECT_EQ(bq.a2, test_bq.a2);
45
46 biquad_set(&bq, BQ_LOWSHELF, f_over, 0, db_gain);
47 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
48 test_bq.b0 = A * A;
49 EXPECT_EQ(bq.b0, test_bq.b0);
50 EXPECT_EQ(bq.b1, test_bq.b1);
51 EXPECT_EQ(bq.b2, test_bq.b2);
52 EXPECT_EQ(bq.a1, test_bq.a1);
53 EXPECT_EQ(bq.a2, test_bq.a2);
54
55 biquad_set(&bq, BQ_HIGHSHELF, f_over, 0, db_gain);
56 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
57 test_bq.b0 = 1;
58 EXPECT_EQ(bq.b0, test_bq.b0);
59 EXPECT_EQ(bq.b1, test_bq.b1);
60 EXPECT_EQ(bq.b2, test_bq.b2);
61 EXPECT_EQ(bq.a1, test_bq.a1);
62 EXPECT_EQ(bq.a2, test_bq.a2);
63
64 biquad_set(&bq, BQ_PEAKING, f_over, 0, db_gain);
65 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
66 test_bq.b0 = 1;
67 EXPECT_EQ(bq.b0, test_bq.b0);
68 EXPECT_EQ(bq.b1, test_bq.b1);
69 EXPECT_EQ(bq.b2, test_bq.b2);
70 EXPECT_EQ(bq.a1, test_bq.a1);
71 EXPECT_EQ(bq.a2, test_bq.a2);
72
73 biquad_set(&bq, BQ_NOTCH, f_over, 0, db_gain);
74 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
75 test_bq.b0 = 1;
76 EXPECT_EQ(bq.b0, test_bq.b0);
77 EXPECT_EQ(bq.b1, test_bq.b1);
78 EXPECT_EQ(bq.b2, test_bq.b2);
79 EXPECT_EQ(bq.a1, test_bq.a1);
80 EXPECT_EQ(bq.a2, test_bq.a2);
81
82 biquad_set(&bq, BQ_ALLPASS, f_over, 0, db_gain);
83 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
84 test_bq.b0 = 1;
85 EXPECT_EQ(bq.b0, test_bq.b0);
86 EXPECT_EQ(bq.b1, test_bq.b1);
87 EXPECT_EQ(bq.b2, test_bq.b2);
88 EXPECT_EQ(bq.a1, test_bq.a1);
89 EXPECT_EQ(bq.a2, test_bq.a2);
90
91 // check response to frew <= 0
92 biquad_set(&bq, BQ_LOWPASS, f_under, 0, db_gain);
93 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
94 EXPECT_EQ(bq.b0, test_bq.b0);
95 EXPECT_EQ(bq.b1, test_bq.b1);
96 EXPECT_EQ(bq.b2, test_bq.b2);
97 EXPECT_EQ(bq.a1, test_bq.a1);
98 EXPECT_EQ(bq.a2, test_bq.a2);
99
100 biquad_set(&bq, BQ_HIGHPASS, f_under, 0, db_gain);
101 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
102 test_bq.b0 = 1;
103 EXPECT_EQ(bq.b0, test_bq.b0);
104 EXPECT_EQ(bq.b1, test_bq.b1);
105 EXPECT_EQ(bq.b2, test_bq.b2);
106 EXPECT_EQ(bq.a1, test_bq.a1);
107 EXPECT_EQ(bq.a2, test_bq.a2);
108
109 biquad_set(&bq, BQ_BANDPASS, f_under, 0, db_gain);
110 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
111 EXPECT_EQ(bq.b0, test_bq.b0);
112 EXPECT_EQ(bq.b1, test_bq.b1);
113 EXPECT_EQ(bq.b2, test_bq.b2);
114 EXPECT_EQ(bq.a1, test_bq.a1);
115 EXPECT_EQ(bq.a2, test_bq.a2);
116
117 biquad_set(&bq, BQ_LOWSHELF, f_under, 0, db_gain);
118 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
119 test_bq.b0 = 1;
120 EXPECT_EQ(bq.b0, test_bq.b0);
121 EXPECT_EQ(bq.b1, test_bq.b1);
122 EXPECT_EQ(bq.b2, test_bq.b2);
123 EXPECT_EQ(bq.a1, test_bq.a1);
124 EXPECT_EQ(bq.a2, test_bq.a2);
125
126 biquad_set(&bq, BQ_HIGHSHELF, f_under, 0, db_gain);
127 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
128 test_bq.b0 = A * A;
129 EXPECT_EQ(bq.b0, test_bq.b0);
130 EXPECT_EQ(bq.b1, test_bq.b1);
131 EXPECT_EQ(bq.b2, test_bq.b2);
132 EXPECT_EQ(bq.a1, test_bq.a1);
133 EXPECT_EQ(bq.a2, test_bq.a2);
134
135 biquad_set(&bq, BQ_PEAKING, f_under, 0, db_gain);
136 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
137 test_bq.b0 = 1;
138 EXPECT_EQ(bq.b0, test_bq.b0);
139 EXPECT_EQ(bq.b1, test_bq.b1);
140 EXPECT_EQ(bq.b2, test_bq.b2);
141 EXPECT_EQ(bq.a1, test_bq.a1);
142 EXPECT_EQ(bq.a2, test_bq.a2);
143
144 biquad_set(&bq, BQ_NOTCH, f_under, 0, db_gain);
145 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
146 test_bq.b0 = 1;
147 EXPECT_EQ(bq.b0, test_bq.b0);
148 EXPECT_EQ(bq.b1, test_bq.b1);
149 EXPECT_EQ(bq.b2, test_bq.b2);
150 EXPECT_EQ(bq.a1, test_bq.a1);
151 EXPECT_EQ(bq.a2, test_bq.a2);
152
153 biquad_set(&bq, BQ_ALLPASS, f_under, 0, db_gain);
154 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
155 test_bq.b0 = 1;
156 EXPECT_EQ(bq.b0, test_bq.b0);
157 EXPECT_EQ(bq.b1, test_bq.b1);
158 EXPECT_EQ(bq.b2, test_bq.b2);
159 EXPECT_EQ(bq.a1, test_bq.a1);
160 EXPECT_EQ(bq.a2, test_bq.a2);
161 }
162
TEST(InvalidQTest,All)163 TEST(InvalidQTest, All) {
164 struct biquad bq, test_bq;
165 float f = 0.5;
166 float Q = -0.1;
167 double db_gain = 2;
168 double A = pow(10.0, db_gain / 40);
169
170 // check response to Q <= 0
171 // Low and High pass filters scope Q making the test mute
172
173 biquad_set(&bq, BQ_BANDPASS, f, Q, db_gain);
174 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
175 test_bq.b0 = 1;
176 EXPECT_EQ(bq.b0, test_bq.b0);
177 EXPECT_EQ(bq.b1, test_bq.b1);
178 EXPECT_EQ(bq.b2, test_bq.b2);
179 EXPECT_EQ(bq.a1, test_bq.a1);
180 EXPECT_EQ(bq.a2, test_bq.a2);
181
182 // Low and high shelf do not compute resonance
183
184 biquad_set(&bq, BQ_PEAKING, f, Q, db_gain);
185 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
186 test_bq.b0 = A * A;
187 EXPECT_EQ(bq.b0, test_bq.b0);
188 EXPECT_EQ(bq.b1, test_bq.b1);
189 EXPECT_EQ(bq.b2, test_bq.b2);
190 EXPECT_EQ(bq.a1, test_bq.a1);
191 EXPECT_EQ(bq.a2, test_bq.a2);
192
193 biquad_set(&bq, BQ_NOTCH, f, 0, db_gain);
194 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
195 EXPECT_EQ(bq.b0, test_bq.b0);
196 EXPECT_EQ(bq.b1, test_bq.b1);
197 EXPECT_EQ(bq.b2, test_bq.b2);
198 EXPECT_EQ(bq.a1, test_bq.a1);
199 EXPECT_EQ(bq.a2, test_bq.a2);
200
201 biquad_set(&bq, BQ_ALLPASS, f, 0, db_gain);
202 test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
203 test_bq.b0 = -1;
204 EXPECT_EQ(bq.b0, test_bq.b0);
205 EXPECT_EQ(bq.b1, test_bq.b1);
206 EXPECT_EQ(bq.b2, test_bq.b2);
207 EXPECT_EQ(bq.a1, test_bq.a1);
208 EXPECT_EQ(bq.a2, test_bq.a2);
209 }
210
211 } // namespace
212
main(int argc,char ** argv)213 int main(int argc, char** argv) {
214 ::testing::InitGoogleTest(&argc, argv);
215 return RUN_ALL_TESTS();
216 }
217