文档

这是机器翻译

翻译的微软
鼠标悬停文本以查看原文。点击下面的按钮,返回该页面的英文版本。

注:本页已翻译由MathWorks请按此处
若要查看包括本页在内的所有翻译资料,请从本页底部的国家导航器中选择日本。

创建移动平均线系统对象

简介

这个例子展示了如何创建一个实现移动平均过滤器的System对象™。该示例演示了如何在MATLAB中使用System对象®和仿真软金宝app件®通过MATLAB系统块。MovingAverageFilter是一个简单的移动平均系统对象过滤器,它计算前WindowLength输入样本,其中WindowLength是移动平均窗口的长度。

System对象接受单精度和双精度二维输入矩阵。输入矩阵的每一列都被视为一个独立的(1-D)通道。输入的第一个维度定义通道的长度(或输入帧的大小)。MovingAverageFilter独立计算每个输入通道随时间的移动平均值。

系统对象在MATLAB中的使用而且系统对象在Simulink中的使用金宝app演示如何将系统对象与数据一起使用。

创建类定义

在MATLAB中首页选项卡选择新增->系统对象-> Simulink扩展金宝app打开一个System对象模板。模板中使用的System对象的自定义MATLAB系统块。您可以编辑模板文件,使用它作为指导方针,以创建您自己的System对象。

替换所有出现的无标题的在文件中MovingAverageFilter并将文件保存为MovingAverageFilter.m在您有写权限的文件夹中。您需要将此文件夹添加到MATLAB路径中以使用System对象。为了方便起见,文件中提供了整个System对象dspdemo.MovingAverageFilter.m.要查看此文件,请输入

编辑dspdemo。MovingAverageFilter
在MATLAB命令提示符。前缀dspdemodspdemo。MovingAverageFilter是一个包名。包是特殊的文件夹,可以包含类文件夹、函数和类定义文件以及其他包。包文件夹总是以+字符开头,例如+ dspdemo.包定义包文件夹内容的范围(即名称必须是唯一的名称空间)。这意味着函数和类名只需要在包中是唯一的。使用包提供了一种方法来组织类和函数,并为这些组件选择其他包可以重用的名称。创建System对象时不必使用包。有关MATLAB中包的更多信息,请参见包创建命名空间.此示例的其余部分将向您展示如何创建MovingAverageFilter对象,而不使用包。但是,你也可以检查和使用完成的版本,dspdemo。MovingAverageFilter

移动平均滤波器特性

MovingAverageFilter对象有一个公共属性,用于控制移动平均线的长度。因为算法依赖于数据处理开始后这个值保持不变,所以该属性被定义为不可调。此外,该属性只接受实数正整数。要确保正确的输入,请添加PositiveInteger属性设置为属性。该属性的默认值是5。

属性(PositiveInteger,不可调)WindowLength移动平均过滤器长度指定移动平均过滤器的长度为%标量正整数值。这个的默认值%属性为5。WindowLength = 5结束

移动平均滤波器的状态用DiscreteState属性。方法获取状态的值getDiscreteState方法。

属性(discrete testate)状态;结束

移动平均滤波器是分子系数等于的FIR滤波器(WindowLength 1) / WindowLength.因为在流操作期间系数不会改变,所以为了优化目的在属性中定义系数。此外,要确保System对象的用户无法访问系数,请使用私人属性。

属性(访问=私有,不可调)pCoefficients;结束

最后,System对象对可能的多通道输入进行操作,因此需要一个用于通道数量的属性。此属性对用户不可访问,因此您使用私人属性。此属性的值由输入中的列数决定。

属性(访问=私有)用于缓存输入通道数量的属性%(列)。在流中改变频道的数量%操作是不允许的(因为它修改了所需的%的状态)。默认值-1表示流操作具有%尚未启动(即ofo通道的数量仍然未知)。pNumChannels = -1;结束

移动平均滤波器构造器

System对象构造函数是一个与类同名的方法(MovingAverageFilter在本例中)。在该方法中,使用方法允许在构造时进行标准的名称-值对处理,filt = MovingAverageFilter('WindowLength',10)

方法%的构造函数函数obj = MovingAverageFilter(varargin)类时金宝app支持名称-值对参数%的对象。找(obj,输入参数个数,变长度输入宗量{:});结束结束

移动平均滤波器设置

setupImpl方法设置对象并实现一次性初始化任务。滤波器系数是根据指定的窗口长度计算的。过滤器的状态被初始化为零。注意这里有WindowLength-1每个输入通道的状态。如果希望将状态初始化为自定义值,可以创建公共值InitialConditions属性,并使用属性值设置对象状态(obj。状态)setupImpl.最后,通道的数量由输入中的列数确定。

函数setupImpl(obj,x) numChannels = size(x,2);obj。状态= 0 (obj。WindowLength-1,numChannels,“喜欢”, x);缓存通道数量obj。pNumChannels = numChannels;obj。pCoefficients = ones(1,obj.WindowLength)/obj.WindowLength;结束

    注意:你必须设置访问=受保护对于这个方法。

