Используйте сигнал Переменного Размера в алгоритме фильтрации

Данные переменного размера в блоках MATLAB function

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

  • Отфильтруйте значения сигналов, которые не уникальны в заданном допуске друг друга.

  • Насчитайте каждые два значения сигналов и выведите только получившиеся средние значения.

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

Исходный сигнал

Ограниченный полосой белый шумовой сигнал имеет эти свойства:

Размер шумового значения степени задает размер массива, который содержит значения сигналов. Этот массив 1 9 вектор из двойных значений.

Блок MATLAB function: uniquify

Этот блок отфильтровывает значения сигналов, которые не являются в допуске 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].

Блок MATLAB function: в среднем

Этот блок средние значения сигналов отфильтрован 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 блок выводит переменное количество значений сигналов каждый раз, когда он выполняется — приблизительно половина количества уникальных значений:

Смотрите также

Похожие темы