Summary: Sistemi a tempo (spazio) discreto e relativa descrizione mediante risposta all'impulso. L'operatore di convoluzione. Filtraggio.
Per i nostri scopi, un
sistema è un qualsiasi blocco di elaborazione che, presa in
ingresso una sequenza di campioni
In questo modulo ci occupiamo soltanto di sistemi lineari, intendendo con questo che vale il
Un altro concetto importante è quello della invarianza rispetto al tempo ovvero, analogamente, rispetto allo spazio.
Una connessione in serie di blocchi lineari e invarianti rispetto al tempo (Linear Time-Invariant - LTI) è essa stessa un sistema lineare e invariante rispetto al tempo, e l'ordine dei blocchi può essere variato senza che cambi il comportamento ingresso-uscita complessivo.
I sistemi LTI possono essere descritti completamente dalla risposta che forniscono ad un impulso di ampiezza unitaria.
Chiamiamo
Per avere una analogia fisica, si può pensare alla percussione a intervalli regolari di un piatto musicale. La risposta ad ogni singolo colpo si protrae nel tempo e si sovrappone alle risposte ad ogni colpo successivo.
Si consideri il segnale
Per generalizzazione dell'esempio Esempio 1 si può definire l'operazione di convoluzione.
L'operazione di convoluzione può essere pienamente intesa attraverso la costruzione esplicita di qualche esempio di prodotto di convoluzione. Il modulo Discrete-Time Convolution offre la costruzione grafica di un esempio e rimanda a ulteriori esempi disponibili in rete.
Le proprietà dell'operazione di convoluzione sono ben illustrate nel modulo Properties of Convolution. Quella più interessante in questa sede è la estensione:
Se
Quindi il segnale prodotto di convoluzione sarà più lungo sia del segnale di ingresso sia della risposta all'impulso.
Un'altra proprietà interessante è la commutatività dell'operatore di convoluzione, secondo la quale segnale di ingresso e risposta all'impulso possono scambiare i loro ruoli senza che cambi il segnale di uscita.
La trasformata di Fourier della risposta all'impulso viene chiamata Risposta in Frequenza e si indica con
La risposta in frequenza sagoma, in maniera moltiplicativa, lo spettro del segnale di ingresso o, in altri termini, opera un filtraggio esaltando talune frequenze ed attenuandone altre. Il filtraggio può operare anche sulla fase delle componenti spettrali, ritardandole in misura diversa.
Il filtraggio può avvenire nel dominio del tempo (o dello spazio), mediante operazione di convoluzione, o nel dominio delle frequenze mediante moltiplicazione per la risposta in frequenza.
Si utilizzi la risposta all'impulso nulla ovunque esclusi gli istanti filtra() del Sound Chooser presentato nel
modulo Media Representation in
Processing. In questo caso il filtraggio è
realizzato nel dominio del tempo mediante convoluzione
diretta.
void filtra(float[] DATAF, float[] DATA, float WC, float RO) {
//WC and R0 are useless, here kept only to avoid rewriting other
//parts of code
for(int i = 2; i < DATA.length-1; i++){
DATAF[i] = DATA[i+1] + 0.5*DATA[i] + 0.25*DATA[i-1];
}
}
La nozione di causalità è piuttosto intuitiva: essa corrisponde all'esperienza di stimolare un sistema ed ottenere una risposta a tale stimolazione solo per istanti del tempo futuro. Per sistemi LTI a tempo discreto, ciò corrispondere ad avere la risposta all'impulso nulla per istanti di tempo (discreto) negativi. Sistemi LTI causali possono produrre senza ritardo un'uscita campione per campione, in quanto la convoluzione va ad elaborare solo valori dell'ingresso passato e presente. Nell'Exercise 1 la risposta all'impulso è non causale, ma ciò non costituisce un problema perché è già a disposizione l'intero segnale di ingresso e l'elaborazione opera sull'intero blocco di campioni.
Le nozioni di risposta all'impulso, convoluzione, risposta in frequenza, e filtraggio si estendono in maniera naturale dal 1D al 2D, e costituiscono concetti fondamentali dell'elaborazione di immagini.
Come
nel caso 1D, la trasformata di Fourier della risposta
all'impulso viene chiamata Risposta in
Frequenza e si indica con
Considerato il codice Processing dell'esempio di blurring, si isolino le linee che realizzano l'operazione di convoluzione.
for(int y=0; y<height; y++) {
for(int x=0; x<width/2; x++) {
float sum = 0;
for(int k=-n2; k<=n2; k++) {
for(int j=-m2; j<=m2; j++) {
// Reflect x-j to not exceed array boundary
int xp = x-j;
int yp = y-k;
//... omissis ...
//auxiliary code to deal with image boundaries
sum = sum + kernel[j+m2][k+n2] * red(get(xp, yp));
}
}
output[x][y] = int(sum);
}
}