3. SISTEMAS LINEALES E INVARIANTES EN EL TIEMPO (LTI) Y CONVOLUCION


# Importar librerias basicas
from IPython.display import Latex  # para visualizar ecuaciones en jupyter
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym

%matplotlib inline
plt.style.use('bmh')  # estilo de las graficas

Muchos Procesos fisicos se comportan como sistemas lineales e invariantes en el tiempo, una de sus ventajas es que se pueden analizar con suficiente detalle para obtener conocimiento de sus propiedades y comportamiento.

La propiedad mas importante es la Superposici贸n. Como consecuencia si se puede representar la entrada de una sistema LTI en terminos de una combinaci贸n lineal de un conjunto de se帽ales basicas, entonces podemos utilizar la superposici贸n para calcular la salida en terminos de sus respuestas a estas se帽ales basicas.

Las se帽ales muy generales se pueden representar como la combinaci贸n lineal de impulsos retardados. Por superposici贸n e invarianza en el tiempo nos permite realizar una caracterizaci贸n completa de cualquier sistema LTI en terminos de su respuesta a un impulso unitario, esta representaci贸n se conoce como CONVOLUCI脫N, Especificamente en se帽ales discretas Suma de convoluci贸n y en se帽ales continuas Integral de convoluci贸n.

CONVOLUCION

Representacion de Se帽ales discretas en terminos de Impulsos

Una se帽al discreta de entrada $x[n]$ se representa como una superposici贸n de versiones escaladas de un conjunto de impulsos unitarios desplazados $\delta [n-k]$, cada uno con valor diferente de cero en un solo punto en el tiempo, especificado por el valor de $k$.

\begin{equation} \large x[n] = \sum_{k = -\infty}^{\infty} x[k] \cdot \delta[n-k] \end{equation}

Respuesta al Impulso Unitario discreto

La respuesta de un sistema lineal $y[n]$ a $x[n]$ es la superposici贸n de las respuestas escaladas del sistema a cada uno de estos impulsos desplazados.

Si usamos $h_k[n]$ como la respuesta del sistema lineal al impulso unitario desplazado por $\delta[n-k]$. La respuesta $y[n]$ del sistema lineal a la entrada $x[n]$ en la ecuacion ser谩 la combinaci贸n lineal ponderada de las respuesta b谩sicas.

\begin{equation} \large y[n] = \sum_{k = -\infty}^{\infty} x[k] \cdot h_k[n] \end{equation}

Si se conoce la respuesta de un sistema lineal al conjunto de impulsos unitarios desplazados, podemos construir una respuesta a una entrada arbitraria.

Si el sistema lineal tambi茅n es invariante en el tiempo, entonces estas respuestas a impulsos unitarios desplazados en el tiempo son todas las versiones desplazadas en el tiempo unas de otras.

$h[n]$ es la salida del sistem LTI cuando $\delta [n]$ es la entrada. Entonces para un sistema LTI la ecuaci贸n se vuelve.

\begin{equation} \boxed{ \large y[n] = \sum_{k = -\infty}^{\infty} x[k] \cdot h[n-k] } \end{equation}

El resultado se conoce como la 芦suma de convoluci贸n禄 o 芦suma de superposici贸n禄 y la operaci贸n miembro derecho de la ecuaci贸n se llama convoluci贸n de las secuencias $x[n]$ y $h[n]$ que se representa de manera simb贸lica como:

\begin{equation} \large y[n] = x[n] * h[n] \end{equation}

Interpretacion Grafica

la convolucion se puede interpretar de forma grafica Esta interpretaci贸n proporciona informaci贸n valiosa sobre su c谩lculo y permite estimar el resultado del c谩lculo de la suma de convoluci贸n, esto llevando las graficas al dominio de la variable $k$ es importante observar este cambio de eje.

se puede descomponer en los siguientes cuatro pasos:

  1. Sustituir $n$ por $k$ tanto en $x[n]$ como en $h[n]$,

  2. Invertir $h[k]$ en el tiempo (reflexi贸n en el eje vertical),

  3. Desplazar $h[鈭択]$ por $n$ para obtener $h[n 鈭 k]$, es decir, un desplazamiento hacia la derecha para $n> 0$ o un desplazamiento hacia la izquierda para $n <0$,

  4. Compruebe para cuales valores de $n = -\infty … \infty$ la $h[n 鈭 k]$ reflejada y desplazada se superpone con $x[k]$, calcule la suma espec铆fica de todas las n relevantes para producir $y[n]$

