Este ejemplo muestra cómo establecer una equivalencia entre convolución lineal y circular.
La convolución lineal y circular son operaciones fundamentalmente diferentes. Sin embargo, hay condiciones en las que la convolución lineal y circular son equivalentes. Establecer esta equivalencia tiene implicaciones importantes. Para dos vectores, x
y y
, la convolución circular es igual a la transformada discreta inversa de Fourier (DFT) del producto de las DFT de los vectores. Conocer las condiciones en las que las convoluciones lineales y circulares son equivalentes le permite utilizar el DFT para calcular de manera eficiente las convoluciones lineales.
La convolución lineal de un vector de punto N, x
, y un vector de punto L, y
, tiene longitud N + L-1.
Para que la convolución circular de x e y sea equivalente, debe rellenar los vectores con ceros a una longitud de al menos N + L – 1 antes de tomar el DFT. Después de invertir el producto de las DFTs, conserve solo los primeros elementos N + L – 1.
Cree dos vectores, x
y y
, y calcule la convolución lineal de los dos vectores.
x = ;y = ;clin = conv(x,y);
La salida tiene una longitud de 4+3-1.
Rellene ambos vectores con ceros de longitud 4 + 3-1. Obtenga el DFT de ambos vectores, multiplique los DFT y obtenga el DFT inverso del producto.
xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));
La convolución circular de los vectores con relleno cero, xpad
y ypad
, es equivalente a la convolución lineal de x
y y
. Conserva todos los elementos de ccirc
porque la salida tiene una longitud de 4 + 3-1.
Trace la salida de la convolución lineal y la inversa del producto DFT para mostrar la equivalencia.
subplot(2,1,1)stem(clin,'filled')ylim()title('Linear Convolution of x and y')subplot(2,1,2)stem(ccirc,'filled')ylim()title('Circular Convolution of xpad and ypad')
Rellene los vectores a la longitud 12 y obtenga la convolución circular utilizando el DFT inverso del producto de los DFT. Retenga solo los primeros 4 + 3-1 elementos para producir un resultado equivalente a la convolución lineal.
N = length(x)+length(y)-1;xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));ccirc = ccirc(1:N);
El software Signal Processing Toolbox™ tiene una función, cconv
, que devuelve la convolución circular de dos vectores. Puede obtener la convolución lineal de x
y y
utilizando la convolución circular con el siguiente código.
ccirc2 = cconv(x,y,6);
cconv
internamente utiliza la misma DFT procedimiento se ilustra en el ejemplo anterior.