Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

14
voti

Alcuni esercizi sulla convoluzione.

Indice

Premessa

Questo articolo è una piccola raccolta di esercizi (da annotare anche come promemoria) per il calcolo della convoluzione continua e discreta. Il quaderno degli esercizi finirà, molto probabilmente, in cantina o dimenticato chissà dove per fare spazio a nuovi quaderni per appunti e chissà cos'altro. Allora ho cominciato a scrivere qui, in modo da arricchire il blog con qualcosina di utile senza pretese particolari.

Mi sono concentrato di più su esercizi nel dominio continuo, anche se ho aggiunto un paio di esercizi nel dominio discreto.

Nota: nel calcolo delle convoluzioni continue, ho usato come notazione la variabile T. Vorrei precisare in anticipo che è appunto solo una notazione di dominio che ho spesso trovato in vari esercizi ed a cui mi sono abituato. Questa variabile può essere successivamente omessa nell'espressione del risultato finale.

Per ultimo, è di abitudine usare spesso il calcolatore con simulatori quali GNU/Octave e Matlab per comprovare i risultati: questi pero possono portare a confondere solo le idee se non è ben chiaro cosa e come si sta calcolando. Vedremo più avanti un piccolo esempio.

Esercizi con la convoluzione continua

Esercizio #1

\qquad x(t) = \mathrm e^{-t}u(t)

\qquad h = \begin{cases}
1 & 1 < t < 2\\
2 & 2 \leq t < 3\\
{3 \over 2} & t \geq 3\\
0 & \text{altrimenti}
\end{cases}

Applichiamo la trasformazione della variabile indipendente: \qquad x(t) \Rightarrow x(-\tau)

Dalla rappresentazione anteriore si deduce che:

y(t) = 0 \qquad t < T \qquad (1.0)

Prima traslazione:

 y(t) = \int_{-\infty}^{\infty}x(t - \tau)h(\tau)\,\mathrm d\tau = \int_{T}^{t}\mathrm e^{\tau - t}\,\mathrm d\tau = 1 - \mathrm e^{1 - t} \qquad T \leq t < 2T \qquad (1.1)

Traslazione successiva:

y(t) = \int_{-\infty}^{\infty}x(t - \tau)h(\tau)\,\mathrm d\tau = \int_{T}^{2T} \mathrm e^{\tau - t}\,\mathrm d\tau + 2\int_{2T}^t  \mathrm e^{\tau - t}\,\mathrm d\tau


= \mathrm e^{2T - t} - \mathrm e^{T - t} + 2(1 - \mathrm e^{2T - t})\qquad 2 \leq t < 3T\qquad (1.2)

Ultima traslazione:

y(t) = \int_{-\infty}^{\infty}x(t - \tau)h(\tau)\,\mathrm d\tau = \int_{T}^{2T} \mathrm e^{\tau - t}\,\mathrm d\tau + 2\int_{2T}^{3T}\mathrm e^{\tau - t}\,\mathrm d\tau + {3\over 2}\int_{3T}^{t}\mathrm e^{\tau - t}\,\mathrm d\tau


\ \ = e^{-t}\left(\mathrm e^{2T} - \mathrm e^{T} + 2(\mathrm e^{3T} - \mathrm e^{2T}) + {3\over 2}(\mathrm e^{t} - \mathrm e^{3T}) \right ) \qquad 3T < t \qquad (1.3)

Quindi si ha:


y(t) = \begin{cases}
0 &  t < 0\\
1 - \mathrm e^{T - t} &  T \leq t < 2T\\
\mathrm e^{2T - t} - \mathrm e^{T - t} + 2(1 - \mathrm e^{2T - t}) & 2 \leq t < 3T\\
e^{-t}\left(\mathrm e^{2T} - \mathrm e^{T} + 2(\mathrm e^{3T} - \mathrm e^{2T}) + {3\over 2}(\mathrm e^{t} - \mathrm e^{3T}) \right ) &  3T \leq t
\end{cases}



Rappresentazione dei segnali

Esercizio #2

\qquad x(t) = tu(t)

\qquad h(t) = u(t) - u(t - 2)

Rappresentazione dei segnali:

Si applica la trasformazione della variable indipendente: \qquad h(t) \Rightarrow h(t-\tau)