Esta interpretaci贸n se ilustra en el siguiente ejemplo utilizando se帽ales simples $x[n]$ y $h[n]$.

Ejemplo Convolucion Discreta

Para las siguientes se帽ales

\begin{align} \large h[n] &= \large e^{-\frac{n}{2}} \mu[n] \ \large x[n] &= \large \frac{4}{5} \left (\mu[n] - \mu[n-6] \right) \end{align}

Calcule $\large y[n] = x[n]* h[n]$

def heaviside(n):
    return np.where(n >= 0, 1.0, 0.0)


def x(n):
    return 4/5 * (heaviside(n) - heaviside(n-6))


def h(n):
    return heaviside(n) * np.exp(- n/2)


def plot_signals(n, x, h, xlabel, hlabel, nlabel):
    plt.figure(figsize=(12, 5))
    plt.stem(n, x, linefmt='C0-', markerfmt='C0o',
             label=xlabel, use_line_collection=True)
    plt.stem(n, h, linefmt='C1-', markerfmt='C1o',
             label=hlabel, use_line_collection=True)
    plt.xlabel(nlabel)
    plt.legend()
    plt.ylim([0, 1.2])
    plt.grid(True)
n = np.arange(-20, 21)

plot_signals(n, x(n), h(n), r'$x[n]$', r'$h[n]$', r'$n$')

png

  1. Sustituir $n$ por $k$ tanto en $x[n]$ como en $h[n]$
k = np.arange(-20, 21)

x1 = x(k)
h1 = h(k)

plot_signals(k, x1, h1, r'$x[k]$', r'$h[k]$', r'$k$')

png

  1. Invertir $h[k]$ en el tiempo (reflexi贸n en el eje vertical),
h2 = h(k[::-1])  # Forma elegante de invertir el arreglo en python

plot_signals(k, x1, h2, r'$x[k]$', r'$h[-k]$', r'$k$')

png

  1. Desplazar $h[鈭択]$ por n para obtener $h[n 鈭 K]$, es decir, un desplazamiento hacia la derecha para $n> 0$ o un desplazamiento hacia la izquierda para $n <0$,

  2. Compruebe para cuales valores de $n = -\infty … \infty$ la $h[n 鈭 k]$ reflejada y desplazada se superpone con $x[k]$, calcule la suma espec铆fica de todas las n relevantes para producir $y[n]$.

Para este ejemplo, se deben considerar tres casos diferentes

  1. Sin superposici贸n para $ n <0 $,
  2. Solapamiento parcial para $ 0 \leq n <6 $, y
  3. Solapamiento total para $ n \geq 6 $ (tenga en cuenta que la respuesta de impulso elegida $ h [k] $ es infinita y decae asint贸ticamente).

El primer caso, sin superposici贸n, se ilustra a continuaci贸n para $ n = - 5 $ (desplazamiento a la izquierda).

h3 = h(-5 + k[::-1])

plot_signals(k, x1, h3, r'$x[k]$', r'$h[-5 -k]$', r'$k$')

png

De esto queda claro que el resultado de convoluci贸n para el primer caso se da como

\begin{equation} \large y[n] = 0 \qquad \text{para}\qquad n <0 \end{equation}

El segundo caso, es decir, la superposici贸n parcial, se ilustra a continuaci贸n para $ n = 3 $ (desplazamiento a la derecha).

h4 = h(3 + k[::-1])

plot_signals(k, x1, h4, r'$x[k]$', r'$h[+3 -k]$', r'$k$')

png

Por lo tanto, para el segundo caso, la suma de convoluci贸n degenera a \begin{equation} \large y[n] = \frac{4}{5} \sum_{k=0}^{n} e^{-\frac{n - k}{2}} \qquad \text{for } 0 \leq n < 6 \end{equation}

