exponenta event banner

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

Данные переменного размера в функциональных блоках MATLAB

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

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

  • Усреднять каждые два значения сигнала и выводить только результирующее средство.

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

Сигнал источника

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

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

Функциональный блок MATLAB: уникальность

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

Функциональный блок MATLAB: avg

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

См. также

Связанные темы