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

Введение

Этот пример показывает, как создать Систему object™, который реализует фильтр скользящего среднего значения. Пример показывает, как использовать Системный объект в MATLAB® и Simulink® через блок MATLAB System. MovingAverageFilter является простым фильтром Системного объекта скользящего среднего значения, который вычисляет невзвешенное среднее значение предыдущих выборок входа WindowLength, где WindowLength является длиной окна скользящего среднего значения.

Системный объект принимает 2D входные матрицы с двойной точностью и с одинарной точностью. Каждый столбец входной матрицы обработан как независимый (1D) канал. Первая размерность входа задает длину канала (или входной формат кадра). MovingAverageFilter независимо вычисляет скользящее среднее значение каждого входного канала в зависимости от времени.

Использование системного объекта в MATLAB и Использование Системного объекта в Simulink показывают, как использовать ваш Системный объект с данными.

Создайте определение класса

В MATLAB Home вкладка выбирают New -> System Object -> Simulink Extension, чтобы открыть шаблон Системного объекта. Этот шаблон включает индивидуальные настройки Системного объекта для использования в блоке MATLAB System. Можно отредактировать файл шаблона, с помощью него в качестве инструкции, чтобы создать собственный Системный объект.

Замените все случаи Untitled в файле с MovingAverageFilter и сохраните файл как MovingAverageFilter.m в папке, где у вас есть разрешение записи. Необходимо добавить эту папку в путь MATLAB, чтобы использовать Системный объект. Для удобства целый Системный объект обеспечивается в файле dspdemo.MovingAverageFilter.m. Чтобы просмотреть этот файл входят

edit dspdemo.MovingAverageFilter
в подсказке команды MATLAB. Префиксный dspdemo на dspdemo.MovingAverageFilter является именем пакета. Пакеты являются специальными папками, которые могут содержать папки класса, файлы функционального и определения класса и другие пакеты. Папки пакета всегда начинаются + символ, такой как +dspdemo. Пакеты задают осциллограф содержимого папки пакета (то есть, пространство имен, в котором имена должны быть уникальными). Это означает имена функций, и имена классов должны быть уникальными только в пакете. Используя пакет обеспечивает средние значения, чтобы организовать классы и функции и выбрать имена для этих компонентов, которые могут снова использовать другие пакеты. Вы не должны использовать пакеты при создании Системного объекта. Для получения дополнительной информации о пакетах в MATLAB смотрите, что Пакеты Создают Пространства имен (MATLAB). Остаток от этого примера показывает вам, как создать объект MovingAverageFilter из шаблона Системного объекта, не используя пакет. Однако можно также рассмотреть и использовать завершенную версию, dspdemo.MovingAverageFilter.

Свойства фильтра скользящего среднего значения

Объект MovingAverageFilter имеет одну общественную собственность, которая управляет продолжительностью скользящего среднего значения. Поскольку алгоритм зависит от этого значения, являющегося постоянным, если обработка данных начинается, свойство задано как ненастраиваемое. Кроме того, свойство только принимает действительные, положительные целые числа. Чтобы гарантировать правильный вход, добавьте, что PositiveInteger приписывает свойству. Значение по умолчанию этого свойства равняется 5.

properties (PositiveInteger, Nontunable)
        % WindowLength Moving average filter length
        %   Specify the length of the moving average filter as a
        %   scalar positive integer value. The default value of this
        %   property is 5.
        WindowLength = 5
end

Состояние фильтра скользящего среднего значения задано с атрибутом DiscreteState. Получите значение состояния путем вызова метода getDiscreteState.

properties (DiscreteState)
        State;
end

Фильтром скользящего среднего значения является КИХ-Фильтр с коэффициентами числителя, равными ones(WindowLength,1)/WindowLength. Поскольку коэффициенты не изменяются во время операции потоковой передачи, коэффициенты заданы в свойстве в целях оптимизации. Кроме того, чтобы гарантировать коэффициенты не доступны для пользователей Системного объекта, используют атрибут private.

properties (Access = private, Nontunable)
        pCoefficients;
end

Наконец, Системный объект работает с возможно многоканальным входом и поэтому требует свойства для количества каналов. Это свойство не доступно для пользователей, и поэтому вы используете атрибут private. Значение этого свойства определяется от количества столбцов во входе.

properties (Access = private)
        % pNumChannels Property used to cache the number of input channels
        % (columns). Varying the number of channels during the streaming
        % operation is not allowed (since it modifies the number of required
        % states). The default of -1 means that the streaming operation has
        % not started yet (i.e. the number of channels is still unknown).
        pNumChannels = -1;
end

Конструктор фильтров скользящего среднего значения

Конструктор Системного объекта является методом, который имеет то же имя как класс (MovingAverageFilter в этом примере). В рамках того метода используйте метод setProperties, чтобы позволить стандартную обработку пары "имя-значение" при конструкции, filt = MovingAverageFilter('WindowLength',10).

methods
        % Constructor
        function obj = MovingAverageFilter(varargin)
            % Support name-value pair arguments when constructing the
            % object.
            setProperties(obj,nargin,varargin{:});
        end
end

Setup фильтра скользящего среднего значения

Метод setupImpl настраивает объект и реализует одноразовые задачи инициализации. Коэффициенты фильтра вычисляются на основе заданной длины окна. Состояния фильтра инициализируются, чтобы обнулить. Обратите внимание на то, что существуют состояния WindowLength-1 на входной канал. Если требуется инициализировать состояния к пользовательскому значению, можно создать общедоступное свойство InitialConditions и использовать значение свойства, чтобы установить объектное состояние (obj.State) в setupImpl. Наконец, количество каналов определяется от количества столбцов во входе.

function setupImpl(obj,x)
            numChannels = size(x,2);
            obj.State = zeros(obj.WindowLength-1,numChannels,'like',x);
            % Cache the number of channels
            obj.pNumChannels = numChannels;
            obj.pCoefficients = ones(1,obj.WindowLength)/obj.WindowLength;
end

Примечание

Вам необходимо задать Access = protected для этого метода.

Шаг фильтра скользящего среднего значения

Алгоритм объекта задан в методе stepImpl. Алгоритм в stepImpl выполняется, когда пользователь Системного объекта вызывает step в командной строке. В этом примере stepImpl вычисляет вывод и обновляет значения объекта состояния с помощью функции filter.

function Y = stepImpl(obj,X)
    % Compute output and update state
   [Y,obj.State] = filter(obj.pCoefficients,1,X,obj.State);
end

Примечание

Вам необходимо задать Access = protected для этого метода.

Сброс фильтра скользящего среднего значения

Уравнения сброса состояния определены в методе resetImpl. В этом примере состояния сбрасываются, чтобы обнулить. Если вы хотите сбросить состояния к пользовательскому значению, можно создать общедоступное свойство InitialConditions и использовать значение свойства, чтобы сбросить состояние в resetImpl.

function resetImpl(obj)
    obj.State(:) = 0;
end

Примечание

Необходимо установить methods(Access = protected) для этого метода.

Контроль ввода

validateInputsImpl подтверждает входные параметры к методу step при инициализации и в каждом последующем вызове step, где вход приписывает (такие как размерности, тип данных или сложность) изменение. В этом примере validattributes гарантирует, что вход является 2D матрицей с данными с плавающей точкой.

function validateInputsImpl(obj, u)
            validateattributes(u,{'double','single'}, {'2d',...
                'nonsparse'},'','input');
            % The number of input channels is not allowed to change. If
            % pNumChannels = -1. This means that the streaming operation
            % has not started yet (i.e. setupImpl has not been invoked
            % yet). Do not perform the check in that case.
            coder.internal.errorIf(obj.pNumChannels~=-1 && obj.pNumChannels ~= size(u,2),...
 'dsp:system:varSizeChannelsNotSupported');
end

Примечание

Необходимо установить methods(Access = protected) для этого метода.

Объектное сохранение и загрузка

saveObjectImpl задает, какое свойство и значения состояния сохранены в MAT-файле, когда вы вызываете, экономят на том объекте. Если вы не задаете метод saveObjectImpl для своего класса Системного объекта, только публичные свойства и свойства с атрибутом DiscreteState сохранены. Сохраните состояние объекта, только если объект заблокирован. Когда вы загружаете сохраненный объект, объект загружает в том заблокированном состоянии. В этом Системном объекте коэффициенты фильтра сохранены, если объект заблокирован.

function s = saveObjectImpl(obj)
            s = saveObjectImpl@matlab.System(obj);
            if isLocked(obj)
                s.pCoefficients  =  obj.pCoefficients;
                s.pNumChannels  =  obj.pNumChannels;
            end
end

loadObjectImpl задает, какое свойство Системного объекта и значения состояния загружаются, когда вы загружаете MAT-файл. loadObjectImpl должен соответствовать вашему saveObjectImpl, чтобы гарантировать, что загружаются все сохраненные свойства и данные.

function loadObjectImpl(obj,s,wasLocked)
            if wasLocked
                obj.pCoefficients = s.pCoefficients;
                obj.pNumChannels = s.pNumChannels;
            end
            loadObjectImpl@matlab.System(obj,s,wasLocked);
end

Примечание

Вам необходимо задать Access = protected для этого метода.

Использование системного объекта в MATLAB

Этот пример использует Системный объект, чтобы удалить шум из шумной импульсной последовательности. Длина фильтра скользящего среднего значения является 30 выборками. Если вы используете предопределенный dspdemo.MovingAverageFilter, замена, которые называют для MovingAverageFilter в конструкторе класса, например, movingAverageFilter = dspdemo.MovingAverageFilter('WindowLength',30);.

movingAverageFilter = MovingAverageFilter('WindowLength',30);
scope = dsp.TimeScope('SampleRate',1e3,...
    'TimeSpan',256 * .01,...
    'ShowGrid',true,...
    'NumInputPorts',2,...
    'LayoutDimensions',[2 1]);
for i=1:100
    input =  (1-2*randi([0 1],1)) * ones(256,1) + 0.5 * randn(256,1);
    output = movingAverageFilter(input);
    scope(input,output)
end

Методы индивидуальной настройки Simulink

Необходимо задать еще несколько методов, чтобы смочь использовать Системный объект в блоке Simulink MATLAB System. Эти методы не требуются, если вы используете Системный объект только в MATLAB. getOutputSizeImpl возвращает размеры каждого выходного порта. Для Системных объектов с одним входом и одним выводом и где вы хотите, чтобы размеры ввода и вывода были тем же самым, вы не должны реализовывать этот метод. В случае MovingAverageFilter существует один ввод и вывод, и размер каждого является тем же самым. Поэтому удалите этот метод из определения класса MovingAverageFilter.

getDiscreteStateSpecificationImpl возвращает размер, тип данных и сложность свойства. Это свойство должно быть свойством дискретного состояния. Необходимо задать этот метод, если Системный объект имеет свойства дискретного состояния и используется в блоке MATLAB System. В этом примере метод используется, чтобы задать свойство State.

function [sz,dt,cp] = getDiscreteStateSpecificationImpl(obj,~)
    inputSize = propagatedInputSize(obj,1);
    sz = [obj.WindowLength-1 inputSize(2)];
    dt =  propagatedInputDataType(obj,1);
    cp =  propagatedInputComplexity(obj,1);
end

Примечание

Вам необходимо задать Access = protected для этого метода.

Использование системного объекта в Simulink

Не поддерживаемый в MATLAB Online.

Чтобы использовать ваш Системный объект в модели Simulink, перетащите блок MATLAB System от библиотеки User-Defined Functions в Simulink к вашей модели.

Откройте диалоговое окно блока и определите имя Системного объекта к MovingAverageFilter. Модель ex_movingaverage_filter иллюстрирует использование Системного объекта в Simulink, чтобы отфильтровать шумную импульсную последовательность.

model = 'ex_movingaverage_filter';
open_system(model);

Запустите модель путем нажатия кнопки Run в модели или вводе:

sim(model)

Для просмотра документации необходимо авторизоваться на сайте