Sei sulla pagina 1di 72

Introduzione

Il Filtraggio
Gli Ambienti Riverberanti

Laboratorio per l’Elaborazione


MultiMediale
Lezione 2 -
Tecniche di Filtraggio

Prof. Michele Scarpiniti


Dipartimento di Ingegneria dell’Informazione, Elettronica e Telecomunicazioni
“Sapienza” Università di Roma
http://ispac.ing.uniroma1.it/scarpiniti/index.htm
michele.scarpiniti@uniroma1.it

Roma, 25 Marzo 2011

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 1 / 72


Introduzione
Il Filtraggio
Gli Ambienti Riverberanti

1 Introduzione
Introduzione
I File Audio
Un esempio

2 Il Filtraggio
Il Filtraggio
Esempi
FDATool

3 Gli Ambienti Riverberanti


Introduzione
Roomsim

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 2 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Introduzione

Introduzione

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 3 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Introduzione

Per l’elaborazione dei segnali multimediali, come può essere facile intuire,
è di fondamentale importanza l’operazione di filtraggio. Questo termine
indica una qualsiasi trasformazione della sequenza rappresentante il nostro
segnale in una nuova sequenza avente le caratteristiche richieste.
Un semplice esempio di filtraggio è il filtro passa-basso utilizzato per poter
eliminare le componenti rumorose in alta frequenza. Ma posso pensare ad un
filtro più “complicato” che estragga un segnale con determinate proprietà
statistiche da una mistura (o mixing ) di diversi segnali.
Scopo della presente lezione è l’acquisizione delle tecniche e dei
comandi Matlab (oR C/C++) che permettono la costruzione della
risposta impulsiva del filtro ed il filtraggio di sequenze. Viene inoltre
descritto come poter “simulare” la risposta impulsiva di un ambiente
riverberante.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 4 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Introduzione

Matlab mette a disposizione le guide in formato *.pdf di tutti i


toolbox presenti nel software. Per approfondire i contenuti di parte di
questa lezione è possibile scaricare la guida al Signal Toolbox
reperibile al link: http://www.mathworks.com/access/helpdesk/
help/pdf_doc/signal/signal_tb.pdf.
Una guida rapida (solo 90 pagine) del medesimo Toolbox, è invece
disponibile al link: http://www.mathworks.com/access/
helpdesk/help/pdf_doc/signal/signal_gs.pdf

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 5 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Matlab: leggere un file audio


Matlab mette a disposizione alcune funzione per leggere o scrivere un file
audio in formato *.wav o *.au (multicanale fino a 32 bps).
Lettura di un file *.wav: si utilizza
>> y=wavread(Nome-file);
Matlab legge il file Nome-file.wav e restituisce un vettore colonna y
contenente i valori dei campioni del segnale letto. Se siamo interessati a
conoscere la frequenza di campionamento Fs o il numero Nb di bit con cui è
quantizzato il singolo campione, possiamo utilizzare il comando
>> [y,Fs,Nb]=wavread(Nome-file);
Se invece siamo interessati a leggere solo parte del file, possiamo utilizzare:
>> [...]=wavread(Nome-file,N);
>> [...]=wavread(Nome-file,N1,N2);
che restituiscono i primi N campioni oppure i campioni compresi tra N1 e
N2 , rispettivamente.
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 6 / 72
Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Matlab: leggere un file audio

Il comando

>> dim=wavread(Nome-file,’size’);

restituisce il numero di campioni e il numero di canali del file Nome-file.wav.


Informazioni addizionali possono essere recuperate con

>> [y,Fs,Nb,opt]=wavread(Nome-file);

Questa funzione restituisce in opt una struttura contenete tutte le


informazioni sul file letto. Ad esempio:
wFormatTag 1
nChannels 1
nSamplesPerSec 8000
nAvgBytesPerSec 16000
nBlockAlign 2
nBitsPerSample 16

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 7 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Matlab: leggere un file audio

Lettura di un file *.au: si utilizza


>> y=auread(Nome-file);
Matlab, come nel caso di file *.wav, legge il file Nome-file.au e
restituisce un vettore colonna y contenente i valori dei campioni del
segnale letto. Come nel caso precedente, risultano definite di
conseguenza, le seguenti funzioni:
>> [y,Fs,Nb]=auread(Nome-file);
>> [...]=auread(Nome-file,N);
>> [...]=auread(Nome-file,N1,N2);
>> dim=auread(Nome-file,’size’);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 8 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Matlab: scrivere un file audio


