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

Введение

В этом примере показано, как создать Систему 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 во вкладке Simulation или путем ввода следующей команды в командную строку MATLAB:

sim(model)