I've got some basic filter code setup (but not yet tested).
Dependencies: BLE_API Queue mbed nRF51822
Fork of BLE_HeartRate by
Diff: noisechk.cpp
- Revision:
- 62:8e2fbe131b53
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/noisechk.cpp Sun Jun 28 03:06:00 2015 +0000 @@ -0,0 +1,131 @@ +/***************************************************************************** +FILE: noisechk.cpp +AUTHOR: Patrick S. Hamilton +REVISED: 5/13/2002 + ___________________________________________________________________________ + +noisechk.cpp: Noise Check +Copywrite (C) 2001 Patrick S. Hamilton + +This file is free software; you can redistribute it and/or modify it under +the terms of the GNU Library General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your option) any +later version. + +This software 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 Library General Public License for more +details. + +You should have received a copy of the GNU Library General Public License along +with this library; if not, write to the Free Software Foundation, Inc., 59 +Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +You may contact the author by e-mail (pat@eplimited.edu) or postal mail +(Patrick Hamilton, E.P. Limited, 35 Medford St., Suite 204 Somerville, +MA 02143 USA). For updates to this software, please visit our website +(http://www.eplimited.com). + __________________________________________________________________________ + +This file contains functions for evaluating the noise content of a beat. + +*****************************************************************************/ + +//#include <stdlib.h> +#include <mbed.h> +#include "qrsdet.h" + +#define NB_LENGTH MS1500 +#define NS_LENGTH MS50 + +int NoiseBuffer[NB_LENGTH], NBPtr = 0 ; +int NoiseEstimate ; + +/************************************************************************ + GetNoiseEstimate() allows external access the present noise estimate. + this function is only used for debugging. +*************************************************************************/ + +int GetNoiseEstimate() + { + return(NoiseEstimate) ; + } + +/*********************************************************************** + NoiseCheck() must be called for every sample of data. The data is + stored in a circular buffer to facilitate noise analysis. When a + beat is detected NoiseCheck() is passed the sample delay since the + R-wave of the beat occurred (delay), the RR interval between this + beat and the next most recent beat, the estimated offset from the + R-wave to the beginning of the beat (beatBegin), and the estimated + offset from the R-wave to the end of the beat. + + NoiseCheck() estimates the noise in the beat by the maximum and + minimum signal values in either a window from the end of the + previous beat to the beginning of the present beat, or a 250 ms + window preceding the present beat, which ever is shorter. + + NoiseCheck() returns ratio of the signal variation in the window + between beats to the length of the window between the beats. If + the heart rate is too high and the beat durations are too long, + NoiseCheck() returns 0. + +***********************************************************************/ + +int NoiseCheck(int datum, int delay, int RR, int beatBegin, int beatEnd) + { + int ptr, i; + int ncStart, ncEnd, ncMax, ncMin ; + double noiseIndex ; + + NoiseBuffer[NBPtr] = datum ; + if(++NBPtr == NB_LENGTH) + NBPtr = 0 ; + + // Check for noise in region that is 300 ms following + // last R-wave and 250 ms preceding present R-wave. + + ncStart = delay+RR-beatEnd ; // Calculate offset to end of previous beat. + ncEnd = delay+beatBegin ; // Calculate offset to beginning of this beat. + if(ncStart > ncEnd + MS250) + ncStart = ncEnd + MS250 ; + + + // Estimate noise if delay indicates a beat has been detected, + // the delay is not to long for the data buffer, and there is + // some space between the end of the last beat and the beginning + // of this beat. + + if((delay != 0) && (ncStart < NB_LENGTH) && (ncStart > ncEnd)) + { + + ptr = NBPtr - ncStart ; // Find index to end of last beat in + if(ptr < 0) // the circular buffer. + ptr += NB_LENGTH ; + + // Find the maximum and minimum values in the + // isoelectric region between beats. + + ncMax = ncMin = NoiseBuffer[ptr] ; + for(i = 0; i < ncStart-ncEnd; ++i) + { + if(NoiseBuffer[ptr] > ncMax) + ncMax = NoiseBuffer[ptr] ; + else if(NoiseBuffer[ptr] < ncMin) + ncMin = NoiseBuffer[ptr] ; + if(++ptr == NB_LENGTH) + ptr = 0 ; + } + + // The noise index is the ratio of the signal variation + // over the isoelectric window length, scaled by 10. + + noiseIndex = (ncMax-ncMin) ; + noiseIndex /= (ncStart-ncEnd) ; + NoiseEstimate = noiseIndex * 10 ; + } + else + NoiseEstimate = 0 ; + return(NoiseEstimate) ; + } +