7.1.3 Transformada z unilateral e inversa con Sympy-Python

Referencia: Tabla de transformadas z: Lathi Tabla 5.1 Transformada z p492. Oppenheim tabla 10.2 p776, Schaum Hsu Tabla 4-1 p170. Propiedades:  Schaum Hsu Tabla 4-2 p173. Lathi Tabla 5.2 p509. Oppenheim Tabla 10.3 p793

Usando los algoritmos presentados para transformadas z a partir de la tabla y propiedades, se incorpora en la instrucción z_transform(f,n,z) incorporada en telg1001.py. Para demostración se desarrollan algunos ejemplos que se desarrollan a partir de la tabla de transformadas z.

Transformada z de impulso unitario δ(t)

>>> import sympy as sym
>>> import telg1001_z as fcnm
>>> n = sym.Symbol('n', real=True)
>>> z = sym.Symbol('z')
>>> d = sym.DiracDelta(n)
>>> f = d
>>> fcnm.z_transform(f,n,z)
1
>>>

Transformada z de impulso unitario desplazado δ(t-2) y δ(t+2)

>>> fcnm.z_transform(f.subs(n,n-2),n,z)
z**(-2)
>>> fcnm.z_transform(f.subs(n,n+2),n,z)
z**2
>>>

Tabla de Transformadas z unilateral e Inversas usando algoritmo en telg1001.py

Para comprobar las transformadas de los algoritmos presentados e integrados en telg1001.py, se crea una tabla con expresiones f[n] de prueba en el dominio n de tiempo discreto.

Al resultado se aplica la inversa de F[z] que muestra que la expresión es invertible usando la transformada z unilateral.

El resultado del algoritmo se muestra a continuación y luego el algoritmo.

z_transform :  0
  f[n]: DiracDelta(n)
  F[z]: (1, True, True)
  f[n]: (DiracDelta(n), True, True)

z_transform :  1
  f[n]: DiracDelta(n - 2)
  F[z]: (z**(-2), Abs(z) > 0, True)
  f[n]: (DiracDelta(n - 2), True, True)

z_transform :  2
  f[n]: DiracDelta(n + 2)
  F[z]: (z**2, True, True)
  f[n]: (DiracDelta(n + 2), True, True)

z_transform :  3
  f[n]: 3*DiracDelta(n + 2)
  F[z]: (3*z**2, True, True)
  f[n]: (3*DiracDelta(n + 2), True, True)

z_transform :  4
  f[n]: -3*DiracDelta(n + 2)
  F[z]: (-3*z**2, True, True)
  f[n]: (-3*DiracDelta(n + 2), True, True)

z_transform :  5
  f[n]: Heaviside(n)
  F[z]: (z/(z - 1), Abs(z) > 1, True)
  f[n]: (Heaviside(n), Abs(z) > 1, True)

z_transform :  6
  f[n]: Heaviside(n - 2)
  F[z]: (1/(z*(z - 1)), Abs(z) > 1, True)
  f[n]: [None, [1/(z*(z - 1))]]

z_transform :  7
  f[n]: Heaviside(n + 2)
  F[z]: (z**3/(z - 1), Abs(z) > 1, True)
  f[n]: (Heaviside(n + 2), Abs(z) > 1, True)

z_transform :  8
  f[n]: 3*Heaviside(n + 2)
  F[z]: (3*z**3/(z - 1), Abs(z) > 1, True)
  f[n]: (3*Heaviside(n + 2), Abs(z) > 1, True)

z_transform :  9
  f[n]: n*Heaviside(n)
  F[z]: (z/(z - 1)**2, Abs(z) > 1, True)
  f[n]: (n*Heaviside(n), Abs(z) > 1, True)

z_transform :  10
  f[n]: n**2*Heaviside(n)
  F[z]: (z*(z + 1)/(z - 1)**3, Abs(z) > 1, True)
  f[n]: (n**2*Heaviside(n), Abs(z) > 1, True)

z_transform :  11
  f[n]: n**3*Heaviside(n)
  F[z]: (z*(z**2 + 4*z + 1)/(z - 1)**4, Abs(z) > 1, True)
  f[n]: (n**3*Heaviside(n), Abs(z) > 1, True)

