Tardío, pero tal vez aún pueda ayudar a alguien: es lo mismo que multiplicar dos números, pero en lugar de llevar, usas el mismo lugar para el número entero resultante, con la longitud del resultado longitud (primero) + longitud (segundo) -1.
Ej .: 14 y 23 , ambas longitud 2 = > la longitud final es 2 + 2 - 1 = 3 . Normalmente, 14*23 = 14*3 + 14*20 , pero el primer número da como resultado un carry: 14*3 = 4*3 + 10*3 = 42 . En la convolución, usted trata a 4*3 no como 2 carry 1 , sino como 12 , un número que ocupa el mismo lugar que un dígito. Lo que significa que el primer número sería: [3, 12] , y el segundo sería [2, 8, 0] (desplazado un dígito). Y ahora solo tienes que agregarlos, lugar por lugar: [2, 8+3, 12+0] = [2, 11, 12] .
Si ayuda, así es como se vería en C / C ++, considerando que el primer vector es a, el segundo b y la salida y:
for(int i=0; i<a.size(); ++i)
for(int j=0; j<b.size(); ++j)
y[i+j] += a[i]*b[j];
Como puede ver, toma el primer elemento del primer vector (el lugar del "dígito") y lo multiplica, secuencialmente, con cada elemento del segundo. Luego se incrementa, el segundo elemento se multiplica con cada elemento del primer vector, y así sucesivamente.
Para su caso, convoluciona con la señal dirac, por lo tanto un 1 (tal vez cero rellenado, depende de cuánto tiempo desea que la señal sea). Cualquier número multiplicado con 1 es en sí mismo, por lo que estuvo correcto en su comentario. Si tuviera, por ejemplo, una entrada de 2 muestras como [2, 5] , y el resultado hubiera sido:
[3, 4, -4, -3] *
[2, 5] =
-----------------------
[15, 20, -20, -15] +
[6, 8, -8, -6, 0] =
-----------------------
[6, 23, 12, -26, -15]