annotate bqvec/test/TestVectorOps.cpp @ 366:5d0a2ebb4d17

Bring dependent libraries in to repo
author Chris Cannam
date Fri, 24 Jun 2016 14:47:45 +0100
parents
children af71cbdab621
rev   line source
Chris@366 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@366 2
Chris@366 3 #include "VectorOpsComplex.h"
Chris@366 4
Chris@366 5 #include <iostream>
Chris@366 6 #include <cstdlib>
Chris@366 7
Chris@366 8 #include <time.h>
Chris@366 9
Chris@366 10 using namespace std;
Chris@366 11
Chris@366 12 namespace breakfastquay {
Chris@366 13
Chris@366 14 namespace Test {
Chris@366 15
Chris@366 16 #ifdef _WIN32
Chris@366 17 #define drand48() (-1+2*((float)rand())/RAND_MAX)
Chris@366 18 #endif
Chris@366 19
Chris@366 20 bool
Chris@366 21 testMultiply()
Chris@366 22 {
Chris@366 23 cerr << "testVectorOps: testing v_multiply complex" << endl;
Chris@366 24
Chris@366 25 const int N = 1024;
Chris@366 26 turbot_complex_sample_t target[N];
Chris@366 27 turbot_complex_sample_t src1[N];
Chris@366 28 turbot_complex_sample_t src2[N];
Chris@366 29
Chris@366 30 for (int i = 0; i < N; ++i) {
Chris@366 31 src1[i].re = drand48();
Chris@366 32 src1[i].im = drand48();
Chris@366 33 src2[i].re = drand48();
Chris@366 34 src2[i].im = drand48();
Chris@366 35 }
Chris@366 36
Chris@366 37 turbot_sample_t mean, first, last, total = 0;
Chris@366 38 for (int i = 0; i < N; ++i) {
Chris@366 39 turbot_complex_sample_t result;
Chris@366 40 c_multiply(result, src1[i], src2[i]);
Chris@366 41 if (i == 0) first = result.re;
Chris@366 42 if (i == N-1) last = result.im;
Chris@366 43 total += result.re;
Chris@366 44 total += result.im;
Chris@366 45 }
Chris@366 46 mean = total / (N*2);
Chris@366 47 cerr << "Naive method: mean = " << mean << ", first = " << first
Chris@366 48 << ", last = " << last << endl;
Chris@366 49
Chris@366 50 v_multiply(target, src1, src2, N);
Chris@366 51 total = 0;
Chris@366 52
Chris@366 53 for (int i = 0; i < N; ++i) {
Chris@366 54 if (i == 0) first = target[i].re;
Chris@366 55 if (i == N-1) last = target[i].im;
Chris@366 56 total += target[i].re;
Chris@366 57 total += target[i].im;
Chris@366 58 }
Chris@366 59 mean = total / (N*2);
Chris@366 60 cerr << "v_multiply: mean = " << mean << ", first = " << first
Chris@366 61 << ", last = " << last << endl;
Chris@366 62
Chris@366 63 int iterations = 50000;
Chris@366 64 cerr << "Iterations: " << iterations << endl;
Chris@366 65
Chris@366 66 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
Chris@366 67 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
Chris@366 68
Chris@366 69 clock_t start = clock();
Chris@366 70
Chris@366 71 for (int j = 0; j < iterations; ++j) {
Chris@366 72 for (int i = 0; i < N; ++i) {
Chris@366 73 c_multiply(target[i], src1[i], src2[i]);
Chris@366 74 }
Chris@366 75 }
Chris@366 76
Chris@366 77 clock_t end = clock();
Chris@366 78
Chris@366 79 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
Chris@366 80
Chris@366 81 start = clock();
Chris@366 82
Chris@366 83 for (int j = 0; j < iterations; ++j) {
Chris@366 84 v_multiply(target, src1, src2, N);
Chris@366 85 }
Chris@366 86
Chris@366 87 end = clock();
Chris@366 88
Chris@366 89 cerr << "Time for v_multiply: " << float(end - start)/divisor << endl;
Chris@366 90
Chris@366 91 return true;
Chris@366 92 }
Chris@366 93
Chris@366 94 bool
Chris@366 95 testPolarToCart()
Chris@366 96 {
Chris@366 97 cerr << "testVectorOps: testing v_polar_to_cartesian" << endl;
Chris@366 98
Chris@366 99 const int N = 1024;
Chris@366 100 turbot_complex_sample_t target[N];
Chris@366 101 turbot_sample_t mag[N];
Chris@366 102 turbot_sample_t phase[N];
Chris@366 103
Chris@366 104 for (int i = 0; i < N; ++i) {
Chris@366 105 mag[i] = drand48();
Chris@366 106 phase[i] = (drand48() * M_PI * 2) - M_PI;
Chris@366 107 }
Chris@366 108
Chris@366 109 turbot_sample_t mean, first, last, total = 0;
Chris@366 110 for (int i = 0; i < N; ++i) {
Chris@366 111 turbot_sample_t real = mag[i] * cos(phase[i]);
Chris@366 112 turbot_sample_t imag = mag[i] * sin(phase[i]);
Chris@366 113 if (i == 0) first = real;
Chris@366 114 if (i == N-1) last = imag;
Chris@366 115 total += real;
Chris@366 116 total += imag;
Chris@366 117 }
Chris@366 118 mean = total / (N*2);
Chris@366 119 cerr << "Naive method: mean = " << mean << ", first = " << first
Chris@366 120 << ", last = " << last << endl;
Chris@366 121
Chris@366 122 v_polar_to_cartesian(target, mag, phase, N);
Chris@366 123
Chris@366 124 total = 0;
Chris@366 125
Chris@366 126 for (int i = 0; i < N; ++i) {
Chris@366 127 if (i == 0) first = target[i].re;
Chris@366 128 if (i == N-1) last = target[i].im;
Chris@366 129 total += target[i].re;
Chris@366 130 total += target[i].im;
Chris@366 131 }
Chris@366 132 mean = total / (N*2);
Chris@366 133 cerr << "v_polar_to_cartesian: mean = " << mean << ", first = " << first
Chris@366 134 << ", last = " << last << endl;
Chris@366 135
Chris@366 136 int iterations = 10000;
Chris@366 137 cerr << "Iterations: " << iterations << endl;
Chris@366 138
Chris@366 139 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
Chris@366 140 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
Chris@366 141
Chris@366 142 clock_t start = clock();
Chris@366 143
Chris@366 144 for (int j = 0; j < iterations; ++j) {
Chris@366 145 for (int i = 0; i < N; ++i) {
Chris@366 146 target[i].re = mag[i] * cos(phase[i]);
Chris@366 147 target[i].im = mag[i] * sin(phase[i]);
Chris@366 148 }
Chris@366 149 }
Chris@366 150
Chris@366 151 clock_t end = clock();
Chris@366 152
Chris@366 153 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
Chris@366 154
Chris@366 155 start = clock();
Chris@366 156
Chris@366 157 for (int j = 0; j < iterations; ++j) {
Chris@366 158 v_polar_to_cartesian(target, mag, phase, N);
Chris@366 159 }
Chris@366 160
Chris@366 161 end = clock();
Chris@366 162
Chris@366 163 cerr << "Time for v_polar_to_cartesian: " << float(end - start)/divisor << endl;
Chris@366 164
Chris@366 165 return true;
Chris@366 166 }
Chris@366 167
Chris@366 168 bool
Chris@366 169 testPolarToCartInterleaved()
Chris@366 170 {
Chris@366 171 cerr << "testVectorOps: testing v_polar_interleaved_to_cartesian" << endl;
Chris@366 172
Chris@366 173 const int N = 1024;
Chris@366 174 turbot_complex_sample_t target[N];
Chris@366 175 turbot_sample_t source[N*2];
Chris@366 176
Chris@366 177 for (int i = 0; i < N; ++i) {
Chris@366 178 source[i*2] = drand48();
Chris@366 179 source[i*2+1] = (drand48() * M_PI * 2) - M_PI;
Chris@366 180 }
Chris@366 181
Chris@366 182 turbot_sample_t mean, first, last, total = 0;
Chris@366 183 for (int i = 0; i < N; ++i) {
Chris@366 184 turbot_sample_t real = source[i*2] * cos(source[i*2+1]);
Chris@366 185 turbot_sample_t imag = source[i*2] * sin(source[i*2+1]);
Chris@366 186 if (i == 0) first = real;
Chris@366 187 if (i == N-1) last = imag;
Chris@366 188 total += real;
Chris@366 189 total += imag;
Chris@366 190 }
Chris@366 191 mean = total / (N*2);
Chris@366 192 cerr << "Naive method: mean = " << mean << ", first = " << first
Chris@366 193 << ", last = " << last << endl;
Chris@366 194
Chris@366 195 v_polar_interleaved_to_cartesian(target, source, N);
Chris@366 196
Chris@366 197 total = 0;
Chris@366 198
Chris@366 199 for (int i = 0; i < N; ++i) {
Chris@366 200 if (i == 0) first = target[i].re;
Chris@366 201 if (i == N-1) last = target[i].im;
Chris@366 202 total += target[i].re;
Chris@366 203 total += target[i].im;
Chris@366 204 }
Chris@366 205 mean = total / (N*2);
Chris@366 206 cerr << "v_polar_interleaved_to_cartesian: mean = " << mean << ", first = " << first
Chris@366 207 << ", last = " << last << endl;
Chris@366 208
Chris@366 209 int iterations = 10000;
Chris@366 210 cerr << "Iterations: " << iterations << endl;
Chris@366 211
Chris@366 212 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
Chris@366 213 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
Chris@366 214
Chris@366 215 clock_t start = clock();
Chris@366 216
Chris@366 217 for (int j = 0; j < iterations; ++j) {
Chris@366 218 for (int i = 0; i < N; ++i) {
Chris@366 219 target[i].re = source[i*2] * cos(source[i*2+1]);
Chris@366 220 target[i].im = source[i*2] * sin(source[i*2+1]);
Chris@366 221 }
Chris@366 222 }
Chris@366 223
Chris@366 224 clock_t end = clock();
Chris@366 225
Chris@366 226 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
Chris@366 227
Chris@366 228 start = clock();
Chris@366 229
Chris@366 230 for (int j = 0; j < iterations; ++j) {
Chris@366 231 v_polar_interleaved_to_cartesian(target, source, N);
Chris@366 232 }
Chris@366 233
Chris@366 234 end = clock();
Chris@366 235
Chris@366 236 cerr << "Time for v_polar_interleaved_to_cartesian: " << float(end - start)/divisor << endl;
Chris@366 237
Chris@366 238 return true;
Chris@366 239 }
Chris@366 240
Chris@366 241 bool
Chris@366 242 testVectorOps()
Chris@366 243 {
Chris@366 244 if (!testMultiply()) return false;
Chris@366 245 if (!testPolarToCart()) return false;
Chris@366 246 if (!testPolarToCartInterleaved()) return false;
Chris@366 247
Chris@366 248 return true;
Chris@366 249 }
Chris@366 250
Chris@366 251 }
Chris@366 252
Chris@366 253 }
Chris@366 254