Esercizio - Antitrasformata zeta con Python (lezione 10)
In questa pagina 5
Testo (dispensa "Focus on z anti-transform" della lezione 10 del corso Multimedia Signal Processing, UniPD, con il file MATLAB z_transform_exercises.m; qui rifatto in Python). Quattro esercizi: (1) antitrasformata di e verifica numerica; (2) frazioni parziali di ; (3) antitrasformata di un FIR con la divisione lunga; (4) diagramma poli-zeri e stabilità di . In MATLAB si usano impz, residuez e zplane; in Python scipy.signal.lfilter, residuez e tf2zpk.
Teoria usata: Antitrasformata zetaPer tornare da X(z) a x[n] serve anche la ROC. Formula di inversione x[n] = (1/2πj)∮ X(z)z^{n-1}dz (somma dei residui). Nella pratica: ispezione (riconoscere coppie note, scegliendo la ROC), divisione lunga (sviluppo in serie di potenze), frazioni parziali per le razionali. Causale con poli semplici p_k: X = Σ A_k/(1-p_k z^-1) con A_k = [(1-p_k z^-1)X]_{z=p_k}, x[n] = Σ A_k p_k^n u[n]; se il grado del numeratore in z^-1 è ≥ di quello del denominatore c'è anche una parte polinomiale (impulsi). Poli doppi: n a^n u[n]; poli complessi coniugati: r^n cos(ω0 n + φ).Antitrasformata zeta → (ispezione, frazioni parziali, divisione lunga), 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à → (poli, zeri, stabilità), Trasformata zeta - definizione e regione di convergenzaLa trasformata zeta bilatera X(z) = Σ x[n] z^{-n} associa a una sequenza una funzione della variabile complessa z, definita nella regione di convergenza (ROC), sempre una corona circolare |z| in (R1, R2). Segnale a durata finita: ROC tutto il piano (tranne eventualmente 0 e ∞); causale: |z| > R1 (teorema di Abel); anticausale: |z| < R2; bilatero: intersezione, se non vuota. La stessa espressione algebrica con ROC diverse è la trasformata di segnali diversi: la ROC fa parte della trasformata. Sulla circonferenza unitaria, se è nella ROC, X(e^{jθ}) è la trasformata di Fourier. Le ROC non contengono poli.Trasformata zeta - definizione e regione di convergenza →.
Traduzione degli strumenti
Una funzione razionale si rappresenta con i due vettori dei coefficienti in potenze di , in ordine crescente (b = [b0, b1, ...], a = [1, a1, ...]). La risposta impulsiva causale è la soluzione della ricorsione con ingresso , quindi coincide con l'antitrasformata:
import numpy as np
from scipy.signal import lfilter, residuez, tf2zpk
def impz(b, a, N):
"""Risposta impulsiva (antitrasformata causale) di B(z)/A(z)."""
d = np.zeros(N); d[0] = 1
return lfilter(b, a, d)residuez(b, a) dà residui , poli e la parte diretta (i coefficienti degli impulsi), come in MATLAB; tf2zpk(b, a) dà zeri e poli.
Esercizio 1 - un polo
, (geometrica di ragione ). La coppia () con restituisce : . La sequenza decade perché il polo è dentro il cerchio unitario ().
n = np.arange(20)
h = impz([1], [1, -0.5], 20)
print(np.max(np.abs(h - 0.5**n))) # 0.0impz risolve campione per campione, ed è esattamente (errore in aritmetica double).
Esercizio 2 - frazioni parziali
: poli semplici in e , causale. e . Quindi (tabella: , , , , : il polo in dà il valore costante a regime). Il polo in sta sul cerchio unitario: se questa fosse la funzione di sistema di un filtro, il filtro non sarebbe BIBO stabile (, diverge).
b2, a2 = [1], [1, -1.5, 0.5]
r, p, k = residuez(b2, a2) # r = [-1, 2], p = [0.5, 1], k = []
n = np.arange(25)
x_pf = np.real(r[0]*p[0]**n + r[1]*p[1]**n) # sum_k r_k p_k^n
print(np.max(np.abs(impz(b2, a2, 25) - x_pf))) # 0.0Non c'è parte diretta perché il numeratore () ha grado minore del denominatore. La ricostruzione coincide con la risposta impulsiva (errore ) e con .
Esercizio 3 - FIR e divisione lunga
è un polinomio in : confrontando con i coefficienti sono i campioni, per e altrove. La divisione lunga è banale (il denominatore è ). Per un IIR invece non termina: non si ferma mai, ed è per questo che per gli IIR si preferiscono le frazioni parziali.
print(impz([1, 2, 3, 2, 1], [1], 5)) # [1. 2. 3. 2. 1.]Differenza tra FIR e IIR: il FIR ha risposta impulsiva finita (la divisione termina), poli solo in e stabilità sempre; l'IIR ha poli non nulli e la stabilità dipende dalla loro posizione.
Esercizio 4 - poli, zeri e stabilità
.
Zeri. : zero in (blocca la continua; il numeratore è la differenza prima).
Poli. , cioè . Il prodotto delle radici è (modulo per ciascuna, essendo complesse coniugate) e la somma è , quindi e rad . I poli sono .
Errore nella dispensa del corso. La dispensa scrive "" (angolo ). Ma ha somma , mentre il polinomio ha somma : il coefficiente vale con solo se . Il modulo è giusto e quindi anche la conclusione sulla stabilità; la frequenza di risonanza è però rad/campione, non (con il calcolo numerico: massimo di in , vedi 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à →).
Stabilità. Sistema causale con poli : stabile (verificato: su campioni, che converge).
Risposta impulsiva. Con poli , è una sinusoide smorzata: scrivendo per e usando , si ha . Valori: (verificato con lfilter), con oscillazione di periodo campioni.
b4, a4 = [1, -1], [1, -0.9*np.cos(np.pi/4), 0.81]
z, p, kk = tf2zpk(b4, a4)
print(z, p, np.abs(p), np.degrees(np.angle(p)))
# [1.] [0.318+0.842j 0.318-0.842j] [0.9 0.9] [ 69.295 -69.295]Grafico interattivo: Risposta impulsiva di H(z) = (1 - z^-1)/(1 - 0,636 z^-1 + 0,81 z^-2): sinusoide smorzata (poli 0,9e^{±j1,209}), h[0] = 1, poi oscilla con inviluppo 0,9^n
Lettura del diagramma. Numeratore zeri frequenze bloccate; denominatore poli frequenze esaltate; tutti i poli con stabile.
Versione ripasso
Strumenti: e sono i coefficienti in potenze di . impz(b,a,N) è lfilter(b,a,δ), cioè la risposta impulsiva causale, uguale all'antitrasformata. residuez(b,a) dà residui , poli e parte diretta . tf2zpk(b,a) dà zeri e poli.
Esercizio 1. con dà : . Il polo è dentro il cerchio unitario. Errore numerico rispetto a .
Esercizio 2. ha e . Quindi e . residuez dà , , nessuna parte diretta. Il polo in sta sul cerchio unitario: il filtro non sarebbe BIBO stabile.
Esercizio 3. è un FIR: i coefficienti sono i campioni, . Per la divisione lunga non si ferma mai, per questo con gli IIR si usano le frazioni parziali.
Esercizio 4. .
- Zero: , cioè (blocca la continua).
- Poli: , con e rad .
- Stabile perché .
- Risposta impulsiva: (verificata con
lfilter), sinusoide smorzata con periodo campioni.
Teoria: Antitrasformata zetaPer tornare da X(z) a x[n] serve anche la ROC. Formula di inversione x[n] = (1/2πj)∮ X(z)z^{n-1}dz (somma dei residui). Nella pratica: ispezione (riconoscere coppie note, scegliendo la ROC), divisione lunga (sviluppo in serie di potenze), frazioni parziali per le razionali. Causale con poli semplici p_k: X = Σ A_k/(1-p_k z^-1) con A_k = [(1-p_k z^-1)X]_{z=p_k}, x[n] = Σ A_k p_k^n u[n]; se il grado del numeratore in z^-1 è ≥ di quello del denominatore c'è anche una parte polinomiale (impulsi). Poli doppi: n a^n u[n]; poli complessi coniugati: r^n cos(ω0 n + φ).Antitrasformata zeta →, 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à →, Trasformata zeta - definizione e regione di convergenzaLa trasformata zeta bilatera X(z) = Σ x[n] z^{-n} associa a una sequenza una funzione della variabile complessa z, definita nella regione di convergenza (ROC), sempre una corona circolare |z| in (R1, R2). Segnale a durata finita: ROC tutto il piano (tranne eventualmente 0 e ∞); causale: |z| > R1 (teorema di Abel); anticausale: |z| < R2; bilatero: intersezione, se non vuota. La stessa espressione algebrica con ROC diverse è la trasformata di segnali diversi: la ROC fa parte della trasformata. Sulla circonferenza unitaria, se è nella ROC, X(e^{jθ}) è la trasformata di Fourier. Le ROC non contengono poli.Trasformata zeta - definizione e regione di convergenza →.
Errori tipici:
- Usare come angolo dei poli: nella dispensa è sbagliato, l'angolo vale .
- Dimenticare che i coefficienti sono in .
- Pensare che un FIR possa essere instabile: ha poli solo in .
- Dimenticare che
residueznon dà parte diretta quando il grado del numeratore è minore di quello del denominatore.