В этом примере показано, как создать системную object™, которая реализует фильтр скользящего среднего.
Системные объекты являются классами MATLAB, которые получают из matlab.System
. В результате все системные объекты наследуют общий открытый интерфейс, который включает стандартные методы:
setup
- Инициализируйте объект, обычно в начале симуляции
reset
- Очистить внутреннее состояние объекта, вернув его к статусу постинициализации по умолчанию
release
- Отпустите любые ресурсы (память, оборудование или ресурсы ОС), используемые внутри объекта
Когда вы создаете новые виды системных объектов, вы обеспечиваете определенные реализации для всех предыдущих методов, чтобы определить его поведение.
В этом примере вы создаете и используете movingAverageFilter
Системный объект. movingAverageFilter
является системным объектом, который вычисляет невзвешенное среднее значение предыдущего WindowLength
входные выборки. WindowLength
- длина окна скользящего среднего. movingAverageFilter
принимает матрицы 2-D с одинарной и двойной точностью входа. Каждый столбец матрицы входа рассматривается как независимый (1-D) канал. Первая размерность входа определяет длину канала (или размер входного кадра). movingAverageFilter
независимо вычисляет скользящее среднее значение для каждого входного канала с течением времени.
На вкладке MATLAB Home создайте новый класс Системного объекта, выбрав New > Системным объектом > Basic. В редакторе MATLAB откроется базовый шаблон для системного объекта, который поможет вам при создании movingAverageFilter
Системный объект.
Переименуйте класс movingAverageFilter
и сохраните файл следующим образом movingAverageFilter.m
. Чтобы убедиться, что вы можете использовать системный объект, убедитесь, что вы сохраняете объект System в папке, которая находится в пути MATLAB.
Для вашего удобства, полный movingAverageFilter
Файл системного объекта доступен в этом примере. Чтобы открыть завершенный класс, введите:
edit movingAverageFilter.m
Этому системному объекту нужно четыре свойства. Сначала добавьте общественной собственности WindowLength
для управления длиной окна скользящего среднего. Поскольку алгоритм зависит от того, является ли это значение постоянным, когда начинается обработка данных, свойство определяется как nontunable. Кроме того, свойство принимает только вещественные, положительные целые числа. Чтобы убедиться, что вход удовлетворяет этим условиям, добавьте валидаторы свойств (см. «Валидация значений свойств»). Установите значение по умолчанию для этого свойства равным 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
в этом примере). Вы реализуете конструктор системных объектов, чтобы разрешить входы пары "имя-значение" в объект System с 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
The 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
способ. На панели инструментов Editor выберите Insert Method > Release resources. The 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 inputs. В только что вставленном validateInputsImpl
метод, вызов validateattributes
чтобы убедиться, что вход является матрицей 2-D с данными с плавающей точкой.
function validateInputsImpl(~, u) validateattributes(u,{'double','single'}, {'2d',... 'nonsparse'},'','input'); end
Когда вы сохраняете образец системного объекта, saveObjectImpl
определяет, какое свойство и значения состояний сохраняются в MAT-файле. Если вы не задаете saveObjectImpl
метод для вашего класса Системного объекта, только общественная собственность и свойства с DiscreteState
атрибут сохранен. Выберите «Вставить метод» > «Сохранить в MAT-файле». Изменение 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 > Загрузка из MAT-файла. Изменение loadObjectImpl
так, что, если объект заблокирован, коэффициенты и количество каналов загружаются.
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).