Filtri IIR digitali e cascata di biquad
Progetto di filtri IIR nelle cinque famiglie classiche (Butterworth, Chebyshev I e II, ellittico, Bessel) come cascata di sezioni del secondo ordine: trasformata bilineare, stabilità dai poli, coefficienti SOS ed export per CMSIS-DSP.
Cosa fa lo strumento
Progetta un filtro IIR digitale a partire da una specifica (tipo, famiglia, ordine, frequenza di campionamento e di taglio) e restituisce i coefficienti biquad, la risposta in frequenza (ampiezza e fase), la mappa poli/zeri e l’export per CMSIS-DSP. Il calcolo gira nel browser su un’implementazione propria, senza dipendenze runtime: prototipo analogico → trasformazione LP→LP / LP→HP → bilineare → SOS, con l’algoritmo di Orfanidis per le funzioni ellittiche di Jacobi dell’ellittico.
Un filtro IIR di ordine N si realizza come cascata di sezioni del secondo ordine (SOS, second-order sections): è la forma numericamente robusta, perché una singola sezione di ordine alto accumula errori di quantizzazione sui coefficienti. Ogni sezione è un biquad:
Dal continuo al discreto: trasformata bilineare
Il prototipo analogico (Butterworth o Bessel) viene mappato nel piano z con la trasformata bilineare. Per far coincidere esattamente la frequenza di taglio si applica il pre-warping:
dove T = 1/Fs. La bilineare conserva la stabilità e comprime l’asse delle frequenze: tutto l’asse analogico 0…∞ finisce nell’intervallo 0…Fs/2 (Nyquist).
Stabilità: si legge dai poli
I poli sono le radici del denominatore di ciascun biquad; gli zeri quelle del numeratore. La bilineare manda il semipiano sinistro analogico (stabile) nell’interno del cerchio unitario. Quindi:
Lo strumento calcola i poli risolvendo z² + a₁z + a₂ = 0 per ogni sezione e segnala se anche uno solo esce dal cerchio unitario.
Le cinque approssimazioni: quale scegliere
Le famiglie sono i diversi modi di approssimare la risposta ideale “a muro”. Ognuna è un compromesso tra ripidità della transizione, ripple (ondulazione) e linearità di fase (fedeltà nel tempo). Lo strumento le copre tutte.
Butterworth — modulo massimamente piatto
Nessun ripple in banda passante, attenuazione asintotica di 20·N dB/decade, roll-off il più dolce del gruppo.
Quando: banda passante pulita, ordine non critico. Default ragionevole quando non hai requisiti stringenti. Casi d’uso: condizionamento di sensori, anti-aliasing non aggressivo, livellamento generico.
Chebyshev I — ripple in banda passante
Ammette un ripple Ap in banda passante (parametro ε) in cambio di una transizione più ripida di Butterworth a parità di ordine. Stopband monotona.
dove Tₙ è il polinomio di Chebyshev. Quando: serve più selettività e si tollera un po’ di ondulazione in banda. Casi d’uso: filtri di canale, separazione di bande dove l’ampiezza in banda non deve essere perfettamente piatta.
Chebyshev II (inverso) — ripple in stopband
Banda passante piatta (come Butterworth), ripple in stopband (parametro As). La transizione è ripida e l’attenuazione equiripple garantisce un minimo di reiezione costante.
Quando: vuoi banda passante pulita ma accetti ondulazioni nell’attenuata, con un livello minimo di reiezione garantito. Casi d’uso: anti-aliasing dove conta la planarità della banda utile e basta un floor di stopband.
Ellittico / Cauer — il più ripido
Ripple in entrambe le bande. A parità di ordine ha la transizione più ripida in assoluto: nessuna altra approssimazione classica lo batte in selettività per dato N. Il prezzo è la fase più non lineare (ritardo di gruppo molto variabile vicino al taglio) e maggiore overshoot/ringing nel tempo.
dove Rₙ è la funzione razionale ellittica (costruita su funzioni ellittiche jacobiane) e ξ il fattore di selettività che lega ripple in banda passante e attenuata. Casi limite (inquadrano la sua generalità):
- ripple stopband → 0 degenera in Chebyshev I
- ripple passband → 0 degenera in Chebyshev II
- entrambi → 0 degenera in Butterworth
Quindi l’ellittico è la forma generale; le altre tre sono suoi casi particolari. Quando: serve la massima ripidità con l’ordine (e quindi il costo computazionale) più basso, e puoi tollerare ripple e fase non lineare. Casi d’uso: anti-aliasing aggressivi, reiezione stretta di toni/bande, applicazioni dove conta solo il modulo e non la forma d’onda.
Il ritardo di gruppo, misurato
Dire che il Bessel ha «ritardo di gruppo quasi costante» è vero ma non dice quanto. Calcolato per differenze finite sulla fase, in campioni, per i quattro filtri a ordine 4 con Fc = 100 Hz e fs = 1000 Hz:
| Famiglia | 10 Hz | 50 Hz | 100 Hz | 150 Hz | Escursione in banda |
|---|---|---|---|---|---|
| Bessel | 4,93 | 5,04 | 4,49 | 2,63 | 12,4 % |
| Butterworth | 4,04 | 4,66 | 6,29 | 2,61 | 61,4 % |
| Chebyshev I | 4,33 | 5,94 | 13,59 | 1,40 | 213,7 % |
| Ellittico | 3,56 | 5,56 | 17,95 | 1,33 | 404,3 % |
L’ultima colonna è l’escursione percentuale del ritardo fra 10 e 100 Hz, e mette in fila le famiglie in un ordine preciso: Bessel 12 %, Butterworth 61 %, Chebyshev I 214 %, ellittico 404 %. Un fronte che attraversa l’ellittico esce con le sue componenti spettrali sfasate di un fattore quattro nel tempo di transito: è esattamente l’origine del ringing. Se il segnale è un impulso, un fronte, una forma d’onda da misurare nel tempo, quella colonna conta più della ripidezza.
Si noti anche che il ritardo cala a 150 Hz per tutte: fuori banda il filtro non ritarda, attenua, e il ritardo di gruppo perde significato pratico.
Quanto resta della linearità di fase in digitale
La linearità del Bessel è una proprietà del prototipo analogico, e la bilineare la deforma. Quanto? Dipende da dove sta Fc rispetto a fs:
| f_c / f_s | Escursione del ritardo di gruppo in banda |
|---|---|
| 0,005 | 21,1 % |
| 0,010 | 21,0 % |
| 0,025 | 20,5 % |
| 0,050 | 18,6 % |
| 0,100 | 12,4 % |
| 0,200 | 26,7 % |
| 0,400 | 750,7 % |
Sotto fc/fs ≈ 0,1 il Bessel digitale conserva il comportamento analogico: l’escursione del 18–21 % è quella intrinseca del prototipo a ordine 4, non un danno della trasformazione. Attorno a 0,2 la bilineare inizia a mordere, e a fc/fs = 0,4 l’escursione arriva al 750 %: il filtro ha perso qualunque somiglianza con un Bessel. La regola pratica è quindi netta — se si sceglie il Bessel per la fase, si sovracampiona: la fase lineare digitale si compra con un fs almeno dieci volte la banda utile, oppure si passa a un FIR, dove è esatta per costruzione.
Bessel / Thomson — fase massimamente lineare
Ritardo di gruppo quasi costante (fase lineare): preserva la forma d’onda nel tempo, niente overshoot sul gradino. Roll-off molto dolce. Nota: la linearità di fase del Bessel è una proprietà analogica; la trasformazione bilineare la distorce, quindi in digitale è meno netta (per fase lineare esatta in digitale si usano i FIR).
Quando: conta la fedeltà nel dominio del tempo (impulsi, transitori, forme d’onda) più dell’attenuazione. Casi d’uso: catene audio/strumentazione dove l’overshoot è inaccettabile, ricostruzione di segnali a fronte ripido.
Le cinque famiglie non sono confrontabili a frequenza fissa
Prima di ogni confronto va sciolto un equivoco che manda fuori strada quasi tutti. Il campo Fc dello strumento non significa la stessa cosa per le cinque famiglie: ognuna normalizza il proprio prototipo su un bordo diverso, e all’ampiezza a Fc questo si vede subito.
| Famiglia | Cosa significa f_c | Ampiezza a f_c |
|---|---|---|
| Butterworth | bordo −3 dB | −3,01 dB |
| Chebyshev I | bordo del ripple di banda passante | −1,00 dB |
| Chebyshev II | bordo della stopband | −40,00 dB |
| Ellittico | bordo del ripple di banda passante | −1,00 dB |
| Bessel | normalizzazione del ritardo | −7,58 dB |
Quindi la domanda «quanto attenua a 2·Fc?» non ha una risposta confrontabile: si stanno misurando cinque filtri con l’origine in cinque posti diversi. Chi confronta le famiglie a frequenza fissa conclude, per esempio, che il Chebyshev II è fenomenale a ordine 2 — quando in realtà sta solo leggendo il valore che gli è stato imposto per definizione.
Le due metriche che invece si confrontano
La prima è la larghezza di transizione: a che multiplo di Fc si raggiungono i 40 dB di attenuazione.
| Famiglia | N = 2 | N = 4 | N = 6 | N = 8 |
|---|---|---|---|---|
| Bessel | × 4,05 | × 2,52 | × 1,91 | × 1,63 |
| Butterworth | × 4,05 | × 2,54 | × 1,95 | × 1,67 |
| Chebyshev I | × 4,04 | × 2,07 | × 1,48 | × 1,27 |
| Chebyshev II | × 1,00 | × 1,00 | × 1,00 | × 1,00 |
| Ellittico | × 3,69 | × 1,46 | × 1,09 | × 1,02 |
Letta così, la gerarchia è quella che ci si aspetta: l’ellittico vince (1,02·Fc a ordine 8, praticamente un muro), poi Chebyshev I, poi Butterworth e Bessel appaiati. Il Chebyshev II segna 1,00 a ogni ordine perché la sua Fc è il bordo di stopband: la riga non dice che è il più ripido, dice che la domanda è mal posta per quella famiglia.
La seconda è il pavimento di stopband, cioè la peggiore attenuazione in tutta la banda oscura:
| Famiglia | N = 2 | N = 4 | N = 6 | N = 8 |
|---|---|---|---|---|
| Bessel | −14,9 dB | −29,0 dB | −43,0 dB | −56,9 dB |
| Butterworth | −14,1 dB | −28,0 dB | −41,9 dB | −55,9 dB |
| Chebyshev I | −13,4 dB | −38,3 dB | −63,3 dB | −88,4 dB |
| Chebyshev II | −40,0 dB | −40,0 dB | −40,0 dB | −40,0 dB |
| Ellittico | −13,8 dB | −40,0 dB | −40,0 dB | −40,0 dB |
Qui si vede la differenza strutturale fra le due metà della tabella. Butterworth, Bessel e Chebyshev I non hanno una specifica di stopband, quindi il pavimento scende con l’ordine — il Chebyshev I arriva a −88 dB a ordine 8. Chebyshev II ed ellittico hanno una stopband equiripple fissata dal parametro Rs: aumentare l’ordine non approfondisce l’attenuazione, la lascia inchiodata a −40 dB e stringe la transizione. Sono due filosofie di progetto diverse, e sceglierle a caso è il modo più comune di sprecare ordine.
Un caso di frontiera vale la nota: l’ellittico a ordine 2 non arriva a 40 dB (segna −13,8) perché con due poli non esiste una soluzione che soddisfi contemporaneamente 1 dB di ripple e 40 dB di stopband. Non è un difetto del calcolo: è l’equazione del grado che dice che quella specifica chiede almeno l’ordine 4.
Export CMSIS-DSP
I coefficienti sono esportati per arm_biquad_cascade_df2T_f32 di Arm: 5 valori per stadio nell’ordine {b0, b1, b2, a1, a2}, con a1 e a2 negati rispetto alla funzione di trasferimento. CMSIS implementa infatti:
Il segno meno è già incorporato nei coefficienti generati: si copia l’array float32_t direttamente nel firmware.
Validazione e limiti
La risposta in ampiezza di tutte e cinque le famiglie (LP e HP) è stata confrontata con scipy.signal (butter, cheby1, cheby2, ellip, bessel → sosfreqz), con tutti i poli dentro il cerchio unitario (test automatici inclusi nel repository).
| Famiglia | Punto | Qui | scipy (2 decimali) |
|---|---|---|---|
| Butterworth | 100 Hz | −3,010 dB | −3,01 dB |
| Butterworth | 200 Hz | −27,966 dB | −27,97 dB |
| Chebyshev I | 200 Hz | −38,269 dB | −38,27 dB |
| Chebyshev II | 200 Hz | −51,056 dB | −51,06 dB |
| Ellittico | 200 Hz | −40,881 dB | −40,88 dB |
| Bessel | 100 Hz | −7,578 dB | −7,58 dB |
I riferimenti sono trascritti a due decimali, quindi un confronto con questa tabella non può dire più di ±0,005 dB: i millesimi di differenza sono il residuo della troncatura, non un errore del progetto.
Dove esiste una forma chiusa il riferimento si calcola invece di trascriverlo, e la verifica diventa esatta. Per il Butterworth bilineare con prewarping
e a f = 2·f_c il rapporto delle tangenti vale esattamente √5, quindi il valore atteso è −10·log₁₀(1 + 5^N) = −27,965743 dB per N = 4 — la cifra che compare in tabella. La cascata di biquad generata coincide con la forma chiusa a precisione macchina su tutta la banda e per tutti gli ordini 2–8: lo verifica il test Butterworth contro la forma chiusa, con tolleranza 10⁻⁹ dB.
Un avvertimento sul metodo, se volete rifare la verifica: il dB va valutato esattamente alla frequenza, non letto dal punto più vicino della griglia della risposta. A 512 punti quella lettura sbaglia di 0,09 dB a 200 Hz, venti volte la differenza che si sta cercando.
L’ellittico usa l’algoritmo di Orfanidis (trasformazione di Landen per le funzioni ellittiche di Jacobi).
Limiti v0.2: passa-basso e passa-alto, ordini pari 2–8. Bandpass/bandstop in arrivo. Cutoff Fc = bordo della banda passante (−3 dB per Butterworth; bordo di ripple per Chebyshev I ed Ellittico; bordo di stopband per Chebyshev II; normalizzazione del ritardo per Bessel). Strumento dimostrativo: non sostituisce gli strumenti di progetto e verifica di una toolchain DSP di produzione.
Un progetto simile?
Acustica, embedded, strumenti di calcolo: se hai un caso d’uso vicino, parliamone.