comparison bqvec/test/TestVectorOps.cpp @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents 5d0a2ebb4d17
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: */ 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 2
3 #include "VectorOpsComplex.h" 3 #include "bqvec/VectorOps.h"
4 4
5 #include <iostream> 5 #define BOOST_TEST_DYN_LINK
6 #include <cstdlib> 6 #define BOOST_TEST_MAIN
7 7
8 #include <time.h> 8 #include <boost/test/unit_test.hpp>
9 9
10 using namespace std; 10 #include <stdexcept>
11 11 #include <vector>
12 namespace breakfastquay { 12
13 13 using namespace breakfastquay;
14 namespace Test { 14
15 15 BOOST_AUTO_TEST_SUITE(TestVectorOps)
16 #ifdef _WIN32 16
17 #define drand48() (-1+2*((float)rand())/RAND_MAX) 17 #define COMPARE_ARRAY(a, b) \
18 #endif 18 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \
19 19 BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-14); \
20 bool
21 testMultiply()
22 {
23 cerr << "testVectorOps: testing v_multiply complex" << endl;
24
25 const int N = 1024;
26 turbot_complex_sample_t target[N];
27 turbot_complex_sample_t src1[N];
28 turbot_complex_sample_t src2[N];
29
30 for (int i = 0; i < N; ++i) {
31 src1[i].re = drand48();
32 src1[i].im = drand48();
33 src2[i].re = drand48();
34 src2[i].im = drand48();
35 } 20 }
36 21
37 turbot_sample_t mean, first, last, total = 0; 22 #define COMPARE_N(a, b, n) \
38 for (int i = 0; i < N; ++i) { 23 for (int cmp_i = 0; cmp_i < n; ++cmp_i) { \
39 turbot_complex_sample_t result; 24 BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-14); \
40 c_multiply(result, src1[i], src2[i]);
41 if (i == 0) first = result.re;
42 if (i == N-1) last = result.im;
43 total += result.re;
44 total += result.im;
45 } 25 }
46 mean = total / (N*2); 26
47 cerr << "Naive method: mean = " << mean << ", first = " << first 27 BOOST_AUTO_TEST_CASE(add)
48 << ", last = " << last << endl; 28 {
49 29 double a[] = { 1.0, 2.0, 3.0 };
50 v_multiply(target, src1, src2, N); 30 double b[] = { -1.0, 3.0, -4.5 };
51 total = 0; 31 double expected[] = { 0.0, 5.0, -1.5 };
52 32 v_add(a, b, 3);
53 for (int i = 0; i < N; ++i) { 33 COMPARE_N(a, expected, 3);
54 if (i == 0) first = target[i].re; 34 }
55 if (i == N-1) last = target[i].im; 35
56 total += target[i].re; 36 BOOST_AUTO_TEST_CASE(add_with_gain)
57 total += target[i].im; 37 {
58 } 38 double a[] = { 1.0, 2.0, 3.0 };
59 mean = total / (N*2); 39 double b[] = { -1.0, 3.0, -4.5 };
60 cerr << "v_multiply: mean = " << mean << ", first = " << first 40 double expected[] = { -0.5, 6.5, -3.75 };
61 << ", last = " << last << endl; 41 v_add_with_gain(a, b, 1.5, 3);
62 42 COMPARE_N(a, expected, 3);
63 int iterations = 50000; 43 }
64 cerr << "Iterations: " << iterations << endl; 44
65 45 BOOST_AUTO_TEST_CASE(subtract)
66 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; 46 {
67 float divisor = float(CLOCKS_PER_SEC) / 1000.f; 47 double a[] = { 1.0, 2.0, 3.0 };
68 48 double b[] = { -1.0, 3.0, -4.5 };
69 clock_t start = clock(); 49 double expected[] = { 2.0, -1.0, 7.5 };
70 50 v_subtract(a, b, 3);
71 for (int j = 0; j < iterations; ++j) { 51 COMPARE_N(a, expected, 3);
72 for (int i = 0; i < N; ++i) { 52 }
73 c_multiply(target[i], src1[i], src2[i]); 53
74 } 54 BOOST_AUTO_TEST_CASE(increment)
75 } 55 {
76 56 double a[] = { -1.0, 3.0, -4.5 };
77 clock_t end = clock(); 57 double incr = -0.5;
78 58 double expected[] = { -1.5, 2.5, -5.0 };
79 cerr << "Time for naive method: " << float(end - start)/divisor << endl; 59 v_increment(a, incr, 3);
80 60 COMPARE_N(a, expected, 3);
81 start = clock(); 61 }
82 62
83 for (int j = 0; j < iterations; ++j) { 63 BOOST_AUTO_TEST_CASE(scale)
84 v_multiply(target, src1, src2, N); 64 {
85 } 65 double a[] = { -1.0, 3.0, -4.5 };
86 66 double scale = -0.5;
87 end = clock(); 67 double expected[] = { 0.5, -1.5, 2.25 };
88 68 v_scale(a, scale, 3);
89 cerr << "Time for v_multiply: " << float(end - start)/divisor << endl; 69 COMPARE_N(a, expected, 3);
90 70 }
91 return true; 71
92 } 72 BOOST_AUTO_TEST_CASE(multiply)
93 73 {
94 bool 74 double a[] = { 1.0, 2.0, 3.0 };
95 testPolarToCart() 75 double b[] = { -1.0, 3.0, -4.5 };
96 { 76 double expected[] = { -1.0, 6.0, -13.5 };
97 cerr << "testVectorOps: testing v_polar_to_cartesian" << endl; 77 v_multiply(a, b, 3);
98 78 COMPARE_N(a, expected, 3);
99 const int N = 1024; 79 }
100 turbot_complex_sample_t target[N]; 80
101 turbot_sample_t mag[N]; 81 BOOST_AUTO_TEST_CASE(multiply_to)
102 turbot_sample_t phase[N]; 82 {
103 83 double a[] = { 1.0, 2.0, 3.0 };
104 for (int i = 0; i < N; ++i) { 84 double b[] = { -1.0, 3.0, -4.5 };
105 mag[i] = drand48(); 85 double o[3];
106 phase[i] = (drand48() * M_PI * 2) - M_PI; 86 double expected[] = { -1.0, 6.0, -13.5 };
107 } 87 v_multiply_to(o, a, b, 3);
108 88 COMPARE_N(o, expected, 3);
109 turbot_sample_t mean, first, last, total = 0; 89 }
110 for (int i = 0; i < N; ++i) { 90
111 turbot_sample_t real = mag[i] * cos(phase[i]); 91 BOOST_AUTO_TEST_CASE(multiply_and_add)
112 turbot_sample_t imag = mag[i] * sin(phase[i]); 92 {
113 if (i == 0) first = real; 93 double a[] = { 1.0, 2.0, 3.0 };
114 if (i == N-1) last = imag; 94 double b[] = { -1.0, 3.0, -4.5 };
115 total += real; 95 double c[] = { 3.0, -1.0, 4.0 };
116 total += imag; 96 double expected[] = { 2.0, 5.0, -9.5 };
117 } 97 v_multiply_and_add(c, a, b, 3);
118 mean = total / (N*2); 98 COMPARE_N(c, expected, 3);
119 cerr << "Naive method: mean = " << mean << ", first = " << first 99 }
120 << ", last = " << last << endl; 100
121 101 BOOST_AUTO_TEST_CASE(divide)
122 v_polar_to_cartesian(target, mag, phase, N); 102 {
123 103 double a[] = { 1.0, 2.0, 3.0 };
124 total = 0; 104 double b[] = { -1.0, 3.0, -4.5 };
125 105 double expected[] = { -1.0, 2.0/3.0, 3.0/-4.5 };
126 for (int i = 0; i < N; ++i) { 106 v_divide(a, b, 3);
127 if (i == 0) first = target[i].re; 107 COMPARE_N(a, expected, 3);
128 if (i == N-1) last = target[i].im; 108 }
129 total += target[i].re; 109
130 total += target[i].im; 110 BOOST_AUTO_TEST_CASE(sum)
131 } 111 {
132 mean = total / (N*2); 112 double a[] = { 1.0, 2.0, -3.5 };
133 cerr << "v_polar_to_cartesian: mean = " << mean << ", first = " << first 113 double s = v_sum(a, 3);
134 << ", last = " << last << endl; 114 BOOST_CHECK_EQUAL(s, -0.5);
135 115 }
136 int iterations = 10000; 116
137 cerr << "Iterations: " << iterations << endl; 117 BOOST_AUTO_TEST_CASE(multiply_and_sum)
138 118 {
139 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; 119 double a[] = { 2.0, 0.0, -1.5 };
140 float divisor = float(CLOCKS_PER_SEC) / 1000.f; 120 double b[] = { 3.0, 4.0, 5.0 };
141 121 double s = v_multiply_and_sum(a, b, 3);
142 clock_t start = clock(); 122 BOOST_CHECK_EQUAL(s, -1.5);
143 123 }
144 for (int j = 0; j < iterations; ++j) { 124
145 for (int i = 0; i < N; ++i) { 125 BOOST_AUTO_TEST_CASE(log)
146 target[i].re = mag[i] * cos(phase[i]); 126 {
147 target[i].im = mag[i] * sin(phase[i]); 127 double a[] = { 1.0, 1.0 / M_E, M_E };
148 } 128 double expected[] = { 0.0, -1.0, 1.0 };
149 } 129 v_log(a, 3);
150 130 COMPARE_N(a, expected, 3);
151 clock_t end = clock(); 131 }
152 132
153 cerr << "Time for naive method: " << float(end - start)/divisor << endl; 133 BOOST_AUTO_TEST_CASE(exp)
154 134 {
155 start = clock(); 135 double a[] = { 0.0, -1.0, 2.0 };
156 136 double expected[] = { 1.0, 1.0 / M_E, M_E * M_E };
157 for (int j = 0; j < iterations; ++j) { 137 v_exp(a, 3);
158 v_polar_to_cartesian(target, mag, phase, N); 138 COMPARE_N(a, expected, 3);
159 } 139 }
160 140
161 end = clock(); 141 BOOST_AUTO_TEST_CASE(sqrt)
162 142 {
163 cerr << "Time for v_polar_to_cartesian: " << float(end - start)/divisor << endl; 143 double a[] = { 0.0, 1.0, 4.0 };
164 144 double expected[] = { 0.0, 1.0, 2.0 };
165 return true; 145 v_sqrt(a, 3);
166 } 146 COMPARE_N(a, expected, 3);
167 147 }
168 bool 148
169 testPolarToCartInterleaved() 149 BOOST_AUTO_TEST_CASE(square)
170 { 150 {
171 cerr << "testVectorOps: testing v_polar_interleaved_to_cartesian" << endl; 151 double a[] = { 0.0, 1.5, -2.0 };
172 152 double expected[] = { 0.0, 2.25, 4.0 };
173 const int N = 1024; 153 v_square(a, 3);
174 turbot_complex_sample_t target[N]; 154 COMPARE_N(a, expected, 3);
175 turbot_sample_t source[N*2]; 155 }
176 156
177 for (int i = 0; i < N; ++i) { 157 BOOST_AUTO_TEST_CASE(abs)
178 source[i*2] = drand48(); 158 {
179 source[i*2+1] = (drand48() * M_PI * 2) - M_PI; 159 double a[] = { -1.9, 0.0, 0.01, -0.0 };
180 } 160 double expected[] = { 1.9, 0.0, 0.01, 0.0 };
181 161 v_abs(a, 4);
182 turbot_sample_t mean, first, last, total = 0; 162 COMPARE_N(a, expected, 4);
183 for (int i = 0; i < N; ++i) { 163 }
184 turbot_sample_t real = source[i*2] * cos(source[i*2+1]); 164
185 turbot_sample_t imag = source[i*2] * sin(source[i*2+1]); 165 BOOST_AUTO_TEST_CASE(mean)
186 if (i == 0) first = real; 166 {
187 if (i == N-1) last = imag; 167 double a[] = { -1.0, 1.6, 3.0 };
188 total += real; 168 double s = v_mean(a, 3);
189 total += imag; 169 BOOST_CHECK_EQUAL(s, 1.2);
190 } 170 }
191 mean = total / (N*2); 171
192 cerr << "Naive method: mean = " << mean << ", first = " << first 172 BOOST_AUTO_TEST_CASE(interleave_1)
193 << ", last = " << last << endl; 173 {
194 174 double a[] = { 1.0, 2.0, 3.0 };
195 v_polar_interleaved_to_cartesian(target, source, N); 175 double *ch[] = { a };
196 176 double o[3];
197 total = 0; 177 double expected[] = { 1.0, 2.0, 3.0 };
198 178 v_interleave(o, ch, 1, 3);
199 for (int i = 0; i < N; ++i) { 179 COMPARE_N(o, expected, 3);
200 if (i == 0) first = target[i].re; 180 }
201 if (i == N-1) last = target[i].im; 181
202 total += target[i].re; 182 BOOST_AUTO_TEST_CASE(interleave_2)
203 total += target[i].im; 183 {
204 } 184 double a[] = { 1.0, 2.0, 3.0 };
205 mean = total / (N*2); 185 double b[] = { 4.0, 5.0, 6.0 };
206 cerr << "v_polar_interleaved_to_cartesian: mean = " << mean << ", first = " << first 186 double *ch[] = { a, b };
207 << ", last = " << last << endl; 187 double o[6];
208 188 double expected[] = { 1.0, 4.0, 2.0, 5.0, 3.0, 6.0 };
209 int iterations = 10000; 189 v_interleave(o, ch, 2, 3);
210 cerr << "Iterations: " << iterations << endl; 190 COMPARE_N(o, expected, 6);
211 191 }
212 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; 192
213 float divisor = float(CLOCKS_PER_SEC) / 1000.f; 193 BOOST_AUTO_TEST_CASE(interleave_3)
214 194 {
215 clock_t start = clock(); 195 double a[] = { 1.0, 2.0 };
216 196 double b[] = { 3.0, 4.0 };
217 for (int j = 0; j < iterations; ++j) { 197 double c[] = { 5.0, 6.0 };
218 for (int i = 0; i < N; ++i) { 198 double *ch[] = { a, b, c };
219 target[i].re = source[i*2] * cos(source[i*2+1]); 199 double o[6];
220 target[i].im = source[i*2] * sin(source[i*2+1]); 200 double expected[] = { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 };
221 } 201 v_interleave(o, ch, 3, 2);
222 } 202 COMPARE_N(o, expected, 6);
223 203 }
224 clock_t end = clock(); 204
225 205 BOOST_AUTO_TEST_CASE(deinterleave_1)
226 cerr << "Time for naive method: " << float(end - start)/divisor << endl; 206 {
227 207 double a[] = { 1.0, 2.0, 3.0 };
228 start = clock(); 208 double o[3];
229 209 double *oo[] = { o };
230 for (int j = 0; j < iterations; ++j) { 210 double *expected[] = { a };
231 v_polar_interleaved_to_cartesian(target, source, N); 211 v_deinterleave(oo, a, 1, 3);
232 } 212 COMPARE_N(oo[0], expected[0], 3);
233 213 }
234 end = clock(); 214
235 215 BOOST_AUTO_TEST_CASE(deinterleave_2)
236 cerr << "Time for v_polar_interleaved_to_cartesian: " << float(end - start)/divisor << endl; 216 {
237 217 double a[] = { 1.0, 4.0, 2.0, 5.0, 3.0, 6.0 };
238 return true; 218 double o1[3], o2[3];
239 } 219 double *oo[] = { o1, o2 };
240 220 double e1[] = { 1.0, 2.0, 3.0 }, e2[] = { 4.0, 5.0, 6.0 };
241 bool 221 double *expected[] = { e1, e2 };
242 testVectorOps() 222 v_deinterleave(oo, a, 2, 3);
243 { 223 COMPARE_N(oo[0], expected[0], 3);
244 if (!testMultiply()) return false; 224 COMPARE_N(oo[1], expected[1], 3);
245 if (!testPolarToCart()) return false; 225 }
246 if (!testPolarToCartInterleaved()) return false; 226
247 227 BOOST_AUTO_TEST_CASE(deinterleave_3)
248 return true; 228 {
249 } 229 double a[] = { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 };
250 230 double o1[2], o2[2], o3[2];
251 } 231 double *oo[] = { o1, o2, o3 };
252 232 double e1[] = { 1.0, 2.0 }, e2[] = { 3.0, 4.0 }, e3[] = { 5.0, 6.0 };
253 } 233 double *expected[] = { e1, e2, e3 };
254 234 v_deinterleave(oo, a, 3, 2);
235 COMPARE_N(oo[0], expected[0], 2);
236 COMPARE_N(oo[1], expected[1], 2);
237 COMPARE_N(oo[2], expected[2], 2);
238 }
239
240 BOOST_AUTO_TEST_CASE(mix_1)
241 {
242 double a[] = { 1.0, 2.0, 3.0 };
243 double *ch[] = { a };
244 double o[3];
245 double expected[] = { 1.0, 2.0, 3.0 };
246 v_mix(o, ch, 1, 3);
247 COMPARE_N(o, expected, 3);
248 }
249
250 BOOST_AUTO_TEST_CASE(mix_2)
251 {
252 double a[] = { 1.0, 2.0, 3.0 };
253 double b[] = { 4.0, 5.0, 6.0 };
254 double *ch[] = { a, b };
255 double o[6];
256 double expected[] = { 2.5, 3.5, 4.5 };
257 v_mix(o, ch, 2, 3);
258 COMPARE_N(o, expected, 3);
259 }
260
261 BOOST_AUTO_TEST_CASE(mix_3)
262 {
263 double a[] = { 1.0, 2.0 };
264 double b[] = { 3.0, 4.0 };
265 double c[] = { 5.0, 6.0 };
266 double *ch[] = { a, b, c };
267 double o[6];
268 double expected[] = { 3.0, 4.0 };
269 v_mix(o, ch, 3, 2);
270 COMPARE_N(o, expected, 2);
271 }
272
273 BOOST_AUTO_TEST_CASE(reconfigure_1_2)
274 {
275 double a[] = { 1.0, 2.0, 3.0 };
276 double *aa[] = { a };
277 double o1[3], o2[3];
278 double *oo[] = { o1, o2 };
279 double e1[] = { 1.0, 2.0, 3.0 };
280 double e2[] = { 1.0, 2.0, 3.0 };
281 double *expected[] = { e1, e2 };
282 v_reconfigure_channels(oo, 2, aa, 1, 3);
283 COMPARE_N(oo[0], expected[0], 3);
284 COMPARE_N(oo[1], expected[1], 3);
285 }
286
287 BOOST_AUTO_TEST_CASE(reconfigure_2_1)
288 {
289 double a1[] = { 1.0, 2.0, 3.0 };
290 double a2[] = { 4.0, 5.0, 6.0 };
291 double *aa[] = { a1, a2 };
292 double o1[3];
293 double *oo[] = { o1 };
294 double e1[] = { 2.5, 3.5, 4.5 };
295 double *expected[] = { e1 };
296 v_reconfigure_channels(oo, 1, aa, 2, 3);
297 COMPARE_N(oo[0], expected[0], 3);
298 }
299
300 BOOST_AUTO_TEST_CASE(reconfigure_3_1)
301 {
302 double a1[] = { 1.0, 2.0 };
303 double a2[] = { 3.0, 4.0 };
304 double a3[] = { 5.0, 6.0 };
305 double *aa[] = { a1, a2, a3 };
306 double o1[2];
307 double *oo[] = { o1 };
308 double e1[] = { 3.0, 4.0 };
309 double *expected[] = { e1 };
310 v_reconfigure_channels(oo, 1, aa, 3, 2);
311 COMPARE_N(oo[0], expected[0], 2);
312 }
313
314 BOOST_AUTO_TEST_CASE(reconfigure_1_3)
315 {
316 double a[] = { 1.0, 2.0, 3.0 };
317 double *aa[] = { a };
318 double o1[3], o2[3], o3[3];
319 double *oo[] = { o1, o2, o3 };
320 double e1[] = { 1.0, 2.0, 3.0 };
321 double e2[] = { 1.0, 2.0, 3.0 };
322 double e3[] = { 1.0, 2.0, 3.0 };
323 double *expected[] = { e1, e2, e3 };
324 v_reconfigure_channels(oo, 3, aa, 1, 3);
325 COMPARE_N(oo[0], expected[0], 3);
326 COMPARE_N(oo[1], expected[1], 3);
327 COMPARE_N(oo[2], expected[2], 3);
328 }
329
330 BOOST_AUTO_TEST_CASE(reconfigure_2_3)
331 {
332 double a1[] = { 1.0, 2.0, 3.0 };
333 double a2[] = { 4.0, 5.0, 6.0 };
334 double *aa[] = { a1, a2 };
335 double o1[3], o2[3], o3[3];
336 double *oo[] = { o1, o2, o3 };
337 double e1[] = { 1.0, 2.0, 3.0 };
338 double e2[] = { 0.0, 0.0, 0.0 };
339 double e3[] = { 4.0, 5.0, 6.0 };
340 double *expected[] = { e1, e2, e3 };
341 v_reconfigure_channels(oo, 3, aa, 2, 3);
342 COMPARE_N(oo[0], expected[0], 3);
343 COMPARE_N(oo[1], expected[1], 3);
344 COMPARE_N(oo[2], expected[2], 3);
345 }
346
347 BOOST_AUTO_TEST_CASE(reconfigure_3_2)
348 {
349 double a1[] = { 1.0, 2.0, 3.0 };
350 double a2[] = { 4.0, 5.0, 6.0 };
351 double a3[] = { 7.0, 8.0, 9.0 };
352 double *aa[] = { a1, a2, a3 };
353 double o1[3], o2[3];
354 double *oo[] = { o1, o2 };
355 double e1[] = { 1.0, 2.0, 3.0 };
356 double e2[] = { 7.0, 8.0, 9.0 };
357 double *expected[] = { e1, e2 };
358 v_reconfigure_channels(oo, 2, aa, 3, 3);
359 COMPARE_N(oo[0], expected[0], 3);
360 COMPARE_N(oo[1], expected[1], 3);
361 }
362
363 BOOST_AUTO_TEST_CASE(reconfigure_3_3)
364 {
365 double a1[] = { 1.0, 2.0, 3.0 };
366 double a2[] = { 4.0, 5.0, 6.0 };
367 double a3[] = { 7.0, 8.0, 9.0 };
368 double *aa[] = { a1, a2, a3 };
369 double o1[3], o2[3], o3[3];
370 double *oo[] = { o1, o2, o3 };
371 double e1[] = { 1.0, 2.0, 3.0 };
372 double e2[] = { 4.0, 5.0, 6.0 };
373 double e3[] = { 7.0, 8.0, 9.0 };
374 double *expected[] = { e1, e2, e3 };
375 v_reconfigure_channels(oo, 3, aa, 3, 3);
376 COMPARE_N(oo[0], expected[0], 3);
377 COMPARE_N(oo[1], expected[1], 3);
378 COMPARE_N(oo[2], expected[2], 3);
379 }
380
381 BOOST_AUTO_TEST_CASE(reconfigure_1_2_inplace)
382 {
383 double a1[] = { 1.0, 2.0, 3.0 };
384 double a2[3];
385 double *aa[] = { a1, a2 };
386 double e1[] = { 1.0, 2.0, 3.0 };
387 double e2[] = { 1.0, 2.0, 3.0 };
388 double *expected[] = { e1, e2 };
389 v_reconfigure_channels_inplace(aa, 2, 1, 3);
390 COMPARE_N(aa[0], expected[0], 3);
391 COMPARE_N(aa[1], expected[1], 3);
392 }
393
394 BOOST_AUTO_TEST_CASE(reconfigure_2_1_inplace)
395 {
396 double a1[] = { 1.0, 2.0, 3.0 };
397 double a2[] = { 4.0, 5.0, 6.0 };
398 double *aa[] = { a1, a2 };
399 double e1[] = { 2.5, 3.5, 4.5 };
400 double *expected[] = { e1 };
401 v_reconfigure_channels_inplace(aa, 1, 2, 3);
402 COMPARE_N(aa[0], expected[0], 3);
403 }
404
405 BOOST_AUTO_TEST_CASE(reconfigure_3_1_inplace)
406 {
407 double a1[] = { 1.0, 2.0 };
408 double a2[] = { 3.0, 4.0 };
409 double a3[] = { 5.0, 6.0 };
410 double *aa[] = { a1, a2, a3 };
411 double e1[] = { 3.0, 4.0 };
412 double *expected[] = { e1 };
413 v_reconfigure_channels_inplace(aa, 1, 3, 2);
414 COMPARE_N(aa[0], expected[0], 2);
415 }
416
417 BOOST_AUTO_TEST_CASE(reconfigure_1_3_inplace)
418 {
419 double a1[] = { 1.0, 2.0, 3.0 };
420 double a2[3], a3[3];
421 double *aa[] = { a1, a2, a3 };
422 double e1[] = { 1.0, 2.0, 3.0 };
423 double e2[] = { 1.0, 2.0, 3.0 };
424 double e3[] = { 1.0, 2.0, 3.0 };
425 double *expected[] = { e1, e2, e3 };
426 v_reconfigure_channels_inplace(aa, 3, 1, 3);
427 COMPARE_N(aa[0], expected[0], 3);
428 COMPARE_N(aa[1], expected[1], 3);
429 COMPARE_N(aa[2], expected[2], 3);
430 }
431
432 BOOST_AUTO_TEST_CASE(reconfigure_2_3_inplace)
433 {
434 double a1[] = { 1.0, 2.0, 3.0 };
435 double a2[] = { 4.0, 5.0, 6.0 };
436 double a3[3];
437 double *aa[] = { a1, a2, a3 };
438 double e1[] = { 1.0, 2.0, 3.0 };
439 double e2[] = { 4.0, 5.0, 6.0 };
440 double e3[] = { 0.0, 0.0, 0.0 };
441 double *expected[] = { e1, e2, e3 };
442 v_reconfigure_channels_inplace(aa, 3, 2, 3);
443 COMPARE_N(aa[0], expected[0], 3);
444 COMPARE_N(aa[1], expected[1], 3);
445 COMPARE_N(aa[2], expected[2], 3);
446 }
447
448 BOOST_AUTO_TEST_CASE(reconfigure_3_2_inplace)
449 {
450 double a1[] = { 1.0, 2.0, 3.0 };
451 double a2[] = { 4.0, 5.0, 6.0 };
452 double a3[] = { 7.0, 8.0, 9.0 };
453 double *aa[] = { a1, a2, a3 };
454 double e1[] = { 1.0, 2.0, 3.0 };
455 double e2[] = { 4.0, 5.0, 6.0 };
456 double *expected[] = { e1, e2 };
457 v_reconfigure_channels_inplace(aa, 2, 3, 3);
458 COMPARE_N(aa[0], expected[0], 3);
459 COMPARE_N(aa[1], expected[1], 3);
460 }
461
462 BOOST_AUTO_TEST_CASE(reconfigure_3_3_inplace)
463 {
464 double a1[] = { 1.0, 2.0, 3.0 };
465 double a2[] = { 4.0, 5.0, 6.0 };
466 double a3[] = { 7.0, 8.0, 9.0 };
467 double *aa[] = { a1, a2, a3 };
468 double e1[] = { 1.0, 2.0, 3.0 };
469 double e2[] = { 4.0, 5.0, 6.0 };
470 double e3[] = { 7.0, 8.0, 9.0 };
471 double *expected[] = { e1, e2, e3 };
472 v_reconfigure_channels_inplace(aa, 3, 3, 3);
473 COMPARE_N(aa[0], expected[0], 3);
474 COMPARE_N(aa[1], expected[1], 3);
475 COMPARE_N(aa[2], expected[2], 3);
476 }
477
478 BOOST_AUTO_TEST_CASE(fftshift)
479 {
480 double a[] = { 0.1, 2.0, -0.3, 4.0 };
481 double e[] = { -0.3, 4.0, 0.1, 2.0 };
482 v_fftshift(a, 4);
483 COMPARE_N(a, e, 4);
484 }
485
486 BOOST_AUTO_TEST_SUITE_END()
487