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