2025-09-25 18:50:48 +08:00
|
|
|
|
#ifndef ECG_GENERATOR_H
|
|
|
|
|
|
#define ECG_GENERATOR_H
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2025-09-28 11:21:53 +08:00
|
|
|
|
// ECG导联类型
|
|
|
|
|
|
typedef enum {
|
|
|
|
|
|
ECG_LEAD_I = 0, // I导联:右手到左手
|
|
|
|
|
|
ECG_LEAD_II = 1, // II导联:右手到左腿
|
2025-09-29 09:35:45 +08:00
|
|
|
|
ECG_LEAD_III = 2, // III导联:左手到左腿
|
|
|
|
|
|
ECG_LEAD_V1 = 3, // V1导联:胸骨右缘第四肋间
|
|
|
|
|
|
ECG_LEAD_V2 = 4, // V2导联
|
|
|
|
|
|
ECG_LEAD_V3 = 5, // V3导联:过渡区
|
|
|
|
|
|
ECG_LEAD_V4 = 6, // V4导联:高R波
|
|
|
|
|
|
ECG_LEAD_V5 = 7, // V5导联
|
|
|
|
|
|
ECG_LEAD_V6 = 8 // V6导联
|
2025-09-28 11:21:53 +08:00
|
|
|
|
} ecg_lead_t;
|
|
|
|
|
|
|
2025-09-25 18:50:48 +08:00
|
|
|
|
// ECG生成器结构体
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
|
// 用户可调参数
|
|
|
|
|
|
float heart_rate; // 心率 (次/分)
|
|
|
|
|
|
float amplitude; // 幅值 (V)
|
2025-09-28 11:21:53 +08:00
|
|
|
|
ecg_lead_t lead; // 当前导联
|
2025-09-25 18:50:48 +08:00
|
|
|
|
|
|
|
|
|
|
// 内部状态
|
|
|
|
|
|
uint32_t sample_count; // 样本计数器
|
|
|
|
|
|
float sample_rate; // 采样率 (Hz)
|
|
|
|
|
|
bool is_running; // 是否正在运行
|
|
|
|
|
|
|
2025-09-28 11:21:53 +08:00
|
|
|
|
// 导联相关波形参数
|
2025-09-25 18:50:48 +08:00
|
|
|
|
float p_amp_ratio; // P波幅度比例
|
|
|
|
|
|
float q_amp_ratio; // Q波幅度比例
|
|
|
|
|
|
float r_amp_ratio; // R波幅度比例
|
|
|
|
|
|
float s_amp_ratio; // S波幅度比例
|
|
|
|
|
|
float t_amp_ratio; // T波幅度比例
|
2025-09-29 09:35:45 +08:00
|
|
|
|
bool p_bidirectional; // P波是否双向
|
2025-09-25 18:50:48 +08:00
|
|
|
|
|
|
|
|
|
|
// 固定时间参数 (保持正常ECG时序)
|
|
|
|
|
|
float p_width; // P波宽度
|
|
|
|
|
|
float qrs_width; // QRS波群宽度
|
|
|
|
|
|
float t_width; // T波宽度
|
2025-09-28 11:21:53 +08:00
|
|
|
|
|
|
|
|
|
|
// 预计算ECG查找表
|
|
|
|
|
|
float* ecg_lookup_table; // ECG查找表
|
|
|
|
|
|
uint32_t table_size; // 查找表大小
|
|
|
|
|
|
uint32_t table_index; // 当前索引
|
|
|
|
|
|
|
|
|
|
|
|
// 按比例重复采样
|
|
|
|
|
|
uint32_t ideal_table_size; // 理想表大小(理论周期点数)
|
|
|
|
|
|
uint32_t samples_per_point; // 每个表点对应的样本数
|
|
|
|
|
|
uint32_t sample_counter; // 当前表点的样本计数器
|
2025-09-25 18:50:48 +08:00
|
|
|
|
} ecg_generator_t;
|
|
|
|
|
|
|
|
|
|
|
|
// 函数声明
|
2025-09-28 11:21:53 +08:00
|
|
|
|
void ecg_generator_init(ecg_generator_t *generator, float sample_rate, ecg_lead_t lead);
|
2025-09-25 18:50:48 +08:00
|
|
|
|
void ecg_generator_set_heart_rate(ecg_generator_t *generator, float heart_rate);
|
|
|
|
|
|
void ecg_generator_set_amplitude(ecg_generator_t *generator, float amplitude_mv); // 直接输入mV值,内部自动转换
|
2025-09-28 11:21:53 +08:00
|
|
|
|
void ecg_generator_set_lead(ecg_generator_t *generator, ecg_lead_t lead); // 设置导联
|
2025-09-25 18:50:48 +08:00
|
|
|
|
void ecg_generator_start(ecg_generator_t *generator);
|
|
|
|
|
|
void ecg_generator_stop(ecg_generator_t *generator);
|
|
|
|
|
|
void ecg_generator_reset(ecg_generator_t *generator);
|
|
|
|
|
|
float ecg_generator_get_next_sample(ecg_generator_t *generator);
|
2025-09-28 11:21:53 +08:00
|
|
|
|
void ecg_generator_generate_lookup_table(ecg_generator_t *generator);
|
|
|
|
|
|
void ecg_generator_free_lookup_table(ecg_generator_t *generator);
|
|
|
|
|
|
void ecg_generator_cleanup(ecg_generator_t *generator);
|
2025-09-26 14:16:44 +08:00
|
|
|
|
void ecg_param_set(ecg_generator_t *generator, float amplitude_mv, float heart_rate);
|
2025-09-25 18:50:48 +08:00
|
|
|
|
|
2025-09-28 11:21:53 +08:00
|
|
|
|
// 内部函数声明
|
|
|
|
|
|
void ecg_generator_set_lead_parameters(ecg_generator_t *generator, ecg_lead_t lead);
|
|
|
|
|
|
float ecg_generator_calculate_sample_realtime(ecg_generator_t *generator);
|
|
|
|
|
|
|
2025-09-25 18:50:48 +08:00
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2025-09-28 11:21:53 +08:00
|
|
|
|
#endif // ECG_GENERATOR_H
|