Scrittura di un file *.wav: si utilizza
>> wavwrite(y,Fs,Nb,Nome-file);
Matlab scrive sul disco, nella directory di lavoro, il file Nome-file.wav usando una
frequenza di campionamento pari a Fs e Nb bit per campione. E’ anche possibile
utilizzare le funzioni:
>> wavwrite(y,Fs,Nome-file);
>> wavwrite(y,Nome-file);
In questi casi, viene fissato di default Nb = 16 e Fs = 8000.
Scrittura di un file *.au: si utilizza
>> auwrite(y,Fs,Nb,Nome-file);
che scrive sul disco, nella directory di lavoro, il file Nome-file.au, oppure:
>> auwrite(y,Fs,Nome-file);
>> auwrite(y,Nome-file);
Anche in questi casi, viene fissato di default Nb = 16 e Fs = 8000.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 9 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Matlab: suonare un file audio


In Matlab è possibile ascoltare un vettore y di campioni audio, con frequenza di
campionamento Fs , tramite il comando:
>> sound(y,Fs);
Se la quantizzazione non è di 16 bit, uso il comando:
>> sound(y,Fs,Nb);
Posso anche non esplicitare la frequenza di campionamento Fs se vale 8 kHz:
>> sound(y);
E’ anche utile il comando:
>> soundsc(y,Fs);
che normalizza il segnale prima di “suonarlo”.
Se interpreto y come vettore di campioni di un file *.wav, uso:
>> wavplay(y,Fs);
Se non esplicito Fs , di default assumo che Fs = 11025 Hz.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 10 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

I file *.wav
Il WAV (o WAVE), contrazione di WAVEform audio format è un formato audio
sviluppato da Microsoft e IBM per PC. È una variante del formato RIFF di me-
morizzazione dei dati. I dati vengono salvati in blocchi (“chunk”). E’ simile anche
al formato IFF o all’AIFF utilizzato dai computer Apple Macintosh.
Sia i file nel formato WAV che AIFF sono compatibili con i sistemi operativi Win-
dows e Macintosh. La differenza principale per questo formato è che, essendo
progettato per computer montanti processori Intel o compatibili, i dati vengono
memorizzati con la notazione little endian, a differenza degli altri formati che, es-
sendo sviluppati prevalentemente per computer con processori Motorola, utilizzano
la notazione big endian.
Ricordiamo che la differenza tra i due sistemi è data dall’ordine con il quale i byte
costituenti il dato da immagazzinare vengono memorizzati:
1 big-endian è la memorizzazione che inizia dal byte più significativo per finire col

meno significativo;
2 little-endian è la memorizzazione che inizia dal byte meno significativo per finire

col più significativo;


3 middle-endian è la memorizzazione in un ordine dei byte che non sia né crescente

né decrescente.
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 11 / 72
Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

I file *.wav

Essendo basato sullo standard RIFF il formato WAV supporta varie modalità
di immagazzinamento dei dati, ma nella pratica il più diffuso è il metodo
PCM.
Il PCM provvede a salvare i dati audio senza nessun tipo di compressione,
la forma d’onda viene memorizzata direttamente. Quindi i file risultanti
sono di elevate dimensioni, ma non richiedono elevata potenza di calcolo
per essere riprodotti, ed essendo la codifica lossless, viene spesso utilizzata
dagli utenti professionali per memorizzare l’audio.
La struttura di un file wave è comunque molto modulare e permette di
incapsulare flussi audio codificati in diversi modi. E’ quindi possibile
ridurre la dimensione di tali file con opportune codifiche.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 12 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

I file *.wav
La figura seguente descrive la struttura canonica di un file wave.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 13 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

I file *.wav
La precedente struttura è descritta in dettaglio nella seguente figura.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 14 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

I file *.wav
Le figure seguenti descrivono i primi 72 byte di un file wave di esempio.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 15 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

I file *.au
L’ AU è un formato audio sviluppato da Sun Microsystems comunemente usato sui
sistemi NeXT e sulle prime pagine web. Originariamente era senza header , per 8
kHz e usava la codifica µ-law (logaritmica). Di recente è stato introdotto un header
di 24 byte (più un “chunk” opzionale di informazioni di 4 byte), più frequenze di
campionamento e accetta diverse codifiche. Usa la notazione big-endian.
La figura seguente descrive la struttura canonica di un file au.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 16 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

