diff --git a/src/entrypoints/fft-benchmark.cpp b/src/entrypoints/fft-benchmark.cpp index c7c80730b099513404e5fc80ad0f5879918d50ac..53c5ebbce529093e30f0f18f2fe28d72d125cf61 100644 --- a/src/entrypoints/fft-benchmark.cpp +++ b/src/entrypoints/fft-benchmark.cpp @@ -22,36 +22,70 @@ #pragma once -#include <iostream> -#include <Eigen/Dense> -#include <miosix.h> -#include <complex.h> -#include <math.h> #include <algorithms/FFT.h> +#include <drivers/timer/TimestampTimer.h> +#include <utils/Stats/Stats.h> + +#include <Eigen/Dense> +#include <array> using namespace Boardcore; +using namespace std; -int main(int argc, char const *argv[]) -{ - Eigen::Vector<float, 256> input_signal = Eigen::Vector<float, 256>::Zero(); - float f1, f2; +const unsigned int TAKES = 5000; +const unsigned int BUFFER = 32; - f1 = 50; - f2 = 25; +array<float, TAKES> data; - for (size_t i = 0; i < input_signal.size(); i++) - { - input_signal(i) = sin(2 * M_PI * i / 256 * f1) + sin(2 * M_PI * i / 256 * f2); - } +/** + * @brief Prints the test results for the specified buffer size. + * + * @param bufferSize Buffer size of the benchmark. + * @param results Results form the benchmark. + */ +void printResults(size_t bufferSize, array<float, TAKES>& results); - Eigen::Vector<std::complex<float>, 256> fft_result = FFT<256>::fft(input_signal); - Eigen::Vector<float, 256> fft_freq = FFT<256>::fftfreq(1.0 / 256.0); +int main() +{ + Eigen::Vector<float, BUFFER> input_signal = + Eigen::Vector<float, BUFFER>::Zero(); - std::cout << "FFT result:" << std::endl; - for (size_t i = 0; i < fft_result.size(); i++) + for (int i = 0; i < TAKES; i++) { - std::cout << fft_freq(i) << ' ' << fft_result(i).real() << std::endl; + for (size_t i = 0; i < input_signal.size(); i++) + { + input_signal(i) = (float)rand() / RAND_MAX; + } + + int64_t duration = TimestampTimer::getTimestamp(); + FFT<BUFFER>::fft(input_signal); + duration = TimestampTimer::getTimestamp() - duration; + data[i] = duration; } + printResults(BUFFER, data); + return 0; } + +void printResults(size_t bufferSize, array<float, TAKES>& results) +{ + // Compute statistics on the benchmark results + Stats stats; + for (float result : results) + stats.add(result); + StatsResult statsResults = stats.getStats(); + + printf("\tBuffer size: %lu\n", (unsigned long)bufferSize); + printf("Times:\n"); + printf("- mean: % 6.1f us\n", statsResults.mean); + printf("- std dev: % 6.1f us\n", statsResults.stdDev); + printf("- min: % 6.1f us\n", statsResults.minValue); + printf("- max: % 6.1f us\n", statsResults.maxValue); + printf("Speeds:\n"); + printf("- mean: % 6.2f Hz\n", 1e6 / statsResults.mean); + printf("- min: % 6.2f Hz\n", 1e6 / statsResults.maxValue); + printf("- max: % 6.2f Hz\n", 1e6 / statsResults.minValue); + + printf("\n"); +}