В ходе работы мне пришлось столкнуться с тем, что блок «Convolution» в Simulink иногда работает не так, как хотелось бы. Делаешь ты свёртку в среде Matlab через conv(), получаешь прекрасный ответ, довольно урчишь, переходишь в Simulink и... И всё. Simulink на тебя орёт, что у тебя пытаются построиться 4к+ сигналов, ты сидишь, не понимая ничего, а попытки сделать это всё через блок «Matlab Fcn» приводят к лишней головной боли. Для использования блоков «Convolution» и «Discrete FIR filter» необходимо установить аддон «DSP System Toolbox». «Convolution» с английского переводится как свёртка. Если вы работаете с векторами, то этот блок просто производит свёртку двух векторов — a и b. Т.е. ваши сигналы на входе блока имеют размерности [Nx1] и [Mx1], на выходе блока вы получаете сигнал размерностью [(M+N-1)x1] по следующей формуле: Всё очень просто. Многие подумают, что этот блок делает всё то же самое, что и conv(a,b), однако это ошибка. Рассмотрим сейчас на примере. Cледующий код осуществляет свёртку двух векторов-строк в Матлаб. В результате получим вектор-строку: А вот свёртка тех же векторов-строк в Симулинк. Что-то не стыкуется, да? Однако если мы будем осуществлять свёртку векторов-столбцов, то результат будет одинаковым. Обратите внимание, что результатом кода Матлаб будет уже вектор-столбец: Следует запомнить, что свёртка векторов и матриц в Симулинке осуществляется по столбцам. Советую ради понимания попытаться осуществить свертку матрицы с вектором-столбцом и с вектором-строкой. Блок «Convolution» применяется, когда есть 2 сигнала-матрицы (вектор, как мы помним, частный случай матрицы). В случае, когда у вас хотя бы один сигнал имеет размерность [1x1] и на каждом шаге меняет своё значение, вы с огромной вероятностью получите что-то не то. Один или оба входных сигнала - поток скалярных значений, нужно осуществить свертку. Сколько из этих скалярных значений формируют нужный нам вектор(а) мы знаем, поэтому берем блок «Buffer» и ставим перед блоком «Convolution». Буфер накапливает N заданных значений, формирует вектор [Nx1] и отправляет его на блок свёртки. Для примера взят произвольный дискретный сигнал и буфер, накапливающий каждые 8 значений.  Все разобранные ранее случаи действительны тогда, когда размерность сигнала известна. А если нет? А если длительность сигнала возрастает с длительностью симуляции, а та может вообще никогда не завершиться? Тогда единственный выход, который остается — дискретный КИХ-фильтр. Дискретный КИХ-фильтр осуществляет фильтрацию каждого канала входного сигнала по отдельности в соответствии со следующей формулой: где  — коэффициенты фильтра,  — входной сигнал. Если сравнить эту формулу с формулой свёртки, то можно заметить, что они идентичны. Единственное отличие, что размерность входного сигнала нам не важна, т.е. она может быть бесконечной. Нам необходимо знать только вектор коэффициентов фильтра, а сигнал через него мы можем пропустить любой. Выглядеть это будет следующим образом: В качестве эксперимента можете сделать вот что: взять импульсную переходную характеристику какой-то модели в виде вектора, занести её в коэффициенты КИХ-фильтра, подать на фильтр и модель одинаковые сигналы и сравнить результат. Когда нужен КИХ-фильтр? когда нужно осуществить одну свёртку на протяжении всего времени моделирования; когда один из сигналов является бесконечным; когда мы не знаем длину одного из векторов. Использовать КИХ-фильтр для свёртки двух матриц нельзя. Если в качестве коэффициентов КИХ-фильтра взята матрица, то входной сигнал должен быть потоком скалярных значений. В таком случае мы, по сути, будем просто иметь несколько фильтров в одном блоке. В этой статье не были рассмотрены способы осуществления свёртки через интегралы, через блок «Matlab Fcn» и т.д. В большинстве случаев рассмотренных в статье способов будет достаточно. Ещё раз напомню, когда какие способы применимы: Необходимо осуществить много свёрток на каждом шаге моделирования - только блок «Convolution», одну за всё время моделирования - и блок «Convolution», и блок «Discrete FIR filter». Необходимо осуществить свёртку двух сигналов с известной размерностью - и блок «Convolution», и блок «Discrete FIR filter», сигнала с известной размерностью с сигналом с неизвестной или бесконечной - только блок «Discrete FIR filter». Необходимо осуществить свёртку сигналов, хотя бы один из которых является потоком скалярных значений - блок «Convolution» с буфером или блок «Discrete FIR filter».