Salta al contenuto
Note per Studenti Esercizio - Progetto di un Butterworth con la bilineare

Esercizio - Progetto di un Butterworth con la bilineare

In questa pagina 6

Testo (esempio 7.2 delle dispense del corso Multimedia Signal Processing, UniPD, e lezioni 22-23). Progettare un filtro IIR passa-basso di Butterworth con le specifiche: frequenza di campionamento Fs=8F_s=8 kHz, limite della banda passante fp=1f_p=1 kHz, limite della banda oscura fs=2f_s=2 kHz, ondulazione in banda passante Rp=0,1R_p=0{,}1 dB, attenuazione in banda oscura Rs=40R_s=40 dB. Determinare l'ordine NN, la pulsazione di taglio, i poli e i coefficienti di H(z)H(z) e verificare le specifiche.

Teoria usata: Filtri di ButterworthIl filtro di Butterworth analogico di ordine $N$ e pulsazione di taglio a $-3$ dB $\Omega_0$ ha $|H_a(j\Omega)|^2=\frac1{1+(\Omega/\Omega_0)^{2N}}$: massimamente piatto in $\Omega=0$, monotono decrescente, valore $\frac1{\sqrt2}$ in $\Omega_0$. È un filtro tutti-poli: i $2N$ poli di $H_a(s)H_a(-s)$ stanno su una circonferenza di raggio $\Omega_0$, $H_a(s)$ prende i $N$ poli del semipiano sinistro $s_k=\Omega_0e^{j\pi(\frac12+\frac{2k-1}{2N})}$, $H_a(s)=\Omega_0^N/\prod(s-s_k)$. Con la bilineare $H(z)=A\frac{(1+z^{-1})^N}{\prod(1-p_kz^{-1})}$, $p_k=\frac{1+s_k}{1-s_k}$, zero di molteplicità $N$ in $z=-1$, $A$ tale che $H(1)=1$; il modulo digitale è $|H(e^{j\hat\omega})|^2=\frac1{1+(\tan(\hat\omega/2)/\Omega_0)^{2N}}$. Il filtro è fissato da $N$ e $\Omega_0$. Dalle specifiche ($\varepsilon^2=10^{R_p/10}-1$, $A=10^{R_s/20}$, $\Omega_p=\tan\frac{\hat\omega_p}2$, $\Omega_s=\tan\frac{\hat\omega_s}2$): $N=\Big\lceil\frac{\log_{10}\frac{A^2-1}{\varepsilon^2}}{2\log_{10}(\Omega_s/\Omega_p)}\Big\rceil$ e $\Omega_0$ fra $\Omega_p\varepsilon^{-1/N}$ e $\Omega_s(A^2-1)^{-1/2N}$.Filtri di Butterworth →, Trasformazione bilinearePer progettare un IIR si parte da un filtro analogico noto $H_a(s)$ e si sostituisce $s=\frac{z-1}{z+1}$ (trasformazione bilineare): $H(z)=H_a!\big(\frac{z-1}{z+1}\big)$. Questa mappa manda funzioni razionali in funzioni razionali, l'asse immaginario $s=j\Omega$ nella circonferenza unitaria $z=e^{j\hat\omega}$ e il semipiano sinistro nel disco unitario, quindi conserva la stabilità. Poli e zeri vanno in $\hat z=\frac{1+\hat s}{1-\hat s}$ ($s=0\to z=1$, $s=\infty\to z=-1$). Le frequenze si corrispondono con $\Omega=\tan\frac{\hat\omega}{2}$, cioè $\hat\omega=2\arctan\Omega$: relazione non lineare che comprime l'asse e distorce le frequenze (warping). Il modulo si conserva (oscillazioni, tolleranze $\delta_p,\delta_s$) ma la fase no: si perde la fase lineare. Per i filtri selettivi in frequenza la distorsione si compensa progettando il filtro analogico alle frequenze trasformate $\Omega_p=\tan\frac{\hat\omega_p}2$, $\Omega_s=\tan\frac{\hat\omega_s}2$ (prewarping).Trasformazione bilineare →, 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 →, Funzione di sistema, poli, zeri e stabilitàLa funzione di sistema H(z) è la trasformata zeta della risposta impulsiva: con ingresso z^n l'uscita è H(z) z^n. Per un FIR H(z) = Σ b_k z^{-k} è un polinomio con M zeri e M poli in z = 0; in generale H = B(z)/A(z) dall'equazione alle differenze. Sulla circonferenza unitaria H(e^{jω̂}) è la risposta in frequenza: |H| = prodotto delle distanze dagli zeri / prodotto delle distanze dai poli, quindi gli zeri bloccano frequenze e i poli le esaltano. Un LTI causale è BIBO stabile se e solo se tutti i poli hanno modulo < 1 (a meno di cancellazioni polo-zero); i FIR sono sempre stabili.Funzione di sistema, poli, zeri e stabilità →.

