annotate fft/native/bqvec/test/TestVectorOps.cpp @ 40:223f770b5341 kissfft-double tip

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