El tercer caso, superposici贸n completa, se ilustra a continuaci贸n para $ n = 10 $.

h5 = h(10 + k[::-1])

plot_signals(k, x1, h5, r'$x[k]$', r'$h[10 -k]$', r'$k$')

png

Para el tercer caso, la suma de convoluci贸n queda en \begin{equation} \large y[n] = \frac{4}{5} \sum_{k=0}^{5} e^{-\frac{n - k}{2}} \qquad \text{for } n \geq 6 \end{equation}

El resultado general se compone de los tres resultados individuales. Como alternativa y para graficar el resultado, la convoluci贸n se eval煤a num茅ricamente con convolve de numpy. Tenga en cuenta que convolve realiza una convoluci贸n simple y no le importa ninguna alineaci贸n con respecto a $n$. Por lo tanto, es posible que se deba adaptar el resultado a la alineaci贸n adecuada con respecto a $n$ si ambas se帽ales no comienzan exactamente en $n = 0$.

def y(n):
    # funcion de numpy para hacer la convolucion
    return np.convolve(x(n), h(n), mode='same')


plt.figure(figsize=(12, 5))
plt.stem(n, y(n), linefmt='C2-', markerfmt='C2o', use_line_collection=True)
plt.xlabel(r'$y[n]$')
plt.ylabel(r'$y[n]$')
plt.ylim([0, 2])
plt.grid(True)

png

from animation import animate_discrete_convolution
plt.rcParams['animation.html'] = 'jshtml'

kappa = np.arange(-5, 15)
anim = animate_discrete_convolution(x, h, y, n, kappa)
anim

Convolucion con Se帽ales Finitas

La longitud de una se帽al discreta $ x[n] $ puede definirse como el n煤mero total de muestras entre la primera muestra que no es cero y la 煤ltima muestra que es cero, m谩s una. Tenga en cuenta que esto podr铆a incluir ceros entre estos l铆mites.

Una se帽al de longitud finita es una se帽al cuya cantidad de datos es finita. Seg煤n esta definici贸n, el impulso de Dirac $ \delta [n] $ se convierte en una se帽al de longitud finita de longitud uno.

La convoluci贸n de dos se帽ales de longitud finita es de importancia pr谩ctica ya que la convoluci贸n solo puede evaluarse num茅ricamente (por una computadora) para se帽ales de longitud finita.

La convoluci贸n de dos se帽ales de longitud finita con longitud $ N $ y $ M $, respectivamente, da como resultado una se帽al de longitud finita de longitud $ N + M-1 $.

Para dos se帽ales causales $ x [n] $ y $ h [n] $ de longitud finita $ N $ y $ M $ se lee la convoluci贸n

\begin{equation} \large x[n] * h[n] = \sum_{k = 0}^{N-1} x[k] \cdot h[n - k] = \sum_{k = 0}^{M-1} x[n - k] \cdot h[k] \end{equation}

Para $0 \leq n < N+M-1$.

El c谩lculo de cada muestra de salida requiere al menos $ N $ multiplicaciones y $ N-1 $ adiciones. La complejidad num茅rica de la convoluci贸n para el c谩lculo de muestras de salida de $ N $ es, por lo tanto, en el orden de $\mathcal{O} ( N^2 )$.

Ejemplo de Convolucion Se帽ales Finitas

La convolucion de:

$$ \large \begin{align} x1[n] &= 2\mu[n] - 2\mu[n-5] \ x2[n] &= \mu[n] - \mu[n-9] \end{align} $$

N = 5
M = 9

x1 = 2*np.ones(N)
x2 = np.ones(M)

plt.stem(x1, linefmt='C0-', markerfmt='C0o')
plt.stem(x2, linefmt='C1-', markerfmt='C1o')
plt.xlabel('$n$')
plt.ylabel('$x_1[n] \quad x_2[n] $')
plt.ylim([0, 3])
plt.xlim([-2, 12])
plt.xticks(np.arange(0, 12, 1))
plt.grid(True)

png

y = np.convolve(x1, x2, mode='full')

print(f'Longitud de y[n] = {len(x1)} + {len(x2)} - 1 = {len(y)}')

