Этот пример использует вектор переменного размера, чтобы сохранить значения сигнала белого шума. Размер вектора может варьироваться во время исполнения, потому что значения сигналов обрезаются функциями, которые:
Отфильтровывайте значения сигналов, которые не являются уникальными в пределах заданного допуска друг к другу.
Среднее значение через каждые два значений сигналов и вывод только полученного средства.
В этой модели блок 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
блок выводит переменное количество значений сигналов каждый раз, когда он выполняет - примерно половину от количества уникальных значений: