Mercurial > hg > js-dsp-test
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 |