Per risposta impulsiva si intende la risposta del sistema a un impulso unitario.
u(n): 1 if n == 0, else 0
Per il sistema s
vale:
h(n) = s(u(n))
h(n)
sarà quindi la risposta impulsiva del sistema s
.
Il processo di convoluzione viene utilizzato nel calcolo dell'uscita di un sistema di filtri digitali (FIR, IIR).
Sia x(n)
il segnale d'ingresso ed h(n)
la risposta impulsiva del sistema, entrambe
nel dominio temporale, abbiamo che il segnale di uscita è dato dalla seguente
relazione:
Il processo di convoluzione gode delle seguenti proprietà:
- commutativa
- associativa
- distributiva
Vale la seguente relazione:
Ovvero quello che nel dominio del tempo è una convoluzione si trasforma in un prodotto nel dominio delle frequenze.
Il teorema vale anche al contrario, ovvero la convoluzione nel dominio della frequenza è un prodotto nel dominio del tempo.
DTFT(h(n))
è la risposta in frequenza del sistema, mentre DTFT(x(n))
è lo
spettro del segnale.
octave:1> conv([1,1,1],[3,3,53,3])
ans =
3 6 59 59 56 3
Com'è possibile notare la lunghezza della sequenza di uscita è data dalla somma
delle lunghezze delle sequenze di input meno 1. (3+4-1 = 6)
x = { 1, 2, 5, -4 }
y = { 1, -1, 2, -2 }
1 | 2 | 5 | -4 |
1 | -1 | 2 | -2 |
------------------------
1 | 2 | 5 | -4 |
| -1 | -2 | -5 | 4 |
| 2 | 4 | 10 | -8 |
| -2 | -4 | -10 | 8 |
------------------------------------------
1 | 1 | 5 | -7 | 10 | -18 | 8 |
La convoluzione circolare è un tipo di convoluzione che lavora con sequenze periodiche.
A differenza della convoluzione lineare, quella circolare produce una sequenza
periodica che risente dei ritorni delle somme, per risolvere questo problema è
possibile rendere le sequenze di input periodiche di periodo (N+M-1)
con N e M
le durate delle sequenze originali di input, tramite l'aggiunta di 0 in coda
alle sequenze di input stesse.
La convoluzione circolare veloce si ottiene tramite IFFT del prodotto delle FFT delle sequenze periodiche ottenute aggiungendo zeri.
octave:3> ifft(fft([1,1,1,0,0,0]).* fft([3,3,53,3,0,0]))
ans =
3 6 59 59 56 3
x = { 1, 2, 5, -4 }
y = { 1, -1, 2, -2 }
1 | 2 | 5 | -4 |
1 | -1 | 2 | -2 |
------------------------
1 | 2 | 5 | -4 |
4 | -1 | -2 | -5 |
10 | -8 | 2 | 4 |
-4 | -10 | 8 | -2 |
------------------------
11 | -17 | 13 | -7 |
Quando si conosce la risposta impulsiva causuale h(n)
di un sistema e un segnale
di uscita y(n)
prodotto attraverso il sistema, è possibile risalire al segnale di
ingresso x(n)
tramite la seguente relazione:
Il processo viene chiamato deconvoluzione.
Quando la sequenza x(n)
ha durata infinita, è possibile spezzare x(n)
in sezioni
che verranno elaborate tramite convoluzione (circolare). Esistono due metodi:
- overlap-add
- overlap-save
Nel metodo overlap add si spezza X(n)
in sequenze adiacenti Xm(n)
di durata N
,
si vanno poi ad aggiungere M-1
zeri per avere una sequenza di durata L = M+N-1
(M
in questo caso si riferisce alla durata del h(n)
), infine si calcola la
convoluzione tra Xm(n)
e h(n)
tramite FFT, prodotto e IFFT, e infine si sommano
gli M-1
campioni finali della Ym(n)
ottenuta con i primi (M-1)
campioni della
sequenza di uscita successiva.
Yn - - - + + +
Yn+1 + + + - - -
Nel metodo overlap save si spezza X(n)
in sequenze adiacenti Xm(n)
di durata L
,
senza aggiungere zeri ma semplicemente considerando il valore dei campioni.
In questo modo, si ha che i primi (M-1)
campioni di Xm(n)
sono gli stessi (M-1)
ultimi campioni di Xm-1(n)
.
Applicando la convoluzione circolare in questa maniera abbiamo che i primi (M-1)
campioni della sequenza di output sono affetti da aliasing temporale, di
conseguenza li scartiamo a favore degli ultimi (M-1)
campioni della sequenza
precedente.
Yn / / / - - -
Yn+1 / / / - - -
Utilizzare una fft
a decimazione nella frequenza e una ifft
a decimazione nel
tempo permetterà di ottenere una sequenza di output ordinata correttamente.
Se si opera con sequenze reali conviene utilizzare una sola fft
come possiamo vedere qui