由 Edge Impulse 提供支持的心电图分析仪
组件和用品
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
必要的工具和机器
![]() |
| |||
![]() |
| |||
![]() |
|
应用和在线服务
![]() |
| |||
![]() |
| |||
![]() |
| |||
![]() |
|
关于这个项目
突发心脏病和死亡人数增加:越来越受到关注
过去十年,突发心脏病死亡人数大幅增加。
尤其是像印度这样的发展中国家,除了基因和生活方式之外,农村地区缺乏医疗资源是导致心脏病死亡的主要原因。

解决这一全球性问题的技术贡献:
我研究了一个由 Edge Impulse 提供支持的 TinyML 应用程序,以开发一个迷你诊断心电图分析仪设备,它可以放在口袋里,它可以在没有云连接的情况下独立诊断心脏病。
目前市场上的心电图分析仪及其特点
•当前物联网医疗设备向移动/服务器发送批量心电图数据,并在高级处理器/移动应用程序中进行分析
•基于计算机的应用程序,从心电图设备接收信号并分析心电图模式
•所有心电图分析设备都依赖于互联网或高处理能力的计算机/移动应用程序。
所以这可以总结在下面的图表中;

关键解决方案
•由Edge Impulse 驱动的ECG Analyzer 将分析ECG 数据,不依赖于互联网。
•与物联网设备相比,延迟最低
• 15Kb Rom - ECG Analyzing TinyML 模型可以在任何支持 TinyML 的微控制器上运行。
•设备将分析心电图模式并分类为正常、心房颤动和一级心脏传导阻滞
架构
心电分析仪涉及
1.使用 AD8232 读取心电图
2.模拟不同的心脏病心电图模式
3. 生成高质量数据集的新方法
4. 训练模型
5. 模型测试准确性和 整合 已部署的应用程序代码 图书馆

了解心电图
在进行技术工作之前,首先要了解心电图的一些基础知识。
心电图分为5个波——P、Q、R、S和T波。

房颤

一级心脏阻滞

让我们构建心电图分析仪
1.使用AD8232读取心电图
按照以下连接图将心电图传感器 AD8232 连接到 Arduino Nano 33 BLE 传感器。
闪烁下面的代码,然后按“Ctrl+Shift+L”来可视化图形流数据。
void setup() {
// 初始化串口通信:
Serial.begin(115200);
pinMode(2, INPUT); // 设置引线脱落检测 LO +
pinMode(3, INPUT); // 设置引线脱落检测 LO -
}
void loop() {
if((digitalRead(2) ==1) ||(digitalRead(3) ==1)){
Serial.println('!');
}
else{
// 发送值模拟输入0的:
Serial.println(analogRead(A0));
}
//稍等片刻,防止串行数据饱和
delay(5);
}
1.1 心电电极的放置
ECG 电极如上图所示放置在 RA、LA 和 LL 中,并将插孔连接到 ECG Analyzer 上的 AD8232 传感器。

2.使用Matlab-signal builder模拟不同的ECG模式
步骤 2.1 :将正常心电数据保存在Excel中
首先将串口监视器数据复制并保存到excel文件中,如下模板。 ECG 值应在“Y”下的第二列中。第一列是时间序列。它应该增加为 ( * 0.005) 5ms。

步骤 2.2 :Matlab 中的信号生成器
在 Matlab 中创建一个新的 Simulink 模型

然后在工作区中输入“信号生成器”并选择它。同时插入
将其连接到信号生成器的“范围”。请参考以下截图。


要加载保存的 Excel 数据,请打开信号生成器并选择“从文件导入”选项。

请选择上述选项以导入数据。

然后确认选择并导入而不保存模型。因为我们需要更多的步骤。
2.3 : 信号生成器中的 ECG 数据可视化
A 60 秒 ECG 数据在信号生成器视图中将如下所示,对于手动编辑,请将其缩放 5 秒数据并执行“拖动” 编辑心电波形。


缩放后,当您将鼠标指针靠近心电波形时,您可以根据应用要求选择心电中的任意点并拖动。

2.4 :在信号生成器中为 AV Block 1 Case 编辑 P-R 间隔数据
我 手动拖下 P 波,将 P 波移动到 R 波之前,使 P-R 间隔超过 200 毫秒。
在信号生成器数据的不同时间线中重复此步骤。

编辑完成后,将数据导出到mat文件中。您可以在信号生成器中找到此选项。保存 mat 文件后,请按照以下步骤操作。

