|
|
@ -8,38 +8,52 @@ |
|
|
|
|
|
|
|
#define REPORT_MEDIAN_WINDOWS_SIZE 151 // 必须是奇数 |
|
|
|
|
|
|
|
LPFilterExt_t m_lp_filter; |
|
|
|
HPFilterExt_t m_hp_filter; |
|
|
|
NOTCHFilterExt_t m_notch_filter; |
|
|
|
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]; |
|
|
|
SmoothingFilter_t m_report_smoothing_filter; |
|
|
|
|
|
|
|
int32_t m_data_statistics_buf[STATISTICS_BUF_SIZE]; // 心率判断 |
|
|
|
zdata_statistics_t m_data_statistics; |
|
|
|
static float m_data_fifo[REPORT_MEDIAN_WINDOWS_SIZE / 2]; |
|
|
|
fix_delay_fifo_t m_fix_delay_fifo; |
|
|
|
|
|
|
|
SmoothingFilter_t m_report_smoothing_filter; |
|
|
|
|
|
|
|
int32_t m_data_statistics_buf[STATISTICS_BUF_SIZE]; |
|
|
|
zdata_statistics_t m_leadoff_statistics; // 脱落检测 |
|
|
|
|
|
|
|
int32_t reportdata; |
|
|
|
bool m_leadoff; |
|
|
|
bool m_leadoff; |
|
|
|
|
|
|
|
static int32_t m_frame_cnt; |
|
|
|
|
|
|
|
void ecg_algo_init() { ecg_algo_reset(); } |
|
|
|
|
|
|
|
void report_data_process(int32_t indata) { |
|
|
|
m_frame_cnt++; |
|
|
|
float data = indata; |
|
|
|
data = HPFilterExt_update(&m_hp_filter, data); // 高通 |
|
|
|
data = LPFilterExt_update(&m_lp_filter, data); // 低通 |
|
|
|
data = NOTCHFilterExt_update(&m_notch_filter, data); // 带阻 |
|
|
|
|
|
|
|
int medianValue = MEDIANFILTER_Insert(&report_medianFilter, data); |
|
|
|
data = indata - medianValue; |
|
|
|
data = SmoothingFilter_Update(&m_report_smoothing_filter, data); |
|
|
|
reportdata = data; |
|
|
|
float medianValue = MEDIANFILTER_Insert(&report_medianFilter, data); |
|
|
|
float delay_data = fix_delay_fifo_update(&m_fix_delay_fifo, data); |
|
|
|
|
|
|
|
if (m_frame_cnt < REPORT_MEDIAN_WINDOWS_SIZE) { |
|
|
|
reportdata = 0; |
|
|
|
return; |
|
|
|
} |
|
|
|
data = delay_data - medianValue; |
|
|
|
data = SmoothingFilter_Update(&m_report_smoothing_filter, data); |
|
|
|
reportdata = data; |
|
|
|
} |
|
|
|
|
|
|
|
void leadoff_data_process(int32_t indata) { |
|
|
|
zdata_statistics_push(&m_data_statistics, indata); |
|
|
|
if (zdata_statistics_is_full(&m_data_statistics)) { |
|
|
|
int32_t max = zdata_statistics_get_max(&m_data_statistics); |
|
|
|
int32_t min = zdata_statistics_get_min(&m_data_statistics); |
|
|
|
zdata_statistics_push(&m_leadoff_statistics, indata); |
|
|
|
if (zdata_statistics_is_full(&m_leadoff_statistics)) { |
|
|
|
int32_t max = zdata_statistics_get_max(&m_leadoff_statistics); |
|
|
|
int32_t min = zdata_statistics_get_min(&m_leadoff_statistics); |
|
|
|
if (max - min > 45000) { |
|
|
|
m_leadoff = true; |
|
|
|
} else { |
|
|
@ -70,9 +84,13 @@ void ecg_algo_reset() { |
|
|
|
|
|
|
|
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); |
|
|
|
zdata_statistics_init(&m_leadoff_statistics, m_data_statistics_buf, STATISTICS_BUF_SIZE); |
|
|
|
|
|
|
|
fix_delay_fifo_init(&m_fix_delay_fifo, m_data_fifo, REPORT_MEDIAN_WINDOWS_SIZE / 2); |
|
|
|
|
|
|
|
zdata_statistics_clear(&m_leadoff_statistics); |
|
|
|
m_frame_cnt = 0; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t ecg_algo_get_report_data() { return reportdata; } |
|
|
|
bool ecg_algo_get_leadoff_state() { return m_leadoff; } |
|
|
|
bool ecg_algo_get_leadoff_state() { return m_leadoff; } |