Si nota che:

y(t) = 0 \qquad t < 0 \qquad (2.0)

Prima traslazione:

y(t) = \int_{-\infty}^{\infty}x(\tau)h(t - \tau)\,\mathrm d\tau = \int_{0}^{t} \tau\,\mathrm d\tau = {t \over 2}^2  \qquad 0 < t < T \qquad (2.1)

Traslazione successiva:

y(t) = \int_{-\infty}^{\infty}x(\tau)h(t - \tau)\,\mathrm d\tau = \int_{0}^{T} \tau\,\mathrm d\tau  + \int_{1}^{t} \tau\,\mathrm d\tau =  {1 \over 2} + {t^2 - 1\over 2} = {t^2 \over 2} \qquad t \leq 2T\qquad (2.2)

Ultima traslazione:

y(t) = \int_{-\infty}^{\infty}x(\tau)h(t - \tau)\,\mathrm d\tau = \int_{t - 2T}^{t} \tau\,\mathrm d\tau =  {t^2 - (t - 2T)^2 \over 2} = 2(t - 1) \qquad t > 2T\qquad(2.3)

Quindi:


y(t) = \begin{cases}
{t^2\over 2} & 0 \leq t < 2T\\
2(t - 1) & 2T \leq t
\end{cases}\qquad(2.4)

Rappresentazione dei segnali:


Calcolo inverso

Si applica la trasformazione della variable indipendente: \qquad x(t) \Rightarrow x(t-\tau)

Di nuovo:

y(t) = 0 \qquad t < 0 \qquad (2.1.0)

Prima traslazione:

y(t) = \int_{-\infty}^{\infty}x(t - \tau)h(\tau)\,\mathrm d\tau = \int_{0}^{t} t - \tau\,\mathrm d\tau = {t^2} - {t^2 \over 2} = {t^2 \over 2} \qquad 0 \leq t < T\qquad(2.1.1)

Notare che il calcolo in \qquad(2.1.1) si ripete nell'intervallo  \qquad 0 \leq t < 2T.

Continuando la traslazione:

y(t) = \int_{-\infty}^{\infty}x(t - \tau)h(\tau)\,\mathrm d\tau = \int_{0}^{2T} t - \tau\,\mathrm d\tau = 2(t - 1) \qquad t > 2T\qquad(2.1.2)

Ottenendo cosi il isultato equivalente a \qquad(2.4)


Esercizio #3

\qquad x(t) = 3(u(t) - u(t - 3))\qquad

\qquad h(t) = 2(u(t - 2) - u(t - 9))\qquad

Rappresentazione dei segnali:

Trasformazione della variabile indipendente, in questo caso x(t)\Rightarrow x(t - \tau) che he più comoda da disegnare:

Ancora, si nota che

y(t) = 0 \qquad t < 2T \qquad (3.0)

Traslando il segnale fino a t \leq 5T

si ha:

y(t) = \int_{-\infty}^{\infty}x(t - \tau)h(\tau)\,\mathrm d\tau = 6\int_{2T}^t\,\mathrm d\tau = 6t - 12T\qquad 2T \leq t < 5T

è anche possibile farlo passo a passo incremntando il limite di integrazione inferiore di uno, ma alla fine si tarda di più.

Traslazione successiva:

Da 5T \leq t < 9T la moltiplicazione dei due segnali è costante, si ha quindi:

y(t) = 6(t - 12) \Rightarrow y(5) = 18 \qquad 5T < t < 9T

L'ultima traslazione è analoga alla prima:

Ed in questo caso abbiamo:

y(t) = \int_{-\infty}^{\infty}x(t - \tau)h(\tau)\,\mathrm d\tau
= 6\int_{t-3T}^{9T}\,\mathrm d\tau = 6(9T -(t - 3T)) = 72 - 6t\qquad 9T \leq t < 12T

Quindi il risultato finale è:


y(t) = \begin{cases}
6(t - 2) & 2T \leq t < 5T\\
18 & 5T \leq t < 9T\\
-6t + 72 & 9T \leq t < 12T
\end{cases}

Esercizio #4


x(t) = \begin{cases} 
t & 0 \leq t \leq 1\\
0 & \text{altrimenti}
\end{cases}\qquad


