Convoluzione a blocchi - overlap-add e overlap-save
In questa pagina 6
Filtrare un segnale con un FIR di risposta impulsiva lunga vuol dire calcolare (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 →). Con la formula diretta ogni campione di uscita costa moltiplicazioni e somme. Con la FFT si può fare di meglio per filtri lunghi, ma la DFT fornisce una convoluzione circolare (Trasformata di Fourier discreta (DFT) e convoluzione circolareLa DFT di N campioni x[0..N-1] è X[k] = sum x[n] e^{-j2pi kn/N}, k = 0..N-1 (IDFT: x[n] = (1/N) sum X[k] e^{j2pi kn/N}); vede il segnale come periodico di periodo N e dà N campioni equispaziati della DTFT, cioè X(z) valutata sulle radici N-esime dell'unità. Se x ha durata M <= N non c'è aliasing temporale e lo zero-padding (N > M) infittisce solo i campioni della stessa DTFT. Proprietà: traslazione circolare, simmetria coniugata X[k] = X*[N-k], prodotto = convoluzione circolare. La convoluzione circolare coincide con la lineare solo se N >= Dx + M - 1; altrimenti la coda si ripiega sull'inizio. La FFT calcola la DFT con (N/2) log2 N moltiplicazioni invece di N^2.Trasformata di Fourier discreta (DFT) e convoluzione circolare →) e lavora su segnali di lunghezza finita: serve un metodo per ottenere quella lineare e per trattare segnali molto lunghi (o infiniti, come un flusso audio). Questa nota riassume il calcolo con la FFT, il confronto di costo e i due metodi a blocchi.
Convoluzione lineare con la DFT
Il procedimento, per di lunghezza e di lunghezza (uscita lunga ):
- Si sceglie ; per sfruttare la FFT, potenza di due: .
- Si completano e con zeri fino a campioni (zero-padding).
- Si calcolano le DFT e (due FFT), si moltiplica ( moltiplicazioni) e si antitrasforma (una FFT inversa).
Con non c'è aliasing temporale e per ; con la coda si ripiega sull'inizio.
Esempio. Se serve ; se , (come nell'appunto del corso).
Costo: quando conviene la FFT
Il costo del metodo diretto per campione è ( dipende dal processore). Il metodo FFT ha costo per campione dove è il costo di una FFT, il fattore conta le due FFT e la FFT inversa, e il termine delle moltiplicazioni si trascura. Assumendo : La FFT conviene quando questo rapporto è minore di . Due casi tipici.
Caso 1: . Allora e .
Per piccolo (8) è più veloce il calcolo diretto; per si è in pareggio; per grande la FFT è molto più veloce (verificato con Python: per ).
Caso 2: . Allora e se .
| massimo |
Quindi, se il filtro è corto, il calcolo diretto è meglio; se è lungo, la FFT è molto più veloce, anche per segnali lunghissimi. Resta però il problema pratico: una FFT enorme richiede di aspettare tutto il segnale (non va per l'elaborazione in tempo reale) e occupa molta memoria. Si risolve a blocchi.
Convoluzione a blocchi
Si suddivide in blocchi, si convolve ogni blocco con (con la FFT, su piccolo) e si ricombinano i risultati in modo opportuno. I due metodi, con la stessa complessità, sono overlap-add e overlap-save.
Overlap-add
Metodo (overlap-add, "sovrapponi e somma"). Sia di lunghezza e si divida in blocchi non sovrapposti di lunghezza ( per semplicità): Per la linearità con di lunghezza e supporto .
I blocchi e hanno supporti e : si sovrappongono per campioni, quelli di indice . Quindi in ogni istante la somma ha uno o due termini non nulli:
Per calcolare ogni con la FFT, per evitare l'aliasing la DFT deve avere lunghezza . La DFT di (, a punti) si calcola una volta sola. Per ogni blocco: FFT di completato con zeri a , prodotto con , FFT inversa; poi si traslano le uscite di e si sommano le code sovrapposte.
Esempio (lezione). , (), e . Blocchi: e . Con zero-padding a campioni: (indici -) e , che parte da . Somma:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
|---|---|---|---|---|---|---|---|---|
| 1 | 3 | 6 | 9 | 7 | 4 | |||
| (traslata di 4) | 5 | 11 | 11 | 6 | ||||
| 1 | 3 | 6 | 9 | 12 | 15 | 11 | 6 |
Il risultato coincide con la convoluzione lineare diretta (verificato con Python). Nell'appunto del corso compaiono due zeri finali: sono il padding della DFT a sul secondo blocco, non fanno parte del risultato.
Grafico interattivo: Overlap-add: uscita del blocco 0, y0 = {1, 3, 6, 9, 7, 4}, indici 0-5
Grafico interattivo: Overlap-add: uscita del blocco 1 traslata di L = 4, y1 = {5, 11, 11, 6} da n = 4: le code si sovrappongono in n = 4 e 5
Grafico interattivo: Overlap-add: somma y = y0 + y1 = {1, 3, 6, 9, 12, 15, 11, 6}, uguale alla convoluzione lineare di x = {1..6} con {1,1,1}
Overlap-save
L'idea è opposta: invece di sommare le code, si evita di avere code. I blocchi di ingresso sono sovrapposti di campioni, si calcola la convoluzione circolare a punti, e si scartano i campioni che non coincidono con la convoluzione lineare.
Metodo (overlap-save, "sovrapponi e conserva"). Sia la lunghezza della DFT e il numero di campioni validi per blocco. Ogni blocco di ingresso ha lunghezza ed è formato da campioni sovrapposti (gli ultimi del blocco precedente) campioni nuovi. Il primo blocco ha zeri iniziali. Per ogni blocco: , IDFT, e si scartano i primi campioni di ; i restanti vanno in uscita.
Perché funziona. La convoluzione circolare a punti ripiega la coda dell'uscita lineare, lunga , sull'inizio: sono corrotti i primi campioni (esattamente quelli in cui il filtro "vede" l'ingresso oltre il bordo del blocco), mentre gli altri coincidono con la convoluzione lineare. Nei primi posti del blocco ci sono i campioni del blocco precedente, che servono proprio a rendere corretti i campioni successivi.
Esempio (lezione). Stessi dati, , (), , . Blocchi sovrapposti di :
- (due zeri iniziali): convoluzione circolare ; si scartano i primi due () e si tengono .
- (gli ultimi due campioni del blocco, poi i nuovi e zeri): circolare ; si scartano e si tengono .
Uscita: , uguale alla convoluzione lineare (verificato con Python). I campioni scartati ( e ) sono proprio quelli corrotti dall'aliasing: per la convoluzione lineare è e la coda si ripiega sui primi due posti, dove c'erano gli zeri.
Confronto e scelta
| overlap-add | overlap-save | |
|---|---|---|
| blocchi di ingresso | disgiunti, lunghezza | sovrapposti di , lunghezza |
| DFT | , ingresso con zero-padding | scelto, |
| uscita del blocco | campioni, con coda | campioni di cui corrotti |
| ricombinazione | somma delle code di campioni | scarto dei primi campioni |
| aliasing temporale | evitato con il padding | accettato e poi scartato |
I due metodi hanno la stessa complessità: per ogni blocco due FFT (blocco e inversa; è calcolata una volta sola) e moltiplicazioni. Si sceglie potenza di due, di solito alcune volte (come regola pratica -): con troppo vicino a i campioni validi sono pochi e si butta via molto lavoro; con troppo grande cresce il fattore e la memoria. In tempo reale il filtro introduce una latenza di almeno campioni (il blocco va raccolto prima di essere elaborato) più il ritardo del filtro stesso, se è a fase lineare (Sistemi a fase lineare e assenza di distorsioneUn sistema non deforma il segnale se y[n] = K x[n-n0]: modulo costante e fase lineare -n0 w, cioè ritardo di gruppo costante n0. Un sistema reale e causale ha fase lineare (generalizzata) se e solo se è FIR con risposta impulsiva simmetrica h[n] = h[N-n] (ampiezza pari, fase -N w/2) o antisimmetrica h[n] = -h[N-n] (ampiezza dispari, fase -N w/2 + pi/2). Il ritardo di gruppo è N/2: intero se N è pari (vale la condizione di non distorsione), semi-intero se N è dispari (uscita interpolata e ritardata). Un IIR causale non può essere simmetrico, quindi non ha fase lineare esatta.Sistemi a fase lineare e assenza di distorsione →).
Il codice Python dei due metodi, confrontati con np.convolve, è in Esercizio - Convoluzione a blocchi con la DFT.
Domande d'esame
- Spiegare come si calcola la convoluzione lineare di due sequenze finite con la DFT e quando conviene rispetto al calcolo diretto. Traccia: (potenza di 2), zero-padding, ; costo per campione contro ; rapporto ; caso (tabella: pareggio a ) e ().
- Descrivere il metodo overlap-add e dimostrare la formula di ricombinazione. Traccia: , , supporto , sovrapposizione di campioni, tre intervalli della somma, , esempio numerico .
- Descrivere overlap-save e confrontarlo con overlap-add. Traccia: blocchi di con campioni sovrapposti, , convoluzione circolare, primi campioni scartati perché corrotti dal ripiegamento; stessa complessità; scelta di ; latenza.
Versione ripasso
- Lineare con la DFT. Per di lunghezza e di lunghezza : (potenza di ), zero-padding di e , , antitrasformata. Con non c'è aliasing. Esempio: dà ; dà .
- Costo per campione. Diretto: . FFT: . Rapporto ; la FFT conviene se è minore di .
- Caso . e : per il diretto è più veloce (), per si è in pareggio (), per la FFT costa volte.
- Caso . : la FFT conviene se , con massimo circa per .
- Limite pratico. Una FFT enorme aspetta tutto il segnale e occupa memoria: si lavora a blocchi.
- Overlap-add ("sovrapponi e somma"). Blocchi disgiunti di lunghezza , con e , lunga e supporto . I blocchi si sovrappongono di campioni, che si sommano. ; la si calcola una sola volta.
- Esempio overlap-add. , , , : , traslata di ; la somma è .
- Overlap-save ("sovrapponi e conserva"). Blocchi di campioni, sovrapposti di (il primo con zeri iniziali), campioni validi per blocco. Si calcola la circolare a punti e si scartano i primi campioni, che sono corrotti dal ripiegamento della coda.
- Esempio overlap-save. Con , : dà circolare , si tengono ; dà circolare , si tengono .
- Confronto. Stessa complessità: due FFT per blocco e moltiplicazioni. Overlap-add somma le code; overlap-save scarta i campioni corrotti. Regola pratica -.
- Tempo reale. Latenza di almeno campioni più il ritardo del filtro, se è a fase lineare (Sistemi a fase lineare e assenza di distorsioneUn sistema non deforma il segnale se y[n] = K x[n-n0]: modulo costante e fase lineare -n0 w, cioè ritardo di gruppo costante n0. Un sistema reale e causale ha fase lineare (generalizzata) se e solo se è FIR con risposta impulsiva simmetrica h[n] = h[N-n] (ampiezza pari, fase -N w/2) o antisimmetrica h[n] = -h[N-n] (ampiezza dispari, fase -N w/2 + pi/2). Il ritardo di gruppo è N/2: intero se N è pari (vale la condizione di non distorsione), semi-intero se N è dispari (uscita interpolata e ritardata). Un IIR causale non può essere simmetrico, quindi non ha fase lineare esatta.Sistemi a fase lineare e assenza di distorsione →).
- Perché funziona overlap-save. La circolare a punti ripiega la coda dell'uscita lineare, lunga , sull'inizio: sono corrotti i primi campioni, esattamente quelli in cui il filtro vede l'ingresso oltre il bordo del blocco. Gli altri coincidono con la lineare.
- Tabella massimo. Con la FFT resta vantaggiosa fino a ; con fino a ; con fino a .
- Errore tipico. Dimenticare che le campioni del blocco precedente servono a rendere corretti quelli successivi (overlap-save), o sommare le code sbagliate (overlap-add).