Cet exemple montre comment établir une équivalence entre convolution linéaire et circulaire.
La convolution linéaire et circulaire sont des opérations fondamentalement différentes. Cependant, il existe des conditions dans lesquelles la convolution linéaire et circulaire sont équivalentes. L’établissement de cette équivalence a des implications importantes. Pour deux vecteurs, x
et y
, la convolution circulaire est égale à la transformée de Fourier discrète inverse (DFT) du produit des DFTS des vecteurs. Connaître les conditions dans lesquelles les convolutions linéaires et circulaires sont équivalentes vous permet d’utiliser le DFT pour calculer efficacement les convolutions linéaires.
La convolution linéaire d’un vecteur à N points, x
, et d’un vecteur à L points, y
, a une longueur N + L-1.
Pour que la convolution circulaire de x et y soit équivalente, vous devez tamponner les vecteurs avec des zéros à la longueur au moins N + L-1 avant de prendre la DFT. Après avoir inversé le produit des DFTS, ne conservez que les premiers éléments N +L-1.
Créez deux vecteurs, x
et y
, et calculez la convolution linéaire des deux vecteurs.
x = ;y = ;clin = conv(x,y);
La sortie a une longueur 4 + 3-1.
Tamponnez les deux vecteurs avec des zéros à la longueur 4 + 3-1. Obtenez la DFT des deux vecteurs, multipliez les DFT et obtenez la DFT inverse du produit.
xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));
La convolution circulaire des vecteurs capitonnés par zéro, xpad
et ypad
, est équivalente à la convolution linéaire de x
et y
. Vous conservez tous les éléments de ccirc
car la sortie a une longueur 4 + 3-1.
Tracez la sortie de la convolution linéaire et l’inverse du produit DFT pour montrer l’équivalence.
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')
Tamponnez les vecteurs à la longueur 12 et obtenez la convolution circulaire en utilisant la DFT inverse du produit des DFT. Ne conservez que les 4 +3-1 premiers éléments pour produire un résultat équivalent à la convolution linéaire.
N = length(x)+length(y)-1;xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));ccirc = ccirc(1:N);
Le logiciel Signal Processing Toolbox™ a une fonction, cconv
, qui renvoie la convolution circulaire de deux vecteurs. Vous pouvez obtenir la convolution linéaire de x
et y
en utilisant la convolution circulaire avec le code suivant.
ccirc2 = cconv(x,y,6);
cconv
utilise en interne la même procédure basée sur DFT illustrée dans l’exemple précédent.