I file *.au
La precedente struttura è descritta in dettaglio nella seguente figura.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 17 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Un esempio: la tastiera
Come esempio vogliamo realizzare in Matlab una tastiera a due ottave. Con
questa tastiera è possibile:
suonare uno dei 25 tasti, semplicemente con un click del mouse;
selezionare uno dei 10 toni a disposizione;
variare il volume del suono prodotto;
visualizzare la nota suonata.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 18 / 72


Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Un esempio: la tastiera
Per prima cosa vediamo come selezionare il tipo di strumento da suonare. Basta semplicemente
caricare uno spezzone di file da riprodurre:
global x Fs
gg = get(hObject,’Tag’);
switch gg
case ’radiobutton3’
str = ’_piano’;
case ’radiobutton2’
str = ’_organ’;
case ’radiobutton5’
str = ’_violin’;
case ’radiobutton1’
str = ’_flute’;
case ’radiobutton4’
str = ’_sax’;
case ’radiobutton6’
str = ’_tpt’;
case ’radiobutton7’
str = ’_tbone’;
case ’radiobutton8’
str = ’_mutetpt’;
case ’radiobutton9’
str = ’_cello’;
case ’radiobutton10’
str = ’_acoustie’;
otherwise
error(’Unknown instrument’);
end
name = [’instr’ str];
[x, Fs] = wavread(name);
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 19 / 72
Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Un esempio: la tastiera
Per suonare un tasto, devo prima trasporre la nota alla frequenza giusta. Un’ottava,
cioè l’insieme delle note sufficienti per avere un raddoppio della frequenza rispetto
alla prima nota, è suddivisa in 12 intervalli, chiamati semitoni.

In pratica, per alzare la frequenza fondamentale di una nota si cerca di suonare il


file precedentemente caricato, che corrisponde al do centrale, più velocemente.
Questo metodo ha l’inconveniente di rendere la durata della nota dipendente dalla
frequenza: quelle più basse avranno una durata maggiore rispetto alle note più
acute.
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 20 / 72
Introduzione Introduzione
Il Filtraggio I File Audio
Gli Ambienti Riverberanti Un esempio

Un esempio: la tastiera

Per quanto detto alla slide precedente, la trasposizione in frequenza è fatta nel
seguente modo:

global x Fs A

set(handles.Note_text,’String’,’D’);
half = 2^(k/12);
wavplay(A*x(ceil(1:half:end/(2^((24-k)/12)))),Fs);

In cui A è il valore dell’amplificazione, settata con lo slide in alto e k = [1, 2, . . . , 24]


è la nota suonata. Il valore di A è letto nel seguente modo:

global A
A = get(hObject,’Value’);

Inizialmente, quando viene creata l’interfaccia, viene inizializzato a A = 1.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 21 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il Filtraggio

Il Filtraggio

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 22 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Sistema LTI
Un circuito tempo-discreto è un sistema lineare e tempo-invariante (LTI)
che mappa una sequenza di ingresso x[n] in una sequenza di uscita y [n].

Può essere visto come un’operatore matematico T {x[n]}:


y [n] = T {x[n]} (1)

La classe dei sistemi LTI è caratterizzata dalla risposta impulsiva h[n].


Per questo tipo di sistema la sequenza di uscita y [n] può essere valutata
attraverso l’operazione somma di convoluzione (di solito indicata con ∗):

X ∞
X
y [n] = x[n] ∗ h[n] = h[k]x[n − k] = x[k]h[n − k] (2)
k=−∞ k=−∞

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 23 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

La risposta impulsiva

La risposta impulsiva è definita come l’uscita di un sistema LTI a tempo


discreto quando in ingresso è presenta la sequenza impulso unitario x[n] =
δ[n]. Questa particolare uscita è denotata di solito con h[n], quindi

h[n] = T {δ[n]} .

Una rappresentazione grafica è mostrata nella figura sottostante:

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 24 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro

D’ora in poi chiamiamo il sistema LTI T {x[n]} come filtro.


La relazione ingresso/uscita di un filtro può essere valutata anche in
frequenza, attraverso il Teorema della Convoluzione:

