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