Compare commits

..

3 Commits

Author SHA1 Message Date
435221c3c6 Merge C:/Users/david/Documents/src/lockstep/app/src/main/cpp/libpasada 2026-06-14 16:25:11 +02:00
cd55709cc0 feat: add ts to StepDetector 2026-06-14 16:21:48 +02:00
6cfa01f0ec docs 2026-05-20 01:03:33 +02:00
2 changed files with 18 additions and 7 deletions

View File

@@ -12,8 +12,8 @@
class StepListener { class StepListener {
public: public:
virtual ~StepListener() {} virtual ~StepListener() = default;
virtual void playBeat() = 0; virtual void playBeat(double t) = 0;
}; };
/** mean-filter the gravity vector, then take acceleration downwards */ /** mean-filter the gravity vector, then take acceleration downwards */
@@ -54,9 +54,20 @@ protected:
double fps; double fps;
public: public:
/**
* @param fps Initial guess for sampling rate - this is recomputed internally after the first 100 samples
* @param listener Listener to send step events to
* @param debug collect debug buffers (used in unit tests)
*/
StepDetector(double fps, StepListener *listener, bool debug = false); StepDetector(double fps, StepListener *listener, bool debug = false);
/**
* Push raw accelerometer values (unevenly sampled and 3-dimensional).
* @param ts timestamp in ns
* @param values acceleration values for x,y,z
*/
void filter(double ts, std::vector<float> values); void filter(double ts, std::vector<float> values);
void filter_a(double s1); /** filter using scalar accel samples in \vec{e_g} direction */
void filter_a(double t, double s1);
std::vector<double> getBufSsd(); std::vector<double> getBufSsd();
std::vector<double> getBufSqi(); std::vector<double> getBufSqi();
std::vector<double> getBufOut(); std::vector<double> getBufOut();
@@ -68,4 +79,4 @@ public:
double primeFilters(double fps, std::vector<double> sig); double primeFilters(double fps, std::vector<double> sig);
}; };
#endif //PASADASUPERPROJECT_STEP_DETECTOR_H #endif //PASADASUPERPROJECT_STEP_DETECTOR_H

View File

@@ -65,11 +65,11 @@ void StepDetector::filter(double ts, std::vector<float> values) {
// gravity filtering // gravity filtering
double a = f_grav.filter(samp); double a = f_grav.filter(samp);
// pass on accel sample // pass on accel sample
filter_a(a); filter_a(ts, a);
} }
} }
void StepDetector::filter_a(double s2) { void StepDetector::filter_a(double ts, double s2) {
auto s3 = f_ssf.filter(s2); auto s3 = f_ssf.filter(s2);
auto s4 = f_ssd.filter(s3); auto s4 = f_ssd.filter(s3);
auto q5 = f_sqi.filter(s2, s3, s4); auto q5 = f_sqi.filter(s2, s3, s4);
@@ -80,7 +80,7 @@ void StepDetector::filter_a(double s2) {
} }
// is step, step quality is OK, and we have a listener? // is step, step quality is OK, and we have a listener?
if(s4 > 0.0 && q5 > 0.0 && listener != nullptr) { if(s4 > 0.0 && q5 > 0.0 && listener != nullptr) {
listener->playBeat(); listener->playBeat(ts / 1e9);
} }
} }