В этом примере показано, как создать системный object™, реализующий фильтр скользящего среднего.
Системные объекты являются классами MATLAB, производными от matlab.System. В результате все объекты системы наследуют общий открытый интерфейс, который включает стандартные методы:
setup - инициализация объекта, как правило, в начале моделирования;
reset - очистить внутреннее состояние объекта, вернув его в статус по умолчанию после инициализации;
release - Высвобождение любых ресурсов (памяти, оборудования или ресурсов, специфичных для ОС), используемых внутри объекта
При создании новых видов системных объектов предоставляются специальные реализации для всех предшествующих методов, чтобы определить их поведение.
В этом примере создается и используется movingAverageFilter Системный объект. movingAverageFilter является объектом System, который вычисляет невзвешенное среднее предыдущего WindowLength входные выборки. WindowLength - длина окна скользящего среднего. movingAverageFilter принимает 2-D входные матрицы с одинарной и двойной точностью. Каждый столбец входной матрицы обрабатывается как независимый (1-D) канал. Первый размер входа определяет длину канала (или размер входного кадра). movingAverageFilter независимо вычисляет скользящее среднее каждого входного канала во времени.
На вкладке Главная страница MATLAB создайте новый класс объектов System, выбрав New > System Object > Basic. Основной шаблон для объекта System открывается в редакторе MATLAB для управления созданием movingAverageFilter Системный объект.
Переименование класса movingAverageFilter и сохраните файл как movingAverageFilter.m. Для обеспечения возможности использования объекта System необходимо сохранить объект System в папке, расположенной по пути MATLAB.
Для вашего удобства, полный movingAverageFilter В этом примере доступен файл системных объектов. Чтобы открыть завершенный класс, введите:
edit movingAverageFilter.mЭтому объекту System требуется четыре свойства. Сначала добавьте общедоступное свойство WindowLength для управления длиной окна скользящего среднего. Поскольку алгоритм зависит от того, является ли это значение постоянным после начала обработки данных, свойство определяется как не настраиваемое. Кроме того, свойство принимает только вещественные положительные целые числа. Чтобы входные данные удовлетворяли этим условиям, добавьте средства проверки свойств (см. раздел Проверка значений свойств). Установите значение по умолчанию для этого свойства равным 5.
properties(Nontunable)
WindowLength (1,1){mustBeInteger,mustBePositive} = 5
end
Во-вторых, добавьте два свойства с именем State и pNumChannels. Пользователи не должны получать доступ ни к одному из свойств, поэтому используйте Access = private атрибут. State сохраняет состояние фильтра скользящего среднего. pNumChannels сохраняет количество каналов на входе. Значение этого свойства определяется по количеству столбцов на входе.
properties(Access = private)
State;
pNumChannels = -1;
end
Наконец, необходимо свойство для хранения коэффициентов числителя FIR. Добавить свойство с именем pCoefficients. Поскольку коэффициенты не изменяются во время обработки данных и пользователям объекта System не требуется получать доступ к коэффициентам, установите атрибуты свойства как Nontunable, Access = private.
properties(Access = private, Nontunable)
pCoefficients
end
Конструктор объекта System - это метод, имя которого совпадает с именем класса (movingAverageFilter в этом примере). Вы реализуете конструктор объекта System, чтобы разрешить ввод пары имя-значение в объект System с помощью setProperties способ. Например, с помощью конструктора пользователи могут использовать следующий синтаксис для создания экземпляра объекта System: 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 метод устанавливает объект и реализует одноразовые задачи инициализации. Для этого объекта System измените значение по умолчанию setupImpl способ вычисления коэффициентов фильтра, состояния и количества каналов. Коэффициенты фильтра вычисляются на основе указанного WindowLength. Состояние фильтра инициализировано равным нулю. (Обратите внимание, что есть WindowLength-1 состояния по входному каналу.) Наконец, количество каналов определяется из числа столбцов на входе.
Для setupImpl и все Impl методы, необходимо задать атрибут метода Access = protected поскольку пользователи объекта System не вызывают эти методы напрямую. Вместо этого бэкэнд объекта System вызывает эти методы через другие пользовательские функции.
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 выполняется, когда пользователь объекта System вызывает объект в командной строке. В этом примере измените stepImpl для вычисления выходных данных и обновления значений состояния объекта с помощью filter функция.
function y = stepImpl(obj,u) [y,obj.State] = filter(obj.pCoefficients,1,u,obj.State); end
Уравнения сброса состояния определены в resetImpl способ. В этом примере состояние сбрасывается на ноль. Кроме того, необходимо добавить releaseImpl способ. На панели инструментов редактора выберите «Вставить метод» > «Освободить ресурсы». releaseImpl добавляется к объекту System. Изменить releaseImpl для установки количества каналов в -1, что позволяет использовать новые входные данные с фильтром.
function resetImpl(obj) % Initialize / reset discrete-state properties obj.State(:) = 0; end function releaseImpl(obj) obj.pNumChannels = -1; end
Чтобы проверить входные данные для объекта System, необходимо внедрить validateInputsImpl способ. Этот метод проверяет входные данные при инициализации и при каждом последующем вызове, где изменяются входные атрибуты (такие как измерения, тип данных или сложность). На панели инструментов выберите «Вставить метод» > «Проверить входные данные». В вновь вставленном validateInputsImpl метод, вызов validateattributes чтобы гарантировать, что входные данные являются 2-D матрицей с данными с плавающей запятой.
function validateInputsImpl(~, u) validateattributes(u,{'double','single'}, {'2d',... 'nonsparse'},'','input'); end
При сохранении экземпляра объекта System saveObjectImpl определяет, какие значения свойств и состояний сохраняются в MAT-файле. Если не определить saveObjectImpl метод для класса объектов System, только общие свойства и свойства с помощью 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 потому что он определяет способ загрузки сохраненного объекта. При загрузке сохраненного объекта объект загружается в том же заблокированном состоянии. Выберите «Метод вставки» > «Загрузить из 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).