Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Convolución lineal y circular

Este ejemplo muestra cómo establecer una equivalencia entre convolución lineal y circular.

La convolución lineal y circular son, fundamentalmente, operaciones distintas. Sin embargo, existen condiciones en las que la convolución lineal y circular son equivalentes. Establecer esta equivalencia tiene implicaciones importantes. Para dos vectores, x e y, la convolución circular es igual a la transformada de Fourier discreta inversa (DFT) del producto de las DFT de los vectores. Conocer las condiciones en las que la convolución lineal y circular son equivalentes le permite utilizar la DFT para calcular de forma eficiente las convoluciones lineales.

La convolución lineal de un vector de N puntos, x, y un vector de L puntos, y, tiene una longitud de N + L - 1.

Para que la convolución circular de x e y sea equivalente, debe rellenar los vectores con ceros hasta la longitud N + L - 1 como mínimo antes de tomar la DFT. Después de invertir el producto de las DFT, conserve solo los primeros elementos N + L - 1.

Cree dos vectores, x e y, y calcule la convolución lineal de ambos.

x = [2 1 2 1];
y = [1 2 3];
clin = conv(x,y);

El resultado tiene una longitud de 4+3-1.

Rellene ambos vectores con ceros hasta la longitud 4+3-1. Obtenga la DFT de ambos vectores, multiplique las DFT y obtenga la DFT inversa del producto.

xpad = [x zeros(1,6-length(x))];
ypad = [y zeros(1,6-length(y))];
ccirc = ifft(fft(xpad).*fft(ypad));

La convolución circular de los vectores rellenados con ceros, xpad e ypad, equivale a la convolución lineal de x e y. Conserva todos los elementos de ccirc porque el resultado tiene una longitud de 4+3-1.

Represente el resultado de la convolución lineal y la inversa del producto de la DFT para mostrar la equivalencia.

subplot(2,1,1)
stem(clin,'filled')
ylim([0 11])
title('Linear Convolution of x and y')

subplot(2,1,2)
stem(ccirc,'filled')
ylim([0 11])
title('Circular Convolution of xpad and ypad')

Rellene los vectores hasta la longitud 12 y obtenga la convolución circular utilizando la DFT inversa del producto de las DFT. Conserve solo los primeros elementos 4+3-1 para producir un resultado equivalente a la convolución lineal.

N = length(x)+length(y)-1;
xpad = [x zeros(1,12-length(x))];
ypad = [y zeros(1,12-length(y))];
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 e y utilizando la convolución circular con el siguiente código.

ccirc2 = cconv(x,y,6);

cconv utiliza internamente el mismo procedimiento basado en la DFT que se ilustra en el ejemplo anterior.