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]