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

О примере

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

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

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

Модель Simulink

Откройте модель в качестве примера путем ввода emldemo_process_signal в командной строке MATLAB®. Модель содержит следующие блоки:

Simulink® BlockОписание
Ограниченный полосой Белый шумГенерирует набор нормально распределенных случайных значений как источник белого шумового сигнала.
MATLAB Function uniquifyОтфильтровывает значения сигналов, которые не уникальны для в заданном допуске друг друга.
MATLAB Function avgВыводит среднее значение конкретного количества уникальных значений сигналов.
Уникальные значенияОпределите объем, который отображает уникальные значения сигналов выход от 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 блокируйтесь можно следующим образом:

Если количество значений сигналовБлок MATLAB function
> 1 и делимый 2Составляет в среднем каждую последовательную пару значений
> 1, но не делимый 2Пропускает первое (наименьшее) значение, и насчитайте остающиеся последовательные пары
= 1Возвращает неизменное значение

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

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

Похожие темы