主要内容

创建移动平均系统对象

这个示例展示了如何创建一个实现移动平均过滤器的System对象™。

介绍

系统对象是派生自的MATLAB类matlab。系统.因此,系统对象都继承一个公共的公共接口,其中包括标准方法:

  • 设置-初始化对象,通常在模拟的开始

  • 重置-清除对象的内部状态,使其恢复到默认的初始化后状态

  • 释放-释放对象内部使用的任何资源(内存、硬件或特定于操作系统的资源)

当您创建新的System对象类型时,您将为所有上述方法提供特定的实现,以确定其行为。

在本例中,创建并使用movingAverageFilter系统对象。movingAverageFilter系统对象是否计算前一个的未加权平均值WindowLength输入样本。WindowLength为移动平均窗口的长度。movingAverageFilter接受单精度和双精度的二维输入矩阵。输入矩阵的每一列都被视为一个独立的(1-D)通道。输入的第一个维度定义了通道的长度(或输入帧的大小)。movingAverageFilter独立计算每个输入通道随时间的移动平均值。

创建系统对象文件

在MATLAB首页选项卡,通过选择创建一个新的System对象类新增>系统对象> Basic.System对象的基本模板在MATLAB编辑器中打开,以指导您创建movingAverageFilter系统对象。

重命名类movingAverageFilter并将文件保存为movingAverageFilter.m.为了确保您可以使用System对象,请确保将System对象保存在MATLAB路径上的一个文件夹中。

为了您的方便,一个完整的movingAverageFilter系统对象文件在这个例子中可用。要打开已完成的类,输入:

编辑movingAverageFilter.m

添加属性

这个System对象需要四个属性。首先,添加一个公共属性WindowLength来控制移动平均窗口的长度。由于一旦数据处理开始,算法就依赖于该值是否为常量,因此属性被定义为不可调优。此外,该属性只接受实的正整数。要确保输入满足这些条件,请添加属性验证器(参见验证属性值).将此属性的默认值设置为5。

属性(Nontunable) WindowLength (1,1){mustBeInteger,mustBePositive} = 5结束

其次,添加两个被调用的属性状态pNumChannels.用户不应该访问这两个属性,因此使用访问=私人属性。状态保存移动平均滤波器的状态。pNumChannels存储输入中通道的数量。此属性的值由输入中的列数确定。

属性(Access = private) State;pNumChannels = 1;结束

最后,您需要一个属性来存储FIR分子系数。添加一个名为pCoefficients.因为系数在数据处理期间不会改变,而且您不希望System对象的用户访问系数,所以将属性属性设置为不可调优,访问=私有

属性(Access = private, Nontunable结束

添加易于创建的构造函数

System对象构造函数是一个与类同名的方法(movingAverageFilter在本例中)。属性实现一个System对象构造函数,以允许对System对象的名称-值对输入方法。例如,使用构造函数,用户可以使用以下语法创建System对象的实例:过滤器= movingAverageFilter (WindowLength, 10).不要将构造函数用于其他任何事情。所有其他设置任务应该写入setupImpl方法。

方法函数obj = movingAverageFilter(变长度输入宗量)%在万博1manbetx构造对象时支持名称-值对参数找(obj,输入参数个数,变长度输入宗量{:})结束结束

中设置和初始化setupImpl

setupImpl方法设置对象并实现一次性初始化任务。对于这个System对象,修改默认值setupImpl方法来计算滤波系数、状态和信道数。过滤系数是根据指定的参数计算的WindowLength.过滤器状态初始化为零。(注意有WindowLength-1每个输入通道状态。)最后,通道的数量由输入中的列的数量决定。

setupImpl和所有Impl方法时,必须设置方法属性访问=保护因为System对象的用户不会直接调用这些方法。相反,System对象的后端通过其他面向用户的函数调用这些方法。

函数setupImpl (obj, x)%一次性执行计算,如计算常量obj。pNumChannels =大小(x, 2);obj。obj.WindowLength pCoefficients = 1 (1) / obj.WindowLength;obj。状态= 0 (obj.WindowLength-1 obj.pNumChannels,“喜欢”,x);结束

定义算法stepImpl

对象的算法在stepImpl方法。该算法在stepImpl当System对象的用户在命令行调用对象时执行。本例中为modifystepImpl方法计算输出并更新对象的状态值过滤器函数。

函数y = stepImpl(obj,u) [y,obj.]状态] = filter(obj.pCoefficients,1,u,obj.State);结束

重置和释放

状态重置方程定义在resetImpl方法。在本例中,将状态重置为零。此外,您需要添加releaseImpl方法。从编辑器将来发布,选择Insert Method >释放资源.的releaseImpl方法被添加到System对象中。修改releaseImpl设置通道数为-1,它允许与过滤器一起使用新的输入。

函数resetImpl (obj)初始化/重置离散状态属性对象状态(:)=0;结束函数releaseImpl (obj) obj。pNumChannels = 1;结束

验证输入

要验证System对象的输入,必须实现validateInputsImpl方法。该方法在初始化时和在输入属性(如维度、数据类型或复杂性)发生变化的每个后续调用时验证输入。从工具条中选择插入方法>验证输入.在新插入的validateInputsImpl方法,叫validateattributes以确保输入是带有浮点数据的二维矩阵。

函数validateInputsImpl (- u) validateattributes (u, {“双”“单一”}, {“二维”...“nonsparse”},“输入”);结束

对象保存和加载

当保存System对象的实例时,saveObjectImpl定义在mat文件中保存的属性和状态值。如果你不定义saveObjectImpl方法,只有公共属性和带有DiscreteState属性保存。选择插入方法>保存在MAT-file中.修改saveObjectImpl因此,如果对象被锁定,系数和通道的数量就会被保存。

函数s = saveObjectImpl(obj) s = saveObjectImpl@matlab.System(obj);如果isLocked(obj)s.pCoefficients=obj.pCoefficients;s、 pNumChannels=obj.pNumChannels;结束结束

loadObjectImpl是…的伴侣saveObjectImpl因为它定义了如何加载已保存的对象。当您加载已保存的对象时,对象将以相同的锁定状态加载。选择>从MAT-file加载.修改loadObjectImpl因此,如果对象被锁定,就会加载通道的系数和数量。

函数loadObjectImpl(对象,s,已锁定)如果wasLocked obj。pCoefficients= s.pCoefficients; obj.pNumChannels = s.pNumChannels;结束loadObjectImpl@matlab.System (obj,年代,wasLocked);结束

使用movingAverageFilter在MATLAB

既然已经定义了System对象,就可以在MATLAB中使用该对象了。例如,使用movingAverageFilter从有噪声的脉冲序列中去除噪声。

移动平均滤波器=移动平均滤波器(“WindowLength”10);t =(摘要);信号= randn (250 1);smoothedSignal = movingAverageFilter(信号);情节(t)信号,t, smoothedSignal);传奇([“输入”“平滑输入”])

图中包含一个坐标轴。轴线包含2个线型对象。这些对象表示输入,平滑的输入。

为Simulink扩展你的系统对象万博1manbetx

要在Simulink中使用System对象,请参阅万博1manbetx用系统对象创建移动平均过滤块(万博1manbetx模型)