plt.stem(y)
plt.xlabel('$n$')
plt.ylabel('$y[n]$')
plt.ylim([0, 12])
plt.xlim([-2, 17])
plt.xticks(np.arange(0, 15, 2))
plt.grid(True)
Longitud de y[n] = 5 + 9 - 1 = 13

png

Representacion de Se帽ales Continuas en terminos de Impulsos

\begin{equation} \large x(t) = \int_{-\infty}^{\infty} x(\tau) \cdot \delta(t-\tau) ; d \tau \end{equation}

Respuesta al impulso unitario continuo y la integral de Convolucion

La respuesta de un sistema lineal $y(t)$ a $x(t)$ es la superposici贸n de las respuestas escaladas del sistema a cada uno de estos impulsos desplazados.

Si usamos $h_\tau (t)$ como la respuesta del sistema lineal al impulso unitario desplazado por $\delta(t-k)$. La respuesta $y(t)$ del sistema lineal a la entrada $x(t)$ en la ecuacion ser谩 la combinaci贸n lineal ponderada de las respuesta b谩sicas.

\begin{equation} \large y(t) = \int_{-\infty}^{\infty} x(\tau) \cdot h_\tau(t) ; d \tau \end{equation}

Si se conoce la respuesta de un sistema lineal al conjunto de impulsos unitarios desplazados, podemos construir una respuesta a una entrada arbitraria.

Si el sistema lineal tambi茅n es invariante en el tiempo, entonces estas respuestas a impulsos unitarios desplazados en el tiempo son todas las versiones desplazadas en el tiempo unas de otras.

$h(t)$ es la salida del sistem LTI cuando $\delta (t)$ es la entrada. Entonces para un sistema LTI la ecuaci贸n se vuelve.

\begin{equation}\boxed{ \large y(t) = \int_{-\infty}^{\infty} x(\tau) \cdot h(t-\tau) ; d \tau } \end{equation}

El resultado se conoce como la 芦Integral de convoluci贸n禄 y la operaci贸n miembro derecho de la ecuaci贸n se llama convoluci贸n de $x(t)$ y $h(t)$ que se representa de manera simb贸lica como:

\begin{equation} \large y(t) = x(t)*h(t) \end{equation}

Interpretacion Grafica