1. Dalle frequenze analogiche alle digitali, e viceversa (prewarping)

Le pulsazioni digitali normalizzate sono ω^=2πf/Fs\hat\omega=2\pi f/F_s: ω^p=2π10008000=π4,ω^s=2π20008000=π2.\hat\omega_p=2\pi\frac{1000}{8000}=\frac\pi4,\qquad\hat\omega_s=2\pi\frac{2000}{8000}=\frac\pi2 . La bilineare le mette in corrispondenza con Ω=tan⁡ω^2\Omega=\tan\frac{\hat\omega}2, quindi il filtro analogico va progettato per Ωp=tan⁡π8=0,4142,Ωs=tan⁡π4=1.\Omega_p=\tan\frac\pi8=0{,}4142,\qquad\Omega_s=\tan\frac\pi4=1 . Gli errori sono conservati dalla trasformazione, quindi si usano direttamente: ε2=10Rp/10−1=100,01−1=0,02329  (ε=0,1526),A=10Rs/20=100.\varepsilon^2=10^{R_p/10}-1=10^{0{,}01}-1=0{,}02329\ \ (\varepsilon=0{,}1526),\qquad A=10^{R_s/20}=100 .

2. Ordine

N≥log⁡10A2−1ε22log⁡10ΩsΩp=log⁡1099990,023292log⁡1010,4142=5,63270,7656=7,358 ⇒ N=8.N\ge\frac{\log_{10}\dfrac{A^2-1}{\varepsilon^2}}{2\log_{10}\dfrac{\Omega_s}{\Omega_p}}=\frac{\log_{10}\dfrac{9999}{0{,}02329}}{2\log_{10}\dfrac{1}{0{,}4142}}=\frac{5{,}6327}{0{,}7656}=7{,}358\ \Rightarrow\ N=8 . Si arrotonda per eccesso: con N=7N=7 non si rispetterebbero le specifiche.

3. Pulsazione di taglio Ω0\Omega_0

Due scelte possibili: Ω0=Ωs (A2−1)−12N=1⋅9999−1/16=0,5623(banda oscura esatta),Ω0=Ωp ε−1N=0,4142⋅0,1526−1/8=0,5239(banda passante esatta).\Omega_0=\Omega_s\,(A^2-1)^{-\frac1{2N}}=1\cdot9999^{-1/16}=0{,}5623\quad\text{(banda oscura esatta)},\qquad\Omega_0=\Omega_p\,\varepsilon^{-\frac1N}=0{,}4142\cdot0{,}1526^{-1/8}=0{,}5239\quad\text{(banda passante esatta)}. Poiché N=8>7,358N=8>7{,}358, ogni valore fra 0,52390{,}5239 e 0,56230{,}5623 è accettabile. Si sceglie Ω0=0,5623\Omega_0=0{,}5623; il taglio digitale a −3-3 dB è ω^0=2arctan⁡0,5623=0,326π\hat\omega_0=2\arctan0{,}5623=0{,}326\pi (cioè 1,301{,}30 kHz).

4. Poli analogici e digitali

I poli di Ha(s)H_a(s) stanno sul semipiano sinistro, sulla circonferenza di raggio Ω0\Omega_0: sk=Ω0[−sin⁡(2k−1)π16+jcos⁡(2k−1)π16]s_k=\Omega_0\big[-\sin\frac{(2k-1)\pi}{16}+j\cos\frac{(2k-1)\pi}{16}\big], k=1,…,8k=1,\dots,8:

kk sks_k pk=1+sk1−skp_k=\frac{1+s_k}{1-s_k} ∣pk∣\lvert p_k\rvert
1, 8 −0,1097±0,5515j-0{,}1097\pm0{,}5515j 0,4453±0,7183j0{,}4453\pm0{,}7183j 0,84510{,}8451
2, 7 −0,3124±0,4676j-0{,}3124\pm0{,}4676j 0,3523±0,4818j0{,}3523\pm0{,}4818j 0,59680{,}5968
3, 6 −0,4676±0,3124j-0{,}4676\pm0{,}3124j 0,3037±0,2775j0{,}3037\pm0{,}2775j 0,41140{,}4114
4, 5 −0,5515±0,1097j-0{,}5515\pm0{,}1097j 0,2826±0,0907j0{,}2826\pm0{,}0907j 0,29680{,}2968

