传感器数据分析中的信号处理和机器学习技术
越来越多的应用要求在时间序列和传感器数据上联合使用信号处理和机器学习技术。MATLAB®通过在单一环境中提供全方位的建模和设计能力,可以加速数据分析和传感器处理系统的开发。
在这次网络研讨会上,我们展示了一个分类系统的例子,该分类系统能够识别人类主体正在进行的身体活动,仅基于他或她的智能手机产生的加速度计信号。
我们介绍了MATLAB中常用的信号处理方法(包括数字滤波和频域分析),帮助从原始波形中提取描述特征,并展示了并行计算如何加速大型数据集的处理。然后讨论如何以编程和交互的方式探索和测试不同的分类算法(如决策树、支持向量机或神经网络)。
最后,我们演示了如何从MATLAB中自动生成C/ c++代码来部署用于嵌入式传感器分析的流分类算法。
记录:2018年3月21日
欢迎参加本次“传感器数据分析用MATLAB的信号处理和机器学习技术”网络研讨会。我叫Gabriele Bunkheila,是MathWorks公司产品管理团队的一员。我的背景是信号处理,这也是我在这里度过了大部分职业生涯的领域,帮助工程科学家将MATLAB应用于他们自己的挑战。
在这次网络研讨会上,我将讨论一些标准的MATLAB技术在研究问题和产品设计工作流程中的应用,这些研究问题和产品设计工作流程需要联合使用机器学习——例如,聚类或分类方法——在信号或时间序列上的应用,这意味着采样的一个值随时间变化而贬值。
正如我们将看到的,这些问题的复杂性大多来自于对机器学习和信号处理领域知识的需要。这通常会带来挑战。无论你对信号处理、机器学习,或两者都不熟悉,或两者都不熟悉,我希望这节课能帮助你理解MATLAB如何极大地加速这些问题的算法设计工作流。
我们还看到一个不断增长的行业趋势,即将机器学习算法连同单一处理一起推向嵌入式设备,并更接近实际的信号传感器。在这里,我将这类应用程序称为传感器数据分析或嵌入式分析。因为这类产品的开发带来了额外的工程挑战,我认为在会议结束时分配一2022世界杯八强谁会赢?些时间来回顾MATLAB为这些类型的工作流提供的额外支持是有用的。
这是我们要学习的课程列表。我们将花相当多的时间来回顾如何将常见的信号处理方法应用于准备或预处理信号和提取描述性特征。我将展示如何在MATLAB中选择、训练和测试分类或模式识别算法,包括一些简单的方法来扩大计算密集型问题的性能。这样做将使我们有机会探索许多基本的MATLAB特性,从交互式应用程序到内部语言构造,这些特性支持并加速工作流的算法开发。
最后,我们将讨论一些用于在线预测系统设计的MATLAB功能,包括DSP功能的设计和仿真,以及从预测算法生成源代码C,以使它们在嵌入式体系结构上运行。
我一会儿再讲幻灯片。但我将用这一小时的大部分时间讨论一个运行MATLAB的实际例子。你现在看到的是用智能手机捕捉加速度计信号的三个组成部分。受试者在固定位置佩戴智能手机,进行不同的身体活动,就会产生这些信号。我们在运行一种算法,就像它在实时信号上运行一样。但在本例中,我们使用标记的记录数据进行验证。
这样我们就能知道真相了。但我们也试图自动理解他们在做什么活动,完全基于信号处理和机器学习方法。正如你所看到的,大多数时候我们都能成功地猜出这个活动。
现在我想说明一个简单的问题,这只是一个用加速度计数据走路的简单例子。但我将讨论的技术与广泛的应用和大多数采样信号或时间序列类型相关。
为了阐明我的观点,我收集了一个简短的例子列表,这些例子都是我在与MATLAB用户一起工作时遇到的,大体上来说,它们使用的是相同类型的技术。这些已经在许多不同的行业中捕获了用例,如电子、航空航天、国防、金融、汽车。再说一次,这只是一个随机的例子列表。我们在这里讨论的技术的相关性要广泛得多。
在回到MATLAB之前,我将利用最后一张幻灯片来回顾我们刚刚看到的不同的例子。我们取来自智能手机的样本加速度的三个分量。我们预测实验对象的身体活动是在六种不同的选择或课程中进行选择,步行,上楼,下楼,坐着,站着,躺着。
预测是通过分类算法完成的。分类描述了一类流行的机器学习算法。关键思想是基于对类似数据的先前知识来猜测或预测新样本的类,在本例中是一个信号缓冲区。它的工作方式是这样的:首先,用大量已知或标记的案例训练算法,优化其自由参数,以尽可能准确地识别那些已知的案例。
一旦训练完毕,它就可以在未知的新数据上运行,对新数据最有可能的类进行猜测或预测。通常,训练阶段比测试或运行时阶段需要更多的数据和计算。因此,对于嵌入式应用程序,在主机系统或计算机集群上运行训练阶段并不罕见,但只在嵌入式产品上部署固定的、预先训练过的算法。
无论培训或运行时使用,分类器能够处理这样的原始波形是非常罕见的。在实践中,对于每个信号段或缓冲区,一旦你有办法从原始波形中提取有限的测量集(通常称为特征),选择使用什么特征的底线是,它们应该捕获同一类信号之间的相似性和不同类信号之间的差异。我们将用剩下的大部分时间来展示如何使用MATLAB来设计这两个大的算法步骤,从最初的探索阶段开始。
现在作为一个快速的提示,完成一个类似的任务或项目的一个关键部分是参考数据集的可用性。这将是在受控实验中获得的信号记录的集合,并仔细标记,以便信号被知道并与正确的活动相关联。在这个例子中,我借用了两个研究小组提供的数据集,他们分别来自西班牙和意大利,可以在这张幻灯片的地址找到。
我希望到目前为止,总体问题已经足够清楚了。让我们回到MATLAB。在接下来的文章中,我将假设您熟悉MATLAB的基础知识,包括脚本和函数以及基本的绘图和可视化。
为了让您了解这个示例,我将使用一个由许多可以独立执行的代码单元格组成的脚本。我将跳过第一个单元格,它是我在一开始启动完成的应用程序时使用的。为单元格执行此操作将加载数据集的一部分并绘制它。
现在我们不太关心如何加载数据或生成这个图。让我们来看看我们现有的数据。我们有一个矢量acc,它包含了一个物体在一段时间内的垂直加速度样本。数据集本身是30个不同受试者的3D加速记录。加速度将以每秒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中可以作为单个函数使用。因此,尽管使用了我预先编辑的函数来将这两个图放入一个图中并为它们提供正确的颜色,但在图中,对直方图函数的单个调用为我完成了所有艰难的工作。
直方图(Histogram)与旧的hist相对应,在MATLAB的r2014b中被引入并发布。它提供了一种新的、更有效的直方图绘制方法。
现在要分析随时间的变化,我们要关注由身体运动引起的加速度。我们可以合理地假设,当重力作用几乎恒定时,身体运动产生更快的变化。如果我有两个信号混合在一个信号中我想把它们分离出来,那么一种常用的技术就是数字滤波。
例如,在本例中,我们希望只保留振荡速度快于大约每秒一个周期(这是每秒平均步骤数的粗略数字),而丢弃具有较慢振荡的贡献。使用正确的术语,这需要设计和应用到我们的数据一个合适的高通滤波器。我将在整个过程中重复这些想法。
现在设计和应用数字滤波器是很难的,除非你有合适的工具。设计阶段尤其需要相当多的数学知识和大量特定于领域的知识。在MATLAB中,有许多不同的方法可以用来设计数字滤波器。例如,一个人可以选择完全通过编程来完成它,这意味着只使用MATLAB commons,或通过内置的应用程序。
让我们先来看看后者会是什么样子。当你第一次处理一个问题时,使用应用程序通常是一个好主意。为此,我转到MATLAB工具条的Apps选项卡,向下滚动到Signal Processing and Communications应用程序组。在这里,我将选择过滤器设计和分析工具。对于更高级的过滤器设计,你可能也想尝试过滤器生成器应用程序。
过滤器设计和分析工具包含几个部分。例如,这个Filter Specifications窗格将帮助我们为过滤器指定正确的需求。在这里的左边是我们开始定义我们想要实现的目标的地方。在本例中,我将选择高通滤波器。但是你可以看到还有很多其他的选择。
在这里,有一个更专业的选择。如果你了解数字滤波器,你可能会知道FIR和IR是什么意思。这里列出的设计方法可能会引起相当多的共鸣。在这里,我将跳过细节。我只选其中一个IAR选项。移到这里的右边,我所需要做的就是使用上面的规范窗格捕获我的需求。
我要说的是我们使用的采样频率是50赫兹。我们希望保持不变;也就是说,我们希望衰减1或0分贝。所有信号成分的振荡速度都快于每秒一次或1赫兹。我们就说0.8赫兹吧。那么在另一个值fstop的左边的所有值,都至少衰减给定的dB数。我把这个设为0.4赫兹相应地,这个停止设为60db。这意味着所有慢于每秒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赫兹之间。
在这里,爬楼梯会产生更慢更平稳的动作,因为较慢的山峰都被推到左边。时域的平滑使得基数右侧的峰值衰减非常快,这表明时域过渡更柔和。如果这听起来很陌生,请想想纯正弦波的频谱,与充满高频谐波的方波相比,正弦波的频谱只有一个峰值。
一旦确定了特殊山峰携带信息,我们就需要一种程序化的方法来测量它们的高度和位置。下面是下一个问题。如何识别曲线中的峰值?与一些人的想法相反,这并非微不足道。信号处理工具箱提供了一个名为“查找峰值”的功能,它就是为此而构建的。
如果我们在使用它的同时只提供原始光谱密度的信息,那么它将返回在我的图中发现的完整的局部峰值集。但如果我们花更多的精力来确定我们想要的东西,例如,它应该返回多少个峰值,我们需要的峰值突出度是多少,或者我们期望的附近峰值之间的最小距离是多少,那么结果就会更令人鼓舞。仅仅使用几行代码,我们现在就有了一种可以自动化的程序化度量方法。它高度描述了我们的信号特征。
在我开始向您展示的示例中,我使用了更多的信号处理测量来提取其他特征。但我认为到目前为止,您已经了解了从信号中提取特征的探索性方法的一般精神。在这个阶段的最后,我所做的是将所有有用的测量值收集到一个函数中,以便对于每个可用的新信号段,我能够自动生成描述它的所有测量值或特征的集合。
让我快速给你们展示一下。对于这三个方向上的每一个新的加速度样本缓冲区,我都在计算均值,过滤掉重力的贡献,计算均方根,测量谱峰,以及其他一些事情。如果我看一下谱特征子函数,你可以认出几分钟前的PWELCH和Find Peaks函数。
总的来说,对于作为输入传递的每个新信号缓冲区,该函数返回66个高度描述性特征。我真正喜欢的是,如果我测量不包括注释和空行在内的代码行总数,总共只有54行。这是66个特性的54行代码,或者比每个特性的一行代码要少得多,我发现这表明MATLAB语言在理解和生产力方面是如何简洁的。
有了这些,我想我们现在可以说我们的探索工作已经进行了一半。我们提出了一种方法,为每个给定的信号片段提取有限的特征集。我们现在需要设计一个分类器,它能够学习如何将度量(在本例中是66个特征集)与6个可用选项中的一个类或活动的选择相关联。
要使用分类器,我们首先需要将所有数据映射到新的基于特征的表示中。让我打开另一个脚本,快速向您展示我的意思。想象一下,我们首先重组了我们的数据,比方说,8分钟的样本乘以30个受试者,在大量等长的小缓冲区中,比方说,128个样本。我们现在要做的是,对于每一个缓冲区,我们调用特征提取函数来计算66个特征。最后我们得到了一个新的特征数据集它的列数和特征的数量以及可用缓冲区的行数一样多。
因为分类算法通常需要大量的数据来学习,从整个数据中提取特征可能需要非常长的时间。如果在这个探索阶段第一个决定使用不同的功能,那么整个操作需要重新开始。让我在一个小范围内说明我的意思。
让我们把这里的数据缓冲区的数量减少到仅仅600,然后运行这个。我在循环之前启动一个计时器,然后马上停止。当我的600个数据缓冲区一个接一个地被转换成特性时,我们可以监视这个过程。这个过程大约在17秒后结束。让缓冲区的数量增加,这个会和那个线性增长。
现在想想这个。for循环的每个循环中的计算都是相互独立的。因此,如果我们有更多可用的计算资源,我们就可以开始考虑在可用的计算节点上分配负担。我猜你们大多数人会认为这是一项艰巨的任务。让我来挑战一下这种看法。
我在这里要做的是将for关键字更改为parfor,确保启用了并行池,然后再次运行循环。缓冲区现在由后台运行的四个服务器MATLAB工作会话组成的池异步处理。我只花了很短的时间就完成了。
实际的性能增益将根据特定的问题而变化。底线是,因为我的机器上安装了并行计算工具箱,所以我能够在本地打开与我的机器上可用内核数量相等的MATLAB工作程序。这里有四个核。但是有了像集群这样的外部资源,数量可以随意增加。然后我就能分配一个long for循环的独立迭代只需要把for换成parfor,就像parallel for。
一旦我们完成了,我们就可以保存我们的特征数据集,并回到我们离开问题的地方。我们把问题留在了需要选择分类算法的阶段。现在我们有了可以继续进行的数据。当您需要分类器时,您可以在大量不同类型的算法中进行选择。MATLAB文档提供了一些关于哪种类型最适合哪种问题的指导,但整个试错过程可能令人生畏,特别是如果您不熟悉机器学习的一般情况或特定情况,不熟悉合理数量的分类算法。
从2015a版本开始,为了解决这个问题,MATLAB推出了一个名为Classification Learner的新应用程序。你可以从Apps选项卡中选择它。但让我用预设的特征数据加载它,然后从我的脚本中运行公共分类学习者来打开应用程序。
首先,我加载数据并选择这里右边的这个选项,以保留数据集的一部分用于验证。要知道在我的脚本中加载数据之前,我还将它作为MATLAB表进行范围划分。这将允许该工具将名称与我的特性关联起来,并为每个名称显示一些简单的统计信息。我的数据还包括每个可用特征向量的actid和活动标签。
当我点击右边的Import Data时,我在2d特征空间中看到了我的数据点的简单可视化。我可以选择66个特征中的哪一个用在x上,哪一个用在y上,感觉一下数据样本的可分离性有多好。此时,我们只需开始从这个目录中选择不同的分类器算法,并使用这个按钮在我们的数据集中逐个训练它们。
你真的不需要知道这些算法是什么,或者它们是如何工作的,甚至不需要知道它们需要什么参数,因为工具会为你聪明地选择它们。如果你愿意,你可以用这个高级按钮来改变它们。正如我希望您看到的那样,当训练完成时,该工具在每个选定选项旁边显示精度摘要,并以绿色突出显示精度最好的选择。
在这个阶段,您可能还需要更深入地了解Classifier的性能。这个应用程序有一些诊断选项可以直接从它内部使用,比如,混淆矩阵,它显示了我们的预测映射到数据集中的实际已知值有多好。例如,这里的一条全绿色对角线,并且它以外没有实例,表示预测准确率为100%。
在MATLAB应用程序的许多其他情况下,您可以将交互式探索性工作转换为少量代码,以编程方式自动执行相同的步骤。在我们的脚本中,我们使用的预设版本完全来自相同的工作流。这里有趣的是一个三行代码模式,包括为分类器选择设置、训练—注意这里的fit关键字—并在新数据上运行它以返回预测的类。
我们可以直接在脚本中使用这个生成的函数来返回经过训练的分类器,并在新的未知特征向量上使用它。我现在不会这么做,因为我还有些东西需要提一下。分类学习者提供了一种直观的方式来访问统计和机器学习工具箱附带的大量传统分类器。
解决这个问题的另一种方法是神经网络。同样,在这种情况下,从头开始设计和训练一个网络将是非常复杂的。但是神经网络工具箱提供了应用程序和函数,可以快速上手,并且只用几行代码就可以设计一个功能网络。
为了节省时间并从不同的角度来看问题,让我来分享一下如何在这种情况下使用编程方法来完成同样的工作。在这里,我用一行代码在一个隐藏层中初始化了一个带有80个神经元的模式识别网络。然后我训练它,用几行代码就返回了测试集中预测的类。
如果你曾经接触过神经网络的理论,那么你就会知道这些运算背后的数学是相当复杂的。想想在一个[听不清]网络架构中使用反向传播和所有你可能需要考虑成本函数的优化选项。在这种情况下,大多数完善的算法都是可用的,因此您可以专注于解决特定的问题。当我执行这段代码时,我得到了一个监视训练进度的接口,同时也确认了网络的架构:隐藏层中有80个神经元,66个输入作为特征的数量,6个输出类。
当我们完成后,训练好的神经网络就可以在我的工作空间中使用了。再一次,通过编程的方法,我可以使用它在数据集的整个测试集部分上运行预测。就像我们之前所做的那样,我可以通过编程生成诊断,就像在这个混淆矩阵的情况下一样。
它报告了92%左右的准确性,这已经相当不错了,同时还提供了关于所有预测器类别如何与已知值匹配的详细视图。举个例子,我们可以注意到很多人把坐和站混淆了,反之亦然。这是我们算法需要改进的地方。
现在让我退一步回顾一下我们取得的成就。我们能够训练和使用一个分类器操作高质量的特征提取信号处理方法。我们解决了一个需要信号处理和机器学习两个领域的专业知识的问题,这个问题没有单一的解决方法,可能需要很长时间才能解决。相反,这只需要几次迭代。我使用了一些不同的应用程序和算法,它们很容易使用,而不需要打开任何复杂的书籍,从头编写任何数学程序。一个显著的结果是信号处理函数能够在54行代码中提取66个特征。
现在我想用最后10分钟左右的时间来考虑一些常见的工程挑战,稍微超出了我们之前讨论过的算法探索阶段。想象一下,我们的最终目标是根据来自新加速传感器的信号进行预测。在本例中,我们使用了一个现有的数据集。我们并没有问自己很多关于如何收集的问题。
一般来说,获取相关数据可能是我们清单上的第一个问题。我经常和一些工程师交谈,他们认为获取真实世界的信号和探索你的算法需要两种不同的工具,他们最终花了相当多的时间在MATLAB和一些外部数据采集软件之间转换数据。但事实证明,MATLAB可以直接连接到许多传感器和数据采集设备。使用这种连接性可以进一步加快你的发现周期。
因为我们的示例使用了加速度计和智能手机的数据,所以我想我还应该包含一个可以从MathWorks网站下载的两个免费支持包的参考,它们允许将来自iOS和Android设备的传感器信号直接流到MATLAB中。
现在想想开发工作流的结尾,想象一下你闪亮的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函数预测活动从信号缓冲区转换为完全等价的开放C函数,没有附加的库。生成的C是完全开放的。在本例中,我没有在优化生成的代码上花费精力。但是有很多特性可以做到这一点,包括生成所有定点代码的能力。
好的。我想我们已经看到了我计划给你们看的所有东西。现在让我回到幻灯片上。我将后退一步,回顾我们已经完成的工作,以及我在本次演示的各个部分中使用的功能和工具。
信号分析是使用事实上的标准内置函数为我们节省大量时间的第一个领域。信号处理工具箱是所有这些有用功能的来源。想象一下,必须从零开始执行所有这些公式,更不用说查阅它们并尝试理解它们了。并行计算工具箱允许我们通过简单地将for循环改为parfor循环来分布计算密集型的for循环。还有其他并行计算选项,可以将我们使用的框架扩展到更大的体系结构,包括计算机集群和云。
统计和机器学习工具箱不仅允许我们测试大量的分类器,还可以在分类学习者应用程序中快速探索和比较不同的选项。我觉得这大大加快了我们的发现周期。在探索了一些传统的分类器之后,我们还使用神经网络工具箱创建了一个用于模式识别的通用网络拓扑结构,对其进行训练和测试。我们还生成了该网络的轻量级预训练版本,它使用C热电联产引擎完全支持的基本MATLAB构造捕获运行时计算。
在巩固了信号处理算法的基础之后,我们使用了来自DSP系统工具箱的对象数量来建模算法的实时实现。我们对我们的系统进行了在线模拟,该系统使用的对象可以促进存储在磁盘上的长信号的数据流。我们使用优化的作用域来处理流信号的连续可视化,类似于用台式仪器可视化真实世界的信号。
作为一个副作用,我们的在线建模工作使我们的算法在模拟中执行起来更加高效,并且使它们能够生成可以直接部署到嵌入式处理器上的C或c++源代码。这就是我们使用MATLAB编码器的地方。
MATLAB Coder是一个热生成引擎,可以将MATLAB算法转换为完全开放的C或c++源代码。关于MATLAB Coder可以做什么,特别是通过生成可嵌入的源代码,将有很多要说的。我想我应该给你们推荐一个很棒的网络介绍性研讨会在我们的网站上有预先录制的格式叫做“MATLAB to C Made Easy”
至此,“传感器数据分析中的信号处理和机器学习技术”网络研讨会结束了。我希望这对强调一些你们还不熟悉的MATLAB功能有帮助。我的目标是在接下来的几周内提供我所使用的代码,以便您可以按照自己的节奏检查示例。
如果你不得不忘记我今天提到的所有内容,我希望你至少能记住以下三个关键思想。首先,我们的开放式项目之所以成为可能,是因为它拥有广泛的内置功能,包括信号处理和机器学习。这让我们能够快速尝试不同的选项,而无需从头开始执行任何数学运算。
这幅画的补充部分是MATLAB环境本身,从基本的可视化功能到生成可重用代码的内置应用程序,不断使用一种语言,使高级的事情很容易在几行代码中发生。
最后,本文带您浏览了一组将抽象思想转换为实时算法实现的MATLAB功能。我们将信号处理算法转化为详细的DSP系统模型,可以随着时间的推移进行模拟。通过这些,我们生成了可以在嵌入式平台上重新编译的源C代码。
下载代码及文件
相关产品2022世界杯八强谁会赢?
了解更多
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。