Esercizio - convoluzione di impulsi rettangolari discreti
In questa pagina 5
Testo (dispense del corso Teoria dei Segnali, UniPD, Esempio 5.4A). Calcolare la convoluzione dei due segnali discreti
Come secondo caso si calcola la convoluzione di due rettangoli non centrati nell'origine, e .
Teoria usata: Segnali a tempo discretoUn segnale a tempo discreto è una funzione complessa $s(nT)$ definita sui multipli interi del quanto temporale $T$ (insieme $\mathbb Z(T)$, velocità $F_p=1/T$). Le definizioni sono quelle dei segnali continui con la somma al posto dell'integrale e il quanto $T$ al posto di $dt$: area $\sum T,s(nT)$, energia $\sum T|s(nT)|^2$, convoluzione $\sum T,x(kT)y(nT-kT)$. L'impulso ideale discreto vale $1/T$ nell'origine. Esponenziali e sinusoidi discreti sono periodici solo se $f_0/F_p$ è razionale e hanno frequenza ambigua a meno di multipli di $F_p$. I segnali periodici con periodo $NT$ sono descritti da $N$ valori e si trattano al calcolatore.Segnali a tempo discreto → (convoluzione discreta, estensione, durata, impulso rettangolare discreto), ConvoluzioneLa convoluzione $x*y(t)=\int x(u),y(t-u),du$ combina due segnali ribaltando e traslando il secondo, moltiplicando e integrando. È commutativa, associativa, lineare; l'area del risultato è il prodotto delle aree; l'estensione è la somma delle estensioni (estremo con estremo); l'impulso $\delta$ è l'elemento neutro; la convoluzione con il gradino integra. Per due segnali periodici di uguale periodo si usa la convoluzione ciclica (integrale su un periodo). È l'operazione del filtraggio: l'uscita di un filtro è la convoluzione dell'ingresso con la risposta impulsiva.Convoluzione → (stessa idea del caso continuo), SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie →.
La convoluzione discreta e il quanto
La convoluzione di due segnali su è
È la solita convoluzione (ribalto , lo trasla di , moltiplico per , sommo), ma la somma è pesata con come ogni "integrale" del caso discreto. In pratica: si conta/si somma su tutti i e si moltiplica il risultato per . L'impulso ideale (che vale in ) è l'elemento neutro: , perché .
Estensione e durata. Se ed , allora : agli estremi si sommano gli indici. La durata è , e quindi
Il "" c'è perché campioni di e di danno campioni.
Esempio 5.4A: due rettangoli centrati
1. Le estensioni. vale se , cioè , cioè : nove campioni, . Allo stesso modo per : , sette campioni, . Quindi
2. Simmetria. e sono pari, quindi anche è pari (): basta calcolare .
3. Il termine da sommare. Il prodotto vale se entrambe le condizioni sono vere, altrimenti :
Cioè . Il numero di valori di in questo intervallo dà .
- : e : , cioè valori (la finestra di , larga , sta tutta dentro quella di , larga ). Quindi .
- : il limite superiore diventa (finisce ): , cioè valori. Quindi : per .
- : nessun valido, .
Per simmetria, in si ha , in si ha , ecc. Mettendo tutto insieme, in unità di :
È un trapezio isoscele di campioni. Le sue parti:
- salita (e discesa) di un campione per volta, di passi;
- plateau di campioni (), alto : la posizione in cui il rettangolo più corto sta interamente dentro il più lungo.
(Nota: i "sette" campioni sono l'altezza del plateau in unità , cioè quanti si sovrappongono; il plateau ha invece tre campioni.) Come nel caso continuo, convolvere due rect dà un trapezio e, con rect di durata uguale, un triangolo.
Controllo con l'area. L'area della convoluzione è il prodotto delle aree: , e la somma tra parentesi vale . Quindi .
Grafico interattivo: s = x*y per x = A0 rect(nT/9T), y = B0 rect(nT/7T), in unità di T·A0·B0: trapezio isoscele di 15 campioni (n da -7 a 7), con plateau di 3 campioni alto 7
Secondo caso: rettangoli non centrati
Sia e .
1. Le estensioni. Per : , quindi (cinque campioni, , ). Per : il centro è e la durata ; la condizione vale per (infatti dà e dà , mentre dà , no): quattro campioni. Con la (5.16a): , danno e . Un rect con numero pari di campioni ha il centro a metà tra due campioni, ed è proprio per questo che è mezzo-intero in unità .
2. L'estensione del risultato. Si sommano gli estremi: da a , cioè , . Il centro di è la somma dei centri, : la figura sarà simmetrica rispetto a (cioè ).
3. Il conteggio. Servono i con , cioè . L'intersezione è :
| intervallo di | ||||||||
| numero di |
Dunque : trapezio con plateau di campioni (, simmetrici rispetto a ) alto . Per esempio con , , il fattore vale e i valori sono .
Regola generale. Se i rettangoli hanno campioni, la convoluzione è un trapezio con campioni: sale di per campione per passi, resta al valore per campioni (plateau) e poi scende. Se il plateau si riduce a un solo campione (triangolo). Le posizioni non cambiano la forma: si sposta solo il centro.
Grafico interattivo: Secondo caso: rettangoli di 5 campioni (n = 1..5) e di 4 campioni (n = -2..1); la convoluzione ha 8 campioni (n da -1 a 6), simmetrica attorno a n = 2,5, con plateau di 2 campioni alto 4
Controllo
np.convolve(x, y) calcola sui due vettori di campioni senza il fattore e restituisce un vettore di lunghezza il cui primo elemento corrisponde all'indice (somma dei primi indici). Quindi la convoluzione del corso è T * np.convolve(x, y), e l'asse degli indici va costruito a mano.
import numpy as np
def rect_discreto(n, t0_n, D_n):
"""rect((nT - t0)/D) con t0 = t0_n*T e D = D_n*T: 1 per |x|<1/2, 1/2 per |x|=1/2"""
x = (n - t0_n) / D_n
return np.where(np.abs(x) < 0.5, 1.0, np.where(np.abs(x) == 0.5, 0.5, 0.0))
T, A0, B0 = 0.5, 2.0, 3.0
# --- Esempio 5.4A: x = A0 rect(nT/9T), y = B0 rect(nT/7T)
n = np.arange(-12, 13) # indici da -12 a 12
x = A0 * rect_discreto(n, 0, 9)
y = B0 * rect_discreto(n, 0, 7)
s = T * np.convolve(x, y) # np.convolve non conosce T: si moltiplica a mano
ns = np.arange(2 * n[0], 2 * n[-1] + 1) # asse degli indici del risultato: -24..24
print("estensione di s: n da", ns[s != 0].min(), "a", ns[s != 0].max(), " durata", np.count_nonzero(s), "T")
print("conteggi (s / (T A0 B0)):", np.round(s[s != 0] / (T * A0 * B0)).astype(int))
print("area:", np.sum(T * s), " area(x) area(y) =", np.sum(T * x) * np.sum(T * y))
# --- secondo caso: x = A0 rect((nT - 3T)/5T), y = B0 rect((nT + T/2)/4T)
x2 = A0 * rect_discreto(n, 3, 5)
y2 = B0 * rect_discreto(n, -0.5, 4)
s2 = T * np.convolve(x2, y2)
print("e(x2):", n[x2 != 0], " e(y2):", n[y2 != 0])
print("e(s2): n da", ns[s2 != 0].min(), "a", ns[s2 != 0].max())
print("conteggi:", np.round(s2[s2 != 0] / (T * A0 * B0)).astype(int))
# --- l'impulso ideale e' l'elemento neutro: delta = 1/T in n = 0
delta = np.where(n == 0, 1 / T, 0.0)
neutro = T * np.convolve(x, delta)[len(n) // 2 : len(n) // 2 + len(n)]
print("x * delta == x :", np.allclose(neutro, x))Risultati eseguendolo: da a (durata ), conteggi ; area in entrambi i modi (con , , : , , prodotto ); secondo caso: , , , conteggi ; l'impulso ideale lascia invariato (la verifica stampa True).
Errori comuni
- Dimenticare il fattore :
np.convolveda solo dà la convoluzione "con ". - Scrivere (sarebbe il caso continuo) invece di : i campioni sono , non .
- Confondere l'altezza del plateau (numero di campioni sovrapposti, ) con la sua larghezza ( campioni).
- Con rettangoli non centrati, sommare male i centri: il centro del risultato è la somma dei centri, e un numero pari di campioni ha il centro a metà tra due campioni.
Versione ripasso
- ; : gli estremi si sommano; .
- 5.4A: su , su , , . Conta i con e : valori per , poi fino a . Trapezio isoscele: plateau di campioni alto .
- Non centrati: su , su : , centro , valori .
- Controllo:
T*np.convolve(x,y); area prodotto delle aree; . - Errori: dimenticato; senza ; altezza e larghezza del plateau confuse.