h(t) = u(t - 2) - u(t  -3)\qquad

Applichiamo la trasformazione della variabile indipendente: h(t) \Rightarrow h(t - \tau)\qquad

Quindi:

t - 2 \leq 0 \Rightarrow y(t) = 0 \qquad t \leq 2T \qquad(4.0)

Prima traslazione: abbiamo che:

t - 2 \leq 1 \Rightarrow \qquad 2T \leq t < 3T \qquad(4.1)
y(t)=\int_{-\infty}^{\infty} x(\tau)h(t - \tau)\,\mathrm d\tau = \int_{0}^{t - 2}\tau\,\mathrm d\tau = {(t - 2)^2 \over 2} \qquad 2T \leq t < 3T \qquad(4.2)

Traslazione successiva per \qquad \Delta t = 1 = T:

Abbiamo comunque che:

t - 2 \leq 2 \Rightarrow t < 4T

y(t) = \int_{-\infty}^{\infty} x(\tau)h(t - \tau)\ \mathrm d\tau = \int_{t-3}^{T} \tau \ \mathrm d\tau = {1 - (t - 3)^2\over 2} \qquad 3T \leq t < 4T \qquad (4.3)

Riassumendo:

y(t) = \begin{cases} 0 & t < 0\\ {(t - 2)^2 \over 2} & 2 \leq t < 3\\ {1 - (t - 3)^2\over 2} & 3 \leq t < 4 \end{cases}


Esercizi di convoluzione discreta

Esercizio #5

\qquad x[n] = \delta[n + 1] + 2\delta[n] - \delta[n - 1] + \delta[n - 2]

\qquad h[n] = \delta[n + 2] - \delta[n + 1] + \delta[n] - \delta[n - 1] + 2\delta[n - 2]

Dovendo risolvere

y[n] = \sum_{k = -\infty}^\infty x[k]h[n - k]\qquad

chiamando \qquad k_x il primo indice di \qquad x[n] e \qquad k_h il primo indice di \qquad h[n] risolviamo per il primo indice di \qquad y[n]:

\qquad n - k_x = k_h\qquad
\qquad n -(-1) = -2 \Rightarrow n = -3\qquad

Quindi:

  • y[n] = \sum_{k = -\infty}^\infty x[k]h[n - k]\qquad
  • y[-3] = x[-1]h[-2] = 1\qquad
  • y[-2] = x[-1]h[-1] + x[0]h[-2] = 1\qquad
  • y[-1] = x[-1]h[0] + x[0]h[-1] + x[1]h[-2] = -2 \qquad
  • y[0] = x[-1]h[1] + x[0]h[0] + x[1]h[-1] + x[2]h[-2] = 3\qquad
  • y[1] = x[-1]h[2] + x[0]h[1] + x[1]h[0] + x[2]h[-1] = -2\qquad
  • y[2] = x[0]h[2] + x[1]h[1] + x[2]h[0] = 6\qquad
  • y[3] = x[1]h[2] + x[2]h[1]  = -3\qquad
  • y[4] = x[2]h[2] =  2\qquad

A questo punto si può rappresentare il risultato:

Per rappresentare il risultato con Octave, ho usato questo piccolo script:

nx = -1:2;
x = (nx == -1) + 2*(nx == 0) -(nx == 1) + (nx == 2);
nh = -2:2;
h = (nh == -2) -(nh == -1 | nh == 1) + (nh == 0) +2*(nh == 2);
y = conv(x,h);
ny = -3:4;
subplot(3,1,1);
stem(nx,x,'r');
hold on;grid on;
xlabel('x[n]');
subplot(3,1,2);
stem(nh,h,'b');
hold on;grid on;
xlabel('h[n]');
subplot(3,1,3);
stem(ny,y,'g');
grid on;
xlabel('x[n]*h[n]');

Generando questa rappresentazione:

dtconv.png

dtconv.png

Esercizio #6

x[n] = \sum_{k = 1}^{5} 2\delta[n - k]\qquad

h[n] = \sum_{k = 3}^{6} 3\delta[n - k]\qquad

\qquad n - k_x = k_h\qquad
\qquad n -1 = 3 \Rightarrow n = 4\qquad

