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[−k]$ 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[−k]$ 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