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

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

Размер значения мощности шума определяет размер матрицы, в которой хранятся значения сигнала. Этот массив является вектором двойных значений 1 на 9.
Этот блок отфильтровывает значения сигналов, которые не находятся в пределах допуска 0,2 друг от друга. Вот код:
function y = uniquify(u) %#codegen y = emldemo_uniquetol(u,0.2);
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 ® производит выборку блока белого шума с ограниченным диапазоном, он генерирует другой набор случайных значений для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 усредняет каждую последовательную пару значений. |
| Число сигналов больше 1, но не делится на 2. | Функциональный блок MATLAB сбрасывает первое (наименьшее) значение и усредняет оставшиеся последовательные пары. |
| Есть ровно один сигнал. | Блок MATLAB Function возвращает значение без изменений. |
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.

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
Моделирование модели дает следующие результаты.
uniquify блок выводит переменное число значений сигнала каждый раз при выполнении:

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