Quindi:

  • y[n] = \sum_{k = -\infty}^\infty x[k]h[n - k]\qquad
  • y[4] = x[1]h[3] = 6\qquad
  • y[5] = x[1]h[4] + x[2]h[3] = 12\qquad
  • y[6] = x[1]h[5] + x[2]h[4] + x[3]h[3] =  18\qquad
  • y[7] = x[1]h[6] + x[2]h[5] + x[3]h[4] + x[4]h[3] =  24\qquad
  • y[8] = x[2]h[6] + x[2]h[5] + x[3]h[4] + x[4]h[3] =  24\qquad
  • y[9] = x[3]h[6] + x[4]h[5] + x[5]h[4] =  18\qquad
  • y[10] = x[4]h[6] + x[5]h[5] =  12\qquad
  • y[11] = x[5]h[6] =  6\qquad

Ed ecco una rappresentazione in scala 1:6:

Addendum: effetti di bordo con GNU/Octave e Matlab

È abbastanza noto che i due programmi GNU/OCtave e Matlab svolgono funzioni uguali o simili, anche se Matlab offre qualcosa in più (ma GNU/Octave è molto più veloce per i lavori equivalenti - p.e. lo script precedente può essere eseguito tanto con ambi i programmi).

A partire dall' esempio 2.8 a pag. 101 del libro Signals and Systems 2nd Ed. by A. Oppenheim, A. S. Willsky & S. H. Nawab, qualche mese fà mi ero proposto di rappresentare la convoluzione dei segnali con GNU/Octave o Matlab:

x(\tau) = e^{2t}u(-t)\qquad

h(\tau) = u(t - 3)\qquad

L'esercizio viene svolto anche sullo stesso libro ma per completezza lo riporto anche qui.

Risoluzione analitica

Quindi rappresentiamo i segnali:

E come sempre applichiamo la trasformazione della variabile indipendente h(t) \Rightarrow h(t - \tau)\qquad:

Prima traslazione:

Per t - 3 \leq 0 abbiamo che:

y(t) = \int_{-\infty}^{\infty}x(\tau)h(t - \tau)\,\mathrm d\tau = \int_{-\infty}^{t - 3}\mathrm e^{2\tau}\,\mathrm d\tau = \left[{e^{2\tau}\over 2}\right]_{-\infty}^{t - 3}


= {\mathrm e^{2(t - 3)}\over 2}\qquad t \leq 3T \qquad(\mathrm A.1)

Traslazione successiva:

Una volta che t-3 > 0\qquad abbiamo che
x(\tau)h(t - \tau) \neq 0 \qquad -\infty < T < 0
x(\tau)h(t - \tau) = 0 \qquad t-3 > 0

per cui:

y(t) = \int_{-\infty}^{\infty}x(\tau)h(t - \tau)\,\mathrm d\tau = \int_{-\infty}^{0}\mathrm e^{2\tau}\,\mathrm d\tau = \left[{\mathrm e^{2\tau}\over 2}\right]_{-\infty}^{0} = {1 \over 2}\qquad t > 3T \qquad(\mathrm A.2)

Quindi:


y(t) = \begin{cases}
{\mathrm e^{2(t-3)}\over 2} & t < 3\\
{1 \over 2} & t \geq 3
\end{cases}

Risoluzione mediante l'uso di un simulatore: comprovazione del risultato

Se adesso di primo istinto mettiamo questi numeri in Matlab, o con Octave, con il codice:

t = -10:0.001:10;
x = exp(2*t).*heaviside(-t);
h = heaviside(t - 3);
y = conv(x,h,'full');
ty =  -20:0.001:20;
plot(ty,y);

(per Octave è necessario il pacchetto specfunc per poter usare la funzione heaviside(n))

Il primo risultato è qualcosa di questo genere:

Convoluzione.png

Convoluzione.png

eh.jpg

Che pasticcio! Saltano subito all'occhio due problemi:

  1. La funzione \qquad y(t) non è normalizzata.
  2. La funzione \qquad y(t) si azzera e non è di ampiezza costante per \qquad t > 3T.

Il pasticcio di questo codice è stato risolto nel forum in un thread aperto da me stesso.

