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

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

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

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

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