Esercizio - Laboratorio 2, filtri notch e audio
In questa pagina 5
Testo (laboratorio 2 del corso Multimedia Signal Processing, UniPD; lezione 14). Un file audio contiene un messaggio disturbato da toni sinusoidali aggiunti. Si vogliono togliere i toni, in due passi: (a) determinare dallo spettrogramma le frequenze dei disturbi; (b) filtrarle con filtri FIR notch. Più precisamente:
- leggere il file, plottare lo spettrogramma normalizzato (frequenza in unità di rad/campione) e leggere le frequenze dei toni;
- ricavare la funzione di sistema di un filtro FIR a tre coefficienti che annulla un coseno e normalizzarla a guadagno in continua ();
- progettare un filtro per ogni tono, metterli in cascata (convoluzione), tracciare modulo e fase della risposta totale;
- filtrare l'audio, plottare lo spettrogramma dell'uscita e riascoltare: l'operazione dà risultati soddisfacenti?
Dati. Il file SunshineSquare.wav sta nella cartella del laboratorio 2 su Moodle. È un file mono a bit, Hz, campioni ( s). I risultati sotto sono ottenuti eseguendo il codice su questo file.
Teoria usata: Filtri notch e applicazioni dei filtri FIRUno zero di H(z) sulla circonferenza unitaria in z0 = e^{j w0} annulla (a regime) le sinusoidi alla pulsazione w0. Per eliminare un coseno servono i due zeri coniugati: H(z) = (1 - e^{jw0} z^-1)(1 - e^{-jw0} z^-1) = 1 - 2 cos(w0) z^-1 + z^-2, cioè h = {1, -2cos w0, 1}, un FIR simmetrico di tipo I (ritardo 1). Si normalizza dividendo per 2 - 2cos(w0) per avere guadagno 1 in continua; più toni si eliminano mettendo in cascata (convoluzione) un filtro per ogni tono. Segue una panoramica delle applicazioni dei FIR (equalizzazione audio), vantaggi (fase lineare, stabilità) e costo (N moltiplicazioni per campione, molte più di un IIR).Filtri notch e applicazioni dei filtri FIR →, Risposta in frequenza dei sistemi FIRSe all'ingresso di un FIR c'è un esponenziale complesso A e^{jφ} e^{jω̂n} (per ogni n), l'uscita è lo stesso esponenziale moltiplicato per H(ω̂) = Σ b_k e^{-jω̂k}: la frequenza non cambia, ampiezza e fase sono modificate da |H| (guadagno) e ∠H (sfasamento). Per sovrapposizione si trattano somme di sinusoidi. H è periodica di periodo 2π e, per coefficienti reali, hermitiana (|H| pari, fase dispari). La cascata ha H = H1·H2. Esempi: ritardo (fase lineare), differenza prima (passa-alto), {1,2,1} (passa-basso), media mobile di L punti (Dirichlet: |H| = |sin(Lω̂/2)/(L sin(ω̂/2))|, fase lineare -(L-1)ω̂/2).Risposta in frequenza dei sistemi FIR →, Sistemi LTI e convoluzione discretaUn sistema lineare e tempo-invariante (LTI) è completamente descritto dalla sua risposta impulsiva h[n]: y[n] = Σ x[k] h[n-k] = x[n] * h[n] (somma di convoluzione). Si ricava scomponendo x in impulsi traslati e usando linearità e invarianza. La convoluzione è commutativa, associativa e distributiva; una cascata di LTI equivale a un solo filtro con h = h1 * h2 e l'ordine non conta. Se x ha lunghezza N e h lunghezza L, y ha lunghezza N+L-1. Si calcola col metodo della finestra scorrevole o a tabella. I FIR sono LTI; altri sistemi (n·x[n], x[-n], x²) non lo sono.Sistemi LTI e convoluzione discreta →, Trasformata di Fourier a tempo breve e spettrogrammaPer un segnale lungo il cui contenuto in frequenza cambia nel tempo si calcolano tante DFT brevi: X[k, l] = sum_{n=0}^{L-1} w[n] x[l+n] e^{-j2pi kn/N}, con finestra di analisi w di lunghezza L, istante l = m R (passo R, di solito L/2) e DFT a N >= L punti. Il modulo (o i dB) di X[k, l] come immagine tempo-frequenza è lo spettrogramma. La finestra impone un compromesso: lunga = ottima risoluzione in frequenza (Delta w circa 8pi/L per Hann) ma transizioni temporali sfocate su circa L/2 campioni; corta = buona localizzazione nel tempo ma righe vicine fuse. Si provano più lunghezze.Trasformata di Fourier a tempo breve e spettrogramma →.
Passo 1: le frequenze dei toni
Con le impostazioni del corso (finestra di Hamming di campioni, di sovrapposizione, nfft=256) lo spettrogramma ha una riga ogni Hz, cioè ogni . Mediato nel tempo mostra tre righe orizzontali molto marcate (da a dB sopra il resto) nei canali di , e Hz, cioè a , , . Il risultato è limitato dalla risoluzione del grafico: la FFT dell'intero file ( campioni) dà
cioè , , : sono esattamente , , , cioè . Le frequenze della soluzione del corso (, , ) sono quelle lette dal grafico: la prima è esatta, la seconda e la terza sono a e da quelle vere. Il fatto che siano multipli di non è un caso e si userà nel passo 3.
Com'è fatto il file:
- i toni sono presenti solo nell'ultimo tratto, da circa s alla fine ( s); nei primi s c'è solo il messaggio. Nel tratto - s l'ampiezza dei tre toni (stimata con la DFT del tratto) è , , (scala in cui il fondo scala è ): il primo tono da solo supera il fondo scala, ma i tre toni sono sfasati e la loro somma resta sotto (picco del file );
- il messaggio ha valore efficace (stimato nei primi s, senza continua) e il tratto con i toni : i toni sono circa dB sopra il messaggio, che per questo non si sente;
- il file ha una componente continua di (maggiore del valore efficace del messaggio);
- nel messaggio (primi s, senza continua) la potenza è concentrata nelle basse frequenze: il sotto Hz () e il sotto Hz ().
Passo 2: il filtro per un tono
Un coseno è somma di due esponenziali a (Numeri complessi, formula di Eulero ed esponenziali complessiUn numero complesso si scrive in forma cartesiana a+jb o polare |x|e^{jφ}; il prodotto moltiplica i moduli e somma le fasi. La formula di Eulero e^{jα}=cos α + j sin α lega esponenziali e sinusoidi e permette di trattare tutti i segnali del corso come somme di esponenziali complessi e^{(σ+jω)t}.Numeri complessi, formula di Eulero ed esponenziali complessi →); servono quindi due zeri in :
Si sono usate e . I coefficienti sono , , , cioè hh = [1, AA, 1]. Il guadagno in continua è , quindi la versione normalizzata è .
| tono | normalizzata | |||
|---|---|---|---|---|
| 1 | 0.2857 | |||
| 2 | 0.5709 | |||
| 3 | 0.8573 |
Passo 3: la cascata
La risposta impulsiva della cascata è la convoluzione dei tre filtri: ha coefficienti dopo due filtri e dopo tre. Risultato notevole: i sette coefficienti sono praticamente uguali a (scarto massimo ). I tre toni sono infatti, come si è visto nel passo 1, i multipli , , , cioè gli zeri di una media mobile a 7 punti. Il filtro è simmetrico (tipo I, Filtri FIR a fase lineare - tipi e zeriI FIR a fase lineare di ordine N si dividono in quattro tipi: I (N pari, h simmetrica), II (N dispari, simmetrica), III (N pari, antisimmetrica), IV (N dispari, antisimmetrica). Si scrive H = e^{-jwN/2} e^{jb} A(w), con A somma di coseni (tipi I e II) o di seni (III e IV). Dalla relazione H(z) = ±z^{-N} H(1/z) segue che gli zeri vengono in gruppi (z0, z0*, 1/z0, 1/z0*) e che ci sono zeri forzati: tipo II in z = -1, tipo III in z = 1 e z = -1, tipo IV in z = 1, tipo I nessuno. Quindi II non fa passa-alto, III non fa passa-basso né passa-alto, IV non fa passa-basso. Ogni tipo II, III, IV è un tipo I moltiplicato per (1+z^-1), (1-z^-2), (1-z^-1).Filtri FIR a fase lineare - tipi e zeri →), con fase lineare e ritardo campioni; il modulo vale nei tre zeri e in continua.
Poiché le frequenze del corso sono arrotondate, gli zeri della cascata cadono a , , (il modulo vale lì ) e non esattamente sulle frequenze vere dei toni. Calcolato in il modulo vale ( dB), ( dB), ( dB): il tono a frequenza intermedia è quello attenuato meno, perché è quello letto peggio dal grafico.
Grafico interattivo: Laboratorio 2: modulo della cascata dei tre notch (FIR del corso) e di tre notch IIR con r = 0,9 sulle stesse frequenze
La curva continua è il modulo della cascata del corso: tre zeri, e fra uno zero e l'altro i lobi laterali arrivano a (cioè è una media mobile a punti, il cui modulo è ). Il guadagno a è ; il guadagno è a e scende a a . La curva tratteggiata è la cascata di tre notch IIR del laboratorio 5 (Filtri IIR - definizione e confronto con i FIRUn filtro IIR (infinite impulse response) è un sistema LTI descritto da $y[n]=\sum_{\ell=1}^{N}a_\ell y[n-\ell]+\sum_{k=0}^{M}b_kx[n-k]$: l'uscita usa anche le uscite passate (retroazione), per questo si chiama ricorsivo. Con le condizioni di riposo iniziale è LTI, $H(z)=\frac{\sum b_kz^{-k}}{1-\sum a_\ell z^{-\ell}}$ è un rapporto di polinomi, l'ordine è $N$ (numero di poli) e la risposta impulsiva ha durata infinita. Nel primo ordine $y[n]=a_1y[n-1]+b_0x[n]$ si ha $h[n]=b_0a_1^nu[n]$, ROC $|z|>|a_1|$, stabile se $|a_1|<1$; il gradino dà $b_0\frac{1-a_1^{n+1}}{1-a_1}\to\frac{b_0}{1-a_1}$. Si implementa iterando l'equazione alle differenze, non con la convoluzione. Rispetto ai FIR gli IIR rispettano le stesse specifiche di modulo con ordine molto più basso, ma possono essere instabili e non hanno fase lineare. Progetto: per tentativi (notch), con la trasformazione $s\to z$ dai filtri analogici, o con ottimizzazione numerica.Filtri IIR - definizione e confronto con i FIR →) sulle stesse frequenze: resta vicina a quasi dappertutto.
Passo 4: il codice
import numpy as np
from scipy.io import wavfile
from scipy.signal import spectrogram, lfilter, convolve, freqz
fs, xx = wavfile.read('SunshineSquare.wav') # int16, fs = 11025
if xx.ndim > 1:
xx = xx[:, 0] # primo canale (qui il file e' mono)
xx = xx / 32768.0 # float in [-1, 1) (come soundfile.read)
# spettrogramma normalizzato (Hamming 256, 50 % di sovrapposizione, come nel corso)
f, t, Sxx = spectrogram(xx, fs, window=np.hamming(256), nfft=256, noverlap=128)
w_norm = f / (fs / 2) # in unita' di pi rad/campione
# frequenze lette dal corso (unita' di pi) e filtri notch normalizzati
w_toni = np.array([0.2857, 0.5709, 0.8573]) * np.pi
def notch(w0):
A = -2 * np.cos(w0)
return np.array([1, A, 1]) / (2 - 2 * np.cos(w0)) # guadagno 1 in continua
hh = [notch(w) for w in w_toni]
h_out = convolve(convolve(hh[0], hh[1]), hh[2]) # cascata = convoluzione
ww = np.linspace(-np.pi, np.pi, 201)
_, HH = freqz(h_out, 1, worN=ww) # modulo: np.abs(HH), fase: np.unwrap(np.angle(HH))
yy = lfilter(h_out, 1, xx) # filtraggio
def ampiezza_tono(s, w0): # ampiezza stimata con la DFT del tratto
k = np.arange(s.size)
return 2 * abs(np.sum(s * np.exp(-1j * w0 * k))) / s.size
tratto = slice(int(8 * fs), int(10.5 * fs)) # tratto in cui i toni sono presenti
for w in 2 * np.pi * np.array([1, 2, 3]) / 7:
print(w / np.pi, ampiezza_tono(xx[tratto], w), ampiezza_tono(yy[tratto], w))Uscita ottenuta eseguendo il codice sul file del corso.
- Ampiezze dei tre toni nel tratto - s: da , , nell'ingresso a , , nell'uscita, cioè attenuazioni di , e dB (coerenti con il modulo della cascata nelle tre frequenze vere, , , dB).
- Valore efficace nel tratto - s: da a , cioè dB. Il valore efficace del messaggio nei primi s è in ingresso e in uscita: l'uscita nel tratto con i toni () ha lo stesso ordine di grandezza dell'uscita senza toni, quindi i toni sono davvero spariti e resta il messaggio.
- Sul file intero il valore efficace passa da a ( dB): quasi tutta l'energia del file () era nei tre toni.
Passo 5: il filtraggio è soddisfacente?
- Sì per i toni: gli zeri sono praticamente esatti, quindi dopo un transitorio di campioni (ordine , meno di ms a Hz) i toni spariscono, con attenuazioni da a dB.
- Ma si perde parte del messaggio: la cascata è una media mobile a punti, cioè un passabasso con frequenza di taglio a dB di ( Hz). Sul messaggio dei primi s la potenza in uscita rispetto all'ingresso, per fasce, è: dB sotto , dB tra e , dB tra e , poi dB (-), dB (-) e dB sopra . In totale il valore efficace del messaggio cala di dB. Poiché il della potenza del messaggio è sotto Hz il suono resta riconoscibile, ma perde le componenti sopra circa kHz: risulta più cupo.
- Il guadagno non è ovunque: il singolo notch ha guadagno in (per esempio a ); nella cascata il massimo è in continua e il guadagno in è .
- Alternativa con notch IIR (laboratorio 5): tre notch del secondo ordine sulle frequenze esatte () con attenuano i toni di , e dB e riducono il valore efficace del messaggio di soli dB (con : dB; con : dB). Il costo è un transitorio più lungo e la fase non lineare (Filtri IIR - definizione e confronto con i FIRUn filtro IIR (infinite impulse response) è un sistema LTI descritto da $y[n]=\sum_{\ell=1}^{N}a_\ell y[n-\ell]+\sum_{k=0}^{M}b_kx[n-k]$: l'uscita usa anche le uscite passate (retroazione), per questo si chiama ricorsivo. Con le condizioni di riposo iniziale è LTI, $H(z)=\frac{\sum b_kz^{-k}}{1-\sum a_\ell z^{-\ell}}$ è un rapporto di polinomi, l'ordine è $N$ (numero di poli) e la risposta impulsiva ha durata infinita. Nel primo ordine $y[n]=a_1y[n-1]+b_0x[n]$ si ha $h[n]=b_0a_1^nu[n]$, ROC $|z|>|a_1|$, stabile se $|a_1|<1$; il gradino dà $b_0\frac{1-a_1^{n+1}}{1-a_1}\to\frac{b_0}{1-a_1}$. Si implementa iterando l'equazione alle differenze, non con la convoluzione. Rispetto ai FIR gli IIR rispettano le stesse specifiche di modulo con ordine molto più basso, ma possono essere instabili e non hanno fase lineare. Progetto: per tentativi (notch), con la trasformazione $s\to z$ dai filtri analogici, o con ottimizzazione numerica.Filtri IIR - definizione e confronto con i FIR →).
Versione ripasso
Passo 1 - frequenze. File SunshineSquare.wav: mono, Hz, s. Lo spettrogramma (Hamming , nfft=256: una riga ogni Hz) mostra tre righe a , , Hz; la FFT dell'intero file le dà esatte: , , Hz, cioè (, , ). Il corso usa , , . I toni ci sono solo da s a s e sono circa dB sopra il messaggio (il dell'energia del file).
Passo 2 - notch per un tono. Due zeri in : Il guadagno in continua è , quindi con . Per i tre toni: , , .
Passo 3 - cascata. La convoluzione dei tre filtri ha coefficienti (scarto massimo ): i toni sono gli zeri di una media mobile a punti. Filtro di tipo I, ritardo campioni, modulo nelle frequenze del corso e in continua. Nelle frequenze vere il modulo vale , , dB (le frequenze del corso sono arrotondate).
Passo 4 - codice. wavfile.read, poi xx/32768; hh = [notch(w) for w in w_toni], h_out = convolve(convolve(hh[0], hh[1]), hh[2]), yy = lfilter(h_out, 1, xx). Ampiezze dei toni nel tratto - s: da ; ; a ; ; , cioè , , dB.
Passo 5 - risultato. I toni spariscono dopo un transitorio di campioni; il valore efficace sul file passa da a . Ma la cascata è un passabasso con dB a ( Hz): il messaggio perde dB (fasce sopra : da a dB) e il guadagno a è . Tre notch IIR con attenuano i toni di dB perdendo solo dB di messaggio.
Teoria: Filtri notch e applicazioni dei filtri FIRUno zero di H(z) sulla circonferenza unitaria in z0 = e^{j w0} annulla (a regime) le sinusoidi alla pulsazione w0. Per eliminare un coseno servono i due zeri coniugati: H(z) = (1 - e^{jw0} z^-1)(1 - e^{-jw0} z^-1) = 1 - 2 cos(w0) z^-1 + z^-2, cioè h = {1, -2cos w0, 1}, un FIR simmetrico di tipo I (ritardo 1). Si normalizza dividendo per 2 - 2cos(w0) per avere guadagno 1 in continua; più toni si eliminano mettendo in cascata (convoluzione) un filtro per ogni tono. Segue una panoramica delle applicazioni dei FIR (equalizzazione audio), vantaggi (fase lineare, stabilità) e costo (N moltiplicazioni per campione, molte più di un IIR).Filtri notch e applicazioni dei filtri FIR →, Risposta in frequenza dei sistemi FIRSe all'ingresso di un FIR c'è un esponenziale complesso A e^{jφ} e^{jω̂n} (per ogni n), l'uscita è lo stesso esponenziale moltiplicato per H(ω̂) = Σ b_k e^{-jω̂k}: la frequenza non cambia, ampiezza e fase sono modificate da |H| (guadagno) e ∠H (sfasamento). Per sovrapposizione si trattano somme di sinusoidi. H è periodica di periodo 2π e, per coefficienti reali, hermitiana (|H| pari, fase dispari). La cascata ha H = H1·H2. Esempi: ritardo (fase lineare), differenza prima (passa-alto), {1,2,1} (passa-basso), media mobile di L punti (Dirichlet: |H| = |sin(Lω̂/2)/(L sin(ω̂/2))|, fase lineare -(L-1)ω̂/2).Risposta in frequenza dei sistemi FIR →, Sistemi LTI e convoluzione discretaUn sistema lineare e tempo-invariante (LTI) è completamente descritto dalla sua risposta impulsiva h[n]: y[n] = Σ x[k] h[n-k] = x[n] * h[n] (somma di convoluzione). Si ricava scomponendo x in impulsi traslati e usando linearità e invarianza. La convoluzione è commutativa, associativa e distributiva; una cascata di LTI equivale a un solo filtro con h = h1 * h2 e l'ordine non conta. Se x ha lunghezza N e h lunghezza L, y ha lunghezza N+L-1. Si calcola col metodo della finestra scorrevole o a tabella. I FIR sono LTI; altri sistemi (n·x[n], x[-n], x²) non lo sono.Sistemi LTI e convoluzione discreta →, Trasformata di Fourier a tempo breve e spettrogrammaPer un segnale lungo il cui contenuto in frequenza cambia nel tempo si calcolano tante DFT brevi: X[k, l] = sum_{n=0}^{L-1} w[n] x[l+n] e^{-j2pi kn/N}, con finestra di analisi w di lunghezza L, istante l = m R (passo R, di solito L/2) e DFT a N >= L punti. Il modulo (o i dB) di X[k, l] come immagine tempo-frequenza è lo spettrogramma. La finestra impone un compromesso: lunga = ottima risoluzione in frequenza (Delta w circa 8pi/L per Hann) ma transizioni temporali sfocate su circa L/2 campioni; corta = buona localizzazione nel tempo ma righe vicine fuse. Si provano più lunghezze.Trasformata di Fourier a tempo breve e spettrogramma →, Numeri complessi, formula di Eulero ed esponenziali complessiUn numero complesso si scrive in forma cartesiana a+jb o polare |x|e^{jφ}; il prodotto moltiplica i moduli e somma le fasi. La formula di Eulero e^{jα}=cos α + j sin α lega esponenziali e sinusoidi e permette di trattare tutti i segnali del corso come somme di esponenziali complessi e^{(σ+jω)t}.Numeri complessi, formula di Eulero ed esponenziali complessi →, Filtri FIR a fase lineare - tipi e zeriI FIR a fase lineare di ordine N si dividono in quattro tipi: I (N pari, h simmetrica), II (N dispari, simmetrica), III (N pari, antisimmetrica), IV (N dispari, antisimmetrica). Si scrive H = e^{-jwN/2} e^{jb} A(w), con A somma di coseni (tipi I e II) o di seni (III e IV). Dalla relazione H(z) = ±z^{-N} H(1/z) segue che gli zeri vengono in gruppi (z0, z0*, 1/z0, 1/z0*) e che ci sono zeri forzati: tipo II in z = -1, tipo III in z = 1 e z = -1, tipo IV in z = 1, tipo I nessuno. Quindi II non fa passa-alto, III non fa passa-basso né passa-alto, IV non fa passa-basso. Ogni tipo II, III, IV è un tipo I moltiplicato per (1+z^-1), (1-z^-2), (1-z^-1).Filtri FIR a fase lineare - tipi e zeri →, Filtri IIR - definizione e confronto con i FIRUn filtro IIR (infinite impulse response) è un sistema LTI descritto da $y[n]=\sum_{\ell=1}^{N}a_\ell y[n-\ell]+\sum_{k=0}^{M}b_kx[n-k]$: l'uscita usa anche le uscite passate (retroazione), per questo si chiama ricorsivo. Con le condizioni di riposo iniziale è LTI, $H(z)=\frac{\sum b_kz^{-k}}{1-\sum a_\ell z^{-\ell}}$ è un rapporto di polinomi, l'ordine è $N$ (numero di poli) e la risposta impulsiva ha durata infinita. Nel primo ordine $y[n]=a_1y[n-1]+b_0x[n]$ si ha $h[n]=b_0a_1^nu[n]$, ROC $|z|>|a_1|$, stabile se $|a_1|<1$; il gradino dà $b_0\frac{1-a_1^{n+1}}{1-a_1}\to\frac{b_0}{1-a_1}$. Si implementa iterando l'equazione alle differenze, non con la convoluzione. Rispetto ai FIR gli IIR rispettano le stesse specifiche di modulo con ordine molto più basso, ma possono essere instabili e non hanno fase lineare. Progetto: per tentativi (notch), con la trasformazione $s\to z$ dai filtri analogici, o con ottimizzazione numerica.Filtri IIR - definizione e confronto con i FIR →.
Errori tipici:
- Scrivere senza il fattore : il guadagno in continua non è .
- Usare : il segnale non viene annullato, il segno è negativo.
- Dire che il notch elimina solo il tono: il filtro FIR con pochi coefficienti è largo (qui è un passabasso).
- Leggere la frequenza dal grafico dello spettrogramma senza ricordare che ha una risoluzione di Hz.
- Dimenticare il transitorio di campioni all'inizio dell'uscita.
Teoria collegata
- Filtri notch e applicazioni dei filtri FIR
- Risposta in frequenza dei sistemi FIR
- Sistemi LTI e convoluzione discreta
- Trasformata di Fourier a tempo breve e spettrogramma
- Numeri complessi, formula di Eulero ed esponenziali complessi
- Filtri FIR a fase lineare - tipi e zeri
- Filtri IIR - definizione e confronto con i FIR