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

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

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

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

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

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

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

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

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

Блок MATLAB function: uniquify

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

Блок MATLAB function: avg

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

См. также

Похожие темы