m
Fork of MAX30100 by
Diff: MAX30100_BeatDetector.h
- Revision:
- 0:010b908e2187
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAX30100_BeatDetector.h Fri Nov 25 00:52:54 2016 +0000 @@ -0,0 +1,64 @@ +/* +Arduino-MAX30100 oximetry / heart rate integrated sensor library +Copyright (C) 2016 OXullo Intersecans <x@brainrapers.org> +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef MAX30100_BEATDETECTOR_H +#define MAX30100_BEATDETECTOR_H + +#include "mbed.h" +#include <stdint.h> +#include <algorithm> + +#define BEATDETECTOR_INIT_HOLDOFF 2000 // in ms, how long to wait before counting +#define BEATDETECTOR_MASKING_HOLDOFF 200 // in ms, non-retriggerable window after beat detection +#define BEATDETECTOR_BPFILTER_ALPHA 0.6 // EMA factor for the beat period value +#define BEATDETECTOR_MIN_THRESHOLD 20 // minimum threshold (filtered) value +#define BEATDETECTOR_MAX_THRESHOLD 800 // maximum threshold (filtered) value +#define BEATDETECTOR_STEP_RESILIENCY 30 // maximum negative jump that triggers the beat edge +#define BEATDETECTOR_THRESHOLD_FALLOFF_TARGET 0.3 // thr chasing factor of the max value when beat +#define BEATDETECTOR_THRESHOLD_DECAY_FACTOR 0.99 // thr chasing factor when no beat +#define BEATDETECTOR_INVALID_READOUT_DELAY 2000 // in ms, no-beat time to cause a reset +#define BEATDETECTOR_SAMPLES_PERIOD 10 // in ms, 1/Fs + + +typedef enum BeatDetectorState { + BEATDETECTOR_STATE_INIT, + BEATDETECTOR_STATE_WAITING, + BEATDETECTOR_STATE_FOLLOWING_SLOPE, + BEATDETECTOR_STATE_MAYBE_DETECTED, + BEATDETECTOR_STATE_MASKING +} BeatDetectorState; + + +class BeatDetector +{ +public: + BeatDetector(); + bool addSample(float sample); + float getRate(); + float getCurrentThreshold(); + +private: + bool checkForBeat(float value); + void decreaseThreshold(); + + BeatDetectorState state; + float threshold; + float beatPeriod; + float lastMaxValue; + uint32_t tsLastBeat; + Timer t; +}; + +#endif \ No newline at end of file