• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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