操作步骤-->先双击mat文件,双击1x1 Dataset-->在Data:1下就可以看到修改后的数据了。
将数据复制并粘贴到新的 Excel 文件中。
Step2.5 :将excel数据导出到Array
我 已经写了一个可以把excel数据转成数组的a.m脚本。
在 Matlab 中运行此脚本,在运行之前将 ExcelFilename 替换为您本地保存的文件名,并将 ExcelSheetName 替换为相应的工作表名称。
data=xlsread('ExcelFilename.xlsx','ExcelSheetName');
ECGExtract=(data(1:end,1)); %%A 列数据
fid=fopen('test.txt','wt');%opening 与 t 标志在 Windows 上自动转换 \n 到 \r\n
fprintf(fid,'{');
FormatSpec=[repmat('%i ',1,size(ECGExtract,2)) ','];%或者应该是\r\n吗?
fprintf(fid,FormatSpec, ECGExtract);
fprintf(fid,'}')
fclose(fid);
将在当前目录位置生成文本文件。

复制数组内容,粘贴到模拟房颤和一级心脏传导阻滞的ECGAnalyzer.c代码中。

3. 生成高质量数据集的新方法
如果你看心电图数据,在较短的窗口时间(例如:3秒)内很难区分不同心脏状况的心电图数据和正常的心电图数据

当我单独使用过滤的 ECG 数据训练心房颤动、正常和一级心脏传导阻滞的模型时,准确度小于 23%。 原因是在较短的窗口中,模型无法区分差异。
如果我选择更长的窗口时间,处理时间和峰值 RAM 使用量会增加很多。即使没有准确性。
新颖方法的背景:
什么时候 医生或训练有素的人尝试分析心电图,他们会计算R到R波、P到R间期之间的小方块,并在图中记下计数或记忆以进行计算。

我从过滤后的 ECG 数据中创建了一个单独的波形。
新波形:
- R-R 间隔
- 公关间隔


为正常心电图生成的数据集 数据:

解码后的 R-R 间期和 PR 间期数据对于正常 ECG 数据始终为 100 和 50。
为心房颤动生成的数据集 - ECG 数据:

任何时候 以前的 R-R 间期和现在的 R-R 间期有偏差,R-R 间期 数据将下降到 -100 一个循环。
一级心脏传导阻滞心电图生成数据集 数据:

任何时候 P到R间隔超过200ms,那么PR间隔数据会下降到-50 一个循环。
这种方法将我的模型准确率提高到 超过 90%。
4. 在 Edge Impulse 中训练模型
在进入Edge Impulse训练ML之前,我们需要在库文件中配置一些参数,用于模拟和实时ECG传感器读取。
step4.1 :将 SIMULATION 设置为 0,如果数据采集来自实时 ECG 传感器读数
或
将 SIMULATION 配置为 1,如果数据采集来自心房颤动和一级心脏传导阻滞的模拟 ECG 数据(遵循 Matlab 会话)。

Step4.2 :注释/取消注释所需数据 模拟缓冲区

步骤4.3 :数据获取
收集三种不同标签下的心电图数据:正常、心房颤动和一级心脏传导阻滞

https://docs.edgeimpulse.com/docs/arduino-nano-33-ble-sense

并选择频率为202
$ edge-impulse-daemon --frequency 202
Step4.4 :创建冲动
在 创建脉冲段,窗口大小为3000ms,窗口增加为2999ms,选择k-means异常检测

步骤 4.5:光谱特征
在 一个光谱特征,选择过滤器类型为无。

步骤 4.6:NN 分类器:
我 已经设置了 40 个训练周期和学习率为 0.005。我的准确率为 92.9。

对于异常检测,我选择了PR间期RMS和RR间期RMS。
5. 模型测试的准确性和集成性
在模型测试准确率中,它的准确率约为 97%。

5.1 部署:
选择 Arduino 作为部署;

将下载的EI部署文件添加到Arduino库中

注意: 将 GitHub 链接中的 ECG_Analyzer 库也添加到 Arduino 库中
这有助于集成我的心电解码算法代码以与 EI 生成模型集成。
5.2 将应用程序代码集成到核心生成的 EI 代码中
我 已将应用程序代码合并到 EI 部署中“nano_ble33_sense_accelerometer_continuous "并将其保存为 ECGAnalyzer.ino。
它可以在附加的 GitHub 链接中找到。烧写设备中ECG_Analyzer.c中SIMULATION为0的代码。

硬件:
按照fritzing图连接:


组装 :


最终产品:
这里是最终产品和测试数据中的准确度!!!


学分:
心电图:https://geekymedics.com/how-to-read-an-ecg/
代码
https://github.com/Manivannan-maker/ECGAnalyzer
将 ECGAnalyzer.zipCode 解压到 Flash:EI_Deployed_Library\examples\ECGAnalyzer\ECGAnalyzer.inoLibrary to Edit simulation :ECGAnalyzer_lib\ecg_analyzer.cMatlab script and signalbuilder model:script to run in matlab --> Matlab_Simulation\Excel2Arrayconverter.mlabS signalbuilder.slxhttps://github.com/Manivannan-maker/ECGAnalyzer示意图
按图连接 ecgdefault_SjMMcgW8jY.fzz
制造工艺