From ba923c53bdf1dc1b64f58dafdedcea1096fbdf92 Mon Sep 17 00:00:00 2001 From: David Madl Date: Thu, 12 Mar 2026 22:10:49 +0100 Subject: [PATCH] feat: RQF: filter() style interface RunningQuality --- pasada-lib/include/ssf_filter.h | 17 ++++++++++++++++- pasada-lib/ssf_filter.cpp | 18 +++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/pasada-lib/include/ssf_filter.h b/pasada-lib/include/ssf_filter.h index 11fd9da..0bd2eb9 100644 --- a/pasada-lib/include/ssf_filter.h +++ b/pasada-lib/include/ssf_filter.h @@ -98,8 +98,23 @@ public: // note: arg should be an iterator really, but can do later /** * @param beat individual beat accelero signal + * @return true if it is good beat */ - void append(std::vector &rawBeat, std::vector &rawSsf); + bool append(std::vector &rawBeat, std::vector &rawSsf); +}; + +/** + * Signal quality indicator. + */ +class RunningQualityFilter { +protected: + RunningQuality f_sqi; + std::vector beat_buf; + std::vector ssf_buf; + double sqi; +public: + RunningQualityFilter(size_t upslope_width); + double filter(double y, double ssf, double step); }; #endif //PASADASUPERPROJECT_SSF_FILTER_H \ No newline at end of file diff --git a/pasada-lib/ssf_filter.cpp b/pasada-lib/ssf_filter.cpp index 7fa724b..5f38b44 100644 --- a/pasada-lib/ssf_filter.cpp +++ b/pasada-lib/ssf_filter.cpp @@ -124,7 +124,7 @@ RunningQuality::RunningQuality(bool disableSsf): beatCorrThr2(BEAT_CORR_THR_2), RunningQuality::~RunningQuality() {} // note: arg should be an iterator really, but can do later -void RunningQuality::append(std::vector &rawBeat, std::vector &rawSsf) { +bool RunningQuality::append(std::vector &rawBeat, std::vector &rawSsf) { // TODO: should ignore crazy-long and very short beats here. (filter up on beat detector) std::vector beat; @@ -181,4 +181,20 @@ void RunningQuality::append(std::vector &rawBeat, std::vector &r dispatchBeat(idx, goodBeat, posCorr); } idx++; + if (!goodBeat) return 0.0; + return posCorr; +} + + +RunningQualityFilter::RunningQualityFilter(size_t upslope_width) : sqi(0.0) {} + +double RunningQualityFilter::filter(double y, double ssf, double step) { + if (step == 1.0) { + sqi = f_sqi.append(beat_buf, ssf_buf); + beat_buf.clear(); + ssf_buf.clear(); + } + beat_buf.push_back(y); + ssf_buf.push_back(ssf); + return sqi; }