这个例子详细介绍了使用短时间傅里叶变换和双向长短期记忆(BiLSTM)网络对心电图(ECG)信号进行波形分割的工作流程。该示例还提供了如何生成和部署代码和训练过的BiLSTM网络的信息,用于在树莓Pi™目标(基于ARM®的设备)上进行分割。
该示例中的预磨平网络类似于基于深度学习的波形分割实例
此示例详细信息:
基于循环中处理器(PIL)的工作流,用于验证在MATLAB的Raspberry Pi上部署和运行的生成代码™
生成独立的可执行文件
PIL验证过程是设计周期的关键部分,以检查生成代码的行为是否在部署独立可执行文件之前与设计匹配。
本例使用了来自公开可用的QT数据库的心电图信号[1] [2]。该数据由大约15分钟的标记的ECG录制组成,采样率为250 Hz,从总共105名患者中测量。
心电信号可分为以下拍形态[3.]:
P波- QRS复合体前的小偏转,代表心房去极化
QRS复波-心跳的最大振幅部分
T波-代表心室复极的QRS波群后的小偏转
ECG波形的这些区域的分割可以为评估人类心脏整体健康和异常存在的测量提供基础。
支持霓虹灯扩展的ARM处理器万博1manbetx
ARM Compute库(目标臂硬件上)
MATLAB®Coder™
嵌入式编码器™
深度学习工具箱™
有关库受万博1manbetx支持的版本以及有关设置环境变量的信息,请参见使用MATLAB编码器进行深入学习的先决条件(MATLAB编码器)(Matlab编码器)。
生成的可执行文件中的核心函数:
使用15,000个单精度ECG数据样本作为输入。
计算信号的短时傅里叶变换。
标准化和规范化输出。
使用预磨损的Bilstm网络标记信号的区域。
使用标签生成输出文件。
波形段
功能一个入口点函数,又称顶级或者主要的,重要的函数,是您为代码生成定义的函数。您必须定义一个入门点函数,调用启用代码生成的函数,并从入口点函数生成C / C ++代码。入口点函数中的所有功能必须支持代码生成。万博1manbetx
在这个例子中,waveformSegmentation
是入口点函数。它需要一个ECG信号作为输入,并将其传递给培训的Bilstm网络以进行预测。的执行备p.
函数对原始信号进行预处理并应用短时傅里叶变换genClassifiedResults
函数将预处理后的信号传递给网络进行预测,并显示分类结果。
类型波形段
函数out=waveformSegmentation(in)%#codegen persistent net;if isempty(net)net=coder.loadDeepLearningNetwork('trained-network-STFTBILSTM.mat','net');end preprocessedSignal=performPreprocessing(in);out=cell(3,1);对于indx=1:3 out{indx,1}=genClassifedResults(net.predict(predict(predicted信号{1,indx}));end-end
使用MATLAB支持包的树莓派万博1manbetx函数,拉斯皮
,以创建与Raspberry Pi的连接。在以下代码中,替换:
'raspiname'
用你的树莓皮的名字
“圆周率”
和你的用户名
“密码”
使用您的密码
r = raspi ('raspiname',“圆周率”,“密码”);
该示例显示了用于验证代码和设计的基于PIL的工作流,然后创建并部署一个独立的可执行文件。或者,如果要直接部署独立可执行文件,可以跳过PIL执行并转到创建独立执行。
第一步显示了一个基于pil的工作流来为波形段
函数。
为静态库创建代码配置对象,并将验证模式设置为“比尔”
。将目标语言设置为'c ++'
.
cfg = coder.config (“自由”,'ecoder',真的);cfg.verificationMode =.“比尔”;cfg.targetlang ='c ++';
创建一个Coder.armneonConfig
目的。指定ARM Compute库的版本作为Raspberry Pi上的版本。指定Raspberry PI的体系结构。(此示例需要ARM Compute Library v19.05)。
dlcfg=coder.DeepLearningConfig('arm-compute');dlcfg.armcomputeversion =.“19.05”;dlcfg.armarchitecture =“armv7”;
设定深度学习配置
将代码生成配置对象的属性设置为深度学习配置对象。使用代码生成中可见的MATLAB源代码注释设置配置对象。
cfg.deeplearningconfig = dlcfg;cfg.matlabsourcecomments = 1;
创建一个编码器。硬件
raspberry pi对象并将其附加到代码生成配置对象。
hw = coder.hardware (“树莓π”);cfg.hardware = hw;
在raspberry pi上指定构建文件夹。
cfg.Hardware.BuildDir ='〜/波形';
Codegen.
功能使用Codegen.
函数生成C++代码。Codegen.
与Raspberry Pi硬件的MATL万博1manbetxAB支持包一起使用,生成的代码下载到板上并在板上编译。生成一个PIL MEX函数以在MATLAB和Raspberry Pi上运行的生成代码之间进行通信。
确保设置环境变量ARM_Comptelib.
和LD_LIBRARY_PATH
在覆盆子pi上。看使用MATLAB编码器进行深入学习的先决条件(MATLAB编码器)(Matlab编码器)。
Codegen.-Config.cfg波形段arg游戏{coder.typeof(单个(一个(115000)),[115000],[0,0])}-报告
###目标设备没有本机通信支持。万博1manbetx检查连接配置注册…部署代码。这可能需要几分钟。###目标设备没有本机通信支持。万博1manbetx检查连接配置注册…# # #连接配置功能“waveformSegmentation”:“树莓π”生成的精灵的位置:/home/pi/waveformSegmentation / MATLAB_ws R2020b / C /用户/ eshashah / OneDrive_ -_MathWorks /文件/ MATLAB /例子/ deeplearning_shared-ex28372959 codegen / lib / waveformSegmentation /公益诉讼成功代码生成:查看报告
加载MAT-fileEcgsignal_test.
.该文件存储可以在其中测试生成的代码的示例ECG信号。
运行生成waveformsement_pil.
MEX在测试信号上的功能。
负载ecgsignal_test.mat; out=波形分段\u pil(测试);
###启动应用程序:'codegen \ lib \ waveformseation \ pil \ waveformstodation.elf'终止执行:clear waveformseation_pil ###启动应用程序waveformstonation.elf ...
显示带有预测标签的信号。
标签=分类(从{1}(2000:3000));msk = signalMask(标签);2000:3000 plotsigroi (msk、测试(1))标题('预测标签')
验证PIL MEX功能的输出后,您可以为其创建独立的可执行文件波形段
函数。
下一部分将展示代码生成工作流,该工作流使用MATLAB Coder应用程序在代码中创建、生成和部署独立的可执行文件,以便在Raspberry Pi上进行预测。
的Matlab编码器应用程序从Matlab®代码生成C或C++代码。基于工作流的用户界面使您通过代码生成过程。下面的步骤使用MATLAB编码器应用程序描述一个简短的工作流。Matlab编码器(MATLAB编码器)和使用MATLAB Coder App生成C代码(MATLAB编码器).
在这一点应用选项卡,单击工具条最右边的向下箭头以扩展应用程序库。下代码生成点击Matlab编码器.该应用程序打开了选择源文件第页。输入或选择入口点函数的名称,波形段
.
点击下一个去定义输入类型页面。
1.选择让我直接输入输入类型或全局类型并设置输入的值在
成一个(1x15000)
.
2.点击下一个去生成代码步。跳过检查运行时问题步骤,因为ARM计算库的代码生成不支持MEX生成。万博1manbetx
1.在“生成代码”对话框中设置值:
集构建类型到可执行文件(.exe)
集语言到c++
集硬件板作为覆盆子π
2.点击更多的设置按钮:
在里面自定义代码窗格中的其他源文件中,浏览并选择Ecgsegation_main.cpp.
.有关编写C / C ++主要功能的更多信息,请参阅结构生成的例子C/ c++主函数(MATLAB编码器).
在里面硬件窗格中,设置用户名和密码对于覆盆子PI板。
在里面深度学习窗格中,设置目标库到臂计算
.指定ARM计算库版本和ARM计算架构.
3.关闭“设置”窗口并生成代码。
4.点击下一个去完成工作流程页面。
一旦代码生成完成,下面几行代码将在树莓派上测试生成的代码,将输入的ECG信号复制到生成的代码目录中。您可以手动或使用raspi.utils.getRemoteBuildDirectory
API。方法生成的二进制文件的目录Codegen.
函数。假设二进制文件只在一个目录中找到,输入:
applicationDirPaths =…
Raspi.utils.getRemoteBuildDirectory('ApplicationName','WaveformSegation');
targetDirPath = applicationDirPaths {1} .directory;
要复制运行可执行程序所需的文件,请使用putFile
,它可与MATLAB支持包的树莓派硬件。万博1manbetx的input.csv
文件包含用于测试已部署代码的示例ECG信号。
r.putfile('input.csv',targetdirpath);
input=dlmread('input.csv');
从MATLAB运行raspberry pi上的可执行程序,并将输出文件获取到matlab。输入文件名应作为可执行文件命令行参数传递。
exeName =“waveformSegmentation.elf”;%可执行文件的名字
命令=['cd'targetDirPath';./'exeName];
系统(R,命令)
OutputPath = strcat(targetdirpath,'/ *。txt');
getFile (r, outputPath)
显示带有预测标签的信号。输出如图所示。
加载ecgsignal_test.mat;
标签=分类(textread (' out.txt ', ' % s ') ');
msk=信号屏蔽(标签(12000:3000));
Plotsigroi(MSK,测试(1,2000:3000))
标题(“预测标签”)
[1] McSharry,Patrick E.等。“一种用于产生合成心电图信号的动态模型。”IEEE®生物医学工程学报。第50卷第3期,2003年,289-294页。
[2] Laguna,Pablo,RaimonJané和Pere Cauninal。“自动检测多地ECG信号中的波边界:使用CSE数据库验证。”计算机和生物医学研究。卷。27,1994年第1款,第45-60页。
Goldberger, Ary L., Luis A. N. Amaral, Leon Glass, Jeffery M. Hausdorff, Plamen Ch. Ivanov, Roger G. Mark, Joseph E. miietus, George B. Moody, Chung-Kang Peng,和H. Eugene Stanley。“PhysioBank, PhysioToolkit和PhysioNet:复杂生理信号新研究资源的组成部分”循环。第101卷,第23期,2000年,第e215-e220页。[发行电子版;http://circ.ahajournals.org/content/101/23/e215.full.]。
Codegen.
(MATLAB编码器)|fsst
|signermask.