В этом примере показано, как создать Систему object™, который реализует фильтр скользящего среднего значения.
Системные объекты являются классами MATLAB, которые выводят из matlab.System
. В результате Системные объекты, все наследовали общий открытый интерфейс, который включает стандартные методы:
setup
— Инициализируйте объект, обычно в начале симуляции
reset
— Очистите внутреннее состояние объекта, возвратив его его состоянию постинициализации по умолчанию
release
— Высвободите любые средства (память, оборудование или специфичные для ОС ресурсы) используемый внутренне объектом
Когда вы создаете новые виды Системных объектов, вы обеспечиваете определенные реализации для всех предыдущих методов, чтобы определить его поведение.
В этом примере вы создаете и используете MovingAverageFilter
Системный объект. MovingAverageFilter
Системный объект, который вычисляет невзвешенное среднее значение предыдущего WindowLength
введите выборки. WindowLength
длина окна скользящего среднего значения. MovingAverageFilter
принимает 2D входные матрицы с двойной точностью и с одинарной точностью. Каждый столбец входной матрицы обработан как независимый (1D) канал. Первая размерность входа задает длину канала (или размер входного кадра). MovingAverageFilter
независимо вычисляет скользящее среднее значение каждого входного канала в зависимости от времени.
Во вкладке MATLAB Home создайте новый класс Системного объекта путем выбора New> System Object> Basic. Основной шаблон для Системного объекта открывается в редакторе MATLAB, чтобы вести вас, когда вы создаете MovingAverageFilter
Системный объект.
Переименуйте класс MovingAverageFilter
и сохраните файл как MovingAverageFilter.m
. Чтобы убедиться можно использовать Системный объект, убедитесь, что вы сохраняете Системный объект в папке, которая находится на пути MATLAB.
Для вашего удобства, полного MovingAverageFilter
Файл системного объекта доступен с этим примером. Открыть завершенный класс, введите:
edit MovingAverageFilter.m
Этому Системному объекту нужны четыре свойства. Во-первых, добавьте общественную собственность WindowLength
управлять длиной окна скользящего среднего значения. Поскольку алгоритм зависит от этого значения, являющегося постоянным, если обработка данных начинается, свойство задано как ненастраиваемое. Кроме того, свойство только принимает действительные, положительные целые числа. Гарантировать вход удовлетворяет этим условиям, добавьте блоки проверки допустимости свойства (см. Проверку значений свойств). Установите значение по умолчанию этого свойства к 5.
properties(Nontunable)
WindowLength (1,1){mustBeInteger,mustBePositive} = 5
end
Во-вторых, добавьте два свойства под названием State
и pNumChannels
. Пользователи не должны получать доступ ни к одному свойству, так используйте Access = private
атрибут. State
сохраняет состояние фильтра скользящего среднего значения. pNumChannels
хранит количество каналов в вашем входе. Значение этого свойства определяется из количества столбцов во входе.
properties(Access = private)
State;
pNumChannels = -1;
end
Наконец, вам нужно свойство сохранить КИХ-коэффициенты числителя. Добавьте свойство под названием pCoefficients
. Поскольку коэффициенты не изменяются во время обработки данных, и вы не хотите, чтобы пользователи Системного объекта получили доступ к коэффициентам, установили атрибуты свойства как Nontunable, Access = private
.
properties(Access = private, Nontunable)
pCoefficients
end
Конструктор Системного объекта является методом, который имеет то же имя как класс (MovingAverageFilter
в этом примере). Вы реализуете конструктора Системного объекта, чтобы позволить входные параметры пары "имя-значение" Системному объекту с setProperties
метод. Например, с конструктором, пользователи могут использовать этот синтаксис, чтобы создать экземпляр Системного объекта: filter = MovingAverageFilter('WindowLength',10)
. Не используйте конструктора ни в чем больше. Все другие задачи настройки должны быть написаны в setupImpl
метод.
methods function obj = MovingAverageFilter(varargin) % Support name-value pair arguments when constructing object setProperties(obj,nargin,varargin{:}) end end
setupImpl
setupImpl
метод настраивает объект и реализует одноразовые задачи инициализации. Для этого Системного объекта измените setupImpl
по умолчанию метод, чтобы вычислить коэффициенты фильтра, состояние и количество каналов. Коэффициенты фильтра вычисляются на основе заданного
WindowLength
. Состояние фильтра инициализируется, чтобы обнулить. (Обратите внимание на то, что существует WindowLength-1
состояния на входной канал.) Наконец, количество каналов определяется из количества столбцов во входе.
Для setupImpl
и весь Impl
методы, необходимо установить атрибут метода Access = protected
потому что пользователи Системного объекта не вызывают эти методы непосредственно. Вместо этого бэкэнд Системного объекта вызывает эти методы через другие стоящие с пользователем функции.
function setupImpl(obj,x) % Perform one-time calculations, such as computing constants obj.pNumChannels = size(x,2); obj.pCoefficients = ones(1,obj.WindowLength)/obj.WindowLength; obj.State = zeros(obj.WindowLength-1,obj.pNumChannels,'like',x); end
stepImpl
Алгоритм объекта задан в stepImpl
метод. Алгоритм в stepImpl
выполняется, когда пользователь Системного объекта вызывает объект в командной строке. В этом примере измените stepImpl
вычислить выход и обновить значения объекта состояния с помощью filter
функция.
function y = stepImpl(obj,u) [y,obj.State] = filter(obj.pCoefficients,1,u,obj.State); end
Уравнения сброса состояния определены в resetImpl
метод. В этом примере, состояния сброса, чтобы обнулить. Кроме того, необходимо добавить releaseImpl
метод. От панели инструментов Редактора выберите Insert Method>, высвобождают средства. releaseImpl
метод добавляется к вашему Системному объекту. Измените releaseImpl
определять номер каналов к -1
, который позволяет новому входу использоваться с фильтром.
function resetImpl(obj) % Initialize / reset discrete-state properties obj.State(:) = 0; end function releaseImpl(obj) obj.pNumChannels = -1; end
Чтобы подтвердить входные параметры к вашему Системному объекту, необходимо реализовать validateInputsImpl
метод. Этот метод подтверждает входные параметры при инициализации и в каждом последующем вызове, где вход приписывает (такие как размерности, тип данных или сложность) изменение. От панели инструментов выберите Insert Method> входные параметры Validate. В недавно вставленном validateInputsImpl
метод, вызовите validattributes
гарантировать, что вход является 2D матрицей с данными с плавающей точкой.
function validateInputsImpl(~, u) validateattributes(u,{'double','single'}, {'2d',... 'nonsparse'},'','input'); end
Когда вы сохраняете экземпляр Системного объекта, saveObjectImpl
задает, какое свойство и значения состояния сохранены в MAT-файле. Если вы не задаете saveObjectImpl
метод для вашего класса Системного объекта, только публичные свойства и свойства с DiscreteState
атрибут сохранен. Выберите Insert Method> Save in MAT-file. Измените saveObjectImpl
так, чтобы, если объект заблокирован, коэффициенты и количество каналов были сохранены.
function s = saveObjectImpl(obj) s = saveObjectImpl@matlab.System(obj); if isLocked(obj) s.pCoefficients = obj.pCoefficients; s.pNumChannels = obj.pNumChannels; end end
loadObjectImpl
компаньон к saveObjectImpl
потому что это задает, как сохраненный объект загружает. Когда вы загружаете сохраненный объект, объект загружает в том же заблокированном состоянии. Выберите Insert Method> Load from MAT-file. Измените loadObjectImpl
так, чтобы, если объект заблокирован, coeffients и количество каналов загрузились.
function loadObjectImpl(obj,s,wasLocked) if wasLocked obj.pCoefficients = s.pCoefficients; obj.pNumChannels = s.pNumChannels; end loadObjectImpl@matlab.System(obj,s,wasLocked); end
MovingAverageFilter
в MATLABТеперь, когда вы задали Системный объект, можно использовать объект в MATLAB. Например, используйте MovingAverageFilter
удалить шум из шумной импульсной последовательности.
movingAverageFilter = MovingAverageFilter('WindowLength',10); t = (1:250)'; signal = randn(250,1); smoothedSignal = movingAverageFilter(signal); plot(t,signal,t,smoothedSignal); legend(["Input","Smoothed input"])
Чтобы использовать ваш Системный объект в Simulink, смотрите, Создают Блок Фильтра Скользящего среднего значения с Системным объектом (Simulink).