Этот пример показывает, как создать Систему 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
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
Метод 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 для этого метода.
Этот пример использует Системный объект, чтобы удалить шум из шумной импульсной последовательности. Длина фильтра скользящего среднего значения является 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 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 для этого метода.
Не поддерживаемый в MATLAB Online.
Чтобы использовать ваш Системный объект в модели Simulink, перетащите блок MATLAB System от библиотеки User-Defined Functions в Simulink к вашей модели.
Откройте диалоговое окно блока и определите имя Системного объекта к MovingAverageFilter
. Модель ex_movingaverage_filter
иллюстрирует использование Системного объекта в Simulink, чтобы отфильтровать шумную импульсную последовательность.
model = 'ex_movingaverage_filter';
open_system(model);
Запустите модель путем нажатия кнопки Run в модели или вводе:
sim(model)