// // Created by david on 15.03.2026. // #ifndef PASADASUPERPROJECT_STEP_DETECTOR_H #define PASADASUPERPROJECT_STEP_DETECTOR_H #include "iir_filter.h" #include "ssf_filter.h" #include class StepListener { public: virtual ~StepListener() {} virtual void playBeat() = 0; }; /** * Step detector from accelerometer signal. * * Settling time is 3.0 sec (defined in SsfStepDetector.LEN_INIT), * no steps are detected before. */ class StepDetector { protected: StepListener *listener; Filt f_neg; SsfFilter f_ssf; SsfStepDetector f_ssd; RunningQualityFilter f_sqi; bool debug; std::vector buf_ssd; std::vector buf_sqi; std::vector buf_out; public: StepDetector(double fps, StepListener *listener, bool debug = false); void filter(std::vector values); std::vector getBufSsd(); std::vector getBufSqi(); std::vector getBufOut(); /** * Prime the filters using the given input signal. * Used for debugging (non-realtime processing) to align the signal. */ void primeFilters(double fps, std::vector sig); }; /** mean-filter the gravity vector, then take acceleration downwards */ class GravityFilter { size_t N; std::vector gauss_taps; Filt gx; Filt gy; Filt gz; public: // 5 secs buffer, prime y with direction of gravity (for tests & faster init) GravityFilter(double fps); double filter(std::vector values); }; #endif //PASADASUPERPROJECT_STEP_DETECTOR_H