Предположим, у нас есть векторы:
u = [1 2 1];
v = [1 1 0 0 0 2 ];
так для \$ x [n] = u [n] \ast v [n] \$, если векторные операции разбиты
х [0] = 1 * 1
х [1] = 1 * 2 + 1 * 1
х [2] = 1 * 1 + 1 * 2 + 0 * 1
х [3] = 1 * 1 + 0 * 2 + 0 * 1
х [4] = 0 * 1 + 0 * 2 + 0 * 1
х [5] = 0 * 1 + 0 * 2 + 2 * 1
х [6] = 0 * 1 + 2 * 2
х [7] = 2 * 1
или с нулевым заполнением:
x [0] = 0 * 1 + 0 * 2 + 1 * 1
x [1] = 0 * 1 + 1 * 2 + 1 * 1
х [2] = 1 * 1 + 1 * 2 + 0 * 1
х [3] = 1 * 1 + 0 * 2 + 0 * 1
х [4] = 0 * 1 + 0 * 2 + 0 * 1
х [5] = 0 * 1 + 0 * 2 + 2 * 1
х [6] = 0 * 1 + 2 * 2 + 0 * 1
х [7] = 2 * 1 + 0 * 2 + 0 * 1
Обратите внимание, что 1) Вектор x больше, чем u и v, и для начальных операций 2) В начальном и конечном случаях вам нужно дополнить нулями
если
u = [1 2 1];
v = [0 0 1 1 0 0 0 2 0 0 ];
x = conv(u,v)
x = [0 0 1 3 3 1 0 2 4 2 0 0]; % result for x
или же
v =[0 0 0 1 1 0 0 0 2 0 0 0];
x = conv(u,v)
x = [0 0 0 1 3 3 1 0 2 4 2 0 0 0]; % result for x
это имеет значение для размера вектора, если есть нули, но не значения, которые свернуты. Это называется заполнением нулями, при свертке нужно обрабатывать крайние случаи.
(Также помните, что нулевой элемент Matlab начинается с единицы, я использовал математическую запись с первым элементом векторов, начинающимся с нуля)
Так почему я тебе это говорю?
потому что, когда вы делаете свертку на компьютере, крайние случаи могут сбивать с толку.
когда вы делаете эту операцию x = a *(u -u [n-12]); и вы запрашиваете u [n-12], который для matlab равен u [-11] для первого значения массива, и в памяти, которая не существует для этого массива. Таким образом, вам нужно обнулить и \ или усечь и понять, что граничные случаи различны для свертки.
Я приведу пример для x [n] = u [n] + u [n-3]:
u = [ 1 2 3 4 5 6 ];
x = u + [u(3:6) 0 0 ];