www.gusucode.com > signal 案例源码程序 matlab代码 > signal/LinearAndCircularConvolutionExample.m
%% Linear and Circular Convolution % This example shows how to establish an equivalence between linear and % circular convolution. % % Linear and circular convolution are fundamentally different operations. % However, there are conditions under which linear and circular convolution % are equivalent. Establishing this equivalence has important implications. % For two vectors, |x| and |y|, the circular convolution is equal to the % inverse discrete Fourier transform (DFT) of the product of the vectors' % DFTs. Knowing the conditions under which linear and circular convolution % are equivalent allows you to use the DFT to efficiently compute linear % convolutions. % % The linear convolution of an _N_-point vector, |x|, and an _L_-point % vector, |y|, has length _N_ + _L_ - 1. % % For the circular convolution of _x_ and _y_ to be equivalent, you must % pad the vectors with zeros to length at least _N_ + _L_ - 1 before you % take the DFT. After you invert the product of the DFTs, retain only the % first _N_ + _L_ - 1 elements. %% % Create two vectors, |x| and |y|, and compute the linear convolution of the % two vectors. x = [2 1 2 1]; y = [1 2 3]; clin = conv(x,y); %% % The output has length 4+3-1. % % Pad both vectors with zeros to length 4+3-1. Obtain the DFT of both % vectors, multiply the DFTs, and obtain the inverse DFT of the product. xpad = [x zeros(1,6-length(x))]; ypad = [y zeros(1,6-length(y))]; ccirc = ifft(fft(xpad).*fft(ypad)); %% % The circular convolution of the zero-padded vectors, |xpad| and |ypad|, % is equivalent to the linear convolution of |x| and |y|. You retain all % the elements of |ccirc| because the output has length 4+3-1. % % Plot the output of linear convolution and the inverse of the DFT product % to show the equivalence. 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') %% % Pad the vectors to length 12 and obtain the circular convolution using % the inverse DFT of the product of the DFTs. Retain only the first 4+3-1 % elements to produce an equivalent result to linear convolution. 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); %% % The Signal Processing Toolbox(TM) software has a function, |cconv|, that % returns the circular convolution of two vectors. You can obtain the % linear convolution of |x| and |y| using circular convolution with the % following code. ccirc2 = cconv(x,y,6); %% % |cconv| internally uses the same DFT-based procedure illustrated in the % previous example.