В этом примере показано, как создать системную 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
setupImplThe 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).