Il problema della normalizzazione è risolvibile facilmente cambiando la assegnazione per \qquad y(t):

y = 0.001*conv(x,h,'full');

Mentre il problema del segnale a gradino è invece leggermente più rognoso. In particolare, nel thread linkato sono stati molto utili gli interventi di DirtyDeeds e dimaios, i quali mi hanno ricordato degli effetti di bordo.

Illuminante fu l'intervento di DirtyDeeds al messaggio 25:

[RISPOSTA DI DD]

Tu vuoi rappresentare il risultato della convoluzione in un certo intervallo di tempo, diciamo [t_1,t_2]\qquad . Per poter calcolare la convoluzione in quell'intervallo di tempo hai bisogno di conoscere le due funzioni x(t)\qquad e h(t)\qquad in altri due intervalli di tempo, possibilmente infiniti. Poiché in Matlab non puoi memorizzare vettori infiniti, devi decidere dove fermarti: se memorizzi una porzione troppo stretta di x(t)\qquad e h(t)\qquad , il risultato della convoluzione non sarà corretto nell'intervallo [t_1,t_2]\qquad e osserverai effetti di "bordo".

[/RISPOSTA DI DD]

La soluzione quindi è definire la funzione \qquad h(t) per un intervallo di tempo sufficientemente maggiore rispetto a \qquad x(t), e far si che la lunghezza del vettore del risultato della convoluzione sia equivalente sempre a quella di \qquad x(t). Ecco un esempio di codice con cui si ottiene un risultato corretto:

fs = 100;
t = -3:1/fs:6;
th = -12:1/fs:12;
x = exp(2*t).*heaviside(-1*t);
h = heaviside(th - 3) - heaviside(th - 12);
y = 1/(fs) * conv2(x, h, 'same');
plot(t,x,'r');hold on;
plot(th,h,'b');hold on;xlim([-3,6]);
plot(t,y,'g');grid on; ylim([-0.5,1.5]);

Convolution.png

Convolution.png

Conclusione

Si conclude cosi questa piccola raccolta di esercizi.

All'inizio non avevo intenzione di scrivere un articolo, poi tra un caffé e l'altro, ho raccolto gli esercizi svolti in questi giorni, 2 o tre me li sono inventati sul momento mentre scrivevo, mi sono ricordato di un esercizio svolto nel forum, del thread sugli effetti di bordo ... e cosi ne è uscito questo piccolo articolo.

Nel suo piccolo, come sempre, si spera possa essere utile a qualcuno.

Simo

10

Commenti e note

Inserisci un commento

di ,

Le funzioni che abbiamo ottimizzato, per risolvere le matrici negli algoritmi di deconvoluzione, sono scaricabili da qui. Invece gli algoritmi completi si trovano nei sorgenti della applicazione MCA che si scarica da qui.

Rispondi

di ,

Chi fosse interessato a vedere come si può applicare deconvoluzione ad un caso pratico potrebbe leggere questo PDF. E per avere una idea genere della tecnica MCA alla quale abbiamo applicato gli algoritmi di deconvoluzione, questo secondo PDF può aiutare.

Rispondi

di ,

Grazie, mi fa piaciere! :)

Rispondi

di ,

Mi piace molto il taglio che hai dato all'articolo. Senz'altro utile e ben fatto.

Rispondi

di ,

Grazie del suggerimento IKZ. Ne terrò conto! :)

Rispondi

di ,

Una nota sul primo esercizio (e magari anche gli altri). La gradinata di ingresso h(t) puoi scriverla come somma di funzioni step u(t) traslate e scalate in ampiezza: h(t)=u(t-1)+u(t-2)-0.5u(t-3). Ciascuna u(t) va fino ad infinito. Calcoli la risposta della convoluzione di x(t) con u(t) e poi il risultato sara` data da tre copie della convoluzione calcolata traslate in tempo e scalate in ampiezza. C'e` un solo integrale da calcolare e con estremi di integrazione "facili".

Rispondi

di ,

Grazie a voi ragazzi. :)

Rispondi

di ,

Non sono ancora arrivato a questi argomenti, ma sono sicuro che un articolo così ben fatto mi tornerà utile!

Rispondi

di ,

Grazie simo, ne sentivo proprio il bisogno!

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.