annotate fft/native/native.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@27 1
Chris@27 2 #include <bqfft/FFT.h>
Chris@27 3
Chris@27 4 #include <vector>
Chris@27 5 #include <iostream>
Chris@27 6 #include <cmath>
Chris@27 7 #include <chrono>
Chris@27 8
Chris@27 9 using namespace std;
Chris@27 10 using namespace breakfastquay;
Chris@27 11
Chris@27 12 int main(int argc, char **argv)
Chris@27 13 {
Chris@27 14 vector<int> sizes { 512, 2048 };
Chris@27 15
Chris@27 16 int iterations = 2000;
Chris@27 17 int times = 100;
Chris@27 18
Chris@27 19 for (auto size: sizes) {
Chris@27 20
Chris@27 21 FFT fft(size);
Chris@27 22 double total = 0.0;
Chris@27 23
Chris@27 24 auto start = chrono::high_resolution_clock::now();
Chris@27 25
Chris@27 26 for (int ti = 0; ti < times; ++ti) {
Chris@27 27
Chris@27 28 total = 0.0;
Chris@27 29
Chris@27 30 for (int i = 0; i < iterations; ++i) {
Chris@27 31
Chris@27 32 vector<double> ri(size), ro(size/2+1), io(size/2+1);
Chris@27 33 for (int j = 0; j < size; ++j) {
Chris@27 34 ri[j] = (j % 2) / 4.0;
Chris@27 35 }
Chris@27 36
Chris@27 37 fft.forward(ri.data(), ro.data(), io.data());
Chris@27 38
Chris@27 39 for (int j = 0; j <= size/2; ++j) {
Chris@27 40 total += sqrt(ro[j] * ro[j] + io[j] * io[j]);
Chris@27 41 }
Chris@27 42
Chris@27 43 // synthesise the conjugate half
Chris@27 44 for (int j = 1; j < size/2; ++j) {
Chris@27 45 total += sqrt(ro[j] * ro[j] + io[j] * io[j]);
Chris@27 46 }
Chris@27 47 }
Chris@27 48 }
Chris@27 49
Chris@27 50 auto end = chrono::high_resolution_clock::now();
Chris@27 51
Chris@27 52 double ms = chrono::duration<double, milli>(end - start).count() / times;
Chris@27 53
Chris@28 54 cerr << "for " << iterations << " * size " << size << ": total = "
Chris@28 55 << total << ", time = " << ms
Chris@28 56 << " ms (" << (iterations / (ms / 1000.0)) << " itr/sec)" << endl;
Chris@27 57 }
Chris@27 58 }
Chris@27 59