Некоторые способы свёртки в Simulink

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Вступительное слово

В ходе работы мне пришлось столкнуться с тем, что блок «Convolution» в Simulink иногда работает не так, как хотелось бы. Делаешь ты свёртку в среде Matlab через conv(), получаешь прекрасный ответ, довольно урчишь, переходишь в Simulink и... И всё. Simulink на тебя орёт, что у тебя пытаются построиться 4к+ сигналов, ты сидишь, не понимая ничего, а попытки сделать это всё через блок «Matlab Fcn» приводят к лишней головной боли.

Для использования блоков «Convolution» и «Discrete FIR filter» необходимо установить аддон «DSP System Toolbox».

Блок «Convolution»

«Convolution» с английского переводится как свёртка. Если вы работаете с векторами, то этот блок просто производит свёртку двух векторов — a и b. Т.е. ваши сигналы на входе блока имеют размерности [Nx1] и [Mx1], на выходе блока вы получаете сигнал размерностью [(M+N-1)x1] по следующей формуле:

y(k) = \sum_n u(n-k)v(k)

Всё очень просто.

Многие подумают, что этот блок делает всё то же самое, что и conv(a,b), однако это ошибка. Рассмотрим сейчас на примере.

Cледующий код осуществляет свёртку двух векторов-строк в Матлаб.

a = [2 4 6];
b = [1 3 5];
c = conv(a,b);

В результате получим вектор-строку:

с = [2 10 28 38 30]

А вот свёртка тех же векторов-строк в Симулинк.

Что-то не стыкуется, да? Однако если мы будем осуществлять свёртку векторов-столбцов, то результат будет одинаковым.

a = [2; 4; 6];
b = [1; 3; 5];
c = conv(a,b);

Обратите внимание, что результатом кода Матлаб будет уже вектор-столбец:

c = [2; 10; 28; 38; 30]

Следует запомнить, что свёртка векторов и матриц в Симулинке осуществляется по столбцам. Советую ради понимания попытаться осуществить свертку матрицы с вектором-столбцом и с вектором-строкой.

Блок «Convolution» применяется, когда есть 2 сигнала-матрицы (вектор, как мы помним, частный случай матрицы). В случае, когда у вас хотя бы один сигнал имеет размерность [1x1] и на каждом шаге меняет своё значение, вы с огромной вероятностью получите что-то не то.

Блок «Convolution» с буфером перед ним

Один или оба входных сигнала - поток скалярных значений, нужно осуществить свертку. Сколько из этих скалярных значений формируют нужный нам вектор(а) мы знаем, поэтому берем блок «Buffer» и ставим перед блоком «Convolution». Буфер накапливает N заданных значений, формирует вектор [Nx1] и отправляет его на блок свёртки.

Для примера взят произвольный дискретный сигнал и буфер, накапливающий каждые 8 значений.

Все разобранные ранее случаи действительны тогда, когда размерность сигнала известна. А если нет? А если длительность сигнала возрастает с длительностью симуляции, а та может вообще никогда не завершиться? Тогда единственный выход, который остается — дискретный КИХ-фильтр.

Блок «Discrete FIR filter»

Дискретный КИХ-фильтр осуществляет фильтрацию каждого канала входного сигнала по отдельности в соответствии со следующей формулой:

y = \sum_{i=0}^nb_ix(n-i)

где b_i — коэффициенты фильтра, x — входной сигнал.

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

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

Когда нужен КИХ-фильтр?

  • когда нужно осуществить одну свёртку на протяжении всего времени моделирования;

  • когда один из сигналов является бесконечным;

  • когда мы не знаем длину одного из векторов.

Использовать КИХ-фильтр для свёртки двух матриц нельзя. Если в качестве коэффициентов КИХ-фильтра взята матрица, то входной сигнал должен быть потоком скалярных значений. В таком случае мы, по сути, будем просто иметь несколько фильтров в одном блоке.

Заключение

В этой статье не были рассмотрены способы осуществления свёртки через интегралы, через блок «Matlab Fcn» и т.д. В большинстве случаев рассмотренных в статье способов будет достаточно.

Ещё раз напомню, когда какие способы применимы:

  1. Необходимо осуществить много свёрток на каждом шаге моделирования - только блок «Convolution», одну за всё время моделирования - и блок «Convolution», и блок «Discrete FIR filter».

  2. Необходимо осуществить свёртку двух сигналов с известной размерностью - и блок «Convolution», и блок «Discrete FIR filter», сигнала с известной размерностью с сигналом с неизвестной или бесконечной - только блок «Discrete FIR filter».

  3. Необходимо осуществить свёртку сигналов, хотя бы один из которых является потоком скалярных значений - блок «Convolution» с буфером или блок «Discrete FIR filter».

Источник: https://habr.com/ru/post/655129/


Интересные статьи

Интересные статьи

17 июня состоится Online LoGeek Night QA. На нем наши тестировщики расскажут о разных способах хранения данных в автотестах с примерами на Java, а также об автоматизации ...
Киберфизические атаки — это особая категория кибератак, которые преднамеренно или нет также негативно влияют на физическое пространство нацеливаясь на вычислительную и ко...
Периодически мне в разных вариантах задают вопрос, который «в среднем» звучит так: «что лучше: заказать интернет-магазин на бесплатной CMS или купить готовое решение на 1С-Битрикс и сделать магазин на...
В Челябинске проходят митапы системных администраторов Sysadminka, и на последнем из них я делал доклад о нашем решении для работы приложений на 1С-Битрикс в Kubernetes. Битрикс, Kubernetes, Сep...
Реализация ORM в ядре D7 — очередная интересная, перспективная, но как обычно плохо документированная разработка от 1с-Битрикс :) Призвана она абстрагировать разработчика от механики работы с табл...