Tutti i poli digitali sono dentro il cerchio unitario (come garantito dalla bilineare). Esempio di calcolo per k=1k=1: s1=−0,1097+0,5515js_1=-0{,}1097+0{,}5515j, 1+s1=0,8903+0,5515j1+s_1=0{,}8903+0{,}5515j, 1−s1=1,1097−0,5515j1-s_1=1{,}1097-0{,}5515j, il rapporto dà 0,4453+0,7183j0{,}4453+0{,}7183j.

5. Funzione di sistema

H(z)=A (1+z−1)8∏k=18(1−pkz−1),A=∏k(1−pk)28=6,1595⋅10−4,H(z)=A\,\frac{(1+z^{-1})^8}{\prod_{k=1}^8(1-p_kz^{-1})},\qquad A=\frac{\prod_k(1-p_k)}{2^8}=6{,}1595\cdot10^{-4}, dove AA si ricava da H(1)=1H(1)=1. Svolgendo i prodotti: H(z)=6,1595⋅10−4 (1+8z−1+28z−2+56z−3+70z−4+56z−5+28z−6+8z−7+z−8)1−2,76773z−1+4,16903z−2−3,91878z−3+2,48927z−4−1,06826z−5+0,30055z−6−0,05019z−7+0,00379z−8.H(z)=\frac{6{,}1595\cdot10^{-4}\,\big(1+8z^{-1}+28z^{-2}+56z^{-3}+70z^{-4}+56z^{-5}+28z^{-6}+8z^{-7}+z^{-8}\big)}{1-2{,}76773z^{-1}+4{,}16903z^{-2}-3{,}91878z^{-3}+2{,}48927z^{-4}-1{,}06826z^{-5}+0{,}30055z^{-6}-0{,}05019z^{-7}+0{,}00379z^{-8}}. I coefficienti binomiali 1,8,28,56,70,…1,8,28,56,70,\dots sono quelli di (1+z−1)8(1+z^{-1})^8: otto zeri in z=−1z=-1. Numeratore: 0,00062; 0,00493; 0,01725; 0,03449; 0,04312;…0{,}00062;\,0{,}00493;\,0{,}01725;\,0{,}03449;\,0{,}04312;\dots (simmetrico). Gli stessi coefficienti escono da scipy.signal.butter(8, 0.32612) (0,32612=2πarctan⁡0,56230{,}32612=\frac{2}{\pi}\arctan0{,}5623).

6. Verifica delle specifiche

python
import numpy as np
from scipy import signal
O0 = 0.5623448400103591
b, a = signal.butter(8, 2*np.arctan(O0)/np.pi)           # Butterworth digitale con taglio 2 arctan(O0)
w, H = signal.freqz(b, a, worN=[np.pi/4, np.pi/2])
print(20*np.log10(np.abs(H)))                            # -0.0325 dB in wp, -40.00 dB in ws
print(signal.buttord(0.25, 0.5, 0.1, 40))                # (8, 0.30724...): N = 8

Risultati: con Ω0=0,5623\Omega_0=0{,}5623 il modulo vale 0,996270{,}99627 (−0,0325-0{,}0325 dB) in ω^p\hat\omega_p, quindi la banda passante è rispettata con margine (serve almeno −0,1-0{,}1 dB), e 0,01000{,}0100 (−40,00-40{,}00 dB) in ω^s\hat\omega_s: la banda oscura è soddisfatta con uguaglianza. Con Ω0=0,5239\Omega_0=0{,}5239 (taglio digitale 0,3072π0{,}3072\pi, valore restituito da buttord) si ha esattamente −0,1000-0{,}1000 dB in ω^p\hat\omega_p e −44,92-44{,}92 dB in ω^s\hat\omega_s. Con il valore intermedio Ω0=0,5431\Omega_0=0{,}5431: −0,0565-0{,}0565 dB e −42,41-42{,}41 dB. In tutti e tre i casi le specifiche sono soddisfatte, come previsto.

Grafico interattivo: Esempio di progetto (Fs = 8 kHz, fp = 1 kHz, fs = 2 kHz, Rp = 0,1 dB, Rs = 40 dB): Butterworth N = 8 con Ω0 = 0,5623. La curva sta sopra -0,1 dB in banda passante e sotto -40 dB da ωs = π/2

Osservazione. Il filtro ha 88 poli e 88 zeri in z=−1z=-1: costa 1717 moltiplicazioni per campione (o meno sfruttando gli zeri). Un FIR a fase lineare che realizzi le stesse specifiche richiederebbe un ordine molto più alto. Nelle dispense (esempio 7.2) il parametro è scritto ε=10Rp/10≃0,1526\varepsilon=\sqrt{10^{R_p/10}}\simeq0{,}1526: manca il "−1-1" sotto la radice, perché 100,01=1,0116\sqrt{10^{0{,}01}}=1{,}0116. Il valore 0,15260{,}1526 è quello di ε=10Rp/10−1\varepsilon=\sqrt{10^{R_p/10}-1}, cioè ε2=100,01−1=0,02329\varepsilon^2=10^{0{,}01}-1=0{,}02329, ed è l'unico coerente con ∣Ha(jΩp)∣2=11+ε2|H_a(j\Omega_p)|^2=\frac1{1+\varepsilon^2}. Il risultato N≃7,3576N\simeq7{,}3576 delle dispense coincide con il nostro 7,3587{,}358 a meno dell'arrotondamento.

Versione ripasso

Prewarping. ω^p=π4\hat\omega_p=\frac\pi4 e ω^s=π2\hat\omega_s=\frac\pi2 diventano Ω=tan⁡ω^2\Omega=\tan\frac{\hat\omega}2: Ωp=tan⁡π8=0,4142\Omega_p=\tan\frac\pi8=0{,}4142, Ωs=1\Omega_s=1. Errori: ε2=10Rp/10−1=0,02329\varepsilon^2=10^{R_p/10}-1=0{,}02329, A=10Rs/20=100A=10^{R_s/20}=100.

Ordine. N≥log⁡10A2−1ε22log⁡10ΩsΩp=7,358N\ge\dfrac{\log_{10}\dfrac{A^2-1}{\varepsilon^2}}{2\log_{10}\dfrac{\Omega_s}{\Omega_p}}=7{,}358, quindi N=8N=8 (arrotondato per eccesso).

Taglio. Ω0∈[0,5239, 0,5623]\Omega_0\in[0{,}5239,\,0{,}5623]. Si sceglie Ω0=0,5623\Omega_0=0{,}5623, taglio digitale ω^0=2arctan⁡0,5623=0,326π\hat\omega_0=2\arctan0{,}5623=0{,}326\pi.

Poli. sk=Ω0[−sin⁡(2k−1)π16+jcos⁡(2k−1)π16]s_k=\Omega_0\big[-\sin\frac{(2k-1)\pi}{16}+j\cos\frac{(2k-1)\pi}{16}\big], poi pk=1+sk1−skp_k=\dfrac{1+s_k}{1-s_k}. Esempio: s1=−0,1097+0,5515js_1=-0{,}1097+0{,}5515j, p1=0,4453+0,7183jp_1=0{,}4453+0{,}7183j, ∣p1∣=0,8451\lvert p_1\rvert=0{,}8451. Tutti dentro il cerchio unitario.

Funzione di sistema. H(z)=A (1+z−1)8∏k=18(1−pkz−1),A=∏k(1−pk)28=6,1595⋅10−4,H(z)=A\,\frac{(1+z^{-1})^8}{\prod_{k=1}^8(1-p_kz^{-1})},\qquad A=\frac{\prod_k(1-p_k)}{2^8}=6{,}1595\cdot10^{-4}, con H(1)=1H(1)=1. Otto zeri in z=−1z=-1, coefficienti binomiali al numeratore.

Verifica. Con Ω0=0,5623\Omega_0=0{,}5623: −0,0325-0{,}0325 dB in ω^p=π4\hat\omega_p=\frac\pi4 (specifica −0,1-0{,}1 dB) e −40,00-40{,}00 dB in ω^s=π2\hat\omega_s=\frac\pi2. Con Ω0=0,5239\Omega_0=0{,}5239: −0,1000-0{,}1000 dB e −44,92-44{,}92 dB.

Teoria: Filtri di ButterworthIl filtro di Butterworth analogico di ordine $N$ e pulsazione di taglio a $-3$ dB $\Omega_0$ ha $|H_a(j\Omega)|^2=\frac1{1+(\Omega/\Omega_0)^{2N}}$: massimamente piatto in $\Omega=0$, monotono decrescente, valore $\frac1{\sqrt2}$ in $\Omega_0$. È un filtro tutti-poli: i $2N$ poli di $H_a(s)H_a(-s)$ stanno su una circonferenza di raggio $\Omega_0$, $H_a(s)$ prende i $N$ poli del semipiano sinistro $s_k=\Omega_0e^{j\pi(\frac12+\frac{2k-1}{2N})}$, $H_a(s)=\Omega_0^N/\prod(s-s_k)$. Con la bilineare $H(z)=A\frac{(1+z^{-1})^N}{\prod(1-p_kz^{-1})}$, $p_k=\frac{1+s_k}{1-s_k}$, zero di molteplicità $N$ in $z=-1$, $A$ tale che $H(1)=1$; il modulo digitale è $|H(e^{j\hat\omega})|^2=\frac1{1+(\tan(\hat\omega/2)/\Omega_0)^{2N}}$. Il filtro è fissato da $N$ e $\Omega_0$. Dalle specifiche ($\varepsilon^2=10^{R_p/10}-1$, $A=10^{R_s/20}$, $\Omega_p=\tan\frac{\hat\omega_p}2$, $\Omega_s=\tan\frac{\hat\omega_s}2$): $N=\Big\lceil\frac{\log_{10}\frac{A^2-1}{\varepsilon^2}}{2\log_{10}(\Omega_s/\Omega_p)}\Big\rceil$ e $\Omega_0$ fra $\Omega_p\varepsilon^{-1/N}$ e $\Omega_s(A^2-1)^{-1/2N}$.Filtri di Butterworth →, Trasformazione bilinearePer progettare un IIR si parte da un filtro analogico noto $H_a(s)$ e si sostituisce $s=\frac{z-1}{z+1}$ (trasformazione bilineare): $H(z)=H_a!\big(\frac{z-1}{z+1}\big)$. Questa mappa manda funzioni razionali in funzioni razionali, l'asse immaginario $s=j\Omega$ nella circonferenza unitaria $z=e^{j\hat\omega}$ e il semipiano sinistro nel disco unitario, quindi conserva la stabilità. Poli e zeri vanno in $\hat z=\frac{1+\hat s}{1-\hat s}$ ($s=0\to z=1$, $s=\infty\to z=-1$). Le frequenze si corrispondono con $\Omega=\tan\frac{\hat\omega}{2}$, cioè $\hat\omega=2\arctan\Omega$: relazione non lineare che comprime l'asse e distorce le frequenze (warping). Il modulo si conserva (oscillazioni, tolleranze $\delta_p,\delta_s$) ma la fase no: si perde la fase lineare. Per i filtri selettivi in frequenza la distorsione si compensa progettando il filtro analogico alle frequenze trasformate $\Omega_p=\tan\frac{\hat\omega_p}2$, $\Omega_s=\tan\frac{\hat\omega_s}2$ (prewarping).Trasformazione bilineare →, 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 →, Funzione di sistema, poli, zeri e stabilitàLa funzione di sistema H(z) è la trasformata zeta della risposta impulsiva: con ingresso z^n l'uscita è H(z) z^n. Per un FIR H(z) = Σ b_k z^{-k} è un polinomio con M zeri e M poli in z = 0; in generale H = B(z)/A(z) dall'equazione alle differenze. Sulla circonferenza unitaria H(e^{jω̂}) è la risposta in frequenza: |H| = prodotto delle distanze dagli zeri / prodotto delle distanze dai poli, quindi gli zeri bloccano frequenze e i poli le esaltano. Un LTI causale è BIBO stabile se e solo se tutti i poli hanno modulo < 1 (a meno di cancellazioni polo-zero); i FIR sono sempre stabili.Funzione di sistema, poli, zeri e stabilità →.

Errori tipici:

  • Usare Ω=ω^\Omega=\hat\omega invece di tan⁡ω^2\tan\frac{\hat\omega}2: il prewarping va applicato.
  • Arrotondare N=7,358N=7{,}358 per difetto: con N=7N=7 le specifiche non sono rispettate.
  • Dimenticare il −1-1 in ε2=10Rp/10−1\varepsilon^2=10^{R_p/10}-1: così si ottiene ε=1,0116\varepsilon=1{,}0116 invece di 0,15260{,}1526.
  • Scrivere AA senza il fattore 282^8 del denominatore: H(1)H(1) non è 11.

Teoria collegata