Создайте Системный объект Скользящего среднего значения

В этом примере показано, как создать Систему 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 метод, вызовите validateattributes гарантировать, что вход является 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 так, чтобы, если объект заблокирован, коэффициенты и количество каналов загрузились.

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"])

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Input, Smoothed input.

Расширьте Свой Системный объект для Simulink

Чтобы использовать ваш Системный объект в Simulink, смотрите, Создают Блок Фильтра Скользящего среднего значения с Системным объектом (Simulink).