Этот пример использует вектор переменного размера, чтобы сохранить значения сигнала белого шума. Размер вектора может варьироваться во время исполнения, потому что значения сигналов обрезаются функциями, которые:
Отфильтровывайте значения сигналов, которые не являются уникальными в пределах заданного допуска друг к другу.
Среднее значение через каждые два значений сигналов и вывод только полученного средства.

В этой модели блок Band-Limited White Noise генерирует набор нормально распределенных случайных значений в качестве источника сигнала белого шума. Область Функции MATLAB uniquify отфильтровывает значения сигналов, которые не являются уникальными в пределах заданного допуска друг к другу. Затем откроется функция MATLAB Function avg выводит среднее заданное количество уникальных значений сигналов. В блоках Scope отображаются выходы из uniquify функции и avg функция.
Ограниченный полосой белый сигнал шума имеет следующие свойства:

Размер значения степени шума задает размер массива, который содержит значения сигналов. Этот массив является вектором 1 на 9 с двойными значениями.
Этот блок отфильтровывает значения сигналов, которые не находятся в пределах допуска 0,2 друг от друга. Вот код:
function y = uniquify(u) %#codegen y = emldemo_uniquetol(u,0.2);
The uniquify функция вызывает внешний MATLAB® функциональные emldemo_uniquetol для фильтрации значений сигналов. uniquify передает вектор 1 на 9 значения сигналов белого шума в качестве первого аргумента и значение допуска в качестве второго аргумента. Вот код для emldemo_uniquetol:
function B = emldemo_uniquetol(A,tol) %#codegen A = sort(A); coder.varsize('B',[1 100]); B = A(1); k = 1; for i = 2:length(A) if abs(A(k) - A(i)) > tol B = [B A(i)]; k = i; end end
emldemo_uniquetol возвращает отфильтрованные значения A в векторе выхода B так что abs(B(i) - B(j)) > tol для всех i и j. Каждый раз Simulink® дискретизирует блок Band-Limited White Noise, он генерирует другой набор случайных значений для A. В результате emldemo_uniquetol может выдавать разное количество выходных сигналов в B каждый раз, когда он вызывается. Чтобы разрешить B для размещения переменного количества элементов, emldemo_uniquetol объявляет его как данные переменного размера с явной верхней границей:
coder.varsize('B',[1 100]);В этом операторе, coder.varsize объявляет B как вектор, чья первая размерность фиксирован на 1 и чьё второе измерение может вырасти до максимального размера 100. Соответственно, выводите y от uniquify блок также должен быть переменного размера, чтобы он мог передать значения, возвращенные от emldemo_uniquetol в возможности Уникальные значения. Вот свойства y:

Для выходов переменного размера необходимо задать явный размер и верхнюю границу, показанную здесь следующим [1 9].
Этот блок рассчитывает средние значения сигналов, фильтрованные uniquify блокировать с использованием условий, изложенных в этой таблице.
| Состояние | Результат |
|---|---|
| Количество сигналов больше 1 и делится на 2. | Блок MATLAB Function усредняет каждую последовательную пару значений. |
| Количество сигналов больше 1, но не делится на 2. | Блок MATLAB Function отбрасывает первое (самое маленькое) значение и усредняет оставшиеся последовательные пары. |
| Есть только один сигнал. | Блок MATLAB Function возвращает значение без изменений. |
The avg функция выводит результаты в возможности «Средние значения». Вот код:
function y = avg(u) %#codegen if numel(u) == 1 y = u; else k = numel(u)/2; if k ~= floor(k) u = u(2:numel(u)); end y = emldemo_navg(u,2); end
Оба входных u и выход y от avg объявлены как векторы переменного размера, потому что количество элементов изменяется в зависимости от того, как uniquify функциональный блок фильтрует значения сигналов. Входные u наследует размер от выхода uniquify.

The avg функция вызывает внешнюю функцию MATLAB emldemo_navg вычислить среднее значение каждые два последовательных значений сигналов. Вот код для emldemo_navg:
function B = emldemo_navg(A,n) %#codegen assert(n>=1 && n<=numel(A)); B = zeros(1,numel(A)/n); k = 1; for i = 1 : numel(A)/n B(i) = mean(A(k + (0:n-1))); k = k + n; end
Симуляция модели дает следующие результаты:
The uniquify блок выводит переменное количество значений сигналов каждый раз, когда он выполняет:

The avg блок выводит переменное количество значений сигналов каждый раз, когда он выполняет - примерно половину от количества уникальных значений:
