|
|
@ -6,88 +6,52 @@ |
|
|
|
#include "algo/zsimple_qrs.h" |
|
|
|
#include "znordic.h" |
|
|
|
|
|
|
|
#define REPORT_MEDIAN_WINDOWS_SIZE 121 // 必须是奇数 |
|
|
|
|
|
|
|
LPFilterExt_t m_lp_filter; |
|
|
|
HPFilterExt_t m_hp_filter; |
|
|
|
NOTCHFilterExt_t m_notch_filter; |
|
|
|
|
|
|
|
SmoothingFilter_t m_report_smoothing_filter; |
|
|
|
median_filter_t m_display_median_filter; |
|
|
|
#define REPORT_MEDIAN_WINDOWS_SIZE 101 // 必须是奇数 |
|
|
|
|
|
|
|
LPFilterExt_t m_lp_filter; |
|
|
|
HPFilterExt_t m_hp_filter; |
|
|
|
NOTCHFilterExt_t m_notch_filter; |
|
|
|
static sMedianFilter_t report_medianFilter; |
|
|
|
static sMedianNode_t report_medianBuffer[REPORT_MEDIAN_WINDOWS_SIZE]; |
|
|
|
|
|
|
|
void BaselineDriftRemoval_Init(BaselineDriftRemoval_t *filter, int windows_size, bool enable); |
|
|
|
float BaselineDriftRemoval_Update(BaselineDriftRemoval_t *filter, float vin); |
|
|
|
SmoothingFilter_t m_report_smoothing_filter; |
|
|
|
|
|
|
|
int32_t m_data_statistics_buf[STATISTICS_BUF_SIZE]; // 心率判断 |
|
|
|
zdata_statistics_t m_data_statistics; |
|
|
|
zsimple_qrs_t m_qrs; |
|
|
|
|
|
|
|
int32_t reportdata; |
|
|
|
int32_t displaydata; |
|
|
|
|
|
|
|
void ecg_algo_init() { |
|
|
|
ecg_algo_reset(); |
|
|
|
|
|
|
|
zsimple_qrs_init(&m_qrs, SAMPLE_PERIOD_S); |
|
|
|
zdata_statistics_init(&m_data_statistics, m_data_statistics_buf, ZARRAY_SIZE(m_data_statistics_buf)); |
|
|
|
} |
|
|
|
int32_t maxval; |
|
|
|
int32_t minval; |
|
|
|
int32_t nowval100; |
|
|
|
|
|
|
|
static void display_data_processer(int32_t indata) { |
|
|
|
// float data = indata; |
|
|
|
void ecg_algo_init() { ecg_algo_reset(); } |
|
|
|
|
|
|
|
// data = BaselineDriftRemoval_Update(&m_display_drift_filter, data); // 基线漂移 |
|
|
|
// data = median_filter_update(&m_display_median_filter, data); |
|
|
|
|
|
|
|
// zdata_statistics_push(&m_data_statistics, data); |
|
|
|
// if (zdata_statistics_is_full(&m_data_statistics)) { |
|
|
|
// zsimple_qrs_process_data(&m_qrs, data, zdata_statistics_get_min(&m_data_statistics), zdata_statistics_get_max(&m_data_statistics), |
|
|
|
// zdata_statistics_get_avg(&m_data_statistics)); |
|
|
|
void report_data_process(int32_t indata) { |
|
|
|
float data = indata; |
|
|
|
data = HPFilterExt_update(&m_hp_filter, data); // 高通 |
|
|
|
data = LPFilterExt_update(&m_lp_filter, data); // 低通 |
|
|
|
data = NOTCHFilterExt_update(&m_notch_filter, data); // 带阻 |
|
|
|
|
|
|
|
// maxval = zdata_statistics_get_max(&m_data_statistics); |
|
|
|
// minval = zdata_statistics_get_min(&m_data_statistics); |
|
|
|
int medianValue = MEDIANFILTER_Insert(&report_medianFilter, data); |
|
|
|
data = indata - medianValue; |
|
|
|
data = SmoothingFilter_Update(&m_report_smoothing_filter, data); |
|
|
|
reportdata = data; |
|
|
|
} |
|
|
|
|
|
|
|
// int32_t nowvaloff = data - minval; |
|
|
|
// nowval100 = 10 + nowvaloff * 80 / (maxval - minval); |
|
|
|
// displaydata = nowval100; |
|
|
|
void leadoff_data_process(int32_t indata) { |
|
|
|
|
|
|
|
// } else { |
|
|
|
// maxval = 0; |
|
|
|
// minval = 0; |
|
|
|
// displaydata = 50; |
|
|
|
// } |
|
|
|
} |
|
|
|
zdata_statistics_push(&m_data_statistics, indata); |
|
|
|
|
|
|
|
static void report_data_processer(int32_t indata) { |
|
|
|
float data = indata; |
|
|
|
int medianValue = MEDIANFILTER_Insert(&report_medianFilter, data); |
|
|
|
data = indata - medianValue; |
|
|
|
// data = BaselineDriftRemoval_Update(&m_report_drift_filter, data); // 基线漂移 |
|
|
|
data = SmoothingFilter_Update(&m_report_smoothing_filter, data); |
|
|
|
|
|
|
|
reportdata = data; |
|
|
|
} |
|
|
|
|
|
|
|
void ecg_algo_process_data(int32_t indata) { |
|
|
|
float data = indata; |
|
|
|
data = HPFilterExt_update(&m_hp_filter, data); // 高通 |
|
|
|
data = LPFilterExt_update(&m_lp_filter, data); // 低通 |
|
|
|
data = NOTCHFilterExt_update(&m_notch_filter, data); // 带阻 |
|
|
|
// display_data_processer(data); |
|
|
|
report_data_processer(data); |
|
|
|
leadoff_data_process(indata); |
|
|
|
report_data_process(indata); |
|
|
|
} |
|
|
|
|
|
|
|
void ecg_algo_reset() { |
|
|
|
LPFilterExt_init(&m_lp_filter, 40, SAMPLE_PERIOD_S, 4, true); |
|
|
|
LPFilterExt_init(&m_lp_filter, 40, SAMPLE_PERIOD_S, 5, true); |
|
|
|
HPFilterExt_init(&m_hp_filter, 1, SAMPLE_PERIOD_S, 1, false); |
|
|
|
NOTCHFilterExt_init(&m_notch_filter, 125, 2, SAMPLE_PERIOD_S, 2, false); |
|
|
|
|
|
|
|
SmoothingFilter_Init(&m_report_smoothing_filter, 8, true); |
|
|
|
|
|
|
|
{ |
|
|
|
memset(&report_medianFilter, 0, sizeof(report_medianFilter)); |
|
|
|
memset(report_medianBuffer, 0, sizeof(report_medianBuffer)); |
|
|
@ -96,15 +60,12 @@ void ecg_algo_reset() { |
|
|
|
MEDIANFILTER_Init(&report_medianFilter); |
|
|
|
} |
|
|
|
|
|
|
|
median_filter_init(&m_display_median_filter, 5); |
|
|
|
SmoothingFilter_Init(&m_report_smoothing_filter, 8, true); |
|
|
|
|
|
|
|
zdata_statistics_init(&m_data_statistics, m_data_statistics_buf, STATISTICS_BUF_SIZE); |
|
|
|
zdata_statistics_clear(&m_data_statistics); |
|
|
|
zsimple_qrs_clear(); |
|
|
|
} |
|
|
|
|
|
|
|
int32_t ecg_algo_get_report_data() { return reportdata; } |
|
|
|
int32_t ecg_algo_get_display_data() { return displaydata; } |
|
|
|
int32_t ecg_algo_get_heart_rate() { return zsimple_qrs_get_heartrate(&m_qrs); } |
|
|
|
int32_t ecg_algo_get_max_data() { return maxval; } |
|
|
|
int32_t ecg_algo_get_min_data() { return minval; } |
|
|
|
int32_t ecg_algo_get_peak2peak() { return maxval - minval; } |
|
|
|
int32_t ecg_algo_get_heart_rate() { return 0; } |