Questo esempio mostra come stabilire un’equivalenza tra convoluzione lineare e circolare.
La convoluzione lineare e circolare sono operazioni fondamentalmente diverse. Tuttavia, ci sono condizioni in cui la convoluzione lineare e circolare sono equivalenti. Stabilire questa equivalenza ha implicazioni importanti. Per due vettori, x
e y
, la convoluzione circolare è uguale alla trasformata di Fourier discreta inversa (DFT) del prodotto dei DFTs dei vettori. Conoscere le condizioni in cui la convoluzione lineare e circolare sono equivalenti consente di utilizzare il DFT per calcolare in modo efficiente le circonvoluzioni lineari.
La convoluzione lineare di un vettore N-punto, x
, e di un vettore L-punto, y
, ha lunghezza N + L – 1.
Affinché la convoluzione circolare di x e y sia equivalente, è necessario riempire i vettori con zeri di lunghezza almeno N + L – 1 prima di prendere il DFT. Dopo aver invertito il prodotto dei DFTs, mantenere solo i primi elementi N + L – 1.
Crea due vettori, x
e y
, e calcola la convoluzione lineare dei due vettori.
x = ;y = ;clin = conv(x,y);
L’uscita ha lunghezza 4+3-1.
Pad entrambi i vettori con zeri alla lunghezza 4+3-1. Ottieni il DFT di entrambi i vettori, moltiplica i DFT e ottieni il DFT inverso del prodotto.
xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));
La convoluzione circolare dei vettori a riempimento zero, xpad
e ypad
, è equivalente alla convoluzione lineare di x
e y
. Mantieni tutti gli elementi di ccirc
perché l’output ha lunghezza 4+3-1.
Tracciare l’output della convoluzione lineare e l’inverso del prodotto DFT per mostrare l’equivalenza.
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')
Tamponare i vettori alla lunghezza 12 e ottenere la convoluzione circolare utilizzando la DFT inversa del prodotto dei DFT. Mantenere solo i primi 4 + 3-1 elementi per produrre un risultato equivalente alla convoluzione lineare.
N = length(x)+length(y)-1;xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));ccirc = ccirc(1:N);
Il software Signal Processing Toolbox™ ha una funzione, cconv
, che restituisce la convoluzione circolare di due vettori. È possibile ottenere la convoluzione lineare di x
e y
utilizzando la convoluzione circolare con il seguente codice.
ccirc2 = cconv(x,y,6);
cconv
internamente utilizza la stessa procedura basata su DFT illustrata nell’esempio precedente.