移动平均滤波步骤

对象的算法定义在stepImpl方法。中的算法stepImpl当System对象的用户调用一步在命令行。在这个例子中,stepImpl方法计算输出并更新对象的状态值过滤器函数。

函数Y = stepImpl(obj,X)计算输出和更新状态[Y, obj。状态] = filter(obj.pCoefficients,1,X,obj.State);结束

    注意:你必须设置访问=受保护对于这个方法。

移动平均滤波器复位

状态重置方程定义在resetImpl方法。在本例中,状态被重置为零。如果希望将状态重置为自定义值,可以创建公共值InitialConditions属性,并使用属性值重置中的状态resetImpl

函数resetImpl(obj) obj. state (:) = 0;结束

    注意:你必须设置方法(Access = protected)对于这个方法。

输入验证

validateInputsImpl控件的输入进行验证一步方法的初始化和每次后续调用时一步输入属性(如维度、数据类型或复杂性)更改的地方。在这个例子中,validattributes确保输入是一个具有浮点数据的二维矩阵。

函数validateInputsImpl(obj, u)“双”“单一”}, {“二维”...“nonsparse”},“输入”);输入通道的数量不允许改变。如果% pNumChannels = -1。这意味着流操作%尚未启动(即尚未调用setupImpl)%)。在这种情况下,请不要进行检查。code .internal. errorif (obj. pnumchannels ~=-1 && obj. bj. pnumchannels)pNumChannels ~= size(u,2),“dsp:系统:varSizeChannelsNotSupp金宝apported”);结束

    注意:你必须设置方法(Access = protected)对于这个方法。

对象保存和加载

saveObjectImpl定义在调用save时在mat文件中保存的属性和状态值。如果你没有定义saveObjectImpl方法,只有公共属性和带有DiscreteState属性保存。只有当对象处于锁定状态时,才保存对象的状态。当您加载已保存的对象时,该对象将在锁定状态下加载。在这个System对象中,如果对象被锁定,则会保存过滤器系数。

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

loadObjectImpl定义在加载mat文件时加载什么系统对象属性和状态值。loadObjectImpl应该与你的saveObjectImpl以确保加载所有已保存的属性和数据。

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

    注意:你必须设置访问=受保护对于这个方法。

系统对象在MATLAB中的使用

这个例子使用System对象从有噪声的脉冲序列中去除噪声。移动平均滤波器的长度为30个样本。如果您正在使用预定义的dspdemo。MovingAverageFilter,用那个名字代替MovingAverageFilter例如,在类构造函数中movingAverageFilter = dspdemo.MovingAverageFilter('WindowLength',30);

movingAverageFilter = movingAverageFilter (“WindowLength”, 30);Scope = dsp。TimeScope (“SampleRate”1 e3,...“时间间隔”* .01,...“ShowGrid”,真的,...“NumInputPorts”,2,...“LayoutDimensions”1 [2]);我= 1:10 0输入=(1 - 2 *兰迪([0,1],1))* 1 (256 1)+ 0.5 * randn (256 1);输出= movingAverageFilter(输入);范围(输入、输出)结束

金宝appSimulink定制方法

您需要定义更多的方法,以便能够在Simulink中使用System对象金宝appMATLAB系统块。如果只在MATLAB中使用System对象,则不需要这些方法。getOutputSizeImpl返回每个输出端口的大小。对于具有一个输入和一个输出且希望输入和输出大小相同的System对象,不需要实现此方法。在MovingAverageFilter时,有一个输入和一个输出,每个输入和输出的大小相同。的类定义中删除此方法MovingAverageFilter

getDiscreteStateSpecificationImpl返回属性的大小、数据类型和复杂性。这个属性必须是离散态属性。如果您的System对象具有离散状态属性,并且在MATLAB系统块。在本例中,该方法用于定义状态财产。

函数[sz,dt,cp] = getdiscrete testatespecificationimpl (obj,~) inputSize = propagatedInputSize(obj,1);Sz = [obj];WindowLength-1 inputSize (2)];dt = propagatedInputDataType(obj,1);cp = propagat爱丁堡复杂度(obj,1);结束

    注意:你必须设置访问=受保护对于这个方法。

系统对象在Simulink中的使用金宝app

若要在Simulink模型中使用System对象,请拖动金宝appMATLAB系统块从Simulink中的用户定义函数库到您的模型。金宝app

打开块对话框,并将System对象名称设置为MovingAverageFilter.该模型ex_movingaverage_filter演示了如何在Simulink中使用System对象对有噪声的脉冲序列进行滤波。金宝app

模型=“ex_movingaverage_filter”;open_system(模型);

通过单击来运行模型运行在模型中按下按钮或输入:

sim(模型)

这个话题有帮助吗?