Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Вступительное слово
В ходе работы мне пришлось столкнуться с тем, что блок «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] по следующей формуле:
Всё очень просто.
Многие подумают, что этот блок делает всё то же самое, что и 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»
Дискретный КИХ-фильтр осуществляет фильтрацию каждого канала входного сигнала по отдельности в соответствии со следующей формулой:
где — коэффициенты фильтра, — входной сигнал.
Если сравнить эту формулу с формулой свёртки, то можно заметить, что они идентичны. Единственное отличие, что размерность входного сигнала нам не важна, т.е. она может быть бесконечной. Нам необходимо знать только вектор коэффициентов фильтра, а сигнал через него мы можем пропустить любой. Выглядеть это будет следующим образом:
В качестве эксперимента можете сделать вот что: взять импульсную переходную характеристику какой-то модели в виде вектора, занести её в коэффициенты КИХ-фильтра, подать на фильтр и модель одинаковые сигналы и сравнить результат.
Когда нужен КИХ-фильтр?
когда нужно осуществить одну свёртку на протяжении всего времени моделирования;
когда один из сигналов является бесконечным;
когда мы не знаем длину одного из векторов.
Использовать КИХ-фильтр для свёртки двух матриц нельзя. Если в качестве коэффициентов КИХ-фильтра взята матрица, то входной сигнал должен быть потоком скалярных значений. В таком случае мы, по сути, будем просто иметь несколько фильтров в одном блоке.
Заключение
В этой статье не были рассмотрены способы осуществления свёртки через интегралы, через блок «Matlab Fcn» и т.д. В большинстве случаев рассмотренных в статье способов будет достаточно.
Ещё раз напомню, когда какие способы применимы:
Необходимо осуществить много свёрток на каждом шаге моделирования - только блок «Convolution», одну за всё время моделирования - и блок «Convolution», и блок «Discrete FIR filter».
Необходимо осуществить свёртку двух сигналов с известной размерностью - и блок «Convolution», и блок «Discrete FIR filter», сигнала с известной размерностью с сигналом с неизвестной или бесконечной - только блок «Discrete FIR filter».
Необходимо осуществить свёртку сигналов, хотя бы один из которых является потоком скалярных значений - блок «Convolution» с буфером или блок «Discrete FIR filter».