z_transform :  12
  f[n]: 0.5**n*Heaviside(n)
  F[z]: (z/(z - 0.5), Abs(z) > 0.5, True)
  f[n]: (0.5**n*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  13
  f[n]: 0.5**n*Heaviside(n)
  F[z]: (z/(z - 0.5), Abs(z) > 0.5, True)
  f[n]: (0.5**n*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  14
  f[n]: Heaviside(n)/4**n
  F[z]: (z/(z - 1/4), Abs(z) > 1/4, True)
  f[n]: (Heaviside(n)/4**n, Abs(z) > 1/4, True)

z_transform :  15
  f[n]: -0.5**n*Heaviside(-n - 1)
  F[z]: (z/(z - 0.5), Abs(z) < 0.5, True) f[n]: (0.5**n*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  16
  f[n]: 0.5**(n - 1)*Heaviside(n - 1)
  F[z]: (1.0/(z - 0.5), Abs(z) > 0.5, True)
  f[n]: [None, [1/(z - 0.5)]]

z_transform :  17
  f[n]: 4**(1 - n)*Heaviside(n - 1)
  F[z]: (1/(z - 1/4), Abs(z) > 1/4, True)
  f[n]: [None, [1/(z - 1/4)]]

z_transform :  18
  f[n]: 0.5**n*n*Heaviside(n)
  F[z]: (0.5*z/(z - 0.5)**2, Abs(z) > 0.5, True)
  f[n]: (0.5**n*n*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  19
  f[n]: -0.5**n*n*Heaviside(-n - 1)
  F[z]: (0.5*z/(z - 0.5)**2, Abs(z) < 0.5, True) f[n]: (0.5**n*n*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  20
  f[n]: 0.5**n*(n + 1)*Heaviside(n)
  F[z]: z/(z - 0.5) + 0.5*z/(z - 0.5)**2
  f[n]: (2*0.5**(n + 1)*(n + 1)*Heaviside(n + 1), Abs(z) > 0.5, True)

z_transform :  21
  f[n]: 0.5**n*n**2*Heaviside(n)
  F[z]: (0.5*z*(z + 0.5)/(z - 0.5)**3, Abs(z) > 0.5, True)
  f[n]: (0.5**n*n**2*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  22
  f[n]: 1.33333333333333*0.5**n*n*(n - 2)*(n - 1)*Heaviside(n)
  F[z]: 1.33333333333333*z/(z - 0.5)**2 - 2*z*(z + 0.5)/(z - 0.5)**3 + 0.666666666666667*z*(z**2 + 2*z + 0.25)/(z - 0.5)**4
  f[n]: (1.33333333333333*0.5**n*n*(n - 2)*(n - 1)*Heaviside(n), Abs(z) > 1, 0)

z_transform :  23
  f[n]: cos(2*n)*Heaviside(n)
  F[z]: (z*(z - cos(2))/(z**2 - 2*z*cos(2) + 1), Abs(z) > 1, True)
  f[n]: (cos(2*n)*Heaviside(n), Abs(z) > 1, True)

z_transform :  24
  f[n]: 0.5**n*cos(2*n)*Heaviside(n)
  F[z]: (z*(z - 0.5*cos(2))/(z**2 - z*cos(2) + 0.25), Abs(z) > 0.5, True)
  f[n]: (0.5**n*cos(2*n)*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  25
  f[n]: sin(2*n)*Heaviside(n)
  F[z]: (z*sin(2)/(z**2 - 2*z*cos(2) + 1), Abs(z) > 1, True)
  f[n]: (sin(2*n)*Heaviside(n), Abs(z) > 1, True)

z_transform :  26
  f[n]: 0.5**n*sin(2*n)*Heaviside(n)
  F[z]: (0.5*z*sin(2)/(z**2 - z*cos(2) + 0.25), Abs(z) > 0.5, True)
  f[n]: (0.5**n*sin(2*n)*Heaviside(n), Abs(z) > 0.5, True)

z_transform :  27
  f[n]: cos(2*n + 0.25)*Heaviside(n)
  F[z]: (z*(z*cos(0.25) - cos(1.75))/(z**2 - 2*z*cos(2) + 1), Abs(z) > 1, True)
  f[n]: (1.0*cos(2*n + 0.25)*Heaviside(n), Abs(z) > 1, True)

z_transform :  28
  f[n]: 3*0.5**n*cos(2*n + 0.25)*Heaviside(n)
  F[z]: (3*z*(z*cos(0.25) - 0.5*cos(1.75))/(z**2 - z*cos(2) + 0.25), Abs(z) > 0.5, True)
  f[n]: (3.0*0.5**n*cos(2*n + 0.25)*Heaviside(n), Abs(z) > 0.5, True)

Algoritmo en Python

Las intrucciones se pueden modificar para observar una expresión en detalle si se activa la variable sym.SYMPY_DEBUG=True. Por la extensión del resultado se recomienda activarla para una expresión.

import sympy as sym
import telg1001 as fcnm
sym.SYMPY_DEBUG = False

# INGRESO
n = sym.Symbol('n')
z = sym.Symbol('z')
u = sym.Heaviside(n)
d = sym.DiracDelta(n)

a0 = sym.Rational(1,4).limit_denominator(100)

tabla = [
           d,
           d.subs(n,n-2),
           d.subs(n,n+2),
           3*d.subs(n,n+2),
           -3*d.subs(n,n+2),
           u,
           u.subs(n,n-2),
           u.subs(n,n+2),
           3*u.subs(n,n+2),
           n*u,
           (n**2)*u,
           (n**3)*u,
           0.5**n*u,((1/2)**n)*u,(a0**n)*u,
           -(0.5**n)*u.subs(n,-n-1),
           (0.5**(n-1))*u.subs(n,n-1),
           (a0**(n-1))*u.subs(n,n-1),
           n*(0.5**n)*u,
           -n*(0.5**n)*u.subs(n,-n-1),
           (n+1)*(0.5**n)*u,
           n**2*(0.5**n)*u,
           n*(n-1)*(n-2)*(0.5**n)*u/((0.5**3)*6),
           sym.cos(2*n)*u,
           (0.5**n)*sym.cos(2*n)*u,
           sym.sin(2*n)*u,
           (0.5**n)*sym.sin(2*n)*u,
           sym.cos(2*n+0.25)*u,
           3*(0.5**n)*sym.cos(2*n+0.25)*u
           ]
# seleccionar revisar
revisar = tabla[:]

# revisa detalle de una transformada y la inversa
if len(revisar)<2:
    sym.SYMPY_DEBUG = True
else:
    sym.SYMPY_DEBUG = False

# PROCEDIMIENTO
for i in range(0,len(revisar),1):
    f = revisar[i]
    # SALIDA
    print('\nz_transform : ', i)
    print('  f[n]:',f)
    Fz = fcnm.z_transform(f,n,z)
    print('  F[z]:',Fz)
    if type(Fz)==tuple:
        fn = fcnm.inverse_z_transform(Fz[0],z,n)
    else:
        fn = fcnm.inverse_z_transform(Fz,z,n)
    print('  f[n]:',fn)

Tabla de Fórmulas Matemáticas

Referencia: Lathi Sec. B p54

B.8-3 Sumatorias

\sum_{k=m}^{n} r^k = \frac{r^{n+1}-r^m}{r-1} \texttt{ , } r\neq 1 \sum_{k=0}^{n} k = \frac{n(n+1)}{2} \sum_{k=0}^{n} k^2 = \frac{n(n+1)(2n+1)}{6} \sum_{k=0}^{n} k r^k = \frac{r+[n(r-1)-1]r^{n+1}}{(r-1)^2} \texttt{ , } r\neq 1 \sum_{k=0}^{n} k^2 r^k = \frac{r[(1+r)(1-r^n)-2n(1-r)r^n - n^2(1-r)^2 r^n] }{(1-r)^3} \texttt{ , } r\neq 1

 

7.1.2 Transformada z – Propiedades con Sympy-Python

Luego de intentar obtener la Transformada z con la Tabla de Pares f[n] y F[z], si del resultado sigue siendo None se busca aplicar las reglas descritas en la tabla de propiedades de la Transformada z.

Referencia: Schaum Hsu Tabla 4-2 p173. Lathi Tabla 5.2 p509. Oppenheim Tabla 10.3 p793


1. Propiedad de multiplicación por n de la transformada z

Presentada en la tabla de propiedades y también conocida como Diferenciación en z, se presenta como:

n x[n] u[n] -z \frac{\delta}{\delta z}X(z) R’ = R

Se aplica sobre la señal x[n]=1

x[n] = n \mu[n]

A partir de la tabla de transformadas se tiene que la expresión para μ[n] es

F[z] = \frac{z}{z-1} = (z)\frac{1}{z-1} \frac{\delta}{\delta z}F[z] = \frac{1}{z-1}-\frac{z}{(z-1)^2}

por lo que para X[z] de obtiene como:

X[z] = -z \frac{\delta}{\delta z} F[z] = -z \Big[ \frac{1}{z-1}-\frac{z}{(z-1)^2}\Big] = -z \Big[ -\frac{1}{(z-1)^2}\Big] X[z] = \frac{z}{(z-1)^2}

Algoritmo en Python

El desarrollo del algoritmo es posterior a la búsqueda en la tabla de pares de transformadas z, por lo que se importa el proceso desde telg1001.py. En la tabla, para comprobar el funcionamiento de la propiedad con los resultados del texto, se usa una tabla básica, que luego puede ser ampliada.

El algoritmo se desarrolla para una expresión básica como la de la tabla. Luego los procedimientos se integran en una sola instrucción tal como z_transform(f,n,z) que usa primero la tabla, luego revisa las propiedades y fórmula de la transformada para mostrar un resultado.

u = sym.Heaviside(n)

#f = u
f = n*u

Resultados con el algoritmo:

 k ; func: 1  ;  n*Heaviside(n)
no hubo expresión similar en tabla de transformadas
buscando aplicar una propiedad n*f[n]
  f_powna ; n**a: n  ;  {a_: 1}

 _z_propiedad n*f[n] -------------
  n**a ; func/n, : n  ;  Heaviside(n)
_z_pairs_table match:
  f:           Heaviside(n)
  z_pair f[n]: Heaviside(n)
  z_pair F[z]: z/(z - 1)
  try,check: True -> True
  _z_propiedad n*f[n] <--> -z*diff(Fz):
   (z/(z - 1)**2, Abs(z) > 1, True)
>>> 

Instrucciones en Python

El coeficiente constante k se separa de la expresión para simplificar el análisis de la expresión en func. La constante se reincorpora al resultado al final.

El procedimiento con la tabla de pares de transformadas  z_pairs_properties se obtiene desde telg1001.py , se usa con el parámetro apply_properties=False para mostrar el funcionamiento del algoritmo para el ejercicio. la instrucción z_pairs_properties hace el llamado a una función que analiza la expresión con las propiedades ya implementadas y se omite su escritura en condiciones normales.

Las expresiones pueden tener dos factores con exponentes: an, na, que corresponden a dos propiedades diferentes. El factor  de interés para el ejercicio es na.  La búsqueda de éstos factores se realiza con las instrucciones sym.pow(n,a) y sym.pow(a,n), en la variable f_powna que se inicializan con sym.S.One.

Cuando se encuentra la expresión con f_powna se modifica expresión func_n =func/n, con la que se vuelve a buscar el resultado en la tabla. El proceso para analizar la expresión puede realizarse de forma recursiva hasta obtener una expresión simple como μ[n] y regresar al estado anterior para completar las operaciones. La forma recursiva requiere implementar el procedimiento con def z_propiedades().

La aplicación de la propiedad de multiplicación para n(x[n]) prepara la expresión para aplicar:

n x[n] \longleftrightarrow -z \frac{\delta}{\delta z}X(z)
Fz = (k*(-z)*sym.factor(sym.diff(Fz[0],z,1)),
                  Fz[1], Fz[2])

que contiene las partes de la transformada como el plano de convergencia y condiciones de aplicación que también deben tomarse en cuenta durante el proceso. Aunque para expresiones se sumas, no se toman en cuenta para el resultado final como en los ejercicios de los textos de referencia.

Esta sección expone cómo se implementa la propiedad de transformada z, el resultado final se encuentra en el archivo.py.

# transformada z propiedades con Sympy
# aplicar luego de buscar en tabla de pares
import sympy as sym
from telg1001 import z_pairs_properties

# INGRESO
n = sym.Symbol('n', real=True)
z = sym.Symbol('z')
u = sym.Heaviside(n)

#f = u
f = n*u
#f = sym.cos(2*n)
#f = sym.sin(2*n)

# PROCEDIMIENTO
f = sym.expand(sym.powsimp(f))
a = sym.Wild('a', exclude=[n])
b = sym.Wild('b', exclude=[n])
y = sym.Wild('y')
g = sym.WildFunction('g', nargs=1)

# separa constantes del término
k, func = f.as_independent(n, as_Add=False)
print(' k ; func:',k,' ; ',func)
Fz = z_pairs_properties(func, n, z, apply_properties=False)
if not(Fz==None):
    Fz = k*Fz
    print(' usando tabla de pares: \n ',Fz)

if Fz==None: # no encontrada en tabla
    print('no hubo expresión similar en tabla de transformadas')
    print('buscando aplicar una propiedad n*f[n]')
    # crear una función para aplicar varias veces las propiedades
    # en las expresiones, en forma recursiva.
    
    # busca factores pow(n,a) or pow(a,n)
    f_powna = sym.S.One ; f_powan = sym.S.One
    factor_Mul = sym.Mul.make_args(func)
    for factor_k in factor_Mul:
        ma_powna = factor_k.match(sym.Pow(n,a))
        ma_powan = factor_k.match(sym.Pow(a,n))
        if ma_powna and not(ma_powna[a]==sym.S.Zero) and ma_powna[a].is_integer:
            f_powna = f_powna*factor_k
            print('  f_powna ; n**a:',factor_k,' ; ',ma_powna)
        if ma_powan:
            f_powan = f_powan*factor_k
            print('  f_powan ; a**n:',factor_k,' ; ',ma_powan)

    # otras formas de expresión a revisar
    ma_un = func.match(sym.Heaviside(y))
    ma_gn = func.match(g)
    ma_gu = func.match(g*sym.Heaviside(y))

    # z_propiedad de multipliación n*f[n] <--> -z*dF(z)/dz --------
    if not(f_powna==sym.S.One): # n**a factor encontrado
        ma_powna = f_powna.match(sym.Pow(n,a))
        func_n = func/n # aplicar luego de forma recursiva
        print('\n _z_propiedad n*f[n] -------------')
        print('  n**a ; func/n, :',n,' ; ',func_n)
        Fz = z_pairs_properties(func_n,n,z,
                                apply_properties=False)
        if not(Fz==None):
            Fz = (k*(-z)*sym.factor(sym.diff(Fz[0],z,1)),
                  Fz[1], Fz[2])
            print('  _z_propiedad n*f[n] <--> -z*diff(Fz):\n  ',Fz)

if Fz==None: # no encontrada en tabla, tampoco con la propiedad
    print('propiedad implementada no es suficiente')
    print('implementar otras propiedades.')

Un procedimiento semejante se implementa para la transformada z inversa.

2. Propiedad de multiplicación por n de la transformada z inversa

Se aplica a partir de F(z), donde la expresión será tipo polinomio, por lo que se prepara la expresión para conocer el grado del numerador y de nominador, separar su signo, constante de multiplicación, coeficientes, etc.

Para el resultado del ejercicio anterior f(n) = nμ(n) se obtuvo la expresión:

F[z] = \frac{z}{(z-1)^2}
n x[n] u[n] -z \frac{\delta}{\delta z}X(z) R’ = R

el sentido inverso de la propiedad, se aplica con un integral sobre la expresión con denominador Q=(z-a)b. y a partir de la respuesta F[z] con al menos el grado del numerador P de 1.

El integral se desarrolla con la expresión despejada de la derivada y con un valor F(0)=0 para determinar la constante del integral.

X[z] = \int{\Big[\frac{z}{(z-1)^2}\Big]\Big[\frac{-1}{z}\Big]} + C X[z] = \frac{1}{(z-1)} + C

usando el valor de para la constante F(0)=0

0 = \frac{1}{(0-1)} + C C = 1 X[z] = \frac{1}{(z-1)} +1 = \frac{1+(z-1)}{(z-1)} X[z] = \frac{z}{(z-1)}

de la tabla la transformada z inversa es μ(n), y al aplicar al resultado la propiedad se tiene:

x[n] = n \mu [n]

resultados con el algoritmo:

 Parametros de P/Q -------------
 P: z
 Q: (z - 1)**2
 P_signo ;k :  1  ;  1
 P_grado, P_ceros: 1  ;  {0: 1}
 Q_grado, Q_polos (real):  2  ;  [1, 1]
 ma_P1 (a*z+ b) :  {a_: 1, b_: 0}
 ma_Q1 (z-a)**b :  {a_: 1, b_: 2}
 ma_Q2 a*z**2+ b*z + r**2:  None
 Fz :  z/(z - 1)**2

 _z_propiedad multiplicación nf[n] <--> -z*diff(F[z])-- 
 Func = integrate(factor(Fz)/z,z):
  z/(z - 1)
_z_pairs_table match:
  k ; F:      1 z/(z - 1)
  z_pair F[z]: z/(z - 1)
         ma_z: {}
  z_pair f[n]: Heaviside(n)
  try,check: True -> True
  _z_propiedad multiplicación nf[n]:
  (n*Heaviside(n), Abs(z) > 1, True)
>>> 

Instrucciones en Python

# transformada z propiedades con Sympy
# aplicar luego de buscar en tabla de pares
import sympy as sym
from telg1001 import z_pairs_prop_inverse

# INGRESO
n = sym.Symbol('n', real=True)
z = sym.Symbol('z')
u = sym.Heaviside(n)

# multiplicación nf[n] <--> -z*diff(F[z])
#F = z/(z - 1) #f = u
F = z/(z - 1)**2 #f = n*u
#F = z*(z + 1)/(z - 1)**3 # (n**2)*u

# PROCEDIMIENTO
# separa constantes del término
fn = z_pairs_prop_inverse(F, z, n, apply_properties=False)
if not(fn==None):
    print(' usando tabla de pares: \n ',fn)

if fn==None: # no encontrada en tabla
    Fz = sym.simplify(F) #sym.simplify(F)
    a = sym.Wild('a', exclude=[n,z])
    b = sym.Wild('b', exclude=[n,z])
    r = sym.Wild('r', exclude=[n,z])
    y = sym.Wild('y')
    g = sym.WildFunction('g', nargs=1)
    # analiza como polinomio F[z]:
    # P_signo, constante, F[z] pares
    [P,Q] = F.as_numer_denom()
    # P
    P = sym.Poly(P,z)
    ma_P1 = P.match(a*z+ b)
    P_zeros  = sym.roots(P)
    P_degree = sym.degree(P,z)
    P_leadcoef = sym.LC(P)
    k = sym.Abs(P_leadcoef)
    P_sign = P_leadcoef/k
    P = P/P_leadcoef
    # Q
    Q = sym.factor(Q)
    ma_Q1 = Q.match((z-a)**b)
    ma_Q2 = Q.match(a*z**2+ b*z + r**2)
    Q_poles = sym.real_roots(Q)
    Q_degree = sym.degree(Q,z)
    # separa constante
    Fz = sym.factor(Fz*P_sign/k)
    print('\n Parametros de P/Q -------------')
    print(' P:',P)
    print(' Q:',Q)
    print(' P_signo ;k : ',P_sign,' ; ',k)
    print(' P_grado, P_ceros:',P_degree,' ; ', P_zeros)
    print(' Q_grado, Q_polos (real): ',Q_degree,' ; ',Q_poles)
    print(' ma_P1 (a*z+ b) : ',ma_P1)
    print(' ma_Q1 (z-a)**b : ',ma_Q1)
    print(' ma_Q2 a*z**2+ b*z + r**2: ',ma_Q2)
    print(' Fz : ',Fz)
    
    # _z_property nf[n] <--> -z*diff(F[z])
    if ma_Q1 and ma_Q1[a]==1 and P_degree>0:
        FuncI = sym.factor(Fz/(-z),z)
        Func = sym.integrate(FuncI,z)
        F0 = 0 # para Constante de integral
        C = -Func.subs(z,0)+F0 
        FunC = sym.factor(Func+C)
        print('\n _z_propiedad multiplicación nf[n] <--> -z*diff(F[z])-- ')
        print(' Func = integrate(factor(Fz)/z,z):\n ',FunC)
        fn = z_pairs_prop_inverse(FunC, z, n, apply_properties=True)
        if not(fn==None):
            fn = (P_sign*k*n*fn[0],fn[1],fn[2])
            print('  _z_propiedad multiplicación nf[n]:\n ',fn)

if fn==None: # no encontrada en tabla, tampoco con la propiedad
    print('propiedad implementada no es suficiente')
    print('implementar otras propiedades.')

Si la propiedad debe aplicarse más de una vez, será necesario convertir el bloque a una función para hacer llamadas recursivas a si misma, como es el caso de n2*u

F = z*(z + 1)/(z - 1)**3 # (n**2)*u

o al final de la sección de la propiedad, usar apply_properties=True, para usar el algoritmo implementado en telg1001_z .

7.1.1 Transformada z – Pares f[n] y F[z] con match() de Sympy-Python

Para facilitar el uso de la Transformada z se usa la Tabla de Pares f[n] y F[z], donde se busca una expresión semejante que permite cambiar del dominio_n al dominio_z. Los Pares se usan en conjunto con la tabla de propiedades de la Transformada z con lo que se extiende las posibilidades de uso para la tabla.

Se propone primero usar la tabla de pares con Sympy para buscar las expresiones semejantes, usando la instrucción ‘f.match()‘, donde f es la función en el dominio_n y F es la función en el domino_z. En la siguiente sección se incorpora la tabla de propiedades, para en conjunto realizar una búsqueda más completa de las transformadas z o de sus inversas.

Referencia: Schaum Hsu Tabla 4-1 p170. Lathi Tabla 5.1 Transformada z p492. Oppenheim tabla 10.2 p776


Ejercicio 1. transformada z de f[n] = cos(2n) con Sympy y la instrucción f.match()

Revise si existe una expresión para f[n] en una pequeña lista de pares de transformadas:

f[n] = \cos [2n]

Algoritmo en Python

El algoritmo inicia con las variables a usar para cada dominio y la expresión de Heaviside como en los ejemplos de las unidades anteriores.

En la tabla se requiere unas variables tipo «comodín» (Wild) para buscar la semejanza de las expresiones, se usan como sym.Wild('a', exclude=[n]) de la que se excluye la variable de tiempo discreto n.

Se incluye una pequeña lista como tabla de pares de transformadas como un ejemplo básico, que luego puede ser ampliada. Los pares se incluyen como tuplas con las expresiones para cada domino.

Para encontrar semejanzas, se recorre cada par de transformadas, comparando las expresiones con f.match(par_nz[0]), que para revisar la expresión del domino n, solo toma la primera parte de la tupla. Si existe coincidencia, se crea un diccionario que indica los valores comodín que hacen que las expresiones sean iguales.

Resultado del algoritmo

 se encontró expresión similar:
  f:            cos(2*n)
  z_pares f[n]: cos(n*a_)
   similar con: {a_: 2}
  z_pares F[z]: (z**2 - z*cos(a_))/(z**2 - 2*z*cos(a_) + 1)
  Fz:         : (z**2 - z*cos(2))/(z**2 - 2*z*cos(2) + 1)
>>> 

Instrucciones en Python

# transformada z con f.match de Sympy
# expresiones similares o semejantes f.match
import sympy as sym

# INGRESO
n = sym.Symbol('n', real=True)
z = sym.Symbol('z')
u = sym.Heaviside(n)

#f = u
#f = 5*u
f = sym.cos(2*n)
#f = sym.sin(2*n)

# PROCEDIMIENTO
# para revisar semejanza de expresiones fn y n_dom
a = sym.Wild('a', exclude=[n])
b = sym.Wild('b', exclude=[n])

# tabla de pares [(n_dom, z_dom)]
z_pares = [
    # impulso unitario d[n], DiracDelta
    (DiracDelta(n),
     S.One,
     S.true, S.Zero, dco),
    (DiracDelta(a*n),
     S.One,
     Abs(a)>0, S.Zero, dco),
    # escalon unitario u[n], Heaviside
    (Heaviside(n),
     z/(z-1),
     S.true, Abs(z) > 1, dco),
    # cos[n], sin[n] ,trigonometricas
    (cos(a*n),
     (z*(z-cos(a)))/(z**2-(2*cos(a))*z+1),
     Abs(a)>0, Abs(z) > 1, dco),
    (sin(a*n),
     (sin(a)*z+0)/(z**2-(2*cos(a))*z+1),
     Abs(a)>0, Abs(z) > 1, dco),
    ]

Fz = None; f_pares = None # sin similar
z_pares_len = len(z_pares) ; i=0
while i<z_pares_len and Fz==None:
    par_nz = z_pares[i]
    n_dom = par_nz[0]
    z_dom = par_nz[1]
    similar = f.match(n_dom)
    # entrega diccionario de expresion similar
    # si el diccionario es vacio, es coincidente
    if similar or similar=={}:
        f_pares = par_nz
        f_args = similar
        Fz_ = z_dom
        Fz  = z_dom.xreplace(similar)
    i = i+1 # siguiente par

# SALIDA
if not(Fz==None):
    print(' se encontró expresión similar:')
    print('  f:           ',f)
    print('  z_pares f[n]:',f_pares[0])
    print('   similar con:',f_args)
    print('  z_pares F[z]:',f_pares[1])
    print('  Fz:         :',Fz)
else:
    print(' NO se encontró una expresión similar...')

El concepto de expresiones similares se prueba con:

f[n] = \mu [n]

donde se observa que a respuesta es un diccionario vacío

 se encontró expresión similar:
  f:            Heaviside(n)
  z_pares f[n]: Heaviside(n)
   similar con: {}
  z_pares F[z]: z/(z - 1)
  Fz:         : z/(z - 1)
>>> 

mientras que para una función que no se encuentra en la tabla, el resultado debe ser Fz=None

f[n] = \sin [2n]
 NO se encontró una expresión similar...
>>> type(Fz)
<class 'NoneType'>
>>> 

El concepto básico del algoritmo se extiende para las tablas de Pares de transformadas que se adjuntan en un archivo de funciones telg1001.py.


Ejercicio 2. Transformada z inversa de F[z] = z/(z-1) con Sympy y la instrucción f.match()

Revisar si existe una expresión para F[z] en una pequeña lista de pares de transformadas:

F[z] = \frac{z}{z-1}

Algoritmo en Python

Semejante al ejercicio 1 para f[n] a F[z], el algoritmo inicia con las variables a usar para cada dominio y de F[z].

Para encontrar semejanzas, se recorre cada par de transformadas, comparando las expresiones con F.match(par_nz[1]), que para revisar la expresión del domino z, solo toma la segunda parte de la tupla. Si existe coincidencia, se crea un diccionario que indica los valores comodín que hacen que las expresiones sean iguales.

Resultado del algoritmo

 se encontró expresión similar:
  F:            z/(z - 1)
  z_pares F[z]: z/(z - 1)
   similar con: {}
  z_pares f[n]: Heaviside(n)
  fn:         : Heaviside(n)
>>> 

Instrucciones en Python

# transformada z inversa con F.match de Sympy
# expresiones similares o semejantes F.match
import sympy as sym

# INGRESO
n = sym.Symbol('n', real=True)
z = sym.Symbol('z')
u = sym.Heaviside(n)

F = z/(z-1)
#F = (z**2 - z*sym.cos(2))/(z**2 - 2*z*sym.cos(2) + 1)

# PROCEDIMIENTO
# para revisar semejanza de expresiones fn y n_dom
a = sym.Wild('a', exclude=[n])
b = sym.Wild('b', exclude=[n])

# tabla de pares [(n_dom, z_dom)]
z_pares = [
    # impulso unitario d[n], DiracDelta
    (DiracDelta(n),
     S.One,
     S.true, S.Zero, dco),
    (DiracDelta(a*n),
     S.One,
     Abs(a)>0, S.Zero, dco),
    # escalon unitario u[n], Heaviside
    (Heaviside(n),
     z/(z-1),
     S.true, Abs(z) > 1, dco),
    # cos[n], sin[n] ,trigonometricas
    (cos(a*n),
     (z*(z-cos(a)))/(z**2-(2*cos(a))*z+1),
     Abs(a)>0, Abs(z) > 1, dco),
    (sin(a*n),
     (sin(a)*z+0)/(z**2-(2*cos(a))*z+1),
     Abs(a)>0, Abs(z) > 1, dco),
    ]

fn = None; F_pares = None # sin similar
z_pares_len = len(z_pares) ; i=0
while i<z_pares_len and fn==None:
    par_nz = z_pares[i]
    n_dom = par_nz[0]
    z_dom = par_nz[1]
    similar = F.match(z_dom)
    # entrega diccionario de expresion similar
    # si el diccionario es vacio, es coincidente
    if similar or similar=={}:
        F_pares = par_nz
        F_args = similar
        fn_ = n_dom
        fn  = n_dom.xreplace(similar)
    i = i+1 # siguiente par

# SALIDA
if not(fn==None):
    print(' se encontró expresión similar:')
    print('  F:           ',F)
    print('  z_pares F[z]:',F_pares[1])
    print('   similar con:',F_args)
    print('  z_pares f[n]:',F_pares[0])
    print('  fn:         :',fn)
else:
    print(' NO se encontró una expresión similar...')

otros ejercicios realizados con

F[z] =\frac{z^2 - zcos(2)}{z^2 - 2zcos(2) + 1}

resultado del algoritmo

 se encontró expresión similar:
  F:            (z**2 - z*cos(2))/(z**2 - 2*z*cos(2) + 1)
  z_pares F[z]: (z**2 - z*cos(a_))/(z**2 - 2*z*cos(a_) + 1)
   similar con: {a_: 2}
  z_pares f[n]: cos(n*a_)
  fn:         : cos(2*n)
>>> 

Referencias: Sympy: match(pattern, old=False) https://docs.sympy.org/latest/modules/core.html?highlight=match#sympy.core.basic.Basic.match

s3Eva2016TI_T4 rampa(ω) – transformada inversa de Fourier

Ejercicio: 3Eva2016TI_T4 rampa(ω) – transformada inversa de Fourier

la función de magnitud |X(ω)|  es par en el eje vertical,

3E2016TI Tema4 Diagrama01

usando la derivada de |X(ω)|,

3E2016TI Tema4 Diagrama 03

la expresión de la gráfica usando impulsos y rectángulos en dominio ω es,

\frac{\delta}{\delta \omega}X(\omega) = \delta( \omega +\omega_0) - \frac{1}{\omega_0} P_{\omega_0/2}\Big( \omega +\frac{\omega_0}{2}\Big) + \frac{1}{\omega_0} P_{\omega_0/2}\Big( \omega -\frac{\omega_0}{2}\Big) - \delta( \omega - \omega_0)

aplicando la transformada inversa de Fourier

\mathscr{F} ^{-1} \Big[ \frac{\delta}{\delta \omega}X(\omega) \Big] = \mathscr{F} ^{-1} \Big[\delta( \omega +\omega_0) - \frac{1}{\omega_0} P_{\omega_0/2}\Big( \omega +\frac{\omega_0}{2}\Big) \Big] + \mathscr{F} ^{-1} \Big[\frac{1}{\omega_0} P_{\omega_0/2}\Big( \omega -\frac{\omega_0}{2}\Big) - \delta( \omega - \omega_0) \Big]

si se realiza por partes, y considerando solo la gráfica de magnitud |X(ω)|

\mathscr{F} ^{-1} \Big[ \frac{\delta}{\delta \omega}X(\omega) \Big] = -jtx_1(t) \mathscr{F} ^{-1} \Big[\delta( \omega +\omega_0)\Big] = \frac{1}{2\pi} e^{-j\omega_0 t} \mathscr{F} ^{-1} \Big[\frac{1}{\omega_0} P_{\omega_0/2}\Big( \omega +\frac{\omega_0}{2}\Big) \Big] = \frac{1}{\omega_0} \frac{1}{\pi t} \sin \Big(\frac{\omega_0}{2} t \Big) e^{-j\frac{\omega_0}{2}t}

sustituyendo en la ecuación principal,

-jtx_1(t) = \frac{1}{2\pi} e^{-j\omega_0 t} - \frac{1}{\omega_0} \frac{1}{\pi t} \sin \Big(\frac{\omega_0}{2} t \Big) e^{-j\frac{\omega_0}{2}t} + \frac{1}{\omega_0} \frac{1}{\pi t} \sin \Big(\frac{\omega_0}{2} t \Big) e^{j\frac{\omega_0}{2}t} - \frac{1}{2\pi} e^{j\omega_0 t}

agrupando,

-jtx_1(t) = \frac{1}{2\pi}\Big( e^{-j\omega_0 t} -e^{j\omega_0 t}\Big) + \frac{1}{\omega_0 \pi t} \sin \Big(\frac{\omega_0}{2} t \Big)\Big(- e^{-j\frac{\omega_0}{2} t} +e^{j\frac{\omega_0}{2} t}\Big)

para simplificar se divide ambos lados de la ecuación para -jt

x_1(t) = \frac{1}{\pi t}\Big( \frac{e^{j\omega_0 t}-e^{-j\omega_0 t} }{2j}\Big) - \frac{2}{\omega_0 \pi t^2 } \sin \Big(\frac{\omega_0}{2} t \Big)\Big(\frac{e^{j\frac{\omega_0}{2} t}- e^{-j\frac{\omega_0}{2} t}}{2j}\Big)

que es la forma exponencial del seno y coseno

x_1(t) = \frac{1}{\pi t} \sin (\omega_0 t) - \frac{2}{\omega_0 \pi t^2 } \sin \Big(\frac{\omega_0}{2} t \Big) \sin \Big( \frac{\omega_0}{2} t \Big) x_1(t) = \frac{1}{\pi t}\sin (\omega_0 t) - \frac{2}{\omega_0 \pi t^2 }\sin^2 \Big(\frac{\omega_0}{2} t \Big) x_1(t) = \frac{\omega_0}{\pi}\frac{\sin (\omega_0 t)}{\omega_0 t} - \frac{\omega_0}{2\pi}\Bigg[\frac{\sin \Big(\frac{\omega_0}{2} t \Big)}{\frac{\omega_0}{2} t} \Bigg]^2

ahora, considerando la gráfica de fase:
3E2016TI Tema4 Diagrama 02

se tiene que,

x(t) = x_1(t-3) x(t) = \frac{\omega_0}{\pi}\frac{\sin (\omega_0 (t-3))}{\omega_0 (t-3)} - \frac{\omega_0}{2\pi}\Bigg[\frac{\sin \Big(\frac{\omega_0}{2} (t-3) \Big)}{\frac{\omega_0}{2} (t-3)}\Bigg]^2

s3Eva2016TI_T3 LTI CT Circuito RL respuesta de frecuencia

Ejercicio: 3Eva2016TI_T3 LTI CT Circuito RL respuesta de frecuencia

a. Determinar su función de transferencia

voltaje en la entrada,

v_1(t) = v_R(t) + v_L(t) v_1(t) = R i(t) + v_L(t)

voltaje en la salida,
v_2(t) = L \frac{\delta}{\delta t}i(t)

i(t) = \frac{1}{L} \int_{-\infty}^{t}v_2(\tau) \delta \tau

sustituyendo i(t)en la ecuacion de v1

v_1(t) = R \frac{1}{L} \int_{-\infty}^{t}v_2(\tau) \delta \tau + v_L(t)

usando un solo operador, el diferencial,

\frac{\delta}{\delta t} v_1(t) = \frac{R}{L} v_2(t) + \frac{\delta}{\delta t} v_2(t)

cambiando al dominio de frecuencia ω

j\omega V_1(\omega) = \frac{R}{L} V_2(\omega) + j\omega V_2(\omega) j\omega L V_1(\omega) = R V_2(\omega) + j\omega L V_2(\omega) j\omega L V_1(\omega) = V_2(\omega)\Big( R + j\omega L \Big) H(\omega) = \frac{V_2(\omega)}{V_1(\omega)} = \frac{j\omega L}{ R + j\omega L } H(\omega) = \frac{j\omega \frac{L}{R}}{ 1 + j\omega \frac{L}{R} }

usando los valores del circuito

H(\omega) = \frac{j\omega 0.2}{ 10 + j\omega 0.2 } H(\omega) = \frac{j\omega}{50 + j\omega } |H(\omega)| = \frac{|\omega|}{\sqrt{ 50^2 + \omega^2} } \theta_{H(\omega)} = \frac{\pi}{2} - \arctan \Big( \frac{\omega}{50}\Big) \omega_0 = \frac{R}{L} = \frac{10}{0.2} = 50 rad/s

b. Determinar, esquematizar y etiquetar su respuesta de frecuencia, indicando a que tipo de filtro no ideal de frecuencias selectivas se podría asociar su comportamiento.

tarea…

c. Obtener la respuesta impulso h(t) que representa al circuito eléctrico.

h(t) = \mathscr{F} ^{-1} \Big[ H(\omega) \Big] = \mathscr{F} ^{-1} \Big[ \frac{j\omega}{50 + j\omega } \Big]

separando en fracciones parciales y usando la tabla de transformadas de Fourier:

= \mathscr{F} ^{-1} \Big[ 1-\frac{50}{50 + j\omega } \Big] h(t) = \delta (t) - 50 e^{-50t} \mu (t)

d. Determinar la respuesta v2(t) que se obtiene a la salida de dicho sistema cuando tiene una entrada v1(t) = sen 50t [V].
¿Qué puede decir acerca de si el sistema transmite con distorsión o sin distorsión? Justifique su respuesta de manera razonada.

V_1(\omega) = \mathscr{F} \Big[ v_1(t)\Big] = \mathscr{F} \Big[ \sin (50t) \Big] = j\pi \delta (\omega+50) - j\pi \delta (\omega-50) V_2(\omega) = V_1(\omega) H(\omega) V_2(\omega) =\Big( j\pi \delta (\omega+50) - j\pi \delta (\omega-50) \Big) \Big( \frac{j\omega}{50 + j\omega } \Big) =j^2\pi \Big( \delta (\omega+50) \frac{\omega}{50 + j\omega } - \delta (\omega-50) \frac{\omega}{50 + j\omega }\Big) = (-1)\pi \Big( \delta (\omega+50) \frac{\omega}{50 + j\omega }- \delta (\omega-50) \frac{\omega}{50 + j\omega }\Big)

Los términos con impulso desplazados tienen magnitud solo en las posiciones donde el impulso tiene valor 1. En este caso es con ω=±50

V_2(\omega) =\pi \Big( \delta (\omega+50) \frac{(-1)(-50)}{50 - j50 } - \delta (\omega-50) \frac{(-1)50}{50 + j50}\Big)

dividiendo el numerador y denominador para 50 se simplifica a

=\pi \Big( \delta (\omega+50) \frac{1}{1 - j1 } + \delta (\omega-50) \frac{1}{1 + j1}\Big)

multiplicando el primer coeficiente por 1+j y el segundo coeficiente por 1-j, se convierte el denominador en un número real.

=\pi \Big( \delta (\omega+50) \frac{1(1+j)}{(1 - j1) (1+j)} + \delta (\omega-50) \frac{1(1-j)}{(1 + j1)(1-j)}\Big) =\pi \Big( \delta (\omega+50) \frac{1+j}{2} + \delta (\omega-50) \frac{1-j}{2}\Big) =\frac{\pi}{2} \Big( \delta (\omega+50)+j\delta (\omega+50) + \delta (\omega-50) - j\delta (\omega-50) \Big) V_2(\omega) =\frac{\pi}{2} \Big( \delta (\omega+50) + \delta (\omega-50)\Big) + j\frac{\pi}{2} \Big(\delta (\omega+50)- \delta (\omega-50) \Big)

obteniendo v2(t) en el dominio de tiempo,

v_2(t) = \mathscr{F}^{-1} \Big[V_2(\omega) \Big] =\frac{1}{2} \mathscr{F}^{-1} \Bigg[ \pi \Big(\delta (\omega+50) + \delta (\omega-50) \Big )\Bigg] + +\frac{1}{2} \mathscr{F}^{-1} \Bigg[ j\pi \Big(\delta (\omega+50) + \delta (\omega-50) \Big )\Bigg] v_2(t) =\frac{1}{2} \cos(50t) + \frac{1}{2} \sin(50t)

por magnitud y fase, simplificación trigonométrica

v_2(t) =\frac{1}{\sqrt{2}} \sin\Big(50t+\frac{\pi}{4}\Big)

también con Sympy,

>>> v2=(1/2)*sym.cos(50*t)+(1/2)*sym.sin(50*t)
>>> sym.trigsimp(v2)
0.5*sqrt(2)*sin(50*t + pi/4)
>>> 

el resultado es concordante con lo que realiza la función de transferencia, respuesta al impulso H(ω) en ω=50

|H(\omega)| = \frac{|\omega|}{\sqrt{ 50^2 + \omega^2} } = \frac{|50|}{\sqrt{ 50^2 + 50^2} } = \frac{|50|}{\sqrt{ 2(50^2)} } = \frac{1}{\sqrt{2}} = \frac{\sqrt{2}}{2} \theta_{H(\omega)} = \frac{\pi}{2} - \arctan \Big( \frac{\omega}{50}\Big) = \frac{\pi}{2} - \arctan \Big( \frac{50}{50}\Big) = \frac{\pi}{2}-\frac{\pi}{4} = \frac{\pi}{4}

considerando también que:

\omega_0 = \frac{R}{L} = \frac{10}{0.2} = 50 rad/s

s3Eva2016TI_T2 LTI CT sub-sistemas h(t) multiplicados con Fourier

Ejercicio: 3Eva2016TI_T2 LTI CT sub-sistemas h(t) multiplicados con Fourier

a. Determinar la energía contenida en la señal h(t)

h(t) = \frac{\sin (11 \pi t)}{\pi t} E_{h(t)} = \int_{-\infty}^{\infty} |h(t)|^2 \delta t = \frac{1}{2\pi} \int_{-\infty}^{\infty}|H(\omega)|^2 \delta \omega = \frac{1}{2\pi} \int_{-11\pi}^{11\pi}|1|^2 \delta \omega = \frac{1}{2\pi} \omega \Big|_{-11\pi}^{11\pi} = \frac{1}{2\pi} \big(11\pi-(-11\pi)\big) = \frac{1}{2\pi} 2\big(11\pi\big) = 11

b. Determinar, esquematizar y etiquetar el espectro de Fourier de la señal m(t). Es decir M(ω) vs ω.

X(\omega) = \mathscr{F} \Big[\sum_{i=1}^{\infty} \frac{1}{k^2} \cos(5k\pi t) \Big] = \sum_{i=1}^{\infty} \frac{1}{k^2} \mathscr{F} \Big[\cos (5k\pi t) \Big] = \sum_{i=1}^{\infty} \frac{1}{k^2} \Big[\pi \delta (\omega +5k\pi) + \pi \delta (\omega -5k\pi) \Big] X(\omega) = \pi \sum_{i=1}^{\infty} \frac{1}{k^2} \Big[\delta (\omega +5k\pi) +\delta (\omega -5k\pi) \Big]

Para el caso de la función de transferencia H(ω) que representa un filtro pasabajo LPF,3E2016TI Tema2 Diagrama 02

H(\omega) = \mathscr{F} \Big[\frac{\cos (11 \pi t)}{\pi t} \Big] = p_{11\pi}(\omega) -11\pi \lt \omega \lt 11\pi M(\omega) = X( \omega ) H( \omega ) = p_{11\pi}(\omega) \sum_{i=1}^{\infty} \frac{1}{k^2} \pi\Big[\delta (\omega +5k\pi) +\delta (\omega -5k\pi) \Big]

por el filtro pasabajo  LPF se limitan las señales hasta k=2

= \sum_{i=1}^{2} \frac{1}{k^2} \pi\Big[\delta (\omega +5k\pi) +\delta (\omega -5k\pi) \Big] = \pi \frac{1}{1^2} \Big[\delta (\omega +5\pi) +\delta (\omega -5\pi) \Big] + \pi \frac{1}{2^2} \Big[\delta (\omega +5(2)\pi) +\delta (\omega -5(2)\pi) \Big] = \pi \delta (\omega +5\pi) +\pi \delta (\omega -5\pi) + \frac{\pi}{4} \delta (\omega +10\pi) +\frac{\pi}{4} \delta (\omega -10\pi)

c. Determinar, esquematizar y etiquetar el espectro de Fourier de la señal n(t). Es decir N(ω) vs ω

N(\omega) = G( \omega ) H( \omega ) N(\omega) = G( \omega ) \mathscr{F} \Big[\sum_{k=1}^{10} \cos (8k \pi t) \Big] = p_{11\pi}(\omega) \sum_{i=1}^{10} \pi\Big[\delta (\omega +8k\pi) +\delta (\omega -8k\pi) \Big]

por el filtro pasabajo LPF se limitan las señales hasta k=1

= \pi \sum_{i=1}^{1} \Big[\delta (\omega +8k\pi) +\delta (\omega -8k\pi) \Big] = \pi \Big[\delta (\omega +8\pi) +\delta (\omega -8\pi) \Big] = \pi \delta (\omega +8\pi) + \pi\delta (\omega -8\pi)

d. Determinar la potencia de la señal de salida y(t) y la representación de su espectro de Series de Fourier complejas exponenciales. Indique también el orden de los armónicos que están presentes en dicha salida.

Z(\omega) = \mathscr{F}[m(t) n(t)] = \frac{1}{2 \pi} M(\omega) \circledast N(\omega)] = \frac{1}{2 \pi} \Big[\pi \delta (\omega +5\pi) +\pi \delta (\omega -5\pi) + +\frac{\pi}{4} \delta (\omega +10\pi) +\frac{\pi}{4} \delta (\omega -10\pi)\Big] \circledast \Big[ \pi \delta (\omega +8\pi) + \pi\delta (\omega -8\pi) \Big]

se obtiene factor común π,  para simplificar

Z(\omega) = \frac{\pi^2}{2\pi} \Big[\delta (\omega +5\pi) + \delta (\omega -5\pi) + +\frac{1}{4} \delta (\omega +10\pi) +\frac{1}{4} \delta (\omega -10\pi)\Big] \circledast \Big[ \delta (\omega +8\pi) + \delta (\omega -8\pi) \Big] = \frac{\pi}{2} \Big[\delta (\omega +5\pi+8\pi) + \delta (\omega -5\pi+8\pi) + +\frac{1}{4} \delta (\omega +10\pi +8\pi) +\frac{1}{4} \delta (\omega -10\pi +8\pi) +\delta (\omega +5\pi-8\pi) + \delta (\omega -5\pi-8\pi) + +\frac{1}{4} \delta (\omega +10\pi -8\pi) +\frac{1}{4} \delta (\omega -10\pi -8\pi) \Big] Z(\omega) = \frac{\pi}{2} \Big[\delta (\omega +13\pi) + \delta (\omega +3\pi) + +\frac{1}{4}\delta (\omega +18\pi) +\frac{1}{4} \delta (\omega -2\pi) + \delta (\omega -3\pi) + \delta (\omega -13\pi) + +\frac{1}{4} \delta (\omega +2\pi) +\frac{1}{4} \delta (\omega -18\pi)\Big]

d. Determinar la potencia de la señal de salida y(t) y la representación de su espectro de Series de Fourier complejas exponenciales. Indique también el orden de los armónicos que están presentes en dicha salida.

Y(\omega) = Z(\omega) H(\omega)] = p_{11\pi}(\omega)Z(\omega)

Las frecuencias superiores a 11ω no pasan por el filtro LPF

Z(\omega) = \frac{\pi}{2} \Big[\cancel{\delta (\omega +13\pi)} + \delta (\omega +3\pi) + +\cancel{\frac{1}{4}\delta (\omega +18\pi)} +\frac{1}{4} \delta (\omega -2\pi) + \delta (\omega -3\pi) + \cancel{\delta (\omega -13\pi)} + +\frac{1}{4} \delta (\omega +2\pi) +\cancel{\frac{1}{4} \delta (\omega -18\pi)}\Big] Y(\omega)= \frac{\pi}{2} \Big[\delta (\omega +3\pi) + \delta (\omega -3\pi) + +\frac{1}{4} \delta (\omega +2\pi) + \frac{1}{4} \delta (\omega -2\pi)\Big] Y(\omega)= \frac{\pi}{2}\delta (\omega +3\pi) + \frac{\pi}{2}\delta (\omega -3\pi) + +\frac{\pi}{8} \delta (\omega +2\pi) + \frac{\pi}{8} \delta (\omega -2\pi)

ordenando y agrupando para obtener la inversa de la transformada,

Y(\omega)= \frac{1}{8} \pi \Big[ \delta (\omega +2\pi) + \delta (\omega -2\pi) \Big] +\frac{1}{2} \pi\Big[\delta (\omega +3\pi) + \delta (\omega -3\pi) \Big]

 

3E2016TI Tema2 Diagrama05

y(t) = \mathscr{F}^{-1}\Big[ Y(\omega) \Big] y(t) = \frac{1}{8}\cos (2 \pi t) + \frac{1}{2}\cos (3 \pi t)

para determinar las frecuencias fundamentales de y(t) se tiene:

\omega_1 = 2\pi f = \frac{2\pi}{T_1} =2 \pi T_1 = \frac{2\pi}{2\pi} =1 \omega_2 = 2\pi f = \frac{2\pi}{T_2} =3 \pi T_2 = \frac{2\pi}{3\pi} = \frac{2}{3} \frac{T_1}{T_2} = \frac{1}{2/3} =\frac{3}{2}

la relación entre los periodos fundamentales es racional, se tiene que la señal de salida y(t) es periódica.

2T_1 = 3T_2 =T_0 2(1) = 3 \frac{2}{3} = 2 =T_0 \omega_0 = \frac{2\pi}{T_0} =\frac{2\pi}{2} = \pi

los armónicos se pueden obtener observando la gráfica de y(ω):

k1 = 2, k2=3

para la potencia de la señal de salida y(t) se puede aplicar la relación de Parseval, siendo Ck los coeficientes de cada cos() para cada ωk, y C0 es cero por no tener componente en ω0

P_{y(t)} = C_o^2 + \frac{1}{2} \sum_{k=1}^{\infty} |C_k|^2 =(0)^2 + \frac{1}{2} \Big[ \Big(\frac{1}{8}\Big)^2 + \Big( \frac{1}{2}\Big) ^2 \Big] =(0)^2 + \frac{1}{2} \Big[ \frac{1}{64} +\frac{1}{4} \Big] = \frac{1}{2}\Big(\frac{1}{4}\Big) \Big[ \frac{1}{16} +1 \Big] = \frac{1}{8} \frac{17}{16} = \frac{17}{128}