la convolucion se puede interpretar de (forma grafica)(https://en.wikipedia.org/wiki/Convolution#Visual_explanation) Esta interpretaci贸n proporciona informaci贸n valiosa sobre su c谩lculo y permite estimar el resultado del c谩lculo de la suma de convoluci贸n, esto llevando las graficas al dominio de la variable $\tau$ es importante observar este cambio de eje.

se puede descomponer en los siguientes cuatro pasos:

  1. Sustituir $t$ por $\tau$ tanto en $x(t)$ como en $h(t)$,

  2. Invertir $h(\tau)$ en el tiempo (reflexi贸n en el eje vertical),

  3. Desplazar $h(鈭抃tau)$ por $t$ para obtener $h(t 鈭 \tau)$, es decir, un desplazamiento hacia la derecha para $t> 0$ o un desplazamiento hacia la izquierda para $t <0$,

  4. Compruebe para cuales valores de $t = -\infty … \infty$ la $h(t 鈭 \tau)$ reflejada y desplazada se superpone con $x(\tau)$, calcule la suma espec铆fica de todas las n relevantes para producir $y(t)$

Esta interpretaci贸n se ilustra en el siguiente ejemplo utilizando se帽ales simples $x(t)$ y $h(t)$.

Ejemplo Convolucion Continua

Para las siguientes se帽ales $$ \Large \begin{align} h(t) &= e^{-t} \mu (t) \ x(t) &= \frac{3}{4} ( \mu(t) - \mu(t-1) ) \end{align} $$ Calcule $\large y(t) = \int_{\tau = -\infty}^{\tau = \infty} x(\tau) \cdot h(t-\tau) ; d\tau$

import sympy as sym
%matplotlib inline
sym.init_printing()

t, tau = sym.symbols('t tau', real=True)
def plot_signals(x_axis, x, h, ylabel, xlabel):
    p1 = sym.plot(x, (x_axis, -5, 5), show=False,
                  line_color='C0', ylabel=ylabel, xlabel=xlabel)
    p2 = sym.plot(h, (x_axis, -5, 5), show=False, line_color='C1')
    p1.extend(p2)
    p1.show()
h = sym.exp(-t) * sym.Heaviside(t)
x = sym.Rational(3, 4) * (sym.Heaviside(t) - sym.Heaviside(t-1))

plot_signals(t, x, h, r'$h(t)$, $x(t)$', r'$t$')

png

El primer paso es sustituir $ t $ por $ \tau $ para obtener $ h (\tau) $ y $ x (\tau) $. Tenga en cuenta que el eje horizontal de la gr谩fica representa ahora $ \tau $, que es nuestra variable auxiliar temporal para la integraci贸n

h1 = h.subs(t, tau)
x1 = x.subs(t, tau)

plot_signals(tau, x1, h1, r'$h(\tau)$, $x(\tau)$', r'$\tau$')

png

El segundo paso es invertir en el tiempo $ h (\tau) $ para obtener $ h (- \tau) $

h2 = h.subs(t, -tau)

plot_signals(tau, x1, h2, r'$h(-\tau)$, $x(\tau)$', r'$\tau$')

png

En el tercer paso la respuesta al impulso $ h (- \tau) $ se desplaza por $ t $ para obtener $ h (t - \tau) $. El desplazamiento temporal se realiza a la derecha para $ t> 0 $ y a la izquierda para $ t <0 $.

h3 = h.subs(t, t-tau)

Para el cuarto paso a menudo es 煤til dividir el c谩lculo del resultado de acuerdo con la superposici贸n entre $ h (t- \tau) $ y $ x (\tau) $. Para las se帽ales particulares dadas se pueden considerar tres casos diferentes

  1. sin superposici贸n para $ t <0 $,
  2. solapamiento parcial para $ 0 \leq t <1 $, y
  3. superposici贸n completa para $ t> 1 $ (tenga en cuenta que la respuesta al impulso elegida decae asint贸ticamente).

El primer caso, sin superposici贸n, se ilustra para $ t = -2 $

plot_signals(tau, x1, h3.subs(t, -2), r'$h(t-\tau)$, $x(\tau)$', r'$\tau$')

png

De esto queda claro que el resultado de convoluci贸n para el primer caso se da como

\begin{equation} \large y(t) = 0 \qquad \text {para} \quad t <0 \end{equation}

El segundo caso, superposici贸n parcial, se ilustra para $\large t = \frac{1}{2} $

plot_signals(tau, x1, h3.subs(t, .5), r'$h(t-\tau)$, $x(\tau)$', r'$\tau$')

png

Por lo tanto, para el segundo caso, la integral de convoluci贸n queda en:

\begin{equation} y(t) = \frac{3}{4}\int_{0}^{t} e^{-(t - \tau)} d\tau = \frac{3}{4} (1 - e^{-t}) \qquad \text{for } 0 \leq t < 1 \end{equation}

El tercer caso, superposici贸n completa, se ilustra para $ t = 3 $

plot_signals(tau, x1, h3.subs(t, 3), r'$h(t-\tau)$, $x(\tau)$', r'$\tau$')

png

Para el tercer caso, la integral de convoluci贸n queda en

\begin{equation} y(t) = \frac{3}{4} \int_{0}^{1} e^{-(t - \tau)} d\tau = \frac{3}{4} (e - 1) e^{-t} \qquad \text{for } t \geq 1 \end{equation}

El resultado general se compone de los tres resultados individuales. Como alternativa y para graficar el resultado, la integral de convoluci贸n se eval煤a en SymPy

y = sym.integrate(h.subs(t, t-tau) * x.subs(t, tau), (tau, 0, t))
sym.plot(y, (t, 0, 6), ylabel=r'$y(t)$', line_color='C2')

png

import matplotlib.pyplot as plt
import numpy as np
from animation_cont import animate_convolution_cont
plt.rcParams['animation.html'] = 'jshtml'

anim = animate_convolution_cont(
    x, h, y, t, tau, np.arange(-2, 5, .1), np.arange(-5, 5, 0.02))
anim