Gabriele Bunkheila, MathWorks
越来越多的应用需要在时间序列和传感器数据上联合使用信号处理和机器学习技术。马铃薯®通过在单一环境中提供全方位的建模和设计能力,可以加速数据分析和传感器处理系统的开发。
在本次网络研讨会中,我们将展示一个分类系统的例子,该分类系统仅基于人类智能手机产生的加速度计信号,就能识别人体所从事的身体活动。
我们在MATLAB(包括数字过滤和频域分析)中引入公共信号处理方法,有助于提取来自原始波形的描述功能,并且我们显示了平行计算如何加速大数据集的处理。然后,我们讨论如何以编程和交互方式探索和测试不同的分类算法(例如决策树,支持矢量机器或神经网络)。金宝app
最后,我们演示了如何使用MATLAB中的自动C/C++代码生成来部署用于嵌入式传感器分析的流分类算法。
记录时间:2018年3月21日
欢迎来到本次网络研讨会上使用MATLAB信号处理和机器学习技术的传感器数据分析。我的名字是加布里埃尔Bunkheila,我的产品管理团队在这里MathWorks公司的一部分。我的背景是在信号处理,这也是我在那里度过大部分职业生涯在这里的区域,帮助工程科学家利用MATLAB自身的挑战。
在这个研讨会,我将要讨论的一些标准的MATLAB技术研究问题和产品设计工作流程,需要联合使用机器学习,例如,聚类或分类方法,对信号或时间序列,意为一个采样中的应用贬值随时间变化。
正如我们将看到的,这些问题的复杂性很大程度上源于对机器学习和信号处理领域知识的需求。这往往是一个挑战。无论您对信号处理、机器学习或两者都不熟悉,还是两者都不熟悉,我希望本课程将帮助您了解MATLAB如何大大加快这些问题的算法设计工作流程。
我们也看到在单一处理一起推动机器学习算法,到嵌入式设备和更接近实际信号的传感器越来越多的行业潮流。在这里,我指的是类的应用,传感器数据分析或嵌入式分析。因为这类产品的开发带来了额外的工程挑战,我想那会是有用的,在会议下载188bet金宝搏结束时分配一些时间来审查额外的支持,MATLAB提供这些类型的工作流程。金宝app
所以这里是我们看看的课程清单。我们将花费一段时间重新审视常见的信号处理方法如何应用于准备或预处理信号并提取描述性功能。我将展示如何在Matlab中选择,列车和测试分类或模式识别算法,包括一些简单的方法来扩大计算密集问题的性能。这样做会让我们有机会探索许多基本的MATLAB功能,从交互式应用程序到内部语言构造,为工作流启用和加速算法开发。
最后,我们将讨论一些MATLAB用于在线预测系统设计的功能,包括DSP功能的设计和仿真,以及预测算法生成源代码,使其在嵌入式架构上运行。
现在,我稍后将回到幻灯片。但我将花这一小时的大部分时间讨论一个运行MATLAB的实际示例。这里您看到的是使用智能手机捕获的加速度计信号的三个组件。这些信号是受试者戴着智能手机在身体上的固定位置进行不同的身体活动时产生的。我们正在运行一个算法,就好像它是在实时信号上运行的一样。但在本例中,我们使用带标签的记录数据进行验证。
所以我们了解真相。但我们也试图自动理解他们纯粹基于信号处理和机器学习方法的活动。正如您所看到的,我们大部分时间都成功地猜测了该活动。
现在我想提出一个简单的观点,这只是一个用加速度计数据行走的简单例子。但我将讨论的技术与广泛的应用以及大多数类型的采样信号或时间序列相关。
为了提出我的观点,我收集了一个简短的例子列表,我遇到了与Matlab用户一起使用,这主要说话,使用相同类型的技术。这些已经捕获了许多不同行业的用例,如电子,航空航天,防御,金融,汽车。同样,即使这也只是一个随机的例子列表。我们在这里讨论的技术的相关性更广泛。
在回到Matlab之前,我将利用最后一个幻灯片,以查看我们刚才看到的示例的不同部分。我们采用来自智能手机的样本加速的三个组成部分。我们预测了主体的身体活动,作为六种不同的选择或课程,走路,走楼梯,走下楼梯,坐着,站立和铺设。
通过分类算法进行预测。分类描述了一类流行的机器学习算法。关键思想是根据先前对类似数据的了解,猜测或预测新样本的类别,在本例中是信号缓冲区。其工作方式是,首先,使用大量已知或标记案例对算法进行训练,优化其自由参数,以尽可能准确地识别这些已知案例。
曾经接受过培训,它可以在未知的新数据上运行,以制定猜测或预测该新数据的最可能类。通常,训练阶段的数据具有更多数据和计算密集,而不是测试或运行时阶段。因此,对于嵌入式应用程序,在主机系统或计算机集群上运行训练阶段并不罕见,但仅将固定的预训练算法部署到嵌入式产品上。
无论训练或运行时使用,分类器都不太可能处理这样的原始波形。在实践中,对于每一个信号段或缓冲,一旦你有了一种提取一组有限的测量,通常称为特性,从原始波形,底线选择使用什么功能是他们应该捕获信号在同一类之间的相似之处和差异的不同。我们将用剩下的大部分时间来展示如何使用MATLAB来设计这两个大算法步骤,从最初的探索阶段开始。
现在,作为一个快速的笔记,完成一个类似的任务或项目的关键部分是参考数据集的可用性。这将是一组在受控实验中获得的信号记录,并仔细标记,以使信号已知并与正确的活动相关联。对于这个例子,我借用了来自西班牙和意大利的两个研究小组的数据集,可以在这张幻灯片的地址找到。
我希望这个问题现在已经很清楚了。回到MATLAB。在下面的文章中,我将假设您熟悉MATLAB的基础知识,包括脚本和函数以及基本的绘图和可视化。
要浏览此示例,我将使用由可以独立执行的许多代码单元格形成的脚本。我将跳过第一个单元格,我曾经在一开始就启动完成的应用程序。执行该单元的执行此内容加载我的数据集的一部分并绘制它。
让我们不要太在意,现在我是如何加载的数据或生产该地块。让我们来看看,我们有可用的数据。我们有一个载体,ACC,包含垂直加速度的样品在一段时间的受试者。数据集本身是三维加速度录音为30个不同的主题。加速度会以每秒50个样品采样。这是采样频率变量的含义,FS。我们也有时间向量,T,与相同长度的ACC,这是很好的。
T和ACC可以贴上另一个。并且情节向我们展示了这个主题,我们有大约8分钟的样品。知道这里的时间是经常间隔的。在某些应用中,可能不是案例或样本可能丢失。但请记住,MATLAB有足够的技术来规范和预处理这些类型的信号。
另一个明显需要注意的是另一个长向量,actid,activity ID的缩写,它告诉我们每个数据样本对应的活动是1到6之间的整数。我们可以通过查看其余变量acc标签来解释这些整数,因此1是步行,2是上楼,3是下楼,等等。
所以剧情这里看起来非常相似,我们的最终目标,这是确定给定信号的部分活动。但请记住,这是已知的,标签数据。我们只提供可视化信息。我们想要做的是设计出可以从这个信息学会猜测它的新数据,而以前的知识的方法。
我们怎么做呢?第一次尝试时,我们会尝试用直观的方法。例如,在这个图中,你已经看到加速度波形确实看起来不同,取决于活动。你可以看到几乎所有活动的平均值都在10左右,即g或9.8,而1更接近于0。你猜怎么着?这是因为物体与重力场的方向不同。
然后有三个看起来相当静止——毫不奇怪——坐着、站着和躺着,而其他三个似乎上下摆动得更多。我们可以从很简单的方法开始,对部分连续样本进行一些统计测量不管它们在时间上如何分布。
例如,看着行走的分布,分别铺设样品,人们可以看到,只是在比较的计算平均值的阈值,所以你看,5,在这里,会给我们制造之间的差异的一个很好的机会,他们俩。之间,也就是说,走路和站立时类似的考虑,但在这种情况下,我们可能要测量的标准差,它比较像每平方秒1米或2米。
但怎么样,如果我们已经制定出纯步行和上楼梯之间有什么区别?在这种情况下,平均值和标准偏差或分布的宽度看起来非常相似。在这里,你真的应该考虑什么是价值随着时间的推移,看看喜欢的东西,比方说,速率或振荡的形状如何变化一些更高级的分析。
一个直观的原因可能是,人们下楼时比上楼时移动更快,或者不同活动的移动类型不同。这正是信号处理方法开始成为画面的一部分的地方。
之前去那里,让我在传递我刚才做了一个点。我只是随便提出的三个直方图,迅速讨论它们的意义。即使只有这个任务可能是一个相当艰难的,如果你不得不手动从头做到这一点。但是,这些类型的东西都是在MATLAB作为单一功能可用。因此,尽管使用我的预编辑的功能,把那些两个地块的身影,给他们正确的颜色,里面直方图功能的单一呼叫正在为我所有的辛勤工作。
与旧的历史图相反的直方图被引入并发布于MATLAB的R 2014b。它为绘制直方图提供了一种新的、更有效的方法。
现在要随着时间的推移分析变化,我们希望专注于由身体运动引起的加速度。假设身体运动产生更快的变化是合理的,而重力贡献通常几乎是恒定的。如果我有两个贡献,它将共混成单个信号,我想将它们分开,那么通常适用的技术是数字滤波。
例如,在这种情况下,我们只想保持振荡速度快于每秒约一个周期,这是每秒平均步数的粗略数字,并丢弃振荡速度较慢的部分。使用正确的术语,这需要设计一个合适的高通滤波器并应用到我们的数据中。在整个过程中,我将重复这些想法。
现在设计和应用数字滤波器很困难,除非你有合适的工具。特别是设计阶段需要相当多的数学知识和许多特定领域的知识。在MATLAB中,有许多不同的方法可以用来设计数字滤波器。例如,可以选择完全以编程方式进行,这意味着只使用MatlabCommons或通过内置应用程序。
让我们先看看后者的样子。使用该应用程序通常是第一次接近问题时是一个很好的主意。为此,我转到MATLAB工具条的“应用”选项卡,我向下滚动到信号处理和通信应用程序组。在这里,我将选择过滤器设计和分析工具。对于更高级的过滤器设计,您可能还想尝试过滤器构建器应用程序。
过滤器设计和分析工具附带了几个部分。例如,此筛选器规范窗格将帮助我们向我们的过滤器指定正确的要求。在这里到左边,我们开始定义我们正在寻求实现的目标。在这种情况下,我将选择一个高通滤波器。但是你可以看到很多其他选择也是可能的。
在这里,有一个更专业的选择。如果你知道数字滤波器,你可能知道FIR和IR是什么意思。这里列出的设计方法可能会引起相当多的共鸣。在这里,我将跳过细节。我会从IAR选项中选择一个。移到右边,我需要做的就是使用上面的规范窗格捕获我的需求。
我不得不说的那些事包括我们使用的是抽样50赫兹的频率。我们希望保持不变;也就是说,我们希望通过1或0 dB的因素减弱。所有信号分量振荡不是每秒或1赫兹一次更迅速。我们可以大方的说,0.8赫兹。然后一切该另一值,FSTOP的左侧,由至少一个给定的分贝数衰减。我将这个ASTOP设置这个,比方说,0.4赫兹,并相应地,到了60分贝。这意味着,每秒所有振荡速度低于0.4倍将由过滤器可以做得更小1000倍。
最后,按设计,该工具做所有的工作为我们。我们结束了一个过滤器,满足我们的要求。我们有一整套的分析工具,这个应用程序中提供正确的验证过滤器表现如预期。
例如,现在我们正在查看频率的被称为保证金表响应。如果我需要确认这是尊重规范,我可以覆盖一个规范掩码。或者如果我想了解瞬态行为,按按钮,我可以快速可视化像步骤或脉冲响应的东西。
一旦我的滤波器设计好了,我真正想做的是在MATLAB中使用它将它应用到我的信号上。为此,我可以选择两种方法。我可以将过滤器作为一个或多个变量导出到我的MATLAB工作区。或者,我可以生成一些MATLAB代码,通过编程脚本交互地实现我刚才所做的一切。
您在这里看到的代码是自动生成的,就像这个函数的头文件告诉我们的那样。然而,我也可以决定单独使用类似的注释。为我自动生成这个也可以帮助我获得一些见解,以便下次我可以更快速地以编程方式设计我的过滤器。但更重要的是,现在通过使用这个函数调用,我可以从自己的代码中快速实现过滤器。
我不会丢弃这个新功能,因为我在我的工作文件夹中拥有先前保存的版本,称为HP Filter。并返回到我的脚本,您可以看到我正在使用一行代码通过我的预设函数创建过滤器。在下一行中,我正在将过滤器应用于我的垂直加速度。这创造了一个新的信号,希望我们希望只发现由于身体运动导致的贡献。如果我执行本节,我还在绘制对原始的新过滤信号。
在图中,我们可以看到新信号现在都以0为中心,正如预期的那样。这是我想要的。由于滤波器的存在,出现了一些瞬态行为,这是完全正常的。
现在让我一次只专注于一项活动。我该怎么做呢?有一个非常有效的MATLAB特性叫做逻辑索引,我可以用它来达到这个目的。看看这个。假设我想分离信号的移动部分。活动类型存储在向量actid中。当actid = 1时,我在这里检查。因为我这里有两个工作部分,你只看时间小于250秒的时候。
以下结果是与我的信号相同的传染媒介,即我可以用于仅选择符合这些标准的样本。这是我们的工作细分。我们可以放大并确认信号相当定期地振荡,几乎定期振荡。现在问题是,如何测量这是振荡的速度或一些参数来测量这些振荡的形状或指纹的速度?
一个好的答案是通过观察信号的频谱表示,或者有人会说通过计算它的FFT。要比FFT好得多,FFT是一种非常低级的操作,正确的说法是功率谱密度,它可以使用FFT和其他一些部件。再一次,我最好的选择是专注于我的目标,看看MATLAB是否可以简单地为我做到这一点,就像情况一样。
出于估计我们信号的功率谱密度的许多功能,我正在使用威尔士方法,这很受欢迎。根据这里的代码,我有我的频谱。在X轴上,我的采样频率的0到1/2的频率为50赫兹。并且在Y轴上,我每赫兹或功率密度都有DB。然后该区域当该图中的值较高时可能携带我以后的信息。
对于我们的信号,这种具有较高能量的0到10赫兹之间的这种峰值的模式具有很多可测量的信息。如果您有一个突然的信号理论类,您还记得周期性或几乎定期的信号的光谱。我们可以看到频率大约1赫兹大约左右的基力频率,以及该频率的倍数的许多谐波。
作为从该提取的信息,在这些峰值之间的频率的距离时域振荡的速率。和峰值的相对振幅描述振荡的形状,有点像在音乐信号的音色。为了验证这些,我还将向您展示的频谱上的一个顶部步行范围上楼梯0和10赫兹之间。
在这里,走上楼梯可以产生较慢和更平滑的运动,因为这些峰的较慢都被推到左侧。并且时域的平滑度使得基本右侧的峰值非常快速地减少,表明时间域转换更柔软。如果这听起来不熟悉,请考虑纯正弦波的频谱,其频谱中的单个峰值与方波相比,这是一个充满高频谐波的方波。
一旦确定了特殊山峰携带信息,我们希望有一种程序化的方法来测量它们的高度和位置。这是下一个问题。如何识别曲线中的峰值?与一些人所想的相反,这并非微不足道。信号处理工具箱(Signal Processing Toolbox)提供了一个名为“查找峰值”(Find Peaks)的函数,它正是为此而构建的。
如果我们使用它,而不提供其他信息,但我们的原始光谱密度,那么它将返回在我的plot中发现的完整的局部峰值集。但如果我们花更多的精力去定义我们想要的东西,例如,它应该返回多少个峰值,我们需要的峰值突出度是多少,或者我们期望的附近峰值之间的最小距离是多少,那么结果就会令人鼓舞得多。只用几行代码,我们现在就有了一个可以自动化的程序化度量方法。它高度描述了我们的信号特征。
在我开始向您展示的示例中,我使用了更多的信号处理度量来提取其他特征。但我认为现在你已经了解了从信号中提取特征的探索性方法的基本精神。在这个阶段结束时,我所做的是将所有有用的测量值收集到一个函数中,这样对于每个可用的新信号段,我能够自动生成所有测量值或描述它的特征的集合。
让我快速向您展示。对于在此处的三个方向上的每一个新的加速度样本缓冲器,我计算平均值,滤除重力贡献,计算RMS,测量光谱峰值,以及其他一些东西。如果我查看光谱功能子功能,您可以识别函数pwelch并从几分钟前找到峰值。
总的来说,这个函数为每一个作为输入传递给它的新信号缓冲区返回66个高度描述性的特性。我真正喜欢它的地方是,如果我测量代码行的净数量,不包括注释和空行,总和只有54行。这是针对66个特性的54行代码,或者比每个特性的一行代码要少得多,我发现这表明了MATLAB语言是如何简洁地有利于理解和提高生产率的。
有了这些,我想我们现在可以说我们已经完成了探索性工作流程的一半。我们提出了一种方法,为每个给定的信号段提取一组有限的特征。我们现在需要设计一个分类器,能够学习如何将度量或66个特征集与一个类或六个可用选项中的活动选项相关联。
为了使用分类器,我们首先需要将所有数据映射到新的基于特征的表示。让我打开另一个脚本,快速地向您展示我的意思。假设我们首先重组了我们的数据,比如8分钟的样本乘以30个实验对象,在大量等长的小缓冲中,比如128个样本。我们现在做的是,对于每一个缓冲区,我们调用特征提取函数来计算66个特征。最后我们得到了一个新的特性数据集,它的列数和可用缓冲区的行数一样多。
因为分类算法经常需要大量的数据来学习,所以从整个数据中提取功能可能需要很长时间。如果沿着这个探索性阶段决定使用不同的功能,那么整个操作需要重新开始。让我展示我在小规模上的意思。
让我们将这里的数据缓冲区数量减少到仅仅600,然后运行这个。我在循环开始前启动一个计时器,然后马上停止。当我的600个数据缓冲区一个接一个地转换为特性时,我们可以监控这个过程。这个过程大约在17秒后结束。让缓冲区的数量增长,这个会随着这个线性增长。
现在想想这个。for循环的每个循环中的计算都是相互独立的。因此,如果我们有更多可用的计算资源,我们可以开始考虑在可用的计算节点之间分配负担。我想你们大多数人都会认为这是一项艰巨的任务。因此,让我挑战这种看法。
我在这里做的是将我的关键字更改为parfor,确保启用了一个并行池,然后再次运行我的循环。现在,缓冲区由在后台运行的四个服务器Matlab工作者会话池中异步处理。而且我在原来的一小部分中完成了。
根据特定问题,实际的性能增益将改变。底线是,因为我的机器安装了并行计算工具箱,我能够在本地打开许多Matlab工作人员等于我机器上的可用核心数量。我在这里有四个核心。但随着外部资源如集群,数字可以随意驱动。然后我能够简单地通过更改为Paret,类似于并行地分发长期循环的独立迭代。
完成后,我们可以保存特色数据集,回到问题所在。我们把问题留到了需要选择分类算法的阶段。现在数据已经准备好了。当您需要分类器时,您可以在大量不同类型的算法中进行选择。MATLAB文档提供了一些关于哪些类型最适合哪些问题的指导,但整个尝试和错误的过程可能会令人生畏,特别是如果您不熟悉一般的机器学习,或者不熟悉合理数量的分类算法。
要从发布2015A发行方式解决问题,Matlab有一个名为分类学习者的新应用程序。您可以从“应用”选项卡中选择它。但是,让我只需用预设的功能数据加载它,并通过从脚本运行常见的分类学习者来打开应用程序。
首先,我打开我的数据,在这里挑上右手边这个选项留出用于验证我的数据集的一小部分。要知道,在我的脚本加载数据之前,我还不等它作为MATLAB表。这将允许该工具相关联的名字我的功能,并为他们每个人展示一些简单的统计。我的数据还包括了每个可用特征向量的ACTID和活动标签。
当我单击右侧的导入数据时,我在2D特征空间中有一个简单的数据点视觉。我可以选择我的66个功能中的哪一个用于X,这对于y来说,感受到我的数据样本是可分离的。此时,我们只需从此目录开始选择不同的分类器算法,并在使用此按钮的数据集中逐个培训它们。
您真的不需要知道这些算法是什么或它们如何工作以及它们所需的参数甚至工作,因为该工具为您巧妙地选择它们。如果您愿意,可以使用此高级按钮更改它们。正如我希望您能够看到的,当训练完成时,该工具在每个选定选项旁边显示精度摘要,并以最佳精度为绿色的选择。
在这个阶段,您可能还需要更深入地理解Classifier的性能。这个应用程序有一些诊断选项,比如,混淆矩阵,它显示了我们的预测如何映射到数据集中的实际已知值。例如,这里的全绿色对角线,并且在它外面没有实例,表示100%的预测精度。
正如在其他许多情况下用MATLAB应用程序,你可以再打开交互式的探索性工作到比特的代码相同的步骤,程序自动化。在我们的脚本中,我们使用的是来自相同的工作流程来完全是一个预设的版本。这里,有趣的是,包括在选择设置的分类,训练它,注意配合关键字代码模式的三线位置,并运行它新的数据返回预测类。
我们可以在脚本中使用这个生成的函数来返回一个训练过的分类器,并将其用于新的未知特征向量。我现在还不会这么做,因为我还有更多的事情要讲。分类学习器提供了一种直观的方式来访问大量的传统分类器,这些分类器随统计学和机器学习工具箱一起提供。
的另一种方式来解决这个问题的一个例子是神经网络。再次,在这种情况下,设计和培训从无到有的网络将会非常复杂。但神经网络工具箱提供的应用程序和功能快速上手和设计功能的网络只用几行代码。
令人兴趣的是,采取不同的角度,让我只是分享如何在这种情况下使用程序方法来做同样的工作。这里我用单个代码中的单个代码在单个隐藏层中初始化具有80个神经元的模式识别网络。然后我培训了它,并在只有几行的测试中返回了测试中的预测类。
如果你曾见过神经网络的理论来了,那么你就会知道,数学的这些操作下的复杂度是相当大的。试想想,使用反向传播的[听不清]网络架构和所有的优化选项,你可能需要考虑你的成本函数。在这种情况下,最行之有效的算法才有效使用,因此您可以专注于解决具体问题。当我执行此代码,我得到一个接口来监控训练进度也确认网络的体系结构:80个中的神经元隐藏层,66所作为输入的特征的数量,和6层输出的类。
当我们完成后,训练的神经网络是我的工作区使用。再次,通过编程方法,我可以用它来对我的数据集的整个测试集部分运行预测。正如我们之前做交互,我可以生成诊断程序在这种混乱矩阵的情况。
该报告的准确率约为92%,这是相当不错的,并详细说明了所有预测器类是如何匹配已知值的。举个例子,我们可以注意到很多人把坐着和站着搞混了,反之亦然。这是我们算法需要改进的地方。
现在,让我回顾一下我们取得的成绩。我们能够训练和使用一个分类器,对用信号处理方法提取的高质量特征进行操作。我们解决了一个问题,这个问题需要信号处理和机器学习这两个领域的专业知识,而这个问题没有单一的解决方法,可能需要很长时间才能解决。相反,这只需要几个迭代。我使用了一些不同的应用程序和算法,这些应用程序和算法都很容易使用,而不需要打开任何复杂的书,从零开始编写任何数学程序。一个显著的结果是,信号处理函数能够在仅54行代码中提取66个特征。
现在我想用最后10分钟来讨论一些常见的工程挑战,稍微超出我们之前讨论过的算法探索阶段。假设我们的最终目标是对来自一个新的加速度传感器的信号进行预测。在本例中,我们使用现有的数据集。我们没有问自己很多关于这些数据是如何收集的问题。
通常,持有相关数据可能很好地成为我们列表中的第一个问题。我经常与假设获得真实世界信号并探索您需要两种不同工具的工程师,并且谁最终在MATLAB和一些外部数据采集软件之间消费了一段时间的过渡数据。但事实证明MATLAB可以直接连接到许多传感器和数据采集设备。并使用该连接可以进一步加速您的发现周期。
因为我们的例子使用的是来自智能手机的加速度计和数据,所以我想我还应该包括两个可从MathWorks网站下载的免费支持包的参考,这两个包允许将来自iOS和Android设备的传感器信号直接输入MATLAB。金宝app
现在思考一个开发流程的结束,现在,想象你的闪亮MATLAB算法必须实时系统上实现;例如,在嵌入式设备靠近加速度计本身。在这种情况下,不仅最终的实时软件可能会帮助被C或C ++重写,但该算法的实际功能将在最终产品要重新适应。
机器学习部分可能需要更简单一些。例如,嵌入式分类器通常离线预训练,并在只进行在线预测的轻量级版本中实现。信号处理也可能会有更大的变化。例如,对来自传感器的信号流进行处理的过滤器将持续接收新样本并相应地更新其内部状态。
如果原始MATLAB模型没有考虑到这些影响,那么它可能在最后的实现可能永远比不上原来的模拟性能,可能损害实际的最终产品的成功。
好消息是,MATLAB不仅与初始信号分析和算法探索阶段有关;它们也可以用来模拟实时系统和生成可嵌入的C源代码。详细介绍这些方面超出了本次网络研讨会的范围。但是让我给你们一个关于这个领域的可能的想法。
最快要介绍的是分类器的部署。当我们训练和测试我们的神经网络分类器时,一切都是通过一个我们称之为net的网络对象完成的。它附带了丰富的功能。用于预测的实际数学代码可能很难找到。但是从我的对象网,我可以运行这个genFunction方法,生成一个简单的预测函数,它只需要使用基本的构造就可以对需要实时发生的事情进行建模。
现在让我们看一下数字信号处理的建模。在这里的左边,在extractSignalFeatures.m中,我有54行特征提取功能,我们之前已经回顾过了。这里使用的更多信号处理功能来自信号处理工具箱。这些在我们的探索阶段是非常有价值的。它们是数据分析任务的最佳选择。但它们并不是用来模拟实时系统的行为。这并不是我们当初编写代码时的想法。
例如,查看我们如何过滤信号。我的第一次考虑真的只是一个侧面笔记。但它可能有助于我们进入正确的心态。这里,即使它们始终相同,我们也会计算每个新信号部分的滤波器系数。我们立即采取全面的条目。我们假设要在很长的一个上运作。正如我们所做的那样,我们假设从一个过滤器开始具有清洁历史的过滤器,具有零内部状态。
现在作比较,让我看看另一种方式来此过程中心中都有一个实时的实现模型。而在这个其他功能的自buffer.m功能。大多数在此右侧功能信号处理的来自一个DSP系统工具箱。这些对象已开发与系统设计和仿真的初衷。他们可能是用于信号分析不太实用。但是,它们可以用来精确模型的实时DSP系统。
如果我们只是查看过滤器进行比较,那么它就是一个具有内部结构概念的过滤器对象。只要您通过在MATLAB中创建一个时,可以通过捕获完整的数据类型规范来获得更好的准确行为;例如,对于固定点实现。
该对象保持其内部状态并被声明为持久性。因此,退出并重新进入此功能将在其先前的状态下再次找到它。所以,如果需要,它甚至可以一次采用一个样本。它仍将按预期运行。
至于系数,它们只在初始化这个持久变量时第一次调用这个函数时计算一次。然后在运行时通过在每个新的数据缓冲区上调用step方法来使用它们。作为一个副作用,这个过滤器只初始化一次,因此可以非常高效地运行。从第二次开始,它只执行严格必要的计算来处理输入。这些属性使它非常适合在信号设计和仿真的上下文中与流信号一起使用。这个新的系统模型的第一个优点,正如我们现在所说的,是通过模拟它,我们可以在嵌入式系统的算法设计的早期验证,并检查行为是否如预期的那样。
我相信这个形象现在看起来很熟悉。这就是我在本课程开始时向您展示的内容,以介绍我们的示例。这里的动态模拟提供了一个不同的视角。例如,我可以在从一个活动到另一个活动的转换中检查预测的稳定性。或者其他应用程序,我可能需要像在示波器上一样分析信号,例如,使用触发器和标记。
这这里是一个时间范围。但其它类型的可视化也是可能的,包括,很明显,在用频谱分析仪的频域。但我们不会在那个右看看现在。
如果我们看一下生成模拟的代码,我们将再次看到在新的特性提取函数中看到的许多编程实践。例如,我们在每次迭代时使用一个带有新数据处理的while循环。这里的代码对象是我们在连续在线可视化中使用的。在while循环中,我们只是使用前面已经看到的step方法的相同简单构造不断地推入更多数据。
在此循环的开头,我们使用类似方式的文件读取器对象来逐步前进到数据文件,而无需在存储器中加载可能的巨大文件或执行任何复杂的索引到源数据中。我们只是在开头传递文件名,并获得每一次迭代的新样本帧。
在这里,我还使用了一个缓冲区来帮助我操作一个比系统可能在单个迭代中接收到的更长的数据窗口,所有这些都包装在一个单独的对象中,以隐藏在索引中,并通过相同的步骤接口使用。在这个循环的中间,你可以看到我们用新的DSP模型和轻量级神经网络分类器模拟的预测函数。
除了能够在线模拟我们的系统之外,拥有DSP处理组件和部署的神经网络的实时模型的第二个实质性优势是,我们现在可以从它们自动生成源代码C或c++代码。可以用于嵌入式产品、嵌入式原型,或者只是作为参考与下游软件工程团队共享。
在这方面还有很多要说的,包括直接生成定点或目标优化C的能力。但我会告诉你如何工作的一般想法。虽然你第一次也可以通过一个专用的内置应用程序来完成这个工作流程,但总的想法是,通过这个简单的通用代码,我们可以将我们的MATLAB函数predict activity从信号缓冲区转换成一个完全等效的开放C函数,而不附带任何库。生成的C完全打开。在本例中,我没有努力优化生成的代码。但是有很多特性可以做到这一点,包括生成所有定点代码的能力。
好吧。我想我们已经看到了我想给你们展示的一切。现在让我回到幻灯片。我将回顾一下我们所做的工作,以及我在本演示的各个部分中使用的功能和工具。
信号分析是第一个使用De Facto标准内置函数的领域将我们节省了大量时间。信号处理工具箱是所有这些有用功能来自的地方。想象一下,必须从头开始实施所有这些公式,更不用说地看着它们并试图了解它们。并行计算工具箱让我们仅通过将循环更改为Par循环来分发计算上的循环的计算密集型。其他并行计算选项可用于扩展我们对更大的体系结构(包括计算机集群和云)的框架。
统计和机器学习工具箱不仅允许我们测试大量分类器,还允许我们在分类学习器应用程序中以交互方式快速探索和比较不同的选项。我觉得这大大加快了我们的发现周期。在探索了一些传统的分类器之后,我们还使用神经网络工具箱创建了一个用于模式识别的通用网络拓扑,并对其进行了训练和测试。我们还生成了该网络的轻量级预训练版本,它使用C热电联产引擎完全支持的基本MATLAB结构捕获运行时计算。金宝app
通过我们的信号处理算法已经合并的基础,我们使用了DSP系统工具箱中的对象数来模拟我们算法的实时实现。我们使用促进存储在磁盘上的长信号的对象进行了促进数据的对象进行了在线模拟。并且我们使用优化的范围来处理流信号的连续可视化,类似于如何使用台式仪器可视化实际信号。
作为一个副作用,我们的在线建模工作使我们的算法在模拟中执行起来更加高效,并使它们能够生成可以直接部署到嵌入式处理器上的C或c++源代码。这就是我们使用MATLAB编码器的地方。
Matlab编码器是一种热电联产引擎,可以将MATLAB算法转换成完全开放的C或C++源代码。关于MATLAB编码器可以做什么,特别是通过生成可嵌入的源代码,还有很多要说的。所以我想我会推荐你们去看一个很棒的介绍性网络研讨会,它以预先录制的形式出现在我们的网站上,叫做“MatlabtoC变得简单”
关于这一点,我们已经结束了关于传感器数据分析的信号处理和机器学习技术的网络研讨会。我希望这对强调一些您还不熟悉的MATLAB功能很有用。我的目标是在接下来的几周内提供我使用的代码,这样您就可以按照自己的进度查看示例。
如果你不得不忘记我今天提到的所有东西,我希望你至少记住以下三个要点。首先,我们的开放式项目之所以成为可能,是因为我们拥有广泛的内置功能,包括信号处理和机器学习。这让我们能够快速尝试不同的选择,而无需从头开始执行任何数学运算。
图片的补充部分是在MATLAB环境本身,从基本的可视化功能,内置的生成可重用代码的应用程序,使得经常使用,可以很容易让先进事情发生的几行代码中的语言。
最后,我们带您参观了一组MATLAB功能,这些功能用于将抽象思想转换为实时算法实现。我们将信号处理算法转化为可以随时间模拟的详细DSP系统模型。根据这些,我们生成了可以在嵌入式平台上重新编译的源C代码。
你也可以从以下列表中选择一个网站:
选择中国网站(以中文或英文)以获取最佳网站性能。其他MathWorks国家网站未优化您的位置。