Measuring plethysmogram with BH1792GLC (Rohm Semiconductor) and calculating pulse rate

Dependencies:   USBDevice mbed

Committer:
t_tatsuoka
Date:
Mon Feb 05 21:28:19 2018 +0000
Revision:
1:90f70c146a26
Parent:
0:18d735a66926
Ver. 1.0.1 ???beep?????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
t_tatsuoka 0:18d735a66926 1 /**
t_tatsuoka 0:18d735a66926 2 * @file PulseRate.h
t_tatsuoka 0:18d735a66926 3 * @brief Header file for PulseRate.cpp
t_tatsuoka 1:90f70c146a26 4 * @date 2018.02.06
t_tatsuoka 1:90f70c146a26 5 * @version 1.1.1
t_tatsuoka 0:18d735a66926 6 */
t_tatsuoka 0:18d735a66926 7 #ifndef _INC_PulseRate
t_tatsuoka 0:18d735a66926 8 #define _INC_PulseRate
t_tatsuoka 0:18d735a66926 9
t_tatsuoka 0:18d735a66926 10 // #define _OP_MODE_INT_AD /* When using internal ADC */
t_tatsuoka 0:18d735a66926 11 #define _OP_MODE_BH1792GLC /* When using BH1792GLC sensor */
t_tatsuoka 0:18d735a66926 12
t_tatsuoka 0:18d735a66926 13 #include "mbed.h"
t_tatsuoka 0:18d735a66926 14 #ifdef _OP_MODE_BH1792GLC
t_tatsuoka 0:18d735a66926 15 #include "Bh1792glcCtrl.h"
t_tatsuoka 0:18d735a66926 16 #endif
t_tatsuoka 0:18d735a66926 17
t_tatsuoka 0:18d735a66926 18 #define LED_ON (0)
t_tatsuoka 0:18d735a66926 19 #define LED_OFF (1)
t_tatsuoka 0:18d735a66926 20
t_tatsuoka 0:18d735a66926 21 #define BEEP_FREQ (1000.0)
t_tatsuoka 0:18d735a66926 22 #define BEEP_LOUD (0.5)
t_tatsuoka 0:18d735a66926 23
t_tatsuoka 0:18d735a66926 24 #define SAMPLING_RATE (0.01) /* A/D sampling rate (10ms) */
t_tatsuoka 0:18d735a66926 25 #define SPL_NUM (100) /* Range of sampling number (0 - 99) */
t_tatsuoka 0:18d735a66926 26
t_tatsuoka 0:18d735a66926 27 #define AD_OFFSET (21845) /* Offset value for VREF (about +1.1V) */
t_tatsuoka 0:18d735a66926 28
t_tatsuoka 0:18d735a66926 29 #define COEF_BH (0x3FCCB062) /* High pass filter b0, -b1 coefficient 0.1Hz/100Hz Q30 format */
t_tatsuoka 0:18d735a66926 30 /* Use (0x3F02946A) when 0.5Hz/100Hz Q30 format */
t_tatsuoka 0:18d735a66926 31 #define COEF_AH (0x3F9960C5) /* High pass filter -a1 coefficient 0.1Hz/200Hz Q30 format */
t_tatsuoka 0:18d735a66926 32 /* Use (0x3E0528D5) when 0.5Hz/100Hz Q30 format */
t_tatsuoka 0:18d735a66926 33
t_tatsuoka 0:18d735a66926 34 #define MV_LENGTH (5) /* Number of moving averaging for pulse detection */
t_tatsuoka 0:18d735a66926 35 #define TH_COEF (0.993) /* Coefficient for pulse threshold (exponential decline) */
t_tatsuoka 1:90f70c146a26 36
t_tatsuoka 1:90f70c146a26 37 #ifdef _OP_MODE_INT_AD
t_tatsuoka 0:18d735a66926 38 #define PEAK_MIN (127) /* Ignore waveform as pulse under this value */
t_tatsuoka 1:90f70c146a26 39 #elif defined _OP_MODE_BH1792GLC
t_tatsuoka 1:90f70c146a26 40 #define PEAK_MIN (63) /* Ignore waveform as pulse under this value */
t_tatsuoka 1:90f70c146a26 41 #endif
t_tatsuoka 0:18d735a66926 42
t_tatsuoka 0:18d735a66926 43 #define PR_LENGTH (5) /* Number of average for pulse rate */
t_tatsuoka 0:18d735a66926 44 #define PR_1MIN_SPL (6000) /* Number of sampling for 1 minute (60*100) */
t_tatsuoka 0:18d735a66926 45 #define PR_INT_MAX (300) /* 20 bpm (60*100/20) */
t_tatsuoka 0:18d735a66926 46 #define PR_INT_MIN (20) /* 300 bpm (60*100/300) */
t_tatsuoka 0:18d735a66926 47
t_tatsuoka 0:18d735a66926 48 /** Calculate pulse waveform and pulse rate
t_tatsuoka 0:18d735a66926 49 */
t_tatsuoka 0:18d735a66926 50 class PulseRate
t_tatsuoka 0:18d735a66926 51 {
t_tatsuoka 0:18d735a66926 52
t_tatsuoka 0:18d735a66926 53 public:
t_tatsuoka 0:18d735a66926 54 #ifdef _OP_MODE_INT_AD
t_tatsuoka 0:18d735a66926 55 PulseRate(PinName sensor, PinName sync_led, PinName beep);
t_tatsuoka 0:18d735a66926 56 #elif defined _OP_MODE_BH1792GLC
t_tatsuoka 0:18d735a66926 57 PulseRate(PinName bh_sda, PinName bh_scl, PinName bh_int, PinName sync_led, PinName beep);
t_tatsuoka 0:18d735a66926 58 #endif
t_tatsuoka 0:18d735a66926 59 void start_sampling();
t_tatsuoka 0:18d735a66926 60 bool get_wave(uint32_t &num, int32_t &wave_val);
t_tatsuoka 0:18d735a66926 61 bool get_pr_val(uint32_t &pr);
t_tatsuoka 0:18d735a66926 62
t_tatsuoka 0:18d735a66926 63 private:
t_tatsuoka 0:18d735a66926 64 Ticker _sampling; /* Interval timer for data sampling */
t_tatsuoka 0:18d735a66926 65
t_tatsuoka 0:18d735a66926 66 #ifdef _OP_MODE_INT_AD
t_tatsuoka 0:18d735a66926 67 AnalogIn _sensor; /* A/D converter */
t_tatsuoka 0:18d735a66926 68 #elif defined _OP_MODE_BH1792GLC
t_tatsuoka 0:18d735a66926 69 Bh1792glcCtrl _bh; /* BH1792GLC Control */
t_tatsuoka 0:18d735a66926 70 #endif
t_tatsuoka 0:18d735a66926 71 DigitalOut _sync_led; /* Synchronous LED */
t_tatsuoka 0:18d735a66926 72 PwmOut _beep; /* Piezo sounder */
t_tatsuoka 0:18d735a66926 73
t_tatsuoka 0:18d735a66926 74 /* Pulse waveform */
t_tatsuoka 0:18d735a66926 75 int32_t _val; /* Pulse waveform value */
t_tatsuoka 0:18d735a66926 76 int32_t _prev_val; /* Previous value */
t_tatsuoka 0:18d735a66926 77 int32_t _reg_hpf; /* High pass filter memory value */
t_tatsuoka 0:18d735a66926 78 bool _wave_flag; /* Pulse waveform set flag */
t_tatsuoka 0:18d735a66926 79
t_tatsuoka 0:18d735a66926 80 uint32_t _sampling_num; /* Sampling number */
t_tatsuoka 0:18d735a66926 81
t_tatsuoka 0:18d735a66926 82 /* Moving averaging */
t_tatsuoka 0:18d735a66926 83 int32_t _mv_buf[MV_LENGTH]; /* Circular buffer */
t_tatsuoka 0:18d735a66926 84 int32_t _mv_idx; /* Buffer index */
t_tatsuoka 0:18d735a66926 85
t_tatsuoka 0:18d735a66926 86 /* Threshold for detecting pulse */
t_tatsuoka 0:18d735a66926 87 int32_t _detect_val; /* Detection value */
t_tatsuoka 0:18d735a66926 88 int32_t _prev_dt_val; /* Previous data */
t_tatsuoka 0:18d735a66926 89
t_tatsuoka 0:18d735a66926 90 int32_t _threshold_val; /* Threshold value */
t_tatsuoka 0:18d735a66926 91 int32_t _prev_th_val; /* Previous data */
t_tatsuoka 0:18d735a66926 92
t_tatsuoka 0:18d735a66926 93 /* Pulse rate */
t_tatsuoka 0:18d735a66926 94 int32_t _pr_counter; /* Counter for pulse rate */
t_tatsuoka 0:18d735a66926 95 int32_t _pr_buf[PR_LENGTH]; /* Circular buffer */
t_tatsuoka 0:18d735a66926 96 int32_t _pr_idx; /* Buffer index */
t_tatsuoka 0:18d735a66926 97
t_tatsuoka 0:18d735a66926 98 int32_t _pr; /* Pulse rate value */
t_tatsuoka 0:18d735a66926 99 bool _pr_flag; /* Pulse rate set flag */
t_tatsuoka 1:90f70c146a26 100 bool _sync_flag; /* Pulse sync sign flag */
t_tatsuoka 0:18d735a66926 101
t_tatsuoka 0:18d735a66926 102 /* Member functions */
t_tatsuoka 0:18d735a66926 103 void init();
t_tatsuoka 0:18d735a66926 104 void interval_timer();
t_tatsuoka 0:18d735a66926 105 int32_t hpf(int32_t val);
t_tatsuoka 0:18d735a66926 106 bool detect_peak(int32_t val);
t_tatsuoka 0:18d735a66926 107 void calc_pr();
t_tatsuoka 0:18d735a66926 108 };
t_tatsuoka 0:18d735a66926 109 #endif /* INC_PulseRate */