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