这是机器翻译
鼠标悬停文本以查看原文。点击下面的按钮,返回该页面的英文版本。创建移动平均线系统对象
简介
这个例子展示了如何创建一个实现移动平均过滤器的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
dspdemo
在dspdemo。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;结束
注意:你必须设置 |
输入验证
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”);结束
注意:你必须设置 |
对象保存和加载
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(模型)