Mercurial > hg > js-dsp-test
view fft/native/bqvec/test/TestVectorOps.cpp @ 29:cf59817a5983
Build stuff for native
author | Chris Cannam |
---|---|
date | Sat, 17 Oct 2015 15:00:08 +0100 |
parents | |
children |
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "bqvec/VectorOpsComplex.h" #include <iostream> #include <cstdlib> #include <time.h> using namespace std; namespace breakfastquay { namespace Test { #ifdef _WIN32 #define drand48() (-1+2*((float)rand())/RAND_MAX) #endif bool testMultiply() { cerr << "testVectorOps: testing v_multiply complex" << endl; const int N = 1024; bq_complex_t target[N]; bq_complex_t src1[N]; bq_complex_t src2[N]; for (int i = 0; i < N; ++i) { src1[i].re = drand48(); src1[i].im = drand48(); src2[i].re = drand48(); src2[i].im = drand48(); } double mean, first, last, total = 0; for (int i = 0; i < N; ++i) { bq_complex_t result; c_multiply(result, src1[i], src2[i]); if (i == 0) first = result.re; if (i == N-1) last = result.im; total += result.re; total += result.im; } mean = total / (N*2); cerr << "Naive method: mean = " << mean << ", first = " << first << ", last = " << last << endl; v_multiply(target, src1, src2, N); total = 0; for (int i = 0; i < N; ++i) { if (i == 0) first = target[i].re; if (i == N-1) last = target[i].im; total += target[i].re; total += target[i].im; } mean = total / (N*2); cerr << "v_multiply: mean = " << mean << ", first = " << first << ", last = " << last << endl; int iterations = 50000; cerr << "Iterations: " << iterations << endl; cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; clock_t start = clock(); for (int j = 0; j < iterations; ++j) { for (int i = 0; i < N; ++i) { c_multiply(target[i], src1[i], src2[i]); } } clock_t end = clock(); cerr << "Time for naive method: " << float(end - start)/divisor << endl; start = clock(); for (int j = 0; j < iterations; ++j) { v_multiply(target, src1, src2, N); } end = clock(); cerr << "Time for v_multiply: " << float(end - start)/divisor << endl; return true; } bool testPolarToCart() { cerr << "testVectorOps: testing v_polar_to_cartesian" << endl; const int N = 1024; bq_complex_t target[N]; double mag[N]; double phase[N]; for (int i = 0; i < N; ++i) { mag[i] = drand48(); phase[i] = (drand48() * M_PI * 2) - M_PI; } double mean, first, last, total = 0; for (int i = 0; i < N; ++i) { double real = mag[i] * cos(phase[i]); double imag = mag[i] * sin(phase[i]); if (i == 0) first = real; if (i == N-1) last = imag; total += real; total += imag; } mean = total / (N*2); cerr << "Naive method: mean = " << mean << ", first = " << first << ", last = " << last << endl; v_polar_to_cartesian(target, mag, phase, N); total = 0; for (int i = 0; i < N; ++i) { if (i == 0) first = target[i].re; if (i == N-1) last = target[i].im; total += target[i].re; total += target[i].im; } mean = total / (N*2); cerr << "v_polar_to_cartesian: mean = " << mean << ", first = " << first << ", last = " << last << endl; int iterations = 10000; cerr << "Iterations: " << iterations << endl; cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; clock_t start = clock(); for (int j = 0; j < iterations; ++j) { for (int i = 0; i < N; ++i) { target[i].re = mag[i] * cos(phase[i]); target[i].im = mag[i] * sin(phase[i]); } } clock_t end = clock(); cerr << "Time for naive method: " << float(end - start)/divisor << endl; start = clock(); for (int j = 0; j < iterations; ++j) { v_polar_to_cartesian(target, mag, phase, N); } end = clock(); cerr << "Time for v_polar_to_cartesian: " << float(end - start)/divisor << endl; return true; } bool testPolarToCartInterleaved() { cerr << "testVectorOps: testing v_polar_interleaved_to_cartesian" << endl; const int N = 1024; bq_complex_t target[N]; double source[N*2]; for (int i = 0; i < N; ++i) { source[i*2] = drand48(); source[i*2+1] = (drand48() * M_PI * 2) - M_PI; } double mean, first, last, total = 0; for (int i = 0; i < N; ++i) { double real = source[i*2] * cos(source[i*2+1]); double imag = source[i*2] * sin(source[i*2+1]); if (i == 0) first = real; if (i == N-1) last = imag; total += real; total += imag; } mean = total / (N*2); cerr << "Naive method: mean = " << mean << ", first = " << first << ", last = " << last << endl; v_polar_interleaved_to_cartesian(target, source, N); total = 0; for (int i = 0; i < N; ++i) { if (i == 0) first = target[i].re; if (i == N-1) last = target[i].im; total += target[i].re; total += target[i].im; } mean = total / (N*2); cerr << "v_polar_interleaved_to_cartesian: mean = " << mean << ", first = " << first << ", last = " << last << endl; int iterations = 10000; cerr << "Iterations: " << iterations << endl; cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl; float divisor = float(CLOCKS_PER_SEC) / 1000.f; clock_t start = clock(); for (int j = 0; j < iterations; ++j) { for (int i = 0; i < N; ++i) { target[i].re = source[i*2] * cos(source[i*2+1]); target[i].im = source[i*2] * sin(source[i*2+1]); } } clock_t end = clock(); cerr << "Time for naive method: " << float(end - start)/divisor << endl; start = clock(); for (int j = 0; j < iterations; ++j) { v_polar_interleaved_to_cartesian(target, source, N); } end = clock(); cerr << "Time for v_polar_interleaved_to_cartesian: " << float(end - start)/divisor << endl; return true; } bool testVectorOps() { if (!testMultiply()) return false; if (!testPolarToCart()) return false; if (!testPolarToCartInterleaved()) return false; return true; } } }