Mercurial > hg > silvet
comparison bqvec/test/TestVectorOpsComplex.cpp @ 372:af71cbdab621 tip
Update bqvec code
author | Chris Cannam |
---|---|
date | Tue, 19 Nov 2019 10:13:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
371:426ce52ef096 | 372:af71cbdab621 |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
3 #include "bqvec/VectorOpsComplex.h" | |
4 #include "bqvec/VectorOps.h" | |
5 | |
6 #define BOOST_TEST_DYN_LINK | |
7 #define BOOST_TEST_MAIN | |
8 | |
9 #include <boost/test/unit_test.hpp> | |
10 | |
11 #include <stdexcept> | |
12 #include <vector> | |
13 #include <iostream> | |
14 | |
15 using namespace breakfastquay; | |
16 | |
17 using namespace std; | |
18 | |
19 BOOST_AUTO_TEST_SUITE(TestVectorOpsComplex) | |
20 | |
21 #ifdef USE_APPROXIMATE_ATAN2 | |
22 static const double eps = 5.0e-3; | |
23 #else | |
24 #ifdef USE_SINGLE_PRECISION_COMPLEX | |
25 static const double eps = 1.0e-7; | |
26 #else | |
27 static const double eps = 1.0e-14; | |
28 #endif | |
29 #endif | |
30 | |
31 #define COMPARE_N(a, b, n) \ | |
32 for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ | |
33 BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], eps); \ | |
34 } | |
35 | |
36 #define COMPARE_NC(a, b, n) \ | |
37 for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ | |
38 BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], (bq_complex_element_t) eps); \ | |
39 } | |
40 | |
41 #define COMPARE_CPLX_N(a, b, n) \ | |
42 for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \ | |
43 BOOST_CHECK_SMALL(a[cmp_i].re - b[cmp_i].re, (bq_complex_element_t) eps); \ | |
44 BOOST_CHECK_SMALL(a[cmp_i].im - b[cmp_i].im, (bq_complex_element_t) eps); \ | |
45 } | |
46 | |
47 BOOST_AUTO_TEST_CASE(add) | |
48 { | |
49 bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; | |
50 bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; | |
51 bq_complex_t expected[] = { { 0.0, 5.0 }, { -1.5, -4.0 } }; | |
52 v_add(a, b, 2); | |
53 COMPARE_CPLX_N(a, expected, 2); | |
54 } | |
55 | |
56 BOOST_AUTO_TEST_CASE(add_with_gain) | |
57 { | |
58 bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; | |
59 bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; | |
60 bq_complex_t expected[] = { { -0.5, 6.5 }, { -3.75, -4.0 } }; | |
61 v_add_with_gain(a, b, (bq_complex_element_t) 1.5, 2); | |
62 COMPARE_CPLX_N(a, expected, 2); | |
63 } | |
64 | |
65 BOOST_AUTO_TEST_CASE(multiply) | |
66 { | |
67 bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; | |
68 bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; | |
69 bq_complex_t expected[] = { { -7.0, 1.0 }, { -13.5, 18.0 } }; | |
70 v_multiply(a, b, 2); | |
71 COMPARE_CPLX_N(a, expected, 2); | |
72 } | |
73 | |
74 BOOST_AUTO_TEST_CASE(multiply_to) | |
75 { | |
76 bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; | |
77 bq_complex_t b[] = { { -1.0, 3.0 }, { -4.5, 0.0 } }; | |
78 bq_complex_t o[2]; | |
79 bq_complex_t expected[] = { { -7.0, 1.0 }, { -13.5, 18.0 } }; | |
80 v_multiply_to(o, a, b, 2); | |
81 COMPARE_CPLX_N(o, expected, 2); | |
82 } | |
83 | |
84 BOOST_AUTO_TEST_CASE(cartesian_to_magnitudes_bq) | |
85 { | |
86 bq_complex_t a[] = { { 1.0, 2.0 }, { 3.0, -4.0 } }; | |
87 bq_complex_element_t o[2]; | |
88 bq_complex_element_t expected[] = { sqrt(5.0), 5.0 }; | |
89 v_cartesian_to_magnitudes(o, a, 2); | |
90 COMPARE_NC(o, expected, 2); | |
91 } | |
92 | |
93 BOOST_AUTO_TEST_CASE(cartesian_to_magnitudes) | |
94 { | |
95 double re[] = { 1.0, 3.0 }; | |
96 double im[] = { 2.0, -4.0 }; | |
97 double o[2]; | |
98 double expected[] = { sqrt(5.0), 5.0 }; | |
99 v_cartesian_to_magnitudes(o, re, im, 2); | |
100 COMPARE_N(o, expected, 2); | |
101 } | |
102 | |
103 BOOST_AUTO_TEST_CASE(cartesian_interleaved_to_magnitudes) | |
104 { | |
105 double a[] = { 1.0, 2.0, 3.0, -4.0 }; | |
106 double o[2]; | |
107 double expected[] = { sqrt(5.0), 5.0 }; | |
108 v_cartesian_interleaved_to_magnitudes(o, a, 2); | |
109 COMPARE_N(o, expected, 2); | |
110 } | |
111 | |
112 BOOST_AUTO_TEST_CASE(cartesian_to_polar_bq) | |
113 { | |
114 bq_complex_t a[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; | |
115 bq_complex_element_t mo[3], po[3]; | |
116 bq_complex_element_t me[] = { 0.0, sqrt(2.0), 1.0 }; | |
117 bq_complex_element_t pe[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; | |
118 v_cartesian_to_polar(mo, po, a, 3); | |
119 COMPARE_NC(mo, me, 3); | |
120 COMPARE_NC(po, pe, 3); | |
121 } | |
122 | |
123 BOOST_AUTO_TEST_CASE(cartesian_to_polar_interleaved_bq) | |
124 { | |
125 bq_complex_t a[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; | |
126 bq_complex_element_t o[6]; | |
127 bq_complex_element_t e[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; | |
128 v_cartesian_to_polar_interleaved(o, a, 3); | |
129 COMPARE_NC(o, e, 6); | |
130 } | |
131 | |
132 BOOST_AUTO_TEST_CASE(cartesian_to_polar) | |
133 { | |
134 double re[] = { 0.0, 1.0, 0.0 }; | |
135 double im[] = { 0.0, 1.0, -1.0 }; | |
136 double mo[3], po[3]; | |
137 double me[] = { 0.0, sqrt(2.0), 1.0 }; | |
138 double pe[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; | |
139 v_cartesian_to_polar(mo, po, re, im, 3); | |
140 COMPARE_N(mo, me, 3); | |
141 COMPARE_N(po, pe, 3); | |
142 } | |
143 | |
144 BOOST_AUTO_TEST_CASE(cartesian_to_polar_interleaved_inplace) | |
145 { | |
146 double a[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; | |
147 double e[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; | |
148 v_cartesian_to_polar_interleaved_inplace(a, 3); | |
149 COMPARE_N(a, e, 6); | |
150 } | |
151 | |
152 BOOST_AUTO_TEST_CASE(cartesian_interleaved_to_polar) | |
153 { | |
154 double a[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; | |
155 double mo[3], po[3]; | |
156 double me[] = { 0.0, sqrt(2.0), 1.0 }; | |
157 double pe[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; | |
158 v_cartesian_interleaved_to_polar(mo, po, a, 3); | |
159 COMPARE_N(mo, me, 3); | |
160 COMPARE_N(po, pe, 3); | |
161 } | |
162 | |
163 BOOST_AUTO_TEST_CASE(polar_to_cartesian_bq) | |
164 { | |
165 bq_complex_element_t m[] = { 0.0, sqrt(2.0), 1.0 }; | |
166 bq_complex_element_t p[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; | |
167 bq_complex_t o[3]; | |
168 bq_complex_t e[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; | |
169 v_polar_to_cartesian(o, m, p, 3); | |
170 COMPARE_CPLX_N(o, e, 3); | |
171 } | |
172 | |
173 BOOST_AUTO_TEST_CASE(polar_to_cartesian_interleaved_bq) | |
174 { | |
175 bq_complex_t a[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 0.0, -1.0 } }; | |
176 bq_complex_element_t o[6]; | |
177 bq_complex_element_t e[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; | |
178 v_cartesian_to_polar_interleaved(o, a, 3); | |
179 COMPARE_NC(o, e, 6); | |
180 } | |
181 | |
182 BOOST_AUTO_TEST_CASE(polar_to_cartesian) | |
183 { | |
184 double m[] = { 0.0, sqrt(2.0), 1.0 }; | |
185 double p[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; | |
186 double ro[3], io[3]; | |
187 double re[] = { 0.0, 1.0, 0.0 }; | |
188 double ie[] = { 0.0, 1.0, -1.0 }; | |
189 v_polar_to_cartesian(ro, io, m, p, 3); | |
190 COMPARE_N(ro, re, 3); | |
191 COMPARE_N(io, ie, 3); | |
192 } | |
193 | |
194 BOOST_AUTO_TEST_CASE(polar_to_cartesian_interleaved_inplace) | |
195 { | |
196 double a[] = { 0.0, 0.0, sqrt(2.0), M_PI / 4.0, 1.0, -M_PI * 0.5 }; | |
197 double e[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; | |
198 v_polar_interleaved_to_cartesian_inplace(a, 3); | |
199 COMPARE_N(a, e, 6); | |
200 } | |
201 | |
202 BOOST_AUTO_TEST_CASE(polar_to_cartesian_interleaved) | |
203 { | |
204 double m[] = { 0.0, sqrt(2.0), 1.0 }; | |
205 double p[] = { 0.0, M_PI / 4.0, -M_PI * 0.5 }; | |
206 double o[6]; | |
207 double e[] = { 0.0, 0.0, 1.0, 1.0, 0.0, -1.0 }; | |
208 v_polar_to_cartesian_interleaved(o, m, p, 3); | |
209 COMPARE_N(o, e, 6); | |
210 } | |
211 | |
212 BOOST_AUTO_TEST_SUITE_END() | |
213 |