这个例子详细介绍了使用短时间傅里叶变换和双向长短期记忆(BiLSTM)网络对心电图(ECG)信号进行波形分割的工作流程。该示例还提供了如何生成和部署代码和训练过的BiLSTM网络的信息,用于在树莓Pi™目标(基于ARM®的设备)上进行分割。
示例中的预训练网络类似于基于深度学习的波形分割(信号处理工具箱)的例子。
这个例子的细节:
基于处理器在环(PIL)的工作流,以验证生成的代码部署和运行在MATLAB™的树莓派上
生成独立的可执行文件
PIL验证过程是设计周期的一个关键部分,在部署独立的可执行文件之前检查生成代码的行为是否与设计相匹配。
本例使用了来自公开可用的QT数据库的心电图信号[1] [2].这些数据包括大约15分钟的有标记的心电图记录,抽样频率为250赫兹,共测量了105名患者。
心电信号可分为以下拍形态[3.]:
P波- QRS复合体前的小偏转,代表心房去极化
QRS复波-心跳的最大振幅部分
T波- QRS复合体后的小偏转,代表心室复极
心电波形的这些区域的分割可以为评估人类心脏整体健康状况和是否存在异常提供依据。
支持NEON扩展的ARM处理器金宝app
ARM计算库(在目标ARM硬件上)
MATLAB®编码器™
嵌入式编码器™
深度学习工具箱™
有关库受金宝app支持的版本以及有关设置环境变量的信息,请参见深度学习与MATLAB编码器的先决条件(MATLAB编码器)(MATLAB编码器)。
生成的可执行文件中的核心函数:
使用15000例单精度心电数据作为输入。
计算信号的短时傅里叶变换。
使输出标准化和规范化。
使用预先训练的BiLSTM网络标记信号区域。
生成带有标签的输出文件。
waveformSegmentation
函数一个入口点函数,又称顶级或主函数,是为代码生成而定义的函数。您必须定义一个入口点函数,该函数调用支持代码生成的函数,并从入口点函数生成C/ c++代码。入口点函数中的所有函数必须支持代码生成。金宝app
在这个例子中,waveformSegmentation
为入口点函数。将心电信号作为输入,传递给训练好的BiLSTM网络进行预测。的performPreprocessing
函数对原始信号进行预处理,并进行短时傅里叶变换。的genClassifiedResults
函数将预处理后的信号传递给网络进行预测,并显示分类结果。
类型waveformSegmentation
function out = waveformSegmentation(in) %#codegen persistent net;net = code . loaddeeplearningnetwork (' training -network- stftbilstm . net . net ');席”、“净”);end preprocesedsignal = performPreprocessing(in);=细胞(3,1);for index = 1:3 out{index,1} = genClassifedResults(net.predict(preprocesedsignal {1, index}));结束结束
使用MATLAB支持包的树莓派金宝app函数,raspi
,创建与树莓派的连接。在以下代码中,替换:
“raspiname”
你的树莓派的名字
“π”
和你的用户名
“密码”
用你的密码
r = raspi (“raspiname”,“π”,“密码”);
该示例展示了验证代码和设计,然后创建和部署独立可执行文件的基于pil的工作流。另外,如果您想直接部署独立的可执行文件,您可以跳过PIL执行,转而创建独立的执行。
第一步显示了一个基于pil的工作流来为waveformSegmentation
函数。
为静态库创建代码配置对象,并将验证模式设置为“公益诉讼”
.设置目标语言为“c++”
.
cfg = coder.config (“自由”,“是”,真正的);cfg。VerificationMode =“公益诉讼”;cfg。TargetLang =“c++”;
创建一个编码器。ARMNEONConfig
对象。指定ARM计算库的版本为Raspberry Pi上的版本。指定树莓派的架构。(本例需要ARM计算库v19.05)。
dlcfg =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmComputeVersion =“19.05”;dlcfg。ArmArchitecture =v7的;
设置DeepLearningConfig
属性将代码生成配置对象转换为深度学习配置对象。在代码生成中使用MATLAB源代码注释设置配置对象。
cfg。DeepLearningConfig = dlcfg;cfg。MATLABSourceComments = 1;
创建一个编码器。硬件
对象,并将其附加到代码生成配置对象。
hw = coder.hardware (“树莓π”);cfg。硬件= hw;
在树莓派上指定构建文件夹。
cfg.Hardware.BuildDir =“~ / waveformSegmentation”;
codegen
函数使用codegen
函数生成c++代码。当codegen
与MATLAB的树莓派硬件支持包一起使用金宝app,生成的代码下载到板上并在那里编译。生成PIL MEX函数,用于MATLAB与运行在树莓派上的生成代码之间的通信。
确保设置了环境变量ARM_COMPUTELIB
和LD_LIBRARY_PATH
在树莓派上。看到深度学习与MATLAB编码器的先决条件(MATLAB编码器)(MATLAB编码器)。
codegen配置cfgwaveformSegmentationarg游戏{coder.typeof(单((15000)),[15000],[0])}报告
###目标设备没有本机通信支持。金宝app检查连接配置注册…部署代码。这可能需要几分钟。###目标设备没有本机通信支持。金宝app检查连接配置注册…# # #连接配置功能“waveformSegmentation”:“树莓π”生成的精灵的位置:/home/pi/waveformSegmentation / MATLAB_ws R2020b / C /用户/ eshashah / OneDrive_ -_MathWorks /文件/ MATLAB /例子/ deeplearning_shared-ex28372959 codegen / lib / waveformSegmentation /公益诉讼成功代码生成:查看报告
加载MAT-fileecgsignal_test
.该文件存储了一个ECG信号样本,您可以在该样本上测试生成的代码。
运行生成的waveformSegmentation_pil
测试信号上的MEX功能。
负载ecgsignal_test.mat;= waveformSegmentation_pil(测试);
###启动应用程序:'codegen\lib\waveformSegmentation\pil\waveformSegmentation。###启动应用程序waveformSegmentation.elf…
显示带有预测标签的信号。
标签=分类(从{1}(2000:3000));msk = signalMask(标签);2000:3000 plotsigroi (msk、测试(1))标题(“预测标签”)
在验证PIL MEX函数的输出之后,可以为waveformSegmentation
函数。
接下来的部分展示了代码生成工作流,使用MATLAB Coder应用程序在代码中创建一个生成并部署一个独立的可执行程序,用于在树莓派上进行预测。
的MATLAB编码器app从MATLAB®代码生成C或c++代码。基于工作流的用户界面引导您完成代码生成过程。以下步骤描述了使用MATLAB Coder应用程序的简短工作流MATLAB编码器(MATLAB编码器)和使用MATLAB Coder App生成C代码(MATLAB编码器).
在应用程序选项卡,单击工具条最右边的向下箭头以扩展应用程序库。下代码生成,点击MATLAB编码器.应用程序打开选择源文件页面。输入或选择入口点函数的名称,waveformSegmentation
.
点击下一个去…定义输入类型页面。
1.选择让我直接输入输入类型或全局类型并设置输入的值在
成一个(1 x15000)
.
2.点击下一个去…生成代码的一步。跳过检查运行时问题步骤,因为使用ARM计算库生成代码时不支持MEX生成。金宝app
1.在生成代码对话框中设置值:
集构建类型来可执行文件(. exe)
集语言来c++
集硬件板作为覆盆子π
2.单击更多的设置按钮:
在自定义代码窗格中,在其他源文件中,浏览并选择ecgsegmentation_main.cpp
.有关编写C/ c++主函数的更多信息,请参阅结构生成的例子C/ c++主函数(MATLAB编码器).
在硬件窗格中,设置用户名和密码树莓派的董事会
在深度学习窗格中,设置目标库来臂计算
.指定ARM计算库版本和ARM计算架构.
3.关闭Settings窗口并生成代码。
4.点击下一个去…完成工作流程页面。
一旦代码生成完成,下面几行代码将在树莓派上测试生成的代码,将输入的ECG信号复制到生成的代码目录中。您可以手动或使用raspi.utils.getRemoteBuildDirectory
API。方法生成的二进制文件的目录codegen
函数。假设二进制文件只在一个目录中找到,输入:
applicationDirPaths =…
raspi.utils.getRemoteBuildDirectory(“applicationName”、“waveformSegmentation”);
targetDirPath = applicationDirPaths {1} .directory;
要复制运行可执行程序所需的文件,请使用putFile
,它可与MATLAB支持包的树莓派硬件。金宝app的input.csv
文件包含用于测试部署代码的ECG信号示例。
r.putFile (input.csv, targetDirPath);
输入= dlmread(“input.csv”);
在MATLAB的树莓派上运行可执行程序,并将输出文件获取到MATLAB。输入文件名应该作为可执行文件的命令行参数传递。
exeName =“waveformSegmentation.elf”;%可执行文件的名字
命令= ['cd ' targetDirPath ';/ ' exeName];
系统(r,命令)
outputPath = strcat (targetDirPath, / * . txt);
getFile (r, outputPath)
显示带有预测标签的信号。输出如图所示。
加载ecgsignal_test.mat;
标签=分类(textread (' out.txt ', ' % s ') ');
msk = signalMask(标签(1,2000:3000));
2000:3000 plotsigroi (msk、测试(1))
标题(“预测标签”)
McSharry, Patrick E.等。"产生合成心电图信号的动力学模型"生物医学工程学报。第50卷第3期,2003年,289-294页。
[2]拉古纳,巴勃罗,雷蒙Jané,还有佩雷·卡米纳尔。多导联心电图信号的波边界自动检测:CSE数据库验证计算机和生物医学研究。第27卷,第1期,1994年,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:复杂生理信号新研究资源的组成部分”循环。Vol. 21, No. 2, 2000, pp. e215-e220。(循环电子页;http://circ.ahajournals.org/content/101/23/e215.full].
codegen
(MATLAB编码器)|fsst
(信号处理工具箱)|signalMask
(信号处理工具箱)