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

О примере

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

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

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

Модель Simulink

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

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

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

Похожие темы