Y (e jω ) = H(e jω )X (e jω )

dove Z (e jω ) = DTFT {z[n]}.


La risposta in frequenza H(e jω ) viene definita funzione di
trasferimento del filtro.
Per un filtro fisicamente realizzabile, H(e jω ) ha modulo pari e fase
dispari.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 25 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro
Posso anche classificare i filtri rispetto a quali frequenze transitano inalterate o
quali vengono attenuate. Risultano le seguenti quattro classi:
1 Filtro passa-basso:

(

 1, per |ω| ≤ ωc
H e =
0, altrove.

2 Filtro passa-alto:

(

 1, per |ω| ≥ ωc
H e =
0, altrove.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 26 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro

Filtro passa-banda:
(

 1, per ω1 ≤ |ω| ≤ ω2
H e =
0, altrove.

Filtro elimina-banda:
(

 0, per ω1 ≤ |ω| ≤ ω2
H e =
1, altrove.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 27 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro: Matlab
R

In Matlab una convoluzione tra due sequenze x[n] (rappresentante il segnale


di ingresso di lunghezza N) e h[n] (rappresentante la risposta impulsiva di
lunghezza M) può essere ottenuta mediante il seguente comando

>> y=conv(h,x);

Questa operazione produce un vettore y di lunghezza N + M − 1.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 28 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro in frequenza: Matlab


R

In Matlab una convoluzione tra due sequenze x[n] (rappresentante il segnale


di ingresso di lunghezza N) e h[n] (rappresentante la risposta impulsiva
di lunghezza M) può essere anche essere ottenuta passando attraverso il
dominio della frequenza, con il metodo dell’overlap and add:

y [n] = IFFT {FFT {x[n]} ⊗ FFT {h[n]}}

dove ⊗ indica il prodotto elemento per elemento. Viene adoperato il se-


guente comando

>> y=fftfilt(h,x);

Viene restituito un vettore y della stessa dimensione di x[n]. Questa


funzione è vantaggiosa per ingressi x[n] (o risposte impulsive h[n])
particolarmente lunghi.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 29 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro in frequenza: overlap and add


Nel metodo overlap and add (OA), la sequenza x[n] di ingresso viene suddivisa in un
numero intero di blocchi di lunghezza L. La convoluzione con il filtro (di lunghezza
M) è effettuata con una convoluzione circolare, facendo le FFT a N ≥ L + M − 1
punti (di solito N è una potenza di 2). Se necessario si effettua zero padding .

I blocchi in ingresso vengono sovrapposti parzialmente di M −1 campioni e sommati


al blocco precedente:

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 30 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Filtri FIR

Un convolutore (cioè un circuito che implementa una somma di convoluzio-


ne) può anche essere implementato come filtro FIR. Il filtro FIR è caratte-
rizzato da una risposta impulsiva di lunghezza finita. Inoltre esso è un filtro
la cui rappresentazione in frequenza ha solo il numeratore.
N−1
X
y [n] = bk x[n − k] = b0 x[0] + b1 x[n − 1] + . . . + bN−1 x[n − N + 1]
k=0

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 31 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro FIR: C/C++


Purtroppo l’operazione di convoluzione effettuata utilizzando la definizione è l’unica
alternativa in C/C++, come mostra il codice seguente:
//-----------------------------------------------------------
// Filtraggio FIR: uso y = fir1(M, h, w, x);

double fir1(int M, double *h ,double *w, double x)

// M ordine del filtro


// h risposta impulsiva filtro
// w vettore linea di ritardo
// x campione d’ingresso

{
int i;
double y; // uscita
w[0] = x; // caricacamento campione d’ingresso
y=h[0]*w[0]; // inizializza la MAC
for (i=1;i<=M;i++)
y += h[i] * w[i]; // MAC
for (i=M;i>=1;i--) w[i]=w[i-1]; // agg. stato delay line
return y;
}
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 32 / 72
Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Filtri IIR
Un modello più generale di filtro è quello in cui l’uscita all’istante n-esimo
è funzione non solo degli ingressi, ma anche delle uscite agli istanti prece-
denti. Tale tipo di filtro è denominato filtro IIR ed è caratterizzato da una
risposta impulsiva di lunghezza infinita. In frequenza è rappresentato da un
numeratore e da un denominatore.
N−1
X M−1
X
y [n] = bk x[n − k] − aj y [n − j]
k=0 j=1

dove si è posto a0 = 1 (è il coefficiente di y [n]).


Nel dominio della trasformata Z (in frequenza) posso scrivere:
M
bk z −k
P
k=0
H(z) = N
ak z −k
P
k=0

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 33 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Filtri IIR
Graficamente un filtro IIR può essere schematizzato (in forma diretta II)
come in figura

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 34 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Il filtro: Matlab
R

In Matlab l’uscita y [n] di una sequenza x[n] di un filtro IIR, rappresentato dai
vettori a = [a0 , a1 , . . . , aM−1 ] e b = [b0 , b1 , . . . , bN−1 ], può essere ottenuta
mediante il seguente comando

>> y=filter(b,a,x);

Questa operazione produce un vettore y di lunghezza pari alla lunghezza


dell’ingresso x[n].
Ovviamente posso utilizzare questa funzione anche per il calcolo dell’uscita
di un filtro FIR: basta porre a0 = 1 e tutti gli ak = 0, ∀k 6= 0:

>> y=filter(b,1,x);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 35 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: ritardo

Costruiamo un semplice filtro per effettuare un ritardo di T secondi, ovvero


D = Fs T campioni.

>> [s,Fs]=wavread(’radio.wav’);
>> h=zeros(1,16000);
>> D=2*Fs;
>> h(D)=1;
>> y=fftfilt(h,s);
>> soundsc(y,Fs);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 36 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: eco

Ora otteniamo un eco ripetendo il segnale dopo un ritardo di T secondi,


ovvero D = Fs T campioni.

>> [s,Fs]=wavread(’tada.wav’);
>> h=zeros(1,64000);
>> h(1)=1;
>> D=1.3*Fs;
>> h(D)=0.9;
>> y=conv(h,s(:,1));
>> soundsc(y,Fs);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 37 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: riverbero artificiale

Un primo esempio di riverbero può essere ottenuto con un filtro contenente


due o tre picchi entro un secondo di risposta.

>> [s,Fs]=wavread(’radio.wav’);
>> h=zeros(1,16000);
>> h(1)=1;
>> h(128)=0.9;
>> h(800)=0.8;
>> y=fftfilt(h,s);
>> soundsc(y,Fs);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 38 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: riverbero artificiale


Un riverbero più “naturale” può essere ottenuto, come ha mostrato Schroeder,
utilizzando filtri comb. Un primo esempio è riportato di seguito.

z −D
H(z) =
1 + gz −D
Di conseguenza è possibile scrivere i due vettori b e a dei coefficienti del numeratore
e denominatore, rispettivamente:
 
b =  0 ··· 0 1 0 ··· 0 
a = 1 0 ··· 0 g 0 ··· 0
ed uso:
>> y=filter(b,a,x);
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 39 / 72
Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: riverbero artificiale

Vediamo una semplice implementazione del filtro:

>> [x,Fs]=wavread(’radio.wav’);
>> g=0.7;
>> D=0.1*Fs;
>> a=zeros(1,D);
>> b=zeros(1,D);
>> b(D)=1;
>> a(1)=1;
>> a(D)=g;
>> y=filter(b,a,x);
>> soundsc(y,Fs);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 40 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: riverbero artificiale


Una versione alternativa di filtro comb per la costruzione di un riverbero artificiale
è descritta di seguito.

1
H(z) =
1 − gz −D
Di conseguenza è possibile scrivere i due vettori b e a dei coefficienti del numeratore
e denominatore, rispettivamente:
b = 1 
a= 1 0 ··· 0 −g 0 ··· 0
ed uso:
>> y=filter(1,a,x);
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 41 / 72
Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: riverbero artificiale

Vediamo una semplice implementazione del filtro:

>> [x,Fs]=wavread(’radio.wav’);
>> g=0.7;
>> D=0.1*Fs;
>> a=zeros(1,D);
>> b=1;
>> a(1)=1;
>> a(D)=-g;
>> y=filter(b,a,x);
>> soundsc(y,Fs);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 42 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: riverbero artificiale


Un effetto più realistico di riverbero diffuso, può essere ottenuto utilizzando un
filtro all-pass (AP), come di seguito descritto.

g + z −D
H(z) =
1 + gz −D
Di conseguenza è possibile scrivere i due vettori b e a dei coefficienti del numeratore
e denominatore, rispettivamente:
 
b =  g 0 ··· 0 1 0 ··· 0 
a = 1 0 ··· 0 g 0 ··· 0
ed uso, come al solito:
>> y=filter(b,a,x);
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 43 / 72
Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: riverbero artificiale

Vediamo una semplice implementazione del filtro:

>> [x,Fs]=wavread(’radio.wav’);
>> g=0.7;
>> D=0.1*Fs;
>> a=zeros(1,D);
>> b(1)=g;
>> b(D)=1;
>> a(1)=1;
>> a(D)=g;
>> y=filter(b,a,x);
>> soundsc(y,Fs);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 44 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: filtro passa-banda

Nel seguente esempio vengono caricati da file i coefficienti di un filtro passa-


banda e usati per filtrare il segnale radiofonico.

>> [x,Fs]=wavread(’radio.wav’);
>> load ’tel_filter’ %carica in h i coefficienti del filtro
>> y=fftfilt(h,x);
>> soundsc(y,Fs);
>> pause;
>> soundsc(x,Fs);

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 45 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Esempio: filtro passa-banda


Se voglio disegnare i “tappi” del filtro, posso semplicemente utilizzare il seguente
comando
>> stem(h);
Matlab plotta il seguente grafico

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 46 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Ricostruzione della risposta impulsiva


Se si conoscono i vettori a e b dei coefficienti del denominatore e numeratore,
rispettivamente, la risposta impulsiva h[n] può essere stimata con le seguenti
funzioni.
>> [h,t]=impz(b,a);
in t viene restituito l’asse dei tempi.
>> [h,t]=impz(b,a,N);
>> [h,t]=impz(b,a,N,Fs);
restituiscono i primi N campioni della risposta impulsiva equispaziati di
1/Fs .
>> impz(b,a);
senza argomenti di uscita, restituisce il grafico (con stem) della risposta
impulsiva.
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 47 / 72
Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Ricostruzione della risposta impulsiva: un esempio


Per un esempio pratico:
>> a=zeros(1,800);
>> b=zeros(1,800);
>> a(1)=1;
>> a(800)=0.8;
>> b(800)=1;
>> [h,t]=impz(b,a,8192,8000);
>> stem(t,h);
ottenedo la risposta:

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 48 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Ricostruzione della risposta impulsiva: un esempio


Per plottare gli zeri e i poli di una funzione di trasferimento, si utilizza il comando:
>> zplane(b,a);
Per l’esempio precedente si ottiene il grafico:

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 49 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Progettazione di un filtro: FDATool


La determinazione dei coefficienti di un filtro può essere eseguita in modo
semplice attraverso una comoda e funzionale interfaccia grafica di Matlab:
FDATool (A Filter Design and Analysis GUI).

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 50 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Progettazione di un filtro: FDATool

FDATool è un’interfaccia grafica che consente all’utente di determinare i


coefficienti dei filtri digitali, sia FIR che IIR, importando o esportando i
risultati. Inoltre:
l’interfaccia consente di selezionare tutti i parametri necessari, nonchè
consente l’iserimento o l’eliminazione a mano (disegnando) di poli e/o
zeri nella funzione di trasferimento.
è possibile graficare la mascherea del filtro, la risposta in ampienza e
in fase, il ritardo di gruppo, la risposta impulsiva e la risposta al
gradino.
l’interfaccia è richiamata da linea di comando, eseguendo
>> fdatool

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 51 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Progettazione di un filtro: FDATool

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 52 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

Progettazione di un filtro: FDATool

I possibili passi da eseguire con FDATool sono i seguenti:


1 scelta del tipo di filtro;
2 scelta del metodo di progetto del filtro;
3 scelta delle specifiche del filtro;
4 analisi del filtro;
5 conversione della struttura del filtro;
6 importazione ed esportazione dei coefficienti del filtro;
7 salvataggio del filtro.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 53 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: scelta del tipo di filtro

E’ possibile selezionare diversi tipi di filtri:


1 Passa-basso;
2 Passa-alto;
3 Passa-banda;
4 Arresta-banda;
5 Filtro risonante;
6 Filtro anti-risonante (o di Notch);
7 Multibanda;
8 Differenziatore;
9 Trasformazione di Hilbert.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 54 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: scelta del metodo di progetto


E’ possibile selezionare i metodi per il progetto dei
filtri:
1 Butterworth;
2 Chebishev;
3 Ellittico;
4 Equiripple;
5 Leastsquares (o LS);
6 Massimamente flat;
7 Con finestratura:
Bartlett;
Blackman;
Hamming;
Hann;
Kaiser;
Triangolare.
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 55 / 72
Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: scelta delle specifiche del filtro

E’ possibile definire le specifiche del filtro:


1 Maschera del filtro:
Frequenze di taglio;
Attenuazione per la banda passante;
Attenuazione per la banda di
attenuazione;
2 Ordine del filtro;
3 Opzioni.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 56 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: finestra di analisi


E’ possibile analizzare il filtro osservando la:
1 Maschera del filtro;
2 Risposta in ampiezza;
3 Risposta in fase;
4 Risposta in ampiezza e fase sovrapposte;
5 Ritardo di gruppo;
6 Risposta impulsiva;
7 Risposta al gradino;
8 Diagramma poli-zeri;
9 Coefficienti del filtro;
10 Informazioni sul filtro progettato.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 57 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: convertire la struttura del filtro

E’ possibile convertire la struttura del filtro in una


delle seguenti altre:
1 Forma diretta I;
2 Forma diretta II;
3 Forma trasposta I;
4 Forma trasposta II;
5 Traliccio ARMA;
6 Spazio di stato.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 58 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: importare ed esportare il filtro

E’ possibile anche importare i coefficienti di un filtro, specificandone la struttura,


oppure esportare i coefficienti appena ricavati nel workspace o come oggetto
esterno.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 59 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: salvare il filtro

Infine è possibile salvare il filtro progettato in un


file di estensione *.fda, che può essere riaperto
con FDATool per future elaborazioni.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 60 / 72


Introduzione Il Filtraggio
Il Filtraggio Esempi
Gli Ambienti Riverberanti FDATool

FDATool: esempio

L’esempio del filtro ’tel-filter’ è stato creato con FDATool, progettando


un filtro passa-banda di tipo FIR Equiripple ad ordine minimo, con i seguenti
valori:
Fs = 8000
Fstop1 = 200 Hz
Fpass1 = 400 Hz
Fpass2 = 3200 Hz
Fstop2 = 3400 Hz
Astop1 = 60 Hz
Apass = 1 dB
Astop2 = 80 dB
Density factor: 20

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 61 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Gli Ambienti Riverberanti

Gli Ambienti Riverberanti

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 62 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Stima della risposta impulsiva di una stanza


In molti contesti applicativi è essenziale poter stimare la risposta impulsiva dell’
ambiente, cioè il percorso tra una sorgente ed un sensore (microfono). In ambienti
chiusi il suono rimbalza diverse volte lungo le pareti prima di giungere al microfono:
questa serie di riflessioni multiple è causa del fenomeno del riverbero. Tale fenomeno
genera una risposta impulsiva particolarmente lunga.
Il riverbero è misurato dal tempo di riverberazione o T60 , che misura il tempo
necessario affinchè l’energia della risposta all’impulso decada di 60 dB (un milione
di volte) rispetto al picco massimo.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 63 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Il metodo delle sorgenti immagini


Un metodo per stimare la risposta impulsiva di una stanza è il metodo delle sorgenti
immagine. Si tratta di un metodo “antico”, la cui applicazione pratica è stata resa
possibile dall’uso del calcolatore.
L’idea essenziale è quella che ogni parete, o piano di riflessione, si comporti come
uno specchio (acustico) e venga rimpiazzata da una sorgente immagine.
Ogni raggio emesso dalla sorgente A e riflesso dalla parete si può pensare come
emesso dalla sorgente immagine A’.
L’effetto della parete è completamente rappresentato dalla sorgente immagine,
nell’ipotesi che essa emetta lo stesso segnale della sorgente e che le sue
caratteristiche direzionali siano simmetriche di quelle di A.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 64 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Il metodo delle sorgenti immagini


Ciascun raggio subisce riflessioni multiple finchè non incontra una superficie
perfettamente assorbente o comunque finchè la sua energia non si esaurisce.
Il percorso completo del raggio può essere rappresentato mediante sorgenti
immagine di ordine superiore al primo.
La costruzione di una sorgente immagine del secondo ordine avviene come
descritto in figura

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 65 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Il metodo delle sorgenti immagini: Matlab


R

In Matlab esiste una funzione, sviluppata originariamente in Delphi dall’U-


niversità di Ancona e poi in Matlab (tramite file *.dll), che implementa il
metodo delle sorgenti immagine. Tale funzione è la seguente:
>> h = mechosim(ns,dims,rcoefs,sourcepos,micropos);
dove:
ns è il numero di coefficienti del filtro;
dims è un vettore che contiene le dimensioni della stanza;
rcoefs è il vettore di assorbimento delle pareti;
sourcepos indica le coordinate spaziali della sorgente;
micpos indica le coordinate spaziali dei ricevitori.
Ho scritto una funzione che richiede in ordine tutti i parametri da passare a
mechosim e salva il risultato in un file:
>> h=crearisposta;
M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 66 / 72
Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Roomsim
Un toolbox molto potente per il calcolo della risposta impulsiva attraverso il metodo
delle sorgenti immagine è Roomsim. E’ stato sviluppato da Douglas R. Campbell
e può essere scaricato gratuitamente dal link http://media.paisley.ac.uk/
~campbell/Roomsim/
Roomsim viene lanciato dal comando
>> roomsim
Si apre una finestra con diverse opzioni

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 67 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Roomsim

Per iniziare si usa l’opzione “Set-up and Run the Room Simulation”. A
questo punto si apre una schermata con quattro opzioni:
1 Inserimento manuale dei parametri;
2 Caricamento da un file *.mat già salvato;
3 Lettura dei parametri da un file di testo;
4 Lettura dei parametri da un file Excel.
L’opzione più interessante è a lettura dei dati da un file Excel poichè
questo formato risulta molto comodo per gestire i dati numerici con
facilità. Per tale motivo premiamo il tasto “Read from an Excel
spreadsheet” e carichiamo il file di esempio setup 6 surfaces.xls. A questo
punto Roomsim avvia la simulazione, visualizza la risposta impulsiva e ci
chiede dove salvare i risultati.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 68 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Roomsim: struttura del file *.xls

Il file *.xls da cui vengono lette tutte le informazioni e i parametri, ha quattro


diverse schede:
1 single values: vengono inseriti i valori della frequenza di
campionamento, umidità, temperatura, dimensioni della stanza,
coordinate dei ricevitori, tipo di sensore (omnidirezionale, ecc.).
2 sources: vengono inseriti i valori relativi alle sorgenti: distanza dai
ricevitori, azimuth ed elevazione.
3 sensor dir: come sopra, ma per i ricevitori (azimuth, elevazione e roll
offset).
4 surface absorption: vengono inseriti i coefficienti di assorbimento di
tutte le superfici.

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 69 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Roomsim: struttura del file *.xls


Riportiamo la schermata single values per il file esemplificativo setup 6 surfaces.xls

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 70 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Roomsim: struttura del file *.xls


Riportiamo inoltre la schermata surface absorption sempre per il file esemplifica-
tivo setup 6 surfaces.xls

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 71 / 72


Introduzione
Introduzione
Il Filtraggio
Roomsim
Gli Ambienti Riverberanti

Bibliografia

Matlab
MATLAB 7: Getting Started Guide.
Available on-line: http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/getstart.pdf

Matlab
Signal Processing Toolbox 6: User’s Guide.
Available on-line: http://www.mathworks.com/access/helpdesk/help/pdf_doc/signal/signal_tb.pdf

T.A. Davis.
MATLAB Primer.
8-th Edition, CRC Press, 2010..

D.M. Smith.
Engineering Computation with MATLAB.
2-nd Edition, Addison-Wesley, 2010.

A.D. Poularikas.
Signals and Systems Primer with MATLAB.
CRC Press, 2006.

D. Campbell, K. Palomaki, and G. Brown,


A matlab simulation of shoebox room acoustics for use in research and teaching’
In Computing and Information Systems, Vol. 9, no. 3, p. 48, 2005.
[Online]. Available: http://www.dcs.shef.ac.uk/~guy/pdf/campbell.pdf

M. Scarpiniti Laboratorio per l’Elaborazione MultiMediale Lezione 2 - Tecniche di Filtraggio 72 / 72

Potrebbero piacerti anche